Skip to content

Commit be7c6c0

Browse files
fix: event handlers when channels is null on channel list component (#1812)
* fix: event handlers when channels is null on channel list component * fix: don't allow empty cids for sync api call * Revert "fix: don't allow empty cids for sync api call" This reverts commit 071d846. * refactor: improve the typescript for setChannels within event handlers
1 parent a31d899 commit be7c6c0

13 files changed

+43
-31
lines changed

package/src/components/ChannelList/ChannelList.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export type ChannelListProps<
8888
* @overrideType Function
8989
* */
9090
onAddedToChannel?: (
91-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
91+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
9292
event: Event<StreamChatGenerics>,
9393
) => void;
9494
/**
@@ -100,7 +100,7 @@ export type ChannelListProps<
100100
* @overrideType Function
101101
* */
102102
onChannelDeleted?: (
103-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
103+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
104104
event: Event<StreamChatGenerics>,
105105
) => void;
106106
/**
@@ -112,7 +112,7 @@ export type ChannelListProps<
112112
* @overrideType Function
113113
* */
114114
onChannelHidden?: (
115-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
115+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
116116
event: Event<StreamChatGenerics>,
117117
) => void;
118118
/**
@@ -124,7 +124,7 @@ export type ChannelListProps<
124124
* @overrideType Function
125125
* */
126126
onChannelTruncated?: (
127-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
127+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
128128
event: Event<StreamChatGenerics>,
129129
) => void;
130130
/**
@@ -136,7 +136,7 @@ export type ChannelListProps<
136136
* @overrideType Function
137137
* */
138138
onChannelUpdated?: (
139-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
139+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
140140
event: Event<StreamChatGenerics>,
141141
) => void;
142142
/**
@@ -148,7 +148,7 @@ export type ChannelListProps<
148148
* @overrideType Function
149149
* */
150150
onChannelVisible?: (
151-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
151+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
152152
event: Event<StreamChatGenerics>,
153153
) => void;
154154
/**
@@ -161,7 +161,7 @@ export type ChannelListProps<
161161
* @overrideType Function
162162
* */
163163
onMessageNew?: (
164-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
164+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
165165
event: Event<StreamChatGenerics>,
166166
) => void;
167167
/**
@@ -173,7 +173,7 @@ export type ChannelListProps<
173173
* @overrideType Function
174174
* */
175175
onRemovedFromChannel?: (
176-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
176+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
177177
event: Event<StreamChatGenerics>,
178178
) => void;
179179
/**

package/src/components/ChannelList/hooks/listeners/__tests__/useChannelUpdated.test.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@ describe('useChannelUpdated', () => {
3535
} as unknown as StreamChat;
3636

3737
const TestComponent = () => {
38-
const [channels, setChannels] = useState<Channel[]>([mockChannel]);
38+
const [channels, setChannels] = useState<Channel[] | null>([mockChannel]);
3939

4040
useChannelUpdated({ setChannels });
4141

4242
if (
43+
channels &&
4344
channels[0].data?.own_capabilities &&
4445
Object.keys(channels[0].data?.own_capabilities as { [key: string]: boolean }).includes(
4546
'send_messages',

package/src/components/ChannelList/hooks/listeners/useAddedToChannelNotification.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import { getChannel } from '../../utils';
1111

1212
type Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
1313
{
14-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>;
14+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>;
1515
onAddedToChannel?: (
16-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
16+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
1717
event: Event<StreamChatGenerics>,
1818
) => void;
1919
};
@@ -37,7 +37,7 @@ export const useAddedToChannelNotification = <
3737
id: event.channel.id,
3838
type: event.channel.type,
3939
});
40-
setChannels((channels) => uniqBy([channel, ...channels], 'cid'));
40+
setChannels((channels) => (channels ? uniqBy([channel, ...channels], 'cid') : channels));
4141
}
4242
}
4343
};

package/src/components/ChannelList/hooks/listeners/useChannelDeleted.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import type { DefaultStreamChatGenerics } from '../../../../types/types';
88

99
type Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
1010
{
11-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>;
11+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>;
1212
onChannelDeleted?: (
13-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
13+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
1414
event: Event<StreamChatGenerics>,
1515
) => void;
1616
};
@@ -29,6 +29,7 @@ export const useChannelDeleted = <
2929
onChannelDeleted(setChannels, event);
3030
} else {
3131
setChannels((channels) => {
32+
if (!channels) return channels;
3233
const index = channels.findIndex(
3334
(channel) => channel.cid === (event.cid || event.channel?.cid),
3435
);

package/src/components/ChannelList/hooks/listeners/useChannelHidden.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import type { DefaultStreamChatGenerics } from '../../../../types/types';
88

99
type Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
1010
{
11-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>;
11+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>;
1212
onChannelHidden?: (
13-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
13+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
1414
event: Event<StreamChatGenerics>,
1515
) => void;
1616
};
@@ -29,6 +29,8 @@ export const useChannelHidden = <
2929
onChannelHidden(setChannels, event);
3030
} else {
3131
setChannels((channels) => {
32+
if (!channels) return channels;
33+
3234
const index = channels.findIndex(
3335
(channel) => channel.cid === (event.cid || event.channel?.cid),
3436
);

package/src/components/ChannelList/hooks/listeners/useChannelTruncated.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import type { DefaultStreamChatGenerics } from '../../../../types/types';
99
type Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
1010
{
1111
refreshList: () => void;
12-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>;
12+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>;
1313
setForceUpdate: React.Dispatch<React.SetStateAction<number>>;
1414
onChannelTruncated?: (
15-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
15+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
1616
event: Event<StreamChatGenerics>,
1717
) => void;
1818
};

package/src/components/ChannelList/hooks/listeners/useChannelUpdated.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import type { DefaultStreamChatGenerics } from '../../../../types/types';
88

99
type Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
1010
{
11-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>;
11+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>;
1212
onChannelUpdated?: (
13-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
13+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
1414
event: Event<StreamChatGenerics>,
1515
) => void;
1616
};
@@ -29,6 +29,8 @@ export const useChannelUpdated = <
2929
onChannelUpdated(setChannels, event);
3030
} else {
3131
setChannels((channels) => {
32+
if (!channels) return channels;
33+
3234
const index = channels.findIndex(
3335
(channel) => channel.cid === (event.cid || event.channel?.cid),
3436
);

package/src/components/ChannelList/hooks/listeners/useChannelVisible.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import { getChannel } from '../../utils';
1111

1212
type Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
1313
{
14-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>;
14+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>;
1515
onChannelVisible?: (
16-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
16+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
1717
event: Event<StreamChatGenerics>,
1818
) => void;
1919
};
@@ -37,7 +37,7 @@ export const useChannelVisible = <
3737
id: event.channel_id,
3838
type: event.channel_type,
3939
});
40-
setChannels((channels) => uniqBy([channel, ...channels], 'cid'));
40+
setChannels((channels) => (channels ? uniqBy([channel, ...channels], 'cid') : channels));
4141
}
4242
}
4343
};

package/src/components/ChannelList/hooks/listeners/useNewMessage.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { moveChannelUp } from '../../utils';
1010
type Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
1111
{
1212
lockChannelOrder: boolean;
13-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>;
13+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>;
1414
};
1515

1616
export const useNewMessage = <
@@ -24,6 +24,8 @@ export const useNewMessage = <
2424
useEffect(() => {
2525
const handleEvent = (event: Event<StreamChatGenerics>) => {
2626
setChannels((channels) => {
27+
if (!channels) return channels;
28+
2729
if (!lockChannelOrder && event.cid && event.channel_type && event.channel_id) {
2830
const targetChannelIndex = channels.findIndex((c) => c.cid === event.cid);
2931

package/src/components/ChannelList/hooks/listeners/useNewMessageNotification.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import { getChannel } from '../../utils';
1111

1212
type Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
1313
{
14-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>;
14+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>;
1515
onMessageNew?: (
16-
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>,
16+
setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,
1717
event: Event<StreamChatGenerics>,
1818
) => void;
1919
};
@@ -37,7 +37,7 @@ export const useNewMessageNotification = <
3737
id: event.channel.id,
3838
type: event.channel.type,
3939
});
40-
setChannels((channels) => uniqBy([channel, ...channels], 'cid'));
40+
setChannels((channels) => (channels ? uniqBy([channel, ...channels], 'cid') : channels));
4141
}
4242
}
4343
};

0 commit comments

Comments
 (0)