[Feature] Delete file or folder. (#9)

diff --git a/studio/components/files/index.tsx b/studio/components/files/index.tsx
index c28ad30..27c306f 100644
--- a/studio/components/files/index.tsx
+++ b/studio/components/files/index.tsx
@@ -43,7 +43,7 @@
 export const Files = defineComponent({
   name: 'files',
   props,
-  emits: ['select', 'inputBlur'],
+  emits: ['select', 'inputBlur', 'delete'],
   setup(props, { emit, expose }) {
     const keyRef = ref()
     const treeRef = ref()
@@ -101,6 +101,9 @@
 
     const onContextMenuSelect = (key: string) => {
       showDropdownRef.value = false
+      if (key === 'delete') {
+        emit('delete', Number(id))
+      }
     }
 
     const onClickoutside = () => {
diff --git a/studio/components/studio-sider/index.tsx b/studio/components/studio-sider/index.tsx
index 61a5654..43b0284 100644
--- a/studio/components/studio-sider/index.tsx
+++ b/studio/components/studio-sider/index.tsx
@@ -27,8 +27,14 @@
     const widthRef = ref(300)
     const inputRef = ref()
     const fileRef = ref()
-    const { state, onCreateFile, onCreateFolder, onSelectFile, onInputBlur } =
-      useFile(inputRef, fileRef)
+    const {
+      state,
+      onCreateFile,
+      onCreateFolder,
+      onSelectFile,
+      onInputBlur,
+      onDelete
+    } = useFile(inputRef, fileRef)
 
     return () => (
       <NLayoutSider class={styles['studio-sider']} width={widthRef.value}>
@@ -45,6 +51,7 @@
             data={state.files}
             onSelect={onSelectFile}
             onInputBlur={onInputBlur}
+            onDelete={onDelete}
             inputRef={inputRef}
             selected-keys={[state.currentKey]}
             ref={fileRef}
diff --git a/studio/components/studio-sider/use-file.ts b/studio/components/studio-sider/use-file.ts
index ee44e2b..cf88ede 100644
--- a/studio/components/studio-sider/use-file.ts
+++ b/studio/components/studio-sider/use-file.ts
@@ -16,7 +16,8 @@
  */
 import { reactive, Ref, nextTick } from 'vue'
 import { useMessage } from 'naive-ui'
-import { addFile } from '@/service/modules/file'
+import { remove } from 'lodash'
+import { addFile, deleteFile } from '@/service/modules/file'
 import { useLocale } from '@/hooks'
 import { sameNameValidator } from './helper'
 import type { IFileState, FileType, IFileRecord } from './types'
@@ -24,14 +25,16 @@
 export const useFile = (inputRef: Ref, fileRef: Ref) => {
   const state = reactive({
     currentKey: 0,
-    files: [{ type: '', id: 1, name: '123', pid: 0 }],
+    files: [{ type: '', id: 1, name: '123', pid: 0, children: [] }],
     isCreating: false
   } as IFileState)
 
   const message = useMessage()
   const { t } = useLocale()
 
-  const filesCached = {} as { [key: number]: IFileRecord }
+  const filesCached = {
+    1: { type: '', id: 1, name: '123', pid: 0, children: [] }
+  } as { [key: number]: IFileRecord }
 
   const freshFiles = () => {
     fileRef.value.refresh()
@@ -130,5 +133,30 @@
     }
   }
 
-  return { state, onCreateFile, onCreateFolder, onSelectFile, onInputBlur }
+  const onDelete = async (id: number) => {
+    const deletedRecord = filesCached[id]
+    if (!deletedRecord.type && deletedRecord.children?.length) {
+      message.error(t('delete_tips'))
+      return
+    }
+    await deleteFile(id)
+
+    const children =
+      deletedRecord.pid === 0
+        ? state.files
+        : filesCached[deletedRecord.pid].children || []
+
+    remove(children, (record) => record.id === id)
+
+    delete filesCached[id]
+  }
+
+  return {
+    state,
+    onCreateFile,
+    onCreateFolder,
+    onSelectFile,
+    onInputBlur,
+    onDelete
+  }
 }
diff --git a/studio/locales/en_US.ts b/studio/locales/en_US.ts
index de6db9b..81ab60d 100644
--- a/studio/locales/en_US.ts
+++ b/studio/locales/en_US.ts
@@ -19,7 +19,8 @@
   success: 'Success',
   saved_successfully: 'Saved successfully',
   same_name_tips: 'Same name exits for files at the same level.',
-  delete: 'Delete'
+  delete: 'Delete',
+  delete_tips: 'Please delete the files in this folder first.'
 }
 
 export type Locale = typeof enUS
diff --git a/studio/locales/zh_CN.ts b/studio/locales/zh_CN.ts
index 2eccfba..e8d1367 100644
--- a/studio/locales/zh_CN.ts
+++ b/studio/locales/zh_CN.ts
@@ -19,5 +19,6 @@
   success: '成功',
   saved_successfully: '保存成功',
   same_name_tips: '同级文件存在相同名字',
-  delete: '删除'
+  delete: '删除',
+  delete_tips: '请先删除文件夹下的文件'
 }