package Ġapp . if ny as . k omp as . view model Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġapp . if ny as . k omp as . App . Companion . ar Ċ import Ġapp . if ny as . k omp as . App . Companion . fu Ċ import Ġapp . if ny as . k omp as . App . Companion . su Ċ import Ġapp . if ny as . k omp as . model . Article Ċ import Ġapp . if ny as . k omp as . util . Session Utils . Companion . fullName _ STR Ċ import Ġcom . af ol le st ad . re cyc lic al . datasource . empty DataSource Typed Ċ import Ġio . ktor . client . statement .* Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . serialization . json .* Ċ Ċ class ĠHome ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġby Ġlazy Ġ{ Ġjava Class . simple Name Ġ} ĊĠĠĠ Ġprivate Ġval Ġlimit Ġby Ġlazy Ġ{ Ġ 1 0 0 Ġ} ĊĊĠĠĠ Ġval Ġname Profile Ġby Ġlazy Ġ{ ĠMutable State Flow ("") Ġ} ĊĠĠĠ Ġval Ġchannel Profile Ġby Ġlazy Ġ{ ĠMutable State Flow ("") Ġ} ĊĠĠĠ Ġval Ġsince Profile Ġby Ġlazy Ġ{ ĠMutable State Flow ("") Ġ} ĊĠĠĠ Ġval Ġarticles Profile Ġby Ġlazy Ġ{ ĠMutable State Flow ( 0 ) Ġ} ĊĠĠĠ Ġval Ġscroll Position Ġby Ġlazy Ġ{ ĠMutable State Flow ( 0 ) Ġ} ĊĠĠĠ Ġval Ġarticle Bank Ġby Ġlazy Ġ{ Ġmutable ListOf < Article >() Ġ} ĊĠĠĠ Ġval Ġarticle List Ġ= Ġempty DataSource Typed < Article >() ĊĊĠĠĠ Ġval Ġarticle Search Ġby Ġlazy Ġ{ Ġmutable ListOf < Article >() Ġ} ĊĠĠĠ Ġval Ġsearch Text Ġby Ġlazy Ġ{ ĠMutable State Flow ("") Ġ} ĊĠĠĠ Ġval Ġsearch StartDate Ġby Ġlazy Ġ{ ĠMutable State Flow ("") Ġ} ĊĠĠĠ Ġval Ġsearch EndDate Ġby Ġlazy Ġ{ ĠMutable State Flow ("") Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Profile () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġinit Ġval ĊĠĠĠĠĠĠĠ Ġvar Ġpage Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġname Profile . value Ġ= Ġsu . get ( fullName _ STR ). toString () ĊĊĠĠĠĠĠĠĠ Ġ// Ġempty Ġlist ĊĠĠĠĠĠĠĠ Ġarticle Bank . clear () ĊĊĠĠĠĠĠĠĠ Ġ// Ġsend Ġrequest ĊĠĠĠĠĠĠĠ Ġwhile Ġ( is Find Next ( page )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Profile Request ( page ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġdata ĊĠĠĠĠĠĠĠ Ġarticle Bank . take ( 1 0 ). drop ( 5 ). forEach Ġ{ Ġarticle List . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġchannel Profile . value Ġ= Ġarticle Bank [ 0 ]. channel ĊĠĠĠĠĠĠĠ Ġsince Profile . value Ġ= Ġfu . format Date Profile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Bank [ article Bank . last Index ]. date ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Profile Request ( page : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsend Ġrequest ĊĠĠĠĠĠĠĠ Ġval Ġreq Ġ= Ġar . get Profile ( name Profile . value , Ġpage , Ġlimit ) ĊĠĠĠĠĠĠĠ Ġif Ġ( req . status . value Ġ== Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġparse Ġjson ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠJson . parse ToJson Element ( req . read Text ()). jsonObject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxml Ġ= Ġres [" xml "] ?. jsonObject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp enc arian Ġ= Ġxml ?. get (" pen car ian ") ?. jsonObject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġp enc arian ?. get (" item ") ?. json Array ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġiterate Ġitems ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Bank . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArticle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Element ( it , Ġ" guid "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Element ( it , Ġ" title "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Element ( it , Ġ" description "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Element ( it , Ġ" kan al "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Element ( it , Ġ" pub Date "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Element ( it , Ġ" photo "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Element ( it , Ġ" link ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarticles Profile . value Ġ= Ġarticle Bank . size ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Head lines (): ĠList < Article > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġarticle Bank . toList (). take ( 5 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Element ( it : ĠJson Element , Ġvalue : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġ!= Ġ" photo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . jsonObject [ value ]?. json Primitive ?. content OrNull Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġit . jsonObject [ value ]?. json Primitive ?. content OrNull Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdel C rops Ġ= Ġelement . split ("/ data ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// asset . k omp as . com / data ${ del C rops [ del C rops . last Index ]}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Find Next ( page : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( page Ġ== Ġ 0 ) Ġtrue Ġelse Ġarticles Profile . value Ġ% Ġ( page Ġ* Ġlimit ) Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetName Profile ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġname Profile . value Ġ= Ġfu . capitalize Name ( name ) ĊĠĠĠĠĠĠĠ Ġsu . set ( fullName _ STR , Ġname Profile . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis LoggedIn (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsu . get ( fullName _ STR ). toString (). isNotBlank () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Articles (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġarticle Bank . isNotEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlogout () Ġ{ ĊĠĠĠĠĠĠĠ Ġsu . set ( fullName _ STR , Ġ"") ĊĠĠĠĠĠĠĠ Ġarticle Bank . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Search ( search : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġarticle Search . clear () ĊĠĠĠĠĠĠĠ Ġarticle Bank . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Contains Ġ= Ġit . title . contains ( search , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Contains ) Ġarticle Search . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Search ( page : ĠInt , Ġlimit : ĠInt ): ĠList < Article > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( article Search . isEmpty ()) Ġempty List () Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Index Ġ= Ġ( page Ġ* Ġlimit ) Ġ- Ġlimit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Index Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( limit Ġ- Ġ 1 ) Ġ< Ġarticle Search . last Index ) Ġlimit Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġarticle Search . last Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Search . sub List ( from Index , Ġto Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload More Article List () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġ( article List . size () Ġ/ Ġ 1 0 ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġfrom Index Ġ= Ġ( page Ġ* Ġlimit ) Ġ- Ġlimit ĊĠĠĠĠĠĠĠ Ġval Ġto Index Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( limit Ġ- Ġ 1 ) Ġ< Ġarticle Bank . last Index ) Ġ( page Ġ* Ġlimit ) Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġarticle Bank . last Index ĊĊĠĠĠĠĠĠĠ Ġif Ġ( from Index Ġ< Ġarticle Bank . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Bank . sub List ( from Index , Ġto Index ). forEach Ġ{ Ġarticle List . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit Search () Ġ{ ĊĠĠĠĠĠĠĠ Ġarticle Search . clear () ĊĠĠĠĠĠĠĠ Ġarticle Bank . take ( 1 0 ). forEach ( article Search :: add ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġno More (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġarticle List . size () Ġ== Ġarticle Bank . size ĊĠĠĠ Ġ} Ċ }