Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Composer collapsing when editing canceled/done #17785

Merged
merged 26 commits into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
b84561b
fix: composer height when entering and canceling edit
clauxx Nov 2, 2023
99250ea
fix: blur the composer input when canceling edit
clauxx Nov 2, 2023
f86fde2
Merge branch 'develop' into 17433-composer-expanded-on-cancel
clauxx Nov 2, 2023
ec5c580
fix: focusing animation and composer height after blur
clauxx Nov 3, 2023
7d69fa9
fix: input height when canceling edit while unfocused
clauxx Nov 3, 2023
ba4d618
Merge branch 'develop' into 17433-composer-expanded-on-cancel
clauxx Nov 6, 2023
7ad8165
ref: removed arbitrary keyboard check
clauxx Nov 6, 2023
8c9c93a
fix: moved edit-mentions logic to use-edit to fix unresolved mention
clauxx Nov 6, 2023
1e0664a
fix: composer edit should put the cursor at the end
clauxx Nov 7, 2023
cb9ae2a
Merge branch 'develop' into 17433-composer-expanded-on-cancel
clauxx Nov 7, 2023
a175f3d
fix: (potentially) fixing the mention not resolved during edit
clauxx Nov 9, 2023
2a3b4aa
fix: emoji-kb handler changing the height when default kb appears
clauxx Nov 9, 2023
bb02d86
Fix text content when editing and reentering chat
ibrkhalil Nov 11, 2023
964b196
prevent composer when focusing on opening chat with edit/reply
ibrkhalil Nov 11, 2023
b9f5f73
clean
ibrkhalil Nov 11, 2023
3bbaee2
Clauxx comments
ibrkhalil Nov 11, 2023
abecc38
Apply for reply
ibrkhalil Nov 11, 2023
3ebf345
Lintil soup = yummy
ibrkhalil Nov 13, 2023
17a8824
refactor variable name
ibrkhalil Nov 13, 2023
4fc07bd
Extract the focusing logic from the data setting logic
ibrkhalil Nov 15, 2023
a4568e5
Edge case
ibrkhalil Nov 15, 2023
6397f3e
Merge remote-tracking branch 'origin/17825' into 17433-composer-expan…
clauxx Nov 16, 2023
6940ccd
fix: composer mention key & edit re-enter issues
clauxx Nov 16, 2023
97e7d46
fix: reply cancel input blur and smooth reply focus
clauxx Nov 16, 2023
b41760e
Merge branch 'develop' into 17433-composer-expanded-on-cancel
clauxx Nov 16, 2023
cdd3859
Merge branch 'develop' into 17433-composer-expanded-on-cancel
clauxx Nov 16, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 6 additions & 8 deletions src/status_im2/contexts/chat/composer/edit/view.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
[utils.re-frame :as rf]))

(defn edit-message
[state]
[{:keys [text-value input-ref]}]
[rn/view
{:style style/container
:accessibility-label :edit-message}
Expand All @@ -30,20 +30,18 @@
{:size 24
:icon-only? true
:accessibility-label :edit-cancel-button
:on-press (fn []
(utils/cancel-edit-message state)
(rf/dispatch [:chat.ui/cancel-message-edit]))
:on-press #(utils/cancel-edit-message text-value input-ref)
:type :outline}
:i/close]])

(defn- f-view
[state]
[props]
(let [edit (rf/sub [:chats/edit-message])
height (reanimated/use-shared-value (if edit constants/edit-container-height 0))]
(rn/use-effect #(reanimated/animate height (if edit constants/edit-container-height 0)) [edit])
[reanimated/view {:style (reanimated/apply-animations-to-style {:height height} {})}
(when edit [edit-message state])]))
(when edit [edit-message props])]))

(defn view
[state]
[:f> f-view state])
[props]
[:f> f-view props])
9 changes: 4 additions & 5 deletions src/status_im2/contexts/chat/composer/gesture.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@
(reset! emoji-kb-extra-height nil))
(reset! maximized? false)
(rf/dispatch [:chat.ui/set-input-maximized false])
(when @input-ref
(.blur ^js @input-ref)))
(utils/blur-input input-ref))

(defn bounce-back
[{:keys [height saved-height opacity background-y]}
Expand Down Expand Up @@ -96,13 +95,13 @@
max-height
bounded-height
saved-height))
(when @input-ref ; sheet at min-height, collapse keyboard
(.blur ^js @input-ref)))))))
; sheet at min-height, collapse keyboard
(utils/blur-input input-ref))))))
(gesture/on-end (fn []
(let [diff (- (reanimated/get-shared-value height)
(reanimated/get-shared-value saved-height))]
(if @gesture-enabled?
(if (>= diff 0)
(if (and @expanding? (>= diff 0))
(if (> diff constants/drag-threshold)
(maximize state animations dimensions)
(bounce-back animations dimensions starting-opacity))
Expand Down
7 changes: 4 additions & 3 deletions src/status_im2/contexts/chat/composer/handlers.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"Save new text height, expand composer if possible, show background overlay if needed"
[event
{:keys [maximized? lock-layout? text-value]}
{:keys [height saved-height opacity background-y]}
{:keys [height saved-height last-height opacity background-y]}
{:keys [content-height window-height max-height]}
keyboard-shown]
(when keyboard-shown
Expand All @@ -87,10 +87,11 @@
max-height)
new-height (min new-height max-height)]
(reset! content-height content-size)
(when (utils/update-height? content-size height max-height maximized?)
(when (utils/update-height? content-size height max-height)
(reanimated/animate height new-height)
(reanimated/set-shared-value last-height new-height)
(reanimated/set-shared-value saved-height new-height))
(when (= new-height max-height)
(when (>= new-height max-height)
(reset! maximized? true)
(rf/dispatch [:chat.ui/set-input-maximized true]))
(if (utils/show-background? max-height new-height maximized?)
Expand Down
31 changes: 21 additions & 10 deletions src/status_im2/contexts/chat/composer/keyboard.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
[react-native.async-storage :as async-storage]
[react-native.core :as rn]
[react-native.platform :as platform]
[react-native.reanimated :as reanimated]))
[react-native.reanimated :as reanimated]
[status-im2.contexts.chat.composer.utils :as utils]))

(defn get-kb-height
[curr-height default-height]
Expand All @@ -20,18 +21,28 @@
(async-storage/set-item! :kb-default-height (str height)))))

(defn handle-emoji-kb-ios
"Opening emoji KB on iOS while maximized will cause a flicker up and down. This method handles that."
"Opening emoji KB on iOS will cause a flicker up and down due to height differences.
This method handles that by adding the extra difference between the keyboards. When the input is
expanded to a point where the added difference will make the composer go beyond the screen causing a flicker,
we're subtracting the difference so it only reaches the allowed max-height. We're not animating these
changes to make it appear seamless during transitions between keyboard types when maximized."
[event
{:keys [emoji-kb-extra-height]}
{:keys [text-value]}
{:keys [height saved-height]}
{:keys [max-height]}]
(let [start-h (oops/oget event "startCoordinates.height")
end-h (oops/oget event "endCoordinates.height")
diff (- end-h start-h)
max-height-diff (- max-height diff)
curr-text @text-value]
(if (> (reanimated/get-shared-value height) max-height-diff)
(let [start-h (oops/oget event "startCoordinates.height")
end-h (oops/oget event "endCoordinates.height")
diff (- end-h start-h)
max-height-diff (- max-height diff)
curr-text @text-value
almost-expanded? (> (reanimated/get-shared-value height) max-height-diff)
;; NOTE: the `keyboardWillChangeFrame` is dispatched sometimes when blurring (the input)
;; with a diff of 103, which we don't want to react to as it causes the input to increase.
;; 60 is an arbitrary number to avoid that, but still include the emoji keyboard difference
;; (with some buffer).
smaller-than-emoji-diff? (< diff 60)]
(if (and almost-expanded? (pos? diff) smaller-than-emoji-diff?)
(do
(reanimated/set-shared-value height (- (reanimated/get-shared-value height) diff))
(reanimated/set-shared-value saved-height (- (reanimated/get-shared-value saved-height) diff))
Expand All @@ -58,8 +69,8 @@
#(handle-emoji-kb-ios % props state animations dimensions)))
(reset! keyboard-hide-listener (.addListener rn/keyboard
"keyboardDidHide"
#(when (and platform/android? @input-ref)
(.blur ^js @input-ref)))))
#(when platform/android?
(utils/blur-input input-ref)))))

(defn handle-refocus-emoji-kb-ios
[{:keys [saved-emoji-kb-extra-height]}
Expand Down
21 changes: 14 additions & 7 deletions src/status_im2/contexts/chat/composer/utils.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,10 @@
(max min-v (min v max-v)))

(defn update-height?
[content-size height max-height maximized?]
(when-not @maximized?
(let [diff (Math/abs (- content-size (reanimated/get-shared-value height)))]
(and (not= (reanimated/get-shared-value height) max-height)
(> diff constants/content-change-threshold)))))
[content-size height max-height]
(let [diff (Math/abs (- content-size (reanimated/get-shared-value height)))]
(and (not= (reanimated/get-shared-value height) max-height)
(> diff constants/content-change-threshold))))

(defn show-top-gradient?
[y lines max-lines gradient-opacity focused?]
Expand Down Expand Up @@ -100,10 +99,18 @@
(not reply?)
(not audio?)))

(defn blur-input
[input-ref]
(when @input-ref
(rf/dispatch [:chat.ui/set-input-focused false])
(.blur ^js @input-ref)))

(defn cancel-edit-message
[{:keys [text-value]}]
[text-value input-ref]
(reset! text-value "")
(rf/dispatch [:chat.ui/set-input-content-height constants/input-height]))
(blur-input input-ref)
(rf/dispatch [:chat.ui/set-input-content-height constants/input-height])
(rf/dispatch [:chat.ui/cancel-message-edit]))

(defn count-lines
[s]
Expand Down
7 changes: 5 additions & 2 deletions src/status_im2/contexts/chat/composer/view.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,9 @@
(when chat-screen-loaded?
[:<>
[reply/view state]
[edit/view state]])
[edit/view
{:text-value (:text-value state)
:input-ref (:input-ref props)}]])
[reanimated/touchable-opacity
{:active-opacity 1
:on-press (fn []
Expand Down Expand Up @@ -151,7 +153,8 @@
(let [window-height (:height (rn/get-window))
theme (quo.theme/use-theme-value)
opacity (reanimated/use-shared-value 0)
background-y (reanimated/use-shared-value (- window-height)) ; Y position of background overlay
background-y (reanimated/use-shared-value (- window-height)) ; Y position of background
; overlay
blur-height (reanimated/use-shared-value (+ constants/composer-default-height
(:bottom insets)))
extra-params {:insets insets
Expand Down