1module Views.FilterBar.Updates exposing (setMatchers, update)
2
3import Browser.Dom as Dom
4import Browser.Navigation as Navigation
5import Task
6import Utils.Filter exposing (Filter, generateQueryString, parseFilter, stringifyFilter)
7import Views.FilterBar.Types exposing (Model, Msg(..))
8
9
10update : String -> Filter -> Msg -> Model -> ( Model, Cmd Msg )
11update url filter msg model =
12    case msg of
13        AddFilterMatcher emptyMatcherText matcher ->
14            immediatelyFilter url
15                filter
16                { model
17                    | matchers =
18                        if List.member matcher model.matchers then
19                            model.matchers
20
21                        else
22                            model.matchers ++ [ matcher ]
23                    , matcherText =
24                        if emptyMatcherText then
25                            ""
26
27                        else
28                            model.matcherText
29                }
30
31        DeleteFilterMatcher setMatcherText matcher ->
32            immediatelyFilter url
33                filter
34                { model
35                    | matchers = List.filter ((/=) matcher) model.matchers
36                    , matcherText =
37                        if setMatcherText then
38                            Utils.Filter.stringifyMatcher matcher
39
40                        else
41                            model.matcherText
42                }
43
44        UpdateMatcherText value ->
45            ( { model | matcherText = value }, Cmd.none )
46
47        PressingBackspace isPressed ->
48            ( { model | backspacePressed = isPressed }, Cmd.none )
49
50        Noop ->
51            ( model, Cmd.none )
52
53
54immediatelyFilter : String -> Filter -> Model -> ( Model, Cmd Msg )
55immediatelyFilter url filter model =
56    let
57        newFilter =
58            { filter | text = Just (stringifyFilter model.matchers) }
59    in
60    ( { model | matchers = [] }
61    , Cmd.batch
62        [ Navigation.pushUrl model.key (url ++ generateQueryString newFilter)
63        , Dom.focus "filter-bar-matcher" |> Task.attempt (always Noop)
64        ]
65    )
66
67
68setMatchers : Filter -> Model -> Model
69setMatchers filter model =
70    { model
71        | matchers =
72            filter.text
73                |> Maybe.andThen parseFilter
74                |> Maybe.withDefault []
75    }
76