@@ -4,10 +4,12 @@ import { useForm } from 'react-hook-form';
44import { useRouter } from 'next/navigation' ;
55import { useEntryStore } from '../hooks/useEntryStore' ;
66import React , { useEffect , useState } from 'react' ;
7- import { TemplateName , templatesDictionary } from " ../config/templates" ;
7+ import { TemplateName , templatesDictionary } from ' ../config/templates' ;
88import Image from 'next/image' ;
99
1010import styles from '../styles/register.module.scss' ;
11+ import { Tabs } from 'radix-ui' ;
12+ import slugify from 'slugify' ;
1113
1214export default function Page ( ) {
1315 const router = useRouter ( ) ;
@@ -20,14 +22,20 @@ export default function Page() {
2022 const { register, handleSubmit, formState } = useForm ( {
2123 defaultValues : { fullName : entry ?. fullName , templateName : '' } ,
2224 } ) ;
25+ const [ error , setError ] = useState < string | null > ( null ) ;
2326
2427 const onSubmit = async ( data : { [ x : string ] : any } ) => {
25- updateIsLoading ( true ) ;
26- updateFullName ( data . fullName ) ;
27- updateTemplate ( isTrainningSession ? selectedTemplate : data . templateName ) ;
28-
29- // TODO : Create user in DB
28+ setError ( null ) ;
29+ if ( ! isTrainningSession ) {
30+ const isValidTemplate = Object . keys ( templatesDictionary ) . includes ( data . templateName )
31+ if ( ! isValidTemplate ) {
32+ return setError ( 'Invalid template name' ) ;
33+ }
34+ }
3035
36+ updateIsLoading ( true ) ;
37+ updateFullName ( slugify ( data . fullName , { lower : true , strict : true , trim : true } ) ) ;
38+ updateTemplate ( isTrainningSession ? selectedTemplate : data . templateName ) ;
3139 updateId ( 0 ) ;
3240 updateIsLoading ( false ) ;
3341
@@ -52,49 +60,68 @@ export default function Page() {
5260 className = { formState . errors . fullName ? styles . isWizz : '' }
5361 required
5462 />
55- < div className = { styles . trainingToggle } >
56- < input
57- id = 'toggle-template-select'
58- type = 'checkbox'
59- checked = { isTrainningSession }
60- onChange = { ( e ) => setIsTrainningSession ( e . target . checked ) }
61- />
62- < label htmlFor = 'toggle-template-select' > Check for training session</ label >
63- </ div >
63+ < h3 > Select a mode</ h3 >
64+ < Tabs . Root className = { styles . tabsRoot } defaultValue = 'training' onValueChange = { value => setIsTrainningSession ( value === 'training' ) } >
65+ < Tabs . List
66+ className = { styles . tabsList }
67+ aria-label = 'Manage your account'
68+ >
69+ < Tabs . Trigger className = { styles . tabsTrigger } value = 'training' >
70+ < h3 > Training Mode</ h3 >
71+ </ Tabs . Trigger >
72+ < Tabs . Trigger className = { styles . tabsTrigger } value = 'competition' >
73+ < h3 > Competition Mode</ h3 >
74+ </ Tabs . Trigger >
75+ </ Tabs . List >
76+ < Tabs . Content className = { styles . tabsContent } value = 'training' >
77+ < fieldset >
78+ < h3 > Select a template</ h3 >
79+ < select
80+ value = { selectedTemplate }
81+ onChange = { ( e ) =>
82+ setSelectedTemplate ( e . target . value as TemplateName )
83+ }
84+ >
85+ { Object . keys ( templatesDictionary )
86+ . filter (
87+ ( name ) =>
88+ ! templatesDictionary [
89+ name as keyof typeof templatesDictionary
90+ ] . private
91+ )
92+ . map ( ( name ) => (
93+ < option key = { name } value = { name } >
94+ { name }
95+ </ option >
96+ ) ) }
97+ </ select >
98+ < Image
99+ priority
100+ src = { templatesDictionary [ selectedTemplate ] . referenceImage }
101+ alt = 'Image template reference'
102+ width = { 200 }
103+ height = { 200 }
104+ />
105+ </ fieldset >
106+ </ Tabs . Content >
107+ < Tabs . Content className = { styles . tabsContent } value = 'competition' >
108+ < fieldset >
109+ < h3 > Please set session code</ h3 >
110+ < input
111+ type = 'text'
112+ placeholder = 'Session Password'
113+ { ...register ( 'templateName' , {
114+ required : ! isTrainningSession ,
115+ max : 80 ,
116+ } ) }
117+ className = { formState . errors . fullName ? styles . isWizz : '' }
118+ required = { isTrainningSession }
119+ />
120+ { error && < span className = { styles . error } > { error } </ span > }
121+ </ fieldset >
122+ </ Tabs . Content >
123+ </ Tabs . Root >
64124
65- { isTrainningSession ? (
66- < >
67- < h3 > Select a template</ h3 >
68- < select
69- value = { selectedTemplate }
70- onChange = { ( e ) => setSelectedTemplate ( e . target . value as TemplateName ) }
71- >
72- { Object . keys ( templatesDictionary ) . map ( ( name ) => (
73- < option key = { name } value = { name } >
74- { name }
75- </ option >
76- ) ) }
77- </ select >
78- < Image
79- priority
80- src = { templatesDictionary [ selectedTemplate ] . referenceImage }
81- alt = 'Image template reference'
82- width = { 200 }
83- height = { 200 }
84- />
85- </ >
86- ) : (
87- < >
88- < h3 > Please set session code</ h3 >
89- < input
90- type = 'text'
91- placeholder = 'Session Password'
92- { ...register ( 'templateName' , { required : ! isTrainningSession , max : 80 } ) }
93- className = { formState . errors . fullName ? styles . isWizz : '' }
94- required = { ! isTrainningSession }
95- />
96- </ >
97- ) }
98125 < input type = 'submit' className = 'button' />
99126 </ form >
100127 </ >
0 commit comments