@skbkontur/markdown 2.4.2 → 2.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/Markdown/Markdown.js +1 -1
- package/src/Markdown/MarkdownHelpers/markdownMentionHelpers.d.ts +2 -2
- package/src/Markdown/MarkdownHelpers/markdownMentionHelpers.js +10 -8
- package/src/Markdown/MarkdownMention.d.ts +1 -1
- package/src/Markdown/MarkdownMention.js +29 -5
package/package.json
CHANGED
package/src/Markdown/Markdown.js
CHANGED
|
@@ -135,7 +135,7 @@ export var Markdown = function (props) {
|
|
|
135
135
|
if (textareaRef.current && mention && (api === null || api === void 0 ? void 0 : api.getUsersApi)) {
|
|
136
136
|
var textareaNode = (_a = textareaRef.current) === null || _a === void 0 ? void 0 : _a.node;
|
|
137
137
|
var position = getCursorCoordinates(textareaNode, guid);
|
|
138
|
-
return (React.createElement(MarkdownMention, { value: getMentionValue(mention), getUsersApi: api.getUsersApi, y: position.y, x: position.x,
|
|
138
|
+
return (React.createElement(MarkdownMention, { value: getMentionValue(mention), getUsersApi: api.getUsersApi, y: position.y, x: position.x, onSelectUser: handleSelectUser }));
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
141
|
function handleChangeViewMode(mode) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Menu } from '@skbkontur/react-ui/internal/Menu';
|
|
2
2
|
import { ChangeEvent, MouseEvent, RefObject, SyntheticEvent } from 'react';
|
|
3
|
-
import { Token
|
|
3
|
+
import { Token } from '../types';
|
|
4
4
|
export declare function mentionActions(event: ChangeEvent<HTMLTextAreaElement> | MouseEvent<HTMLTextAreaElement> | SyntheticEvent<HTMLTextAreaElement, Event>, setToken: (token?: Token) => void): void;
|
|
5
|
-
export declare const useMenuKeyListener: (
|
|
5
|
+
export declare const useMenuKeyListener: (onChangeHighlightedIndex: (step: number) => void, onSelectUser: () => void, menuRef?: RefObject<Menu>) => void;
|
|
6
6
|
export declare const getMentionValue: (mention?: Token | null) => string;
|
|
7
7
|
export declare function getAvatarUrl(sid: undefined | null | string): string;
|
|
@@ -12,28 +12,30 @@ export function mentionActions(event, setToken) {
|
|
|
12
12
|
setToken(undefined);
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
-
export var useMenuKeyListener = function (
|
|
15
|
+
export var useMenuKeyListener = function (onChangeHighlightedIndex, onSelectUser, menuRef) {
|
|
16
16
|
useEffect(function () {
|
|
17
17
|
var keyListener = function (event) {
|
|
18
|
-
var _a;
|
|
19
18
|
if (menuRef === null || menuRef === void 0 ? void 0 : menuRef.current) {
|
|
20
19
|
if (ArrowsVertical.includes(event.key)) {
|
|
21
20
|
event.preventDefault();
|
|
22
|
-
if (event.key === 'ArrowUp')
|
|
21
|
+
if (event.key === 'ArrowUp') {
|
|
23
22
|
menuRef.current.up();
|
|
24
|
-
|
|
23
|
+
onChangeHighlightedIndex(-1);
|
|
24
|
+
}
|
|
25
|
+
if (event.key === 'ArrowDown') {
|
|
25
26
|
menuRef.current.down();
|
|
27
|
+
onChangeHighlightedIndex(1);
|
|
28
|
+
}
|
|
26
29
|
}
|
|
27
|
-
if (event.key === 'Enter'
|
|
30
|
+
if (event.key === 'Enter') {
|
|
28
31
|
event.preventDefault();
|
|
29
|
-
|
|
30
|
-
onUserSelect((_a = selected.login) !== null && _a !== void 0 ? _a : '', selected.name);
|
|
32
|
+
onSelectUser();
|
|
31
33
|
}
|
|
32
34
|
}
|
|
33
35
|
};
|
|
34
36
|
window.addEventListener('keydown', keyListener);
|
|
35
37
|
return function () { return window.removeEventListener('keydown', keyListener); };
|
|
36
|
-
}, [menuRef,
|
|
38
|
+
}, [menuRef, onSelectUser, onChangeHighlightedIndex]);
|
|
37
39
|
};
|
|
38
40
|
export var getMentionValue = function (mention) { var _a, _b; return (_b = (_a = mention === null || mention === void 0 ? void 0 : mention.value) === null || _a === void 0 ? void 0 : _a.replace('@', '')) !== null && _b !== void 0 ? _b : ''; };
|
|
39
41
|
export function getAvatarUrl(sid) {
|
|
@@ -2,7 +2,7 @@ import { FC } from 'react';
|
|
|
2
2
|
import { User } from './types';
|
|
3
3
|
interface Props {
|
|
4
4
|
getUsersApi: (value: string) => Promise<User[]>;
|
|
5
|
-
|
|
5
|
+
onSelectUser: (login: string, name: string) => void;
|
|
6
6
|
value: string;
|
|
7
7
|
x: number;
|
|
8
8
|
y: number;
|
|
@@ -43,11 +43,14 @@ import { MARKDOWN_RENDER_CONTAINER, INPUT_DEBOUNCE_TIME } from './constants';
|
|
|
43
43
|
import { getMarkdownMentionStyle, MentionMenuItem, UserDescriptions, UserWrapper, Avatar } from './Markdown.styled';
|
|
44
44
|
import { getAvatarUrl, useMenuKeyListener } from './MarkdownHelpers/markdownMentionHelpers';
|
|
45
45
|
export var MarkdownMention = function (_a) {
|
|
46
|
-
var
|
|
47
|
-
var
|
|
46
|
+
var _b;
|
|
47
|
+
var value = _a.value, onSelectUser = _a.onSelectUser, x = _a.x, y = _a.y, getUsersApi = _a.getUsersApi;
|
|
48
|
+
var _c = useState(), users = _c[0], setUsers = _c[1];
|
|
49
|
+
var _d = useState(0), highlightedIndex = _d[0], setHighlightedIndex = _d[1];
|
|
48
50
|
var menuRef = useRef(null);
|
|
49
51
|
var markdownMentionsRef = useRef(document.getElementById(MARKDOWN_RENDER_CONTAINER));
|
|
50
52
|
var timerRef = useRef(INPUT_DEBOUNCE_TIME);
|
|
53
|
+
var usersLength = (_b = users === null || users === void 0 ? void 0 : users.length) !== null && _b !== void 0 ? _b : 0;
|
|
51
54
|
if (!markdownMentionsRef.current) {
|
|
52
55
|
var container = document.createElement('div');
|
|
53
56
|
container.id = MARKDOWN_RENDER_CONTAINER;
|
|
@@ -75,14 +78,35 @@ export var MarkdownMention = function (_a) {
|
|
|
75
78
|
Toast.push('Ошибка в получении списка пользователей');
|
|
76
79
|
}
|
|
77
80
|
}, [getUsersApi, value]);
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
useEffect(function () {
|
|
82
|
+
setHighlightedIndex(0);
|
|
83
|
+
}, [users]);
|
|
84
|
+
useMenuKeyListener(handleChangeHighlightedIndex, function () { return handleSelectUser(highlightedIndex); }, menuRef);
|
|
85
|
+
if (!usersLength)
|
|
80
86
|
return null;
|
|
81
87
|
return createPortal(React.createElement(ZIndex, { priority: "Toast", style: getMarkdownMentionStyle(x, y) },
|
|
82
|
-
React.createElement(Menu, { ref: menuRef, preventWindowScroll: true, hasShadow: true, maxHeight: 300, width: 320 }, users === null || users === void 0 ? void 0 : users.map(function (user) { return (React.createElement(MentionMenuItem, { key: user.id, onClick: function () {
|
|
88
|
+
React.createElement(Menu, { ref: menuRef, preventWindowScroll: true, hasShadow: true, initialSelectedItemIndex: 0, maxHeight: 300, width: 320 }, users === null || users === void 0 ? void 0 : users.map(function (user, idx) { return (React.createElement(MentionMenuItem, { key: user.id, onClick: function () { return handleSelectUser(idx); } },
|
|
83
89
|
React.createElement(UserWrapper, null,
|
|
84
90
|
React.createElement(Avatar, { height: 48, width: 48, src: getAvatarUrl(user.sid) }),
|
|
85
91
|
React.createElement("div", null,
|
|
86
92
|
React.createElement("div", null, user.name),
|
|
87
93
|
React.createElement(UserDescriptions, null, user === null || user === void 0 ? void 0 : user.teams.map(function (t) { return t.caption; }).join(', ')))))); }))), markdownMentionsRef.current);
|
|
94
|
+
function handleChangeHighlightedIndex(step) {
|
|
95
|
+
var usersLengthIndex = usersLength - 1;
|
|
96
|
+
if (step === -1 && !highlightedIndex)
|
|
97
|
+
setHighlightedIndex(usersLengthIndex);
|
|
98
|
+
else if (step === 1 && highlightedIndex === usersLengthIndex)
|
|
99
|
+
setHighlightedIndex(0);
|
|
100
|
+
else
|
|
101
|
+
setHighlightedIndex(highlightedIndex + step);
|
|
102
|
+
}
|
|
103
|
+
function handleSelectUser(idx) {
|
|
104
|
+
if (users) {
|
|
105
|
+
var selectedUser = users[idx];
|
|
106
|
+
if (selectedUser) {
|
|
107
|
+
var login = selectedUser.login, name_1 = selectedUser.name;
|
|
108
|
+
onSelectUser(login, name_1);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
88
112
|
};
|