github.com/simpleiot/simpleiot@v0.18.3/frontend/src/Storage.elm (about)

     1  port module Storage exposing
     2      ( Storage, load
     3      , signIn, signOut
     4      , fromJson
     5      )
     6  
     7  {-|
     8  
     9  @docs Storage, save, load
    10  @docs signIn, signOut
    11  
    12  -}
    13  
    14  import Api.Auth as Auth exposing (User)
    15  import Json.Decode as Json
    16  import Json.Encode as Encode
    17  
    18  
    19  type alias Storage =
    20      { user : Maybe User
    21      }
    22  
    23  
    24  fromJson : Json.Value -> Storage
    25  fromJson json =
    26      json
    27          |> Json.decodeValue decoder
    28          |> Result.withDefault init
    29  
    30  
    31  init : Storage
    32  init =
    33      { user = Nothing
    34      }
    35  
    36  
    37  decoder : Json.Decoder Storage
    38  decoder =
    39      Json.map Storage
    40          (Json.field "user" (Json.maybe Auth.decode))
    41  
    42  
    43  save : Storage -> Json.Value
    44  save storage =
    45      Encode.object
    46          [ ( "user"
    47            , storage.user
    48                  |> Maybe.map Auth.encode
    49                  |> Maybe.withDefault Encode.null
    50            )
    51          ]
    52  
    53  
    54  
    55  -- UPDATING STORAGE
    56  
    57  
    58  signIn : User -> Storage -> Cmd msg
    59  signIn user storage =
    60      saveToLocalStorage { storage | user = Just user }
    61  
    62  
    63  signOut : Storage -> Cmd msg
    64  signOut storage =
    65      saveToLocalStorage { storage | user = Nothing }
    66  
    67  
    68  
    69  -- PORTS
    70  
    71  
    72  saveToLocalStorage : Storage -> Cmd msg
    73  saveToLocalStorage =
    74      save >> save_
    75  
    76  
    77  port save_ : Json.Value -> Cmd msg
    78  
    79  
    80  load : (Storage -> msg) -> Sub msg
    81  load fromStorage =
    82      load_ (fromJson >> fromStorage)
    83  
    84  
    85  port load_ : (Json.Value -> msg) -> Sub msg