Ver código fonte

feat(editor): add link block

Ahmad Kholid 3 anos atrás
pai
commit
e9399105dd

+ 2 - 0
src/background/blocks-handler.js

@@ -66,8 +66,10 @@ export function interactionHandler(block) {
       name: 'tab-message',
       name: 'tab-message',
       id: block.name,
       id: block.name,
       once: true,
       once: true,
+      delay: block.name === 'link' ? 5000 : 0,
       callback: (data) => {
       callback: (data) => {
         this.data.push(data);
         this.data.push(data);
+
         resolve({
         resolve({
           data,
           data,
           nextBlockId: getBlockConnection(block),
           nextBlockId: getBlockConnection(block),

+ 14 - 9
src/background/workflow-engine.js

@@ -8,7 +8,10 @@ function tabMessageHandler({ type, data }) {
   const listener = this.tabMessageListeners[type];
   const listener = this.tabMessageListeners[type];
 
 
   if (listener) {
   if (listener) {
-    listener.callback(data);
+    console.log(listener.delay, 'delay....');
+    setTimeout(() => {
+      listener.callback(data);
+    }, listener.delay || 0);
 
 
     if (listener.once) delete this.tabMessageListeners[type];
     if (listener.once) delete this.tabMessageListeners[type];
   }
   }
@@ -30,11 +33,11 @@ function tabUpdatedHandler(tabId, changeInfo) {
       delete this.tabUpdatedListeners[tabId];
       delete this.tabUpdatedListeners[tabId];
     });
     });
   } else {
   } else {
-    if (changeInfo.status !== 'complete') return;
+    if (this.tabId !== tabId) return;
 
 
-    if (this.tabId === tabId) {
-      this.isPaused = true;
+    this.isInsidePaused = true;
 
 
+    if (changeInfo.status === 'complete') {
       browser.tabs
       browser.tabs
         .executeScript(tabId, {
         .executeScript(tabId, {
           file: './contentScript.bundle.js',
           file: './contentScript.bundle.js',
@@ -43,11 +46,11 @@ function tabUpdatedHandler(tabId, changeInfo) {
           console.log(this.currentBlock);
           console.log(this.currentBlock);
           if (this._connectedTab) this._connectTab(this.tabId);
           if (this._connectedTab) this._connectTab(this.tabId);
 
 
-          this.isPaused = false;
+          this.isInsidePaused = false;
         })
         })
         .catch((error) => {
         .catch((error) => {
           console.error(error);
           console.error(error);
-          this.isPaused = false;
+          this.isInsidePaused = false;
         });
         });
     }
     }
   }
   }
@@ -61,6 +64,7 @@ class WorkflowEngine {
     this.data = [];
     this.data = [];
     this.isDestroyed = false;
     this.isDestroyed = false;
     this.isPaused = false;
     this.isPaused = false;
+    this.isInsidePaused = false;
     this.logs = [];
     this.logs = [];
     this.currentBlock = null;
     this.currentBlock = null;
 
 
@@ -105,6 +109,7 @@ class WorkflowEngine {
   }
   }
 
 
   _blockHandler(block, prevBlockData) {
   _blockHandler(block, prevBlockData) {
+    console.log(this.isInsidePaused, 'isInsidePaused');
     if (this.isDestroyed) {
     if (this.isDestroyed) {
       console.log(
       console.log(
         '%cDestroyed',
         '%cDestroyed',
@@ -112,7 +117,7 @@ class WorkflowEngine {
       );
       );
       return;
       return;
     }
     }
-    if (this.isPaused) {
+    if (this.isPaused || this.isInsidePaused) {
       setTimeout(() => {
       setTimeout(() => {
         this._blockHandler(block, prevBlockData);
         this._blockHandler(block, prevBlockData);
       }, 1000);
       }, 1000);
@@ -166,12 +171,12 @@ class WorkflowEngine {
     return connectedTab;
     return connectedTab;
   }
   }
 
 
-  _listener({ id, name, callback, once = true }) {
+  _listener({ id, name, callback, once = true, ...options }) {
     const listenerNames = {
     const listenerNames = {
       'tab-updated': 'tabUpdatedListeners',
       'tab-updated': 'tabUpdatedListeners',
       'tab-message': 'tabMessageListeners',
       'tab-message': 'tabMessageListeners',
     };
     };
-    this[listenerNames[name]][id] = { callback, once };
+    this[listenerNames[name]][id] = { callback, once, ...options };
 
 
     return () => {
     return () => {
       delete this.tabMessageListeners[id];
       delete this.tabMessageListeners[id];

+ 1 - 0
src/components/newtab/workflow/edit/EditInteractionBase.vue

@@ -14,6 +14,7 @@
     @change="updateData({ selector: $event })"
     @change="updateData({ selector: $event })"
   />
   />
   <ui-checkbox
   <ui-checkbox
+    v-if="!data.disableMultiple"
     :model-value="data.multiple"
     :model-value="data.multiple"
     @change="updateData({ multiple: $event })"
     @change="updateData({ multiple: $event })"
   >
   >

+ 19 - 0
src/content/blocks-handler.js

@@ -107,3 +107,22 @@ export function triggerEvent({ data }) {
     resolve('');
     resolve('');
   });
   });
 }
 }
+
+export function link({ data }) {
+  return new Promise((resolve) => {
+    const element = document.querySelector(data.selector);
+
+    if (!element) {
+      resolve('');
+      return;
+    }
+
+    const url = element.href;
+
+    if (url) window.location.href = url;
+
+    // setTimeout(() => {
+    resolve('');
+    // }, 2000);
+  });
+}

+ 2 - 0
src/lib/v-remixicon.js

@@ -16,6 +16,7 @@ import {
   riDeleteBin7Line,
   riDeleteBin7Line,
   riPencilLine,
   riPencilLine,
   riExternalLinkLine,
   riExternalLinkLine,
+  riLink,
   riArrowLeftSLine,
   riArrowLeftSLine,
   riArrowLeftLine,
   riArrowLeftLine,
   riEditBoxLine,
   riEditBoxLine,
@@ -67,6 +68,7 @@ export const icons = {
   riDeleteBin7Line,
   riDeleteBin7Line,
   riPencilLine,
   riPencilLine,
   riExternalLinkLine,
   riExternalLinkLine,
+  riLink,
   riArrowLeftSLine,
   riArrowLeftSLine,
   riArrowLeftLine,
   riArrowLeftLine,
   riEditBoxLine,
   riEditBoxLine,

+ 21 - 4
src/utils/handle-form-element.js

@@ -7,13 +7,30 @@ function formEvent(element, data) {
       ? 'Space'
       ? 'Space'
       : `key${data.value.toUpperCase()}`;
       : `key${data.value.toUpperCase()}`;
 
 
-    simulateEvent(element, 'keydown', { code, key: data.value });
-    simulateEvent(element, 'keyup', { code, key: data.value });
+    simulateEvent(element, 'keydown', {
+      code,
+      bubbles: true,
+      cancelable: true,
+      key: data.value,
+    });
+    simulateEvent(element, 'keyup', {
+      code,
+      bubbles: true,
+      cancelable: true,
+      key: data.value,
+    });
   }
   }
 
 
-  element.dispatchEvent(new Event('change'));
   element.dispatchEvent(
   element.dispatchEvent(
-    new InputEvent('input', { inputType: 'insertText', data: data.value })
+    new Event('change', { bubbles: true, cancelable: true })
+  );
+  element.dispatchEvent(
+    new InputEvent('input', {
+      inputType: 'insertText',
+      data: data.value,
+      bubbles: true,
+      cancelable: true,
+    })
   );
   );
 }
 }
 function inputText({ data, element, index = 0, callback }) {
 function inputText({ data, element, index = 0, callback }) {

+ 16 - 0
src/utils/shared.js

@@ -97,6 +97,22 @@ export const tasks = {
       scrollX: 0,
       scrollX: 0,
     },
     },
   },
   },
+  link: {
+    name: 'Link',
+    icon: 'riLink',
+    component: 'BlockBasic',
+    editComponent: 'EditInteractionBase',
+    category: 'interaction',
+    inputs: 1,
+    outputs: 1,
+    allowedInputs: true,
+    maxConnection: 1,
+    data: {
+      description: '',
+      selector: '',
+      disableMultiple: true,
+    },
+  },
   'attribute-value': {
   'attribute-value': {
     name: 'Attribute value',
     name: 'Attribute value',
     icon: 'riBracketsLine',
     icon: 'riBracketsLine',