Remove SyncService and introduce context-based offline mode and state management
- Delete `SyncService` and its associated bidirectional synchronization logic. - Add multiple context providers (`OfflineProvider`, `AlertProvider`, `LangContext`, `UserContext`, `SessionContext`, `WorldContext`, `SettingBookContext`) for contextual state management. - Implement `SecureStorage` for OS-level secure data encryption and replace dependency on `SyncService` synchronization. - Update localization files (`en.json`, `fr.json`) with offline mode and error-related strings.
This commit is contained in:
80
context/AlertProvider.tsx
Normal file
80
context/AlertProvider.tsx
Normal file
@@ -0,0 +1,80 @@
|
||||
'use client';
|
||||
|
||||
import type {Context, Dispatch, JSX, ReactNode, SetStateAction} from 'react';
|
||||
import {createContext, useCallback, useState} from 'react';
|
||||
import AlertStack from '@/components/AlertStack';
|
||||
|
||||
export type AlertType = 'success' | 'error' | 'info' | 'warning';
|
||||
|
||||
export interface Alert {
|
||||
id: string;
|
||||
type: AlertType;
|
||||
message: string;
|
||||
}
|
||||
|
||||
export interface AlertContextProps {
|
||||
successMessage: (message: string) => void;
|
||||
errorMessage: (message: string) => void;
|
||||
infoMessage: (message: string) => void;
|
||||
warningMessage: (message: string) => void;
|
||||
}
|
||||
|
||||
interface AlertProviderProps {
|
||||
children: ReactNode;
|
||||
}
|
||||
|
||||
export const AlertContext: Context<AlertContextProps> = createContext<AlertContextProps>({
|
||||
successMessage: (_message: string): void => {
|
||||
},
|
||||
errorMessage: (_message: string): void => {
|
||||
},
|
||||
infoMessage: (_message: string): void => {
|
||||
},
|
||||
warningMessage: (_message: string): void => {
|
||||
},
|
||||
});
|
||||
|
||||
export function AlertProvider({children}: AlertProviderProps): JSX.Element {
|
||||
const [alerts, setAlerts]: [Alert[], Dispatch<SetStateAction<Alert[]>>] = useState<Alert[]>([]);
|
||||
|
||||
const addAlert: (type: AlertType, message: string) => void = useCallback((type: AlertType, message: string): void => {
|
||||
const id: string = `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
||||
const newAlert: Alert = {id, type, message};
|
||||
|
||||
setAlerts((prev: Alert[]): Alert[] => [...prev, newAlert]);
|
||||
}, []);
|
||||
|
||||
const removeAlert: (id: string) => void = useCallback((id: string): void => {
|
||||
setAlerts((prev: Alert[]): Alert[] => prev.filter((alert: Alert): boolean => alert.id !== id));
|
||||
}, []);
|
||||
|
||||
const successMessage: (message: string) => void = useCallback((message: string): void => {
|
||||
addAlert('success', message);
|
||||
}, [addAlert]);
|
||||
|
||||
const errorMessage: (message: string) => void = useCallback((message: string): void => {
|
||||
addAlert('error', message);
|
||||
}, [addAlert]);
|
||||
|
||||
const infoMessage: (message: string) => void = useCallback((message: string): void => {
|
||||
addAlert('info', message);
|
||||
}, [addAlert]);
|
||||
|
||||
const warningMessage: (message: string) => void = useCallback((message: string): void => {
|
||||
addAlert('warning', message);
|
||||
}, [addAlert]);
|
||||
|
||||
return (
|
||||
<AlertContext.Provider
|
||||
value={{
|
||||
successMessage,
|
||||
errorMessage,
|
||||
infoMessage,
|
||||
warningMessage,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
<AlertStack alerts={alerts} onClose={removeAlert}/>
|
||||
</AlertContext.Provider>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user