package Ġhr . jos ip . facebook . ui . feed Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġhr . jos ip . facebook . data . model . feed . response . Comment Ċ import Ġhr . jos ip . facebook . data . model . feed . response . Post Ċ import Ġhr . jos ip . facebook . data . model . feed . response . Story Ċ import Ġhr . jos ip . facebook . data . model . feed . response . Story State Ċ import Ġhr . jos ip . facebook . domain . Use Cases Ċ import Ġhr . jos ip . facebook . shared . manager . user . User Manager Ċ import Ġhr . jos ip . facebook . ui . shared . base . Base ViewModel Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . random . Random Ċ Ċ @ H ilt ViewModel Ċ class ĠFeed ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġuser Manager : ĠUser Manager , ĊĠĠĠ Ġprivate Ġval Ġget Feed UseCase : ĠUse Cases . Get Feed UseCase Ċ ) Ġ: ĠBase ViewModel < Feed State , ĠFeed Event , ĠFeed Effect >() Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Intent ( event : ĠFeed Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFeed Event . Get Feed Ġ-> Ġget Feed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFeed Event . Add Comment Ġ-> Ġadd Comment ( event . post , Ġevent . comment ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFeed Event . AddNew User Story Ġ-> Ġadd New User Story () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFeed Event . Like Clicked Ġ-> Ġon Like Clicked ( event . post ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFeed Event . Mark Story As Read Ġ-> Ġmark Story As Read ( event . story ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFeed Event . Shar Post Ġ-> Ġshare Post ( event . post ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFeed Event . Show Post Details Ġ-> Ġshow Post Details ( event . post ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFeed Event . Show Story Content Ġ-> Ġshow Story Content ( event . story ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFeed Event . Update Status Ġ-> Ġupdate Status ( event . status ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Feed () Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view State ?. feed Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Loading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFeed State ( feed Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ Ġget Feed UseCase . execute ( Unit ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Common State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmark Story As Read ( story : ĠStory ) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġview State ?. feed ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= Ġview State ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Ġ= Ġupdate Story State ( story , ĠStory State . LOADING )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State ?. feed ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposts Ġ= Ġposts , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstories Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= Ġview State ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Ġ= Ġupdate Story State ( story , ĠStory State . READ )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State ?. feed ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposts Ġ= Ġposts , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstories Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Story Content ( story ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate Story State ( story : ĠStory , ĠnewState : ĠStory State ) Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview State ?. feed ?. stories ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġstory . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( id Ġ= Ġstory . id , Ġuser Ġ= Ġstory . user , Ġstory State Ġ= ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Status ( status : ĠString ) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġview State ?. feed ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Posts Ġ= Ġposts . to Mutable List (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPost ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠRandom . nextInt ( 1 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ġ= Ġuser Manager . getCurrent Active User (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġstatus , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= ĠDate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= Ġview State ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Ġ= Ġview State ?. feed ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposts Ġ= Ġupdated Posts , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstories Ġ= Ġstories ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Like Clicked ( post : ĠPost ) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġview State ?. feed ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Posts Ġ= Ġview State ?. feed ?. posts ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġpost . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Lik edBy CurrentUser . not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( is Lik edBy CurrentUser Ġ= Ġtrue , Ġlikes Ġ= Ġpost . likes Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( is Lik edBy CurrentUser Ġ= Ġfalse , Ġlikes Ġ= Ġpost . likes Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Posts ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= Ġview State ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Ġ= Ġview State ?. feed ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposts Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstories Ġ= Ġstories ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Comment ( post : ĠPost , Ġcomment : ĠString ) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġview State ?. feed ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Posts Ġ= Ġview State ?. feed ?. posts ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Comments Ġ= Ġit . comments . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġpost . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Comments . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠRandom . nextInt ( 1 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġcomment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= ĠDate (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ġ= Ġuser Manager . getCurrent Active User () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( comments Ġ= Ġupdated Comments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Posts ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= Ġview State ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Ġ= Ġview State ?. feed ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposts Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstories Ġ= Ġstories ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd New User Story () Ġ= Ġemit Effect ( Feed Effect . AddNew Story Unavailable ) ĊĊĠĠĠ Ġprivate Ġfun Ġshare Post ( post : ĠPost ) Ġ= Ġemit Effect ( Feed Effect . Share Post Unavailable ( post )) ĊĊĠĠĠ Ġprivate Ġfun Ġshow Post Details ( post : ĠPost ) Ġ= ĊĠĠĠĠĠĠĠ Ġemit Effect ( Feed Effect . Show Post Details Unavailable ( post )) ĊĊĠĠĠ Ġprivate Ġfun Ġshow Story Content ( story : ĠStory ) Ġ= ĊĠĠĠĠĠĠĠ Ġemit Effect ( Feed Effect . Show Story Content Unavailable ( story )) Ċ } ĊĊ