✨ feat: create provider callback handler
This commit is contained in:
49
shared/libs/shadcn/ui/sonner.tsx
Normal file
49
shared/libs/shadcn/ui/sonner.tsx
Normal file
@ -0,0 +1,49 @@
|
||||
"use client"
|
||||
|
||||
import { useTheme } from "next-themes"
|
||||
import { Toaster as Sonner, type ToasterProps } from "sonner"
|
||||
import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from "lucide-react"
|
||||
|
||||
const Toaster = ({ ...props }: ToasterProps) => {
|
||||
const { theme = "system" } = useTheme()
|
||||
|
||||
return (
|
||||
<Sonner
|
||||
theme={theme as ToasterProps["theme"]}
|
||||
className="toaster group"
|
||||
icons={{
|
||||
success: (
|
||||
<CircleCheckIcon className="size-4" />
|
||||
),
|
||||
info: (
|
||||
<InfoIcon className="size-4" />
|
||||
),
|
||||
warning: (
|
||||
<TriangleAlertIcon className="size-4" />
|
||||
),
|
||||
error: (
|
||||
<OctagonXIcon className="size-4" />
|
||||
),
|
||||
loading: (
|
||||
<Loader2Icon className="size-4 animate-spin" />
|
||||
),
|
||||
}}
|
||||
style={
|
||||
{
|
||||
"--normal-bg": "var(--popover)",
|
||||
"--normal-text": "var(--popover-foreground)",
|
||||
"--normal-border": "var(--border)",
|
||||
"--border-radius": "var(--radius)",
|
||||
} as React.CSSProperties
|
||||
}
|
||||
toastOptions={{
|
||||
classNames: {
|
||||
toast: "cn-toast",
|
||||
},
|
||||
}}
|
||||
{...props}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
export { Toaster }
|
||||
54
shared/widgets/signin/actions/submitProviderCallback.ts
Normal file
54
shared/widgets/signin/actions/submitProviderCallback.ts
Normal file
@ -0,0 +1,54 @@
|
||||
"use server";
|
||||
|
||||
import { backendFetch, BackendResponse } from "@/shared/helper/backendFetch";
|
||||
import { cookies } from "next/headers";
|
||||
|
||||
export const submitProviderCallback = async (
|
||||
providerName: string,
|
||||
queries?: unknown
|
||||
): Promise<
|
||||
BackendResponse<{
|
||||
authToken: string;
|
||||
}>
|
||||
> => {
|
||||
try {
|
||||
const envKey = providerName.toUpperCase() + "_CALLBACK_URL";
|
||||
|
||||
const authClientCallbackUrl = (await backendFetch(
|
||||
"auth/providers/" + providerName + "/callback"
|
||||
)) as BackendResponse<{
|
||||
callback_url: string;
|
||||
}>;
|
||||
|
||||
if (!authClientCallbackUrl.success)
|
||||
throw new Error("Failed to get auth client callback URL");
|
||||
|
||||
const responseProvision = (await backendFetch(
|
||||
`${authClientCallbackUrl.data?.callback_url!}?callbackURI=${
|
||||
process.env.APP_URL
|
||||
}${process.env[envKey]}&${queries}`
|
||||
)) as BackendResponse<{
|
||||
authToken: string;
|
||||
}>;
|
||||
|
||||
if (!responseProvision.success)
|
||||
throw new Error("Failed to submit provider callback");
|
||||
|
||||
(await cookies()).set({
|
||||
name: "auth_token",
|
||||
value: responseProvision.data?.authToken!,
|
||||
httpOnly: true,
|
||||
path: "/",
|
||||
secure: process.env.NODE_ENV === "production",
|
||||
maxAge: Number(process.env.SESSION_EXPIRE),
|
||||
});
|
||||
|
||||
return responseProvision;
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
message: "Error submitting provider callback",
|
||||
error: error,
|
||||
};
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user