浏览代码

feat: add download id in handle download block

Ahmad Kholid 2 年之前
父节点
当前提交
b41ddcb02f

+ 31 - 21
src/components/newtab/workflow/edit/EditHandleDownload.vue

@@ -16,22 +16,31 @@
         @change="updateData({ timeout: +$event || 1000 })"
       />
       <ui-input
-        :model-value="data.filename"
-        :label="`${t('common.fileName')} (${t('common.optional')})`"
-        placeholder="file"
-        class="mt-2 w-full"
-        @change="updateData({ filename: $event })"
+        :model-value="data.downloadId"
+        :label="t('workflow.blocks.handle-download.downloadId')"
+        class="w-full mt-2"
+        placeholder="0"
+        @change="updateData({ downloadId: $event })"
       />
-      <ui-select
-        :model-value="data.onConflict"
-        :label="t('workflow.blocks.handle-download.onConflict')"
-        class="mt-2 w-full"
-        @change="updateData({ onConflict: $event })"
-      >
-        <option v-for="item in onConflict" :key="item" :value="item">
-          {{ t(`workflow.blocks.base.downloads.onConflict.${item}`) }}
-        </option>
-      </ui-select>
+      <template v-if="!data.downloadId?.trim()">
+        <ui-input
+          :model-value="data.filename"
+          :label="`${t('common.fileName')} (${t('common.optional')})`"
+          placeholder="file"
+          class="mt-2 w-full"
+          @change="updateData({ filename: $event })"
+        />
+        <ui-select
+          :model-value="data.onConflict"
+          :label="t('workflow.blocks.handle-download.onConflict')"
+          class="mt-2 w-full"
+          @change="updateData({ onConflict: $event })"
+        >
+          <option v-for="item in onConflict" :key="item" :value="item">
+            {{ t(`workflow.blocks.base.downloads.onConflict.${item}`) }}
+          </option>
+        </ui-select>
+      </template>
       <ui-checkbox
         :model-value="data.waitForDownload"
         class="mt-4"
@@ -39,12 +48,13 @@
       >
         {{ t('workflow.blocks.handle-download.waitFile') }}
       </ui-checkbox>
-      <insert-workflow-data
-        v-if="data.waitForDownload"
-        :data="data"
-        variables
-        @update="updateData"
-      />
+      <template v-if="data.waitForDownload">
+        <hr class="my-4 w-full" />
+        <p class="text-sm dark:text-gray-300 text-gray-600">
+          {{ t('workflow.blocks.handle-download.filePath') }}
+        </p>
+        <insert-workflow-data :data="data" variables @update="updateData" />
+      </template>
     </template>
     <template v-else>
       <p class="mt-4">

+ 3 - 1
src/locales/en/blocks.json

@@ -234,7 +234,9 @@
         "timeout": "Timeout (milliseconds)",
         "noPermission": "Don't have permission to access the downloads",
         "onConflict": "On conflict",
-        "waitFile": "Wait for the file to be downloaded"
+        "waitFile": "Wait for the file to be downloaded",
+        "downloadId": "The file download id (optional)",
+        "filePath": "File path"
       },
       "insert-data": {
         "name": "Insert data",

+ 2 - 1
src/utils/shared.js

@@ -1003,7 +1003,7 @@ export const tasks = {
     outputs: 1,
     allowedInputs: true,
     maxConnection: 1,
-    refDataKeys: ['filename'],
+    refDataKeys: ['filename', 'downloadId'],
     autocomplete: ['variableName'],
     data: {
       disableBlock: false,
@@ -1016,6 +1016,7 @@ export const tasks = {
       saveData: true,
       assignVariable: false,
       variableName: '',
+      downloadId: '',
     },
   },
   'reload-tab': {

+ 35 - 4
src/workflowEngine/blocksHandler/handlerHandleDownload.js

@@ -27,12 +27,40 @@ function determineFilenameListener(item, suggest) {
   return false;
 }
 
-function handleDownload({ data, id: blockId }) {
+async function handleDownload({ data, id: blockId }) {
   const nextBlockId = this.getBlockConnections(blockId);
   const getFilesname = () =>
     JSON.parse(sessionStorage.getItem('rename-downloaded-files')) || {};
 
-  return new Promise((resolve) => {
+  let downloadId = null;
+  if (data.downloadId?.trim()) {
+    if (Number.isNaN(+data.downloadId))
+      throw new Error('Download id is not a number');
+
+    const [downloadItem] = await browser.downloads.search({
+      id: +data.downloadId,
+    });
+    if (!downloadItem)
+      throw new Error(`Can't find download item with ${data.downloadId} id`);
+
+    if (downloadItem.state === 'complete') {
+      if (data.saveData) {
+        this.addDataToColumn(data.dataColumn, downloadItem.filename);
+      }
+      if (data.assignVariable) {
+        this.setVariable(data.variableName, downloadItem.filename);
+      }
+
+      return {
+        nextBlockId,
+        data: downloadItem.filename,
+      };
+    }
+
+    downloadId = +data.downloadId;
+  }
+
+  const result = await new Promise((resolve) => {
     if (!this.activeTab.id) throw new Error('no-tab');
 
     const hasListener =
@@ -44,7 +72,6 @@ function handleDownload({ data, id: blockId }) {
       );
     }
 
-    let downloadId = null;
     const handleCreated = ({ id }) => {
       if (downloadId) return;
 
@@ -56,7 +83,9 @@ function handleDownload({ data, id: blockId }) {
 
       browser.downloads.onCreated.removeListener(handleCreated);
     };
-    browser.downloads.onCreated.addListener(handleCreated);
+    if (!downloadId) {
+      browser.downloads.onCreated.addListener(handleCreated);
+    }
 
     if (!data.waitForDownload) {
       resolve({
@@ -132,6 +161,8 @@ function handleDownload({ data, id: blockId }) {
 
     browser.downloads.onChanged.addListener(handleChanged);
   });
+
+  return result;
 }
 
 export default handleDownload;

+ 1 - 1
src/workflowEngine/blocksHandler/handlerSaveAssets.js

@@ -55,7 +55,7 @@ export default async function ({ data, id, label }) {
 
     downloadIds = await Promise.all(sources.map((url) => downloadFile(url)));
   } else if (data.type === 'url') {
-    downloadIds = await downloadFile(data.url);
+    downloadIds = [await downloadFile(data.url)];
   }
 
   if (data.saveDownloadIds) {