package Ġcom . ba el . d ads . feature . home . screen . seen Ċ Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . ba el . d ads . domain . home . model . D ad Jo ke Ċ import Ġcom . ba el . d ads . domain . home . use case . F avor D ad Jo ke UseCase Ċ import Ġcom . ba el . d ads . domain . home . use case . Load Fav ored D ad Jo ke UseCase Ċ import Ġcom . ba el . d ads . domain . home . use case . Load Seen D ad Jo ke UseCase Ċ import Ġcom . ba el . d ads . domain . home . use case . Ob serve D ad Jo ke UseCase Ċ import Ġcom . ba el . d ads . library . presentation . ext . reduce Ċ import Ġcom . ba el . d ads . library . presentation . view model . Base ViewModel Ċ import Ġcom . ba el . d ads . shared . ext . find Success Ċ import Ġcom . ba el . d ads . shared . response . Response Ċ import Ġcom . ba el . d ads . shared . response . Response . Empty Ċ import Ġcom . ba el . d ads . shared . response . Response . Error Ċ import Ġcom . ba el . d ads . shared . response . Response . Loading Ċ import Ġcom . ba el . d ads . shared . response . Response . Success Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . filter Ċ import Ġkotlinx . coroutines . flow . flow On Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠEr ick Sum argo Ġon Ġ 0 1 / 0 1 / 2 1 . Ċ Ġ*/ Ċ Ċ @ H ilt ViewModel Ċ internal Ġclass ĠViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġinit State : ĠState , ĊĠĠĠ Ġsaved State Handle : ĠSaved State Handle , ĊĠĠĠ Ġprivate Ġval Ġload Seen D ad Jo ke UseCase : ĠLoad Seen D ad Jo ke UseCase , ĊĠĠĠ Ġprivate Ġval Ġload Fav ored D ad Jo ke UseCase : ĠLoad Fav ored D ad Jo ke UseCase , ĊĠĠĠ Ġprivate Ġval Ġobserve D ad Jo ke UseCase : ĠOb serve D ad Jo ke UseCase , ĊĠĠĠ Ġprivate Ġval Ġfavor D ad Jo ke UseCase : ĠF avor D ad Jo ke UseCase Ċ ) Ġ: ĠBase ViewModel < State , ĠEvent >( init State , Ġsaved State Handle ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġload Seen D ad Jo ke Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġload Seen D ad Jo ke ( ĊĠĠĠĠĠĠĠ Ġterm : ĠString , ĊĠĠĠĠĠĠĠ Ġcursor : ĠD ad Jo ke ?, ĊĠĠĠĠĠĠĠ Ġlimit : ĠInt , ĊĠĠĠĠĠĠĠ Ġfav ored Only : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload Seen D ad Jo ke Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġload Seen D ad Jo ke Job Ġ= Ġif Ġ(! fav ored Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Seen D ad Jo ke UseCase ( term , Ġcursor , Ġlimit ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Fav ored D ad Jo ke UseCase ( term , Ġcursor , Ġlimit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flow On ( context Ġ= Ġthread . io ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Response ( cursor , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flow On ( context Ġ= Ġthread . default ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( scope Ġ= ĠviewModel Scope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġobserve D ad Jo ke ( dad Jo ke : ĠD ad Jo ke ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve D ad Jo ke UseCase ( dad Jo ke ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flow On ( context Ġ= Ġthread . io ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġis ĠSuccess ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( response Ġas ĠSuccess ). data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Each (:: render Updated D ad Jo ke ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flow On ( context Ġ= Ġthread . default ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfavor D ad Jo ke ( dad Jo ke : ĠD ad Jo ke , Ġfav ored : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfavor D ad Jo ke UseCase ( dad Jo ke , Ġfav ored ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flow On ( context Ġ= Ġthread . io ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( scope Ġ= ĠviewModel Scope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoggle Favorite Filter ( is Activated : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= Ġstate . reduce Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( is Favorite Filter Activated Ġ= Ġis Activated ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrender ( newState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Favorite Filter Activated (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . is Favorite Filter Activated ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Response ( ĊĠĠĠĠĠĠĠ Ġcursor : ĠD ad Jo ke ?, ĊĠĠĠĠĠĠĠ Ġresponse : ĠResponse < List < D ad Jo ke >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= Ġstate . reduce Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoading Ġ-> Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponses Ġ= ĠlistOf ( response ). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġresponses . drop Last While Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠError Ġ|| Ġit Ġis ĠEmpty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ+ Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠError Ġ-> Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponses Ġ= ĠlistOf ( response ). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġresponses . drop Last While Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠLoading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ+ Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEmpty Ġ-> Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponses Ġ= ĠlistOf ( response ). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġresponses . drop Last While Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠLoading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ+ Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSuccess Ġ-> Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponses Ġ= ĠlistOf ( response ). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuccess ( data Ġ= Ġresponses . find Success ()?. data . or Empty () Ġ+ Ġresponse . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrender ( newState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Updated D ad Jo ke ( dad Jo ke : ĠD ad Jo ke ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġstate . responses . find Success ()?. data . or Empty (). to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġdata . indexOf First Ġ{ Ġitem Ġ-> Ġitem . id Ġ== Ġd ad Jo ke . id Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 Ġ|| Ġdata [ index ] Ġ== Ġd ad Jo ke ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( state . is Favorite Filter Activated Ġ&& Ġ! dad Jo ke . fav ored ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . remove At ( index ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index ] Ġ= Ġd ad Jo ke ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= Ġstate . reduce Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( responses Ġ= ĠlistOf ( Empty . take If Ġ{ Ġdata . isEmpty () Ġ} Ġ?: ĠSuccess ( data ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrender ( newState ) ĊĠĠĠ Ġ} Ċ } Ċ