package Ġcom . we es ner development . frontend utils Ċ Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroidx . core . content . edit Ċ import Ġkim chi . K im chi Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . logging . Http Logging Interceptor Ċ import Ġretrofit 2 . HttpException Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . mos hi . M oshi Converter Factory Ċ import Ġshared . base . Response Ċ import Ġshared . base . ServerError Ċ import Ġshared . fromJson Ċ import Ġshared . toJson Ċ import Ġjava . net . Connect Exception Ċ import Ġjava . net . Socket TimeoutException Ċ import Ġjava . text . NumberFormat Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . time .* Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠHelper Ġval Ġto Ġcreate Ġretrofit Ġbuilder Ġfor Ġ[ Ok HttpClient ]. Ċ Ġ*/ Ċ val ĠOk HttpClient . ret rofit ĊĠĠĠ Ġget () Ġ= ĠRet rofit . Builder (). client ( this ). add Converter Factory ( M oshi Converter Factory . create ()) Ċ Ċ /** Ċ Ġ* ĠBase ĠUrl Ġfor Ġthe Ġbackend . Ċ Ġ*/ Ċ const Ġval ĠBASE _ URL Ġ= Ġ" http :// api . we es ner development . com " Ċ Ċ /** Ċ Ġ* ĠAuth Ġbase Ġendpoint . Ċ Ġ*/ Ċ const Ġval ĠAUTH _ URL Ġ= Ġ"$ BASE _ URL / user /" Ċ Ċ /** Ċ Ġ* ĠHelper Ġfunction Ġto Ġcreate Ġ[ Ok HttpClient ] Ġwith Ġa Ġretrofit Ġbuilder Ġand Ġnetwork Ġlogging . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > ĠOk HttpClient . create ( baseUrl : ĠString ) Ġ= ĠnewBuilder () ĊĠĠĠ Ġ. add Interceptor ( Http Logging Interceptor (). apply Ġ{ Ġset Level ( Http Logging Interceptor . Level . BODY ) Ġ}) ĊĠĠĠ Ġ. build () ĊĠĠĠ Ġ. ret rofit ĊĠĠĠ Ġ. baseUrl ( baseUrl ) ĊĠĠĠ Ġ. build () ĊĠĠĠ Ġ. create ( T :: class . java ) ĊĊ Ċ inline Ġfun Ġattempt Network Request ( attempt : Ġ() Ġ-> ĠResponse ) Ġ= Ġtry Ġ{ ĊĠĠĠ Ġattempt () Ċ } Ġcatch Ġ( e : ĠHttp Exception ) Ġ{ ĊĠĠĠ Ġval Ġserver Error Ġ= Ġe . response ()?. error Body ()?. string (). parse < ServerError >() ĊĠĠĠ Ġthrow ĠServer Exception ( server Error ) Ċ } Ċ Ċ /** Ċ Ġ* ĠHelper Ġto Ġdo Ġa Ġnetwork Ġrequest Ġand Ġcatch Ġ[ Exception ] s Ġif Ġthere Ġis Ġan Ġerror . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > Ġwrapped Network Request ( Ċ ĉ try ing : Ġ() Ġ-> ĠResponse , Ċ ĉ result : Ġ( Result < T >) Ġ-> ĠResult < T > Ċ ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġtrying (). message . parse < T >(). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ( Result . success ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠServer Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult ( Result . failure ( e )) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠConnect Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult ( Result . failure ( e )) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠHttp Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult ( Result . failure ( e )) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠSocket TimeoutException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult ( Result . failure ( e )) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠKim chi . info (" Network Ġrequest Ġfor Ġ${ T :: class } Ġwas Ġempty ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠHelper Ġto Ġdo Ġa Ġnetwork Ġrequest Ġand Ġcatch Ġ[ Exception ] s Ġif Ġthere Ġis Ġan Ġerror . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > Ġnetwork Request ( Ċ ĉ try ing : Ġ() Ġ-> ĠT , Ċ ĉ result : Ġ( Result < T >) Ġ-> ĠResult < T > Ċ ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġtrying (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ( Result . success ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠServer Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult ( Result . failure ( e )) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠConnect Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult ( Result . failure ( e )) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠHttp Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult ( Result . failure ( e )) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠSocket TimeoutException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult ( Result . failure ( e )) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠKim chi . info (" Network Ġrequest Ġfor Ġ${ T :: class } Ġwas Ġempty ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠHelper Ġfunction Ġto Ġparse Ġa Ġ[ Response ] Ġas Ġ[ T ]. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > Ġrequest ( request : Ġ() Ġ-> ĠResponse ?) Ġ= Ġrequest ()?. message . parse < T >() Ċ Ċ /** Ċ Ġ* ĠHelper Ġfunction Ġto Ġcreate Ġa Ġ[ network Request ] Ġwith Ġ[ success ] Ġand Ġ[ fail ] Ġresults Ġin Ġplace . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > Ġrequest ( Ċ ĉ request : Ġ() Ġ-> ĠT , Ċ ĉ success : Ġ( T ?) Ġ-> ĠUnit Ġ= Ġ{}, Ċ ĉ fail : Ġ( Throwable ) Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ= Ġnetwork Request < T ? >( request ) Ġ{ ĊĠĠĠ Ġit . on Success Ġ{ Ġsuccess ( it ) Ġ} ĊĠĠĠ Ġit . on Failure Ġ{ Ġfail ( it ) Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠParse Ġthe Ġvalue Ġas Ġ[ T ]. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > ĠAny ?. parse () Ġ= Ġwhen Ġ( this ) Ġ{ Ċ ĉ is ĠString Ġ-> Ġfrom Json < T >() Ċĉ ĉ ?: Ġthrow ĠIllegalArgumentException (" An Ġerror Ġoccurred Ġgetting Ġmessage Ġfrom Ġresponse ") ĊĠĠĠ Ġelse Ġ-> ĠtoJson ()?. fromJson < T >() ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" An Ġerror Ġoccurred Ġgetting Ġmessage Ġfrom Ġresponse ") Ċ } Ċ Ċ /** Ċ Ġ* ĠServer ĠException Ġthat Ġhappens Ġin Ġa Ġ 4 XX Ġlevel Ġhttp Ġstatus Ġcode . Ċ Ġ*/ Ċ data Ġclass ĠServer Exception ( val Ġerror : ĠServer Error ) Ġ: ĠThrowable () Ċ Ċ /** Ċ Ġ* ĠConverts Ġthe Ġgiven Ġstring Ġto Ġthe Ġdefault Ġcurrency . Ċ Ġ*/ Ċ val ĠString . as Money : ĠString Ġget () Ġ= ĠNumber Format . getC urrency Instance (). format ( this . toDouble ()) Ċ Ċ /** Ċ Ġ* ĠConverts Ġthe Ġgiven Ġstring Ġto Ġa Ġ[ Date ]. Ċ Ġ*/ Ċ val ĠString . toDate : ĠDate ? Ġget () Ġ= ĠSimpleDateFormat . getDate Instance (). parse ( this ) Ċ Ċ /** Ċ Ġ* ĠDefault Ġdate Ġformat Ġto Ġbe Ġused . Ċ Ġ*/ Ċ val ĠdateFormat : ĠDateTime Formatter ? Ġ= ĠDateTime Formatter . of Pattern (" MMM Ġdd , Ġy yyy ") Ċ Ċ /** Ċ Ġ* ĠConverts Ġthe Ġepoch Ġtime Ġto Ġa Ġformatted Ġdate Ġstring . Ċ Ġ*/ Ċ val ĠLong . toDate String : ĠString ĊĠĠĠ Ġget () Ġ= ĠLocalDate . of Epoch Day ( this Ġ/ Ġ( 2 4 Ġ* Ġ 6 0 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 )). format ( date Format ) Ċ Ċ /** Ċ Ġ* ĠConverts Ġthe Ġgiven Ġ[ LocalDate ] Ġto ĠUTC Ġepoch Ġmillis . Ċ Ġ*/ Ċ val ĠLocalDate . to UT CM illis ĊĠĠĠ Ġget () Ġ= ĠClock . fixed ( Ċĉ ĉ this . at Start OfDay (). to Instant ( Zone Offset . UTC ), ĠZone Id . of ( Zone Offset . UTC . id ) Ċ ĉ ). millis () Ċ Ċ /** Ċ Ġ* ĠConverts Ġa Ġstring Ġto Ġa Ġ[ Base 6 4 ] Ġencoded Ġ[ ByteArray ] Ġand Ġgives Ġits Ġcontents . Ċ Ġ*/ Ċ val ĠString . encode Ġget () Ġ= ĠString ( Base 6 4 . encode ( this . toByteArray (), ĠBase 6 4 . NO _ WRAP )) Ċ Ċ /** Ċ Ġ* ĠMaps Ġthe Ġgiven Ġstring Ġto Ġa Ġ" Auth ĠBearer " Ġstring . Ċ Ġ*/ Ċ val ĠString . as Bearer Ġget () Ġ= Ġ" Bearer Ġ$ this " Ċ Ċ /** Ċ Ġ* ĠSave Ġthe Ġ[ key ]: Ġ[ value ] Ġpair Ġto Ġshared Ġpreferences . Ċ Ġ*/ Ċ fun ĠSharedPreferences . save Item ( key : ĠString , Ġvalue : ĠString ) Ġ= Ġedit Ġ{ Ġput String ( key , Ġvalue ) Ġ} Ċ Ċ /** Ċ Ġ* Ġget Ġthe Ġitem Ġfrom Ġshared Ġpreferences Ġmatching Ġthe Ġgiven Ġ[ key ]. Ċ Ġ*/ Ċ fun ĠSharedPreferences . getItem ( key : ĠString ) Ġ= ĠgetString ( key , Ġ"") Ċ Ċ /** Ċ Ġ* ĠDeletes Ġthe Ġitem Ġwith Ġthe Ġgiven Ġ[ key ] Ġfrom Ġshared Ġpreferences . Ċ Ġ*/ Ċ fun ĠSharedPreferences . removeItem ( key : ĠString ) Ġ= Ġedit Ġ{ Ġremove ( key ) Ġ} Ċ Ċ /** Ċ Ġ* ĠDe codes Ġthe Ġauth Ġtoken Ġto Ġget Ġthe Ġneeded Ġuser Ġinfo Ġout Ġof Ġit . Ċ Ġ*/ Ċ fun Ġget Encoded User From Jwt ( jwt : ĠString ): ĠPair < String , ĠString >? Ġ{ ĊĠĠĠ Ġif Ġ( jwt . isBlank ()) Ġreturn Ġnull ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġjwt . split (".") ĊĠĠĠĠĠĠĠ Ġval Ġtoken Bytes Ġ= Ġparts [ 1 ]. toByteArray ( charset (" UTF - 8 ")) ĊĠĠĠĠĠĠĠ Ġval ĠuserInfo From Token Ġ= ĠString ( Base 6 4 . decode ( token Bytes , ĠBase 6 4 . DEFAULT )). split (",") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . contains (" attr - ") Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠuserInfo Ġ= ĠuserInfo From Token . map Ġ{ Ġit . split (": ")[ 1 ]. replace ("\ "" . to Regex (), Ġ"") Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠuserInfo [ 0 ] Ġto ĠuserInfo [ 1 ] ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Could nt Ġdecode Ġjwt Ġ$ jwt ", Ġe ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠGets Ġthe Ġnext Ġ[ time Frame ] Ġafter Ġthe Ġgiven Ġepoch Ġmillis . Ċ Ġ*/ Ċ fun ĠLong . next ( time Frame : ĠString ): ĠLong Ġ{ ĊĠĠĠ Ġval Ġtime Frame Split Ġ= Ġtime Frame . split (" Ġ") ĊĠĠĠ Ġval Ġdate Ġ= ĠLocalDateTime . of Instant ( Date ( this ). to Instant (), ĠZone Id . of ( Zone Offset . UTC . id )) ĊĊĠĠĠ Ġval Ġadd Days Ġ= Ġwhen Ġ( time Frame Split [ 1 ]) Ġ{ Ċĉ ĉ " Week " Ġ-> Ġ 7 Ċĉ ĉ " Month " Ġ-> Ġdate . to LocalDate (). month . maxLength () Ċĉ ĉ " Day " Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ("${ time Frame Split [ 1 ]} Ġis Ġnot Ġa Ġvalid Ġtype .") ĊĠĠĠ Ġ} Ġ* Ġtime Frame Split [ 0 ]. toInt () ĊĊĠĠĠ Ġreturn Ġdate . plus Days ( add Days . to Long ()). to Instant ( Zone Offset . UTC ). to Epoch Milli () Ċ } ĊĊ