package Ġcom . example . ed v ora _ android _ assignment . products . ui Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . example . ed v ora _ android _ assignment . common . models . Product Ċ import Ġcom . example . ed v ora _ android _ assignment . common . network . Resource Ċ import Ġcom . example . ed v ora _ android _ assignment . products . data . Products Repo Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . Internal Cor outines Api Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ @ Opt In ( Internal Cor outines Api :: class ) Ċ @ H ilt ViewModel Ċ class ĠProduct ViewModel Ġ@ Inject Ġconstructor ( private Ġval Ġrepo : ĠProducts Repo ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ loading Ġ= ĠMutable State Flow ( false ) ĊĠĠĠ Ġval Ġloading : ĠState Flow < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ loading ĊĊĠĠĠ Ġprivate Ġval Ġ_ error Ġ= ĠMutable State Flow ( false ) ĊĠĠĠ Ġval Ġerror : ĠState Flow < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ error ĊĊĠĠĠ Ġval Ġproduct Ġ= Ġrepo . get Products ĊĠĠĠ Ġval Ġstate Ġ= Ġrepo . get States ĊĠĠĠ Ġval Ġcity Ġ= Ġrepo . getC ities ĊĠĠĠ Ġval Ġsh oes Data Ġ= Ġrepo . filter By Category ("% Sh oes % ") ĊĠĠĠ Ġval Ġapple Data Ġ= Ġrepo . filter By Category ("% Apple % ") ĊĠĠĠ Ġval Ġtes la Data Ġ= Ġrepo . filter By Category ("% Tes la % ") ĊĠĠĠ Ġval Ġoil Data Ġ= Ġrepo . filter By Category ("% O il % ") ĊĠĠĠ Ġprivate Ġval Ġ_ filtered Data : ĠMutable State Flow < List < Product >> Ġ= ĠMutable State Flow ( listOf ()) ĊĠĠĠ Ġval Ġfiltered Data : ĠMutable State Flow < List < Product >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ filtered Data ĊĊĠĠĠ Ġsuspend Ġfun Ġfilter By City ( city : ĠString ) Ġ= Ġrepo . filter By City ( city ). collect Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ filtered Data . value Ġ= Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġfilter By State ( state : ĠString ) Ġ= Ġrepo . filter By State ( state ). collect Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ filtered Data . value Ġ= Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġfilter By Category ( category : ĠString ) Ġ= Ġrepo . filter By Category ("% ${ category }% "). collect Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ filtered Data . value Ġ= Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Products () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġsuspend Ġfun Ġrefresh Products () Ġ= Ġrepo . refresh Products (). collect Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( resource . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResource . Status . SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ loading . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResource . Status . ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ error . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ loading . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResource . Status . LOADING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ loading . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊĊ