package Ġcom . m arch uk . app . feature _ search . presentation Ċ Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . m arch uk . app . core . utils . m vi . M vi ViewModel Ċ import Ġcom . m arch uk . app . core . utils . network . Result Ċ import Ġcom . m arch uk . app . domain . Empty Input Exception Ċ import Ġcom . m arch uk . app . domain . models . Location Ċ import Ġcom . m arch uk . app . domain . use Case . Delete Last Se ar ched Location UseCase Ċ import Ġcom . m arch uk . app . domain . use Case . Get Last Se ar ched Locations UseCase Ċ import Ġcom . m arch uk . app . domain . use Case . Search Locations UseCase Ċ import Ġcom . m arch uk . app . feature _ search . presentation . models . Fo unded Location Ċ import Ġcom . m arch uk . app . feature _ search . presentation . models . Remember ed Location Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io . IOException Ċ Ċ class ĠSearch ViewModel ( ĊĠĠĠ ĠinitialState : ĠSearch ViewState ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval ĠgetLast Se ar ched Locations UseCase : ĠGet Last Se ar ched Locations UseCase , ĊĠĠĠ Ġprivate Ġval Ġsearch Locations UseCase : ĠSearch Locations UseCase , ĊĠĠĠ Ġprivate Ġval Ġdelete Last Se ar ched Location UseCase : ĠDelete Last Se ar ched Location UseCase , ĊĠĠĠ Ġprivate Ġval Ġnavigator : ĠSearch Navigator Ċ ) Ġ: ĠM vi ViewModel < Search ViewState , ĠSearch View Effect , ĠSearch View Action >( ĊĠĠĠ ĠinitialState Ġ= ĠinitialState Ġ?: ĠSearch ViewState ( state Ġ= ĠSearch State . Show Suggestions ) Ċ ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġis Logging Enabled : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Ob serving Last Se ar ched Locations () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( view Action : ĠSearch View Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . process ( view Action ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( view Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSearch View Action . On Input Changed Ġ-> Ġsearch Locations ( view Action . input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSearch View Action . On Location Clicked Ġ-> Ġnavigator . navigate To Forecast ( view Action . location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSearch View Action . On Delete Remember ed Location Clicked Ġ-> Ġdelete Location ( view Action . location ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Location ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Last Se ar ched Location UseCase ( lat Ġ= Ġlocation . lat , Ġlon Ġ= Ġlocation . lon ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Ob serving Last Se ar ched Locations () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetLast Se ar ched Locations UseCase (). collect Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= Ġview State . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremember ed Locations Ġ= Ġlist . reversed (). map Ġ{ Ġlocation Ġ-> ĠRemember ed Location ( location ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsearch Locations ( input : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview State Ġ= Ġview State . copy ( state Ġ= ĠSearch State . Searching , Ġinput Ġ= Ġinput ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġsearch Locations UseCase ( input )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . body . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . copy ( state Ġ= ĠSearch State . Empty Success , Ġfo unded Locations Ġ= Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠSearch State . Success , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfo unded Locations Ġ= Ġresult . body . map Ġ{ Ġlocation Ġ-> ĠF o unded Location ( location ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Error . Api Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= Ġview State . copy ( state Ġ= ĠSearch State . Error . ApiError ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Effect Ġ= ĠSearch View Effect . Show Error ( result . body . error . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Error . Domain Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result . exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIllegalArgumentException Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= Ġview State . copy ( state Ġ= ĠSearch State . Error . ValidationError ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= Ġview State . copy ( state Ġ= ĠSearch State . Error . Network Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEmpty Input Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ= Ġview State . copy ( state Ġ= ĠSearch State . Show Suggestions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Error . Unknown Ġ-> Ġview State Ġ= Ġview State . copy ( state Ġ= ĠSearch State . Error . Unknown Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }