Skip to content
Source
Sign inSign up

useRemoveClonedProject.ts

51 lines2.4 KB

1import { useRouter } from "@tanstack/react-router";
2import { squashAtomCommandFailure } from "@t3tools/client-runtime/state/runtime";
3import type { ScopedProjectRef } from "@t3tools/contracts";
4​
5import { useComposerDraftStore } from "../composerDraftStore";
6import { resolveThreadRouteTarget } from "../threadRoutes";
7import { releaseProjectDraftUploads } from "../lib/composerDraftUploads";
8import { waitForProjectRemoval } from "../state/entities";
9import { projectEnvironment } from "../state/projects";
10import { useAtomCommand } from "../state/use-atom-command";
11import { stackedThreadToast, toastManager } from "../components/ui/toast";
12​
13export function useRemoveClonedProject() {
14 const router = useRouter();
15 const deleteProject = useAtomCommand(projectEnvironment.delete, { reportFailure: false });
16​
17 return async (projectRef: ScopedProjectRef) => {
18 const draftStore = useComposerDraftStore.getState();
19 const result = await deleteProject({
20 environmentId: projectRef.environmentId,
21 // Leave deletion unforced so a thread created since the failed clone cannot be silently deleted.
22 input: { projectId: projectRef.projectId },
23 });
24 if (result._tag === "Failure") {
25 const error = squashAtomCommandFailure(result);
26 toastManager.add(
27 stackedThreadToast({
28 type: "error",
29 title: "Failed to remove project",
30 description: error instanceof Error ? error.message : "An error occurred.",
31 }),
32 );
33 return false;
34 }
35 await waitForProjectRemoval(projectRef);
36 // Re-read the route after deletion; the user may have left this project.
37 const routeParams = router.state.matches[router.state.matches.length - 1]?.params ?? {};
38 const routeTarget = resolveThreadRouteTarget(routeParams);
39 const viewingDraft =
40 routeTarget?.kind === "draft" ? draftStore.getDraftSession(routeTarget.draftId) : null;
41 const viewingThisProject =
42 viewingDraft?.environmentId === projectRef.environmentId &&
43 viewingDraft.projectId === projectRef.projectId;
44 releaseProjectDraftUploads(projectRef);
45 const projectDraft = draftStore.getDraftThreadByProjectRef(projectRef);
46 if (projectDraft) draftStore.clearDraftThread(projectDraft.draftId);
47 draftStore.clearProjectDraftThreadId(projectRef);
48 if (viewingThisProject) void router.navigate({ to: "/", replace: true });
49 return true;
50 };