mirror of https://github.com/msgbyte/tailchat
refactor: 将群组用户操作相关的逻辑单独抽象成一个hooks方便复用
parent
b44ccfd762
commit
7645300bda
@ -0,0 +1,127 @@
|
|||||||
|
import { openReconfirmModalP } from '@/components/Modal';
|
||||||
|
import { useCallback } from 'react';
|
||||||
|
import {
|
||||||
|
formatFullTime,
|
||||||
|
humanizeMsDuration,
|
||||||
|
model,
|
||||||
|
showSuccessToasts,
|
||||||
|
t,
|
||||||
|
useAsyncRequest,
|
||||||
|
useGroupInfo,
|
||||||
|
useGroupMemberInfos,
|
||||||
|
useMemoizedFn,
|
||||||
|
useSearch,
|
||||||
|
} from 'tailchat-shared';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 群组成员管理相关操作
|
||||||
|
*/
|
||||||
|
export function useGroupMemberAction(groupId: string) {
|
||||||
|
const groupInfo = useGroupInfo(groupId);
|
||||||
|
const members = groupInfo?.members ?? [];
|
||||||
|
const userInfos = useGroupMemberInfos(groupId);
|
||||||
|
|
||||||
|
const { handleMuteMember, handleUnmuteMember } = useMemberMuteAction(
|
||||||
|
groupId,
|
||||||
|
userInfos
|
||||||
|
);
|
||||||
|
|
||||||
|
const { searchText, setSearchText, isSearching, searchResult } = useSearch({
|
||||||
|
dataSource: userInfos,
|
||||||
|
filterFn: (item, searchText) => item.nickname.includes(searchText),
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移除用户
|
||||||
|
*/
|
||||||
|
const [, handleRemoveGroupMember] = useAsyncRequest(
|
||||||
|
async (memberId: string) => {
|
||||||
|
const confirm = await openReconfirmModalP({
|
||||||
|
title: t('确认要将该用户移出群组么'),
|
||||||
|
});
|
||||||
|
if (confirm) {
|
||||||
|
await model.group.deleteGroupMember(groupId, memberId);
|
||||||
|
showSuccessToasts();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[groupId]
|
||||||
|
);
|
||||||
|
|
||||||
|
const getMemberHasMute = useCallback(
|
||||||
|
(userId: string): boolean => {
|
||||||
|
const member = members.find((m) => m.userId === userId);
|
||||||
|
|
||||||
|
if (!member || !member.muteUntil) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const muteUntil = member.muteUntil;
|
||||||
|
|
||||||
|
return new Date(muteUntil).valueOf() > new Date().valueOf();
|
||||||
|
},
|
||||||
|
[members]
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
// 搜索相关
|
||||||
|
searchText,
|
||||||
|
setSearchText,
|
||||||
|
isSearching,
|
||||||
|
searchResult,
|
||||||
|
|
||||||
|
getMemberHasMute,
|
||||||
|
|
||||||
|
// 用户操作
|
||||||
|
handleMuteMember,
|
||||||
|
handleUnmuteMember,
|
||||||
|
handleRemoveGroupMember,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 禁言相关
|
||||||
|
*/
|
||||||
|
function useMemberMuteAction(
|
||||||
|
groupId: string,
|
||||||
|
userInfoList: model.user.UserBaseInfo[]
|
||||||
|
) {
|
||||||
|
/**
|
||||||
|
* 禁言
|
||||||
|
*/
|
||||||
|
const [, handleMuteMember] = useAsyncRequest(
|
||||||
|
async (memberId: string, ms: number) => {
|
||||||
|
const memberInfo = userInfoList.find((m) => m._id === memberId);
|
||||||
|
|
||||||
|
if (!memberInfo) {
|
||||||
|
throw new Error(t('没有找到用户'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
await openReconfirmModalP({
|
||||||
|
title: t('确定要禁言 {{name}} 么', { name: memberInfo.nickname }),
|
||||||
|
content: t('禁言 {{length}}, 预计到 {{until}} 为止', {
|
||||||
|
length: humanizeMsDuration(ms),
|
||||||
|
until: formatFullTime(new Date().valueOf() + ms),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
) {
|
||||||
|
await model.group.muteGroupMember(groupId, memberId, ms);
|
||||||
|
showSuccessToasts();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[groupId, userInfoList]
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解除禁言
|
||||||
|
*/
|
||||||
|
const [, handleUnmuteMember] = useAsyncRequest(
|
||||||
|
async (memberId: string) => {
|
||||||
|
await model.group.muteGroupMember(groupId, memberId, -1);
|
||||||
|
showSuccessToasts();
|
||||||
|
},
|
||||||
|
[groupId]
|
||||||
|
);
|
||||||
|
|
||||||
|
return { handleMuteMember, handleUnmuteMember };
|
||||||
|
}
|
Loading…
Reference in New Issue