/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠSim i Pr amb os Ġ< sim i . pr amb os @ gmail . com > Ġ- ĠAll ĠRights ĠReserved Ċ Ġ* ĠCart ViewModel . kt Ċ Ġ* ĠBu ah in Ġ< https :// github . com / Sim i Pr amb os / bu ah in . git > Ċ Ġ* ĠUI ĠDesign Ġby ĠA fs ar Ġ< https :// www . fig ma . com / community / file / 8 8 2 6 4 5 0 0 7 9 5 6 3 3 7 2 6 1 > Ċ Ġ*/ Ċ Ċ package Ġcom . example . bu ah in . view model Ċ Ċ import Ġandroidx . compose . runtime . State Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . example . bu ah in . model . Cart Ċ import Ġcom . example . bu ah in . model . Product Ċ import Ġcom . example . bu ah in . repository . Cart Repository Ċ import Ġcom . example . bu ah in . util . Converter Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠCart ViewModel Ġ@ Inject Ġconstructor ( private Ġval Ġcart Repository : ĠCart Repository ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ state Ġ= Ġmutable State Of ( Cart State ()) ĊĠĠĠ Ġval Ġstate : ĠState < Cart State > Ġ= Ġ_ state ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcart Repository . listen Ġ{ Ġitems Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state . value Ġ= Ġ_ state . value . copy ( items Ġ= Ġitems ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġcart Repository . close () ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Event ( event : ĠCart Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCart Event . Qty Changed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġ_ state . value . items . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcart Ġ= Ġitems [ event . index ]. copy ( qty Ġ= Ġevent . qty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ event . index ] Ġ= Ġcart ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state . value Ġ= Ġ_ state . value . copy ( items Ġ= Ġitems ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcart Repository . change Q yt ( cart . id , Ġevent . qty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCart Event . Cart Removed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġ_ state . value . items . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcart Ġ= Ġitems . remove At ( event . index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state . value Ġ= Ġ_ state . value . copy ( items Ġ= Ġitems ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcart Repository . remove ( cart . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCart Event . Cart Added Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġ_ state . value . items . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġitems . indexOf First Ġ{ Ġit . product . id Ġ== Ġevent . product . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . add ( Cart ("", Ġevent . product , Ġevent . qty )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ index ] Ġ= Ġitems [ index ]. copy ( qty Ġ= Ġevent . qty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state . value Ġ= Ġ_ state . value . copy ( items Ġ= Ġitems ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcart Repository . create OrUpdate ( event . product , Ġevent . qty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠCart State ( ĊĠĠĠ Ġval Ġitems : ĠList < Cart > Ġ= Ġempty List (), Ċ ) Ġ{ ĊĠĠĠ Ġval Ġtotal : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġitems . fold ( 0 f ) Ġ{ Ġvalue , Ġcart Ġ-> Ġvalue Ġ+ Ġcart . subtotal () Ġ} ĊĠĠĠ Ġval Ġtotal Id r : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠConverter . idr ( total ) Ċ } Ċ Ċ sealed Ġclass ĠCart Event Ġ{ ĊĠĠĠ Ġdata Ġclass ĠQ ty Changed ( val Ġindex : ĠInt , Ġval Ġqty : ĠInt ) Ġ: ĠCart Event () ĊĠĠĠ Ġdata Ġclass ĠCart Removed ( val Ġindex : ĠInt ) Ġ: ĠCart Event () ĊĠĠĠ Ġdata Ġclass ĠCart Added ( val Ġproduct : ĠProduct , Ġval Ġqty : ĠInt ) Ġ: ĠCart Event () Ċ }