/* * 회원가입 — 04_backend_public_auth.md §1. 공개 경로. * 비밀번호 8~100자. companyName·inviteCode 선택. 성공 시 로그인 안내. */ import { router } from 'expo-router'; import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { KeyboardAvoidingView, Platform, ScrollView, StyleSheet, Text } from 'react-native'; import { Banner } from '../components/Banner'; import { Button } from '../components/Button'; import { Field } from '../components/Field'; import { ApiRequestError } from '../lib/api'; import { register } from '../lib/auth'; import { colors, spacing, type } from '../theme'; export default function RegisterScreen() { const { t } = useTranslation(); const [email, setEmail] = useState(''); const [displayName, setDisplayName] = useState(''); const [password, setPassword] = useState(''); const [companyName, setCompanyName] = useState(''); const [inviteCode, setInviteCode] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [done, setDone] = useState(null); async function onSubmit() { setError(null); if (!email.trim() || !displayName.trim() || password.length < 8) { setError(t('register.errInvalid')); return; } setLoading(true); try { const res = await register({ email, displayName: displayName.trim(), password, companyName: companyName.trim() || undefined, inviteCode: inviteCode.trim() || undefined, }); setDone(res.joinedEvent ? t('register.doneJoined') : t('register.done')); } catch (e) { if (e instanceof ApiRequestError && e.code === 'EMAIL_TAKEN') { setError(t('register.errEmailTaken')); } else if (e instanceof ApiRequestError) { setError(e.message); } else { setError(t('register.errGeneric')); } } finally { setLoading(false); } } return ( {t('register.title')} {error ? {error} : null} {done ? {done} : null} {done ? (