【操盘手】 内容库 - 修复选择好友或群直接渲染数据的BUG

This commit is contained in:
wong
2025-04-23 14:47:32 +08:00
parent 3e12687cc9
commit b324c87488
4 changed files with 58 additions and 27 deletions

View File

@@ -207,9 +207,9 @@ export default function NewContentLibraryPage() {
> >
<Users className="h-4 w-4" /> <Users className="h-4 w-4" />
</Button> </Button>
<Button variant="ghost" size="sm" onClick={() => removeGroup(group.id)}> <Button variant="ghost" size="sm" onClick={() => removeGroup(group.id)}>
<X className="h-4 w-4" /> <X className="h-4 w-4" />
</Button> </Button>
</div> </div>
</div> </div>
))} ))}

View File

@@ -48,13 +48,15 @@ export function WechatFriendSelector({ open, onOpenChange, selectedFriends, onSe
const [page, setPage] = useState(1) const [page, setPage] = useState(1)
const [totalPages, setTotalPages] = useState(1) const [totalPages, setTotalPages] = useState(1)
const [totalItems, setTotalItems] = useState(0) const [totalItems, setTotalItems] = useState(0)
const [tempSelectedFriends, setTempSelectedFriends] = useState<WechatFriend[]>([])
const pageSize = 20 const pageSize = 20
useEffect(() => { useEffect(() => {
if (open) { if (open) {
fetchFriends(1) fetchFriends(1)
setTempSelectedFriends([...selectedFriends])
} }
}, [open]) }, [open, selectedFriends])
const fetchFriends = async (pageNum: number) => { const fetchFriends = async (pageNum: number) => {
setLoading(true) setLoading(true)
@@ -145,12 +147,12 @@ export function WechatFriendSelector({ open, onOpenChange, selectedFriends, onSe
friends.map((friend) => ( friends.map((friend) => (
<div key={friend.id} className="flex items-center space-x-3 p-2 hover:bg-gray-100 rounded-lg"> <div key={friend.id} className="flex items-center space-x-3 p-2 hover:bg-gray-100 rounded-lg">
<Checkbox <Checkbox
checked={selectedFriends.some((f) => f.id === friend.id)} checked={tempSelectedFriends.some((f) => f.id === friend.id)}
onCheckedChange={(checked) => { onCheckedChange={(checked) => {
if (checked) { if (checked) {
onSelect([...selectedFriends, friend]) setTempSelectedFriends([...tempSelectedFriends, friend])
} else { } else {
onSelect(selectedFriends.filter((f) => f.id !== friend.id)) setTempSelectedFriends(tempSelectedFriends.filter((f) => f.id !== friend.id))
} }
}} }}
/> />
@@ -204,7 +206,12 @@ export function WechatFriendSelector({ open, onOpenChange, selectedFriends, onSe
<Button variant="outline" onClick={() => onOpenChange(false)}> <Button variant="outline" onClick={() => onOpenChange(false)}>
</Button> </Button>
<Button onClick={() => onOpenChange(false)}> ({selectedFriends.length})</Button> <Button onClick={() => {
onSelect(tempSelectedFriends)
onOpenChange(false)
}}>
({tempSelectedFriends.length})
</Button>
</div> </div>
</DialogContent> </DialogContent>
</Dialog> </Dialog>

View File

@@ -43,13 +43,15 @@ export function WechatGroupMemberSelector({
const [page, setPage] = useState(1) const [page, setPage] = useState(1)
const [totalPages, setTotalPages] = useState(1) const [totalPages, setTotalPages] = useState(1)
const [totalItems, setTotalItems] = useState(0) const [totalItems, setTotalItems] = useState(0)
const [tempSelectedMembers, setTempSelectedMembers] = useState<WechatGroupMember[]>([])
const pageSize = 20 const pageSize = 20
useEffect(() => { useEffect(() => {
if (open && groupId) { if (open && groupId) {
fetchGroupMembers(1) fetchGroupMembers(1)
setTempSelectedMembers([...selectedMembers])
} }
}, [open, groupId]) }, [open, groupId, selectedMembers])
const fetchGroupMembers = async (pageNum: number) => { const fetchGroupMembers = async (pageNum: number) => {
setLoading(true) setLoading(true)
@@ -64,14 +66,26 @@ export function WechatGroupMemberSelector({
const response = await api.get<ApiResponse<GroupMemberListResponse>>(`/v1/chatroom/getMemberList?${queryParams.toString()}`) const response = await api.get<ApiResponse<GroupMemberListResponse>>(`/v1/chatroom/getMemberList?${queryParams.toString()}`)
if (response.code === 200 && response.data) { if (response.code === 200 && response.data) {
const membersList = response.data.list.map((item: any) => ({ const membersList = response.data.list.map((item: any) => {
id: item.id || `member-${Math.random()}`, // 确定角色类型
nickname: item.nickname || '未知成员', let role: "owner" | "admin" | "member" | undefined;
wechatId: item.identifier || '', if (item.isOwner) {
avatar: item.avatar || '/placeholder.svg', role = "owner";
role: item.isOwner ? 'owner' : (item.isAdmin ? 'admin' : 'member'), } else if (item.isAdmin) {
joinTime: item.createTime ? new Date(item.createTime * 1000).toLocaleString() : '--' role = "admin";
})) } else {
role = "member";
}
return {
id: item.id || `member-${Math.random()}`,
nickname: item.name || item.ownerNickname || '未知成员',
wechatId: item.ownerWechatId || item.identifier || '',
avatar: item.ownerAvatar || item.avatar || '/placeholder.svg',
role: role,
joinTime: item.createTime ? new Date(item.createTime * 1000).toLocaleString() : '--'
};
});
setMembers(membersList) setMembers(membersList)
setTotalItems(response.data.total) setTotalItems(response.data.total)
@@ -139,12 +153,12 @@ export function WechatGroupMemberSelector({
members.map((member) => ( members.map((member) => (
<div key={member.id} className="flex items-center space-x-3 p-2 hover:bg-gray-100 rounded-lg"> <div key={member.id} className="flex items-center space-x-3 p-2 hover:bg-gray-100 rounded-lg">
<Checkbox <Checkbox
checked={selectedMembers.some((m) => m.id === member.id)} checked={tempSelectedMembers.some((m) => m.id === member.id)}
onCheckedChange={(checked) => { onCheckedChange={(checked) => {
if (checked) { if (checked) {
onSelect([...selectedMembers, member]) setTempSelectedMembers([...tempSelectedMembers, member])
} else { } else {
onSelect(selectedMembers.filter((m) => m.id !== member.id)) setTempSelectedMembers(tempSelectedMembers.filter((m) => m.id !== member.id))
} }
}} }}
/> />
@@ -201,8 +215,11 @@ export function WechatGroupMemberSelector({
<Button variant="outline" onClick={() => onOpenChange(false)}> <Button variant="outline" onClick={() => onOpenChange(false)}>
</Button> </Button>
<Button onClick={() => onOpenChange(false)}> <Button onClick={() => {
({selectedMembers.length}) onSelect(tempSelectedMembers)
onOpenChange(false)
}}>
({tempSelectedMembers.length})
</Button> </Button>
</div> </div>
</DialogContent> </DialogContent>

View File

@@ -36,13 +36,15 @@ export function WechatGroupSelector({ open, onOpenChange, selectedGroups, onSele
const [page, setPage] = useState(1) const [page, setPage] = useState(1)
const [totalPages, setTotalPages] = useState(1) const [totalPages, setTotalPages] = useState(1)
const [totalItems, setTotalItems] = useState(0) const [totalItems, setTotalItems] = useState(0)
const [tempSelectedGroups, setTempSelectedGroups] = useState<WechatGroup[]>([])
const pageSize = 20 const pageSize = 20
useEffect(() => { useEffect(() => {
if (open) { if (open) {
fetchGroups(1) fetchGroups(1)
setTempSelectedGroups([...selectedGroups])
} }
}, [open]) }, [open, selectedGroups])
const fetchGroups = async (pageNum: number) => { const fetchGroups = async (pageNum: number) => {
setLoading(true) setLoading(true)
@@ -130,12 +132,12 @@ export function WechatGroupSelector({ open, onOpenChange, selectedGroups, onSele
groups.map((group) => ( groups.map((group) => (
<div key={group.id} className="flex items-center space-x-3 p-2 hover:bg-gray-100 rounded-lg"> <div key={group.id} className="flex items-center space-x-3 p-2 hover:bg-gray-100 rounded-lg">
<Checkbox <Checkbox
checked={selectedGroups.some((g) => g.id === group.id)} checked={tempSelectedGroups.some((g) => g.id === group.id)}
onCheckedChange={(checked) => { onCheckedChange={(checked) => {
if (checked) { if (checked) {
onSelect([...selectedGroups, group]) setTempSelectedGroups([...tempSelectedGroups, group])
} else { } else {
onSelect(selectedGroups.filter((g) => g.id !== group.id)) setTempSelectedGroups(tempSelectedGroups.filter((g) => g.id !== group.id))
} }
}} }}
/> />
@@ -188,7 +190,12 @@ export function WechatGroupSelector({ open, onOpenChange, selectedGroups, onSele
<Button variant="outline" onClick={() => onOpenChange(false)}> <Button variant="outline" onClick={() => onOpenChange(false)}>
</Button> </Button>
<Button onClick={() => onOpenChange(false)}> ({selectedGroups.length})</Button> <Button onClick={() => {
onSelect(tempSelectedGroups)
onOpenChange(false)
}}>
({tempSelectedGroups.length})
</Button>
</div> </div>
</DialogContent> </DialogContent>
</Dialog> </Dialog>