"use client" import type { Session } from "better-auth" import { LaptopIcon, Loader2, SmartphoneIcon } from "lucide-react" import { useContext, useState } from "react" import { UAParser } from "ua-parser-js" import { AuthUIContext } from "../../../lib/auth-ui-provider" import { cn, getLocalizedError } from "../../../lib/utils" import type { AuthLocalization } from "../../../localization/auth-localization" import type { Refetch } from "../../../types/refetch" import { Button } from "../../ui/button" import { Card } from "../../ui/card" import type { SettingsCardClassNames } from "../shared/settings-card" export interface SessionCellProps { className?: string classNames?: SettingsCardClassNames localization?: Partial session: Session refetch?: Refetch } export function SessionCell({ className, classNames, localization, session, refetch }: SessionCellProps) { const { basePath, hooks: { useSession }, localization: contextLocalization, mutators: { revokeSession }, viewPaths, navigate, toast, localizeErrors } = useContext(AuthUIContext) localization = { ...contextLocalization, ...localization } const { data: sessionData } = useSession() const isCurrentSession = session.id === sessionData?.session?.id const [isLoading, setIsLoading] = useState(false) const handleRevoke = async () => { setIsLoading(true) if (isCurrentSession) { navigate(`${basePath}/${viewPaths.SIGN_OUT}`) return } try { await revokeSession({ token: session.token }) refetch?.() } catch (error) { toast({ variant: "error", message: getLocalizedError({ error, localization, localizeErrors }) }) setIsLoading(false) } } const parser = UAParser(session.userAgent as string) const isMobile = parser.device.type === "mobile" return ( {isMobile ? ( ) : ( )}
{isCurrentSession ? localization.CURRENT_SESSION : session?.ipAddress} {session.userAgent?.includes("tauri-plugin-http") ? localization.APP : parser.os.name && parser.browser.name ? `${parser.os.name}, ${parser.browser.name}` : parser.os.name || parser.browser.name || session.userAgent || localization.UNKNOWN}
) }