handlerLoopData.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { parseJSON } from '@/utils/helper';
  2. import { getBlockConnection } from '../helper';
  3. async function loopData({ data, id, outputs }, { refData }) {
  4. const nextBlockId = getBlockConnection({ outputs });
  5. try {
  6. if (this.loopList[data.loopId]) {
  7. const index = this.loopList[data.loopId].index + 1;
  8. this.loopList[data.loopId].index = index;
  9. let currentLoopData;
  10. if (data.loopThrough === 'numbers') {
  11. currentLoopData = refData.loopData[data.loopId].data + 1;
  12. } else {
  13. currentLoopData = this.loopList[data.loopId].data[index];
  14. }
  15. refData.loopData[data.loopId] = {
  16. data: currentLoopData,
  17. $index: index,
  18. };
  19. } else {
  20. const getLoopData = {
  21. numbers: () => data.fromNumber,
  22. table: () => refData.table,
  23. 'custom-data': () => JSON.parse(data.loopData),
  24. 'data-columns': () => refData.table,
  25. 'google-sheets': () => refData.googleSheets[data.referenceKey],
  26. variable: () => {
  27. const variableVal = refData.variables[data.variableName];
  28. return parseJSON(variableVal, variableVal);
  29. },
  30. elements: async () => {
  31. const elements = await this._sendMessageToTab({
  32. blockId: id,
  33. isBlock: false,
  34. max: data.maxLoop,
  35. type: 'loop-elements',
  36. selector: data.elementSelector,
  37. frameSelector: this.frameSelector,
  38. });
  39. return elements;
  40. },
  41. };
  42. const currLoopData = await getLoopData[data.loopThrough]();
  43. let index = 0;
  44. if (data.loopThrough !== 'numbers') {
  45. if (!Array.isArray(currLoopData)) {
  46. throw new Error('invalid-loop-data');
  47. }
  48. if (data.resumeLastWorkflow) {
  49. index = JSON.parse(localStorage.getItem(`index:${id}`)) || 0;
  50. } else if (data.startIndex > 0) {
  51. index = data.startIndex;
  52. }
  53. }
  54. this.loopList[data.loopId] = {
  55. index,
  56. blockId: id,
  57. id: data.loopId,
  58. data: currLoopData,
  59. type: data.loopThrough,
  60. maxLoop:
  61. data.loopThrough === 'numbers'
  62. ? data.toNumber + 1 - data.fromNumber
  63. : data.maxLoop || currLoopData.length,
  64. };
  65. /* eslint-disable-next-line */
  66. refData.loopData[data.loopId] = {
  67. data:
  68. data.loopThrough === 'numbers'
  69. ? data.fromNumber
  70. : currLoopData[index],
  71. $index: index,
  72. };
  73. }
  74. localStorage.setItem(`index:${id}`, this.loopList[data.loopId].index);
  75. return {
  76. nextBlockId,
  77. data: refData.loopData[data.loopId],
  78. };
  79. } catch (error) {
  80. error.nextBlockId = nextBlockId;
  81. throw error;
  82. }
  83. }
  84. export default loopData;