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;