diff --git a/client/package-lock.json b/client/package-lock.json index 0a51ac3..7536613 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -25,6 +25,7 @@ "react-app-rewired": "^2.2.1", "react-beautiful-dnd": "^13.1.1", "react-datepicker": "^4.8.0", + "react-device-detect": "^2.2.3", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-i18next": "^12.0.0", @@ -19164,6 +19165,18 @@ "node": ">=8" } }, + "node_modules/react-device-detect": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-device-detect/-/react-device-detect-2.2.3.tgz", + "integrity": "sha512-buYY3qrCnQVlIFHrC5UcUoAj7iANs/+srdkwsnNjI7anr3Tt7UY6MqNxtMLlr0tMBied0O49UZVK8XKs3ZIiPw==", + "dependencies": { + "ua-parser-js": "^1.0.33" + }, + "peerDependencies": { + "react": ">= 0.14.0", + "react-dom": ">= 0.14.0" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -22122,6 +22135,24 @@ "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.2.2.tgz", "integrity": "sha512-C7pYBQK17EjSg8tVNY91KHdUt5Nf6FMJ+c3js076quPmBML57PmNMzAcIq/2kf/hSYtFABNDIYNYlJRl5BJhGw==" }, + "node_modules/ua-parser-js": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.34.tgz", + "integrity": "sha512-K9mwJm/DaB6mRLZfw6q8IMXipcrmuT6yfhYmwhAkuh+81sChuYstYA+znlgaflUPaYUa3odxKPKGw6Vw/lANew==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -37290,6 +37321,14 @@ } } }, + "react-device-detect": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-device-detect/-/react-device-detect-2.2.3.tgz", + "integrity": "sha512-buYY3qrCnQVlIFHrC5UcUoAj7iANs/+srdkwsnNjI7anr3Tt7UY6MqNxtMLlr0tMBied0O49UZVK8XKs3ZIiPw==", + "requires": { + "ua-parser-js": "^1.0.33" + } + }, "react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -39534,6 +39573,11 @@ "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.2.2.tgz", "integrity": "sha512-C7pYBQK17EjSg8tVNY91KHdUt5Nf6FMJ+c3js076quPmBML57PmNMzAcIq/2kf/hSYtFABNDIYNYlJRl5BJhGw==" }, + "ua-parser-js": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.34.tgz", + "integrity": "sha512-K9mwJm/DaB6mRLZfw6q8IMXipcrmuT6yfhYmwhAkuh+81sChuYstYA+znlgaflUPaYUa3odxKPKGw6Vw/lANew==" + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", diff --git a/client/package.json b/client/package.json index d1dd8d6..414cfb0 100755 --- a/client/package.json +++ b/client/package.json @@ -72,6 +72,7 @@ "react-app-rewired": "^2.2.1", "react-beautiful-dnd": "^13.1.1", "react-datepicker": "^4.8.0", + "react-device-detect": "^2.2.3", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-i18next": "^12.0.0", diff --git a/client/src/components/Card/NameEdit.jsx b/client/src/components/Card/NameEdit.jsx index f94b04d..63d2451 100644 --- a/client/src/components/Card/NameEdit.jsx +++ b/client/src/components/Card/NameEdit.jsx @@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useImperativeHandle, useRef, useState } import PropTypes from 'prop-types'; import { useTranslation } from 'react-i18next'; import TextareaAutosize from 'react-textarea-autosize'; +import { isSafari } from 'react-device-detect'; import { Button, Form, TextArea } from 'semantic-ui-react'; import { useClosableForm, useField } from '../../hooks'; @@ -53,9 +54,9 @@ const NameEdit = React.forwardRef(({ children, defaultValue, onUpdate }, ref) => (event) => { switch (event.key) { case 'Enter': - if (event.nativeEvent.isComposing) { - break; - } + if (isSafari && event.keyCode !== 13) break; + if (event.nativeEvent.isComposing) break; + event.preventDefault(); submit(); diff --git a/client/src/components/CardModal/NameField.jsx b/client/src/components/CardModal/NameField.jsx index 1dadb9d..1b83cac 100755 --- a/client/src/components/CardModal/NameField.jsx +++ b/client/src/components/CardModal/NameField.jsx @@ -1,6 +1,7 @@ import React, { useCallback, useRef } from 'react'; import PropTypes from 'prop-types'; import TextareaAutosize from 'react-textarea-autosize'; +import { isSafari } from 'react-device-detect'; import { TextArea } from 'semantic-ui-react'; import { useDidUpdate, usePrevious } from '../../lib/hooks'; @@ -19,7 +20,11 @@ const NameField = React.memo(({ defaultValue, onUpdate }) => { }, []); const handleKeyDown = useCallback((event) => { - if (!event.nativeEvent.isComposing && event.key === 'Enter') { + if (event.key === 'Enter') { + if ((isSafari && event.keyCode !== 13) || (!isSafari && event.nativeEvent.isComposing)) { + return; + } + event.preventDefault(); event.target.blur(); diff --git a/client/src/components/CardModal/Tasks/Add.jsx b/client/src/components/CardModal/Tasks/Add.jsx index 6cf6137..d01e26e 100755 --- a/client/src/components/CardModal/Tasks/Add.jsx +++ b/client/src/components/CardModal/Tasks/Add.jsx @@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useImperativeHandle, useRef, useState } import PropTypes from 'prop-types'; import { useTranslation } from 'react-i18next'; import TextareaAutosize from 'react-textarea-autosize'; +import { isSafari } from 'react-device-detect'; import { Button, Form, TextArea } from 'semantic-ui-react'; import { useDidUpdate, useToggle } from '../../../lib/hooks'; @@ -61,9 +62,12 @@ const Add = React.forwardRef(({ children, onCreate }, ref) => { const handleFieldKeyDown = useCallback( (event) => { - if (!event.nativeEvent.isComposing && event.key === 'Enter') { - event.preventDefault(); + if (event.key === 'Enter') { + if ((isSafari && event.keyCode !== 13) || (!isSafari && event.nativeEvent.isComposing)) { + return; + } + event.preventDefault(); submit(); } }, diff --git a/client/src/components/CardModal/Tasks/NameEdit.jsx b/client/src/components/CardModal/Tasks/NameEdit.jsx index 569ee1c..4139515 100755 --- a/client/src/components/CardModal/Tasks/NameEdit.jsx +++ b/client/src/components/CardModal/Tasks/NameEdit.jsx @@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useImperativeHandle, useRef, useState } import PropTypes from 'prop-types'; import { useTranslation } from 'react-i18next'; import TextareaAutosize from 'react-textarea-autosize'; +import { isSafari } from 'react-device-detect'; import { Button, Form, TextArea } from 'semantic-ui-react'; import { useClosableForm, useField } from '../../../hooks'; @@ -51,9 +52,12 @@ const NameEdit = React.forwardRef(({ children, defaultValue, onUpdate }, ref) => const handleFieldKeyDown = useCallback( (event) => { - if (!event.nativeEvent.isComposing && event.key === 'Enter') { - event.preventDefault(); + if (event.key === 'Enter') { + if ((isSafari && event.keyCode !== 13) || (!isSafari && event.nativeEvent.isComposing)) { + return; + } + event.preventDefault(); submit(); } }, diff --git a/client/src/components/List/CardAdd.jsx b/client/src/components/List/CardAdd.jsx index 3e41af9..a11f9ed 100755 --- a/client/src/components/List/CardAdd.jsx +++ b/client/src/components/List/CardAdd.jsx @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import classNames from 'classnames'; import { useTranslation } from 'react-i18next'; import TextareaAutosize from 'react-textarea-autosize'; +import { isSafari } from 'react-device-detect'; import { Button, Form, TextArea } from 'semantic-ui-react'; import { useDidUpdate, useToggle } from '../../lib/hooks'; @@ -49,9 +50,8 @@ const CardAdd = React.memo(({ isOpened, onCreate, onClose }) => { (event) => { switch (event.key) { case 'Enter': { - if (event.nativeEvent.isComposing) { - break; - } + if (isSafari && event.keyCode !== 13) break; + if (event.nativeEvent.isComposing) break; event.preventDefault(); diff --git a/client/src/components/List/NameEdit.jsx b/client/src/components/List/NameEdit.jsx index b1f64ea..35ecee5 100755 --- a/client/src/components/List/NameEdit.jsx +++ b/client/src/components/List/NameEdit.jsx @@ -1,6 +1,7 @@ import React, { useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'; import PropTypes from 'prop-types'; import TextareaAutosize from 'react-textarea-autosize'; +import { isSafari } from 'react-device-detect'; import { TextArea } from 'semantic-ui-react'; import { useField } from '../../hooks'; @@ -50,9 +51,10 @@ const NameEdit = React.forwardRef(({ children, defaultValue, onUpdate }, ref) => (event) => { switch (event.key) { case 'Enter': + if (isSafari && event.keyCode !== 13) break; if (event.nativeEvent.isComposing) break; - event.preventDefault(); + event.preventDefault(); submit(); break;