package Ġio . pl ast ique . users . profile Ċ Ċ import Ġcom . github . tech no ir 4 2 . rx java 2 . extensions . val ve Latest Ċ import Ġcom . google . auto . factory . Auto Factory Ċ import Ġcom . google . auto . factory . Provided Ċ import Ġcom . sch . neon . Effect Handler Ċ import Ġcom . sch . neon . Main Loop Ċ import Ġcom . sch . neon . State Reducer Ċ import Ġcom . sch . neon . State With Effects Ċ import Ġcom . sch . neon . next Ċ import Ġcom . sch . neon . tim ber . Tim ber Logger Ċ import Ġio . pl ast ique . common . ErrorMessage Provider Ċ import Ġio . pl ast ique . core . content . Content State Ċ import Ġio . pl ast ique . core . mv vm . Base ViewModel Ċ import Ġio . pl ast ique . core . session . Session Manager Ċ import Ġio . pl ast ique . core . session . userId Ċ import Ġio . pl ast ique . core . session . userId Changes Ċ import Ġio . pl ast ique . core . sn ackbar . Snackbar State Ċ import Ġio . pl ast ique . users . R Ċ import Ġio . pl ast ique . users . Users Navigator Ċ import Ġio . pl ast ique . users . profile . UserProfile Effect . CopyTo Clipboard Effect Ċ import Ġio . pl ast ique . users . profile . UserProfile Effect . Load UserProfile Effect Ċ import Ġio . pl ast ique . users . profile . UserProfile Effect . Navigation Effect Ċ import Ġio . pl ast ique . users . profile . UserProfile Effect . Navigation Effect . Open Browser Effect Ċ import Ġio . pl ast ique . users . profile . UserProfile Effect . Navigation Effect . Open SignIn Effect Ċ import Ġio . pl ast ique . users . profile . UserProfile Effect . Set Watch ing Effect Ċ import Ġio . pl ast ique . users . profile . UserProfile Effect . Sign Out Effect Ċ import Ġio . pl ast ique . users . profile . UserProfile Event . Copy Profile Link Click Event Ċ import Ġio . pl ast ique . users . profile . UserProfile Event . Load Error Event Ċ import Ġio . pl ast ique . users . profile . UserProfile Event . Open In Browser Event Ċ import Ġio . pl ast ique . users . profile . UserProfile Event . Retry Click Event Ċ import Ġio . pl ast ique . users . profile . UserProfile Event . Set Watch ing Error Event Ċ import Ġio . pl ast ique . users . profile . UserProfile Event . Set Watch ing Event Ċ import Ġio . pl ast ique . users . profile . UserProfile Event . Set Watch ing Finished Event Ċ import Ġio . pl ast ique . users . profile . UserProfile Event . Sign Out Event Ċ import Ġio . pl ast ique . users . profile . UserProfile Event . Snackbar Shown Event Ċ import Ġio . pl ast ique . users . profile . UserProfile Event . User Changed Event Ċ import Ġio . pl ast ique . users . profile . UserProfile Event . UserProfile Changed Event Ċ import Ġio . pl ast ique . util . Clipboard Ċ import Ġio . pl ast ique . watch . Watch Manager Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . rx kotlin . of Type Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠUser Profile ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġstate Reducer : ĠUser Profile State Reducer , ĊĠĠĠ Ġeffect Handler Factory : ĠUser Profile Effect Handler Factory , ĊĠĠĠ Ġval Ġnavigator : ĠUsers Navigator , ĊĠĠĠ Ġprivate Ġval Ġsession Manager : ĠSession Manager Ċ ) Ġ: ĠBase ViewModel () Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġstate : ĠObservable < UserProfile ViewState > ĊĠĠĠ Ġprivate Ġval Ġloop Ġ= ĠMain Loop ( ĊĠĠĠĠĠĠĠ Ġreducer Ġ= Ġstate Reducer , ĊĠĠĠĠĠĠĠ Ġeffect Handler Ġ= Ġeffect Handler Factory . create ( navigator , Ġscreen Visible ), ĊĠĠĠĠĠĠĠ Ġexternal Events Ġ= Ġexternal Events (), ĊĠĠĠĠĠĠĠ Ġlistener Ġ= ĠTim ber Logger ( LOG _ TAG )) ĊĊĠĠĠ Ġfun Ġinit ( username : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(:: state . isInitialized ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval ĠinitialState Ġ= ĠUser Profile ViewState ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġusername , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent State Ġ= ĠContent State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent UserId Ġ= Ġsession Manager . session . userId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġusername ) ĊĊĠĠĠĠĠĠĠ Ġstate Ġ= Ġloop . loop ( initialState , ĠLoad UserProfile Effect ( username )). dispose On Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch ( event : ĠUser Profile Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloop . dispatch ( event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexternal Events (): ĠObservable < UserProfile Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsession Manager . userId Changes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. skip ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. val ve Latest ( screen Visible ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠuserId Ġ-> ĠUser Changed Event ( userId . to Nullable ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLOG _ TAG Ġ= Ġ" UserProfile ViewModel " ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Auto Factory Ċ class ĠUser Profile Effect Handler ( ĊĠĠĠ Ġ@ Provided Ġprivate Ġval Ġclipboard : ĠClip board , ĊĠĠĠ Ġ@ Provided Ġprivate Ġval Ġsession Manager : ĠSession Manager , ĊĠĠĠ Ġ@ Provided Ġprivate Ġval Ġuser Profile Repository : ĠUser Profile Repository , ĊĠĠĠ Ġ@ Provided Ġprivate Ġval Ġwatch Manager : ĠWatch Manager , ĊĠĠĠ Ġprivate Ġval Ġnavigator : ĠUsers Navigator , ĊĠĠĠ Ġprivate Ġval Ġscreen Visible : ĠObservable < Boolean > Ċ ) Ġ: ĠEffect Handler < UserProfile Effect , ĠUser Profile Event > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġhandle ( effects : ĠObservable < UserProfile Effect >): ĠObservable < UserProfile Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġload Events Ġ= Ġeffects . of Type < Load UserProfile Effect >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ Ġeffect Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile Repository . getUser Profile ByName ( effect . username ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. val ve Latest ( screen Visible ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map < UserProfile Event > Ġ{ Ġuser Profile Ġ-> ĠUser Profile Changed Event ( user Profile ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError ( Tim ber :: e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ Ġerror Ġ-> ĠLoad Error Event ( error ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcopy To Clipboard Events Ġ= Ġeffects . of Type < CopyTo Clipboard Effect >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġeffect Ġ-> Ġclipboard . setText ( effect . text ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore Elements () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable < UserProfile Event >() ĊĊĠĠĠĠĠĠĠ Ġval Ġwatch Events Ġ= Ġeffects . of Type < Set Watch ing Effect >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Single Ġ{ Ġeffect Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwatch Manager . set Watch ing ( effect . username , Ġeffect . watch ing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single Default < UserProfile Event >( Set Watch ing Finished Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError ( Tim ber :: e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ Ġerror Ġ-> ĠSet Watch ing Error Event ( error ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsign Out Events Ġ= Ġeffects . of Type < Sign Out Effect >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġsession Manager . logout () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore Elements () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable < UserProfile Event >() ĊĊĠĠĠĠĠĠĠ Ġval Ġnavigation Events Ġ= Ġeffects . of Type < Navigation Effect >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġeffect Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( effect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOpen Browser Effect Ġ-> Ġnavigator . open Url ( effect . url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen SignIn Effect Ġ-> Ġnavigator . open SignIn () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore Elements () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable < UserProfile Event >() ĊĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . merge Array ( load Events , Ġcopy To Clipboard Events , Ġwatch Events , Ġsign Out Events , Ġnavigation Events ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠUser Profile State Reducer Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval ĠerrorMessage Provider : ĠError Message Provider Ċ ) Ġ: ĠState Reducer < UserProfile Event , ĠUser Profile ViewState , ĠUser Profile Effect > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġreduce ( state : ĠUser Profile ViewState , Ġevent : ĠUser Profile Event ): ĠState With Effects < UserProfile ViewState , ĠUser Profile Effect > Ġ= Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠUser Profile Changed Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent State Ġ= ĠContent State . Content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile Ġ= Ġevent . user Profile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġevent . user Profile . user . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty State Ġ= Ġnull )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠLoad Error Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state . copy ( content State Ġ= ĠContent State . Empty , Ġempty State Ġ= ĠerrorMessage Provider . getError State ( event . error ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠRetry Click Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state . copy ( content State Ġ= ĠContent State . Loading , Ġempty State Ġ= Ġnull ), ĠLoad UserProfile Effect ( state . username )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠCopy Profile Link Click Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state . copy ( sn ackbar State Ġ= ĠSn ackbar State . Message ( R . string . common _ message _ link _ copied )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCopy To Clipboard Effect ( state . user Profile !!. url )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠOpen In Browser Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state , ĠOpen Browser Effect ( state . user Profile !!. url )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠSn ackbar Shown Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state . copy ( sn ackbar State Ġ= Ġnull )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠSet Watch ing Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . current UserId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state . copy ( show Progress Dialog Ġ= Ġtrue ), ĠSet Watch ing Effect ( state . username , Ġevent . watch ing )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state , ĠOpen SignIn Effect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠSet Watch ing Finished Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state . copy ( show Progress Dialog Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠSet Watch ing Error Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state . copy ( show Progress Dialog Ġ= Ġfalse , Ġsn ackbar State Ġ= ĠSn ackbar State . Message ( errorMessage Provider . get ErrorMessage Id ( event . error )))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠUser Changed Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . current UserId Ġ!= Ġevent . userId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state . copy ( current UserId Ġ= Ġevent . userId ), ĠLoad UserProfile Effect ( state . username )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠSign Out Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( state . copy ( sn ackbar State Ġ= ĠSn ackbar State . Message ( R . string . users _ profile _ message _ signed _ out )), ĠSign Out Effect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ