diff --git a/examples/src/SingleSelectExample.elm b/examples/src/SingleSelectExample.elm index 39b7ff4..0fd7bc4 100644 --- a/examples/src/SingleSelectExample.elm +++ b/examples/src/SingleSelectExample.elm @@ -27,7 +27,6 @@ type Msg = HandleSelectUpdate (SingleSelect.Msg Product) | HandleSelection ( Product, SingleSelect.Msg Product ) | HandleFormSubmission - | OnViewChange update : Msg -> Model -> ( Model, Cmd Msg ) @@ -50,12 +49,6 @@ update msg model = HandleFormSubmission -> ( { model | wasFormSubmitted = True }, Cmd.none ) - OnViewChange -> - let - ( updatedSelect, selectCmd ) = - SingleSelect.updatePosition model.select - in - ( { model | select = updatedSelect }, selectCmd ) view : Model -> Html Msg @@ -65,7 +58,6 @@ view model = , style "height" "100vh" , style "padding" "3rem" , style "overflow" "auto" - , Html.Events.on "scroll" (Decode.succeed OnViewChange) ] [ h1 [] [ text "SingleSelect Example" ] , div diff --git a/src/SingleSelect.elm b/src/SingleSelect.elm index 8ee8f7f..99e7146 100644 --- a/src/SingleSelect.elm +++ b/src/SingleSelect.elm @@ -69,7 +69,7 @@ type Msg a | UpKeyPressed Int | DownKeyPressed Int | SetSearchText String - | WindowResized ( Int, Int ) + | OnViewChanged | GotAlignment (Result Dom.Error Alignment) | Open | Close @@ -101,8 +101,9 @@ subscriptions : SmartSelect msg a -> Sub msg subscriptions (SmartSelect model) = if model.isOpen then Sub.batch - [ Browser.Events.onResize (\h w -> model.internalMsg <| WindowResized ( h, w )) + [ Browser.Events.onResize (\_ _ -> model.internalMsg <| OnViewChanged) , Browser.Events.onMouseDown (Utilities.clickedOutsideSelect (Id.select model.idPrefix) (model.internalMsg Close)) + , Browser.Events.onAnimationFrame (\_ -> model.internalMsg <| OnViewChanged) ] else @@ -174,15 +175,15 @@ update msg (SmartSelect model) = SetSearchText text -> ( SmartSelect { model | searchText = text, focusedOptionIndex = 0 }, Cmd.none ) - WindowResized _ -> + OnViewChanged -> ( SmartSelect model, Alignment.getAlignment model.idPrefix (\alignment -> model.internalMsg (GotAlignment alignment)) ) GotAlignment result -> - case result of - Ok alignment -> + case ( result, model.isOpen ) of + ( Ok alignment, True ) -> ( SmartSelect { model | alignment = Just alignment }, Cmd.none ) - Err _ -> + ( _, _ ) -> ( SmartSelect model, Cmd.none ) Open ->