"use client"; import { useMutation } from "@tanstack/react-query"; import { memo } from "react"; import { SocialProvider as SocialProviderType } from "@turbostarter/auth"; import { useTranslation } from "@turbostarter/i18n"; import { Badge } from "@turbostarter/ui-web/badge"; import { Button } from "@turbostarter/ui-web/button"; import { Icons } from "@turbostarter/ui-web/icons"; import { pathsConfig } from "~/config/paths"; import { authClient } from "~/lib/auth/client"; import { useAuthFormStore } from "~/modules/auth/form/store"; import { auth } from "../lib/api"; import type { AuthProvider } from "@turbostarter/auth"; import type { Icon } from "@turbostarter/ui-web/icons"; interface SocialProvidersProps { readonly providers: SocialProviderType[]; readonly redirectTo?: string; } export const SocialIcons: Record = { [SocialProviderType.GITHUB]: Icons.Github, [SocialProviderType.GOOGLE]: Icons.Google, [SocialProviderType.APPLE]: Icons.Apple, }; const PROVIDER_LABELS: Record = { [SocialProviderType.GITHUB]: "GitHub", [SocialProviderType.GOOGLE]: "Google", [SocialProviderType.APPLE]: "Apple", }; const SocialProvider = ({ provider, isSubmitting, onClick, actualProvider, }: { provider: SocialProviderType; isSubmitting: boolean; onClick: () => void; actualProvider: AuthProvider; }) => { const { t } = useTranslation("common"); const Icon = SocialIcons[provider]; return ( ); }; export const SocialProviders = memo( ({ providers, redirectTo = pathsConfig.dashboard.user.index }) => { const { provider: actualProvider, setProvider, isSubmitting, setIsSubmitting, } = useAuthFormStore(); const signIn = useMutation({ ...auth.mutations.signIn.social, onMutate: ({ provider }) => { setProvider(provider as SocialProviderType); setIsSubmitting(true); }, onSettled: () => { setIsSubmitting(false); }, }); return (
{Object.values(providers).map((provider) => ( signIn.mutate({ provider, callbackURL: redirectTo, errorCallbackURL: pathsConfig.auth.error, }) } actualProvider={actualProvider} /> ))}
); }, ); SocialProviders.displayName = "SocialProviders";