import { Ionicons } from '@expo/vector-icons'; import { useRouter } from 'expo-router'; import { useCallback, useEffect, useState } from 'react'; import { ActivityIndicator, StyleSheet, Switch, View } from 'react-native'; import { AppHeader, AppText, Button, Card, FormField, InlineBanner, Screen, colors, radius, spacing, } from '@/components/ui'; import { collegeApi } from '@/lib/api'; export default function SettingsScreen() { const router = useRouter(); const [name, setName] = useState(''); const [college, setCollege] = useState(''); const [programme, setProgramme] = useState(''); const [semester, setSemester] = useState(''); const [minutes, setMinutes] = useState('60'); const [recessEnabled, setRecessEnabled] = useState(true); const [recessStart, setRecessStart] = useState('13:00'); const [recessEnd, setRecessEnd] = useState('14:00'); const [weekend, setWeekend] = useState(false); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [loadError, setLoadError] = useState(''); const [formError, setFormError] = useState(''); const [saved, setSaved] = useState(false); const load = useCallback(() => { setLoading(true); setLoadError(''); collegeApi.profile() .then((profile) => { setName(profile.name); setCollege(profile.college); setProgramme(profile.programme); setSemester(profile.semester); setMinutes(String(profile.lectureMinutes ?? 60)); setRecessEnabled(Boolean(profile.recessEnabled)); setRecessStart(profile.recessStart ?? '13:00'); setRecessEnd(profile.recessEnd ?? '14:00'); setWeekend(Boolean(profile.weekendSchedule)); }) .catch((error: Error) => setLoadError(error.message)) .finally(() => setLoading(false)); }, []); useEffect(() => { load(); }, [load]); const save = async () => { const duration = Number(minutes); if (!name.trim() || !college.trim() || !Number.isInteger(duration) || duration < 15 || duration > 360 || !/^\d{2}:\d{2}$/.test(recessStart) || !/^\d{2}:\d{2}$/.test(recessEnd) || (recessEnabled && recessStart >= recessEnd)) { setFormError('Add your name and college, then use a valid class length and recess time range.'); return; } setSaving(true); setFormError(''); setSaved(false); try { await Promise.all([ collegeApi.updateProfile({ name, college, programme, semester }), collegeApi.updateSettings({ lectureMinutes: duration, recessEnabled, recessStart, recessEnd, weekendSchedule: weekend }), ]); setSaved(true); } catch (error) { setFormError(error instanceof Error ? error.message : 'Please try again.'); } finally { setSaving(false); } }; return {loading ? Loading settings… : null} {loadError ? } style={styles.firstBlock} /> : null} {!loading && !loadError ? <> Shape your class day These defaults make adding classes faster. You can still adjust individual times. {saved ? : null} {formError ? : null} Profile { setName(value); setSaved(false); }} placeholder="Your name" autoCapitalize="words" /> { setCollege(value); setSaved(false); }} placeholder="College or university" autoCapitalize="words" /> { setProgramme(value); setSaved(false); }} placeholder="e.g. B.Tech Computer Science" autoCapitalize="words" /> { setSemester(value); setSaved(false); }} placeholder="e.g. Semester 3" autoCapitalize="words" /> Class timing Default class length Used to suggest an end time. { setMinutes(value); setSaved(false); }} keyboardType="number-pad" placeholder="60" hint="Between 15 and 360 minutes." containerStyle={styles.nestedField} /> Recess or lunch Show this break in your daily timeline. { setRecessEnabled(value); setSaved(false); }} trackColor={{ false: colors.neutral.border, true: colors.brand.cobaltSoft }} thumbColor={recessEnabled ? colors.brand.cobalt : colors.neutral.surface} /> { setRecessStart(value); setSaved(false); }} placeholder="13:00" hint="HH:MM" containerStyle={styles.timeField} /> { setRecessEnd(value); setSaved(false); }} placeholder="14:00" hint="HH:MM" containerStyle={styles.timeField} /> Schedule Weekend schedule Show Saturday and Sunday in week selectors. { setWeekend(value); setSaved(false); }} trackColor={{ false: colors.neutral.border, true: colors.brand.cobaltSoft }} thumbColor={weekend ? colors.brand.cobalt : colors.neutral.surface} />