// Mieter screens
const MieterDashboard = ({onNav, ctx}) => {
const session = ctx?.session;
const firstName = session?.name?.split(' ')[0] || 'Mieter';
const [tickets, setTickets] = React.useState([]);
const now = new Date();
const dateStr = now.toLocaleDateString('de-CH', {weekday:'long', day:'numeric', month:'long', year:'numeric'});
React.useEffect(() => {
Store.getTickets().then(setTickets);
}, [ctx?.dataTick]);
const myTickets = tickets.filter(t => t.status !== 'erledigt');
return (
<>
IHRE WOHNUNG
{session?.unit || 'Ihre Wohnung'}
{session?.email}
Vertrag aktiv
onNav('meldung-neu')} leftIcon="plus">Neu}>
{myTickets.length === 0 ? (
Keine offenen Meldungen.
) : (
{myTickets.slice(0,3).map(t=>(
{t.category}
{t.created_at ? new Date(t.created_at).toLocaleDateString('de-CH') : ''}
))}
)}
{[['Name', session?.name], ['E-Mail', session?.email], ['Rolle', 'Mieter'], ['Einheit', session?.unit || '—']].map(([k,v])=>(
{k}
{v||'—'}
))}
>
);
};
const MeldungPipe = ({status}) => {
const steps = ['neu','gesichtet','auftrag','termin','erledigt'];
const cur = STATUS_LABELS[status]?.idx ?? 0;
const labels = {neu:'Gemeldet', gesichtet:'Gesichtet', auftrag:'Auftrag', termin:'Termin', erledigt:'Erledigt'};
return (
);
};
const MeldungNeu = ({onDone, ctx}) => {
const [step, setStep] = React.useState(0);
const [cat, setCat] = React.useState('Sanitär');
const [urg, setUrg] = React.useState('normal');
const [title, setTitle] = React.useState('');
const [desc, setDesc] = React.useState('');
const [ticketId, setTicketId] = React.useState('');
const [submitting, setSubmitting] = React.useState(false);
const cats = [
{k:'Sanitär',ic:'sanitar'},{k:'Elektro',ic:'electro'},{k:'Fenster/Türen',ic:'door'},
{k:'Heizung',ic:'heat'},{k:'Schimmel',ic:'mold'},{k:'Geräte',ic:'device'},
{k:'Allgemeinbereich',ic:'cube'},{k:'Sonstiges',ic:'cube'}
];
const submit = async () => {
if (!title || submitting) return;
setSubmitting(true);
try {
const t = await Store.createTicket({
title,
description: desc,
category: cat,
urgency: urg,
unit: ctx?.session?.unit || '',
propId: ctx?.session?.prop_id || null,
});
setTicketId(t.id);
setStep(2);
} catch(e) {
alert(e.message);
}
setSubmitting(false);
};
return (
<>
onDone()}>Dashboard / Neue Meldung>}
title="Schaden melden"
sub="Eingang: Verwaltung & Hauswart werden sofort benachrichtigt. Sie erhalten eine Ticket-Nummer."
/>
{step===0 && (
SCHRITT 1 VON 3
Um welche Art Schaden handelt es sich?
{cats.map(c=>(
))}
)}
{step===1 && (
SCHRITT 2 VON 3
Beschreibung
setTitle(e.target.value)} placeholder="z.B. Wasserhahn tropft, Heizung kalt…"/>
{['normal','dringend'].map(u=>(
))}
)}
{step===2 && (
MELDUNG ERHALTEN
Ticket {ticketId} erstellt
Die Verwaltung wurde benachrichtigt und meldet sich innerhalb 24 Std.
)}
>
);
};
Object.assign(window, {MieterDashboard, MeldungNeu, MeldungPipe});