package Ġcom . kick starter . view models Ċ Ċ import Ġandroid . util . Pair Ċ import Ġandroidx . annotation . NonNull Ċ import Ġcom . kick starter . libs . Activity ViewModel Ċ import Ġcom . kick starter . libs . CurrentUser Type Ċ import Ġcom . kick starter . libs . Either Ċ import Ġcom . kick starter . libs . Environment Ċ import Ġcom . kick starter . libs . load more . A pol lo Pag inate Ċ import Ġcom . kick starter . libs . rx . transformers . Transform ers Ċ import Ġcom . kick starter . libs . rx . transformers . Transform ers . combine Latest Pair Ċ import Ġcom . kick starter . libs . rx . transformers . Transform ers . take Pair When Ċ import Ġcom . kick starter . models . Comment Ċ import Ġcom . kick starter . models . Project Ċ import Ġcom . kick starter . models . Update Ċ import Ġcom . kick starter . models . User Ċ import Ġcom . kick starter . models . extensions . card Status Ċ import Ġcom . kick starter . models . extensions . update Canceled P ledge Comment Ċ import Ġcom . kick starter . models . extensions . update Comment After Successful Post Ċ import Ġcom . kick starter . models . extensions . update Comment Failed To Post Ċ import Ġcom . kick starter . services . A pol lo Client Type Ċ import Ġcom . kick starter . services . ap ire sponse s . comment response . Comment Envelope Ċ import Ġcom . kick starter . ui . Intent Key Ċ import Ġcom . kick starter . ui . activities . Comments Activity Ċ import Ġcom . kick starter . ui . data . Comment Card Data Ċ import Ġcom . kick starter . ui . views . Comment Card Status Ċ import Ġcom . kick starter . ui . views . Comment Composer Status Ċ import Ġorg . joda . time . DateTime Ċ import Ġrx . Observable Ċ import Ġrx . subjects . Behavior Subject Ċ import Ġrx . subjects . Publish Subject Ċ Ċ interface ĠComments ViewModel Ġ{ ĊĊĠĠĠ Ġinterface ĠInputs Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġrefresh () ĊĠĠĠĠĠĠĠ Ġfun Ġnext Page () ĊĠĠĠĠĠĠĠ Ġfun Ġback Pressed () ĊĠĠĠĠĠĠĠ Ġfun Ġinsert New Comment ToList ( comment : ĠString , ĠcreatedAt : ĠDateTime ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Reply Clicked ( comment : ĠComment , Ġopen Keyboard : ĠBoolean ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Show Guide Lines Link Clicked () ĊĠĠĠĠĠĠĠ Ġfun Ġcheck If There Any Pending Comments ( is Back Action : ĠBoolean ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWill Ġbe Ġcalled Ġwith Ġthe Ġsuccessful Ġresponse Ġwhen Ġcalling Ġthe Ġ` post Comment ` ĠMutation Ġ**/ ĊĠĠĠĠĠĠĠ Ġfun Ġrefresh Comment ( comment : ĠComment , Ġposition : ĠInt ) ĊĠĠĠĠĠĠĠ Ġfun Ġrefresh Comment Card In Case Failed Posted ( comment : ĠComment , Ġposition : ĠInt ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Show Canceled P ledge Comment ( comment : ĠComment ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Resume Activity () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOutputs Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġclose Comments Page (): ĠObservable < Void > ĊĠĠĠĠĠĠĠ Ġfun ĠcurrentUser Avatar (): ĠObservable < String ?> ĊĠĠĠĠĠĠĠ Ġfun Ġcomment Composer Status (): ĠObservable < Comment Composer Status > ĊĠĠĠĠĠĠĠ Ġfun Ġenable Reply Button (): ĠObservable < Boolean > ĊĠĠĠĠĠĠĠ Ġfun Ġshow Comment Composer (): ĠObservable < Boolean > ĊĠĠĠĠĠĠĠ Ġfun Ġcomments List (): ĠObservable < List < Comment Card Data >> ĊĠĠĠĠĠĠĠ Ġfun Ġscroll To Top (): ĠObservable < Boolean > ĊĠĠĠĠĠĠĠ Ġfun Ġset Empty State (): ĠObservable < Boolean > ĊĠĠĠĠĠĠĠ Ġfun Ġshow Comment Guide Lines Link (): ĠObservable < Void > ĊĠĠĠĠĠĠĠ Ġfun Ġinitial Load Comments Error (): ĠObservable < Throwable > ĊĠĠĠĠĠĠĠ Ġfun Ġpag inate Comments Error (): ĠObservable < Throwable > ĊĠĠĠĠĠĠĠ Ġfun Ġpull To Refresh Error (): ĠObservable < Throwable > ĊĠĠĠĠĠĠĠ Ġfun Ġstart Thread Activity (): ĠObservable < Pair < Pair < Comment Card Data , ĠBoolean >, ĠString ? >> ĊĠĠĠĠĠĠĠ Ġfun Ġstart Thread Activity From Deep Link (): ĠObservable < Pair < Comment Card Data , ĠString ? >> ĊĠĠĠĠĠĠĠ Ġfun Ġhas Pending Comments (): ĠObservable < Pair < Boolean , ĠBoolean >> ĊĊĠĠĠĠĠĠĠ Ġ/** ĠEmit s Ġa Ġboolean Ġindicating Ġwhether Ġcomments Ġare Ġbeing Ġfetched Ġfrom Ġthe ĠAPI . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġis Fetching Comments (): ĠObservable < Boolean > ĊĊĠĠĠĠĠĠĠ Ġ/** ĠDisplay Ġthe Ġbottom Ġpagination ĠError ĠCell Ġ**/ ĊĠĠĠĠĠĠĠ Ġfun Ġshould Show Pagination Error UI (): ĠObservable < Boolean > ĊĠĠĠĠĠĠĠ Ġ/** ĠDisplay Ġthe Ġinitial ĠLoad ĠError ĠCell Ġ**/ ĊĠĠĠĠĠĠĠ Ġfun Ġshould Show Initial Load Error UI (): ĠObservable < Boolean > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠViewModel (@ NonNull Ġval Ġenvironment : ĠEnvironment ) Ġ: ĠActivity ViewModel < Comments Activity >( environment ), ĠInputs , ĠOutputs Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠcurrentUser : ĠCurrent User Type Ġ= Ġenvironment . currentUser () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġap ollo Client : ĠApollo Client Type Ġ= Ġenvironment . apollo Client () ĊĠĠĠĠĠĠĠ Ġval Ġinputs : ĠInputs Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġval Ġoutputs : ĠOutputs Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġback Pressed Ġ= ĠPublish Subject . create < Void >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrefresh Ġ= ĠPublish Subject . create < Void >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnext Page Ġ= ĠPublish Subject . create < Void >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon Show Guide Lines Link Clicked Ġ= ĠPublish Subject . create < Void >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon Reply Clicked Ġ= ĠPublish Subject . create < Pair < Comment , ĠBoolean >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcheck If There Any Pending Comments Ġ= ĠPublish Subject . create < Boolean >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfailed Comment Card To Refresh Ġ= ĠPublish Subject . create < Pair < Comment , ĠInt >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġshow Canceled P ledge Comment Ġ= ĠPublish Subject . create < Comment >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon Resume Activity Ġ= ĠPublish Subject . create < Void >() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġclose Comments Page Ġ= ĠBehavior Subject . create < Void >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠcurrentUser Avatar Ġ= ĠBehavior Subject . create < String ?> () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcomment Composer Status Ġ= ĠBehavior Subject . create < Comment Composer Status >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġshow Comment Composer Ġ= ĠBehavior Subject . create < Boolean >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcomments List Ġ= ĠBehavior Subject . create < List < Comment Card Data >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġoutput Comment List Ġ= ĠBehavior Subject . create < List < Comment Card Data >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġshow Guide Lines Link Ġ= ĠBehavior Subject . create < Void >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdisable Reply Button Ġ= ĠBehavior Subject . create < Boolean >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġscroll To Top Ġ= ĠBehavior Subject . create < Boolean >() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinsert New Comment ToList Ġ= ĠPublish Subject . create < Pair < String , ĠDateTime >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġis Refresh ing Ġ= ĠBehavior Subject . create < Boolean >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġset Empty State Ġ= ĠBehavior Subject . create < Boolean >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdisplay Initial Error Ġ= ĠBehavior Subject . create < Boolean >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdisplay Pagination Error Ġ= ĠBehavior Subject . create < Boolean >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcomment To Refresh Ġ= ĠPublish Subject . create < Pair < Comment , ĠInt >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstart Thread Activity Ġ= ĠBehavior Subject . create < Pair < Pair < Comment Card Data , ĠBoolean >, ĠString ? >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstart Thread Activity From Deep Link Ġ= ĠBehavior Subject . create < Pair < Comment Card Data , ĠString ? >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhas Pending Comments Ġ= ĠBehavior Subject . create < Pair < Boolean , ĠBoolean >>() ĊĊĠĠĠĠĠĠĠ Ġ// Ġ- ĠError Ġobservable s Ġto Ġhandle Ġthe Ġ 3 Ġdifferent Ġuse Ġcases ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinternal Error Ġ= ĠBehavior Subject . create < Throwable >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinitial Error Ġ= ĠBehavior Subject . create < Throwable >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpagination Error Ġ= ĠBehavior Subject . create < Throwable >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpull To Refresh Error Ġ= ĠBehavior Subject . create < Throwable >() ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcomment able Id Ġ= ĠBehavior Subject . create < String ?> () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġis Fetching Comments Ġ= ĠBehavior Subject . create < Boolean >() ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġproject : ĠProject ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġopened Thread Activity From Deep Link Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlogged In User Ġ= Ġthis . currentUser . logged In User () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġu Ġ-> Ġu Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġrequire NotNull ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogged In User ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentUser Avatar . onNext ( it . avatar (). small ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogged In User ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Comment Composer . onNext ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject OrUpdate Ġ= Ġintent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map < Any ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġit . get Parcelable Extra ( Intent Key . PROJECT ) Ġas ? ĠProject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġit . get Parcelable Extra ( Intent Key . UPDATE ) as ? ĠUpdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEither . Left < Project ?, ĠUpdate ? >( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠEither . Right < Project ?, ĠUpdate ? >( update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Type ( Either :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Project Ġ= Ġproject OrUpdate . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ? ĠEither < Project ?, ĠUpdate ?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. either < Observable < Project ?> >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue : ĠProject ? Ġ-> ĠObservable . just ( value ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġu : ĠUpdate ? Ġ-> Ġap ollo Client . getProject ( u ?. projectId (). toString ()). compose ( Transform ers . never Error ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . project Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. share () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Project ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( combine Latest Pair ( currentUser . observable ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposer Status Ġ= Ġget Comment Composer Status ( Pair ( it . first , Ġit . second )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Comment Composer . onNext ( composer Status Ġ!= ĠComment Composer Status . GONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Composer Status . onNext ( composer Status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject OrUpdate Comment Ġ= Ġproject OrUpdate . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ? ĠEither < Project ?, ĠUpdate ?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. compose ( combine Latest Pair ( initial Project )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( it . second , Ġit . first ?. right ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Comment List From Project OrUpdate ( project OrUpdate Comment ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeep Link Comment able Id Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent (). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getString Extra ( Intent Key . COMMENT )?. isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġrequire NotNull ( it . getString Extra ( Intent Key . COMMENT )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject OrUpdate Comment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġthe Ġactivity Ġopened Ġby Ġdee plink Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombine Latest Pair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . has Extra ( Intent Key . COMMENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Root Comment Page View Event ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject OrUpdate Comment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( Transform ers . take When ( on Resume Activity )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsend Ġevent Ġafter Ġback Ġaction Ġafter Ġdeep Ġlink Ġto Ġthread Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( opened Thread Activity From Deep Link ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Root Comment Page View Event ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopened Thread Activity From Deep Link Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link Comment able Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( take Pair When ( project OrUpdate Comment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ switch Map Ġap ollo Client . get Comment ( it . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. compose ( Transform ers . never Error ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( combine Latest Pair ( deep Link Comment able Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( combine Latest Pair ( comment able Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComment Card Data . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. comment ( it . first . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. project ( this . project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. comment Card State ( it . first . first . card Status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. comment able Id ( it . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. with Latest From ( project OrUpdate Comment ) Ġ{ Ġcomment Data , Ġproject OrUpdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( comment Data , Ġproject OrUpdate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . start Thread Activity From Deep Link . onNext ( Pair ( it . first , Ġit . second . second ?. id ()?. toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopened Thread Activity From Deep Link Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . insert New Comment ToList ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Latest From ( this . currentUser . logged In User ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment , Ġuser Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( comment , Ġuser ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( it . first , Ġbuild Comment Body ( Pair ( it . second , Ġit . first ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Latest From ( initial Project ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Data , Ġproject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( comment Data , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( combine Latest Pair ( comment able Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComment Card Data . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. comment ( it . first . first . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. project ( it . first . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. comment able Id ( it . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. comment Card State ( Comment Card Status . TRY ING _ TO _ POST . comment Card Status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġscroll To Top . onNext ( true ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Latest From ( this . comments List ) Ġ{ Ġit , Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . to Mutable List (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( 0 , Ġit . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomments List . onNext ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . comment To Refresh ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Latest From ( project OrUpdate Comment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Data , Ġproject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( comment Data , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . an alytic Events . track Comment CT A ( it . second . first , Ġit . first . id (). toString (), Ġit . first . body (), Ġit . second . second ?. id ()?. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . on Show Guide Lines Link Clicked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Guide Lines Link . onNext ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . comments List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set Empty State . onNext ( it Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . initial Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . display Initial Error . onNext ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pagination Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . display Pagination Error . onNext ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . comments List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( take Pair When ( check If There Any Pending Comments )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġpair Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . has Pending Comments . onNext ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . first . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . comment Card State Ġ== ĠComment Card Status . TRY ING _ TO _ POST . comment Card Status Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . comment Card State Ġ== ĠComment Card Status . FAILED _ TO _ SEND _ COMMENT . comment Card Status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . back Pressed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġthis . close Comments Page . onNext ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubscribe Ġ= Ġcomments List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Latest From ( project OrUpdate Comment ) Ġ{ Ġcomment Data , Ġproject OrUpdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( comment Data , Ġproject OrUpdate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( take Pair When ( on Reply Clicked )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġpair Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcard Data Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . first . first . first Ġ{ Ġit . comment ?. id () Ġ== Ġpair . second . first . id () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthread Data Ġ= ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . second . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . start Thread Activity . onNext ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . first . second . second ?. id ()?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- ĠUpdate Ġinternal Ġmutable Ġlist Ġwith Ġthe Ġlatest Ġstate Ġafter Ġsuccessful Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . comments List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( take Pair When ( this . comment To Refresh )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . first . update Comment After Successful Post ( it . first , Ġit . second . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . comments List . onNext ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- ĠRe un ite Ġin Ġonly Ġone Ġplace Ġwhere Ġthe Ġoutput Ġlist Ġgets Ġnew Ġupdates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . comments List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . output Comment List . onNext ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- ĠUpdate Ġinternal Ġmutable Ġlist Ġwith Ġthe Ġlatest Ġstate Ġafter Ġfailed Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . comments List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( take Pair When ( this . failed Comment Card To Refresh )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . first . update Comment Failed To Post ( it . first , Ġit . second . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . comments List . onNext ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . comments List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( take Pair When ( this . show Canceled P ledge Comment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . update Canceled P ledge Comment ( it . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . comments List . onNext ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtrack Root Comment Page View Event ( it : ĠPair < Project , ĠUpdate ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . second ?. id () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . an alytic Events . track Root Comment Page View ed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second ?. id ()?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . an alytic Events . track Root Comment Page View ed ( it . first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Comment List From Project OrUpdate ( project OrUpdate : ĠObservable < Pair < Project , ĠUpdate ? >>) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Over With Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . merge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject OrUpdate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject OrUpdate . compose ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransform ers . take When ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġap ollo Pag inate Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApollo Pag inate . builder < Comment Card Data , ĠComment Envelope , ĠPair < Project , ĠUpdate ? >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. next Page ( next Page ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start Over With ( start Over With ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. envelope ToList Of Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap To Comment Card DataList ( Pair ( it , Ġthis . project )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load With Params Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload With Project OrUpdate Comments ( Observable . just ( it . first ), Ġit . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. clear When Starting Over ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġap ollo Pag inate . is Fetching () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle < Boolean >()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( this . is Fetching Comments ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġap ollo Pag inate . pag inated Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . share () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . comments List . onNext ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . internal Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠPair ( it , Ġcomments List . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . isNull OrEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . initial Error . onNext ( it . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomments List . compose ( take Pair When ( this . internal Error )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pagination Error . onNext ( it . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . refresh ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Refresh ing . onNext ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . internal Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( combine Latest Pair ( is Refresh ing )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( combine Latest Pair ( comments List )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . isNull OrEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Refresh ing . onNext ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload With Project OrUpdate Comments ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject OrUpdate : ĠObservable < Pair < Project , ĠUpdate ? >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor : ĠString ? ĊĠĠĠĠĠĠĠ Ġ): ĠObservable < Comment Envelope > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġproject OrUpdate . switch Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ switch Map Ġif Ġ( it . second ?. id () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġap ollo Client . getProject Update Comments ( it . second ?. id (). toString (), Ġcursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġap ollo Client . getProject Comments ( it . first ?. slug () Ġ?: Ġ"", Ġcursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment able Id . onNext ( it . comment able Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove ĠPagination Ġerror From ĠView ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . display Pagination Error . onNext ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . display Initial Error . onNext ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . internal Error . onNext ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Resume Next ( Observable . empty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmap To Comment Card DataList ( it : ĠPair < Comment Envelope , ĠProject >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . comments ?. map Ġ{ Ġcomment : ĠComment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComment Card Data . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. comment ( comment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. project ( it . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. comment Card State ( comment . card Status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. comment able Id ( it . first . comment able Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġbuild Comment Body ( it : ĠPair < User , ĠPair < String , ĠDateTime >> ): ĠComment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComment . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( it . second . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parentId (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. author Bad ges ( listOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. createdAt ( it . second . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cursor ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. deleted ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. id (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. author Canceled P ledge ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replies Count ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. author ( it . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Comment Composer Status ( project And User : ĠPair < Project , ĠUser ?> ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject And User . second Ġ== Ġnull Ġ-> ĠComment Composer Status . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject And User . first . can Comment () Ġ?: Ġfalse Ġ-> ĠComment Composer Status . ENABLED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠComment Composer Status . DISABLED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ- ĠInputs ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġback Pressed () Ġ= Ġback Pressed . onNext ( null ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrefresh () Ġ= Ġrefresh . onNext ( null ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext Page () Ġ= Ġnext Page . onNext ( null ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinsert New Comment ToList ( comment : ĠString , ĠcreatedAt : ĠDateTime ) Ġ= Ġinsert New Comment ToList . onNext ( Pair ( comment , ĠcreatedAt )) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Show Guide Lines Link Clicked () Ġ= Ġon Show Guide Lines Link Clicked . onNext ( null ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrefresh Comment ( comment : ĠComment , Ġposition : ĠInt ) Ġ= Ġthis . comment To Refresh . onNext ( Pair ( comment , Ġposition )) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Reply Clicked ( comment : ĠComment , Ġopen Keyboard : ĠBoolean ) Ġ= Ġon Reply Clicked . onNext ( Pair ( comment , Ġopen Keyboard )) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck If There Any Pending Comments ( is Back Action : ĠBoolean ) Ġ= Ġcheck If There Any Pending Comments . onNext ( is Back Action ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrefresh Comment Card In Case Failed Posted ( comment : ĠComment , Ġposition : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . failed Comment Card To Refresh . onNext ( Pair ( comment , Ġposition )) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Show Canceled P ledge Comment ( comment : ĠComment ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . show Canceled P ledge Comment . onNext ( comment ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Resume Activity () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . on Resume Activity . onNext ( null ) ĊĠĠĠĠĠĠĠ Ġ// Ġ- ĠOutputs ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclose Comments Page (): ĠObservable < Void > Ġ= Ġclose Comments Page ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠcurrentUser Avatar (): ĠObservable < String ?> Ġ= ĠcurrentUser Avatar ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcomment Composer Status (): ĠObservable < Comment Composer Status > Ġ= Ġcomment Composer Status ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshow Comment Composer (): ĠObservable < Boolean > Ġ= Ġshow Comment Composer ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcomments List (): ĠObservable < List < Comment Card Data >> Ġ= Ġthis . output Comment List ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġenable Reply Button (): ĠObservable < Boolean > Ġ= Ġdisable Reply Button ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshow Comment Guide Lines Link (): ĠObservable < Void > Ġ= Ġshow Guide Lines Link ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinitial Load Comments Error (): ĠObservable < Throwable > Ġ= Ġthis . initial Error ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpag inate Comments Error (): ĠObservable < Throwable > Ġ= Ġthis . pagination Error ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpull To Refresh Error (): ĠObservable < Throwable > Ġ= Ġthis . pull To Refresh Error ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġscroll To Top (): ĠObservable < Boolean > Ġ= Ġthis . scrollTo Top ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Show Initial Load Error UI (): ĠObservable < Boolean > Ġ= Ġthis . display Initial Error ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Show Pagination Error UI (): ĠObservable < Boolean > Ġ= Ġthis . display Pagination Error ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset Empty State (): ĠObservable < Boolean > Ġ= Ġset Empty State ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart Thread Activity (): ĠObservable < Pair < Pair < Comment Card Data , ĠBoolean >, ĠString ? >> Ġ= Ġthis . start Thread Activity ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart Thread Activity From Deep Link (): ĠObservable < Pair < Comment Card Data , ĠString ? >> Ġ= Ġthis . start Thread Activity From Deep Link ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Fetching Comments (): ĠObservable < Boolean > Ġ= Ġthis . is Fetching Comments ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Pending Comments (): ĠObservable < Pair < Boolean , ĠBoolean >> Ġ= Ġthis . has Pending Comments ĊĠĠĠ Ġ} Ċ } Ċ