123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- import { defineStore } from 'pinia';
- import { nanoid } from 'nanoid';
- import defu from 'defu';
- import deepmerge from 'lodash.merge';
- import browser from 'webextension-polyfill';
- import dayjs from 'dayjs';
- import { fetchApi } from '@/utils/api';
- import { tasks } from '@/utils/shared';
- import firstWorkflows from '@/utils/firstWorkflows';
- import { cleanWorkflowTriggers } from '@/utils/workflowTrigger';
- import { parseJSON } from '@/utils/helper';
- import { useUserStore } from './user';
- const defaultWorkflow = (data = null, options = {}) => {
- let workflowData = {
- id: nanoid(),
- name: '',
- icon: 'riGlobalLine',
- folderId: null,
- connectedTable: null,
- drawflow: {
- edges: [],
- position: { zoom: 1 },
- nodes: [
- {
- position: {
- x: 100,
- y: window.innerHeight / 2,
- },
- id: nanoid(),
- label: 'trigger',
- data: tasks.trigger.data,
- type: tasks.trigger.component,
- },
- ],
- },
- table: [],
- dataColumns: [],
- description: '',
- trigger: null,
- createdAt: Date.now(),
- updatedAt: Date.now(),
- isDisabled: false,
- settings: {
- publicId: '',
- blockDelay: 0,
- saveLog: true,
- debugMode: false,
- restartTimes: 3,
- notification: true,
- reuseLastState: false,
- inputAutocomplete: true,
- onError: 'stop-workflow',
- executedBlockOnWeb: false,
- insertDefaultColumn: true,
- defaultColumnName: 'column',
- },
- version: browser.runtime.getManifest().version,
- globalData: '{\n\t"key": "value"\n}',
- };
- if (data) {
- if (options.duplicateId && data.id) {
- delete workflowData.id;
- }
- if (data.drawflow?.nodes?.length > 0) {
- workflowData.drawflow.nodes = [];
- }
- workflowData = defu(data, workflowData);
- }
- return workflowData;
- };
- function convertWorkflowsToObject(workflows) {
- if (Array.isArray(workflows)) {
- return workflows.reduce((acc, workflow) => {
- acc[workflow.id] = workflow;
- return acc;
- }, {});
- }
- return workflows;
- }
- export const useWorkflowStore = defineStore('workflow', {
- storageMap: {
- workflows: 'workflows',
- },
- state: () => ({
- states: [],
- workflows: {},
- retrieved: false,
- }),
- getters: {
- getById: (state) => (id) => state.workflows[id],
- getWorkflows: (state) => Object.values(state.workflows),
- getWorkflowStates: (state) => (id) =>
- state.states.filter(({ workflowId }) => workflowId === id),
- },
- actions: {
- async loadData() {
- const { workflows, isFirstTime } = await browser.storage.local.get([
- 'workflows',
- 'isFirstTime',
- ]);
- let localWorkflows = workflows;
- if (isFirstTime) {
- localWorkflows = firstWorkflows.map((workflow) =>
- defaultWorkflow(workflow)
- );
- await browser.storage.local.set({ isFirstTime: false });
- }
- this.workflows = convertWorkflowsToObject(localWorkflows);
- const storedStates = localStorage.getItem('workflowState') || '{}';
- const states = parseJSON(storedStates, {});
- this.states = Object.values(states).filter(
- ({ isDestroyed }) => !isDestroyed
- );
- if (isFirstTime) {
- await this.saveToStorage('workflows');
- }
- this.retrieved = true;
- },
- async insert(data = {}, options = {}) {
- const insertedWorkflows = {};
- if (Array.isArray(data)) {
- data.forEach((item) => {
- if (!options.duplicateId) {
- delete item.id;
- }
- const workflow = defaultWorkflow(item, options);
- this.workflows[workflow.id] = workflow;
- insertedWorkflows[workflow.id] = workflow;
- });
- } else {
- if (!options.duplicateId) {
- delete data.id;
- }
- const workflow = defaultWorkflow(data, options);
- this.workflows[workflow.id] = workflow;
- insertedWorkflows[workflow.id] = workflow;
- }
- await this.saveToStorage('workflows');
- return insertedWorkflows;
- },
- async update({ id, data = {}, deep = false }) {
- const isFunction = typeof id === 'function';
- if (!isFunction && !this.workflows[id]) return null;
- const updatedWorkflows = {};
- const workflowUpdater = (workflowId) => {
- if (deep) {
- this.workflows[workflowId] = deepmerge(
- this.workflows[workflowId],
- data
- );
- } else {
- Object.assign(this.workflows[workflowId], data);
- }
- this.workflows[workflowId].updatedAt = Date.now();
- updatedWorkflows[workflowId] = this.workflows[workflowId];
- };
- if (isFunction) {
- this.getWorkflows.forEach((workflow) => {
- const isMatch = id(workflow) ?? false;
- if (isMatch) workflowUpdater(workflow.id);
- });
- } else {
- workflowUpdater(id);
- }
- await this.saveToStorage('workflows');
- return updatedWorkflows;
- },
- async insertOrUpdate(data = [], { checkUpdateDate = false } = {}) {
- const insertedData = {};
- data.forEach((item) => {
- const currentWorkflow = this.workflows[item.id];
- if (currentWorkflow) {
- let insert = true;
- if (checkUpdateDate && currentWorkflow.createdAt && item.updatedAt) {
- insert = dayjs(currentWorkflow.updatedAt).isBefore(item.updatedAt);
- }
- if (insert) {
- Object.assign(this.workflows[item.id], item);
- insertedData[item.id] = this.workflows[item.id];
- }
- } else {
- const workflow = defaultWorkflow(item);
- this.workflows[workflow.id] = workflow;
- insertedData[workflow.id] = workflow;
- }
- });
- await this.saveToStorage('workflows');
- return insertedData;
- },
- async delete(id) {
- if (Array.isArray(id)) {
- id.forEach((workflowId) => {
- delete this.workflows[workflowId];
- });
- } else {
- delete this.workflows[id];
- }
- await cleanWorkflowTriggers(id);
- const userStore = useUserStore();
- const hostedWorkflow = userStore.hostedWorkflows[id];
- const backupIndex = userStore.backupIds.indexOf(id);
- if (hostedWorkflow || backupIndex !== -1) {
- const response = await fetchApi(`/me/workflows?id=${id}`, {
- method: 'DELETE',
- });
- const result = await response.json();
- if (!response.ok) {
- throw new Error(result.message);
- }
- if (backupIndex !== -1) {
- userStore.backupIds.splice(backupIndex, 1);
- await browser.storage.local.set({ backupIds: userStore.backupIds });
- }
- }
- await browser.storage.local.remove(`state:${id}`);
- await this.saveToStorage('workflows');
- return id;
- },
- },
- });
|