feat: add oauth button

This commit is contained in:
2026-01-07 17:21:14 +07:00
parent 21a099b77f
commit 28cd3178b9
7 changed files with 70 additions and 3 deletions

View File

@ -1,4 +1,4 @@
interface BackendResponse<T = unknown> {
export interface BackendResponse<T = unknown> {
success: boolean;
message: string;
data?: T;

View File

@ -33,6 +33,9 @@ const buttonVariants = cva(
"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
"icon-lg": "size-9",
},
isDisabled: {
true: "bg-neutral-800 text-neutral-400 cursor-not-allowed text-xs",
},
},
defaultVariants: {
variant: "default",
@ -46,10 +49,12 @@ function Button({
variant = "default",
size = "default",
asChild = false,
isDisabled = false,
...props
}: React.ComponentProps<"button"> &
VariantProps<typeof buttonVariants> & {
asChild?: boolean;
isDisabled?: boolean;
}) {
const Comp = asChild ? Slot.Root : "button";
@ -58,7 +63,7 @@ function Button({
data-slot="button"
data-variant={variant}
data-size={size}
className={cn(buttonVariants({ variant, size, className }))}
className={cn(buttonVariants({ variant, size, isDisabled, className }))}
{...props}
/>
);

View File

@ -0,0 +1,14 @@
"use server";
import { backendFetch, BackendResponse } from "@/shared/helper/backendFetch";
export type GetALlThirdPartyAuthCallback = BackendResponse<
{
name: string;
icon: string;
req_endpoint: string;
}[]
>;
export const getAllThirdPartyAuth = async () => {
return (await backendFetch("auth/providers")) as GetALlThirdPartyAuthCallback;
};

View File

@ -10,8 +10,25 @@ import {
import { Input } from "@/shared/libs/shadcn/ui/input";
import { Label } from "@/shared/libs/shadcn/ui/label";
import { Separator } from "@/shared/libs/shadcn/ui/separator";
import { useEffect, useState } from "react";
import {
getAllThirdPartyAuth,
GetALlThirdPartyAuthCallback,
} from "../actions/getAllThirdPartyAuth";
import { Icon } from "@iconify/react";
const SignInCard = () => {
const [oAuthProviders, setOAuthProviders] =
useState<GetALlThirdPartyAuthCallback | null>(null);
useEffect(() => {
(async () => {
const res = await getAllThirdPartyAuth();
console.log(res);
setOAuthProviders(res);
})();
}, []);
return (
<DialogContent showCloseButton={false}>
<DialogHeader>
@ -26,6 +43,31 @@ const SignInCard = () => {
<Label htmlFor="email">Email</Label>
<Input type="email" id="email" placeholder="e.g. user@example.com" />
</div>
<div className="my-4 flex items-center gap-2 ">
<Separator className="flex-1 bg-neutral-700" />
<p className="text-neutral-500 text-sm">or continue with</p>
<Separator className="flex-1 bg-neutral-700" />
</div>
<div>
{oAuthProviders ? (
<div className="flex flex-col gap-1">
{oAuthProviders.data?.map((provider, index) => (
<Button
key={index}
variant="outline"
className="w-full text-neutral-300 text-xs font-normal"
>
<Icon icon={provider.icon} />
Continue with {provider.name}
</Button>
))}
</div>
) : (
<Button size="sm" className="w-full" isDisabled>
There are no third-party auth providers available.
</Button>
)}
</div>
</div>
<DialogFooter>
<DialogClose asChild>