package Ġio . github . kar to ff el sup . n unt ius . ui . user Ċ Ċ import Ġandroidx . compose . foundation . Text Ċ import Ġandroidx . compose . foundation . current TextStyle Ċ import Ġandroidx . compose . foundation . layout . Column Ċ import Ġandroidx . compose . foundation . layout . Inner Padding Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . material . Experimental Material Api Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . focus . Experimental Focus Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . geometry . Size Ċ import Ġandroidx . compose . ui . graphics . Outline Ċ import Ġandroidx . compose . ui . graphics . Shape Ċ import Ġandroidx . compose . ui . res . string Resource Ċ import Ġandroidx . compose . ui . text . input . TextField Value Ċ import Ġandroidx . compose . ui . text . style . Text Align Ċ import Ġandroidx . compose . ui . unit . Density Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . ui . tool ing . preview . Preview Ċ import Ġio . github . kar to ff el sup . n unt ius . R Ċ import Ġio . github . kar to ff el sup . n unt ius . api . user . result . Failed Login Ċ import Ġio . github . kar to ff el sup . n unt ius . api . user . result . Login Result Ċ import Ġio . github . kar to ff el sup . n unt ius . api . user . result . Successful Login Ċ import Ġio . github . kar to ff el sup . n unt ius . data . user . UserService Ċ import Ġio . github . kar to ff el sup . n unt ius . ui . AppState Ċ import Ġio . github . kar to ff el sup . n unt ius . ui . Navigation ViewModel Ċ import Ġio . github . kar to ff el sup . n unt ius . ui . Screen Ċ import Ġio . github . kar to ff el sup . n unt ius . ui . components . Center ed Row Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Connect Exception Ċ Ċ data Ġclass ĠLogin Error ( ĊĠĠĠ Ġval Ġtext : ĠString Ġ= Ġ"" Ċ ) Ċ Ċ object ĠUnder line Ġ: ĠShape Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate Outline ( size : ĠSize , Ġdensity : ĠD ensity ): ĠOut line Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠOut line . Rectangle ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . height Ġ- Ġdensity . density , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Opt In ( Experimental Focus :: class ) Ċ @ Composable Ċ fun ĠUser Login Screen ( ĊĠĠĠ Ġapp State : ĠApp State , ĊĠĠĠ Ġinner Padding : ĠInner Padding , ĊĠĠĠ Ġnavigation ViewModel : ĠNavigation ViewModel Ċ ) Ġ{ ĊĠĠĠ Ġapp State . userData ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigation ViewModel . navigate To ( Screen . Home ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġlogin Error Ġby Ġremember Ġ{ Ġmutable State Of ( Login Error ("")) Ġ} ĊĊĠĠĠ Ġval Ġemail Field State Ġ= ĊĠĠĠĠĠĠĠ ĠField State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ" email Field ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠText FieldValue (""), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ= Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . isEmpty () Ġ-> ĠValidation Result . Invalid (" This Ġfield Ġis Ġrequired .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! value . matches ("^ .* @ ar ml \\. com $ ". to Regex ()) Ġ-> ĠValidation Result . Invalid (" Must Ġbe Ġa Ġ@ ar ml . com ĠEmail ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠValidation Result . Valid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġval Ġpassword Field State Ġ= ĊĠĠĠĠĠĠĠ ĠField State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ" password Field ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠText FieldValue (""), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ= Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . isEmpty () Ġ-> ĠValidation Result . Invalid (" This Ġfield Ġis Ġrequired .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . length Ġ< Ġ 3 Ġ-> ĠValidation Result . Invalid (" Password Ġmust Ġat Ġleast Ġbe Ġ 3 Ġcharacters Ġlong .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠValidation Result . Valid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġval Ġserver Connect Message Ġ= Ġstring Resource ( R . string . server _ connect _ error ) ĊĠĠĠ Ġval Ġinternal Error Ġ= Ġstring Resource ( R . string . internal _ error ) ĊĠĠĠ Ġval Ġform State : ĠLogin Form State Ġ= Ġremember Ġ{ ĊĠĠĠĠĠĠĠ ĠLogin Form State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail Field State Ġ= Ġemail Field State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Field State Ġ= Ġpassword Field State ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmail Ġ= Ġemail Field State . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpw Ġ= Ġpassword Field State . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReset Ġerrors Ġon Ġsubmit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Error Ġ= Ġlogin Error . copy ( text Ġ= Ġ"") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠLogin Result Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUserService . login ( mail . text , Ġpw . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io ex : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( io ex Ġis ĠConnect Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFailed Login ( server Connect Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( io ex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFailed Login ( internal Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSuccessful Login Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation ViewModel . navigate To ( Screen . Home ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFailed Login Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Error Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Error . copy ( text Ġ= Ġ" Login Ġfailed : Ġ${ result . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠColumn ( modifier Ġ= ĠModifier . padding ( inner Padding )) Ġ{ ĊĠĠĠĠĠĠĠ ĠLogin Form ( form State Ġ= Ġform State ) ĊĠĠĠĠĠĠĠ ĠCenter ed Row Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( login Error . text . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġlogin Error . text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= Ġcurrent TextStyle (). copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextAlign Ġ= ĠText Align . Center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠMaterial Theme . colors . error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Opt In ( Experimental Material Api :: class ) Ċ @ Preview Ċ @ Composable Ċ fun ĠLogin Preview () Ġ{ ĊĠĠĠ ĠUser Login Screen ( AppState (), ĠInner Padding (), ĠNavigation ViewModel ( Saved State Handle ())) Ċ } Ċ