Browse Source

feat: add fixed delay option on the interval trigger

Ahmad Kholid 3 years ago
parent
commit
ce5a0b557a

+ 26 - 12
src/background/index.js

@@ -1,7 +1,7 @@
 import browser from 'webextension-polyfill';
 import { MessageListener } from '@/utils/message';
 import { registerSpecificDay } from '../utils/workflow-trigger';
-import { parseJSON } from '@/utils/helper';
+import { parseJSON, findTriggerBlock } from '@/utils/helper';
 import WorkflowState from './workflow-state';
 import CollectionEngine from './collection-engine';
 import WorkflowEngine from './workflow-engine/engine';
@@ -262,20 +262,34 @@ browser.tabs.onCreated.addListener(async (tab) => {
 
   await browser.storage.local.set({ recording });
 });
-browser.alarms.onAlarm.addListener(({ name }) => {
-  workflow.get(name).then((currentWorkflow) => {
-    if (!currentWorkflow) return;
+browser.alarms.onAlarm.addListener(async ({ name }) => {
+  const currentWorkflow = await workflow.get(name);
+  if (!currentWorkflow) return;
+
+  const { data } = findTriggerBlock(JSON.parse(currentWorkflow.drawflow)) || {};
+  if (data && data.type === 'interval' && data.fixedDelay) {
+    const workflowState = await workflow.states.get(
+      ({ workflowId }) => name === workflowId
+    );
+
+    if (workflowState) {
+      let { workflowQueue } = await browser.storage.local.get('workflowQueue');
+      workflowQueue = workflowQueue || [];
+
+      if (!workflowQueue.includes(name)) {
+        (workflowQueue = workflowQueue || []).push(name);
+        await browser.storage.local.set({ workflowQueue });
+      }
 
-    workflow.execute(currentWorkflow);
+      return;
+    }
+  }
 
-    const triggerBlock = Object.values(
-      JSON.parse(currentWorkflow.drawflow).drawflow.Home.data
-    ).find((block) => block.name === 'trigger');
+  workflow.execute(currentWorkflow);
 
-    if (triggerBlock?.data.type === 'specific-day') {
-      registerSpecificDay(currentWorkflow.id, triggerBlock.data);
-    }
-  });
+  if (data && data.type === 'specific-day') {
+    registerSpecificDay(currentWorkflow.id, triggerBlock.data);
+  }
 });
 
 chrome.runtime.onInstalled.addListener((details) => {

+ 6 - 4
src/background/workflow-engine/blocks-handler/handler-interaction-block.js

@@ -87,11 +87,13 @@ async function interactionHandler(block, { refData }) {
     }
 
     if (isJavascriptBlock) {
-      Object.keys(data.variables).forEach((varName) => {
-        this.referenceData.variables[varName] = data.variables[varName];
-      });
+      if (data?.variables) {
+        Object.keys(data.variables).forEach((varName) => {
+          this.referenceData.variables[varName] = data.variables[varName];
+        });
+      }
 
-      if (data.columns.insert) {
+      if (data?.columns.insert) {
         const arrData = Array.isArray(data.columns.data)
           ? data.columns.data
           : [data.columns.data];

+ 19 - 0
src/background/workflow-engine/engine.js

@@ -172,12 +172,31 @@ class WorkflowEngine {
     }
   }
 
+  async executeQueue() {
+    const { workflowQueue } = await browser.storage.local.get('workflowQueue');
+    const queueIndex = (workflowQueue || []).indexOf(this.workflow.id);
+
+    if (!workflowQueue || queueIndex === -1) return;
+
+    const engine = new WorkflowEngine(this.workflow, {
+      logger: this.logger,
+      states: this.states,
+      blocksHandler: this.blocksHandler,
+    });
+    engine.init();
+
+    workflowQueue.splice(queueIndex, 1);
+
+    await browser.storage.local.set({ workflowQueue });
+  }
+
   async destroy(status, message) {
     try {
       if (this.isDestroyed) return;
       if (this.isUsingProxy) chrome.proxy.settings.clear({});
 
       const endedTimestamp = Date.now();
+      this.executeQueue();
 
       if (!this.workflow.isTesting && this.saveLog) {
         const { name, id } = this.workflow;

+ 36 - 25
src/components/newtab/workflow/edit/EditTrigger.vue

@@ -18,31 +18,42 @@
       </option>
     </ui-select>
     <transition-expand mode="out-in">
-      <div v-if="data.type === 'interval'" class="flex items-center mt-1">
-        <ui-input
-          :model-value="data.interval"
-          :label="t('workflow.blocks.trigger.forms.interval')"
-          type="number"
-          class="w-full mr-2"
-          placeholder="1-120"
-          min="1"
-          max="120"
-          @change="
-            updateIntervalInput($event, { key: 'interval', min: 1, max: 120 })
-          "
-        />
-        <ui-input
-          :model-value="data.delay"
-          type="number"
-          class="w-full"
-          :label="t('workflow.blocks.trigger.forms.delay')"
-          min="0"
-          max="20"
-          placeholder="0-20"
-          @change="
-            updateIntervalInput($event, { key: 'delay', min: 0, max: 20 })
-          "
-        />
+      <div v-if="data.type === 'interval'">
+        <div class="flex items-center mt-1">
+          <ui-input
+            :model-value="data.interval"
+            :label="t('workflow.blocks.trigger.forms.interval')"
+            type="number"
+            class="w-full"
+            placeholder="1-120"
+            min="1"
+            max="120"
+            @change="
+              updateIntervalInput($event, { key: 'interval', min: 1, max: 120 })
+            "
+          />
+          <ui-input
+            v-if="!data.fixedDelay"
+            :model-value="data.delay"
+            type="number"
+            class="w-full ml-2"
+            :label="t('workflow.blocks.trigger.forms.delay')"
+            min="0"
+            max="20"
+            placeholder="0-20"
+            @change="
+              updateIntervalInput($event, { key: 'delay', min: 0, max: 20 })
+            "
+          />
+        </div>
+        <ui-checkbox
+          :model-value="data.fixedDelay"
+          block
+          class="mt-2"
+          @change="updateData({ fixedDelay: $event })"
+        >
+          {{ t('workflow.blocks.trigger.fixedDelay') }}
+        </ui-checkbox>
       </div>
       <div v-else-if="data.type === 'date'" class="mt-2">
         <ui-input

+ 1 - 1
src/content/blocks-handler/handler-javascript-code.js

@@ -134,7 +134,7 @@ function javascriptCode(block) {
         });
         sessionStorage.removeItem(storageKey);
 
-        resolve({ columns, variables: storageRefData.variables });
+        resolve({ columns, variables: storageRefData?.variables });
       };
 
       window.addEventListener('__automa-next-block__', ({ detail }) => {

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

@@ -68,6 +68,7 @@
         "addTime": "Add time",
         "selectDay": "Select day",
         "timeExist": "You alread add {time} on {day}",
+        "fixedDelay": "Fixed delay",
         "days": [
           "Sunday",
           "Monday",

+ 0 - 1
src/newtab/App.vue

@@ -144,7 +144,6 @@ async function fetchUserData() {
     }
 
     if (userWorkflows.status === 'fulfilled') {
-      console.log(userWorkflows);
       const { backup, hosted } = userWorkflows.value;
 
       store.commit('updateState', {

+ 1 - 1
src/store/index.js

@@ -138,7 +138,7 @@ const store = createStore({
         method: 'POST',
         body: JSON.stringify({ hosts }),
       });
-      console.log(response);
+
       if (!response.ok) throw new Error(response.statusText);
 
       const result = await response.json();

+ 14 - 1
src/utils/workflow-trigger.js

@@ -2,6 +2,17 @@ import browser from 'webextension-polyfill';
 import dayjs from 'dayjs';
 import { isObject } from './helper';
 
+async function removeFromWorkflowQueue(workflowId) {
+  const { workflowQueue } = await browser.storage.local.get('workflowQueue');
+  const queueIndex = (workflowQueue || []).indexOf(workflowId);
+
+  if (!workflowQueue || queueIndex === -1) return;
+
+  workflowQueue.splice(queueIndex, 1);
+
+  await browser.storage.local.set({ workflowQueue });
+}
+
 export async function cleanWorkflowTriggers(workflowId) {
   try {
     await browser.alarms.clear(workflowId);
@@ -29,6 +40,8 @@ export async function cleanWorkflowTriggers(workflowId) {
       visitWebTriggers.splice(visitWebTriggerIndex, 1);
     }
 
+    await removeFromWorkflowQueue();
+
     await browser.storage.local.set({
       visitWebTriggers,
       shortcuts: keyboardShortcuts,
@@ -77,7 +90,7 @@ export function registerInterval(workflowId, data) {
     periodInMinutes: data.interval,
   };
 
-  if (data.delay > 0) alarmInfo.delayInMinutes = data.delay;
+  if (data.delay > 0 && !data.fixedDelay) alarmInfo.delayInMinutes = data.delay;
 
   return browser.alarms.create(workflowId, alarmInfo);
 }