'use client'; import { useRouter } from 'src/routes/hooks'; import { useState, useEffect, useCallback } from 'react'; import Box from '@mui/material/Box'; import Card from '@mui/material/Card'; import Grid from '@mui/material/Grid'; import Stack from '@mui/material/Stack'; import Alert from '@mui/material/Alert'; import Avatar from '@mui/material/Avatar'; import Button from '@mui/material/Button'; import Dialog from '@mui/material/Dialog'; import TextField from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; import CardContent from '@mui/material/CardContent'; import CardActions from '@mui/material/CardActions'; import DialogTitle from '@mui/material/DialogTitle'; import DialogContent from '@mui/material/DialogContent'; import DialogActions from '@mui/material/DialogActions'; import CircularProgress from '@mui/material/CircularProgress'; import InputAdornment from '@mui/material/InputAdornment'; import { paths } from 'src/routes/paths'; import axios from 'src/utils/axios'; import { DashboardContent } from 'src/layouts/dashboard'; import { Iconify } from 'src/components/iconify'; import { CustomBreadcrumbs } from 'src/components/custom-breadcrumbs'; // ---------------------------------------------------------------------- async function getChildren() { const res = await axios.get('/parent/dashboard/'); const raw = res.data?.children ?? []; return raw.map((item) => { const c = item.child ?? item; const [first_name = '', ...rest] = (c.name || '').split(' '); return { id: c.id, first_name, last_name: rest.join(' '), email: c.email }; }); } // ---------------------------------------------------------------------- function AddChildDialog({ open, onClose, onSuccess }) { const [code, setCode] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const handleClose = () => { setCode(''); setError(''); onClose(); }; const handleSubmit = async () => { const trimmed = code.trim().toUpperCase(); if (!trimmed) { setError('Введите код'); return; } if (trimmed.length !== 8) { setError('Код должен содержать ровно 8 символов'); return; } try { setLoading(true); setError(''); await axios.post('/manage/parents/add_child/', { universal_code: trimmed }); handleClose(); onSuccess(); } catch (e) { const msg = e?.response?.data?.error || e?.response?.data?.detail || e?.message || 'Ошибка при добавлении'; setError(msg); } finally { setLoading(false); } }; return ( Добавить ребёнка по коду Введите 8-значный код из профиля ребёнка. Код содержит буквы и цифры. { setCode(e.target.value.toUpperCase()); setError(''); }} onKeyDown={(e) => e.key === 'Enter' && handleSubmit()} inputProps={{ maxLength: 8, style: { letterSpacing: 4, fontWeight: 600, fontSize: 18 } }} InputProps={{ startAdornment: ( ), }} error={!!error} helperText={error || ' '} /> ); } // ---------------------------------------------------------------------- export function ChildrenView() { const router = useRouter(); const [children, setChildren] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [addOpen, setAddOpen] = useState(false); const load = useCallback(async () => { try { setLoading(true); setError(null); const list = await getChildren(); setChildren(list); } catch (e) { setError(e?.response?.data?.detail || e?.message || 'Ошибка загрузки'); } finally { setLoading(false); } }, []); useEffect(() => { load(); }, [load]); return ( } onClick={() => setAddOpen(true)} > Добавить ребёнка } sx={{ mb: 3 }} /> {error && ( {error} )} {loading ? ( ) : children.length === 0 ? ( Нет привязанных детей ) : ( {children.map((child) => { const name = `${child.first_name || ''} ${child.last_name || ''}`.trim() || child.email; return ( {name[0]?.toUpperCase()} {name} {child.email} ); })} )} setAddOpen(false)} onSuccess={() => { load(); window.dispatchEvent(new Event('child-changed')); }} /> ); }