From 2359a44c83752ef292fb1866038f26960c0edd27 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 29 Jun 2026 16:42:22 +0200 Subject: [PATCH] feat: add form validation to access check screen Closes #6 - Explicit whitespace-only guild ID validation with inline error - Explicit whitespace-only resource ID validation with inline error - Red border highlight on invalid fields - Button disabled when trimmed fields are empty - Errors clear on input change --- app/access-check.tsx | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/app/access-check.tsx b/app/access-check.tsx index b8a1a4f..4631f9a 100644 --- a/app/access-check.tsx +++ b/app/access-check.tsx @@ -27,6 +27,8 @@ export default function AccessCheck() { const [scanError, setScanError] = useState(null); const [scannedPayload, setScannedPayload] = useState(null); const [addressError, setAddressError] = useState(null); + const [guildIdError, setGuildIdError] = useState(null); + const [resourceIdError, setResourceIdError] = useState(null); const { isOffline } = useNetworkStatus(); const accessCheck = useAccessCheck(); @@ -91,17 +93,34 @@ export default function AccessCheck() { const handleGuildIdChange = (nextGuildId: string) => { setGuildId(nextGuildId); + setGuildIdError(null); resetCompletedCheck(); }; const handleResourceIdChange = (nextResourceId: string) => { setResourceId(nextResourceId); + setResourceIdError(null); resetCompletedCheck(); }; const handleCheck = () => { const trimmedGuildId = guildId.trim(); const trimmedResourceId = resourceId.trim(); + let hasError = false; + + if (!trimmedGuildId) { + setGuildIdError("Guild ID is required"); + hasError = true; + } else { + setGuildIdError(null); + } + + if (!trimmedResourceId) { + setResourceIdError("Resource ID is required"); + hasError = true; + } else { + setResourceIdError(null); + } if (!address || !trimmedGuildId || !trimmedResourceId) { return; @@ -161,11 +180,12 @@ export default function AccessCheck() { value={guildId} onChangeText={handleGuildIdChange} placeholder="e.g. alpha-guild" - className="bg-white border border-border rounded-xl p-4 text-text text-lg" + className={`bg-white border ${guildIdError ? "border-error" : "border-border"} rounded-xl p-4 text-text text-lg`} accessibilityLabel="Guild ID" accessibilityHint="Enter the guild identifier" testID="access-check-guild-id-input" /> + {guildIdError && {guildIdError}} @@ -174,11 +194,12 @@ export default function AccessCheck() { value={resourceId} onChangeText={handleResourceIdChange} placeholder="e.g. secret-channel" - className="bg-white border border-border rounded-xl p-4 text-text text-lg" + className={`bg-white border ${resourceIdError ? "border-error" : "border-border"} rounded-xl p-4 text-text text-lg`} accessibilityLabel="Resource ID" accessibilityHint="Enter the resource identifier" testID="access-check-resource-id-input" /> + {resourceIdError && {resourceIdError}}