AgentGraph / frontend /src /context /ModalContext.tsx
wu981526092's picture
🚀 Deploy AgentGraph: Complete agent monitoring and knowledge graph system
c2ea5ed
import React, {
createContext,
useContext,
useReducer,
ReactNode,
useMemo,
} from "react";
import { ModalState, ModalConfig } from "@/types";
interface ModalContextType {
modalState: ModalState;
openModal: (
type: ModalState["type"],
title: string,
data?: any,
config?: ModalConfig
) => void;
closeModal: () => void;
}
type ModalAction =
| {
type: "OPEN_MODAL";
payload: {
modalType: ModalState["type"];
title: string;
data?: any;
config?: ModalConfig;
};
}
| { type: "CLOSE_MODAL" };
const initialState: ModalState = {
isOpen: false,
type: null,
title: "",
data: undefined,
config: undefined,
};
function modalReducer(state: ModalState, action: ModalAction): ModalState {
switch (action.type) {
case "OPEN_MODAL":
return {
isOpen: true,
type: action.payload.modalType,
title: action.payload.title,
data: action.payload.data,
config: action.payload.config,
};
case "CLOSE_MODAL":
return {
...initialState,
};
default:
return state;
}
}
const ModalContext = createContext<ModalContextType | undefined>(undefined);
export function ModalProvider({ children }: { children: ReactNode }) {
const [modalState, dispatch] = useReducer(modalReducer, initialState);
const actions = useMemo(
() => ({
openModal: (
type: ModalState["type"],
title: string,
data?: any,
config?: ModalConfig
) => {
dispatch({
type: "OPEN_MODAL",
payload: { modalType: type, title, data, config },
});
},
closeModal: () => {
dispatch({ type: "CLOSE_MODAL" });
},
}),
[]
);
return (
<ModalContext.Provider value={{ modalState, ...actions }}>
{children}
</ModalContext.Provider>
);
}
export function useModal() {
const context = useContext(ModalContext);
if (context === undefined) {
throw new Error("useModal must be used within a ModalProvider");
}
return context;
}