Files
paperclip/ui/src/context/DialogContext.tsx
T
Forgotten c0ae9423f0 UI polish: sidebar nav, Companies/Issues layout, assignee in issue defaults
- Sidebar: add Approvals and Companies links, remove temporary Design Guide link
- Companies: replace inline create form with 'New Company' button (opens onboarding)
- Issues: move filter tabs inline with page heading (consistent with Agents)
- DialogContext: add assigneeAgentId to NewIssueDefaults
- NewIssueDialog: wire assigneeAgentId default (pre-select assignee when opening
  from agent detail page)
- CommandPalette: minor cleanup
- App: add DesignGuide route (dev-only, no sidebar link)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 20:07:49 -06:00

99 lines
2.4 KiB
TypeScript

import { createContext, useCallback, useContext, useState, type ReactNode } from "react";
interface NewIssueDefaults {
status?: string;
priority?: string;
projectId?: string;
assigneeAgentId?: string;
}
interface DialogContextValue {
newIssueOpen: boolean;
newIssueDefaults: NewIssueDefaults;
openNewIssue: (defaults?: NewIssueDefaults) => void;
closeNewIssue: () => void;
newProjectOpen: boolean;
openNewProject: () => void;
closeNewProject: () => void;
newAgentOpen: boolean;
openNewAgent: () => void;
closeNewAgent: () => void;
onboardingOpen: boolean;
openOnboarding: () => 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 [newAgentOpen, setNewAgentOpen] = useState(false);
const [onboardingOpen, setOnboardingOpen] = useState(false);
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 openNewAgent = useCallback(() => {
setNewAgentOpen(true);
}, []);
const closeNewAgent = useCallback(() => {
setNewAgentOpen(false);
}, []);
const openOnboarding = useCallback(() => {
setOnboardingOpen(true);
}, []);
const closeOnboarding = useCallback(() => {
setOnboardingOpen(false);
}, []);
return (
<DialogContext.Provider
value={{
newIssueOpen,
newIssueDefaults,
openNewIssue,
closeNewIssue,
newProjectOpen,
openNewProject,
closeNewProject,
newAgentOpen,
openNewAgent,
closeNewAgent,
onboardingOpen,
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;
}