implement a safari hack for ime (#4186)
remove debug logs use a better hack implement a safari hack extract `isSafari` and `isFirefox` to a global variablezio/stable
parent
2c6c906934
commit
d051614342
|
@ -0,0 +1,2 @@
|
||||||
|
export const isSafari = false
|
||||||
|
export const isFirefox = false
|
|
@ -0,0 +1,6 @@
|
||||||
|
// https://stackoverflow.com/questions/7944460/detect-safari-browser
|
||||||
|
export const isSafari = /^((?!chrome|android).)*safari/i.test(
|
||||||
|
navigator.userAgent,
|
||||||
|
)
|
||||||
|
|
||||||
|
export const isFirefox = /firefox|fxios/i.test(navigator.userAgent)
|
|
@ -1,5 +1,6 @@
|
||||||
import {Dimensions, Platform} from 'react-native'
|
import {Dimensions, Platform} from 'react-native'
|
||||||
|
|
||||||
|
import {isSafari} from 'lib/browser'
|
||||||
import {isWeb} from 'platform/detection'
|
import {isWeb} from 'platform/detection'
|
||||||
const {height: SCREEN_HEIGHT} = Dimensions.get('window')
|
const {height: SCREEN_HEIGHT} = Dimensions.get('window')
|
||||||
|
|
||||||
|
@ -353,10 +354,6 @@ export function parseEmbedPlayerFromUrl(
|
||||||
|
|
||||||
if (id && filename && dimensions && id.includes('AAAAC')) {
|
if (id && filename && dimensions && id.includes('AAAAC')) {
|
||||||
if (Platform.OS === 'web') {
|
if (Platform.OS === 'web') {
|
||||||
const isSafari = /^((?!chrome|android).)*safari/i.test(
|
|
||||||
navigator.userAgent,
|
|
||||||
)
|
|
||||||
|
|
||||||
if (isSafari) {
|
if (isSafari) {
|
||||||
id = id.replace('AAAAC', 'AAAP1')
|
id = id.replace('AAAAC', 'AAAP1')
|
||||||
filename = filename.replace('.gif', '.mp4')
|
filename = filename.replace('.gif', '.mp4')
|
||||||
|
|
|
@ -10,6 +10,7 @@ import {
|
||||||
useMessageDraft,
|
useMessageDraft,
|
||||||
useSaveMessageDraft,
|
useSaveMessageDraft,
|
||||||
} from '#/state/messages/message-drafts'
|
} from '#/state/messages/message-drafts'
|
||||||
|
import {isSafari} from 'lib/browser'
|
||||||
import * as Toast from '#/view/com/util/Toast'
|
import * as Toast from '#/view/com/util/Toast'
|
||||||
import {atoms as a, useTheme} from '#/alf'
|
import {atoms as a, useTheme} from '#/alf'
|
||||||
import {useSharedInputStyles} from '#/components/forms/TextField'
|
import {useSharedInputStyles} from '#/components/forms/TextField'
|
||||||
|
@ -47,6 +48,25 @@ export function MessageInput({
|
||||||
(e: React.KeyboardEvent<HTMLTextAreaElement>) => {
|
(e: React.KeyboardEvent<HTMLTextAreaElement>) => {
|
||||||
// Don't submit the form when the Japanese or any other IME is composing
|
// Don't submit the form when the Japanese or any other IME is composing
|
||||||
if (isComposing.current) return
|
if (isComposing.current) return
|
||||||
|
|
||||||
|
// see https://github.com/bluesky-social/social-app/issues/4178
|
||||||
|
// see https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/
|
||||||
|
// see https://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html
|
||||||
|
//
|
||||||
|
// On Safari, the final keydown event to dismiss the IME - which is the enter key - is also "Enter" below.
|
||||||
|
// Obviously, this causes problems because the final dismissal should _not_ submit the text, but should just
|
||||||
|
// stop the IME editing. This is the behavior of Chrome and Firefox, but not Safari.
|
||||||
|
//
|
||||||
|
// Keycode is deprecated, however the alternative seems to only be to compare the timestamp from the
|
||||||
|
// onCompositionEnd event to the timestamp of the keydown event, which is not reliable. For example, this hack
|
||||||
|
// uses that method: https://github.com/ProseMirror/prosemirror-view/pull/44. However, from my 500ms resulted in
|
||||||
|
// far too long of a delay, and a subsequent enter press would often just end up doing nothing. A shorter time
|
||||||
|
// frame was also not great, since it was too short to be reliable (i.e. an older system might have a larger
|
||||||
|
// time gap between the two events firing.
|
||||||
|
if (isSafari && e.key === 'Enter' && e.keyCode === 229) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (e.key === 'Enter') {
|
if (e.key === 'Enter') {
|
||||||
if (e.shiftKey) return
|
if (e.shiftKey) return
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
|
|
@ -5,6 +5,7 @@ import {ReanimatedScrollEvent} from 'react-native-reanimated/lib/typescript/rean
|
||||||
import {batchedUpdates} from '#/lib/batchedUpdates'
|
import {batchedUpdates} from '#/lib/batchedUpdates'
|
||||||
import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
|
import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
|
||||||
import {useScrollHandlers} from '#/lib/ScrollContext'
|
import {useScrollHandlers} from '#/lib/ScrollContext'
|
||||||
|
import {isFirefox, isSafari} from 'lib/browser'
|
||||||
import {usePalette} from 'lib/hooks/usePalette'
|
import {usePalette} from 'lib/hooks/usePalette'
|
||||||
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
|
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
|
||||||
import {addStyle} from 'lib/styles'
|
import {addStyle} from 'lib/styles'
|
||||||
|
@ -503,8 +504,6 @@ export const List = memo(React.forwardRef(ListImpl)) as <ItemT>(
|
||||||
) => React.ReactElement
|
) => React.ReactElement
|
||||||
|
|
||||||
// https://stackoverflow.com/questions/7944460/detect-safari-browser
|
// https://stackoverflow.com/questions/7944460/detect-safari-browser
|
||||||
const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent)
|
|
||||||
const isFirefox = /firefox|fxios/i.test(navigator.userAgent)
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
sideBorders: {
|
sideBorders: {
|
||||||
|
|
Loading…
Reference in New Issue