init
This commit is contained in:
70
ui/src/providers/config/index.tsx
Normal file
70
ui/src/providers/config/index.tsx
Normal 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>
|
||||
);
|
||||
};
|
||||
46
ui/src/providers/config/reducer.ts
Normal file
46
ui/src/providers/config/reducer.ts
Normal 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;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user