refactor: migrated to zod 4 and improved form validations

This commit is contained in:
2025-07-22 09:35:43 +05:30
parent 495b6f2129
commit acd600f06d
4 changed files with 29 additions and 15 deletions

8
package-lock.json generated
View File

@@ -65,7 +65,7 @@
"sonner": "^2.0.6",
"tailwind-merge": "^3.3.1",
"vaul": "^1.1.2",
"zod": "^3.25.76",
"zod": "^4.0.5",
"zustand": "^5.0.6"
},
"devDependencies": {
@@ -5069,9 +5069,9 @@
"license": "ISC"
},
"node_modules/zod": {
"version": "3.25.76",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/zod/-/zod-4.0.5.tgz",
"integrity": "sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"

View File

@@ -67,7 +67,7 @@
"sonner": "^2.0.6",
"tailwind-merge": "^3.3.1",
"vaul": "^1.1.2",
"zod": "^3.25.76",
"zod": "^4.0.5",
"zustand": "^5.0.6"
},
"devDependencies": {

View File

@@ -26,8 +26,11 @@ import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { invoke } from "@tauri-apps/api/core";
const searchFormSchema = z.object({
url: z.string().min(1, { message: "URL is required" })
.url({message: "Invalid URL format." }),
url: z.url({
error: (issue) => issue.input === undefined || issue.input === null || issue.input === ""
? "URL is required"
: "Invalid URL format"
}),
});
export default function DownloaderPage() {
@@ -206,6 +209,7 @@ export default function DownloaderPage() {
mode: "onChange",
})
const watchedUrl = searchForm.watch("url");
const { errors: searchFormErrors } = searchForm.formState;
function handleSearchSubmit(values: z.infer<typeof searchFormSchema>) {
setVideoMetadata(null);
@@ -371,7 +375,7 @@ export default function DownloaderPage() {
)}
<Button
type="submit"
disabled={!videoUrl || isMetadataLoading}
disabled={!videoUrl || Object.keys(searchFormErrors).length > 0 || isMetadataLoading}
>
{isMetadataLoading ? (
<>

View File

@@ -29,9 +29,12 @@ import { join } from "@tauri-apps/api/path";
import { formatSpeed } from "@/utils";
const websocketPortSchema = z.object({
port: z.coerce.number({
required_error: "Websocket Port is required",
invalid_type_error: "Websocket Port must be a valid number",
port: z.coerce.number<number>({
error: (issue) => issue.input === undefined || issue.input === null || issue.input === ""
? "Websocket Port is required"
: "Websocket Port must be a valid number"
}).int({
message: "Websocket Port must be an integer"
}).min(50000, {
message: "Websocket Port must be at least 50000"
}).max(60000, {
@@ -40,13 +43,20 @@ const websocketPortSchema = z.object({
})
const proxyUrlSchema = z.object({
url: z.string().min(1, { message: "Proxy URL is required" }).url({ message: "Invalid URL format" })
url: z.url({
error: (issue) => issue.input === undefined || issue.input === null || issue.input === ""
? "Proxy URL is required"
: "Invalid URL format"
})
});
const rateLimitSchema = z.object({
rate_limit: z.coerce.number({
required_error: "Rate Limit is required",
invalid_type_error: "Rate Limit must be a valid number",
rate_limit: z.coerce.number<number>({
error: (issue) => issue.input === undefined || issue.input === null || issue.input === ""
? "Rate Limit is required"
: "Rate Limit must be a valid number"
}).int({
message: "Rate Limit must be an integer"
}).min(1024, {
message: "Rate Limit must be at least 1024 bytes/s (1 KB/s)"
}).max(104857600, {