2024-07-26 20:20:11 +05:30
|
|
|
import React, { createContext, useContext, useState } from 'react';
|
|
|
|
|
|
2024-08-09 09:33:05 +05:30
|
|
|
export interface TextStep {
|
2024-08-06 03:10:54 +05:30
|
|
|
id: number;
|
|
|
|
|
type: 'text';
|
|
|
|
|
label: string;
|
|
|
|
|
data: string;
|
|
|
|
|
selectorObj: SelectorObject;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface ScreenshotStep {
|
|
|
|
|
id: number;
|
|
|
|
|
type: 'screenshot';
|
2024-08-06 03:14:03 +05:30
|
|
|
fullPage: boolean;
|
2024-08-06 03:10:54 +05:30
|
|
|
}
|
|
|
|
|
|
2024-08-11 08:14:20 +05:30
|
|
|
export interface ListStep {
|
2024-08-08 21:11:02 +05:30
|
|
|
id: number;
|
|
|
|
|
type: 'list';
|
|
|
|
|
listSelector: string;
|
|
|
|
|
fields: { [key: string]: TextStep };
|
2024-09-06 09:22:15 +05:30
|
|
|
pagination?: {
|
|
|
|
|
type: string;
|
|
|
|
|
selector: string;
|
2024-09-07 06:43:43 +05:30
|
|
|
};
|
|
|
|
|
limit?: number;
|
2024-08-08 21:11:02 +05:30
|
|
|
}
|
2024-08-06 03:10:54 +05:30
|
|
|
|
2024-08-08 21:11:02 +05:30
|
|
|
type BrowserStep = TextStep | ScreenshotStep | ListStep;
|
2024-08-06 03:10:54 +05:30
|
|
|
|
2024-08-10 04:10:00 +05:30
|
|
|
export interface SelectorObject {
|
2024-08-03 21:33:33 +05:30
|
|
|
selector: string;
|
|
|
|
|
tag?: string;
|
2024-08-04 03:07:15 +05:30
|
|
|
attribute?: string;
|
2024-08-04 03:15:50 +05:30
|
|
|
[key: string]: any;
|
2024-08-03 21:33:33 +05:30
|
|
|
}
|
|
|
|
|
|
2024-07-26 20:20:11 +05:30
|
|
|
interface BrowserStepsContextType {
|
2024-07-26 20:22:20 +05:30
|
|
|
browserSteps: BrowserStep[];
|
2024-08-06 03:10:54 +05:30
|
|
|
addTextStep: (label: string, data: string, selectorObj: SelectorObject) => void;
|
2024-09-07 06:43:43 +05:30
|
|
|
addListStep: (listSelector: string, fields: { [key: string]: TextStep }, listId: number, pagination?: { type: string; selector: string }, limit?: number) => void
|
2024-08-06 03:13:37 +05:30
|
|
|
addScreenshotStep: (fullPage: boolean) => void;
|
2024-07-26 20:22:20 +05:30
|
|
|
deleteBrowserStep: (id: number) => void;
|
2024-08-06 03:10:54 +05:30
|
|
|
updateBrowserTextStepLabel: (id: number, newLabel: string) => void;
|
2024-09-13 23:25:36 +05:30
|
|
|
updateListTextFieldLabel: (listId: number, fieldKey: string, newLabel: string) => void;
|
2024-09-13 23:38:58 +05:30
|
|
|
removeListTextField: (listId: number, fieldKey: string) => void;
|
2024-07-26 20:20:11 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const BrowserStepsContext = createContext<BrowserStepsContextType | undefined>(undefined);
|
|
|
|
|
|
|
|
|
|
export const BrowserStepsProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
|
2024-07-26 20:22:20 +05:30
|
|
|
const [browserSteps, setBrowserSteps] = useState<BrowserStep[]>([]);
|
2024-09-14 02:14:43 +05:30
|
|
|
const [discardedFields, setDiscardedFields] = useState<Set<string>>(new Set());
|
2024-07-26 20:22:20 +05:30
|
|
|
|
2024-08-06 03:10:54 +05:30
|
|
|
const addTextStep = (label: string, data: string, selectorObj: SelectorObject) => {
|
2024-07-26 20:22:20 +05:30
|
|
|
setBrowserSteps(prevSteps => [
|
|
|
|
|
...prevSteps,
|
2024-08-06 03:10:54 +05:30
|
|
|
{ id: Date.now(), type: 'text', label, data, selectorObj }
|
|
|
|
|
]);
|
|
|
|
|
};
|
|
|
|
|
|
2024-09-07 06:43:43 +05:30
|
|
|
const addListStep = (listSelector: string, newFields: { [key: string]: TextStep }, listId: number, pagination?: { type: string; selector: string }, limit?: number) => {
|
2024-08-11 08:14:20 +05:30
|
|
|
setBrowserSteps(prevSteps => {
|
|
|
|
|
const existingListStepIndex = prevSteps.findIndex(
|
2024-09-04 05:31:31 +05:30
|
|
|
step => step.type === 'list' && step.id === listId
|
2024-08-11 08:14:20 +05:30
|
|
|
);
|
|
|
|
|
if (existingListStepIndex !== -1) {
|
2024-09-14 02:22:21 +05:30
|
|
|
// Update the existing ListStep with new fields, excluding discarded ones
|
2024-08-11 08:14:20 +05:30
|
|
|
const updatedSteps = [...prevSteps];
|
|
|
|
|
const existingListStep = updatedSteps[existingListStepIndex] as ListStep;
|
2024-09-14 02:22:21 +05:30
|
|
|
const filteredNewFields = Object.entries(newFields).reduce((acc, [key, value]) => {
|
|
|
|
|
if (!discardedFields.has(`${listId}-${key}`)) {
|
|
|
|
|
acc[key] = value;
|
|
|
|
|
}
|
|
|
|
|
return acc;
|
|
|
|
|
}, {} as { [key: string]: TextStep });
|
|
|
|
|
|
2024-08-11 08:14:20 +05:30
|
|
|
updatedSteps[existingListStepIndex] = {
|
|
|
|
|
...existingListStep,
|
2024-09-14 02:22:21 +05:30
|
|
|
fields: { ...existingListStep.fields, ...filteredNewFields },
|
2024-09-07 06:44:39 +05:30
|
|
|
pagination: pagination,
|
|
|
|
|
limit: limit,
|
2024-08-11 08:14:20 +05:30
|
|
|
};
|
|
|
|
|
return updatedSteps;
|
|
|
|
|
} else {
|
|
|
|
|
// Create a new ListStep
|
|
|
|
|
return [
|
|
|
|
|
...prevSteps,
|
2024-09-07 06:44:39 +05:30
|
|
|
{ id: listId, type: 'list', listSelector, fields: newFields, pagination, limit }
|
2024-08-11 08:14:20 +05:30
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
});
|
2024-08-08 23:56:00 +05:30
|
|
|
};
|
2024-09-21 15:41:47 +05:30
|
|
|
|
2024-08-06 03:13:37 +05:30
|
|
|
const addScreenshotStep = (fullPage: boolean) => {
|
2024-08-06 03:10:54 +05:30
|
|
|
setBrowserSteps(prevSteps => [
|
|
|
|
|
...prevSteps,
|
2024-08-06 03:12:58 +05:30
|
|
|
{ id: Date.now(), type: 'screenshot', fullPage }
|
2024-07-26 20:22:20 +05:30
|
|
|
]);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const deleteBrowserStep = (id: number) => {
|
|
|
|
|
setBrowserSteps(prevSteps => prevSteps.filter(step => step.id !== id));
|
|
|
|
|
};
|
|
|
|
|
|
2024-08-06 03:10:54 +05:30
|
|
|
const updateBrowserTextStepLabel = (id: number, newLabel: string) => {
|
2024-07-26 20:22:20 +05:30
|
|
|
setBrowserSteps(prevSteps =>
|
|
|
|
|
prevSteps.map(step =>
|
|
|
|
|
step.id === id ? { ...step, label: newLabel } : step
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
2024-09-13 23:27:03 +05:30
|
|
|
const updateListTextFieldLabel = (listId: number, fieldKey: string, newLabel: string) => {
|
2024-09-13 23:26:24 +05:30
|
|
|
setBrowserSteps(prevSteps =>
|
|
|
|
|
prevSteps.map(step => {
|
|
|
|
|
if (step.type === 'list' && step.id === listId) {
|
2024-09-21 15:41:29 +05:30
|
|
|
// Ensure deep copy of the fields object
|
|
|
|
|
const updatedFields = {
|
|
|
|
|
...step.fields,
|
|
|
|
|
[fieldKey]: {
|
|
|
|
|
...step.fields[fieldKey],
|
|
|
|
|
label: newLabel
|
2024-09-13 23:26:24 +05:30
|
|
|
}
|
|
|
|
|
};
|
2024-09-21 15:41:47 +05:30
|
|
|
|
2024-09-21 15:41:29 +05:30
|
|
|
return {
|
2024-09-21 15:41:47 +05:30
|
|
|
...step,
|
|
|
|
|
fields: updatedFields
|
2024-09-21 15:41:29 +05:30
|
|
|
};
|
2024-09-13 23:26:24 +05:30
|
|
|
}
|
|
|
|
|
return step;
|
|
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
};
|
2024-09-21 15:41:47 +05:30
|
|
|
|
2024-09-13 23:26:24 +05:30
|
|
|
|
2024-09-13 23:39:28 +05:30
|
|
|
const removeListTextField = (listId: number, fieldKey: string) => {
|
|
|
|
|
setBrowserSteps(prevSteps =>
|
|
|
|
|
prevSteps.map(step => {
|
|
|
|
|
if (step.type === 'list' && step.id === listId) {
|
|
|
|
|
const { [fieldKey]: _, ...remainingFields } = step.fields;
|
|
|
|
|
return {
|
|
|
|
|
...step,
|
|
|
|
|
fields: remainingFields
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
return step;
|
|
|
|
|
})
|
2024-09-14 02:22:36 +05:30
|
|
|
);
|
2024-09-14 02:14:43 +05:30
|
|
|
setDiscardedFields(prevDiscarded => new Set(prevDiscarded).add(`${listId}-${fieldKey}`));
|
2024-09-13 23:39:28 +05:30
|
|
|
};
|
2024-07-26 20:22:20 +05:30
|
|
|
return (
|
2024-08-04 03:15:50 +05:30
|
|
|
<BrowserStepsContext.Provider value={{
|
|
|
|
|
browserSteps,
|
2024-08-06 03:10:54 +05:30
|
|
|
addTextStep,
|
2024-08-08 23:56:57 +05:30
|
|
|
addListStep,
|
2024-08-06 03:10:54 +05:30
|
|
|
addScreenshotStep,
|
2024-08-04 03:15:50 +05:30
|
|
|
deleteBrowserStep,
|
2024-08-06 03:10:54 +05:30
|
|
|
updateBrowserTextStepLabel,
|
2024-09-13 23:25:36 +05:30
|
|
|
updateListTextFieldLabel,
|
2024-09-13 23:38:58 +05:30
|
|
|
removeListTextField,
|
2024-08-03 21:33:33 +05:30
|
|
|
}}>
|
2024-07-26 20:22:20 +05:30
|
|
|
{children}
|
|
|
|
|
</BrowserStepsContext.Provider>
|
2024-07-26 20:20:11 +05:30
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const useBrowserSteps = () => {
|
2024-07-26 20:22:20 +05:30
|
|
|
const context = useContext(BrowserStepsContext);
|
|
|
|
|
if (!context) {
|
|
|
|
|
throw new Error('useBrowserSteps must be used within a BrowserStepsProvider');
|
|
|
|
|
}
|
|
|
|
|
return context;
|
2024-08-06 03:10:54 +05:30
|
|
|
};
|