improve form error codes

This commit is contained in:
miloschwartz
2026-08-05 15:56:12 -04:00
parent 790daba796
commit 2e8bd7a8c7
6 changed files with 103 additions and 77 deletions
@@ -29,7 +29,7 @@ import { useEnvContext } from "@app/hooks/useEnvContext";
import { toast } from "@app/hooks/useToast";
import { createApiClient, formatAxiosError } from "@app/lib/api";
import {
aiProviderFormSchema,
createAiProviderFormSchema,
toAiProviderAuthPayload,
type AiProviderFormValues
} from "@app/lib/aiProviderFormSchema";
@@ -43,7 +43,7 @@ import type { CreateOrEditAiProviderResponse } from "@server/routers/aiProvider/
import type { AxiosResponse } from "axios";
import { useTranslations } from "next-intl";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { useMemo, useState } from "react";
import { useForm } from "react-hook-form";
export default function AiProviderAuthenticationPage() {
@@ -54,8 +54,10 @@ export default function AiProviderAuthenticationPage() {
const t = useTranslations();
const [saveLoading, setSaveLoading] = useState(false);
const formSchema = useMemo(() => createAiProviderFormSchema(t), [t]);
const form = useForm<AiProviderFormValues>({
resolver: zodResolver(aiProviderFormSchema),
resolver: zodResolver(formSchema),
defaultValues: {
name: provider.name,
type: provider.type as AiProviderType,
@@ -32,17 +32,10 @@ import type { CreateOrEditAiProviderResponse } from "@server/routers/aiProvider/
import type { AxiosResponse } from "axios";
import { useTranslations } from "next-intl";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { useMemo, useState } from "react";
import { useForm } from "react-hook-form";
import { z } from "zod";
const generalSchema = z.object({
name: z.string().trim().min(1),
enabled: z.boolean()
});
type GeneralFormValues = z.infer<typeof generalSchema>;
export default function AiProviderGeneralPage() {
const { provider, updateProvider } = useAiProviderContext();
const { env } = useEnvContext();
@@ -51,6 +44,20 @@ export default function AiProviderGeneralPage() {
const t = useTranslations();
const [saveLoading, setSaveLoading] = useState(false);
const generalSchema = useMemo(
() =>
z.object({
name: z
.string()
.trim()
.min(1, { message: t("nameRequired") }),
enabled: z.boolean()
}),
[t]
);
type GeneralFormValues = z.infer<typeof generalSchema>;
const form = useForm<GeneralFormValues>({
resolver: zodResolver(generalSchema),
defaultValues: {
@@ -37,7 +37,7 @@ import { useEnvContext } from "@app/hooks/useEnvContext";
import { toast } from "@app/hooks/useToast";
import { createApiClient, formatAxiosError } from "@app/lib/api";
import {
aiProviderFormSchema,
createAiProviderFormSchema,
showsUpstreamUrlField,
toAiProviderNetworkPayload,
upstreamUrlRequired,
@@ -54,7 +54,7 @@ import { useQuery } from "@tanstack/react-query";
import type { AxiosResponse } from "axios";
import { useTranslations } from "next-intl";
import { useParams, useRouter } from "next/navigation";
import { useRef, useState } from "react";
import { useMemo, useRef, useState } from "react";
import { useForm } from "react-hook-form";
export default function AiProviderNetworkPage() {
@@ -68,8 +68,10 @@ export default function AiProviderNetworkPage() {
const [saveLoading, setSaveLoading] = useState(false);
const targetsFormRef = useRef<ProxyResourceTargetsFormHandle>(null);
const formSchema = useMemo(() => createAiProviderFormSchema(t), [t]);
const form = useForm<AiProviderFormValues>({
resolver: zodResolver(aiProviderFormSchema),
resolver: zodResolver(formSchema),
defaultValues: {
name: provider.name,
type: provider.type as AiProviderType,
@@ -38,7 +38,7 @@ import { useEnvContext } from "@app/hooks/useEnvContext";
import { toast } from "@app/hooks/useToast";
import { createApiClient, formatAxiosError } from "@app/lib/api";
import {
aiProviderCreateFormSchema,
createAiProviderCreateFormSchema,
defaultAuthTypeForProvider,
emptyUpstreamForType,
showsUpstreamUrlField,
@@ -52,7 +52,7 @@ import type { CreateOrEditAiProviderResponse } from "@server/routers/aiProvider/
import type { AxiosResponse } from "axios";
import { useTranslations } from "next-intl";
import { useParams, useRouter } from "next/navigation";
import { useRef, useState } from "react";
import { useMemo, useRef, useState } from "react";
import { useForm } from "react-hook-form";
export default function CreateAiProviderPage() {
@@ -65,8 +65,10 @@ export default function CreateAiProviderPage() {
const [loading, setLoading] = useState(false);
const targetsRef = useRef<LocalTarget[]>([]);
const formSchema = useMemo(() => createAiProviderCreateFormSchema(t), [t]);
const form = useForm<AiProviderFormValues>({
resolver: zodResolver(aiProviderCreateFormSchema),
resolver: zodResolver(formSchema),
defaultValues: {
name: "",
type: "openai",