// Auth screens — alle Store-Calls sind async const LoginScreen = ({ onSuccess, onRegister }) => { const [email, setEmail] = React.useState(''); const [pw, setPw] = React.useState(''); const [err, setErr] = React.useState(''); const [loading, setLoading] = React.useState(false); const submit = async (e) => { e.preventDefault(); setErr(''); if (!email || !pw) { setErr('Bitte alle Felder ausfüllen.'); return; } setLoading(true); const res = await Store.login(email, pw); setLoading(false); if (res.error) { setErr(res.error); return; } onSuccess(res.session); }; return (
ImmoHubSchweiz

Anmelden

Willkommen zurück. Melden Sie sich mit Ihrer E-Mail und Ihrem Passwort an.

setEmail(e.target.value)} placeholder="name@firma.ch" autoFocus/>
setPw(e.target.value)} placeholder="••••••••"/>
{err &&
{err}
}
Noch kein Konto?
); }; const RegisterScreen = ({ onSuccess, onLogin }) => { const [step, setStep] = React.useState(1); const [data, setData] = React.useState({name:'',email:'',pw:'',pw2:'',company:''}); const [addedProps, setAddedProps] = React.useState([]); const [newProp, setNewProp] = React.useState({street:'',city:'',plz:'',units:'',built:''}); const [err, setErr] = React.useState(''); const [loading, setLoading] = React.useState(false); const [session, setSession] = React.useState(null); const upd = (k,v) => setData(d=>({...d,[k]:v})); const updP = (k,v) => setNewProp(p=>({...p,[k]:v})); const step1 = async (e) => { e.preventDefault(); setErr(''); if (!data.name||!data.email||!data.pw||!data.company){setErr('Bitte alle Felder ausfüllen.');return;} if (data.pw!==data.pw2){setErr('Passwörter stimmen nicht überein.');return;} if (data.pw.length<6){setErr('Passwort muss mindestens 6 Zeichen lang sein.');return;} setLoading(true); const res = await Store.register({name:data.name,email:data.email,pw:data.pw,company:data.company}); setLoading(false); if (res.error){setErr(res.error);return;} setSession(res.session); setStep(2); }; const addProp = async () => { if (!newProp.street||!newProp.city||loading) return; setLoading(true); try { const p = await Store.addProperty(null, newProp); setAddedProps(a=>[...a,p]); } catch {} setLoading(false); setNewProp({street:'',city:'',plz:'',units:'',built:''}); }; if (step===1) return (
ImmoHubSchweiz
1 Konto2 Liegenschaften3 Fertig

Konto erstellen

Verwalten Sie Ihre Liegenschaften digital. Kostenlos starten.

upd('name',e.target.value)} placeholder="Vorname Nachname" autoFocus/>
upd('company',e.target.value)} placeholder="Müller Immobilien AG"/>
upd('email',e.target.value)} placeholder="name@firma.ch"/>
upd('pw',e.target.value)} placeholder="Mind. 6 Zeichen"/>
upd('pw2',e.target.value)} placeholder="••••••••"/>
{err &&
{err}
}
Bereits registriert?
); return (
ImmoHubSchweiz
1 Konto ✓2 Liegenschaften3 Fertig

Liegenschaften hinzufügen

Fügen Sie Ihre Liegenschaften hinzu. Sie können später weitere ergänzen.

{addedProps.length>0 &&
{addedProps.map((p,i)=>(
{p.street}
{p.plz} {p.city} · {p.units} Einheiten
Gespeichert
))}
}
updP('street',e.target.value)} placeholder="Rämistrasse 42"/>
updP('plz',e.target.value)} placeholder="8001" maxLength={4}/>
updP('city',e.target.value)} placeholder="Zürich"/>
updP('units',e.target.value)} placeholder="12" min={1}/>
updP('built',e.target.value)} placeholder="1962"/>
); }; const AcceptInviteScreen = ({ code, onSuccess }) => { const [invite, setInvite] = React.useState(null); const [notFound, setNotFound] = React.useState(false); const [name, setName] = React.useState(''); const [pw, setPw] = React.useState(''); const [pw2, setPw2] = React.useState(''); const [err, setErr] = React.useState(''); const [loading, setLoading] = React.useState(false); React.useEffect(() => { Store.getInvite(code).then(inv => { if (!inv){setNotFound(true);return;} setInvite(inv); setName(inv.name||''); }); }, [code]); const submit = async (e) => { e.preventDefault(); setErr(''); if (!name||!pw){setErr('Bitte alle Felder ausfüllen.');return;} if (pw!==pw2){setErr('Passwörter stimmen nicht überein.');return;} if (pw.length<6){setErr('Passwort muss mindestens 6 Zeichen lang sein.');return;} setLoading(true); const res = await Store.acceptInvite(code, {name, pw}); setLoading(false); if (res.error){setErr(res.error);return;} onSuccess(res.session); }; const roleLabel = {verwaltung:'Verwaltung',mieter:'Mieter',hauswart:'Hauswart'}; if (notFound) return (
ImmoHubSchweiz

Einladung nicht gefunden

Dieser Einladungslink ist ungültig oder wurde bereits verwendet.

); if (!invite) return (
Einladung wird geprüft…
); return (
ImmoHubSchweiz
Einladung als {roleLabel[invite.role]||invite.role}
{invite.org_name &&
{invite.org_name}
} {invite.unit &&
Einheit: {invite.unit}
}

Konto aktivieren

Einladung für {invite.email}. Wählen Sie Ihren Namen und ein Passwort.

setName(e.target.value)} placeholder="Vorname Nachname" autoFocus/>
setPw(e.target.value)} placeholder="Mind. 6 Zeichen"/>
setPw2(e.target.value)} placeholder="••••••••"/>
{err &&
{err}
}
); }; Object.assign(window, { LoginScreen, RegisterScreen, AcceptInviteScreen });