import { useCallback, useEffect, useMemo, useState } from 'react';
import { Link, useParams } from 'react-router-dom';
import { ArrowRight, Ban, CheckCircle2, ClipboardList, FileText, Play, Plus, Save, ShieldAlert, Users } from 'lucide-react';
import toast from 'react-hot-toast';
import api from '../services/api';
import Modal from '../components/Modal';
import { formatJalaliDate } from '../utils/date';
const stages = [['before', 'قبل از جلسه'], ['during', 'حین جلسه'], ['after', 'بعد از جلسه']];
export default function MeetingWorkspace() {
const { id } = useParams();
const [meeting, setMeeting] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState('');
const [stage, setStage] = useState('before');
const [saving, setSaving] = useState(false);
const [form, setForm] = useState({ objective: '', agenda: '', notes: '', summary: '' });
const [quickForm, setQuickForm] = useState(null);
const load = useCallback(async () => {
setLoading(true);
try {
const { data } = await api.get(`/meetings/${id}/workspace`);
setMeeting(data.data);
setForm({ objective: data.data.objective || '', agenda: data.data.agenda || '', notes: data.data.notes || '', summary: data.data.summary || '' });
setStage(data.data.status === 'completed' ? 'after' : data.data.status === 'in_progress' ? 'during' : 'before');
setError('');
} catch {
setError('دریافت فضای کاری جلسه ناموفق بود.');
} finally {
setLoading(false);
}
}, [id]);
useEffect(() => { load(); }, [load]);
const saveNotes = async () => {
setSaving(true);
try {
await api.patch(`/meetings/${id}`, form);
toast.success('اطلاعات جلسه ذخیره شد');
await load();
} catch {
toast.error('ذخیره جلسه ناموفق بود');
} finally {
setSaving(false);
}
};
const startMeeting = async () => {
try {
await api.post(`/meetings/${id}/start`);
toast.success('جلسه شروع شد');
await load();
} catch (err) {
toast.error(err.response?.data?.message || 'شروع جلسه ناموفق بود');
}
};
const completeMeeting = async () => {
try {
await api.post(`/meetings/${id}/complete`, { summary: form.summary });
toast.success('جلسه تکمیل شد');
await load();
} catch (err) {
toast.error(err.response?.data?.message || 'تکمیل جلسه ناموفق بود');
}
};
if (loading) return
{Array.from({ length: 7 }).map((_, index) =>
)}
;
if (error || !meeting) return ;
return (
{meeting.title}
{meeting.status}
{meeting.objective || 'هدف جلسه هنوز ثبت نشده است.'}
{formatJalaliDate(meeting.date)}{meeting.start_time?.slice(0, 5) || 'بدون ساعت'} تا {meeting.end_time?.slice(0, 5) || 'نامشخص'}{meeting.project?.title || 'جلسه عمومی'}{meeting.sprint?.title && {meeting.sprint.title}}
{stage === 'before' && (
شرکتکنندگان
{meeting.participants?.length || 0} نفر
{(meeting.participants || []).map((person) =>
{person.name?.[0]}{person.name}
)}
{(meeting.participants || []).length === 0 && شرکتکنندهای اضافه نشده است.
}
)}
{stage === 'during' && (
یادداشت زنده
جلسه در جریان
)}
{stage === 'after' && (
)}
{meeting.status !== 'in_progress' && meeting.status !== 'completed' &&
}
{meeting.status === 'in_progress' &&
}
{quickForm &&
setQuickForm(null)} onSaved={load} />}
);
}
function ResultSection({ title, items = [] }) {
return
{title}
{items?.length || 0}{!items?.length ? موردی ثبت نشده است.
: items.map((item) => {item.title}{item.description || item.status}
{item.status || item.severity} )};
}
function QuickCapture({ meetingId, form, setForm, onClose, onSaved }) {
const [users, setUsers] = useState([]);
const [saving, setSaving] = useState(false);
useEffect(() => {
if (form.type === 'action') api.get('/users', { params: { per_page: 100 } }).then(({ data }) => setUsers(data.data || [])).catch(() => {});
}, [form.type]);
const config = useMemo(() => ({
decision: { title: 'ثبت تصمیم', endpoint: 'decisions' },
action: { title: 'ثبت اقدام', endpoint: 'structured-action-items' },
blocker: { title: 'ثبت مانع', endpoint: 'blockers' },
})[form.type], [form.type]);
const save = async () => {
if (!form.title?.trim()) { toast.error('عنوان الزامی است'); return; }
if (form.type === 'action' && (!form.owner_id || !form.due_date)) { toast.error('Owner و سررسید الزامی است'); return; }
setSaving(true);
try {
const payload = { ...form }; delete payload.type;
await api.post(`/meetings/${meetingId}/${config.endpoint}`, payload);
toast.success('ثبت شد');
onClose();
await onSaved();
} catch (err) {
toast.error(err.response?.data?.message || 'ثبت مورد ناموفق بود');
} finally {
setSaving(false);
}
};
return (
>}>
{form.type !== 'action' && }
{form.type === 'action' && <>>}
{form.type === 'blocker' && }
);
}