| import { createContext, useCallback, useContext, useState, type ReactNode } from "react"; |
|
|
| interface NewIssueDefaults { |
| status?: string; |
| priority?: string; |
| projectId?: 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; |
| } |
|
|
| const DialogContext = createContext<DialogContextValue | null>(null); |
|
|
| export function DialogProvider({ children }: { children: ReactNode }) { |
| const [newIssueOpen, setNewIssueOpen] = useState(false); |
| const [newIssueDefaults, setNewIssueDefaults] = useState<NewIssueDefaults>({}); |
| const [newProjectOpen, setNewProjectOpen] = useState(false); |
| const [newGoalOpen, setNewGoalOpen] = useState(false); |
| const [newGoalDefaults, setNewGoalDefaults] = useState<NewGoalDefaults>({}); |
| const [newAgentOpen, setNewAgentOpen] = useState(false); |
| const [onboardingOpen, setOnboardingOpen] = useState(false); |
| const [onboardingOptions, setOnboardingOptions] = useState<OnboardingOptions>({}); |
|
|
| 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({}); |
| }, []); |
|
|
| return ( |
| <DialogContext.Provider |
| value={{ |
| newIssueOpen, |
| newIssueDefaults, |
| openNewIssue, |
| closeNewIssue, |
| newProjectOpen, |
| openNewProject, |
| closeNewProject, |
| newGoalOpen, |
| newGoalDefaults, |
| openNewGoal, |
| closeNewGoal, |
| newAgentOpen, |
| openNewAgent, |
| closeNewAgent, |
| onboardingOpen, |
| onboardingOptions, |
| openOnboarding, |
| closeOnboarding, |
| }} |
| > |
| {children} |
| </DialogContext.Provider> |
| ); |
| } |
|
|
| export function useDialog() { |
| const ctx = useContext(DialogContext); |
| if (!ctx) { |
| throw new Error("useDialog must be used within DialogProvider"); |
| } |
| return ctx; |
| } |
|
|