package Ġco . touch lab . k amp kit . models Ċ Ċ import Ġco . touch lab . k amp kit . db . B reed Ċ import Ġco . touch lab . ker mit . Logger Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . flow . combine Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . update Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠB reed ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġb reed Repository : ĠB reed Repository , ĊĠĠĠ Ġlog : ĠLogger Ċ ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= Ġlog . with Tag (" B reed Common ViewModel ") ĊĊĠĠĠ Ġprivate Ġval Ġmutable B reed State : ĠMutable State Flow < B reed ViewState > Ġ= ĊĠĠĠĠĠĠĠ ĠMutable State Flow ( B reed ViewState ( isLoading Ġ= Ġtrue )) ĊĊĠĠĠ Ġval Ġb reed State : ĠState Flow < B reed ViewState > Ġ= Ġmutable B reed State ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve B reed s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . v (" Clear ing ĠB reed ViewModel ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve B reed s () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRefresh Ġb reed s , Ġand Ġemit Ġany Ġexception Ġthat Ġwas Ġthrown Ġso Ġwe Ġcan Ġhandle Ġit Ġdownstream ĊĠĠĠĠĠĠĠ Ġval Ġrefresh Flow Ġ= Ġflow < Throwable ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb reed Repository . refresh B reed s If St ale () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcombine ( refresh Flow , Ġb reed Repository . getB reed s ()) Ġ{ Ġthrowable , Ġb reed s Ġ-> Ġthrowable Ġto Ġb reed s Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġ( error , Ġb reed s ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable B reed State . update Ġ{ Ġprevious State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġdownload Ġb reed Ġlist " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious State . error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB reed ViewState ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb reed s Ġ= Ġb reed s . take If Ġ{ Ġit . isNotEmpty () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= ĠerrorMessage . take If Ġ{ Ġb reed s . isEmpty () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisEmpty Ġ= Ġb reed s . isEmpty () Ġ&& ĠerrorMessage Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh B reed s (): ĠJob Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġloading Ġstate , Ġwhich Ġwill Ġbe Ġcleared Ġwhen Ġthe Ġrepository Ġre - em its ĊĠĠĠĠĠĠĠ Ġmutable B reed State . update Ġ{ Ġit . copy ( isLoading Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . v Ġ{ Ġ" refresh B reed s " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb reed Repository . refresh B reed s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle B reed Error ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate B reed Favorite ( bre ed : ĠB reed ): ĠJob Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb reed Repository . update B reed Favorite ( bre ed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle B reed Error ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . e ( throwable ) Ġ{ Ġ" Error Ġdownloading Ġb reed Ġlist " Ġ} ĊĠĠĠĠĠĠĠ Ġmutable B reed State . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . bre eds . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB reed ViewState ( error Ġ= Ġ" Unable Ġto Ġrefresh Ġb reed Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJust Ġlet Ġit Ġfail Ġsilently Ġif Ġwe Ġhave Ġa Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( isLoading Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠB reed ViewState ( ĊĠĠĠ Ġval Ġb reed s : ĠList < B reed >? Ġ= Ġnull , ĊĠĠĠ Ġval Ġerror : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġval ĠisLoading : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġval ĠisEmpty : ĠBoolean Ġ= Ġfalse Ċ ) Ċ