package Ġcom . ute ke . k mm . android . view . screen . product list Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroidx . compose . foundation . layout .* Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġcom . ute ke . k mm . android . view . screen . common . Error View Ċ import Ġcom . ute ke . k mm . android . view . screen . common . Loader View Ċ import Ġcom . ute ke . k mm . feature . common . Error State Ċ import Ġcom . ute ke . k mm . feature . product list . Product List Action Ċ import Ġcom . ute ke . k mm . feature . product list . Product List ViewModel Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . distinct Until Changed Ċ import Ġkotlinx . coroutines . flow . map Latest Ċ Ċ @ Experimental Cor outines Api Ċ @ Suppress Lint (" Flow Operator Inv oked In Composition ") Ċ @ Composable Ċ fun ĠProduct List Screen ( ĊĠĠĠ ĠviewModel : ĠProduct List ViewModel , ĊĠĠĠ Ġnav Controller : ĠNav Controller Ċ ) Ġ{ ĊĠĠĠ ĠLa unched Effect ( viewModel ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . handle ( Product List Action . Get List ) ĊĠĠĠ Ġ} ĊĠĠĠ ĠDis posable Effect ( viewModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĠviewModel . cancel () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġproduct States Ġby ĠviewModel . state Changes ĊĠĠĠĠĠĠĠ Ġ. map Latest Ġ{ Ġit . products Ġ} ĊĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠ Ġ. collect As State ( emptyList ()) ĊĊĠĠĠ Ġval Ġis Products Visible Ġby ĠviewModel . state Changes ĊĠĠĠĠĠĠĠ Ġ. map Latest Ġ{ Ġit . is Products Visible Ġ} ĊĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠ Ġ. collect As State ( false ) ĊĊĠĠĠ Ġval Ġis Loader Visible Ġby ĠviewModel . state Changes ĊĠĠĠĠĠĠĠ Ġ. map Latest Ġ{ Ġit . is Loader Visible Ġ} ĊĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠ Ġ. collect As State ( false ) ĊĊĠĠĠ Ġval Ġerror State Ġby ĠviewModel . state Changes ĊĠĠĠĠĠĠĠ Ġ. map Latest Ġ{ Ġit . error State Ġ} ĊĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠ Ġ. collect As State ( Error State ()) ĊĊĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Products Visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProduct ListView ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct States Ġ= Ġproduct States , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Product Click Ġ= Ġ{ ĠproductId Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . navigate (" products /$ productId ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Loader Visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoader View () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( error State . isVisible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError View ( message Ġ= Ġerror State . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }