index.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import { createStore } from 'vuex';
  2. import objectPath from 'object-path';
  3. import browser from 'webextension-polyfill';
  4. import vuexORM from '@/lib/vuex-orm';
  5. import * as models from '@/models';
  6. import { firstWorkflows } from '@/utils/shared';
  7. import { fetchApi } from '@/utils/api';
  8. import { findTriggerBlock } from '@/utils/helper';
  9. import { registerWorkflowTrigger } from '@/utils/workflow-trigger';
  10. const store = createStore({
  11. plugins: [vuexORM(models)],
  12. state: () => ({
  13. user: null,
  14. workflowState: [],
  15. contributors: null,
  16. hostWorkflows: {},
  17. sharedWorkflows: {},
  18. workflowHosts: {},
  19. settings: {
  20. locale: 'en',
  21. },
  22. userDataRetrieved: false,
  23. }),
  24. mutations: {
  25. updateState(state, { key, value }) {
  26. state[key] = value;
  27. },
  28. updateStateNested(state, { path, value }) {
  29. objectPath.set(state, path, value);
  30. },
  31. deleteStateNested(state, path) {
  32. objectPath.del(state, path);
  33. },
  34. },
  35. getters: {
  36. getWorkflowState: (state) => (id) =>
  37. (state.workflowState || []).filter(
  38. ({ workflowId, isInCollection }) => workflowId === id && !isInCollection
  39. ),
  40. },
  41. actions: {
  42. updateSettings({ state, commit }, data) {
  43. commit('updateState', {
  44. key: 'settings',
  45. value: {
  46. ...state.settings,
  47. ...data,
  48. },
  49. });
  50. browser.storage.local.set({ settings: state.settings });
  51. },
  52. async retrieve({ dispatch, getters, commit, state }, keys = 'workflows') {
  53. try {
  54. const data = await browser.storage.local.get(keys);
  55. const promises = Object.keys(data).map((entity) => {
  56. const entityData = getters[`entities/${entity}/all`]();
  57. if (entityData.length > 0) return entityData;
  58. return dispatch('entities/create', {
  59. entity,
  60. data: data[entity],
  61. });
  62. });
  63. const { isFirstTime, settings, workflowHosts } =
  64. await browser.storage.local.get([
  65. 'isFirstTime',
  66. 'settings',
  67. 'workflowHosts',
  68. ]);
  69. commit('updateState', {
  70. key: 'settings',
  71. value: { ...state.settings, ...(settings || {}) },
  72. });
  73. commit('updateState', {
  74. key: 'workflowHosts',
  75. value: workflowHosts || {},
  76. });
  77. if (isFirstTime) {
  78. await dispatch('entities/insert', {
  79. entity: 'workflows',
  80. data: firstWorkflows,
  81. });
  82. await browser.storage.local.set({
  83. isFirstTime: false,
  84. });
  85. await dispatch('saveToStorage', 'workflows');
  86. }
  87. return await Promise.allSettled(promises);
  88. } catch (error) {
  89. console.error(error);
  90. throw error;
  91. }
  92. },
  93. async retrieveWorkflowState({ commit }) {
  94. try {
  95. const { workflowState } = await browser.storage.local.get(
  96. 'workflowState'
  97. );
  98. commit('updateState', {
  99. key: 'workflowState',
  100. value: Object.values(workflowState || {}).filter(
  101. ({ isDestroyed, parentState }) =>
  102. !isDestroyed && !parentState?.isCollection
  103. ),
  104. });
  105. } catch (error) {
  106. console.error(error);
  107. }
  108. },
  109. saveToStorage({ getters }, key) {
  110. return new Promise((resolve, reject) => {
  111. if (!key) {
  112. reject(new Error('You need to pass the entity name'));
  113. return;
  114. }
  115. const data = getters[`entities/${key}/all`]();
  116. browser.storage.local
  117. .set({ [key]: JSON.parse(JSON.stringify(data)) })
  118. .then(() => {
  119. resolve();
  120. });
  121. });
  122. },
  123. async fetchWorkflowHosts({ commit, state }, hosts) {
  124. if (!hosts || hosts.length === 0) return null;
  125. const response = await fetchApi('/host', {
  126. method: 'POST',
  127. body: JSON.stringify({ hosts }),
  128. });
  129. if (response.status !== 200) throw new Error(response.statusText);
  130. const result = await response.json();
  131. const newValue = JSON.parse(JSON.stringify(state.workflowHosts));
  132. result.forEach(({ hostId, status, data }) => {
  133. if (status === 'deleted') {
  134. delete newValue[hostId];
  135. return;
  136. }
  137. if (status === 'updated') {
  138. const triggerBlock = findTriggerBlock(data.drawflow);
  139. registerWorkflowTrigger(hostId, triggerBlock);
  140. data.drawflow = JSON.stringify(data.drawflow);
  141. }
  142. data.hostId = hostId;
  143. newValue[hostId] = data;
  144. });
  145. commit('updateState', {
  146. key: 'workflowHosts',
  147. value: newValue,
  148. });
  149. await browser.storage.local.set({
  150. workflowHosts: newValue,
  151. });
  152. return newValue;
  153. },
  154. },
  155. });
  156. export default store;