PluginProbe
Code Snippets / 3.10.2
Code Snippets v3.10.2
4.0.0-beta.2 3.10.2 3.10.1 3.10.0 3.10.0-beta.2 3.10.0-beta.1 4.0.0-beta.1 3.9.6 trunk 2.10.0 2.10.1 2.12.0 2.12.1 2.13.0 2.13.1 2.13.2 2.13.3 2.14.0 2.14.1 2.14.2 2.14.3 2.14.4 2.14.5 2.14.6 3.0.0 All 65 releases
code-snippets / js / components / common / snippets / ConfirmDeleteDialog.tsx

ConfirmDeleteDialog.tsx in Code Snippets 3.10.2, at js/components/common/snippets/ConfirmDeleteDialog.tsx

100 lines 2.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import React, { useState } from 'react'
2 import { __ } from '@wordpress/i18n'
3 import { createInterpolateElement } from '@wordpress/element'
4 import { ConfirmDialog } from '../ConfirmDialog'
5 import { useSnippetsAPI } from '../../../hooks/useSnippetsAPI'
6 import type { Snippet } from '../../../types/Snippet'
7
8 const TrashActiveConfirmMessage = () =>
9 <>
10 <p style={{ marginBlockStart: 0 }}>
11 {createInterpolateElement(
12 __('This snippet is currently <strong>active</strong>.', 'code-snippets'),
13 { strong: <strong /> }
14 )}
15 </p>
16
17 <p>{__('Moving it to the trash will also deactivate it.', 'code-snippets')}</p>
18 </>
19
20 const PermanentDeleteConfirmMessage = () =>
21 <>
22 <p style={{ marginBlockStart: 0 }}>
23 {createInterpolateElement(
24 __('The snippet will be <strong>permanently deleted</strong>.', 'code-snippets'),
25 { strong: <strong /> }
26 )}
27 </p>
28
29 <p>{__('This action cannot be undone.', 'code-snippets')}</p>
30 </>
31
32 export interface ConfirmDeleteDialogProps {
33 snippet: Snippet
34 isDialogOpen: boolean
35 setIsDialogOpen: (isOpen: boolean) => void
36 makeDeleteRequest: () => Promise<void>
37 }
38
39 export const ConfirmDeleteDialog: React.FC<ConfirmDeleteDialogProps> = ({ snippet, isDialogOpen, setIsDialogOpen, makeDeleteRequest }) =>
40 <ConfirmDialog
41 open={isDialogOpen}
42 title={__('Are you sure?', 'code-snippets')}
43 confirmLabel={snippet.trashed ? __('Delete', 'code-snippets') : __('Trash', 'code-snippets')}
44 confirmButtonClassName="is-destructive"
45 onCancel={() => setIsDialogOpen(false)}
46 onConfirm={() => {
47 setIsDialogOpen(false)
48 void makeDeleteRequest()
49 }}
50 >
51 {snippet.trashed
52 ? <PermanentDeleteConfirmMessage />
53 : <TrashActiveConfirmMessage />}
54 </ConfirmDialog>
55
56 export interface UseDeleteSnippetProps {
57 snippet: Snippet
58 setIsWorking?: (isWorking: boolean) => void
59 onSuccess?: (() => Promise<void>) | VoidFunction
60 onError?: (error: unknown) => void
61 }
62
63 export interface ConfirmDeleteDialog {
64 requestDelete: () => Promise<void>
65 deleteDialogProps: ConfirmDeleteDialogProps
66 }
67
68 export const useDeleteSnippet = ({
69 snippet,
70 setIsWorking,
71 onSuccess,
72 onError
73 }: UseDeleteSnippetProps): ConfirmDeleteDialog => {
74 const snippetsAPI = useSnippetsAPI()
75 const [isDialogOpen, setIsDialogOpen] = useState(false)
76
77 const makeDeleteRequest = async () => {
78 setIsWorking?.(true)
79
80 try {
81 await snippetsAPI.delete(snippet)
82 await onSuccess?.()
83 } catch (error) {
84 onError?.(error)
85 } finally {
86 setIsWorking?.(false)
87 }
88 }
89
90 const requestDelete = async () => {
91 if (snippet.active || snippet.trashed) {
92 setIsDialogOpen(true)
93 } else {
94 await makeDeleteRequest()
95 }
96 }
97
98 return { requestDelete, deleteDialogProps: { snippet, isDialogOpen, setIsDialogOpen, makeDeleteRequest } }
99 }
100