Skip to content

Commit 5fa2557

Browse files
feat: Added extra variable support in chunkVariable for bubbleio import (#1027)
2 parents fb143da + fe64939 commit 5fa2557

File tree

6 files changed

+96
-19
lines changed

6 files changed

+96
-19
lines changed

apps/web/components/imports/editor/Editor.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ export function OutputEditor({ templateId, switchToDestination }: OutputEditorPr
4949
isSyncCustomizationLoading,
5050
isCustomizationLoading,
5151
isDestinationLoading,
52+
allVariables,
53+
formatVariableDisplay,
54+
isSystemVariable,
5255
} = useEditor({
5356
templateId,
5457
});
@@ -98,7 +101,7 @@ export function OutputEditor({ templateId, switchToDestination }: OutputEditorPr
98101
id="format"
99102
value={field.value}
100103
onChange={field.onChange}
101-
variables={[...(customization?.recordVariables || []), ...(customization?.chunkVariables || [])]}
104+
variables={allVariables}
102105
/>
103106
)}
104107
/>
@@ -107,14 +110,16 @@ export function OutputEditor({ templateId, switchToDestination }: OutputEditorPr
107110
</div>
108111
<div style={{ width: '20%', display: 'flex', flexDirection: 'column', gap: '5' }}>
109112
<VarLabel label="System Variables">
110-
{customization?.chunkVariables.map((variable) => (
111-
<VarItemWrapper key={variable} name={variable} copyText={'"' + variable + '"'} />
113+
{allVariables.filter(isSystemVariable).map((variable) => (
114+
<VarItemWrapper key={variable} name={variable} copyText={formatVariableDisplay(variable)} />
112115
))}
113116
</VarLabel>
114117
<VarLabel label="Schema Variables">
115-
{customization?.recordVariables.map((variable) => (
116-
<VarItemWrapper key={variable} name={variable} copyText={'"' + variable + '"'} />
117-
))}
118+
{allVariables
119+
.filter((variable) => !isSystemVariable(variable))
120+
.map((variable) => (
121+
<VarItemWrapper key={variable} name={variable} copyText={formatVariableDisplay(variable)} />
122+
))}
118123
</VarLabel>
119124
</div>
120125
</Flex>

apps/web/components/imports/validator/Validator.tsx

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,46 @@ import { useValidator } from '@hooks/useValidator';
2020
import { VarItemWrapper } from '../editor/VarItemWrapper';
2121
import { InformationIcon } from '@assets/icons/Information.icon';
2222
import { TooltipLink } from '@components/guide-point';
23+
import { useMemo } from 'react';
24+
import { useEditor } from '@hooks/useEditor';
25+
import { DestinationsEnum } from '@impler/shared';
2326

2427
interface ValidatorProps {
2528
templateId: string;
2629
}
2730

2831
export function Validator({ templateId }: ValidatorProps) {
29-
const systemVariables = [
32+
const { destination } = useEditor({ templateId });
33+
34+
// Existing system variables
35+
const baseSystemVariables = [
3036
'params.uploadId',
3137
'params.fileName',
3238
'params.data',
3339
'params.extra',
3440
'params.totalRecords',
3541
'params.chunkSize',
3642
];
43+
44+
// Bubble.io specific system variables
45+
const bubbleIoSystemVariables = ['extra.uploadId', 'extra.userId'];
46+
3747
const { colorScheme } = useMantineColorScheme();
3848
const { control, editorVariables, onSave, isUpdateValidationsLoading, isValidationsLoading, testCodeResult } =
3949
useValidator({
4050
templateId,
4151
});
4252

53+
// Combine all variables: base system variables + editor variables + Bubble.io variables (if applicable)
54+
const allVariables = useMemo(() => {
55+
const variables = [...baseSystemVariables, ...editorVariables];
56+
if (destination?.destination === DestinationsEnum.BUBBLEIO) {
57+
variables.push(...bubbleIoSystemVariables);
58+
}
59+
60+
return variables;
61+
}, [destination?.destination, editorVariables]);
62+
4363
return (
4464
<div style={{ position: 'relative' }}>
4565
<LoadingOverlay visible={isValidationsLoading} />
@@ -124,7 +144,7 @@ export function Validator({ templateId }: ValidatorProps) {
124144
mode="javascript"
125145
value={field.value}
126146
onChange={field.onChange}
127-
variables={[...systemVariables]}
147+
variables={allVariables}
128148
/>
129149
)}
130150
/>
@@ -134,15 +154,10 @@ export function Validator({ templateId }: ValidatorProps) {
134154
</div>
135155
<div style={{ width: '20%', display: 'flex', flexDirection: 'column', gap: '5' }}>
136156
<VarLabel label="System Variables">
137-
{systemVariables.map((variable) => (
157+
{allVariables.map((variable) => (
138158
<VarItemWrapper key={variable} name={variable} copyText={variable} />
139159
))}
140160
</VarLabel>
141-
<VarLabel label="Schema Variables">
142-
{editorVariables.map((variable) => (
143-
<VarItemWrapper key={variable} name={variable} copyText={'"' + variable + '"'} />
144-
))}
145-
</VarLabel>
146161
</div>
147162
</Flex>
148163
</Stack>

apps/web/hooks/useEditor.tsx

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect } from 'react';
1+
import { useEffect, useMemo } from 'react';
22
import { useForm } from 'react-hook-form';
33
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
44

@@ -83,6 +83,38 @@ export function useEditor({ templateId }: UseEditorProps) {
8383
}
8484
);
8585

86+
// Combine all variables: record variables + chunk variables + system variables
87+
const allVariables = useMemo(() => {
88+
const variables = [];
89+
90+
// Add schema variables (from record format)
91+
if (customization?.recordVariables) {
92+
variables.push(...customization.recordVariables.map((variable) => variable.substring(2, variable.length - 2)));
93+
}
94+
95+
// Add system variables (from chunk format)
96+
if (customization?.chunkVariables) {
97+
variables.push(...customization.chunkVariables);
98+
}
99+
100+
// Add Bubble.io specific system variables
101+
if (destination?.destination === DestinationsEnum.BUBBLEIO) {
102+
variables.push('extra.uploadId', 'extra.userId');
103+
}
104+
105+
return variables;
106+
}, [customization?.recordVariables, customization?.chunkVariables, destination?.destination]);
107+
108+
// Helper function to format variable display
109+
const formatVariableDisplay = (variable: string) => {
110+
return `"${variable}"`;
111+
};
112+
113+
// Helper function to categorize variables
114+
const isSystemVariable = (variable: string) => {
115+
return variable.startsWith('extra.') || variable.startsWith('params.');
116+
};
117+
86118
const validateFormat = (data: string): boolean => {
87119
try {
88120
JSON.parse(data);
@@ -137,10 +169,13 @@ export function useEditor({ templateId }: UseEditorProps) {
137169
onSaveClick,
138170
destination,
139171
handleSubmit,
172+
allVariables,
140173
customization,
174+
isSystemVariable,
141175
syncCustomization,
142176
updateCustomization,
143177
isDestinationLoading,
178+
formatVariableDisplay,
144179
isCustomizationLoading,
145180
isSyncCustomizationLoading,
146181
isUpdateCustomizationLoading,

apps/web/hooks/useValidator.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { notify } from '@libs/notify';
77
import { commonApi } from '@libs/api';
88
import { track } from '@libs/amplitude';
99
import { API_KEYS, MODAL_KEYS, MODAL_TITLES } from '@config';
10-
import { ICustomization, IErrorObject, IValidator } from '@impler/shared';
10+
import { ICustomization, IErrorObject, IValidator, DestinationsEnum } from '@impler/shared';
1111
import { CodeOutput } from '@components/imports/validator/CodeOutput';
1212

1313
interface UseSchemaProps {
@@ -43,9 +43,14 @@ export function useValidator({ templateId }: UseSchemaProps) {
4343
() => commonApi<ICustomization>(API_KEYS.TEMPLATE_CUSTOMIZATION_GET as any, { parameters: [templateId] }),
4444
{
4545
onSuccess(data) {
46-
setEditorVariables([
47-
...(data.recordVariables.map((variable) => variable.substring(2, variable.length - 2)) || []),
48-
]);
46+
// Get base variables from customization
47+
const baseVariables = data.recordVariables?.map((variable) => variable.substring(2, variable.length - 2)) || [];
48+
49+
// Add static Bubble.io variables if destination is Bubble.io
50+
const bubbleIoVariables =
51+
data.destination === DestinationsEnum.BUBBLEIO ? ['extra.uploadId', 'extra.userId'] : [];
52+
53+
setEditorVariables([...baseVariables, ...bubbleIoVariables]);
4954
},
5055
}
5156
);

libs/shared/src/entities/Customization/Customization.interface.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import { DestinationsEnum } from '../../types/destination/destination.types';
2+
13
export interface ICustomization {
24
_id: string;
35
_templateId: string;
6+
destination: DestinationsEnum;
47
recordVariables: string[];
58
chunkVariables: string[];
69
recordFormat: string;

libs/shared/src/utils/output.helpers.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,17 @@ export function getRecordFormat(chunkFormat: string) {
148148
chunkFormat: JSON.stringify(format),
149149
};
150150
}
151+
152+
export function extractExtraSystemVariables(format: string): string[] {
153+
const variablePattern = /\{\{([^}]+)\}\}/g;
154+
const variables: string[] = [];
155+
let match;
156+
157+
while ((match = variablePattern.exec(format)) !== null) {
158+
variables.push(match[1]);
159+
}
160+
161+
const systemVariables = variables.filter((variable) => variable.startsWith('extra.'));
162+
163+
return systemVariables;
164+
}

0 commit comments

Comments
 (0)