From 05d2164dce6d13db2f97edd0bb094d3f387242a5 Mon Sep 17 00:00:00 2001 From: "Claude (Chronicler #63)" Date: Mon, 6 Apr 2026 12:32:41 +0000 Subject: [PATCH] fix(modpackchecker): Console card redesign - StatBlock style + short errors wrapper.tsx complete rewrite: - Matches Pterodactyl StatBlock styling exactly - Uses col-span classes for proper grid layout - Icon with status color (orange=update, cyan=current, gray=idle) - Clickable card instead of separate button - Short error codes for better UX: - 'Not configured' (no modpack variables) - 'Wait 60s' (rate limited) - 'Not found' (404) - 'API error' (general failure) - 'Check failed' (long error truncated) build.sh: - Injects into AfterInformation.tsx (right column) - Card appears after Network stats Signed-off-by: Claude (Chronicler #63) --- .../views/server/wrapper.tsx | 116 ++++++++---------- 1 file changed, 52 insertions(+), 64 deletions(-) diff --git a/services/modpack-version-checker/blueprint-extension/views/server/wrapper.tsx b/services/modpack-version-checker/blueprint-extension/views/server/wrapper.tsx index 4d7620d..368642d 100644 --- a/services/modpack-version-checker/blueprint-extension/views/server/wrapper.tsx +++ b/services/modpack-version-checker/blueprint-extension/views/server/wrapper.tsx @@ -3,6 +3,7 @@ import { ServerContext } from '@/state/server'; import http from '@/api/http'; import { faCube } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import classNames from 'classnames'; interface VersionData { success: boolean; @@ -31,78 +32,65 @@ const ModpackVersionCard: React.FC = () => { setStatus(response.data.success ? 'success' : 'error'); } catch (error: any) { if (error.response?.status === 429) { - setData({ - success: false, - error: 'Rate limit reached. Please wait 60 seconds.', - }); + setData({ success: false, error: 'rate_limited' }); + } else if (error.response?.status === 404) { + setData({ success: false, error: 'not_found' }); } else { - setData({ - success: false, - error: error.response?.data?.message || 'Failed to check for updates', - }); + setData({ success: false, error: 'api_error' }); } setStatus('error'); } }; - // Match StatBlock styling from Pterodactyl + // Convert error codes to short display messages + const getErrorMessage = (error?: string): string => { + if (!error) return 'Error'; + if (error.includes('detect') || error.includes('MODPACK')) return 'Not configured'; + if (error === 'rate_limited') return 'Wait 60s'; + if (error === 'not_found') return 'Not found'; + if (error === 'api_error') return 'API error'; + if (error.length > 20) return 'Check failed'; + return error; + }; + + const getBgColor = () => { + if (status === 'success' && data?.status === 'update_available') return 'bg-orange-500'; + if (status === 'success' && data?.success) return 'bg-cyan-500'; + return 'bg-gray-700'; + }; + return ( -
-
-
- - Modpack -
- {status === 'idle' && ( - - )} - {status === 'success' && ( - - )} +
+
+ +
+
-
- {status === 'idle' && ( - Click to check - )} - {status === 'loading' && ( - Checking... - )} - {status === 'success' && data?.success && ( -
- - {data.modpack_name || data.modpack_id} - - - {data.status === 'update_available' ? `→ ${data.latest_version}` : 'Up to date'} - -
- )} - {(status === 'error' || (status === 'success' && !data?.success)) && ( - - {data?.error || data?.message || 'Error'} - - )} + +
+

+ Modpack Version +

+
+ {status === 'idle' && Click to check} + {status === 'loading' && Checking...} + {status === 'success' && data?.success && {data.latest_version}} + {(status === 'error' || (status === 'success' && !data?.success)) && ( + {getErrorMessage(data?.error || data?.message)} + )} +
);