Skip to content

Commit a4068d6

Browse files
authored
feat: Add query params to the member list props (#1175)
[CLNP-3679](https://sendbird.atlassian.net/browse/CLNP-3679) ## ChangeLog * Added `memberListQueryParams` to the `MemberList`, `MembersModal`, `MutedMemberList`, and `MutedMembersModal` * Added `bannedUserListQueryParams` to the `BannedUserList` and `BannedUsersModal` * Added `operatorListQueryParams` to the `OperatorList` and `OperatorsModal`
1 parent 6f8b55d commit a4068d6

File tree

8 files changed

+46
-21
lines changed

8 files changed

+46
-21
lines changed

src/modules/ChannelSettings/components/ModerationPanel/BannedUserList.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import React, {
66
useContext,
77
ReactNode,
88
} from 'react';
9-
import type { RestrictedUser } from '@sendbird/chat';
9+
import type { BannedUserListQueryParams, RestrictedUser } from '@sendbird/chat';
1010

1111
import Button, { ButtonTypes, ButtonSizes } from '../../../../ui/Button';
1212
import
@@ -23,10 +23,12 @@ import { UserListItemMenu } from '../../../../ui/UserListItemMenu';
2323

2424
interface BannedUserListProps {
2525
renderUserListItem?: (props: UserListItemProps) => ReactNode;
26+
bannedUserListQueryParams?: BannedUserListQueryParams;
2627
}
2728

2829
export const BannedUserList = ({
2930
renderUserListItem = (props) => <UserListItem {...props} />,
31+
bannedUserListQueryParams = {},
3032
}: BannedUserListProps): ReactElement => {
3133
const [members, setMembers] = useState<RestrictedUser[]>([]);
3234
const [hasNext, setHasNext] = useState(false);
@@ -40,7 +42,7 @@ export const BannedUserList = ({
4042
setMembers([]);
4143
return;
4244
}
43-
const bannedUserListQuery = channel?.createBannedUserListQuery({ limit: 10 });
45+
const bannedUserListQuery = channel?.createBannedUserListQuery({ limit: 10, ...bannedUserListQueryParams });
4446
bannedUserListQuery.next().then((users) => {
4547
setMembers(users);
4648
setHasNext(bannedUserListQuery.hasNext);
@@ -106,6 +108,7 @@ export const BannedUserList = ({
106108
refreshList();
107109
}}
108110
renderUserListItem={renderUserListItem}
111+
bannedUserListQueryParams={bannedUserListQueryParams}
109112
/>
110113
)
111114
}

src/modules/ChannelSettings/components/ModerationPanel/BannedUsersModal.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,28 @@ import UserListItem, { UserListItemProps } from '../../../../ui/UserListItem';
1111
import { noop } from '../../../../utils/utils';
1212
import { useChannelSettingsContext } from '../../context/ChannelSettingsProvider';
1313
import { useLocalization } from '../../../../lib/LocalizationContext';
14-
import { BannedUserListQuery, RestrictedUser } from '@sendbird/chat';
14+
import { BannedUserListQuery, BannedUserListQueryParams, RestrictedUser } from '@sendbird/chat';
1515
import { useOnScrollPositionChangeDetector } from '../../../../hooks/useOnScrollReachedEndDetector';
1616
import { UserListItemMenu } from '../../../../ui/UserListItemMenu';
1717

1818
export interface BannedUsersModalProps {
1919
onCancel(): void;
2020
renderUserListItem?: (props: UserListItemProps) => ReactNode;
21+
bannedUserListQueryParams?: BannedUserListQueryParams;
2122
}
2223

2324
export function BannedUsersModal({
2425
onCancel,
2526
renderUserListItem = (props) => <UserListItem {...props} />,
27+
bannedUserListQueryParams = {},
2628
}: BannedUsersModalProps): ReactElement {
2729
const [members, setMembers] = useState<RestrictedUser[]>([]);
2830
const [memberQuery, setMemberQuery] = useState<BannedUserListQuery | null>(null);
2931
const { channel } = useChannelSettingsContext();
3032
const { stringSet } = useLocalization();
3133

3234
useEffect(() => {
33-
const bannedUserListQuery = channel?.createBannedUserListQuery();
35+
const bannedUserListQuery = channel?.createBannedUserListQuery({ limit: 20, ...bannedUserListQueryParams });
3436
if (bannedUserListQuery) {
3537
bannedUserListQuery.next().then((users) => {
3638
setMembers(users);

src/modules/ChannelSettings/components/ModerationPanel/MemberList.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import React, {
66
useContext,
77
ReactNode,
88
} from 'react';
9-
import type { Member } from '@sendbird/chat/groupChannel';
9+
import type { Member, MemberListQueryParams } from '@sendbird/chat/groupChannel';
1010
import { Role } from '@sendbird/chat';
1111

1212
import { LocalizationContext } from '../../../../lib/LocalizationContext';
@@ -20,10 +20,12 @@ import MembersModal from './MembersModal';
2020
import { InviteUsersModal } from './InviteUsersModal';
2121

2222
interface MemberListProps {
23-
renderUserListItem?: (props: UserListItemProps) => ReactNode;
23+
renderUserListItem?: (props: UserListItemProps & { index: number }) => ReactNode;
24+
memberListQueryParams?: MemberListQueryParams;
2425
}
2526
export const MemberList = ({
2627
renderUserListItem = (props) => <UserListItem {...props} />,
28+
memberListQueryParams = {},
2729
}: MemberListProps): ReactElement => {
2830
const [members, setMembers] = useState<Array<Member>>([]);
2931
const [hasNext, setHasNext] = useState(false);
@@ -40,7 +42,7 @@ export const MemberList = ({
4042
setMembers([]);
4143
return;
4244
}
43-
const memberUserListQuery = channel?.createMemberListQuery({ limit: 10 });
45+
const memberUserListQuery = channel?.createMemberListQuery({ limit: 10, ...memberListQueryParams });
4446
memberUserListQuery.next().then((members) => {
4547
setMembers(members);
4648
setHasNext(memberUserListQuery.hasNext);
@@ -51,10 +53,12 @@ export const MemberList = ({
5153
return (
5254
<div className="sendbird-channel-settings-member-list">
5355
{
54-
members.map((member) => (
56+
members.map((member, index) => (
5557
<React.Fragment key={member.userId}>
5658
{
5759
renderUserListItem({
60+
// NOTE: This `index` is used to display the current user's user item at the top when customizing externally.
61+
index,
5862
user: member,
5963
channel,
6064
size: 'small',
@@ -122,6 +126,7 @@ export const MemberList = ({
122126
forceUpdateUI();
123127
}}
124128
renderUserListItem={renderUserListItem}
129+
memberListQueryParams={memberListQueryParams}
125130
/>
126131
)
127132
}

src/modules/ChannelSettings/components/ModerationPanel/MembersModal.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import React, {
66
useState,
77
} from 'react';
88
import { Role } from '@sendbird/chat';
9-
import { type Member, MemberListQuery } from '@sendbird/chat/groupChannel';
9+
import type { Member, MemberListQuery, MemberListQueryParams } from '@sendbird/chat/groupChannel';
1010

1111
import Modal from '../../../../ui/Modal';
1212
import UserListItem, { type UserListItemProps } from '../../../../ui/UserListItem';
@@ -19,12 +19,14 @@ import { UserListItemMenu } from '../../../../ui/UserListItemMenu';
1919

2020
export interface MembersModalProps {
2121
onCancel(): void;
22-
renderUserListItem?: (props: UserListItemProps) => ReactNode;
22+
renderUserListItem?: (props: UserListItemProps & { index: number }) => ReactNode;
23+
memberListQueryParams?: MemberListQueryParams;
2324
}
2425

2526
export function MembersModal({
2627
onCancel,
2728
renderUserListItem = (props) => <UserListItem {...props} />,
29+
memberListQueryParams = {},
2830
}: MembersModalProps): ReactElement {
2931
const [members, setMembers] = useState<Member[]>([]);
3032
const [memberQuery, setMemberQuery] = useState<MemberListQuery | null>(null);
@@ -35,6 +37,7 @@ export function MembersModal({
3537
useEffect(() => {
3638
const memberListQuery = channel?.createMemberListQuery({
3739
limit: 20,
40+
...memberListQueryParams,
3841
});
3942
memberListQuery?.next().then((members) => {
4043
setMembers(members);
@@ -65,10 +68,12 @@ export function MembersModal({
6568
},
6669
})}
6770
>
68-
{members.map((member: Member) => (
71+
{members.map((member: Member, index) => (
6972
<React.Fragment key={member.userId}>
7073
{
7174
renderUserListItem({
75+
// NOTE: This `index` is used to display the current user's user item at the top when customizing externally.
76+
index,
7277
user: member,
7378
channel,
7479
renderListItemMenu: (props) => (

src/modules/ChannelSettings/components/ModerationPanel/MutedMemberList.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import React, {
55
useCallback,
66
ReactNode,
77
} from 'react';
8-
import type { Member } from '@sendbird/chat/groupChannel';
8+
import type { Member, MemberListQueryParams } from '@sendbird/chat/groupChannel';
99

1010
import { useChannelSettingsContext } from '../../context/ChannelSettingsProvider';
1111
import { useLocalization } from '../../../../lib/LocalizationContext';
@@ -14,13 +14,15 @@ import Button, { ButtonTypes, ButtonSizes } from '../../../../ui/Button';
1414
import Label, { LabelTypography, LabelColors } from '../../../../ui/Label';
1515
import { UserListItemMenu } from '../../../../ui/UserListItemMenu';
1616
import UserListItem, { UserListItemProps } from '../../../../ui/UserListItem';
17-
import MembersModal from './MembersModal';
17+
import MutedMembersModal from './MutedMembersModal';
1818

1919
interface MutedMemberListProps {
2020
renderUserListItem?: (props: UserListItemProps) => ReactNode;
21+
memberListQueryParams?: MemberListQueryParams;
2122
}
2223
export const MutedMemberList = ({
2324
renderUserListItem = (props) => <UserListItem {...props} />,
25+
memberListQueryParams = {},
2426
}: MutedMemberListProps): ReactElement => {
2527
const [members, setMembers] = useState<Member[]>([]);
2628
const [hasNext, setHasNext] = useState(false);
@@ -36,6 +38,7 @@ export const MutedMemberList = ({
3638
}
3739
const memberUserListQuery = channel?.createMemberListQuery({
3840
limit: 10,
41+
...memberListQueryParams,
3942
// @ts-ignore
4043
mutedMemberFilter: 'muted',
4144
});
@@ -101,12 +104,13 @@ export const MutedMemberList = ({
101104
}
102105
{
103106
showModal && (
104-
<MembersModal
107+
<MutedMembersModal
105108
onCancel={() => {
106109
setShowModal(false);
107110
refreshList();
108111
}}
109112
renderUserListItem={renderUserListItem}
113+
memberListQueryParams={memberListQueryParams}
110114
/>
111115
)
112116
}

src/modules/ChannelSettings/components/ModerationPanel/MutedMembersModal.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,20 @@ import UserListItem, { UserListItemProps } from '../../../../ui/UserListItem';
1010
import { noop } from '../../../../utils/utils';
1111
import { useChannelSettingsContext } from '../../context/ChannelSettingsProvider';
1212
import { useLocalization } from '../../../../lib/LocalizationContext';
13-
import { Member, MemberListQuery } from '@sendbird/chat/groupChannel';
13+
import { Member, MemberListQuery, MemberListQueryParams } from '@sendbird/chat/groupChannel';
1414
import { useOnScrollPositionChangeDetector } from '../../../../hooks/useOnScrollReachedEndDetector';
1515
import { UserListItemMenu } from '../../../../ui/UserListItemMenu';
1616

1717
export interface MutedMembersModalProps {
1818
onCancel(): void;
1919
renderUserListItem?: (props: UserListItemProps) => ReactNode;
20+
memberListQueryParams?: MemberListQueryParams;
2021
}
2122

2223
export function MutedMembersModal({
2324
onCancel,
2425
renderUserListItem = (props) => <UserListItem {...props} />,
26+
memberListQueryParams = {},
2527
}: MutedMembersModalProps): ReactElement {
2628
const [members, setMembers] = useState<Member[]>([]);
2729
const [memberQuery, setMemberQuery] = useState<MemberListQuery | null>(null);
@@ -32,6 +34,7 @@ export function MutedMembersModal({
3234
useEffect(() => {
3335
const memberUserListQuery = channel?.createMemberListQuery({
3436
limit: 20,
37+
...memberListQueryParams,
3538
// @ts-ignore
3639
mutedMemberFilter: 'muted',
3740
});

src/modules/ChannelSettings/components/ModerationPanel/OperatorList.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import React, {
66
useContext,
77
ReactNode,
88
} from 'react';
9-
import type { User } from '@sendbird/chat';
9+
import type { OperatorListQueryParams, User } from '@sendbird/chat';
1010

1111
import { LocalizationContext } from '../../../../lib/LocalizationContext';
1212
import { useChannelSettingsContext } from '../../context/ChannelSettingsProvider';
@@ -20,9 +20,11 @@ import AddOperatorsModal from './AddOperatorsModal';
2020

2121
interface OperatorListProps {
2222
renderUserListItem?: (props: UserListItemProps) => ReactNode;
23+
operatorListQueryParams?: OperatorListQueryParams;
2324
}
2425
export const OperatorList = ({
2526
renderUserListItem = (props) => <UserListItem {...props} />,
27+
operatorListQueryParams = {},
2628
}: OperatorListProps): ReactElement => {
2729
const [operators, setOperators] = useState<User[]>([]);
2830
const [showMore, setShowMore] = useState(false);
@@ -36,7 +38,7 @@ export const OperatorList = ({
3638
setOperators([]);
3739
return;
3840
}
39-
const operatorListQuery = channel?.createOperatorListQuery({ limit: 10 });
41+
const operatorListQuery = channel?.createOperatorListQuery({ limit: 10, ...operatorListQueryParams });
4042
operatorListQuery.next().then((operators) => {
4143
setOperators(operators);
4244
setHasNext(operatorListQuery.hasNext);
@@ -110,6 +112,7 @@ export const OperatorList = ({
110112
refreshList();
111113
}}
112114
renderUserListItem={renderUserListItem}
115+
operatorListQueryParams={operatorListQueryParams}
113116
/>
114117
)
115118
}

src/modules/ChannelSettings/components/ModerationPanel/OperatorsModal.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,20 @@ import UserListItem, { UserListItemProps } from '../../../../ui/UserListItem';
1111

1212
import { useChannelSettingsContext } from '../../context/ChannelSettingsProvider';
1313
import { LocalizationContext } from '../../../../lib/LocalizationContext';
14-
import { OperatorListQuery, User } from '@sendbird/chat';
14+
import { OperatorListQuery, OperatorListQueryParams, User } from '@sendbird/chat';
1515
import { useOnScrollPositionChangeDetector } from '../../../../hooks/useOnScrollReachedEndDetector';
1616
import { UserListItemMenu } from '../../../../ui/UserListItemMenu';
1717

1818
export interface OperatorsModalProps {
1919
onCancel?(): void;
2020
renderUserListItem?: (props: UserListItemProps) => ReactNode;
21+
operatorListQueryParams?: OperatorListQueryParams;
2122
}
2223

2324
export function OperatorsModal({
2425
onCancel,
2526
renderUserListItem = (props) => <UserListItem {...props} />,
27+
operatorListQueryParams = {},
2628
}: OperatorsModalProps): ReactElement {
2729
const [operators, setOperators] = useState<User[]>([]);
2830
const [operatorQuery, setOperatorQuery] = useState<OperatorListQuery | null>(null);
@@ -31,9 +33,7 @@ export function OperatorsModal({
3133
const { stringSet } = useContext(LocalizationContext);
3234

3335
useEffect(() => {
34-
const operatorListQuery = channel?.createOperatorListQuery({
35-
limit: 20,
36-
});
36+
const operatorListQuery = channel?.createOperatorListQuery({ limit: 20, ...operatorListQueryParams });
3737
operatorListQuery?.next().then((operators) => {
3838
setOperators(operators);
3939
});

0 commit comments

Comments
 (0)