This commit is contained in:
Li1304553726 2025-11-17 19:08:01 +08:00
parent fa4a056ab0
commit e4542ac7cf
2 changed files with 64 additions and 27 deletions

View File

@ -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);
}
}
}
)
)

View File

@ -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