Browse Source

feat: add "Support SPA website" in visit web trigger (#926)

Ahmad Kholid 2 years ago
parent
commit
c14b15ff4a

+ 6 - 0
src/background/BackgroundEventsListeners.js

@@ -36,6 +36,12 @@ class BackgroundEventsListeners {
     BackgroundWorkflowTriggers.reRegisterTriggers(true);
   }
 
+  static onHistoryStateUpdated({ frameId, url, tabId }) {
+    if (frameId !== 0) return;
+
+    BackgroundWorkflowTriggers.visitWebTriggers(tabId, url, true);
+  }
+
   static async onRuntimeInstalled({ reason }) {
     try {
       if (reason === 'install') {

+ 7 - 5
src/background/BackgroundWorkflowTriggers.js

@@ -27,17 +27,19 @@ async function executeWorkflow(workflowData, options) {
 }
 
 class BackgroundWorkflowTriggers {
-  static async visitWebTriggers(tabId, tabUrl) {
+  static async visitWebTriggers(tabId, tabUrl, spa = false) {
     const { visitWebTriggers } = await browser.storage.local.get(
       'visitWebTriggers'
     );
     if (!visitWebTriggers || visitWebTriggers.length === 0) return;
 
-    const triggeredWorkflow = visitWebTriggers.find(({ url, isRegex }) => {
-      if (url.trim() === '') return false;
+    const triggeredWorkflow = visitWebTriggers.find(
+      ({ url, isRegex, supportSPA }) => {
+        if (!url.trim() || (spa && !supportSPA)) return false;
 
-      return tabUrl.match(isRegex ? new RegExp(url, 'g') : url);
-    });
+        return tabUrl.match(isRegex ? new RegExp(url, 'g') : url);
+      }
+    );
 
     if (triggeredWorkflow) {
       let workflowId = triggeredWorkflow.id;

+ 3 - 0
src/background/index.js

@@ -27,6 +27,9 @@ browser.runtime.onInstalled.addListener(
 browser.webNavigation.onCompleted.addListener(
   BackgroundEventsListeners.onWebNavigationCompleted
 );
+browser.webNavigation.onHistoryStateUpdated.addListener(
+  BackgroundEventsListeners.onHistoryStateUpdated
+);
 
 const contextMenu =
   BROWSER_TYPE === 'firefox' ? browser.menus : browser.contextMenus;

+ 1 - 0
src/components/newtab/shared/SharedWorkflowTriggers.vue

@@ -127,6 +127,7 @@ const triggersData = {
     data: {
       url: '',
       isUrlRegex: false,
+      supportSPA: false,
     },
   },
   'keyboard-shortcut': {

+ 7 - 0
src/components/newtab/workflow/edit/Trigger/TriggerVisitWeb.vue

@@ -13,6 +13,13 @@
     >
       {{ t('workflow.blocks.trigger.useRegex') }}
     </ui-checkbox>
+    <ui-checkbox
+      :model-value="data.supportSPA"
+      class="ml-6"
+      @change="$emit('update', { supportSPA: $event })"
+    >
+      Support SPA website
+    </ui-checkbox>
   </div>
 </template>
 <script setup>

+ 1 - 0
src/utils/workflowTrigger.js

@@ -226,6 +226,7 @@ export async function registerVisitWeb(workflowId, data) {
       id: workflowId,
       url: data.url,
       isRegex: data.isUrlRegex,
+      supportSPA: data.supportSPA ?? false,
     };
 
     if (index === -1) {