import { useState } from "react"; import { useSortable } from "@dnd-kit/sortable"; import ReactMarkdown from 'react-markdown'; import { CSS } from "@dnd-kit/utilities"; import { Card, CardActions, CardHeader, Button, Dialog, DialogTitle, DialogContent, Box, IconButton, Checkbox, Select, MenuItem, FormControl, FormControlLabel, FormHelperText, TextField, Stack, Typography, InputAdornment, } from '@mui/material'; import Grid from '@mui/material/Grid2'; import DragIndicatorIcon from '@mui/icons-material/DragIndicator'; import Visibility from '@mui/icons-material/Visibility'; import VisibilityOff from '@mui/icons-material/VisibilityOff'; import HelpIconOutlined from '@mui/icons-material/HelpOutline'; import { Module, Config } from "./types"; // adds 'capitalize' method to String prototype declare global { interface String { capitalize(): string; } } String.prototype.capitalize = function (this: string) { return this.charAt(0).toUpperCase() + this.slice(1); }; const StepCard = ({ type, module, toggleModule, enabledModules, configValues }: { type: string, module: Module, toggleModule: any, enabledModules: any, configValues: any }) => { const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: module.name }); const style = { ...Card.style, transform: CSS.Transform.toString(transform), transition, zIndex: isDragging ? "100" : "auto", opacity: isDragging ? 0.3 : 1 }; let name = module.name; const [helpOpen, setHelpOpen] = useState(false); const [configOpen, setConfigOpen] = useState(false); const enabled = enabledModules[type].find((m: any) => m[0] === name)[1]; return ( } label={module.display_name} /> } /> setHelpOpen(true)}> {enabled && module.configs && name != 'cli_feeder' ? ( ) : null} setHelpOpen(false)} maxWidth="lg" > {module.display_name} {module.manifest.description.split("\n").map((line: string) => line.trim()).join("\n")} {module.configs && name != 'cli_feeder' && } ) } function ConfigField({ config_value, module, configValues }: { config_value: any, module: Module, configValues: any }) { const [showPassword, setShowPassword] = useState(false); const handleClickShowPassword = () => setShowPassword((show) => !show); const handleMouseDownPassword = (event: React.MouseEvent) => { event.preventDefault(); }; const handleMouseUpPassword = (event: React.MouseEvent) => { event.preventDefault(); }; function setConfigValue(config: any, value: any) { configValues[module.name][config] = value; } const config_args: Config = module.configs[config_value]; const config_name: string = config_value.replace(/_/g, " "); const config_display_name = config_name.capitalize(); const value = configValues[module.name][config_value] || config_args.default; const config_value_lower = config_value.toLowerCase(); const is_password = config_value_lower.includes('password') || config_value_lower.includes('secret') || config_value_lower.includes('token') || config_value_lower.includes('key') || config_value_lower.includes('api_hash') || config_args.type === 'password'; const text_input_type = is_password ? 'password' : (config_args.type === 'int' ? 'number' : 'text'); return ( {config_display_name} {config_args.required && (`(required)`)} {config_args.type === 'bool' ? { setConfigValue(config_value, e.target.checked); }} />} label={config_args.help.capitalize()} /> : ( config_args.choices !== undefined ? : (config_args.type === 'json_loader' ? { try { let val = JSON.parse(e.target.value); setConfigValue(config_value, val); } catch (e) { console.log(e); } } } /> : { setConfigValue(config_value, e.target.value); }} required={config_args.required} slotProps={ is_password ? { input: { endAdornment: ( {showPassword ? : } )} } : {}} /> ) ) } {config_args.type !== 'bool' && ( {config_args.help.capitalize()} )} ) } function ConfigPanel({ module, open, setOpen, configValues }: { module: Module, open: boolean, setOpen: any, configValues: any }) { return ( <> setOpen(false)} maxWidth="lg" > {module.display_name} {Object.keys(module.configs).map((config_value: any) => { return ( ); })} ); } export default StepCard;