Files
parcer/src/components/recorder/AddWhereCondModal.tsx

153 lines
4.8 KiB
TypeScript
Raw Normal View History

import { Dropdown as MuiDropdown } from "../ui/DropdownMui";
2024-06-24 22:32:11 +05:30
import {
Button,
MenuItem,
Typography
} from "@mui/material";
import React, { useRef } from "react";
2025-01-09 19:49:20 +05:30
import { GenericModal } from "../ui/GenericModal";
2024-07-31 22:46:38 +05:30
import { WhereWhatPair } from "maxun-core";
2024-06-24 22:32:11 +05:30
import { SelectChangeEvent } from "@mui/material/Select/Select";
import { DisplayConditionSettings } from "./DisplayWhereConditionSettings";
import { useSocketStore } from "../../context/socket";
interface AddWhereCondModalProps {
isOpen: boolean;
onClose: () => void;
pair: WhereWhatPair;
index: number;
}
2025-01-09 17:17:05 +05:30
export const AddWhereCondModal = ({ isOpen, onClose, pair, index }: AddWhereCondModalProps) => {
2024-06-24 22:32:11 +05:30
const [whereProp, setWhereProp] = React.useState<string>('');
const [additionalSettings, setAdditionalSettings] = React.useState<string>('');
const [newValue, setNewValue] = React.useState<any>('');
const [checked, setChecked] = React.useState<boolean[]>(new Array(Object.keys(pair.where).length).fill(false));
2025-01-09 17:17:05 +05:30
const keyValueFormRef = useRef<{ getObject: () => object }>(null);
2024-06-24 22:32:11 +05:30
2025-01-09 17:17:05 +05:30
const { socket } = useSocketStore();
2024-06-24 22:32:11 +05:30
const handlePropSelect = (event: SelectChangeEvent<string>) => {
setWhereProp(event.target.value);
switch (event.target.value) {
case 'url': setNewValue(''); break;
case 'selectors': setNewValue(['']); break;
case 'default': return;
}
}
const handleSubmit = () => {
2025-01-09 17:17:05 +05:30
switch (whereProp) {
case 'url':
if (additionalSettings === 'string') {
pair.where.url = newValue;
} else {
pair.where.url = { $regex: newValue };
}
break;
case 'selectors':
pair.where.selectors = newValue;
break;
case 'cookies':
pair.where.cookies = keyValueFormRef.current?.getObject() as Record<string, string>
break;
case 'before':
pair.where.$before = newValue;
break;
case 'after':
pair.where.$after = newValue;
break;
case 'boolean':
const booleanArr = [];
const deleteKeys: string[] = [];
for (let i = 0; i < checked.length; i++) {
if (checked[i]) {
if (Object.keys(pair.where)[i]) {
//@ts-ignore
if (pair.where[Object.keys(pair.where)[i]]) {
booleanArr.push({
//@ts-ignore
[Object.keys(pair.where)[i]]: pair.where[Object.keys(pair.where)[i]]
});
2024-06-24 22:32:11 +05:30
}
2025-01-09 17:17:05 +05:30
deleteKeys.push(Object.keys(pair.where)[i]);
2024-06-24 22:32:11 +05:30
}
}
2025-01-09 17:17:05 +05:30
}
// @ts-ignore
deleteKeys.forEach((key: string) => delete pair.where[key]);
//@ts-ignore
pair.where[`$${additionalSettings}`] = booleanArr;
break;
default:
return;
}
2024-06-24 22:32:11 +05:30
onClose();
setWhereProp('');
setAdditionalSettings('');
setNewValue('');
2025-01-09 17:17:05 +05:30
socket?.emit('updatePair', { index: index - 1, pair: pair });
2024-06-24 22:32:11 +05:30
}
return (
<GenericModal isOpen={isOpen} onClose={() => {
setWhereProp('');
setAdditionalSettings('');
setNewValue('');
onClose();
}} modalStyle={modalStyle}>
<div>
2025-01-09 17:17:05 +05:30
<Typography sx={{ margin: '20px 0px' }}>Add where condition:</Typography>
<div style={{ margin: '8px' }}>
<MuiDropdown
id="whereProp"
label="Condition"
value={whereProp}
handleSelect={handlePropSelect}>
<MenuItem value="url">url</MenuItem>
<MenuItem value="selectors">selectors</MenuItem>
<MenuItem value="cookies">cookies</MenuItem>
<MenuItem value="before">before</MenuItem>
<MenuItem value="after">after</MenuItem>
<MenuItem value="boolean">boolean logic</MenuItem>
</MuiDropdown>
</div>
2024-06-24 22:32:11 +05:30
{whereProp ?
2025-01-09 17:17:05 +05:30
<div style={{ margin: '8px' }}>
2024-06-24 22:32:11 +05:30
<DisplayConditionSettings
whereProp={whereProp} additionalSettings={additionalSettings} setAdditionalSettings={setAdditionalSettings}
newValue={newValue} setNewValue={setNewValue} checked={checked} setChecked={setChecked}
keyValueFormRef={keyValueFormRef} whereKeys={Object.keys(pair.where)}
/>
<Button
onClick={handleSubmit}
variant="outlined"
sx={{
display: "table-cell",
float: "right",
marginRight: "15px",
marginTop: "20px",
}}
>
{"Add Condition"}
</Button>
</div>
: null}
</div>
</GenericModal>
)
}
export const modalStyle = {
top: '40%',
left: '50%',
transform: 'translate(-50%, -50%)',
width: '30%',
backgroundColor: 'background.paper',
p: 4,
2025-01-09 17:17:05 +05:30
height: 'fit-content',
display: 'block',
2024-06-24 22:32:11 +05:30
padding: '20px',
};