// ============================================================ // JuFlow — Dashboard // ============================================================ const { useState: useStD, useMemo: useMemoD } = React; const UD = window.JFUtils; // ─── Native SVG Line Chart with area gradient ───────────── const LineAreaChart = ({ data, color = '#FF6B35', height = 200 }) => { const [hover, setHover] = useStD(null); const W = 760, H = height; const padL = 40, padR = 16, padT = 16, padB = 28; const innerW = W - padL - padR; const innerH = H - padT - padB; const values = data.map(d => d.count); const maxV = Math.max(1, ...values); const niceMax = Math.max(5, Math.ceil(maxV / 5) * 5); const stepX = innerW / Math.max(1, data.length - 1); const yScale = v => padT + innerH - (v / niceMax) * innerH; const points = data.map((d, i) => ({ x: padL + i * stepX, y: yScale(d.count), v: d.count, label: d.day })); const pathD = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' '); const areaD = pathD + ` L${points[points.length-1].x.toFixed(1)},${(padT + innerH).toFixed(1)} L${points[0].x.toFixed(1)},${(padT + innerH).toFixed(1)} Z`; const yTicks = [0, 0.25, 0.5, 0.75, 1].map(t => Math.round(niceMax * t)); const xLabels = data.length > 8 ? data.map((d, i) => i % Math.ceil(data.length / 6) === 0 || i === data.length - 1 ? d.day : null) : data.map(d => d.day); return (
{todayAppts.length === 0 ? 'Nenhum atendimento agendado para hoje. Aproveite para revisar a agenda da semana.' : <>Você tem {todayAppts.length} atendimento{todayAppts.length === 1 ? '' : 's'} hoje.{nextAppt && (() => { const c = UD.getClient(nextAppt.clientId); const p = UD.getProfessional(nextAppt.professionalId); const dStr = UD.isSameDay(nextAppt.datetime, window.JF.TODAY) ? 'hoje' : UD.formatDate(nextAppt.datetime, 'dd/MM'); return <> Próximo: {c?.name} {dStr} às {UD.formatTime(nextAppt.datetime)} com {p?.name}.>; })()} >}
Sessões realizadas por dia
Top 5 mais realizados
{pieData.length > 0 ? (Este mês · {birthdays.length} {birthdays.length === 1 ? 'cliente' : 'clientes'}
Nenhum aniversariante este mês
) : (