Production-ready Next.js boilerplate with: - Runtime env validation (fail-fast on missing vars) - Feature-gated config (S3, Stripe, email, OAuth) - Docker + Coolify deployment pipeline - PostgreSQL + pgvector, MinIO S3, Better Auth - TypeScript strict mode (no ignoreBuildErrors) - i18n (en/es), AI modules, billing, monitoring Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
import { useMutation } from "@tanstack/react-query";
|
|
import { router } from "expo-router";
|
|
import { Alert } from "react-native";
|
|
|
|
import { useTranslation } from "@turbostarter/i18n";
|
|
import { Icons } from "@turbostarter/ui-mobile/icons";
|
|
import { Text } from "@turbostarter/ui-mobile/text";
|
|
|
|
import { useSetupSteps } from "~/app/(setup)/steps/_layout";
|
|
import { pathsConfig } from "~/config/paths";
|
|
import { authClient } from "~/lib/auth";
|
|
import { auth } from "~/modules/auth/lib/api";
|
|
import { SettingsTile } from "~/modules/common/settings-tile";
|
|
import { Spinner } from "~/modules/common/spinner";
|
|
|
|
export const Logout = () => {
|
|
const { t } = useTranslation(["common", "auth"]);
|
|
const { reset } = useSetupSteps();
|
|
const { refetch } = authClient.useListOrganizations();
|
|
|
|
const signOut = useMutation({
|
|
...auth.mutations.signOut,
|
|
onSuccess: async () => {
|
|
reset();
|
|
await refetch();
|
|
router.replace(pathsConfig.index);
|
|
},
|
|
});
|
|
|
|
return (
|
|
<>
|
|
<SettingsTile
|
|
icon={Icons.LogOut}
|
|
onPress={() => {
|
|
Alert.alert(t("logout.cta"), t("logout.confirm"), [
|
|
{
|
|
text: t("cancel"),
|
|
style: "cancel",
|
|
},
|
|
{
|
|
text: t("logout.cta"),
|
|
style: "destructive",
|
|
onPress: () => signOut.mutate(undefined),
|
|
},
|
|
]);
|
|
}}
|
|
>
|
|
<Text>{t("logout.cta")}</Text>
|
|
</SettingsTile>
|
|
{signOut.isPending && <Spinner />}
|
|
</>
|
|
);
|
|
};
|