package Ġcom . tak use mb a . je th ub . base . view model Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . tak use mb a . je th ub . base . ErrorHandler Ċ import Ġcom . tak use mb a . je th ub . model . Repo Ċ import Ġcom . tak use mb a . je th ub . repository . Repo Repository Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* Ġ[ ViewModel ] Ġto Ġstore Ġand Ġmanage Ġuser - related Ġdata . Ċ Ġ* ĠThis Ġshould Ġbe ĠActivity - Scope , Ġbecause Ġthe Ġdata Ġis Ġused Ġacross Ġscreens . Ċ Ġ*/ Ċ @ H ilt ViewModel Ċ class ĠUser ViewModel Ġ@ Inject Ġconstructor ( ĊĠ Ġprivate Ġval Ġrepo Repository : ĠRepo Repository , ĊĠ Ġprivate Ġval ĠerrorHandler : ĠError Handler Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠ Ġprivate Ġval Ġ_ ui State : ĠMutable State Flow < User Ui State > Ġ= ĠMutable State Flow ( User Ui State . EMPTY ) ĊĠ Ġval Ġui State : ĠState Flow < User Ui State > Ġ= Ġ_ ui State ĊĊĠ Ġinit Ġ{ ĊĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠ Ġrepo Repository . findAll P ins () ĊĠĠĠĠĠ Ġ}. on Success Ġ{ Ġrepos Ġ-> ĊĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value . copy ( pinned Repos Ġ= Ġrepos ) ĊĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠ ĠerrorHandler . handleError ( error ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġpin ( repo : ĠRepo ) Ġ{ ĊĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠ Ġrepo Repository . pin ( repo ) ĊĠĠĠĠĠĠĠ Ġval Ġrepositories Ġ= Ġ_ ui State . value . pinned Repos . to Mutable List () ĊĠĠĠĠĠĠĠ Ġrepositories . apply Ġ{ Ġadd ( repo ) Ġ} ĊĠĠĠĠĠ Ġ}. on Success Ġ{ Ġrepos Ġ-> ĊĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value . copy ( pinned Repos Ġ= Ġrepos ) ĊĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠ ĠerrorHandler . handleError ( error ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġun pin ( repo : ĠRepo ) Ġ{ ĊĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠ Ġrepo Repository . un pin ( repo ) ĊĠĠĠĠĠĠĠ Ġval Ġrepositories Ġ= Ġ_ ui State . value . pinned Repos . to Mutable List () ĊĠĠĠĠĠĠĠ Ġrepositories . apply Ġ{ Ġremove ( repo ) Ġ} ĊĠĠĠĠĠ Ġ}. on Success Ġ{ Ġrepos Ġ-> ĊĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value . copy ( pinned Repos Ġ= Ġrepos ) ĊĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠ ĠerrorHandler . handleError ( error ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġis Pin ned ( repo : ĠRepo ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ_ ui State . value . pinned Repos . contains ( repo ) ĊĠ Ġ} Ċ } Ċ