This commit is contained in:
yoan
2024-08-21 12:19:12 +08:00
commit 50fa238d88
89 changed files with 11835 additions and 0 deletions

View File

@@ -0,0 +1,70 @@
import { Access } from "@/domain/access";
import { list } from "@/repository/access";
import {
createContext,
ReactNode,
useCallback,
useContext,
useEffect,
useReducer,
} from "react";
import { configReducer } from "./reducer";
export type ConfigData = {
accesses: Access[];
};
export type ConfigContext = {
config: ConfigData;
deleteAccess: (id: string) => void;
addAccess: (access: Access) => void;
updateAccess: (access: Access) => void;
};
const Context = createContext({} as ConfigContext);
export const useConfig = () => useContext(Context);
interface ContainerProps {
children: ReactNode;
}
export const ConfigProvider = ({ children }: ContainerProps) => {
const [config, dispatchConfig] = useReducer(configReducer, { accesses: [] });
useEffect(() => {
const featchData = async () => {
const data = await list();
dispatchConfig({ type: "SET_ACCESSES", payload: data });
};
featchData();
}, []);
const deleteAccess = useCallback((id: string) => {
dispatchConfig({ type: "DELETE_ACCESS", payload: id });
}, []);
const addAccess = useCallback((access: Access) => {
dispatchConfig({ type: "ADD_ACCESS", payload: access });
}, []);
const updateAccess = useCallback((access: Access) => {
dispatchConfig({ type: "UPDATE_ACCESS", payload: access });
}, []);
return (
<Context.Provider
value={{
config: {
accesses: config.accesses,
},
deleteAccess,
addAccess,
updateAccess,
}}
>
{children && children}
</Context.Provider>
);
};

View File

@@ -0,0 +1,46 @@
import { Access } from "@/domain/access";
import { ConfigData } from ".";
type Action =
| { type: "ADD_ACCESS"; payload: Access }
| { type: "DELETE_ACCESS"; payload: string }
| { type: "UPDATE_ACCESS"; payload: Access }
| { type: "SET_ACCESSES"; payload: Access[] };
export const configReducer = (
state: ConfigData,
action: Action
): ConfigData => {
switch (action.type) {
case "SET_ACCESSES": {
return {
...state,
accesses: action.payload,
};
}
case "ADD_ACCESS": {
return {
...state,
accesses: [action.payload, ...state.accesses],
};
}
case "DELETE_ACCESS": {
return {
...state,
accesses: state.accesses.filter(
(access) => access.id !== action.payload
),
};
}
case "UPDATE_ACCESS": {
return {
...state,
accesses: state.accesses.map((access) =>
access.id === action.payload.id ? action.payload : access
),
};
}
default:
return state;
}
};