diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/components/rbac/permissions.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/components/rbac/permissions.tsx index c41003368f..30a91dfe8f 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/components/rbac/permissions.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/components/rbac/permissions.tsx @@ -1,7 +1,7 @@ "use client"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import { Checkbox } from "@/components/ui/checkbox"; import { trpc } from "@/lib/trpc/client"; +import { Checkbox } from "@unkey/ui"; import { toast } from "sonner"; export type Role = { diff --git a/apps/dashboard/app/(app)/apis/[apiId]/settings/components/default-bytes.tsx b/apps/dashboard/app/(app)/apis/[apiId]/settings/components/default-bytes.tsx index b7e515d74c..4ebc6e2262 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/settings/components/default-bytes.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/settings/components/default-bytes.tsx @@ -1,13 +1,13 @@ "use client"; import { revalidate } from "@/app/actions"; -import { Form, FormControl, FormField, FormItem, FormMessage } from "@/components/ui/form"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { Button, Input, SettingCard } from "@unkey/ui"; +import { Button, FormInput, SettingCard } from "@unkey/ui"; import { useRouter } from "next/navigation"; -import { useForm } from "react-hook-form"; +import { Controller, useForm } from "react-hook-form"; import { z } from "zod"; + const formSchema = z.object({ keyAuthId: z.string(), defaultBytes: z @@ -27,10 +27,13 @@ type Props = { export const DefaultBytes: React.FC = ({ keyAuth, apiId }) => { const router = useRouter(); - const form = useForm>({ - resolver: async (data, context, options) => { - return zodResolver(formSchema)(data, context, options); - }, + + const { + control, + handleSubmit, + formState: { isValid, isSubmitting, isDirty }, + } = useForm>({ + resolver: zodResolver(formSchema), mode: "all", shouldFocusError: true, delayError: 100, @@ -62,58 +65,46 @@ export const DefaultBytes: React.FC = ({ keyAuth, apiId }) => { } return ( -
- - - Sets the default byte size for keys under this API. Must be between 8 and 255. - - } - border="top" - className="border-b-1" - contentWidth="w-full lg:w-[420px]" - > -
- - - ( - - - field.onChange(Number(e.target.value.replace(/\D/g, "")))} - /> - - - - )} - /> - + + + Sets the default byte size for keys under this API. Must be between 8 and 255.
-
-
- + } + border="top" + className="border-b-1" + contentWidth="w-full lg:w-[420px]" + > +
+ + + ( + field.onChange(Number(e.target.value.replace(/\D/g, "")))} + /> + )} + /> + + +
+ + ); }; diff --git a/apps/dashboard/app/(app)/apis/[apiId]/settings/components/default-prefix.tsx b/apps/dashboard/app/(app)/apis/[apiId]/settings/components/default-prefix.tsx index b7f52cc3f3..a750717251 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/settings/components/default-prefix.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/settings/components/default-prefix.tsx @@ -1,12 +1,11 @@ "use client"; import { revalidate } from "@/app/actions"; -import { Form, FormControl, FormField, FormItem } from "@/components/ui/form"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { Button, Input, SettingCard } from "@unkey/ui"; +import { Button, FormInput, SettingCard } from "@unkey/ui"; import { useRouter } from "next/navigation"; -import { useForm } from "react-hook-form"; +import { Controller, useForm } from "react-hook-form"; import { z } from "zod"; const formSchema = z.object({ @@ -29,10 +28,13 @@ type Props = { export const DefaultPrefix: React.FC = ({ keyAuth, apiId }) => { const router = useRouter(); - const form = useForm>({ - resolver: async (data, context, options) => { - return zodResolver(formSchema)(data, context, options); - }, + + const { + control, + handleSubmit, + formState: { isValid, isSubmitting, isDirty }, + } = useForm>({ + resolver: zodResolver(formSchema), mode: "all", shouldFocusError: true, delayError: 100, @@ -62,61 +64,50 @@ export const DefaultPrefix: React.FC = ({ keyAuth, apiId }) => { } return ( -
- - - Sets the default prefix for keys under this API. A trailing underscore is added - automatically. - - } - border="bottom" - contentWidth="w-full lg:w-[420px] h-full" - > -
- - - ( - - - { - if (e.target.value === "") { - return; - } - }} - /> - - - )} - /> - + + + Sets the default prefix for keys under this API. A trailing underscore is added + automatically.
-
-
- + } + border="bottom" + contentWidth="w-full lg:w-[420px] h-full" + > +
+ + + ( + { + if (e.target.value === "") { + return; + } + field.onBlur(); + }} + /> + )} + /> + + +
+ + ); }; diff --git a/apps/dashboard/app/(app)/apis/[apiId]/settings/components/update-api-name.tsx b/apps/dashboard/app/(app)/apis/[apiId]/settings/components/update-api-name.tsx index d74e6a4e5b..ee54102084 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/settings/components/update-api-name.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/settings/components/update-api-name.tsx @@ -1,13 +1,14 @@ "use client"; -import { Form, FormControl, FormField, FormItem } from "@/components/ui/form"; + import { toast } from "@/components/ui/toaster"; import { tags } from "@/lib/cache"; import { trpc } from "@/lib/trpc/client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { Button, Input, SettingCard } from "@unkey/ui"; -import { useForm } from "react-hook-form"; +import { Button, FormInput, SettingCard } from "@unkey/ui"; +import { Controller, useForm } from "react-hook-form"; import { z } from "zod"; import { revalidateTag } from "../../../../../actions"; + export const dynamic = "force-dynamic"; const formSchema = z.object({ @@ -27,10 +28,12 @@ type Props = { export const UpdateApiName: React.FC = ({ api }) => { const utils = trpc.useUtils(); - const form = useForm>({ - resolver: async (data, context, options) => { - return zodResolver(formSchema)(data, context, options); - }, + const { + control, + handleSubmit, + formState: { isValid, isSubmitting, isDirty }, + } = useForm>({ + resolver: zodResolver(formSchema), mode: "all", shouldFocusError: true, delayError: 100, @@ -59,6 +62,7 @@ export const UpdateApiName: React.FC = ({ api }) => { if (values.apiName === api.name || !values.apiName) { return toast.error("Please provide a valid name before saving."); } + await updateName.mutateAsync({ name: values.apiName, apiId: values.apiId, @@ -67,59 +71,47 @@ export const UpdateApiName: React.FC = ({ api }) => { } return ( -
- - -
- - - - ( - - - { - if (e.target.value === "") { - return; - } - }} - /> - - - )} - /> - -
-
-
- +
+ +
+ + + + ( + { + if (e.target.value === "") { + return; + } + field.onChange(e); + }} + /> + )} + /> + + +
+
+
); }; diff --git a/apps/dashboard/app/(app)/apis/[apiId]/settings/components/update-ip-whitelist.tsx b/apps/dashboard/app/(app)/apis/[apiId]/settings/components/update-ip-whitelist.tsx index 8df153b548..bd83067e15 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/settings/components/update-ip-whitelist.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/settings/components/update-ip-whitelist.tsx @@ -1,13 +1,12 @@ "use client"; -import { FormField } from "@/components/ui/form"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; import { zodResolver } from "@hookform/resolvers/zod"; import type { Workspace } from "@unkey/db"; import { ArrowUpRight, Lock, Shield } from "@unkey/icons"; -import { Button, InlineLink, SettingCard, Textarea } from "@unkey/ui"; +import { Button, FormTextarea, InlineLink, SettingCard } from "@unkey/ui"; import { useRouter } from "next/navigation"; -import { useForm } from "react-hook-form"; +import { Controller, useForm } from "react-hook-form"; import { z } from "zod"; import { StatusBadge } from "./status-badge"; @@ -33,7 +32,11 @@ export const UpdateIpWhitelist: React.FC = ({ api, workspace }) => { const router = useRouter(); const isEnabled = workspace.features.ipWhitelist; - const form = useForm>({ + const { + control, + handleSubmit, + formState: { isValid, isSubmitting, errors, isDirty }, + } = useForm>({ resolver: zodResolver(formSchema), defaultValues: { ipWhitelist: api.ipWhitelist ?? "", @@ -53,8 +56,6 @@ export const UpdateIpWhitelist: React.FC = ({ api, workspace }) => { }, }); - const isValid = api.ipWhitelist?.toString() !== form.watch("ipWhitelist").toString(); - async function onSubmit(values: z.infer) { await updateIps.mutateAsync(values); } @@ -67,10 +68,10 @@ export const UpdateIpWhitelist: React.FC = ({ api, workspace }) => { ); return ( -
+ +
IP Whitelist
@@ -83,7 +84,7 @@ export const UpdateIpWhitelist: React.FC = ({ api, workspace }) => { } /> @@ -92,31 +93,30 @@ export const UpdateIpWhitelist: React.FC = ({ api, workspace }) => { contentWidth="w-full" > {isEnabled ? ( -
+
- - ( -