panku-app/src/ContextProvider.jsx

1import { useReducer, useEffect } from "react"; 2 3import storage from "@/storage"; 4import { AppContext as OriginalAppContext } from "@/context/app-context"; 5 6export const AppContext = OriginalAppContext; 7 8const ContextProvider = ({ children }) => { 9 const appState = { 10 isOnline: true, 11 activities: storage.get("activities") || [], 12 friends: storage.get("friends") || [], 13 upiSettings: storage.get("upi") || { 14 name: "", 15 id: "", 16 }, 17 }; 18 19 const appReducer = (state, action) => { 20 switch (action.type) { 21 case "setIsOnline": 22 return { 23 ...state, 24 isOnline: action.payload, 25 }; 26 case "setActivities": 27 return { 28 ...state, 29 activities: action.payload, 30 }; 31 case "addActivity": { 32 const newActivities = [...state.activities, action.payload]; 33 return { 34 ...state, 35 activities: newActivities, 36 }; 37 } 38 case "updateActivity": { 39 const activities = [...state.activities]; 40 const { id, newActivity } = action.payload; 41 const idx = activities.findIndex((a) => a.id === id); 42 if (idx !== -1) { 43 activities[idx] = { 44 ...activities[idx], 45 ...newActivity, 46 id, 47 }; 48 } 49 return { 50 ...state, 51 activities, 52 }; 53 } 54 case "deleteActivity": { 55 const activities = [...state.activities]; 56 const { id } = action.payload; 57 const newActivities = activities.filter((a) => a.id !== id); 58 return { 59 ...state, 60 activities: newActivities, 61 }; 62 } 63 case "setFriends": 64 return { 65 ...state, 66 friends: action.payload, 67 }; 68 case "setUpiSettings": 69 return { 70 ...state, 71 upiSettings: action.payload, 72 }; 73 default: 74 return state; 75 } 76 }; 77 78 const [state, dispatch] = useReducer(appReducer, appState); 79 80 // save updates 81 useEffect(() => { 82 storage.set("activities", state.activities); 83 }, [state.activities]); 84 85 useEffect(() => { 86 storage.set("friends", state.friends); 87 }, [state.friends]); 88 89 useEffect(() => { 90 storage.set("upi", state.upiSettings); 91 }, [state.upiSettings]); 92 93 useEffect(() => { 94 const offlineHandler = () => 95 dispatch({ type: "setIsOnline", payload: false }); 96 const onlineHandler = () => 97 dispatch({ type: "setIsOnline", payload: true }); 98 99 window.addEventListener("online", onlineHandler); 100 window.addEventListener("offline", offlineHandler); 101 102 return () => { 103 window.removeEventListener("online", onlineHandler); 104 window.removeEventListener("offline", offlineHandler); 105 }; 106 }, []); 107 108 return ( 109 <AppContext.Provider value={{ state, dispatch }}> 110 {children} 111 </AppContext.Provider> 112 ); 113}; 114 115export default ContextProvider;