diff --git a/packages/web/app/src/components/v2/modals/delete-target.tsx b/packages/web/app/src/components/v2/modals/delete-target.tsx deleted file mode 100644 index e1c1162e6..000000000 --- a/packages/web/app/src/components/v2/modals/delete-target.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { ReactElement } from 'react'; -import { useMutation } from 'urql'; -import { Button } from '@/components/ui/button'; -import { Heading } from '@/components/ui/heading'; -import { Modal } from '@/components/v2'; -import { graphql } from '@/gql'; -import { TrashIcon } from '@radix-ui/react-icons'; -import { useRouter } from '@tanstack/react-router'; - -export const DeleteTargetMutation = graphql(` - mutation deleteTarget($selector: TargetSelectorInput!) { - deleteTarget(selector: $selector) { - selector { - organization - project - target - } - deletedTarget { - __typename - id - } - } - } -`); - -export const DeleteTargetModal = ({ - isOpen, - toggleModalOpen, - organizationId, - projectId, - targetId, -}: { - isOpen: boolean; - toggleModalOpen: () => void; - organizationId: string; - projectId: string; - targetId: string; -}): ReactElement => { - const [, mutate] = useMutation(DeleteTargetMutation); - const router = useRouter(); - - return ( - - - Delete target -

- Are you sure you wish to delete this target? 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 90509d734..ba1f6e62c 100644 --- a/packages/web/app/src/components/v2/modals/index.ts +++ b/packages/web/app/src/components/v2/modals/index.ts @@ -2,5 +2,4 @@ export { ChangePermissionsModal } from './change-permissions'; export { ConnectSchemaModal } from './connect-schema'; export { DeleteOrganizationModal } from './delete-organization'; export { DeleteProjectModal } from './delete-project'; -export { DeleteTargetModal } from './delete-target'; 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 04f40f81c..48c41f844 100644 --- a/packages/web/app/src/lib/urql-cache.ts +++ b/packages/web/app/src/lib/urql-cache.ts @@ -13,11 +13,14 @@ import type { DeleteOperationMutationType } from '@/components/target/laboratory 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 { type DeleteTargetMutation } from '@/components/v2/modals/delete-target'; import { graphql } from '@/gql'; import type { CreateOrganizationMutation } from '@/pages/organization-new'; import { CollectionsQuery } from '@/pages/target-laboratory'; -import { TokensDocument, type DeleteTokensDocument } from '@/pages/target-settings'; +import { + TokensDocument, + type DeleteTargetMutation, + type DeleteTokensDocument, +} from '@/pages/target-settings'; import { ResultOf, VariablesOf } from '@graphql-typed-document-node/core'; import { Cache, QueryInput, UpdateResolver } from '@urql/exchange-graphcache'; diff --git a/packages/web/app/src/pages/target-settings.tsx b/packages/web/app/src/pages/target-settings.tsx index c6443c37a..8a92ad336 100644 --- a/packages/web/app/src/pages/target-settings.tsx +++ b/packages/web/app/src/pages/target-settings.tsx @@ -12,6 +12,14 @@ import { SchemaContracts } from '@/components/target/settings/schema-contracts'; import { Button } from '@/components/ui/button'; import { CardDescription } from '@/components/ui/card'; import { Checkbox } from '@/components/ui/checkbox'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; import { DocsLink } from '@/components/ui/docs-note'; import { Meta } from '@/components/ui/meta'; import { @@ -27,7 +35,6 @@ import { TimeAgo } from '@/components/ui/time-ago'; import { useToast } from '@/components/ui/use-toast'; import { Combobox } from '@/components/v2/combobox'; import { Input } from '@/components/v2/input'; -import { DeleteTargetModal } from '@/components/v2/modals'; import { Switch } from '@/components/v2/switch'; import { Table, TBody, Td, Tr } from '@/components/v2/table'; import { Tag } from '@/components/v2/tag'; @@ -1270,3 +1277,101 @@ export function TargetSettingsPage(props: { ); } + +export const DeleteTargetMutation = graphql(` + mutation deleteTarget($selector: TargetSelectorInput!) { + deleteTarget(selector: $selector) { + selector { + organization + project + target + } + deletedTarget { + __typename + id + } + } + } +`); + +export function DeleteTargetModal(props: { + isOpen: boolean; + toggleModalOpen: () => void; + organizationId: string; + projectId: string; + targetId: string; +}) { + const { organizationId, projectId, targetId } = props; + const [, mutate] = useMutation(DeleteTargetMutation); + const { toast } = useToast(); + const router = useRouter(); + + const handleDelete = async () => { + const { error } = await mutate({ + selector: { + organization: organizationId, + project: projectId, + target: targetId, + }, + }); + if (error) { + toast({ + variant: 'destructive', + title: 'Failed to delete target', + description: error.message, + }); + } else { + toast({ + title: 'Target deleted', + description: 'The target has been successfully deleted.', + }); + props.toggleModalOpen(); + void router.navigate({ + to: '/$organizationId/$projectId', + params: { + organizationId, + projectId, + }, + }); + } + }; + + return ( + + ); +} + +export function DeleteTargetModalContent(props: { + isOpen: boolean; + toggleModalOpen: () => void; + handleDelete: () => void; +}) { + return ( + + + + Delete target + + + Every published schema, reported data, and settings associated with this target will be + permanently deleted. + + + This action is irreversible! + + + + + + + + ); +} diff --git a/packages/web/app/src/stories/delete-target.stories.tsx b/packages/web/app/src/stories/delete-target.stories.tsx new file mode 100644 index 000000000..aa05259fa --- /dev/null +++ b/packages/web/app/src/stories/delete-target.stories.tsx @@ -0,0 +1,33 @@ +import { useState } from 'react'; +import { Button } from '@/components/ui/button'; +import { DeleteTargetModalContent } from '@/pages/target-settings'; +import { Meta, StoryObj } from '@storybook/react'; + +const meta: Meta = { + title: 'Modals/Delete Target Modal', + component: DeleteTargetModalContent, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => { + const [openModal, setOpenModal] = useState(false); + const toggleModalOpen = () => setOpenModal(!openModal); + + return ( + <> + + {openModal && ( + console.log('Delete')} + /> + )} + + ); + }, +};