package Ġcom . element alist . nin j aw allet . presentation . search Ċ Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . element alist . nin j aw allet . common . Constants . curr 2 Ċ import Ġcom . element alist . nin j aw allet . common . Resource Ċ import Ġcom . element alist . nin j aw allet . domain . repository . Preferences Repository Ċ import Ġcom . element alist . nin j aw allet . domain . use _ cases . get _ coins _ params . Get Coins Params UseCase Ċ import Ġcom . element alist . nin j aw allet . presentation . ViewModel With SharedPreferences Access Ċ import Ġcom . element alist . nin j aw allet . presentation . components . Coin List State Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠSearch ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġget Coins Params UseCase : ĠGet Coins Params UseCase , ĊĠĠĠ Ġrepository : ĠPreferences Repository Ċ ) Ġ: ĠViewModel With SharedPreferences Access ( repository ) Ġ{ ĊĊĠĠĠ Ġvar Ġquery Ġ= Ġmutable State Of ("") ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġfun Ġon Query Change ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . query . value Ġ= Ġquery ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġstate Ġby Ġmutable State Of ( Coin List State ()) ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġget Coin sWith Params ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Ġ= Ġcurrency Selected . value Ġ?: Ġcurr 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġper _ page Ġ= Ġcoins Entered . value Ġ?: Ġ 2 5 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Coin sWith Params ( ĊĠĠĠĠĠĠĠ Ġcurrency : ĠString , ĊĠĠĠĠĠĠĠ Ġper _ page : ĠInt , ĊĠĠĠĠĠĠĠ Ġpage : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// the Ġclass ĠGet Coins UseCase Ġcan Ġbe Ġcalled Ġas Ġa Ġfunction Ġsince Ġwe Ġoverwrite Ġthe Ġinvoke Ġmethod ĊĠĠĠĠĠĠĠ Ġget Coins Params UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Ġ= Ġcurrency , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġper _ page Ġ= Ġper _ page , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Ġ= Ġpage ĊĠĠĠĠĠĠĠ Ġ). on Each Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoin List State ( coins Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . data ?. filter Ġ{ Ġcoin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin . name . contains ( query . value , Ġignore Case Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoin List State ( error Ġ= Ġresult . message Ġ?: Ġ" An Ġunexpected Ġerror Ġoccured ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoin List State ( isLoading Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( viewModel Scope )// Ġreturns Ġthe Ġflow Ġthat Ġemits Ġthe Ġresource Ġvalues Ġover Ġtime . ĠWe Ġmust Ġlaunch Ġit Ġas Ġa Ġcoroutine ! ĊĠĠĠ Ġ} Ċ } ĊĊ