| 1 | import { lazy, Suspense, useState, type ReactNode } from "react"; |
| 2 | import type { ToastContextValue } from "../lib/toast"; |
| 3 | |
| 4 | const BlankProjectFlow = lazy(() => import("./BlankProjectFlow").then((module) => ({ default: module.BlankProjectFlow }))); |
| 5 | const RemoteConnectWizard = lazy(() => import("./RemoteConnectWizardEntry").then((module) => ({ default: module.RemoteConnectWizard }))); |
| 6 | |
| 7 | export function useProjectCreation({ |
| 8 | onAddProject, |
| 9 | onRefresh, |
| 10 | showToast, |
| 11 | }: { |
| 12 | onAddProject: (path?: string) => Promise<void>; |
| 13 | onRefresh: () => Promise<void>; |
| 14 | showToast: ToastContextValue["showToast"]; |
| 15 | }): { |
| 16 | addingProject: boolean; |
| 17 | handleAddProject: () => Promise<void>; |
| 18 | openBlankProjectFlow: () => void; |
| 19 | blankProjectFlow: ReactNode; |
| 20 | openRemoteConnectFlow: () => void; |
| 21 | remoteConnectFlow: ReactNode; |
| 22 | } { |
| 23 | const [addingProject, setAddingProject] = useState(false); |
| 24 | const [blankProjectFlowOpen, setBlankProjectFlowOpen] = useState(false); |
| 25 | const [remoteFlowOpen, setRemoteFlowOpen] = useState(false); |
| 26 | const handleAddProject = async () => { |
| 27 | if (addingProject) return; |
| 28 | setAddingProject(true); |
| 29 | try { |
| 30 | await onAddProject(); |
| 31 | await onRefresh(); |
| 32 | } catch (err) { |
| 33 | showToast(err instanceof Error ? err.message : String(err), "error"); |
| 34 | } finally { |
| 35 | setAddingProject(false); |
| 36 | } |
| 37 | }; |
| 38 | return { |
| 39 | addingProject, |
| 40 | handleAddProject, |
| 41 | openBlankProjectFlow: () => setBlankProjectFlowOpen(true), |
| 42 | blankProjectFlow: blankProjectFlowOpen ? ( |
| 43 | <Suspense fallback={null}> |
| 44 | <BlankProjectFlow |
| 45 | onOpenProject={onAddProject} |
| 46 | onRefresh={onRefresh} |
| 47 | onClose={() => setBlankProjectFlowOpen(false)} |
| 48 | /> |
| 49 | </Suspense> |
| 50 | ) : null, |
| 51 | openRemoteConnectFlow: () => setRemoteFlowOpen(true), |
| 52 | remoteConnectFlow: remoteFlowOpen ? ( |
| 53 | <Suspense fallback={null}> |
| 54 | <RemoteConnectWizard |
| 55 | onRefresh={onRefresh} |
| 56 | onClose={() => setRemoteFlowOpen(false)} |
| 57 | onMerged={(message) => showToast(message, "info")} |
| 58 | /> |
| 59 | </Suspense> |
| 60 | ) : null, |
| 61 | }; |
| 62 | } |
| 63 |