package Ġcom . va ib hav . health ify . ui . home Screen . dashboard Screen . sleep Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . va ib hav . health ify . data . models . local . Sleep Ċ import Ġcom . va ib hav . health ify . data . repo . Auth Repo Ċ import Ġcom . va ib hav . health ify . data . repo . Sleep Repo Ċ import Ġcom . va ib hav . health ify . util .* Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠSleep Dashboard ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġsleep Repo : ĠSleep Repo , ĊĠĠĠ Ġprivate Ġval Ġauth Repo : ĠAuth Repo Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ ui State Ġ= ĠMutable State Flow ( Sleep Dashboard Screen State ()) ĊĠĠĠ Ġval Ġui State : ĠState Flow < Sleep Dashboard Screen State > Ġ= Ġ_ ui State ĊĊĠĠĠ Ġprivate Ġval Ġ_ events Ġ= ĠMutable Shared Flow < Sleep Dashboard Screen Events >() ĊĠĠĠ Ġval Ġevents : ĠShared Flow < Sleep Dashboard Screen Events > Ġ= Ġ_ events ĊĊĠĠĠ Ġprivate Ġvar Ġuser Ġ= ĊĠĠĠĠĠĠĠ Ġauth Repo . getUser Data Flow (). state In ( viewModel Scope , ĠSh aring Started . E ager ly , Ġnull ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcollect UserData () ĊĠĠĠĠĠĠĠ Ġcollect Sleep Logs () ĊĠĠĠĠĠĠĠ Ġget F ot d () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget F ot d () Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf ot d Ġ= Ġsleep Repo . getF OT D () ĊĠĠĠĠĠĠĠ Ġ_ ui State . emit ( ui State . value . copy ( fact Of The Day Ġ= Ġf ot d )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Add Sleep Pressed () Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ ui State . emit ( ui State . value . copy ( is Add Sleep Button Enabled Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ_ events . emit ( Sleep Dashboard Screen Events . Open Add Sleep Dialog ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Loading () Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ ui State . emit ( ui State . value . copy ( isLoading Ġ= Ġtrue )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Loading () Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ ui State . emit ( ui State . value . copy ( isLoading Ġ= Ġfalse )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Dialog Closed () Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ ui State . emit ( ui State . value . copy ( is Add Sleep Button Enabled Ġ= Ġtrue )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Sleep Selected ( sleep Duration : ĠInt ) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Sleep ( sleep Duration ) ĊĠĠĠĠĠĠĠ Ġadd Exp () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġadd Sleep ( sleep Duration : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Loading () ĊĠĠĠĠĠĠĠ Ġval Ġresource Ġ= Ġsleep Repo . insert Into Sleep Log ( get Sleep Model Class ( sleep Duration )) ĊĠĠĠĠĠĠĠ Ġstop Loading () ĊĠĠĠĠĠĠĠ Ġif Ġ( resource Ġis ĠResource . Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error ( resource ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġadd Exp () Ġ{ ĊĠĠĠĠĠĠĠ Ġauth Repo . increase User Exp ( SLEEP _ EXP ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect UserData () Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġuser . collect Ġ{ Ġuser Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ ui State . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State . value . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġit . username , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Amount Ġ= Ġit . sleep Limit . getHours From Minutes (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Sleep Logs () Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġsleep Repo . get Tod ays Sleep Logs (). collect Ġ{ Ġsleep Logs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal S le pt Ġ= Ġsleep Logs . sum Of Ġ{ Ġsleep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsleep . sleep Duration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġ( total S le pt . toFloat () Ġ/ Ġit . sleep Limit ) Ġ* Ġ 1 0 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ ui State . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State . value . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsleep Log Ġ= Ġsleep Logs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted Amount Ġ= Ġtotal S le pt . getHours From Minutes (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġprogress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg reeting Ġ= Ġget G reeting ( progress ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain G reeting Ġ= Ġget Main G reeting ( progress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sleep Model Class ( minutes : ĠInt ) Ġ= ĠSleep ( ĊĠĠĠĠĠĠĠ Ġsleep Duration Ġ= Ġminutes , ĊĠĠĠĠĠĠĠ Ġtime Stamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Error ( resource : ĠResource . Error <* >) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġwhen Ġ( resource . error Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ TYPE . NO _ INTER NET Ġ-> ĠSleep Dashboard Screen Events . Show No Internet Dialog ĊĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ TYPE . UNKNOWN Ġ-> ĠSleep Dashboard Screen Events . Show Toast ( resource . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ_ events . emit ( event ) ĊĠĠĠ Ġ} Ċ } Ċ