"use client"
import { zodResolver } from "@hookform/resolvers/zod"
import type { Organization } from "better-auth/plugins/organization"
import { useContext, useMemo } from "react"
import { useForm } from "react-hook-form"
import * as z from "zod"
import { useCurrentOrganization } from "../../hooks/use-current-organization"
import { AuthUIContext } from "../../lib/auth-ui-provider"
import { cn, getLocalizedError } from "../../lib/utils"
import {
SettingsCard,
type SettingsCardProps
} from "../settings/shared/settings-card"
import { CardContent } from "../ui/card"
import { Form, FormControl, FormField, FormItem, FormMessage } from "../ui/form"
import { Input } from "../ui/input"
import { Skeleton } from "../ui/skeleton"
export interface OrganizationNameCardProps extends SettingsCardProps {
slug?: string
}
export function OrganizationNameCard({
className,
classNames,
localization: localizationProp,
slug,
...props
}: OrganizationNameCardProps) {
const { localization: contextLocalization } = useContext(AuthUIContext)
const localization = useMemo(
() => ({ ...contextLocalization, ...localizationProp }),
[contextLocalization, localizationProp]
)
const { data: organization } = useCurrentOrganization({ slug })
if (!organization) {
return (
)
}
return (
)
}
function OrganizationNameForm({
className,
classNames,
localization: localizationProp,
organization,
...props
}: OrganizationNameCardProps & { organization: Organization }) {
const {
localization: contextLocalization,
hooks: { useHasPermission },
mutators: { updateOrganization },
optimistic,
toast,
localizeErrors
} = useContext(AuthUIContext)
const localization = { ...contextLocalization, ...localizationProp }
const { data: hasPermission, isPending: permissionPending } =
useHasPermission({
organizationId: organization.id,
permissions: {
organization: ["update"]
}
})
const { refetch: refetchOrganization } = useCurrentOrganization({
slug: organization.slug
})
const isPending = permissionPending
const formSchema = z.object({
name: z.string().min(1, {
message: `${localization.ORGANIZATION_NAME} ${localization.IS_REQUIRED}`
})
})
const form = useForm({
resolver: zodResolver(formSchema),
values: { name: organization.name || "" }
})
const { isSubmitting } = form.formState
const updateOrganizationName = async ({
name
}: z.infer) => {
if (organization.name === name) {
toast({
variant: "error",
message: `${localization.ORGANIZATION_NAME} ${localization.IS_THE_SAME}`
})
return
}
try {
await updateOrganization({
organizationId: organization.id,
data: { name }
})
await refetchOrganization?.()
toast({
variant: "success",
message: `${localization.ORGANIZATION_NAME} ${localization.UPDATED_SUCCESSFULLY}`
})
} catch (error) {
toast({
variant: "error",
message: getLocalizedError({
error,
localization,
localizeErrors
})
})
}
}
return (
)
}