diff --git a/islands/AddModule.tsx b/islands/AddModule.tsx index ef40518a6..b55f76f64 100644 --- a/islands/AddModule.tsx +++ b/islands/AddModule.tsx @@ -3,14 +3,12 @@ import { useEffect, useRef, useState } from "preact/hooks"; import { IS_BROWSER } from "$fresh/runtime.ts"; import * as Icons from "@/components/Icons.tsx"; -import { getVersionList } from "@/utils/registry_utils.ts"; import confetti from "$canvas-confetti"; - -const NAME_REGEX = /^[a-z0-9_]{3,40}$/; +import { getVersionList, validateModuleName } from "@/utils/registry_utils.ts"; interface ModuleState { name: string; - available: boolean | "pending"; + available: boolean | "pending" | "invalid"; registered: boolean; } @@ -42,27 +40,14 @@ export default function AddModule() { const controller = new AbortController(); (async () => { - if (name === "" || !NAME_REGEX.test(name)) { + const available = await validateModuleName(name, controller); + + if (!controller.signal.aborted) { setModuleStateIfSameName({ name, - available: false, + available, registered, }); - } else { - await getVersionList(name, controller.signal) - .then((e) => !e) - .catch(() => false) - .then((e) => { - if (controller.signal.aborted) { - return; - } - - setModuleStateIfSameName({ - name, - available: e, - registered, - }); - }); } })(); @@ -70,7 +55,7 @@ export default function AddModule() { }, [name]); useEffect(() => { - if (available === "pending" || !available) { + if (available === "pending" || available === false) { return; } @@ -144,11 +129,22 @@ export default function AddModule() { }} disabled={!IS_BROWSER} /> - {name && !available && ( + {name && available === false && (

- Invalid Name/Name has been taken! + This name has already been taken!

)} + {name && available === "invalid" && ( +
+

+ This module name is invalid. +

+

+ A valid name can be 3-40 characters and only contain lower case + characters, numbers and `_`. +

+
+ )} @@ -188,7 +184,7 @@ export default function AddModule() {

Add the webhook - {available && !registered && + {available === true && !registered && (
@@ -214,7 +210,7 @@ export default function AddModule() { {urlValue}
- {available && + {available === true && (