package Ġpro . tam bo vt se v . k mm rest food . android . presentation . recipe _ list Ċ Ċ import Ġandroidx . compose . runtime . Mutable State Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġpro . tam bo vt se v . k mm rest food . domain . model . Generic MessageInfo Ċ import Ġpro . tam bo vt se v . k mm rest food . domain . model . Positive Action Ċ import Ġpro . tam bo vt se v . k mm rest food . domain . model . Recipe Ċ import Ġpro . tam bo vt se v . k mm rest food . domain . model . UI ComponentType Ċ import Ġpro . tam bo vt se v . k mm rest food . domain . util . Generic MessageInfo Queue Util Ċ import Ġpro . tam bo vt se v . k mm rest food . domain . util . Queue Ċ import Ġpro . tam bo vt se v . k mm rest food . inter actors . recipe _ list . Search Recipes Ċ import Ġpro . tam bo vt se v . k mm rest food . presentation . recipe _ list . Food Category Ċ import Ġpro . tam bo vt se v . k mm rest food . presentation . recipe _ list . Recipe List Events Ċ import Ġpro . tam bo vt se v . k mm rest food . presentation . recipe _ list . Recipe List State Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . collections . ArrayList Ċ Ċ @ H ilt ViewModel Ċ class ĠRecipe List ViewModel Ċ @ Inject Ċ constructor ( ĊĠĠĠ Ġprivate Ġval Ġsaved State Handle : ĠSaved State Handle , Ġ// Ġdon 't Ġneed Ġfor Ġthis ĠVM ĊĠĠĠ Ġprivate Ġval Ġsearch Recipes : ĠSearch Recipes , Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġval Ġstate : ĠMutable State < Recipe List State > Ġ= Ġmutable State Of ( Recipe List State ()) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġon Trigger Event ( Recipe List Events . Load Recipes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Trigger Event ( event : ĠRecipe List Events ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecipe List Events . Load Recipes Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Recipes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecipe List Events . Next Page Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecipe List Events . New Search Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Search () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRecipe List Events . On Update Query Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġstate . value . copy ( query Ġ= Ġevent . query , Ġselected Category Ġ= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRecipe List Events . On Select Category Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSelect Category ( event . category ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRecipe List Events . On Remove Head Message From Queue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Head Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Info Builder Ġ= ĠGeneric MessageInfo . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. id ( UUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. title (" Invalid ĠEvent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ui ComponentType ( UI ComponentType . Dialog ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. description (" Something Ġwent Ġwrong .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend To Message Queue ( messageInfo Ġ= Ġmessage Info Builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonSelect Category ( category : ĠFood Category ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġstate . value . copy ( selected Category Ġ= Ġcategory , Ġquery Ġ= Ġcategory . value ) ĊĠĠĠĠĠĠĠ Ġnew Search () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnew Search () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġstate . value . copy ( page Ġ= Ġ 1 , Ġrecipes Ġ= ĠlistOf ()) ĊĠĠĠĠĠĠĠ Ġload Recipes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Page () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġstate . value . copy ( page Ġ= Ġstate . value . page Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġload Recipes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Recipes () Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Recipes . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Ġ= Ġstate . value . page , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Ġ= Ġstate . value . query ĊĠĠĠĠĠĠĠ Ġ). collect Common ( viewModel Scope ) Ġ{ Ġdata State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġstate . value . copy ( isLoading Ġ= Ġdata State . isLoading ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata State . data ?. let Ġ{ Ġrecipes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Recipes ( recipes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata State . message ?. let Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Info Builder Ġ= ĠGeneric MessageInfo . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. id ( UUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. title (" Invalid ĠEvent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ui ComponentType ( UI ComponentType . Dialog ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. description ("$ message ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend To Message Queue ( messageInfo Builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend Recipes ( recipes : ĠList < Recipe >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurr Ġ= ĠArrayList ( state . value . recipes ) ĊĠĠĠĠĠĠĠ Ġcurr . addAll ( recipes ) ĊĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġstate . value . copy ( recipes Ġ= Ġcurr ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend To Message Queue ( messageInfo : ĠGeneric MessageInfo . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! Generic MessageInfo Queue Util (). does Message Already Exist In Queue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Ġ= Ġstate . value . queue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Info Ġ= Ġmessage Info . build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= Ġstate . value . queue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( messageInfo . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġstate . value . copy ( queue Ġ= Ġqueue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Head Message () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= Ġstate . value . queue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . remove () Ġ// Ġcan Ġthrow Ġexception Ġif Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġstate . value . copy ( queue Ġ= ĠQueue ( mutable ListOf ())) Ġ// Ġforce Ġre compose ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġstate . value . copy ( queue Ġ= Ġqueue ) ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnothing Ġto Ġremove , Ġqueue Ġis Ġempty ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊĊĊĊĊĊ