Загрузка данных
import { useEffect, useState } from 'react';
import { NumberField, SelectField } from '@src/components/FormFields';
import { IndicatorSetting, IndicatorSettings } from '@src/types';
import styles from './index.module.scss';
interface IndicatorSettingsModalProps {
fields: IndicatorSetting[];
values: IndicatorSettings;
onChange: (settings: IndicatorSettings) => void;
}
export const IndicatorSettingsModal = ({ fields, values, onChange }: IndicatorSettingsModalProps) => {
const [form, setForm] = useState<IndicatorSettings>(values);
useEffect(() => {
setForm(values);
}, [values]);
const changeValue = (key: string, value: string | number) => {
setForm((current) => {
const next = {
...current,
[key]: value,
};
onChange(next);
return next;
});
};
return (
<div className={styles.form}>
{fields.map((field) => {
const value = form[field.key] ?? field.defaultValue;
if (field.type === 'select') {
return (
<SelectField
key={field.key}
label={field.label}
value={String(value)}
options={field.options}
onValueChange={(nextValue) => {
changeValue(field.key, nextValue);
}}
/>
);
}
return (
<NumberField
key={field.key}
label={field.label}
value={typeof value === 'number' ? value : field.defaultValue}
min={field.min}
max={field.max}
onValueChange={(nextValue) => {
changeValue(field.key, nextValue);
}}
/>
);
})}
</div>
);
};
import { useEffect, useState } from 'react';
import { ColorField, NumberField, SelectField, TextAreaField, TextField } from '@src/components/FormFields';
import { DrawingStyleField, DrawingStyleSettings } from '@src/core/Drawings/types';
interface DrawingStyleSettingsModalProps {
fields: DrawingStyleField[];
values: DrawingStyleSettings;
onChange: (settings: DrawingStyleSettings) => void;
}
export const DrawingStyleSettingsModal = ({ fields, values, onChange }: DrawingStyleSettingsModalProps) => {
const [form, setForm] = useState<DrawingStyleSettings>(values);
useEffect(() => {
setForm(values);
}, [values]);
const changeValue = (key: string, value: string | number | boolean) => {
setForm((current) => {
const next = {
...current,
[key]: value,
};
onChange(next);
return next;
});
};
return (
<div className={styles.form}>
{fields.map((field) => {
const value = form[field.key] ?? field.defaultValue;
if (field.type === 'select') {
return (
<SelectField
key={field.key}
label={field.label}
value={String(value)}
options={field.options}
onValueChange={(nextValue) => {
changeValue(field.key, nextValue);
}}
/>
);
}
if (field.type === 'color') {
return (
<ColorField
key={field.key}
label={field.label}
value={String(value)}
onValueChange={(nextValue) => {
changeValue(field.key, nextValue);
}}
/>
);
}
if (field.type === 'text') {
return (
<TextField
key={field.key}
label={field.label}
value={String(value)}
placeholder={field.placeholder}
onValueChange={(nextValue) => {
changeValue(field.key, nextValue);
}}
/>
);
}
if (field.type === 'textarea') {
return (
<TextAreaField
key={field.key}
label={field.label}
value={String(value)}
placeholder={field.placeholder}
onValueChange={(nextValue) => {
changeValue(field.key, nextValue);
}}
/>
);
}
// if (field.type === 'boolean') {
// return (
// <label
// key={field.key}
// className={styles.checkboxField}
// >
// <input
// type="checkbox"
// checked={Boolean(value)}
// onChange={(event) => {
// changeValue(field.key, event.target.checked);
// }}
// />
// <span>{field.label}</span>
// </label>
// );
// }
return (
<NumberField
key={field.key}
label={field.label}
value={typeof value === 'number' ? value : field.defaultValue}
min={field.min}
max={field.max}
onValueChange={(nextValue) => {
changeValue(field.key, nextValue);
}}
/>
);
})}
</div>
);
};