import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Alert } from "react-native"; import { View } from "react-native"; import { useTranslation } from "@turbostarter/i18n"; import { capitalize } from "@turbostarter/shared/utils"; import { Button } from "@turbostarter/ui-mobile/button"; import { Icons } from "@turbostarter/ui-mobile/icons"; import { Spin } from "@turbostarter/ui-mobile/spin"; import { Text } from "@turbostarter/ui-mobile/text"; import { authConfig } from "~/config/auth"; import { pathsConfig } from "~/config/paths"; import { authClient } from "~/lib/auth"; import { SocialIcons } from "~/modules/auth/form/social-providers"; import { auth } from "~/modules/auth/lib/api"; import type { SocialProvider } from "@turbostarter/auth"; export default function AccountsScreen() { const { t, i18n } = useTranslation(["auth", "common"]); const { data: session } = authClient.useSession(); const queryClient = useQueryClient(); const { data, isLoading } = useQuery({ ...auth.queries.accounts.getAll, enabled: !!session?.user.id, }); const accounts = data ?? []; const socials = accounts.filter((account) => authConfig.providers.oAuth.includes(account.providerId), ); const missing = authConfig.providers.oAuth.filter( (provider) => !socials.some((social) => social.providerId === provider), ); const connect = useMutation({ ...auth.mutations.accounts.connect, onSuccess: async () => { await queryClient.invalidateQueries(auth.queries.accounts.getAll); }, }); const disconnect = useMutation({ ...auth.mutations.accounts.disconnect, onSuccess: async () => { await queryClient.invalidateQueries(auth.queries.accounts.getAll); }, }); const handleDisconnect = (provider: SocialProvider) => { Alert.alert( t("account.accounts.disconnect.cta", { provider: capitalize(provider), }), t("account.accounts.disconnect.disclaimer", { provider: capitalize(provider), }), [ { text: t("cancel"), style: "cancel", }, { text: t("continue"), onPress: () => disconnect.mutate({ providerId: provider }), }, ], ); }; return ( {t("account.accounts.description")} {isLoading ? ( ) : ( <> {socials.length > 0 && ( {socials.map((social) => { const provider = social.providerId as SocialProvider; const Icon = SocialIcons[provider]; return ( {social.providerId} {t("account.accounts.connectedAt", { date: social.updatedAt.toLocaleDateString( i18n.language, ), })} ); })} )} {missing.length > 0 && ( {t("addNew")} {missing.map((provider) => { const Icon = SocialIcons[provider]; return ( ); })} )} )} {t("account.accounts.info")} ); }