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