PluginProbe
Code Snippets / 3.10.1
Code Snippets v3.10.1
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 3.0.1 All 64 releases
code-snippets / js / components / Import / FromFileUpload / hooks / useImportWorkflow.ts

useImportWorkflow.ts in Code Snippets 3.10.1, at js/components/Import/FromFileUpload/hooks/useImportWorkflow.ts

118 lines 2.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { useState } from 'react'
2 import { __ } from '@wordpress/i18n'
3 import { useFileUploadAPI, type ImportableSnippet } from '../../../../hooks/useFileUploadAPI'
4 import { isNetworkAdmin } from '../../../../utils/screen'
5
6 type DuplicateAction = 'ignore' | 'replace' | 'skip'
7
8 interface UploadResult {
9 success: boolean
10 message: string
11 imported?: number
12 warnings?: string[]
13 }
14
15 export const useImportWorkflow = () => {
16 const [isUploading, setIsUploading] = useState(false)
17 const [isImporting, setIsImporting] = useState(false)
18 const [availableSnippets, setAvailableSnippets] = useState<ImportableSnippet[]>([])
19 const [uploadResult, setUploadResult] = useState<UploadResult | null>(null)
20
21 const fileUploadAPI = useFileUploadAPI()
22
23 const parseFiles = async (files: FileList): Promise<boolean> => {
24 if (!files || files.length === 0) {
25 alert(__('Please select files to upload.', 'code-snippets'))
26 return false
27 }
28
29 setIsUploading(true)
30 setUploadResult(null)
31
32 try {
33 const response = await fileUploadAPI.parseFiles({ files })
34
35 setAvailableSnippets(response.data.snippets)
36
37 if (response.data.warnings && response.data.warnings.length > 0) {
38 setUploadResult({
39 success: true,
40 message: response.data.message,
41 warnings: response.data.warnings
42 })
43 }
44
45 return true
46
47 } catch (error) {
48 console.error('Parse error:', error)
49 setUploadResult({
50 success: false,
51 message: error instanceof Error ? error.message : __('An unknown error occurred.', 'code-snippets')
52 })
53 return false
54 } finally {
55 setIsUploading(false)
56 }
57 }
58
59 const importSnippets = async (
60 snippetsToImport: ImportableSnippet[],
61 duplicateAction: DuplicateAction
62 ): Promise<boolean> => {
63 if (snippetsToImport.length === 0) {
64 alert(__('Please select snippets to import.', 'code-snippets'))
65 return false
66 }
67
68 setIsImporting(true)
69 setUploadResult(null)
70
71 try {
72 const response = await fileUploadAPI.importSnippets({
73 snippets: snippetsToImport,
74 duplicate_action: duplicateAction,
75 network: isNetworkAdmin()
76 })
77
78 setUploadResult({
79 success: true,
80 message: response.data.message,
81 imported: response.data.imported
82 })
83
84 return true
85
86 } catch (error) {
87 console.error('Import error:', error)
88 setUploadResult({
89 success: false,
90 message: error instanceof Error ? error.message : __('An unknown error occurred.', 'code-snippets')
91 })
92 return false
93 } finally {
94 setIsImporting(false)
95 }
96 }
97
98 const resetWorkflow = () => {
99 setAvailableSnippets([])
100 setUploadResult(null)
101 }
102
103 const clearUploadResult = () => {
104 setUploadResult(null)
105 }
106
107 return {
108 isUploading,
109 isImporting,
110 availableSnippets,
111 uploadResult,
112 parseFiles,
113 importSnippets,
114 resetWorkflow,
115 clearUploadResult
116 }
117 }
118