Skip to content

Commit f528274

Browse files
Remove trigger generics, refactor useMessageComposer
1 parent 39a749f commit f528274

29 files changed

+279
-447
lines changed

src/components/AutoCompleteTextarea/Item.tsx

+1-6
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,8 @@ import React, { useCallback } from 'react';
33
import clsx from 'clsx';
44
import type { SuggestionItemProps } from '../ChatAutoComplete';
55

6-
import type { UnknownType } from '../../types/types';
7-
86
export const Item = React.forwardRef<HTMLAnchorElement, SuggestionItemProps>(
9-
function Item<T extends UnknownType = UnknownType>(
10-
props: SuggestionItemProps<T>,
11-
innerRef: Ref<HTMLAnchorElement>,
12-
) {
7+
function Item(props: SuggestionItemProps, innerRef: Ref<HTMLAnchorElement>) {
138
const {
149
className,
1510
component: Component,

src/components/AutoCompleteTextarea/List.tsx

+14-20
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,14 @@ import { useComponentContext } from '../../context/ComponentContext';
88
import { Item } from './Item';
99
import { escapeRegExp } from '../Message/renderText';
1010

11-
import type { CustomTrigger, UnknownType } from '../../types/types';
1211
import type {
1312
SuggestionEmoji,
1413
SuggestionItem,
1514
SuggestionListProps,
1615
SuggestionUser,
1716
} from '../ChatAutoComplete';
1817

19-
export const List = <
20-
V extends CustomTrigger = CustomTrigger,
21-
EmojiData extends UnknownType = UnknownType,
22-
>({
18+
export const List = ({
2319
className,
2420
component,
2521
currentTrigger,
@@ -34,7 +30,7 @@ export const List = <
3430
SuggestionItem: PropSuggestionItem,
3531
value: propValue,
3632
values,
37-
}: SuggestionListProps<V>) => {
33+
}: SuggestionListProps) => {
3834
const { AutocompleteSuggestionItem } = useComponentContext('SuggestionList');
3935
const SuggestionItem = PropSuggestionItem || AutocompleteSuggestionItem || Item;
4036

@@ -44,42 +40,40 @@ export const List = <
4440

4541
const itemsRef: HTMLElement[] = [];
4642

47-
const isSelected = (item: SuggestionItem<EmojiData>) =>
43+
const isSelected = (item: SuggestionItem) =>
4844
// @ts-expect-error tmp
4945
selectedItemIndex === values.findIndex((value) => getId(value) === getId(item));
5046

51-
const getId = (item: SuggestionItem<EmojiData>) => {
52-
// @ts-expect-error tmp
47+
const getId = (item: SuggestionItem) => {
5348
const textToReplace = getTextToReplace(item);
5449
if (textToReplace.key) {
5550
return textToReplace.key;
5651
}
5752

58-
if (typeof item === 'string' || !(item as SuggestionEmoji<EmojiData>).key) {
53+
if (typeof item === 'string' || !(item as SuggestionEmoji).key) {
5954
return textToReplace.text;
6055
}
6156

62-
return (item as SuggestionEmoji<V>).key;
57+
return (item as SuggestionEmoji).key;
6358
};
6459

6560
const findItemIndex = useCallback(
66-
(item: SuggestionItem<V>) =>
61+
(item: SuggestionItem) =>
62+
// @ts-expect-error tmp
6763
values.findIndex((value) =>
6864
value.id ? value.id === (item as SuggestionUser).id : value.name === item.name,
6965
),
7066
[values],
7167
);
7268

73-
const modifyText = (value: SuggestionListProps<V>['values'][number]) => {
69+
const modifyText = (value: SuggestionListProps['values'][number]) => {
7470
if (!value) return;
75-
// @ts-expect-error tmp
7671
onSelect(getTextToReplace(value));
77-
// @ts-expect-error tmp
7872
if (getSelectedItem) getSelectedItem(value);
7973
};
8074

8175
const handleClick = useCallback(
82-
(e: React.MouseEvent<Element, MouseEvent>, item: SuggestionItem<V>) => {
76+
(e: React.MouseEvent<Element, MouseEvent>, item: SuggestionItem) => {
8377
e?.preventDefault();
8478

8579
const index = findItemIndex(item);
@@ -90,7 +84,7 @@ export const List = <
9084
);
9185

9286
const selectItem = useCallback(
93-
(item: SuggestionItem<V>) => {
87+
(item: SuggestionItem) => {
9488
const index = findItemIndex(item);
9589
setSelectedItemIndex(index);
9690
},
@@ -135,12 +129,11 @@ export const List = <
135129
}, [handleKeyDown]);
136130

137131
useEffect(() => {
138-
// @ts-expect-error tmp
139132
if (values?.length) selectItem(values[0]);
140133
}, [selectItem, values]);
141134

142135
const restructureItem = useCallback(
143-
(item: SuggestionItem<V>) => {
136+
(item: SuggestionItem) => {
144137
const matched = item.name || (item as SuggestionUser).id;
145138

146139
const textBeforeCursor = (propValue || '').slice(0, selectionEnd);
@@ -157,19 +150,20 @@ export const List = <
157150
);
158151

159152
const restructuredValues = useMemo(
160-
// @ts-expect-error tmp
161153
() => values.map(restructureItem),
162154
[values, restructureItem],
163155
);
164156

165157
return (
166158
<ul className={clsx('str-chat__suggestion-list', className)} style={style}>
159+
{/* @ts-expect-error tmp */}
167160
{restructuredValues.map((item, i) => (
168161
<SuggestionItem
169162
className={itemClassName}
170163
// @ts-expect-error tmp
171164
component={component}
172165
item={item}
166+
// @ts-expect-error tmp
173167
key={getId(item).toString()}
174168
onClickHandler={handleClick}
175169
onSelectHandler={selectItem}

src/components/AutoCompleteTextarea/TextareaX.tsx

+5-17
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ import { CommandItem } from '../CommandItem';
1616
import { UserItem } from '../UserItem';
1717
import type { SuggestionItemProps, SuggestionListProps } from '../ChatAutoComplete';
1818

19-
import type { CustomTrigger, UnknownType } from '../../types/types';
20-
2119
type TextareaState = {
2220
actualToken: string;
2321
component: React.ComponentType | null;
@@ -33,10 +31,7 @@ type TextareaState = {
3331
propsValue: string;
3432
};
3533

36-
type TextareaProps<
37-
V extends CustomTrigger = CustomTrigger,
38-
EmojiData extends UnknownType = UnknownType,
39-
> = {
34+
type TextareaProps = {
4035
additionalTextareaProps?: React.TextareaHTMLAttributes<HTMLTextAreaElement>;
4136
className?: string;
4237
closeCommandsList?: () => void;
@@ -72,10 +67,8 @@ type TextareaProps<
7267
showCommandsList?: boolean;
7368
showMentionsList?: boolean;
7469
style?: Omit<CSSProperties, 'height'>;
75-
SuggestionItem?: React.ComponentType<
76-
React.ComponentType<SuggestionItemProps<EmojiData>>
77-
>;
78-
SuggestionList?: React.ComponentType<SuggestionListProps<V, EmojiData>>;
70+
SuggestionItem?: React.ComponentType<React.ComponentType<SuggestionItemProps>>;
71+
SuggestionList?: React.ComponentType<SuggestionListProps>;
7972
trigger: Record<
8073
string,
8174
{
@@ -100,12 +93,7 @@ type TextareaProps<
10093

10194
const _isCommand = (value: string) => value.startsWith('/');
10295

103-
export const TextareaX = <
104-
V extends CustomTrigger = CustomTrigger,
105-
EmojiData extends UnknownType = UnknownType,
106-
>(
107-
props: TextareaProps<V, EmojiData>,
108-
) => {
96+
export const TextareaX = (props: TextareaProps) => {
10997
const {
11098
closeCommandsList,
11199
closeMentionsList,
@@ -798,7 +786,6 @@ export const TextareaX = <
798786
ref={setDropdownRef}
799787
style={restProps.dropdownStyle}
800788
>
801-
{/* @ts-expect-error tmp */}
802789
<SuggestionList
803790
className={restProps.listClassName}
804791
dropdownScroll={_dropdownScroll}
@@ -808,6 +795,7 @@ export const TextareaX = <
808795
)}
809796
itemStyle={restProps.itemStyle}
810797
onSelect={_onSelect}
798+
// @ts-expect-error tmp
811799
SuggestionItem={SuggestionItem}
812800
{...triggerProps}
813801
/>

src/components/Channel/Channel.tsx

+6-7
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ import { getChannel } from '../../utils';
8989
import type { MessageInputProps } from '../MessageInput';
9090
import type {
9191
ChannelUnreadUiState,
92-
CustomTrigger,
9392
GiphyVersions,
9493
ImageAttachmentSizeHandler,
9594
UpdateMessageOptions,
@@ -171,7 +170,7 @@ const isUserResponseArray = (
171170
output: string[] | UserResponse[],
172171
): output is UserResponse[] => (output as UserResponse[])[0]?.id != null;
173172

174-
export type ChannelProps<V extends CustomTrigger = CustomTrigger> =
173+
export type ChannelProps =
175174
ChannelPropsForwardedToComponentContext & {
176175
// todo: move to MessageComposer configuration
177176
/** List of accepted file types */
@@ -244,7 +243,7 @@ export type ChannelProps<V extends CustomTrigger = CustomTrigger> =
244243
/** Custom action handler function to run on hover of an @mention in a message */
245244
onMentionsHover?: OnMentionAction;
246245
/** If `dragAndDropWindow` prop is true, the props to pass to the MessageInput component (overrides props placed directly on MessageInput) */
247-
optionalMessageInputProps?: MessageInputProps<V>;
246+
optionalMessageInputProps?: MessageInputProps;
248247
/** You can turn on/off thumbnail generation for video attachments */
249248
shouldGenerateVideoThumbnail?: boolean;
250249
/** If true, skips the message data string comparison used to memoize the current channel messages (helpful for channels with 1000s of messages) */
@@ -270,8 +269,8 @@ const ChannelContainer = ({
270269
);
271270
};
272271

273-
const UnMemoizedChannel = <V extends CustomTrigger = CustomTrigger>(
274-
props: PropsWithChildren<ChannelProps<V>>,
272+
const UnMemoizedChannel = (
273+
props: PropsWithChildren<ChannelProps>,
275274
) => {
276275
const {
277276
channel: propsChannel,
@@ -307,9 +306,9 @@ const UnMemoizedChannel = <V extends CustomTrigger = CustomTrigger>(
307306
return <ChannelInner {...props} channel={channel} key={channel.cid} />;
308307
};
309308

310-
const ChannelInner = <V extends CustomTrigger = CustomTrigger>(
309+
const ChannelInner = (
311310
props: PropsWithChildren<
312-
ChannelProps<V> & {
311+
ChannelProps & {
313312
channel: StreamChannel;
314313
key: string;
315314
}

0 commit comments

Comments
 (0)