/* GestiFalla — Pantallas A: Login, Home, Ficha Fallero */
/* ============================================================
LOGIN
============================================================ */
function LoginScreen({ onLogin }) {
const [show, setShow] = useState(false);
const [user, setUser] = useState('04821');
const [pass, setPass] = useState('brustengos');
return (
{/* Decorative top stripe block */}
Acceso fallero
{DATA.falla.nombre}
¿Olvidaste la contraseña?
Ejercicio {DATA.falla.ejercicio} · Sección {DATA.falla.seccion}
);
}
/* ============================================================
HOME
============================================================ */
function HomeScreen({ onNav, toast }) {
const f = DATA.fallero;
const feedColor = { ok: 'var(--gf-green)', info: 'var(--gf-primary)', alert: 'var(--gf-red)' };
const quick = [
{ id: 'ficha', t: 'Mi ficha', s: 'Datos falleros', ico: I.id },
{ id: 'eventos', t: 'Eventos', s: '5 próximos', ico: I.calendar },
{ id: 'familia', t: 'Unidad familiar', s: `${f.miembros} miembros`, ico: I.users },
{ id: 'cuotas', t: 'Cuotas', s: 'Al corriente', ico: I.euro },
];
return (
toast('Sin notificaciones nuevas')} onChat={() => toast('Mensajería')} />
Bon dia,
{f.corto} 👋
{/* Monedero card */}
{/* Quick grid 2x2 */}
Accesos rápidos
{quick.map(q => (
))}
{/* Feed */}
Novedades
Ver todo
{DATA.novedades.map((n, k) => (
))}
);
}
/* ============================================================
FICHA FALLERO — acordeón 7 bloques
============================================================ */
function AccItem({ item, open, onToggle, onSave }) {
const ref = useRef(null);
const [h, setH] = useState(0);
useEffect(() => { if (ref.current) setH(open ? ref.current.scrollHeight : 0); }, [open, item]);
const Icon = item.icon;
return (
);
}
function FichaScreen({ onNav, onCarnet, toast }) {
const f = DATA.fallero;
const [open, setOpen] = useState('datos');
const [obs, setObs] = useState('Disponible para montaje del casal. Alérgico a frutos secos (cena germanor).');
const SaveBtn = () => (
);
const grid = (pairs) => {pairs.map((p, i) => | )}
;
const blocks = [
{ id: 'datos', icon: I.user, title: 'Datos personales', preview: `${f.dni} · ${f.telefono}`, render: (save) => (<>
{grid([['DNI / NIE', f.dni], ['Nacimiento', f.nacimiento], ['Teléfono', f.telefono], ['Email', f.email]])}
>) },
{ id: 'uf', icon: I.users, title: 'Unidad familiar', preview: `${f.uf} · ${f.miembros} miembros`, render: () => (<>
{grid([['Nombre UF', f.uf], ['Miembros', String(f.miembros)], ['IBAN', f.iban], ['Titular', f.corto]])}
>) },
{ id: 'dom', icon: I.home2, title: 'Domicilio', preview: `${f.direccion} · ${f.poblacion}`, render: () => (<>
{grid([['Dirección', f.direccion], ['Cód. postal', f.cp], ['Población', f.poblacion], ['Provincia', 'València']])}
>) },
{ id: 'eco', icon: I.euro, title: 'Datos económicos', ro: true, preview: `${f.formaPago} · ${f.cuotaTotal}`, render: () => (<>
{grid([['Forma de pago', f.formaPago], ['Cuota total', f.cuotaTotal], ['Estado cuota', 'Al corriente'], ['Próximo cargo', '01/06']])}
>) },
{ id: 'fall', icon: I.star, title: 'Datos falleros', ro: true, preview: `${f.cargo} · ${f.anios} años`, render: () => (<>
{grid([['Cargo', f.cargo], ['Recompensa', f.recompensa], ['Sección', f.seccion], ['Años fallero', String(f.anios)]])}
>) },
{ id: 'tienda', icon: I.cart, title: 'Tienda', ro: true, preview: `Cuenta: ${f.cuentaTienda}`, render: () => (<>
{grid([['Estado cuenta', f.cuentaTienda], ['Pedidos activos', '0'], ['Saldo tienda', '0,00 €'], ['Última compra', '14/05']])}
>) },
{ id: 'obs', icon: I.note, title: 'Observaciones', preview: obs.slice(0, 38) + '…', render: () => (<>