Pārlūkot izejas kodu

add import support.

oldj 4 gadi atpakaļ
vecāks
revīzija
039f35b7ba

+ 31 - 4
src/main/actions/import.ts

@@ -4,10 +4,12 @@
  * @homepage: https://oldj.net
  */
 
-import { dialog } from 'electron'
 import getI18N from '@main/core/getI18N'
+import { swhdb } from '@main/data'
+import { dialog } from 'electron'
+import { promises as fs } from 'fs'
 
-export default async () => {
+export default async (): Promise<boolean | string> => {
   let { lang } = await getI18N()
 
   let result = await dialog.showOpenDialog({
@@ -18,7 +20,7 @@ export default async () => {
       { name: 'All Files', extensions: ['*'] },
     ],
     properties: [
-      'openDirectory',
+      'openFile',
     ],
   })
 
@@ -27,5 +29,30 @@ export default async () => {
   }
 
   let paths = result.filePaths
-  console.log(paths)
+  let fn = paths[0]
+  let content = await fs.readFile(fn, 'utf-8')
+
+  let data: any
+  try {
+    data = JSON.parse(content)
+  } catch (e) {
+    console.error(e)
+    return 'parse_error'
+  }
+
+  if (typeof data !== 'object' || !data.version || !Array.isArray(data.version) || !data.data) {
+    return 'invalid_data'
+  }
+
+  let { version } = data
+  if (version[0] === 3) {
+    // import v3 data
+  }
+  if (version[0] > 4) {
+    return 'new_version'
+  }
+
+  await swhdb.loadJSON(data.data)
+
+  return true
 }

+ 0 - 1
src/renderer/components/MainPanel/index.tsx

@@ -6,7 +6,6 @@
 
 import { useModel } from '@@/plugin-model/useModel'
 import HostsEditor from '@renderer/components/Editor/HostsEditor'
-import HostsViewer from '@renderer/components/HostsViewer'
 import { actions } from '@renderer/core/agent'
 import useOnBroadcast from '@renderer/core/useOnBroadcast'
 import React, { useEffect, useState } from 'react'

+ 24 - 1
src/renderer/components/TopBar/ConfigMenu.tsx

@@ -27,6 +27,7 @@ interface Props {
 
 const ConfigMenu = (props: Props) => {
   const { lang } = useModel('useI18n')
+  const { loadHostsData, setCurrentHosts } = useModel('useHostsData')
   const toast = useToast()
 
   return (
@@ -102,7 +103,29 @@ const ConfigMenu = (props: Props) => {
         </MenuItem>
         <MenuItem
           icon={<BiImport/>}
-          onClick={() => agent.broadcast('show_preferences')}
+          onClick={async () => {
+            let r = await actions.importData()
+            if (r === true) {
+              toast({
+                status: 'success',
+                description: lang.import_done,
+                isClosable: true,
+              })
+              await loadHostsData()
+              setCurrentHosts(null)
+            } else {
+              let description = lang.fail
+              if (typeof r === 'string') {
+                description += ` [${r}]`
+              }
+
+              toast({
+                status: 'error',
+                description,
+                isClosable: true,
+              })
+            }
+          }}
         >
           {lang.import}
         </MenuItem>