Skip to content

Commit 534828a

Browse files
committed
fix: remove redundant loadMore from member hooks
1 parent 88c5628 commit 534828a

8 files changed

Lines changed: 20 additions & 35 deletions

File tree

package/src/components/ChannelDetailsScreen/__tests__/members/ChannelAddMembers.test.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ const baseHookResult = (): UseChannelAddMembersResult => ({
7171
isAlreadyMember: jest.fn(() => false),
7272
isSelected: jest.fn(() => false),
7373
loading: false,
74-
loadingMore: false,
7574
loadMore: jest.fn(),
7675
onChangeSearchText: jest.fn(),
7776
results: [],
@@ -170,8 +169,8 @@ describe('ChannelAddMembers', () => {
170169
expect(screen.getByText('No user found')).toBeTruthy();
171170
});
172171

173-
it('renders the loading-more indicator only while loadingMore is true', () => {
174-
mockHook({ loadingMore: true });
172+
it('renders the loading-more indicator only while loading with existing results', () => {
173+
mockHook({ loading: true, results: [generateUser({ id: 'alice' })] });
175174
renderComponent();
176175
expect(screen.UNSAFE_getByType(require('react-native').ActivityIndicator)).toBeTruthy();
177176
});

package/src/components/ChannelDetailsScreen/__tests__/members/ChannelMemberList.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ type HookResult = ReturnType<typeof useChannelAllMembers>;
4949
const baseHookResult = (): HookResult => ({
5050
hasMore: false,
5151
loading: false,
52-
loadingMore: false,
5352
loadMore: jest.fn(),
5453
results: [],
5554
});
@@ -186,15 +185,16 @@ describe('ChannelMemberList', () => {
186185
expect(latestListProps()?.onEndReached).toBeUndefined();
187186
});
188187

189-
it('renders a footer spinner only while loadingMore', () => {
190-
mockHook({ loadingMore: true, results: [] });
188+
it('renders a footer spinner only while loading more (loading with existing results)', () => {
189+
const results = [generateMember({ user: generateUser({ id: 'alice' }) })];
190+
mockHook({ loading: true, results });
191191
renderList();
192192
const footer = latestListProps()?.ListFooterComponent as React.ReactElement;
193193
expect(footer).not.toBeNull();
194194
expect(footer.type).toBe(ActivityIndicator);
195195

196196
mockFlatList.mockClear();
197-
mockHook({ loadingMore: false, results: [] });
197+
mockHook({ loading: false, results });
198198
renderList();
199199
expect(latestListProps()?.ListFooterComponent).toBeNull();
200200
});

package/src/components/ChannelDetailsScreen/__tests__/members/useChannelAddMembers.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ describe('useChannelAddMembers', () => {
153153
await waitFor(() => expect(queryUsers).toHaveBeenCalledTimes(2));
154154
expect(queryUsers).toHaveBeenNthCalledWith(2, {}, { name: 1 }, { limit: 25, offset: 25 });
155155

156-
await waitFor(() => expect(result.current.loadingMore).toBe(false));
156+
await waitFor(() => expect(result.current.loading).toBe(false));
157157
// 25 + 10 fresh (the overlapping page1 row is deduped away)
158158
expect(result.current.results).toHaveLength(35);
159159
expect(result.current.hasMore).toBe(false);

package/src/components/ChannelDetailsScreen/__tests__/members/useChannelAllMembers.test.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ describe('useChannelAllMembers', () => {
5959
expect(result.current.results.map((m) => m.user?.id)).toEqual(['u-0', 'u-1', 'u-2']);
6060
expect(result.current.hasMore).toBe(false);
6161
expect(result.current.loading).toBe(false);
62-
expect(result.current.loadingMore).toBe(false);
6362
});
6463

6564
it('treats undefined member_count as fully loaded', () => {
@@ -137,7 +136,7 @@ describe('useChannelAllMembers', () => {
137136
{ limit: 25, offset: 25 },
138137
);
139138

140-
await waitFor(() => expect(result.current.loadingMore).toBe(false));
139+
await waitFor(() => expect(result.current.loading).toBe(false));
141140
expect(result.current.results).toHaveLength(35);
142141
expect(result.current.hasMore).toBe(false);
143142
});
@@ -181,15 +180,16 @@ describe('useChannelAllMembers', () => {
181180
await waitFor(() => expect(result.current.loading).toBe(false));
182181

183182
act(() => result.current.loadMore());
184-
await waitFor(() => expect(result.current.loadingMore).toBe(true));
183+
await waitFor(() => expect(result.current.loading).toBe(true));
184+
expect(result.current.results.length).toBeGreaterThan(0);
185185

186186
act(() => result.current.loadMore());
187187
act(() => result.current.loadMore());
188188

189189
expect(queryMembers).toHaveBeenCalledTimes(2);
190190

191191
act(() => resolveSecond?.({ members: buildMembers(25, 'page2') }));
192-
await waitFor(() => expect(result.current.loadingMore).toBe(false));
192+
await waitFor(() => expect(result.current.loading).toBe(false));
193193
});
194194

195195
it('recovers from a queryMembers rejection', async () => {
@@ -204,7 +204,6 @@ describe('useChannelAllMembers', () => {
204204

205205
await waitFor(() => expect(result.current.loading).toBe(false));
206206
expect(result.current.results).toEqual([]);
207-
expect(result.current.loadingMore).toBe(false);
208207
expect(warnSpy).toHaveBeenCalledWith(
209208
'[useChannelAllMembers] queryMembers failed',
210209
expect.any(Error),

package/src/components/ChannelDetailsScreen/components/members/ChannelAddMembers.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ export const ChannelAddMembers = ({
5252
isAlreadyMember,
5353
isSelected,
5454
loading,
55-
loadingMore,
5655
loadMore,
5756
onChangeSearchText,
5857
results,
@@ -88,7 +87,7 @@ export const ChannelAddMembers = ({
8887
/>
8988
);
9089

91-
const loadingMoreIndicator = <>{loadingMore && <ActivityIndicator />}</>;
90+
const loadingMoreIndicator = <>{loading && results.length > 0 && <ActivityIndicator />}</>;
9291

9392
return (
9493
<View style={styles.container}>

package/src/components/ChannelDetailsScreen/components/members/ChannelMemberList.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export type ChannelMemberListProps = {
2828
export const ChannelMemberList = ({ additionalFlatListProps }: ChannelMemberListProps = {}) => {
2929
const { channel, onMemberPress } = useChannelDetailsContext();
3030
const { ChannelMemberActionsSheet, ChannelMemberItem } = useComponentsContext();
31-
const { hasMore, loading, loadingMore, loadMore, results } = useChannelAllMembers({ channel });
31+
const { hasMore, loading, loadMore, results } = useChannelAllMembers({ channel });
3232
const [selectedMember, setSelectedMember] = useState<ChannelMemberResponse | null>(null);
3333

3434
const handleMemberActionsClose = useCallback(() => setSelectedMember(null), []);
@@ -52,8 +52,8 @@ export const ChannelMemberList = ({ additionalFlatListProps }: ChannelMemberList
5252
);
5353

5454
const ListFooterComponent = useMemo(
55-
() => (loadingMore ? <ActivityIndicator /> : null),
56-
[loadingMore],
55+
() => (loading && results.length > 0 ? <ActivityIndicator /> : null),
56+
[loading, results.length],
5757
);
5858

5959
if (loading && results.length === 0) {

package/src/components/ChannelDetailsScreen/hooks/members/useChannelAddMembers.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ export type UseChannelAddMembersResult = {
1717
isAlreadyMember: (userId: string) => boolean;
1818
isSelected: (userId: string) => boolean;
1919
loading: boolean;
20-
loadingMore: boolean;
2120
loadMore: () => void;
2221
onChangeSearchText: (text: string) => void;
2322
results: UserResponse[];
@@ -40,7 +39,6 @@ export const useChannelAddMembers = ({
4039
const [results, setResults] = useState<UserResponse[]>([]);
4140
const [selectedUsers, setSelectedUsers] = useState<UserResponse[]>([]);
4241
const [loading, setLoading] = useState(true);
43-
const [loadingMore, setLoadingMore] = useState(false);
4442
const [hasMore, setHasMore] = useState(true);
4543

4644
const queryRef = useRef('');
@@ -55,10 +53,8 @@ export const useChannelAddMembers = ({
5553
async ({ append, query }: { append: boolean; query: string }) => {
5654
const requestId = ++requestIdRef.current;
5755
inFlightRef.current = true;
58-
if (append) {
59-
setLoadingMore(true);
60-
} else {
61-
setLoading(true);
56+
setLoading(true);
57+
if (!append) {
6258
offsetRef.current = 0;
6359
setHasMore(true);
6460
}
@@ -104,7 +100,6 @@ export const useChannelAddMembers = ({
104100
if (requestId === requestIdRef.current) {
105101
inFlightRef.current = false;
106102
setLoading(false);
107-
setLoadingMore(false);
108103
}
109104
}
110105
},
@@ -170,7 +165,6 @@ export const useChannelAddMembers = ({
170165
isAlreadyMember,
171166
isSelected,
172167
loading,
173-
loadingMore,
174168
loadMore,
175169
onChangeSearchText,
176170
results,

package/src/components/ChannelDetailsScreen/hooks/members/useChannelAllMembers.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ const PAGE_SIZE = 25;
99
export type UseChannelAllMembersResult = {
1010
hasMore: boolean;
1111
loading: boolean;
12-
loadingMore: boolean;
1312
loadMore: () => void;
1413
results: ChannelMemberResponse[];
1514
};
@@ -37,7 +36,6 @@ export const useChannelAllMembers = ({
3736

3837
const [results, setResults] = useState<ChannelMemberResponse[]>([]);
3938
const [loading, setLoading] = useState(mode === 'paginated');
40-
const [loadingMore, setLoadingMore] = useState(false);
4139
const [hasMore, setHasMore] = useState(mode === 'paginated');
4240

4341
const offsetRef = useRef(0);
@@ -48,10 +46,8 @@ export const useChannelAllMembers = ({
4846
async ({ append }: { append: boolean }) => {
4947
const requestId = ++requestIdRef.current;
5048
inFlightRef.current = true;
51-
if (append) {
52-
setLoadingMore(true);
53-
} else {
54-
setLoading(true);
49+
setLoading(true);
50+
if (!append) {
5551
offsetRef.current = 0;
5652
setHasMore(true);
5753
}
@@ -84,7 +80,6 @@ export const useChannelAllMembers = ({
8480
if (requestId === requestIdRef.current) {
8581
inFlightRef.current = false;
8682
setLoading(false);
87-
setLoadingMore(false);
8883
}
8984
}
9085
},
@@ -114,11 +109,10 @@ export const useChannelAllMembers = ({
114109
return {
115110
hasMore: false,
116111
loading: false,
117-
loadingMore: false,
118112
loadMore: noop,
119113
results: localResults,
120114
};
121115
}
122116

123-
return { hasMore, loading, loadingMore, loadMore, results };
117+
return { hasMore, loading, loadMore, results };
124118
};

0 commit comments

Comments
 (0)