@@ -214,43 +214,51 @@ export function SnippetEditor() {
214214 < form . Field
215215 name = "code"
216216 validators = { {
217- onBlur : ( { value } ) => {
217+ onChange : ( { value } ) => {
218+ const r = codeSchema . safeParse ( value . trim ( ) )
219+ return r . success ? undefined : r . error . issues [ 0 ] . message
220+ } ,
221+ onSubmit : ( { value } ) => {
218222 const r = codeSchema . safeParse ( value . trim ( ) )
219223 return r . success ? undefined : r . error . issues [ 0 ] . message
220224 } ,
221225 } }
222226 >
223227 { ( field ) => (
224- < div className = { cn ( field . state . meta . errors . length > 0 && "ring-1 ring-inset ring-destructive/40" ) } >
225- < form . Subscribe selector = { ( s ) => s . values . language } >
226- { ( language ) => (
227- < CodeMirror
228- value = { field . state . value }
229- onChange = { ( val ) => field . handleChange ( val ) }
230- theme = { vscodeDark }
231- extensions = { [
232- ...( getLanguageExtension ( language as Language )
233- ? [ getLanguageExtension ( language as Language ) ! ]
234- : [ ] ) ,
235- ] }
236- minHeight = "240px"
237- basicSetup = { {
238- lineNumbers : true ,
239- foldGutter : false ,
240- highlightActiveLine : true ,
241- autocompletion : true ,
242- } }
243- className = "text-sm"
244- style = { { fontFamily : "var(--font-mono, ui-monospace, monospace)" } }
245- />
246- ) }
247- </ form . Subscribe >
248- { field . state . meta . errors . length > 0 && (
249- < p className = "px-4 py-2 text-xs text-destructive bg-destructive/5" >
250- { String ( field . state . meta . errors [ 0 ] ) }
251- </ p >
228+ < form . Subscribe selector = { ( s ) => s . submissionAttempts } >
229+ { ( attempts ) => (
230+ < div className = { cn ( attempts > 0 && field . state . meta . errors . length > 0 && "ring-1 ring-inset ring-destructive/40" ) } >
231+ < form . Subscribe selector = { ( s ) => s . values . language } >
232+ { ( language ) => (
233+ < CodeMirror
234+ value = { field . state . value }
235+ onChange = { ( val ) => field . handleChange ( val ) }
236+ theme = { vscodeDark }
237+ extensions = { [
238+ ...( getLanguageExtension ( language as Language )
239+ ? [ getLanguageExtension ( language as Language ) ! ]
240+ : [ ] ) ,
241+ ] }
242+ minHeight = "240px"
243+ basicSetup = { {
244+ lineNumbers : true ,
245+ foldGutter : false ,
246+ highlightActiveLine : true ,
247+ autocompletion : true ,
248+ } }
249+ className = "text-sm"
250+ style = { { fontFamily : "var(--font-mono, ui-monospace, monospace)" } }
251+ />
252+ ) }
253+ </ form . Subscribe >
254+ { attempts > 0 && field . state . meta . errors . length > 0 && (
255+ < p className = "px-4 py-2 text-xs text-destructive bg-destructive/5" >
256+ { String ( field . state . meta . errors [ 0 ] ) }
257+ </ p >
258+ ) }
259+ </ div >
252260 ) }
253- </ div >
261+ </ form . Subscribe >
254262 ) }
255263 </ form . Field >
256264
0 commit comments