Files
parcer/src/context/browserSteps.tsx

176 lines
5.9 KiB
TypeScript
Raw Normal View History

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 {
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-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
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[]>([]);
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) {
// 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;
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,
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
const addScreenshotStep = (fullPage: boolean) => {
2024-08-06 03:10:54 +05:30
setBrowserSteps(prevSteps => [
...prevSteps,
{ 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) => {
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-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
};
}
return step;
})
);
};
2024-09-21 15:41:47 +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
);
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-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
};