import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from "react"; interface NewIssueDefaults { status?: string; priority?: string; projectId?: string; projectWorkspaceId?: string; goalId?: string; parentId?: string; parentIdentifier?: string; parentTitle?: string; executionWorkspaceId?: string; executionWorkspaceMode?: string; parentExecutionWorkspaceLabel?: string; assigneeAgentId?: string; assigneeUserId?: string; title?: string; description?: string; } interface NewGoalDefaults { parentId?: string; } interface OnboardingOptions { initialStep?: 1 | 2 | 3 | 4; companyId?: string; } interface DialogContextValue { newIssueOpen: boolean; newIssueDefaults: NewIssueDefaults; openNewIssue: (defaults?: NewIssueDefaults) => void; closeNewIssue: () => void; newProjectOpen: boolean; openNewProject: () => void; closeNewProject: () => void; newGoalOpen: boolean; newGoalDefaults: NewGoalDefaults; openNewGoal: (defaults?: NewGoalDefaults) => void; closeNewGoal: () => void; newAgentOpen: boolean; openNewAgent: () => void; closeNewAgent: () => void; onboardingOpen: boolean; onboardingOptions: OnboardingOptions; openOnboarding: (options?: OnboardingOptions) => void; closeOnboarding: () => void; } type DialogStateValue = Pick< DialogContextValue, | "newIssueOpen" | "newIssueDefaults" | "newProjectOpen" | "newGoalOpen" | "newGoalDefaults" | "newAgentOpen" | "onboardingOpen" | "onboardingOptions" >; type DialogActionsValue = Omit; const DialogStateContext = createContext(null); const DialogActionsContext = createContext(null); export function DialogProvider({ children }: { children: ReactNode }) { const [newIssueOpen, setNewIssueOpen] = useState(false); const [newIssueDefaults, setNewIssueDefaults] = useState({}); const [newProjectOpen, setNewProjectOpen] = useState(false); const [newGoalOpen, setNewGoalOpen] = useState(false); const [newGoalDefaults, setNewGoalDefaults] = useState({}); const [newAgentOpen, setNewAgentOpen] = useState(false); const [onboardingOpen, setOnboardingOpen] = useState(false); const [onboardingOptions, setOnboardingOptions] = useState({}); const openNewIssue = useCallback((defaults: NewIssueDefaults = {}) => { setNewIssueDefaults(defaults); setNewIssueOpen(true); }, []); const closeNewIssue = useCallback(() => { setNewIssueOpen(false); setNewIssueDefaults({}); }, []); const openNewProject = useCallback(() => { setNewProjectOpen(true); }, []); const closeNewProject = useCallback(() => { setNewProjectOpen(false); }, []); const openNewGoal = useCallback((defaults: NewGoalDefaults = {}) => { setNewGoalDefaults(defaults); setNewGoalOpen(true); }, []); const closeNewGoal = useCallback(() => { setNewGoalOpen(false); setNewGoalDefaults({}); }, []); const openNewAgent = useCallback(() => { setNewAgentOpen(true); }, []); const closeNewAgent = useCallback(() => { setNewAgentOpen(false); }, []); const openOnboarding = useCallback((options: OnboardingOptions = {}) => { setOnboardingOptions(options); setOnboardingOpen(true); }, []); const closeOnboarding = useCallback(() => { setOnboardingOpen(false); setOnboardingOptions({}); }, []); const stateValue = useMemo( () => ({ newIssueOpen, newIssueDefaults, newProjectOpen, newGoalOpen, newGoalDefaults, newAgentOpen, onboardingOpen, onboardingOptions, }), [ newIssueOpen, newIssueDefaults, newProjectOpen, newGoalOpen, newGoalDefaults, newAgentOpen, onboardingOpen, onboardingOptions, ], ); const actionsValue = useMemo( () => ({ openNewIssue, closeNewIssue, openNewProject, closeNewProject, openNewGoal, closeNewGoal, openNewAgent, closeNewAgent, openOnboarding, closeOnboarding, }), [ openNewIssue, closeNewIssue, openNewProject, closeNewProject, openNewGoal, closeNewGoal, openNewAgent, closeNewAgent, openOnboarding, closeOnboarding, ], ); return ( {children} ); } export function useDialogActions() { const ctx = useContext(DialogActionsContext); if (!ctx) { throw new Error("useDialogActions must be used within DialogProvider"); } return ctx; } export function useDialogState() { const ctx = useContext(DialogStateContext); if (!ctx) { throw new Error("useDialogState must be used within DialogProvider"); } return ctx; } export function useDialog() { return { ...useDialogState(), ...useDialogActions(), }; }