handlerLoopData.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import objectPath from 'object-path';
  2. import { parseJSON, isXPath } from '@/utils/helper';
  3. async function loopData({ data, id }, { refData }) {
  4. try {
  5. if (this.loopList[data.loopId]) {
  6. const index = this.loopList[data.loopId].index + 1;
  7. this.loopList[data.loopId].index = index;
  8. let currentLoopData;
  9. if (data.loopThrough === 'numbers') {
  10. currentLoopData = refData.loopData[data.loopId].data + 1;
  11. } else {
  12. currentLoopData = this.loopList[data.loopId].data[index];
  13. }
  14. refData.loopData[data.loopId] = {
  15. data: currentLoopData,
  16. $index: index,
  17. };
  18. } else {
  19. const maxLoop = +data.maxLoop || 0;
  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 = objectPath.get(
  28. refData.variables,
  29. data.variableName
  30. );
  31. if (Array.isArray(variableVal)) return variableVal;
  32. return parseJSON(variableVal, variableVal);
  33. },
  34. elements: async () => {
  35. const findBy = isXPath(data.elementSelector)
  36. ? 'xpath'
  37. : 'cssSelector';
  38. const { elements, url, loopId } = await this._sendMessageToTab({
  39. id,
  40. label: 'loop-data',
  41. data: {
  42. findBy,
  43. max: maxLoop,
  44. multiple: true,
  45. reverseLoop: data.reverseLoop,
  46. selector: data.elementSelector,
  47. waitForSelector: data.waitForSelector ?? false,
  48. waitSelectorTimeout: data.waitSelectorTimeout ?? 5000,
  49. },
  50. });
  51. this.loopEls.push({
  52. url,
  53. loopId,
  54. findBy,
  55. max: maxLoop,
  56. blockId: id,
  57. selector: data.elementSelector,
  58. });
  59. return elements;
  60. },
  61. };
  62. const currLoopData = await getLoopData[data.loopThrough]();
  63. let index = 0;
  64. if (data.loopThrough !== 'numbers') {
  65. if (!Array.isArray(currLoopData)) {
  66. throw new Error('invalid-loop-data');
  67. }
  68. if (data.resumeLastWorkflow) {
  69. index = JSON.parse(localStorage.getItem(`index:${id}`)) || 0;
  70. } else if (data.startIndex > 0) {
  71. index = data.startIndex;
  72. }
  73. if (data.reverseLoop && data.loopThrough !== 'elements') {
  74. currLoopData.reverse();
  75. }
  76. }
  77. this.loopList[data.loopId] = {
  78. index,
  79. blockId: id,
  80. id: data.loopId,
  81. data: currLoopData,
  82. type: data.loopThrough,
  83. maxLoop:
  84. data.loopThrough === 'numbers'
  85. ? data.toNumber + 1 - data.fromNumber
  86. : maxLoop,
  87. };
  88. /* eslint-disable-next-line */
  89. refData.loopData[data.loopId] = {
  90. data:
  91. data.loopThrough === 'numbers'
  92. ? data.fromNumber
  93. : currLoopData[index],
  94. $index: index,
  95. };
  96. }
  97. localStorage.setItem(`index:${id}`, this.loopList[data.loopId].index);
  98. return {
  99. data: refData.loopData[data.loopId],
  100. nextBlockId: this.getBlockConnections(id),
  101. };
  102. } catch (error) {
  103. if (data.loopThrough === 'elements') {
  104. error.data = { selector: data.elementSelector };
  105. }
  106. throw error;
  107. }
  108. }
  109. export default loopData;