package Ġcom . example . instagram _ clone _ clean _ architecture . feature . profile . presentation . view . main Ċ Ċ import Ġandroidx . lifecycle . Transform ations Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . example . instagram _ clone _ clean _ architecture . Feature Profile Nav Graph Directions Ċ import Ġcom . example . instagram _ clone _ clean _ architecture . app . domain . model . Post Domain Model Ċ import Ġcom . example . instagram _ clone _ clean _ architecture . app . domain . model . User Domain Model Ċ import Ġcom . example . instagram _ clone _ clean _ architecture . feature . profile . domain . use case .* Ċ import Ġcom . example . library _ base . domain . exception . Failure Ċ import Ġcom . example . library _ base . presentation . view model . Base Action Ċ import Ġcom . example . library _ base . presentation . view model . Base ViewModel Ċ import Ġcom . example . library _ base . presentation . view model . Base ViewState Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠProfile Main ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġargs : ĠProfile Main Fragment Args , ĊĠĠĠ Ġprivate Ġval Ġget Login User UseCase : ĠGet Login User UseCase , ĊĠĠĠ Ġprivate Ġval ĠgetUser Profile UseCase : ĠGet UserProfile UseCase , ĊĠĠĠ Ġprivate Ġval ĠgetUser Post UseCase : ĠGetUser Post UseCase , ĊĠĠĠ Ġprivate Ġval Ġget Following User UseCase : ĠGet Following User UseCase , ĊĠĠĠ Ġprivate Ġval Ġadd User Relation UseCase : ĠAdd User Relation UseCase , ĊĠĠĠ Ġprivate Ġval Ġremove User Relation UseCase : ĠRemove User Relation UseCase , ĊĠĠĠ Ġprivate Ġval Ġnavigation UseCase : ĠNavigation UseCase , ĊĠĠĠ Ġprivate Ġval Ġlogout UseCase : ĠLogout UseCase , ĊĠĠĠ Ġprivate Ġval Ġdefault Dispatcher : ĠCor outine Dispatcher Ġ= ĠDispatch ers . Main Ċ ) Ġ: ĠBase ViewModel < Profile Main ViewModel . ViewState , ĠProfile Main ViewModel . Action >( ĊĠĠĠ ĠView State () Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġis Data Loading Ġ= ĠTransform ations . map ( state LiveData ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ map Ġit . is Login Following List Loading Ġ|| Ġit . is Login User Loading Ġ|| Ġit . is Post Loading Ġ|| Ġit . is Profile Loading Ġ|| Ġit . is Following Processing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠerrorMessage Ġ= ĠTransform ations . map ( state LiveData ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . is Network Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġ" Network ĠConnection ĠFail " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn @ map Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlogout () Ġ= ĠviewModel Scope . launch ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogout UseCase ( Unit ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnav Dir Ġ= ĠFeature Profile Nav Graph Directions . feature Login Nav Graph () ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠNavigation UseCase . Param ( nav Dir ) ĊĊĠĠĠĠĠĠĠ Ġnavigation UseCase ( params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Navigate To Post Feature () Ġ= ĠviewModel Scope . launch ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnav Dir Ġ= ĠFeature Profile Nav Graph Directions . feature Post Nav Graph () ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠNavigation UseCase . Param ( nav Dir ) ĊĊĠĠĠĠĠĠĠ Ġnavigation UseCase ( params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Navigate To Post Detail ( post : ĠPost Domain Model ) Ġ= ĠviewModel Scope . launch ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnav Dir Ġ= ĠProfile Main Fragment Directions . action Profile Main Fragment To Profile Post Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost . bel ong UserId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost . id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠNavigation UseCase . Param ( nav Dir ) ĊĊĠĠĠĠĠĠĠ Ġnavigation UseCase ( params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Navigate To Edit Profile () Ġ= ĠviewModel Scope . launch ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnav Dir Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProfile Main Fragment Directions . action Profile Main Fragment To Profile Edit Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . userId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠNavigation UseCase . Param ( nav Dir ) ĊĊĠĠĠĠĠĠĠ Ġnavigation UseCase ( params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Navigate To Follower Profile () Ġ= ĠviewModel Scope . launch ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnav Dir Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProfile Main Fragment Directions . action Profile Main Fragment To Profile Follower Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . userId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠNavigation UseCase . Param ( nav Dir ) ĊĊĠĠĠĠĠĠĠ Ġnavigation UseCase ( params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Navigate To Following Profile () Ġ= ĠviewModel Scope . launch ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnav Dir Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProfile Main Fragment Directions . action Profile Main Fragment To Profile Following Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . userId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠNavigation UseCase . Param ( nav Dir ) ĊĊĠĠĠĠĠĠĠ Ġnavigation UseCase ( params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd User Relation () Ġ= ĠviewModel Scope . launch ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Action ( Action . Start Following Processing ) ĊĠĠĠĠĠĠĠ Ġval Ġparam Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAdd User Relation UseCase . Param ( state . login UserProfile !!. id , Ġstate . user Profile !!. id ) ĊĊĠĠĠĠĠĠĠ Ġadd User Relation UseCase ( param ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Suc ceed Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . Finish Following Processing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Fail Ġ= Ġ{ Ġfailure Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . Finish Following Processing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove User Relation () Ġ= ĠviewModel Scope . launch ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Action ( Action . Start Following Processing ) ĊĠĠĠĠĠĠĠ Ġval Ġparam Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemove User Relation UseCase . Param ( state . login UserProfile !!. id , Ġstate . user Profile !!. id ) ĊĊĠĠĠĠĠĠĠ Ġremove User Relation UseCase ( param ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Suc ceed Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . Finish Following Processing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . Reload Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Fail Ġ= Ġ{ Ġfailure Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . Finish Following Processing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Login UserData () Ġ= ĠviewModel Scope . launch ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlogin User : ĠUser Domain Model ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġget Login User UseCase ( Unit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Suc ceed Ġ= Ġ{ Ġuser Profile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin User Ġ= Ġuser Profile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . Login UserProfile Loaded ( user Profile )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Fail Ġ= Ġ{ Ġfailure Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . Login UserProfile Loaded ( null )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . Login User Following List Loaded ( listOf ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogin User ?. let Ġ{ Ġlogin UserProfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Ġ= ĠGet Following User UseCase . Param ( login UserProfile . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Following User UseCase ( param ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Suc ceed Ġ= Ġ{ Ġfollowing List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . Login User Following List Loaded ( following List )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Fail Ġ= Ġ{ Ġfailure Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . Login User Following List Loaded ( listOf ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload UserProfile () Ġ= ĠviewModel Scope . launch ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠGet UserProfile UseCase . Param ( args . userId ) ĊĠĠĠĠĠĠĠ ĠgetUser Profile UseCase ( params ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Suc ceed Ġ= Ġ{ Ġuser Profile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction . UserProfile Loaded ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Fail Ġ= Ġ{ Ġfailure Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . UserProfile Loaded ( null )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload User Post () Ġ= ĠviewModel Scope . launch ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠGetUser Post UseCase . Param ( args . userId ) ĊĠĠĠĠĠĠĠ ĠgetUser Post UseCase ( params ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Suc ceed Ġ= Ġ{ Ġuser Post Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction . User Post Loaded ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Post ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Fail Ġ= Ġ{ Ġfailure Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action ( Action . User Post Loaded ( listOf ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Failure ( failure : ĠFailure ) Ġ= Ġwhen Ġ( failure ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠFailure . Network Connection Ġ-> Ġsend Action ( Action . Fail On Network Connection ) ĊĠĠĠĠĠĠĠ Ġis ĠFailure . ServerError Ġ-> Ġsend Action ( Action . Fail On ServerError ) ĊĠĠĠĠĠĠĠ Ġis ĠFailure . Local Account NotFound Ġ-> Ġsend Action ( Action . Fail On Local Account Error ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" Unknown Ġfailure Ġtype Ġin Ġ${ this . java Class } Ġ: Ġ$ failure ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonLoad Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Action ( Action . Reload Data ) ĊĠĠĠĠĠĠĠ Ġload User Post () ĊĠĠĠĠĠĠĠ Ġload UserProfile () ĊĠĠĠĠĠĠĠ Ġload Login UserData () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Reduce State ( action : ĠAction ): ĠView State Ġ= Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠAction . Login UserProfile Loaded Ġ-> Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Login User Loading Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin UserProfile Ġ= Ġaction . user Profile ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠAction . Login User Following List Loaded Ġ-> Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Login Following List Loading Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin User Following List Ġ= Ġaction . following List ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠAction . UserProfile Loaded Ġ-> Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Profile Loading Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile Ġ= Ġaction . user Profile ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠAction . User Post Loaded Ġ-> Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Post Loading Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Posts Ġ= Ġaction . user Post ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠAction . Fail On Network Connection Ġ-> Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Network Error Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠAction . Fail On ServerError Ġ-> Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ServerError Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠAction . Fail On Local Account Error Ġ-> Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Local Account Error Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠAction . Start Following Processing Ġ-> Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Following Processing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠAction . Finish Following Processing Ġ-> Ġstate . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Following Processing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠAction . Reload Data Ġ-> ĠView State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠView State ( ĊĠĠĠĠĠĠĠ Ġval Ġlogin UserProfile : ĠUser Domain Model ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġlogin User Following List : ĠList < User Domain Model > Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠ Ġval Ġuser Profile : ĠUser Domain Model ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġuser Posts : ĠList < Post Domain Model > Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠ Ġval Ġis Login Following List Loading : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġval Ġis Login User Loading : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġval Ġis Profile Loading : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġval Ġis Post Loading : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġval Ġis Following Processing : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġis Network Error : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġis ServerError : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġis Local Account Error : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ: ĠBase ViewState ĊĊĠĠĠ Ġsealed Ġclass ĠAction Ġ: ĠBase Action Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠLogin UserProfile Loaded ( val Ġuser Profile : ĠUser Domain Model ?) Ġ: ĠAction () ĊĠĠĠĠĠĠĠ Ġclass ĠLogin User Following List Loaded ( val Ġfollowing List : ĠList < User Domain Model >) Ġ: ĠAction () ĊĠĠĠĠĠĠĠ Ġclass ĠUser Profile Loaded ( val Ġuser Profile : ĠUser Domain Model ?) Ġ: ĠAction () ĊĠĠĠĠĠĠĠ Ġclass ĠUser Post Loaded ( val Ġuser Post : ĠList < Post Domain Model >) Ġ: ĠAction () ĊĠĠĠĠĠĠĠ Ġobject ĠStart Following Processing Ġ: ĠAction () ĊĠĠĠĠĠĠĠ Ġobject ĠFinish Following Processing Ġ: ĠAction () ĊĠĠĠĠĠĠĠ Ġobject ĠFail On Network Connection Ġ: ĠAction () ĊĠĠĠĠĠĠĠ Ġobject ĠFail On ServerError Ġ: ĠAction () ĊĠĠĠĠĠĠĠ Ġobject ĠFail On Local Account Error Ġ: ĠAction () ĊĠĠĠĠĠĠĠ Ġobject ĠRe load Data Ġ: ĠAction () ĊĠĠĠ Ġ} Ċ }