-
- Delete project
-
- Are you sure you wish to delete this project? This action is irreversible!
-
-
-
-
-
-
- );
-};
diff --git a/packages/web/app/src/components/v2/modals/index.ts b/packages/web/app/src/components/v2/modals/index.ts
index ba1f6e62c..2930e4322 100644
--- a/packages/web/app/src/components/v2/modals/index.ts
+++ b/packages/web/app/src/components/v2/modals/index.ts
@@ -1,5 +1,4 @@
export { ChangePermissionsModal } from './change-permissions';
export { ConnectSchemaModal } from './connect-schema';
export { DeleteOrganizationModal } from './delete-organization';
-export { DeleteProjectModal } from './delete-project';
export { TransferOrganizationOwnershipModal } from './transfer-organization-ownership';
diff --git a/packages/web/app/src/lib/urql-cache.ts b/packages/web/app/src/lib/urql-cache.ts
index 48c41f844..c9d7f70c1 100644
--- a/packages/web/app/src/lib/urql-cache.ts
+++ b/packages/web/app/src/lib/urql-cache.ts
@@ -12,9 +12,9 @@ import type { DeleteCollectionMutationType } from '@/components/target/laborator
import type { DeleteOperationMutationType } from '@/components/target/laboratory/delete-operation-modal';
import type { CreateAccessToken_CreateTokenMutation } from '@/components/target/settings/registry-access-token';
import type { DeleteOrganizationDocument } from '@/components/v2/modals/delete-organization';
-import { type DeleteProjectMutation } from '@/components/v2/modals/delete-project';
import { graphql } from '@/gql';
import type { CreateOrganizationMutation } from '@/pages/organization-new';
+import type { DeleteProjectMutation } from '@/pages/project-settings';
import { CollectionsQuery } from '@/pages/target-laboratory';
import {
TokensDocument,
diff --git a/packages/web/app/src/pages/project-settings.tsx b/packages/web/app/src/pages/project-settings.tsx
index 396f1c85a..964fbf7b9 100644
--- a/packages/web/app/src/pages/project-settings.tsx
+++ b/packages/web/app/src/pages/project-settings.tsx
@@ -16,6 +16,14 @@ import {
CardHeader,
CardTitle,
} from '@/components/ui/card';
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+} from '@/components/ui/dialog';
import { DocsLink } from '@/components/ui/docs-note';
import { HiveLogo } from '@/components/ui/icon';
import { Meta } from '@/components/ui/meta';
@@ -23,7 +31,6 @@ import { Subtitle, Title } from '@/components/ui/page';
import { QueryError } from '@/components/ui/query-error';
import { useToast } from '@/components/ui/use-toast';
import { Input } from '@/components/v2/input';
-import { DeleteProjectModal } from '@/components/v2/modals';
import { graphql, useFragment } from '@/gql';
import { ProjectType } from '@/gql/graphql';
import { canAccessProject, ProjectAccessScope, useProjectAccess } from '@/lib/access/project';
@@ -431,3 +438,96 @@ export function ProjectSettingsPage(props: { organizationId: string; projectId:
>
);
}
+
+export const DeleteProjectMutation = graphql(`
+ mutation deleteProject($selector: ProjectSelectorInput!) {
+ deleteProject(selector: $selector) {
+ selector {
+ organization
+ project
+ }
+ deletedProject {
+ __typename
+ id
+ }
+ }
+ }
+`);
+
+export function DeleteProjectModal(props: {
+ isOpen: boolean;
+ toggleModalOpen: () => void;
+ organizationId: string;
+ projectId: string;
+}) {
+ const { organizationId, projectId } = props;
+ const [, mutate] = useMutation(DeleteProjectMutation);
+ const { toast } = useToast();
+ const router = useRouter();
+
+ const handleDelete = async () => {
+ const { error } = await mutate({
+ selector: {
+ organization: organizationId,
+ project: projectId,
+ },
+ });
+
+ if (error) {
+ toast({
+ variant: 'destructive',
+ title: 'Failed to delete project',
+ description: error.message,
+ });
+ } else {
+ toast({
+ title: 'Project deleted',
+ description: 'The project has been successfully deleted.',
+ });
+ props.toggleModalOpen();
+ void router.navigate({
+ to: '/$organizationId',
+ params: {
+ organizationId,
+ },
+ });
+ }
+ };
+
+ return (
+