11'use client' ;
22
33import { useCallback , useEffect , useRef , useState , type ReactElement } from 'react' ;
4+ import { validateGitHubUsername } from '@/lib/github' ;
45import Link from 'next/link' ;
56import { motion } from 'framer-motion' ;
67import { ControlsPanel } from './components/ControlsPanel' ;
@@ -121,6 +122,12 @@ export default function CustomizePage(): ReactElement {
121122 setSvgState ( 'idle' ) ;
122123 return ;
123124 }
125+ if ( ! validateGitHubUsername ( trimmedUsername ) ) {
126+ setSvgContent ( '' ) ;
127+ setSvgState ( 'error' ) ;
128+ setErrorMessage ( "That doesn't look like a valid GitHub username" ) ;
129+ return ;
130+ }
124131
125132 setSvgState ( 'loading' ) ;
126133 const controller = new AbortController ( ) ;
@@ -192,7 +199,7 @@ export default function CustomizePage(): ReactElement {
192199 } ) ;
193200
194201 return ( ) => controller . abort ( ) ;
195- } , [ previewSrc , hasUsername ] ) ;
202+ } , [ previewSrc , hasUsername , trimmedUsername ] ) ;
196203
197204 const exportSnippet = getExportSnippet ( exportFormat , queryString ) ;
198205
@@ -395,6 +402,14 @@ export default function CustomizePage(): ReactElement {
395402 Loading preview...
396403 </ div >
397404 ) }
405+ { svgState === 'error' &&
406+ errorMessage === "That doesn't look like a valid GitHub username" && (
407+ < div className = "flex flex-col items-center justify-center gap-2 text-center py-8" >
408+ < p className = "text-sm font-semibold text-red-500 dark:text-red-400" >
409+ { errorMessage }
410+ </ p >
411+ </ div >
412+ ) }
398413 { svgState === 'error' && errorMessage === 'GitHub user not found' && (
399414 < div className = "flex flex-col items-center justify-center gap-4 py-12 text-center" >
400415 < div className = "flex h-16 w-16 items-center justify-center rounded-3xl border border-red-500/20 bg-red-500/10 shadow-inner" >
@@ -422,16 +437,18 @@ export default function CustomizePage(): ReactElement {
422437 </ div >
423438 </ div >
424439 ) }
425- { svgState === 'error' && errorMessage !== 'GitHub user not found' && (
426- < div className = "flex flex-col items-center justify-center gap-2 text-center py-8" >
427- < p className = "text-sm font-semibold text-red-500 dark:text-red-400" >
428- Failed to load badge
429- </ p >
430- < p className = "text-xs text-gray-500 dark:text-white/45" >
431- The API may be unavailable. Please try again.
432- </ p >
433- </ div >
434- ) }
440+ { svgState === 'error' &&
441+ errorMessage !== 'GitHub user not found' &&
442+ errorMessage !== "That doesn't look like a valid GitHub username" && (
443+ < div className = "flex flex-col items-center justify-center gap-2 text-center py-8" >
444+ < p className = "text-sm font-semibold text-red-500 dark:text-red-400" >
445+ Failed to load badge
446+ </ p >
447+ < p className = "text-xs text-gray-500 dark:text-white/45" >
448+ The API may be unavailable. Please try again.
449+ </ p >
450+ </ div >
451+ ) }
435452 { svgState === 'loaded' && svgContent && (
436453 < motion . div
437454 initial = { { opacity : 0 , scale : 0.95 } }
@@ -446,8 +463,8 @@ export default function CustomizePage(): ReactElement {
446463 ) }
447464 </ div >
448465 ) : (
449- < div className = "relative z-10 flex w-full max-w-xl flex-col items-center justify-center rounded-[1.25rem] border border-dashed border-black/10 bg-gray-100/80 backdrop-blur-md dark:border-white/10 dark:bg-white/[0.03] px-6 py-12 text-center" >
450- < div className = "mb-4 flex h-14 w-14 items-center justify-center rounded-2xl border border-black/10 bg-gray-100/80 dark:border-white/10 dark:bg-white/[0.04] text-gray-500 dark:text-emerald-300/70" >
466+ < div className = "relative z-10 flex w-full max-w-xl flex-col items-center justify-center rounded-[1.25rem] border border-dashed border-black/10 bg-gray-100/80 backdrop-blur-md dark:border-white/10 dark:bg-white/3 px-6 py-12 text-center" >
467+ < div className = "mb-4 flex h-14 w-14 items-center justify-center rounded-2xl border border-black/10 bg-gray-100/80 dark:border-white/10 dark:bg-white/4 text-gray-500 dark:text-emerald-300/70" >
451468 < svg
452469 xmlns = "http://www.w3.org/2000/svg"
453470 className = "h-6 w-6"
0 commit comments