From d33f566594ec50f5af8b82e6de68315dfc47e095 Mon Sep 17 00:00:00 2001 From: Oksamies Date: Wed, 3 Dec 2025 14:30:12 +0200 Subject: [PATCH] Add validator option for useStrongFrom and use it in few places --- .../app/settings/teams/Teams.tsx | 4 ++- .../teams/team/tabs/Members/MemberAddForm.tsx | 7 ++++- .../tabs/ServiceAccounts/ServiceAccounts.tsx | 7 ++--- .../utils/StrongForm/useStrongForm.ts | 30 ++++++++++++++++++- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/apps/cyberstorm-remix/app/settings/teams/Teams.tsx b/apps/cyberstorm-remix/app/settings/teams/Teams.tsx index 8bcd1051e..274446080 100644 --- a/apps/cyberstorm-remix/app/settings/teams/Teams.tsx +++ b/apps/cyberstorm-remix/app/settings/teams/Teams.tsx @@ -163,6 +163,7 @@ function CreateTeamForm(props: { config: () => RequestConfig }) { InputErrors >({ inputs: formInputs, + validators: { name: { required: true } }, submitor, onSubmitSuccess: (fi) => { createTeamRevalidate(); @@ -223,10 +224,11 @@ function CreateTeamForm(props: { config: () => RequestConfig }) { { strongForm.submit().then(() => setOpen(false)); }} - csVariant="accent" > Create diff --git a/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/MemberAddForm.tsx b/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/MemberAddForm.tsx index aa4cd3383..fc31a87f7 100644 --- a/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/MemberAddForm.tsx +++ b/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/MemberAddForm.tsx @@ -74,6 +74,7 @@ export function MemberAddForm(props: { InputErrors >({ inputs: formInputs, + validators: { username: { required: true } }, submitor, onSubmitSuccess: () => { props.updateTrigger(); @@ -151,7 +152,11 @@ export function MemberAddForm(props: { - + Add member diff --git a/apps/cyberstorm-remix/app/settings/teams/team/tabs/ServiceAccounts/ServiceAccounts.tsx b/apps/cyberstorm-remix/app/settings/teams/team/tabs/ServiceAccounts/ServiceAccounts.tsx index fcb6d4819..ab4fc1454 100644 --- a/apps/cyberstorm-remix/app/settings/teams/team/tabs/ServiceAccounts/ServiceAccounts.tsx +++ b/apps/cyberstorm-remix/app/settings/teams/team/tabs/ServiceAccounts/ServiceAccounts.tsx @@ -114,8 +114,6 @@ function AddServiceAccountForm(props: { nickname: "", }); - const isValid = formInputs.nickname.trim().length > 0; - type SubmitorOutput = Awaited>; async function submitor(data: typeof formInputs): Promise { @@ -140,6 +138,7 @@ function AddServiceAccountForm(props: { InputErrors >({ inputs: formInputs, + validators: { nickname: { required: true } }, submitor, onSubmitSuccess: (result) => { onSuccess(result); @@ -203,7 +202,7 @@ function AddServiceAccountForm(props: { className="service-accounts__form" onSubmit={(e) => { e.preventDefault(); - if (isValid) { + if (strongForm.isReady) { strongForm.submit(); } }} @@ -234,7 +233,7 @@ function AddServiceAccountForm(props: { )} {serviceAccountAdded ? null : ( - + Add Service Account diff --git a/apps/cyberstorm-remix/cyberstorm/utils/StrongForm/useStrongForm.ts b/apps/cyberstorm-remix/cyberstorm/utils/StrongForm/useStrongForm.ts index 7c8408b78..39417d4a6 100644 --- a/apps/cyberstorm-remix/cyberstorm/utils/StrongForm/useStrongForm.ts +++ b/apps/cyberstorm-remix/cyberstorm/utils/StrongForm/useStrongForm.ts @@ -1,10 +1,14 @@ -import { useEffect, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { ParseError, RequestBodyParseError, RequestQueryParamsParseError, } from "../../../../../packages/thunderstore-api/src"; +type Validator = { + required?: boolean; +}; + interface UseStrongFormProps< Inputs, SubmissionDataShape, @@ -13,6 +17,15 @@ interface UseStrongFormProps< SubmissionError, > { inputs: Inputs; + /** + * Validators for the form inputs. + * + * NOTE: If you add new validator types here, make sure to implement the + * validation logic in the `isReady` memo inside `useStrongForm`. + */ + validators?: { + [K in keyof Inputs]?: Validator; + }; refiner?: (inputs: Inputs) => Promise; onRefineSuccess?: (output: SubmissionDataShape) => void; onRefineError?: (error: RefinerError) => void; @@ -45,6 +58,20 @@ export function useStrongForm< const [submitError, setSubmitError] = useState(); const [inputErrors, setInputErrors] = useState(); + const isReady = useMemo(() => { + if (!props.validators) return true; + for (const key in props.validators) { + const validator = props.validators[key]; + const value = props.inputs[key]; + // NOTE: Expand the checks as more validators are added + if (validator?.required) { + if (typeof value === "string" && value.trim() === "") return false; + if (value === undefined || value === null) return false; + } + } + return true; + }, [props.inputs]); + useEffect(() => { if (refining || submitting) { return; @@ -165,5 +192,6 @@ export function useStrongForm< refining, refineError, inputErrors, + isReady, }; }