This commit is contained in:
parent
fa4a056ab0
commit
e4542ac7cf
|
|
@ -1,5 +1,5 @@
|
||||||
import { create } from 'zustand'
|
import { create } from 'zustand'
|
||||||
import {persist} from 'zustand/middleware'
|
import {persist,createJSONStorage} from 'zustand/middleware'
|
||||||
const CACHE_EXPIRY = 10 * 60 * 1000;
|
const CACHE_EXPIRY = 10 * 60 * 1000;
|
||||||
|
|
||||||
export interface Location {
|
export interface Location {
|
||||||
|
|
@ -71,23 +71,68 @@ export interface WeatherStore {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export const useWeatherStore = create<WeatherStore>()(persist((set,get)=>({currentWeather:null,weatherCache:new Map(),isLoading:false,error:null,
|
export const useWeatherStore = create<WeatherStore>()(
|
||||||
setCurrentWeather:(weather)=>set({currentWeather:weather}),
|
persist(
|
||||||
getWeatherFromCache:(city)=>{
|
(set,get)=>({
|
||||||
const cashe = get().weatherCache.get(city.toLowerCase());
|
currentWeather:null,weatherCache:new Map(),isLoading:false,error:null,
|
||||||
if(!cashe)return null;
|
setCurrentWeather:(weather)=>set({currentWeather:weather}),
|
||||||
const isExpired = Date.now()-cashe.timestamp>CACHE_EXPIRY;
|
getWeatherFromCache:(city)=>{
|
||||||
return isExpired?null:cashe.data;
|
const cashe = get().weatherCache.get(city.toLowerCase());
|
||||||
},
|
if(!cashe)return null;
|
||||||
cacheWeather:(city,weather)=>set((state)=>{
|
const isExpired = Date.now()-cashe.timestamp>CACHE_EXPIRY;
|
||||||
const newCache = new Map(state.weatherCache);
|
return isExpired?null:cashe.data;
|
||||||
newCache.set(city.toLowerCase(),{data:weather,timestamp:Date.now()});
|
},
|
||||||
return{weatherCache:newCache}
|
cacheWeather:(city,weather)=>set((state)=>{
|
||||||
}),
|
const newCache = new Map(state.weatherCache);
|
||||||
setLoading:(loading)=>set({error})
|
newCache.set(city.toLowerCase(),{data:weather,timestamp:Date.now()});
|
||||||
})
|
return{weatherCache:newCache}
|
||||||
|
}),
|
||||||
))
|
setLoading:(loading)=>set({isLoading:loading}),
|
||||||
|
setError:(error)=>set({error}),
|
||||||
|
reset:()=>set({currentWeather:null,weatherCache:new Map(),isLoading:false,error:null}),
|
||||||
|
searchWeather:async(city:string)=>{
|
||||||
|
try{
|
||||||
|
set({isLoading:true,error:null});
|
||||||
|
const cachedWeather = get().getWeatherFromCache(city);
|
||||||
|
if(cachedWeather){
|
||||||
|
set({currentWeather:cachedWeather,isLoading:false});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const WeatherData = await WeatherAPI.getcurrentWeather(city);
|
||||||
|
set({currentWeather:WeatherData,isLoading:false});
|
||||||
|
get().cacheWeather(city,WeatherData);
|
||||||
|
}catch(error){
|
||||||
|
set({error:'获取失败',isLoading:false});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
refreshWeather:async()=>{
|
||||||
|
const currentWeather = get().currentWeather;
|
||||||
|
if(!currentWeather)return;
|
||||||
|
try{
|
||||||
|
set({isLoading:true,error:null});
|
||||||
|
const city = currentWeather.location.name;
|
||||||
|
const WeatherData = await WeatherAPI.getcurrentWeather(city);
|
||||||
|
set({currentWeather:WeatherData,isLoading:false});
|
||||||
|
get().cacheWeather(city,WeatherData);
|
||||||
|
}catch(error){
|
||||||
|
set({error:'刷新失败',isLoading:false});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
name:'weather-strorage',
|
||||||
|
storage:createJSONStorage(()=>localStorage),
|
||||||
|
partialize:(state)=>({
|
||||||
|
weatherCache:Array.from(state.weatherCache.entries())
|
||||||
|
}),
|
||||||
|
onRehydrateStorage:(state)=>{
|
||||||
|
if(state && Array.isArray(state.weatherCache)){
|
||||||
|
state.weatherCache = new Map(state.weatherCache as any);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
10
package.json
10
package.json
|
|
@ -43,12 +43,4 @@
|
||||||
"vite": "^7.1.7",
|
"vite": "^7.1.7",
|
||||||
"vite-tsconfig-paths": "^5.1.4"
|
"vite-tsconfig-paths": "^5.1.4"
|
||||||
}
|
}
|
||||||
<<<<<<< HEAD
|
}
|
||||||
<<<<<<< HEAD
|
|
||||||
}
|
|
||||||
=======
|
|
||||||
}
|
|
||||||
>>>>>>> 34ee14ecd423bb649a4c45f54ab6e3f37ad0f35f
|
|
||||||
=======
|
|
||||||
}
|
|
||||||
>>>>>>> 12e66397d84bd55cde0c1b209d3e943e5e20bcb9
|
|
||||||
Loading…
Reference in New Issue