Skip to content

Commit 867713b

Browse files
author
Zaydek Michels-Gualtieri
committed
Added keyDownTypeFor code -- not tested
1 parent 85f5565 commit 867713b

9 files changed

Lines changed: 321 additions & 1 deletion

File tree

src/RichTextEditor/components/toReact/toReact.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ function toReactHandler(intermediary) {
1515
renderable.push(React.createElement(componentMap[type], {
1616
...props,
1717
key: renderable.length,
18-
}, toReactHandler(props.children)))
18+
}, props.children && toReactHandler(props.children)))
1919
}
2020
if (!renderable.length || (typeof renderable[0] === "string" && !renderable[0])) {
2121
return null
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import isCtrlOrMetaKey from "lib/Client/isCtrlOrMetaKey"
2+
import keyCodeFor from "lib/Client/keyCodeFor"
3+
4+
// https://slack.com/intl/en-kr/help/articles/201374536-Slack-keyboard-shortcuts#format-messages
5+
const applyFormat = {
6+
plaintext(e) {
7+
const ok = (
8+
e.shiftKey &&
9+
isCtrlOrMetaKey(e) &&
10+
e.keyCode === keyCodeFor("P")
11+
)
12+
return ok
13+
},
14+
em(e) {
15+
const ok = (
16+
!e.shiftKey &&
17+
isCtrlOrMetaKey(e) &&
18+
e.keyCode === keyCodeFor("I")
19+
)
20+
return ok
21+
},
22+
strong(e) {
23+
const ok = (
24+
!e.shiftKey &&
25+
isCtrlOrMetaKey(e) &&
26+
e.keyCode === keyCodeFor("B")
27+
)
28+
return ok
29+
},
30+
code(e) {
31+
const ok = (
32+
e.shiftKey &&
33+
isCtrlOrMetaKey(e) &&
34+
e.keyCode === keyCodeFor("C")
35+
)
36+
return ok
37+
},
38+
strike(e) {
39+
const ok = (
40+
e.shiftKey &&
41+
isCtrlOrMetaKey(e) &&
42+
e.keyCode === keyCodeFor("X")
43+
)
44+
return ok
45+
},
46+
a(e) {
47+
const ok = (
48+
!e.shiftKey &&
49+
isCtrlOrMetaKey(e) &&
50+
e.keyCode === keyCodeFor("K")
51+
)
52+
return ok
53+
},
54+
}
55+
56+
export default applyFormat
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import keyCodeFor from "lib/Client/keyCodeFor"
2+
3+
const applyFormatMarkdown = {
4+
em(e) {
5+
const ok = (
6+
e.shiftKey &&
7+
e.keyCode === keyCodeFor("_")
8+
)
9+
return ok
10+
},
11+
strong(e) {
12+
const ok = (
13+
e.shiftKey &&
14+
e.keyCode === keyCodeFor("*")
15+
)
16+
return ok
17+
},
18+
code(e) {
19+
const ok = (
20+
!e.shiftKey &&
21+
e.keyCode === keyCodeFor("`")
22+
)
23+
return ok
24+
},
25+
strike(e) {
26+
const ok = (
27+
e.shiftKey &&
28+
e.keyCode === keyCodeFor("~")
29+
)
30+
return ok
31+
},
32+
a(e) {
33+
const ok = (
34+
(!e.shiftKey && e.keyCode === keyCodeFor("[")) ||
35+
(!e.shiftKey && e.keyCode === keyCodeFor("]"))
36+
)
37+
return ok
38+
},
39+
}
40+
41+
export default applyFormatMarkdown
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import keyCodeFor from "lib/Client/keyCodeFor"
2+
import userAgent from "lib/Client/userAgent"
3+
4+
const deleteLTR = {
5+
rune(e) {
6+
if (!userAgent.isAAPL) {
7+
const ok = (
8+
e.keyCode === keyCodeFor("Delete")
9+
)
10+
return ok
11+
} else {
12+
const ok = (
13+
e.keyCode === keyCodeFor("Delete") ||
14+
(e.ctrlKey && e.keyCode === keyCodeFor("D"))
15+
)
16+
return ok
17+
}
18+
// eslint-disable-next-line no-unreachable
19+
return false
20+
},
21+
word(e) {
22+
if (!userAgent.isAAPL) {
23+
const ok = (
24+
e.ctrlKey &&
25+
e.keyCode === keyCodeFor("Delete")
26+
)
27+
return ok
28+
} else {
29+
const ok = (
30+
e.altKey &&
31+
e.keyCode === keyCodeFor("Delete")
32+
)
33+
return ok
34+
}
35+
// eslint-disable-next-line no-unreachable
36+
return false
37+
},
38+
}
39+
40+
export default deleteLTR
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import keyCodeFor from "lib/Client/keyCodeFor"
2+
import userAgent from "lib/Client/userAgent"
3+
4+
const deleteRTL = {
5+
rune(e) {
6+
const ok = (
7+
e.keyCode === keyCodeFor("Backspace")
8+
)
9+
return ok
10+
},
11+
word(e) {
12+
if (!userAgent.isAAPL) {
13+
const ok = (
14+
e.ctrlKey &&
15+
e.keyCode === keyCodeFor("Backspace")
16+
)
17+
return ok
18+
} else {
19+
const ok = (
20+
e.altKey &&
21+
e.keyCode === keyCodeFor("Backspace")
22+
)
23+
return ok
24+
}
25+
// eslint-disable-next-line no-unreachable
26+
return false
27+
},
28+
line(e) {
29+
if (userAgent.isAAPL) {
30+
const ok = (
31+
e.metaKey &&
32+
e.keyCode === keyCodeFor("Backspace")
33+
)
34+
return ok
35+
}
36+
return false
37+
},
38+
}
39+
40+
export default deleteRTL
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import isCtrlOrMetaKey from "../isCtrlOrMetaKey"
2+
import keyCodeFor from "../keyCodeFor"
3+
import userAgent from "lib/userAgent"
4+
5+
const history = {
6+
undo(e) {
7+
const ok = (
8+
isCtrlOrMetaKey(e) &&
9+
e.keyCode === keyCodeFor("Z")
10+
)
11+
return ok
12+
},
13+
redo(e) {
14+
if (!userAgent.isAAPL) {
15+
const ok = (
16+
e.ctrlKey &&
17+
e.keyCode === keyCodeFor("Y")
18+
)
19+
return ok
20+
} else {
21+
const ok = (
22+
e.shiftKey &&
23+
e.metaKey &&
24+
e.keyCode === keyCodeFor("Z")
25+
)
26+
return ok
27+
}
28+
// eslint-disable-next-line no-unreachable
29+
return false
30+
},
31+
}
32+
33+
export default history
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from "./detectKeydownType"
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import keyCodeFor from "../keyCodeFor"
2+
3+
// Returns the UTF-8 decoded rune count.
4+
function runeCount(str) {
5+
return [...str].length
6+
}
7+
8+
const insertText = {
9+
insertText(e) {
10+
const ok = (
11+
!e.ctrlKey && // Non-command or macro
12+
!e.metaKey && // Non-command or macro
13+
runeCount(e.key) === 1
14+
)
15+
return ok
16+
},
17+
insertTab(e) {
18+
const ok = (
19+
!e.ctrlKey && // Negates browser shortcuts shift-ctrl-tab and ctrl-tab
20+
e.keyCode === keyCodeFor("Tab")
21+
)
22+
return ok
23+
},
24+
insertSoftParagraph(e) {
25+
const ok = (
26+
e.shiftKey &&
27+
e.keyCode === keyCodeFor("Enter")
28+
)
29+
return ok
30+
},
31+
insertHardParagraph(e) {
32+
const ok = (
33+
!e.shiftKey &&
34+
e.keyCode === keyCodeFor("Enter")
35+
)
36+
return ok
37+
},
38+
}
39+
40+
export default insertText
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// import applyFormatMarkdown from "./applyFormatMarkdown"
2+
import applyFormat from "./applyFormat"
3+
import deleteLTR from "./deleteLTR"
4+
import deleteRTL from "./deleteRTL"
5+
import history from "./history"
6+
import insertText from "./insertText"
7+
8+
// Returns a keydown type for a keydown event.
9+
function keyDownTypeFor(e) {
10+
switch (true) {
11+
12+
case applyFormat.plaintext(e):
13+
return "apply-format-plaintext"
14+
case applyFormat.em(e):
15+
return "apply-format-em"
16+
case applyFormat.strong(e):
17+
return "apply-format-strong"
18+
case applyFormat.code(e):
19+
return "apply-format-code"
20+
case applyFormat.strike(e):
21+
return "apply-format-strike"
22+
case applyFormat.a(e):
23+
return "apply-format-a"
24+
25+
// case applyFormatMarkdown.em(e):
26+
// return "apply-format-markdown-em"
27+
// case applyFormatMarkdown.strong(e):
28+
// return "apply-format-markdown-strong"
29+
// case applyFormatMarkdown.code(e):
30+
// return "apply-format-markdown-code"
31+
// case applyFormatMarkdown.strike(e):
32+
// return "apply-format-markdown-strike"
33+
// case applyFormatMarkdown.a(e):
34+
// return "apply-format-markdown-a"
35+
36+
case insertText.insertText(e):
37+
return "insert-text"
38+
case insertText.insertTab(e):
39+
return "insert-tab"
40+
case insertText.insertSoftParagraph(e):
41+
return "insert-soft-paragraph"
42+
case insertText.insertHardParagraph(e):
43+
return "insert-hard-paragraph"
44+
45+
case deleteRTL.line(e): // Takes precedence
46+
return "delete-rtl-line"
47+
case deleteRTL.word(e): // Takes precedence
48+
return "delete-rtl-word"
49+
case deleteRTL.rune(e):
50+
return "delete-rtl-rune"
51+
52+
case deleteLTR.word(e): // Takes precedence
53+
return "delete-ltr-word"
54+
case deleteLTR.rune(e):
55+
return "delete-ltr-rune"
56+
57+
case history.undo(e):
58+
return "undo"
59+
case history.redo(e):
60+
return "redo"
61+
62+
default:
63+
// No-op
64+
break
65+
}
66+
return ""
67+
}
68+
69+
export default keyDownTypeFor

0 commit comments

Comments
 (0)