package Ġcom . ch uo . timetable . new user Ċ Ċ import Ġandroid . util . Patterns Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . ch uo . timetable . base . Base ViewModel Ċ import Ġcom . ch uo . timetable . model . Schedule Ċ import Ġcom . ch uo . timetable . model . Teacher Ċ import Ġcom . ch uo . timetable . repository . Firebase Repository Ċ import Ġcom . ch uo . timetable . ui . Screen Navigator Ċ import Ġcom . ch uo . timetable . view model . Ass isted Saved State ViewModel Factory Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . firebase . auth . Auth Result Ċ import Ġcom . google . firebase . firestore . Document Reference Ċ import Ġcom . squareup . inject . ass isted . Ass isted Ċ import Ġcom . squareup . inject . ass isted . Ass isted Inject Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . regex . Pattern Ċ import Ġjavax . inject . Inject Ċ Ċ @ Experimental Cor outines Api Ċ class ĠNew Teacher ViewModel Ġ@ Ass isted Inject ĊĠĠĠ Ġconstructor ( firebase Repository : ĠFirebase Repository , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State : ĠNew Teacher ViewState , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Ass isted Ġprivate Ġval Ġsaved State Handle : ĠSaved State Handle ĊĠĠ Ġ) Ġ: ĠBase ViewModel < New Teacher ViewState >( firebase Repository , Ġview State ) Ġ{ ĊĊĠĠĠ Ġ@ Ass isted Inject . Factory ĊĠĠĠ Ġinterface ĠFactory Ġ: ĠAss isted Saved State ViewModel Factory < @ Jvm Suppress W ild cards ĠNew Teacher ViewModel > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( saved State Handle : ĠSaved State Handle ): ĠNew Teacher ViewModel ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġhandle Submit Button Clicked ( username : ĠString , firstName : String , ĠlastName : String Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister With Email And Password ( username , ĠfirstName , ĠlastName ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġteacher List (){ ĊĠĠĠĠĠĠĠ Ġobserve Teacher List () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġ Ġfun Ġobserve Teacher List (){ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Repository . observe T utors (). collect Ġ{ Ġresult : ĠResult < List < Teacher > ?> -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Success Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . te achers LiveData Ġ= Ġfirebase Repository . observe Teacher LiveData () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ui () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Failure Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( result . exception OrNull ()?. message !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġregister With Email And Password ( username : ĠString , firstName : String , ĠlastName : String ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! validate ( username , ĠfirstName , ĠlastName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ui () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview State . errorMessage Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġview State . progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġview State . submit Enabled Ġ Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġupdate Ui () ĊĊĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch { ĊĠĠĠĠĠĠĠĠĠ Ġfirebase Repository . register Teacher ( username ). collect Ġ{ result : Result < Auth Result > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Success ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Repository . user () !!. send Email Verification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Repository . auth ()?. send Password Reset Email ( username ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . submit Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ui () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Failure ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . submit Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . errorMessage Ġ= result . exception OrNull ()?. message !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ui () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġhandle Create Teacher Mail ( email : ĠString , ĠfirstName : ĠString , ĠlastName : ĠString ){ ĊĠĠĠĠĠĠĠ Ġcreate Teacher Mail ( email , ĠfirstName , ĠlastName ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġ Ġfun Ġcreate Teacher Mail ( email : ĠString , ĠfirstName : ĠString , ĠlastName : ĠString ){ ĊĠĠĠĠĠĠ Ġval Ġmail Map Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠ Ġ" email " Ġto Ġemail , ĊĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġ"$ firstName Ġ$ lastName " ĊĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Repository . add Te achers Mail ( mail Map ). collect Ġ{ result : Result < Document Reference > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Success ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Teacher ĠMail Ġadded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Failure ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . errorMessage Ġ= result . exception OrNull ()?. message !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġhandle Do On Create User ( firstName : ĠString , ĠlastName : ĠString , te achers : ĠList < Teacher > ){ ĊĠĠĠĠĠĠĠ Ġdo On Create User ( firstName , ĠlastName , Ġte achers ) ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġdo On Create User ( firstName : ĠString , ĠlastName : ĠString , te achers : ĠList < Teacher > ){ ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġteacher Map Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġ"$ firstName Ġ$ lastName " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Repository . add Te achers List ( teacher Map ). collect Ġ{ result : Result < Document Reference > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Success ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Teacher Ġadded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Failure ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . errorMessage Ġ= result . exception OrNull ()?. message !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( te achers . size Ġ== Ġ 2 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Admin ( firstName , ĠlastName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠĠ Ġprivate Ġ Ġfun Ġcreate Admin ( firstName : ĠString , ĠlastName : ĠString ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Repository . add Admin (). collect Ġ{ result : Result < Void > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Success ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . ack Admin Ġ= Ġ" User Ġ$ firstName Ġ$ lastName Ġis Ġin Ġcharge Ġof Ġthe Ġtime table " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ui () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Failure ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . errorMessage Ġ= result . exception OrNull ()?. message !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ui () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊ ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġvalidate ( email : ĠString , ĠfirstName : String , ĠlastName : String ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( firstName . isEmpty () Ġ|| ĠlastName . isEmpty () Ġ|| Ġemail . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . view State . errorMessage Ġ= Ġ" Please Ġfill Ġout Ġall Ġthe Ġfields " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Patterns . EMAIL _ ADDRESS . matcher ( email ). matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . view State . errorMessage Ġ= Ġ" Please Ġenter Ġa Ġvalid Ġemail " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview State . errorMessage Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġview State . progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊ