Basic app functions are working
definitely on the "minimal" side but this *mostly* covers my own usage of the old mobile.weather.gov app
This commit is contained in:
parent
397b7b02e5
commit
5a584982e4
28 changed files with 2020 additions and 473 deletions
|
@ -1,9 +1,134 @@
|
|||
<script setup>
|
||||
import TheWelcome from '../components/TheWelcome.vue'
|
||||
import { mapStores } from 'pinia'
|
||||
import { useWeatherStore } from '../stores/weather'
|
||||
import { useLocationStore } from '../stores/location'
|
||||
</script>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
|
||||
data() {
|
||||
return {
|
||||
coordinates: null,
|
||||
loading: false,
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapStores(useWeatherStore, useLocationStore),
|
||||
},
|
||||
|
||||
methods: {
|
||||
|
||||
editLocations() {
|
||||
this.$router.push('/edit-list')
|
||||
},
|
||||
|
||||
async loadCoordinates() {
|
||||
if (!this.coordinates) {
|
||||
this.$refs.coordinates.focus()
|
||||
return
|
||||
}
|
||||
|
||||
const parts = this.coordinates.split(/(?: +| *\, *)/)
|
||||
const pattern = /^ *-?\d+(?:\.\d+)? *$/
|
||||
if (parts.length != 2
|
||||
|| !parts[0].match(pattern)
|
||||
|| !parts[1].match(pattern)) {
|
||||
|
||||
this.$oruga.notification.open({
|
||||
variant: 'warning',
|
||||
message: "Coordinates are not valid.",
|
||||
position: 'bottom',
|
||||
})
|
||||
this.$refs.coordinates.focus()
|
||||
return
|
||||
}
|
||||
this.coordinates = `${parts[0]},${parts[1]}`
|
||||
|
||||
this.loading = true
|
||||
const url = `https://api.weather.gov/points/${this.coordinates}`
|
||||
const response = await fetch(url)
|
||||
const weather = await response.json()
|
||||
this.loading = false
|
||||
if (weather.status == 404) {
|
||||
this.$oruga.notification.open({
|
||||
variant: 'warning',
|
||||
message: weather.title || "Data not found!",
|
||||
position: 'bottom',
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
let coords = weather.geometry.coordinates
|
||||
coords = `${coords[1].toFixed(4)},${coords[0].toFixed(4)}`
|
||||
|
||||
const city = weather.properties.relativeLocation.properties.city
|
||||
const state = weather.properties.relativeLocation.properties.state
|
||||
const cityState = `${city}, ${state}`
|
||||
|
||||
this.locationStore.addLocation(coords, cityState)
|
||||
this.weatherStore.setCoordinates(coords)
|
||||
this.weatherStore.setCityState(cityState)
|
||||
this.weatherStore.setWeather(weather)
|
||||
|
||||
// clear this so user sees empty input when they return
|
||||
this.coordinates = null
|
||||
this.$router.push('/weather')
|
||||
},
|
||||
|
||||
showWeather(location) {
|
||||
this.weatherStore.clearWeather()
|
||||
this.weatherStore.setCoordinates(location.coordinates)
|
||||
this.weatherStore.setCityState(location.cityState)
|
||||
this.$router.push('/weather')
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<main>
|
||||
<TheWelcome />
|
||||
<br />
|
||||
|
||||
<o-field grouped>
|
||||
<o-input v-model="coordinates"
|
||||
ref="coordinates"
|
||||
placeholder="coordinates"
|
||||
clearable />
|
||||
<o-button variant="primary"
|
||||
icon-left="arrow-right"
|
||||
@click="loadCoordinates()"
|
||||
:disabled="loading">
|
||||
Go!
|
||||
</o-button>
|
||||
</o-field>
|
||||
|
||||
<div v-for="location in locationStore.locations"
|
||||
:key="location.coordinates"
|
||||
class="location">
|
||||
<o-button variant="primary"
|
||||
icon-right="arrow-right"
|
||||
expanded
|
||||
@click="showWeather(location)">
|
||||
{{ location.cityState }}
|
||||
</o-button>
|
||||
</div>
|
||||
|
||||
<div v-if="locationStore.locations.length"
|
||||
class="location">
|
||||
<o-button icon-right="edit"
|
||||
expanded
|
||||
@click="editLocations()">
|
||||
Edit List
|
||||
</o-button>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
div.location {
|
||||
padding: 0.25rem;
|
||||
}
|
||||
</style>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue