fix: ctrl+a does not work on Windows in code block (#5692)

This commit is contained in:
Tom Moor
2023-08-14 16:16:12 -04:00
committed by GitHub
parent 9f0534d544
commit 28ae1af2a3
12 changed files with 30 additions and 19 deletions

View File

@@ -14,6 +14,7 @@ import {
BrowserIcon, BrowserIcon,
} from "outline-icons"; } from "outline-icons";
import * as React from "react"; import * as React from "react";
import { isMac } from "@shared/utils/browser";
import { import {
developersUrl, developersUrl,
changelogUrl, changelogUrl,
@@ -26,7 +27,6 @@ import KeyboardShortcuts from "~/scenes/KeyboardShortcuts";
import { createAction } from "~/actions"; import { createAction } from "~/actions";
import { NavigationSection, RecentSearchesSection } from "~/actions/sections"; import { NavigationSection, RecentSearchesSection } from "~/actions/sections";
import Desktop from "~/utils/Desktop"; import Desktop from "~/utils/Desktop";
import { isMac } from "~/utils/browser";
import history from "~/utils/history"; import history from "~/utils/history";
import isCloudHosted from "~/utils/isCloudHosted"; import isCloudHosted from "~/utils/isCloudHosted";
import { import {

View File

@@ -6,6 +6,7 @@ import * as React from "react";
import styled from "styled-components"; import styled from "styled-components";
import breakpoint from "styled-components-breakpoint"; import breakpoint from "styled-components-breakpoint";
import { depths, s } from "@shared/styles"; import { depths, s } from "@shared/styles";
import { supportsPassiveListener } from "@shared/utils/browser";
import Button from "~/components/Button"; import Button from "~/components/Button";
import Fade from "~/components/Fade"; import Fade from "~/components/Fade";
import Flex from "~/components/Flex"; import Flex from "~/components/Flex";
@@ -14,7 +15,6 @@ import useMobile from "~/hooks/useMobile";
import useStores from "~/hooks/useStores"; import useStores from "~/hooks/useStores";
import { draggableOnDesktop, fadeOnDesktopBackgrounded } from "~/styles"; import { draggableOnDesktop, fadeOnDesktopBackgrounded } from "~/styles";
import Desktop from "~/utils/Desktop"; import Desktop from "~/utils/Desktop";
import { supportsPassiveListener } from "~/utils/browser";
type Props = { type Props = {
left?: React.ReactNode; left?: React.ReactNode;

View File

@@ -3,12 +3,12 @@ import * as React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import styled from "styled-components"; import styled from "styled-components";
import { s } from "@shared/styles"; import { s } from "@shared/styles";
import { isMac } from "@shared/utils/browser";
import Flex from "~/components/Flex"; import Flex from "~/components/Flex";
import NudeButton from "~/components/NudeButton"; import NudeButton from "~/components/NudeButton";
import Tooltip from "~/components/Tooltip"; import Tooltip from "~/components/Tooltip";
import useKeyDown from "~/hooks/useKeyDown"; import useKeyDown from "~/hooks/useKeyDown";
import Desktop from "~/utils/Desktop"; import Desktop from "~/utils/Desktop";
import { isMac } from "~/utils/browser";
function HistoryNavigation(props: React.ComponentProps<typeof Flex>) { function HistoryNavigation(props: React.ComponentProps<typeof Flex>) {
const { t } = useTranslation(); const { t } = useTranslation();

View File

@@ -2,7 +2,7 @@
// maintained. // maintained.
import throttle from "lodash/throttle"; import throttle from "lodash/throttle";
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import { supportsPassiveListener } from "~/utils/browser"; import { supportsPassiveListener } from "@shared/utils/browser";
const getPosition = () => ({ const getPosition = () => ({
x: window.pageXOffset, x: window.pageXOffset,

View File

@@ -6,6 +6,7 @@ import { useHistory } from "react-router-dom";
import { IndexeddbPersistence } from "y-indexeddb"; import { IndexeddbPersistence } from "y-indexeddb";
import * as Y from "yjs"; import * as Y from "yjs";
import MultiplayerExtension from "@shared/editor/extensions/Multiplayer"; import MultiplayerExtension from "@shared/editor/extensions/Multiplayer";
import { supportsPassiveListener } from "@shared/utils/browser";
import Editor, { Props as EditorProps } from "~/components/Editor"; import Editor, { Props as EditorProps } from "~/components/Editor";
import env from "~/env"; import env from "~/env";
import useCurrentUser from "~/hooks/useCurrentUser"; import useCurrentUser from "~/hooks/useCurrentUser";
@@ -16,7 +17,6 @@ import useStores from "~/hooks/useStores";
import useToasts from "~/hooks/useToasts"; import useToasts from "~/hooks/useToasts";
import { AwarenessChangeEvent } from "~/types"; import { AwarenessChangeEvent } from "~/types";
import Logger from "~/utils/Logger"; import Logger from "~/utils/Logger";
import { supportsPassiveListener } from "~/utils/browser";
import { homePath } from "~/utils/routeHelpers"; import { homePath } from "~/utils/routeHelpers";
type Props = EditorProps & { type Props = EditorProps & {

View File

@@ -2,10 +2,10 @@ import * as React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import styled from "styled-components"; import styled from "styled-components";
import { s } from "@shared/styles"; import { s } from "@shared/styles";
import { isMac } from "@shared/utils/browser";
import Flex from "~/components/Flex"; import Flex from "~/components/Flex";
import InputSearch from "~/components/InputSearch"; import InputSearch from "~/components/InputSearch";
import Key from "~/components/Key"; import Key from "~/components/Key";
import { isMac } from "~/utils/browser";
import { metaDisplay, altDisplay } from "~/utils/keyboard"; import { metaDisplay, altDisplay } from "~/utils/keyboard";
function KeyboardShortcuts() { function KeyboardShortcuts() {

View File

@@ -1,5 +1,5 @@
import { isTouchDevice } from "@shared/utils/browser";
import Desktop from "~/utils/Desktop"; import Desktop from "~/utils/Desktop";
import { isTouchDevice } from "~/utils/browser";
/** /**
* Returns "hover" on a non-touch device and "active" on a touch device. To * Returns "hover" on a non-touch device and "active" on a touch device. To

View File

@@ -1,4 +1,4 @@
import { isMac, isWindows } from "./browser"; import { isMac, isWindows } from "@shared/utils/browser";
export default class Desktop { export default class Desktop {
/** /**

View File

@@ -1,4 +1,4 @@
import { isMac } from "~/utils/browser"; import { isMac } from "@shared/utils/browser";
export const altDisplay = isMac() ? "⌥" : "Alt"; export const altDisplay = isMac() ? "⌥" : "Alt";

View File

@@ -1,6 +0,0 @@
const SSR = typeof window === "undefined";
const isMac = !SSR && window.navigator.platform === "MacIntel";
export default function isModKey(event: KeyboardEvent | MouseEvent): boolean {
return isMac ? event.metaKey : event.ctrlKey;
}

View File

@@ -58,6 +58,7 @@ import { Primitive } from "utility-types";
import { Dictionary } from "~/hooks/useDictionary"; import { Dictionary } from "~/hooks/useDictionary";
import { UserPreferences } from "../../types"; import { UserPreferences } from "../../types";
import Storage from "../../utils/Storage"; import Storage from "../../utils/Storage";
import { isMac } from "../../utils/browser";
import { import {
newlineInCode, newlineInCode,
insertSpaceTab, insertSpaceTab,
@@ -208,14 +209,22 @@ export default class CodeFence extends Node {
} }
keys({ type, schema }: { type: NodeType; schema: Schema }) { keys({ type, schema }: { type: NodeType; schema: Schema }) {
return { const output = {
"Shift-Ctrl-\\": toggleBlockType(type, schema.nodes.paragraph), "Shift-Ctrl-\\": toggleBlockType(type, schema.nodes.paragraph),
Tab: insertSpaceTab, Tab: insertSpaceTab,
Enter: newlineInCode, Enter: newlineInCode,
"Shift-Enter": newlineInCode, "Shift-Enter": newlineInCode,
"Ctrl-a": moveToPreviousNewline,
"Ctrl-e": moveToNextNewline,
}; };
if (isMac()) {
return {
...output,
"Ctrl-a": moveToPreviousNewline,
"Ctrl-e": moveToNextNewline,
};
}
return output;
} }
get plugins() { get plugins() {

View File

@@ -1,8 +1,10 @@
const SSR = typeof window === "undefined";
/** /**
* Returns true if the client is a touch device. * Returns true if the client is a touch device.
*/ */
export function isTouchDevice(): boolean { export function isTouchDevice(): boolean {
if (typeof window === "undefined") { if (SSR) {
return false; return false;
} }
return window.matchMedia?.("(hover: none) and (pointer: coarse)")?.matches; return window.matchMedia?.("(hover: none) and (pointer: coarse)")?.matches;
@@ -12,6 +14,9 @@ export function isTouchDevice(): boolean {
* Returns true if the client is running on a Mac. * Returns true if the client is running on a Mac.
*/ */
export function isMac(): boolean { export function isMac(): boolean {
if (SSR) {
return false;
}
return window.navigator.platform === "MacIntel"; return window.navigator.platform === "MacIntel";
} }
@@ -19,6 +24,9 @@ export function isMac(): boolean {
* Returns true if the client is running on Windows. * Returns true if the client is running on Windows.
*/ */
export function isWindows(): boolean { export function isWindows(): boolean {
if (SSR) {
return false;
}
return window.navigator.platform === "Win32"; return window.navigator.platform === "Win32";
} }