import { Ionicons } from "@expo/vector-icons"; import { useSession, authClient } from "@/src/lib/auth-client"; import { useAuthStore } from "@/src/stores/auth.store"; import { TAB_COLORS } from "@/src/constants/colors"; import { apiRequest } from "@/src/lib/api-client"; import { Redirect, Tabs, useRouter } from "expo-router"; import React, { useEffect } from "react"; import { Alert } from "react-native"; import { queryClient } from "@/src/lib/query-client"; import { useTranslation } from "react-i18next"; function PendingInvitationHandler() { const router = useRouter(); const pendingInvitationId = useAuthStore((s) => s.pendingInvitationId); useEffect(() => { if (!pendingInvitationId) return; authClient.organization.acceptInvitation({ invitationId: pendingInvitationId }) .then(async (result) => { useAuthStore.getState().setPendingInvitationId(null); if (result.error) { Alert.alert("Fehler", result.error.message ?? "Einladung konnte nicht angenommen werden."); return; } const householdsResponse = await apiRequest<{ households: { id: string; name: string; role: string }[] }>("/api/households"); const newHouseholds = householdsResponse.households; useAuthStore.getState().setHouseholds(newHouseholds); if (newHouseholds[0] && !useAuthStore.getState().activeHouseholdId) { useAuthStore.getState().setActiveHousehold(newHouseholds[0].id); } await queryClient.invalidateQueries(); Alert.alert("Einladung angenommen", "Du bist jetzt Mitglied des Haushalts."); router.replace("/(app)/haushalt"); }) .catch((err: Error) => { useAuthStore.getState().setPendingInvitationId(null); Alert.alert("Fehler", err.message ?? "Einladung konnte nicht angenommen werden."); }); // eslint-disable-next-line react-hooks/exhaustive-deps }, [pendingInvitationId]); return null; } export default function AppLayout() { const { data: session, isPending } = useSession(); const households = useAuthStore((s) => s.households); const { t } = useTranslation(); if (isPending) return null; if (!session) return ; if (households.length === 0) return ; return ( <> , }} /> , }} /> , }} /> , }} /> , }} /> {/* Hidden — not in tab bar */} ); }