-
Notifications
You must be signed in to change notification settings - Fork 3.1k
/
Copy pathSuggestions.js
142 lines (123 loc) · 4.24 KB
/
Suggestions.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import PropTypes from 'prop-types';
import React, {useCallback, useImperativeHandle, useRef} from 'react';
import {View} from 'react-native';
import SuggestionEmoji from './SuggestionEmoji';
import SuggestionMention from './SuggestionMention';
import * as SuggestionProps from './suggestionProps';
const propTypes = {
/** A ref to this component */
forwardedRef: PropTypes.shape({current: PropTypes.shape({})}),
/** Function to clear the input */
resetKeyboardInput: PropTypes.func.isRequired,
/** Is auto suggestion picker large */
isAutoSuggestionPickerLarge: PropTypes.bool,
...SuggestionProps.baseProps,
};
const defaultProps = {
forwardedRef: null,
isAutoSuggestionPickerLarge: true,
};
/**
* This component contains the individual suggestion components.
* If you want to add a new suggestion type, add it here.
*
* @returns {React.Component}
*/
function Suggestions({
isComposerFullSize,
value,
setValue,
selection,
setSelection,
updateComment,
composerHeight,
forwardedRef,
resetKeyboardInput,
measureParentContainer,
isAutoSuggestionPickerLarge,
isComposerFocused,
}) {
const suggestionEmojiRef = useRef(null);
const suggestionMentionRef = useRef(null);
const getSuggestions = useCallback(() => suggestionEmojiRef.current.getSuggestions() || suggestionMentionRef.current.getSuggestions(), []);
/**
* Clean data related to EmojiSuggestions
*/
const resetSuggestions = useCallback(() => {
suggestionEmojiRef.current.resetSuggestions();
suggestionMentionRef.current.resetSuggestions();
}, []);
/**
* Listens for keyboard shortcuts and applies the action
*
* @param {Object} e
*/
const triggerHotkeyActions = useCallback((e) => {
const emojiHandler = suggestionEmojiRef.current.triggerHotkeyActions(e);
const mentionHandler = suggestionMentionRef.current.triggerHotkeyActions(e);
return emojiHandler || mentionHandler;
}, []);
const onSelectionChange = useCallback((e) => {
const emojiHandler = suggestionEmojiRef.current.onSelectionChange(e);
return emojiHandler;
}, []);
const updateShouldShowSuggestionMenuToFalse = useCallback(() => {
suggestionEmojiRef.current.updateShouldShowSuggestionMenuToFalse();
suggestionMentionRef.current.updateShouldShowSuggestionMenuToFalse();
}, []);
const setShouldBlockSuggestionCalc = useCallback((shouldBlock) => {
suggestionEmojiRef.current.setShouldBlockSuggestionCalc(shouldBlock);
suggestionMentionRef.current.setShouldBlockSuggestionCalc(shouldBlock);
}, []);
useImperativeHandle(
forwardedRef,
() => ({
resetSuggestions,
onSelectionChange,
triggerHotkeyActions,
updateShouldShowSuggestionMenuToFalse,
setShouldBlockSuggestionCalc,
getSuggestions,
}),
[onSelectionChange, resetSuggestions, setShouldBlockSuggestionCalc, triggerHotkeyActions, updateShouldShowSuggestionMenuToFalse, getSuggestions],
);
const baseProps = {
value,
setValue,
setSelection,
selection,
isComposerFullSize,
updateComment,
composerHeight,
isAutoSuggestionPickerLarge,
measureParentContainer,
isComposerFocused,
};
return (
<View testID="suggestions">
<SuggestionEmoji
ref={suggestionEmojiRef}
// eslint-disable-next-line react/jsx-props-no-spreading
{...baseProps}
resetKeyboardInput={resetKeyboardInput}
/>
<SuggestionMention
ref={suggestionMentionRef}
// eslint-disable-next-line react/jsx-props-no-spreading
{...baseProps}
/>
</View>
);
}
Suggestions.propTypes = propTypes;
Suggestions.defaultProps = defaultProps;
Suggestions.displayName = 'Suggestions';
const SuggestionsWithRef = React.forwardRef((props, ref) => (
<Suggestions
// eslint-disable-next-line react/jsx-props-no-spreading
{...props}
forwardedRef={ref}
/>
));
SuggestionsWithRef.displayName = 'SuggestionsWithRef';
export default SuggestionsWithRef;