-
Notifications
You must be signed in to change notification settings - Fork 0
/
Main.elm
133 lines (93 loc) · 2.71 KB
/
Main.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
module Main exposing (..)
-- Basic example of how to use the ImageCrop module.
import Browser
import Html exposing (Html, button, div, img, pre, text)
import Html.Attributes exposing (class, src, style)
import Html.Events exposing (onClick)
import ImageCrop
import ImageCrop.Export exposing (cropImageDefault)
import Json.Decode as Decode
-- MAIN
main =
Browser.element
{ init = init
, subscriptions = subscriptions
, update = update
, view = view
}
-- MODEL
type alias Model =
{ url : String
, cropSettings : Maybe ImageCrop.Model
, extractedImageUrl : Maybe String
, error : Maybe String
}
type alias Flags =
{}
init : Flags -> ( Model, Cmd Msg )
init flags =
( { url = "pinnacles.jpg"
, cropSettings = Nothing
, extractedImageUrl = Nothing
, error = Nothing
}
, Cmd.none
)
-- UPDATE
type Msg
= GotImageCropMsg ImageCrop.Msg
| SaveProfilePicture
| GotCroppedImage (Result Decode.Error String)
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
GotImageCropMsg subMsg ->
let
( cropSettings, cmd ) =
ImageCrop.update subMsg model.cropSettings
in
( { model | cropSettings = cropSettings }, Cmd.none )
SaveProfilePicture ->
case model.cropSettings of
Just crop_settings ->
( model, cropImageDefault crop_settings )
Nothing ->
( model, Cmd.none )
GotCroppedImage result ->
case result of
Ok url ->
( { model | extractedImageUrl = Just url }, Cmd.none )
Err _ ->
( { model | error = Just "Could not extract image." }, Cmd.none )
-- VIEW
view : Model -> Html Msg
view model =
div
[]
[ div
[ class "image-crop-picture"
, style "max-width" "100%"
]
[ Html.map GotImageCropMsg (ImageCrop.view model.url model.cropSettings) ]
, button
[ onClick SaveProfilePicture
, style "display" "block"
]
[ text "Save" ]
, case model.extractedImageUrl of
Just url ->
img [ src url ] []
Nothing ->
text ""
, case model.error of
Just s ->
pre [] [ text s ]
Nothing ->
text ""
]
-- SUBSCRIPTIONS
subscriptions model =
ImageCrop.Export.croppedImage (decodeUrl >> GotCroppedImage)
decodeUrl : Decode.Value -> Result Decode.Error String
decodeUrl =
Decode.decodeValue Decode.string