From 95f8360d19938d00aaf9036a76616a7b82093703 Mon Sep 17 00:00:00 2001 From: Ollie H Date: Tue, 2 May 2023 21:00:18 -0700 Subject: [PATCH] Add keyboard shortcuts: new, escape, and hard break (#552) * Add keyboard shortcuts: new, escape, and hard break * Add preferences modal * Remove code accidentally re-added due to rebase * Fix incorrect copy and lint * Put stuff back so diffs are clearer * Re-add invite codes to settings * Address comments * Tune the copy --------- Co-authored-by: Paul Frazee --- package.json | 2 ++ src/state/models/ui/shell.ts | 3 ++- src/view/com/composer/Composer.tsx | 24 +++++++++++++++++ .../com/composer/text-input/TextInput.web.tsx | 2 ++ src/view/com/modals/AltImageRead.tsx | 4 +-- src/view/com/modals/Confirm.tsx | 27 ++++++++++++++++--- src/view/com/util/forms/ToggleButton.tsx | 10 ++++--- src/view/screens/Settings.tsx | 22 +++++---------- yarn.lock | 10 +++++++ 9 files changed, 78 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 92077f4a..e34c52e1 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "@sentry/react-native": "4.13.0", "@tiptap/core": "^2.0.0-beta.220", "@tiptap/extension-document": "^2.0.0-beta.220", + "@tiptap/extension-hard-break": "^2.0.3", "@tiptap/extension-history": "^2.0.3", "@tiptap/extension-link": "^2.0.0-beta.220", "@tiptap/extension-mention": "^2.0.0-beta.220", @@ -58,6 +59,7 @@ "@tiptap/pm": "^2.0.0-beta.220", "@tiptap/react": "^2.0.0-beta.220", "@tiptap/suggestion": "^2.0.0-beta.220", + "@types/node": "^18.16.2", "@zxing/text-encoding": "^0.9.0", "await-lock": "^2.2.2", "base64-js": "^1.5.1", diff --git a/src/state/models/ui/shell.ts b/src/state/models/ui/shell.ts index 5942ec10..0b0da000 100644 --- a/src/state/models/ui/shell.ts +++ b/src/state/models/ui/shell.ts @@ -11,6 +11,7 @@ export interface ConfirmModal { title: string message: string | (() => JSX.Element) onPressConfirm: () => void | Promise + onPressCancel?: () => void | Promise } export interface EditProfileModal { @@ -86,10 +87,10 @@ export interface ContentFilteringSettingsModal { export type Modal = // Account + | AddAppPasswordModal | ChangeHandleModal | DeleteAccountModal | EditProfileModal - | AddAppPasswordModal // Curation | ContentFilteringSettingsModal diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 45e67d7c..5c7594d6 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -88,6 +88,30 @@ export const ComposePost = observer(function ComposePost({ autocompleteView.setup() }, [autocompleteView]) + const onEscape = useCallback( + (e: KeyboardEvent) => { + if (e.key === 'Escape') { + store.shell.openModal({ + name: 'confirm', + title: 'Cancel draft', + onPressConfirm: onClose, + onPressCancel: () => { + store.shell.closeModal() + }, + message: "Are you sure you'd like to cancel this draft?", + }) + } + }, + [store.shell, onClose], + ) + + useEffect(() => { + if (isDesktopWeb) { + window.addEventListener('keydown', onEscape) + return () => window.removeEventListener('keydown', onEscape) + } + }, [onEscape]) + const onPressAddLinkCard = useCallback( (uri: string) => { setExtLink({uri, isLoading: true}) diff --git a/src/view/com/composer/text-input/TextInput.web.tsx b/src/view/com/composer/text-input/TextInput.web.tsx index 4abedb3e..b56d306e 100644 --- a/src/view/com/composer/text-input/TextInput.web.tsx +++ b/src/view/com/composer/text-input/TextInput.web.tsx @@ -4,6 +4,7 @@ import {RichText} from '@atproto/api' import {useEditor, EditorContent, JSONContent} from '@tiptap/react' import {Document} from '@tiptap/extension-document' import History from '@tiptap/extension-history' +import Hardbreak from '@tiptap/extension-hard-break' import {Link} from '@tiptap/extension-link' import {Mention} from '@tiptap/extension-mention' import {Paragraph} from '@tiptap/extension-paragraph' @@ -72,6 +73,7 @@ export const TextInput = React.forwardRef( }), Text, History, + Hardbreak, ], editorProps: { attributes: { diff --git a/src/view/com/modals/AltImageRead.tsx b/src/view/com/modals/AltImageRead.tsx index 4dde8f58..98547728 100644 --- a/src/view/com/modals/AltImageRead.tsx +++ b/src/view/com/modals/AltImageRead.tsx @@ -34,8 +34,8 @@ export function Component({altText}: Props) { testID="altTextImageSaveBtn" onPress={onPress} accessibilityRole="button" - accessibilityLabel="Save" - accessibilityHint="Save alt text"> + accessibilityLabel="Done" + accessibilityHint="Closes alt text modal"> JSX.Element) onPressConfirm: () => void | Promise + onPressCancel?: () => void | Promise }) { const pal = usePalette('default') const store = useStores() @@ -69,12 +71,23 @@ export function Component({ style={[styles.btn]} accessibilityRole="button" accessibilityLabel="Confirm" - // TODO: This needs to be updated so that modal roles are clear; - // Currently there is only one usage for the confirm modal: post deletion - accessibilityHint="Confirms a potentially destructive action"> + accessibilityHint=""> Confirm )} + {onPressCancel === undefined ? null : ( + + + Cancel + + + )} ) } @@ -104,4 +117,12 @@ const styles = StyleSheet.create({ marginHorizontal: 44, backgroundColor: colors.blue3, }, + btnCancel: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + borderRadius: 32, + padding: 14, + marginHorizontal: 20, + }, }) diff --git a/src/view/com/util/forms/ToggleButton.tsx b/src/view/com/util/forms/ToggleButton.tsx index a6e0ba3f..804d414b 100644 --- a/src/view/com/util/forms/ToggleButton.tsx +++ b/src/view/com/util/forms/ToggleButton.tsx @@ -142,9 +142,11 @@ export function ToggleButton({ ]} /> - - {label} - + {label === '' ? null : ( + + {label} + + )} ) @@ -154,6 +156,7 @@ const styles = StyleSheet.create({ outer: { flexDirection: 'row', alignItems: 'center', + gap: 10, }, circle: { width: 42, @@ -161,7 +164,6 @@ const styles = StyleSheet.create({ borderRadius: 15, padding: 4, borderWidth: 1, - marginRight: 10, }, circleFill: { width: 16, diff --git a/src/view/screens/Settings.tsx b/src/view/screens/Settings.tsx index 4d21f8e2..705c37b3 100644 --- a/src/view/screens/Settings.tsx +++ b/src/view/screens/Settings.tsx @@ -34,8 +34,8 @@ import {useCustomPalette} from 'lib/hooks/useCustomPalette' import {AccountData} from 'state/models/session' import {useAnalytics} from 'lib/analytics' import {NavigationProp} from 'lib/routes/types' -import {pluralize} from 'lib/strings/helpers' import {isDesktopWeb} from 'platform/detection' +import {pluralize} from 'lib/strings/helpers' type Props = NativeStackScreenProps export const SettingsScreen = withAuthRequired( @@ -54,6 +54,7 @@ export const SettingsScreen = withAuthRequired( light: {color: colors.blue3}, dark: {color: colors.blue2}, }) + const dangerBg = useCustomPalette({ light: {backgroundColor: colors.red1}, dark: {backgroundColor: colors.red7}, @@ -140,13 +141,12 @@ export const SettingsScreen = withAuthRequired( }, [store]) return ( - + - Signed in as @@ -161,9 +161,7 @@ export const SettingsScreen = withAuthRequired( + noFeedback> @@ -231,9 +229,7 @@ export const SettingsScreen = withAuthRequired( Add account - - Invite a friend @@ -301,9 +297,7 @@ export const SettingsScreen = withAuthRequired( Blocked accounts - - Advanced @@ -338,9 +332,7 @@ export const SettingsScreen = withAuthRequired( Change my handle - - Danger zone @@ -355,16 +347,14 @@ export const SettingsScreen = withAuthRequired( Delete my account - - Developer tools diff --git a/yarn.lock b/yarn.lock index 994ec7fb..3351f6b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4433,6 +4433,11 @@ dependencies: tippy.js "^6.3.7" +"@tiptap/extension-hard-break@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.3.tgz#aa7805d825e5244bdccc508da18c781e231b2859" + integrity sha512-RCln6ARn16jvKTjhkcAD5KzYXYS0xRMc0/LrHeV8TKdCd4Yd0YYHe0PU4F9gAgAfPQn7Dgt4uTVJLN11ICl8sQ== + "@tiptap/extension-history@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.0.3.tgz#8936c15aa46f2ddeada1c3d9abe2888d58d08c30" @@ -4820,6 +4825,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.3.tgz#6bda7819aae6ea0b386ebc5b24bdf602f1b42b01" integrity sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q== +"@types/node@^18.16.2": + version "18.16.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.2.tgz#2f610ea71034b3971c312192377f8a7178eb57f1" + integrity sha512-GQW/JL/5Fz/0I8RpeBG9lKp0+aNcXEaVL71c0D2Q0QHDTFvlYKT7an0onCUXj85anv7b4/WesqdfchLc0jtsCg== + "@types/object.omit@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/object.omit/-/object.omit-3.0.0.tgz#0d31e1208eac8fe2ad5c9499a1016a8273bbfafc"