Skip to content

Commit 705f0ea

Browse files
author
aafomin
committed
add search-list, add compare key in LS
1 parent 6e73a5b commit 705f0ea

File tree

4 files changed

+76
-36
lines changed

4 files changed

+76
-36
lines changed

src/components/Weather/card-weather.vue

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
class="card"
55
:style="{backgroundImage:`url(${require(`@/assets/weather-icons/${dayTime}.jpg`)})`}"
66
>
7+
<v-snackbar
8+
v-model="snackbar"
9+
:timeout="timeout"
10+
:top="'top'"
11+
:color= "'info'"
12+
>{{ text }}</v-snackbar>
713
<v-layout column class="card__title">
814
<div class="card__title_time text-md-center">Обновлено {{city.time}}</div>
915
<div class="card__title_location text-md-center">{{city.country}}, {{city.city}}</div>
@@ -53,7 +59,11 @@ export default {
5359
required: true
5460
}
5561
},
56-
data: () => ({}),
62+
data: () => ({
63+
snackbar: false,
64+
timeout: 4000,
65+
text: ""
66+
}),
5767
computed: {
5868
dayTime() {
5969
return this.city.IsDayTime ? "day" : "night";
@@ -84,8 +94,11 @@ export default {
8494
if (!exist) {
8595
arr.push(city);
8696
localStorage.setItem("city", JSON.stringify(arr));
97+
this.text = "Сохранено";
98+
this.snackbar = true;
8799
} else {
88-
console.log("Содержит");
100+
this.text = "Уже Сохранено";
101+
this.snackbar = true;
89102
}
90103
}
91104
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<template>
2+
<v-expand-transition>
3+
<v-list class="lighten-3 weather__searchList">
4+
<v-list-tile v-for="(item, i) in items" :key="i">
5+
<v-list-tile-content class="weather__searchList_item" @click="selectItem(item)">
6+
<v-list-tile-title v-text="item.city"></v-list-tile-title>
7+
<v-list-tile-sub-title v-text="item.country"></v-list-tile-sub-title>
8+
<v-divider inset></v-divider>
9+
</v-list-tile-content>
10+
</v-list-tile>
11+
</v-list>
12+
</v-expand-transition>
13+
</template>
14+
<script>
15+
export default {
16+
name: "search-list",
17+
components: {},
18+
props: {
19+
items: {
20+
type: Array,
21+
required: true
22+
}
23+
},
24+
data: () => ({}),
25+
computed: {},
26+
created() {},
27+
mounted() {},
28+
methods: {
29+
selectItem(item) {
30+
this.$emit('selectItem', item)
31+
}
32+
}
33+
};
34+
</script>
35+
<style lang="scss" scoped>
36+
.weather__searchList {
37+
cursor: pointer;
38+
position: absolute;
39+
max-height: 55vh;
40+
margin-top: 8vh;
41+
overflow: auto;
42+
width: 40%;
43+
z-index: 1;
44+
}
45+
</style>

src/components/Weather/weather.vue

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,17 @@
33
<loading v-show="isLoading"></loading>
44
<v-flex xs3 offset-sm3 v-click-outside>
55
<v-layout v-show="!isLoading" class="weather__search">
6-
<!-- <v-layout class="weather__search"> -->
76
<v-layout column>
87
<v-text-field label="Search" clearable v-model="searchText"></v-text-field>
9-
<v-expand-transition>
10-
<v-list v-if="selectCityShow" class="lighten-3 weather__searchList">
11-
<v-list-tile v-for="(item, i) in items" :key="i">
12-
<v-list-tile-content
13-
@click="getWeatherByCity(item)"
14-
class="weather__searchList_item"
15-
>
16-
<v-list-tile-title v-text="item.city"></v-list-tile-title>
17-
<v-list-tile-sub-title v-text="item.country"></v-list-tile-sub-title>
18-
<v-divider inset></v-divider>
19-
</v-list-tile-content>
20-
</v-list-tile>
21-
</v-list>
22-
</v-expand-transition>
8+
<search-list v-if="selectCityShow" :items="items" @selectItem="getWeatherByCity"></search-list>
239
</v-layout>
2410
<v-btn fab dark color="brown darken-4" small @click="searchCity">
2511
<v-icon dark>search</v-icon>
2612
</v-btn>
2713
<v-divider></v-divider>
2814
</v-layout>
2915
</v-flex>
30-
<v-flex xs8 offset-sm3>
16+
<v-flex xs8 offset-sm3 v-show="!isLoading">
3117
<div v-for="(city, index) in cities" :key="index">
3218
<card :city="city"></card>
3319
</div>
@@ -37,13 +23,15 @@
3723
<script>
3824
import loading from "../../views/loading.vue";
3925
import card from "./card-weather.vue";
26+
import searchList from "./search-list.vue";
4027
import { mapState, mapActions, mapGetters } from "vuex";
4128
4229
export default {
4330
name: "whether",
4431
components: {
4532
loading,
46-
card
33+
card,
34+
searchList
4735
},
4836
data: () => ({
4937
searchText: "",
@@ -115,20 +103,6 @@ export default {
115103
</script>
116104
<style lang="scss" scoped>
117105
.weather {
118-
.weather__search {
119-
.weather__searchList {
120-
cursor: pointer;
121-
max-height: 55vh;
122-
overflow: auto;
123-
z-index: 1;
124-
position: relative;
125-
&:after {
126-
position: absolute;
127-
}
128-
.weather__searchList_item {
129-
}
130-
}
131-
}
132106
}
133107
@media screen and (max-width: 1024px) {
134108
}

src/store/weatherStore.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,16 @@ export default {
4141
key.weather
4242
}&q=${latitude},${longitude}&language=ru-ru`;
4343
axios.get(url).then(response => {
44-
// ToDO compare key in localStorage
45-
dispatch('GET_WEATHER_CITY', response.data)
44+
// compare key in localStorage
45+
let exist = false
46+
arr.forEach(el => {
47+
if (el.Key === response.data.Key) {
48+
exist = true
49+
}
50+
})
51+
if (!exist) {
52+
dispatch('GET_WEATHER_CITY', response.data)
53+
}
4654
});
4755
});
4856
} else {
@@ -76,7 +84,7 @@ export default {
7684
res.Wind.Speed.Metric.Unit
7785
}`,
7886
weatherText: res.WeatherText,
79-
realFeelTemperature: `${(res.RealFeelTemperature.Metric.Value).toFixed()}° ${res.RealFeelTemperature.Metric.Unit}`, //ощущается как
87+
realFeelTemperature: `${(res.RealFeelTemperature.Metric.Value).toFixed()}° ${res.RealFeelTemperature.Metric.Unit}`,
8088
visibility: `${(res.Visibility.Metric.Value)} ${res.Visibility.Metric.Unit}`,
8189
WeatherIcon: res.WeatherIcon,
8290
IsDayTime: res.IsDayTime,

0 commit comments

Comments
 (0)