use new get avatar api

This commit is contained in:
hjlarry 2025-09-10 15:15:31 +08:00
parent 89bedae0d3
commit f091868b7c
3 changed files with 57 additions and 3 deletions

View File

@ -33,6 +33,7 @@ from controllers.console.wraps import (
only_edition_cloud,
setup_required,
)
from core.file import helpers as file_helpers
from extensions.ext_database import db
from fields.member_fields import account_fields
from libs.helper import TimestampField, email, extract_remote_ip, timezone
@ -124,6 +125,17 @@ class AccountNameApi(Resource):
class AccountAvatarApi(Resource):
@setup_required
@login_required
@account_initialization_required
def get(self):
parser = reqparse.RequestParser()
parser.add_argument("avatar", type=str, required=True, location="args")
args = parser.parse_args()
avatar_url = file_helpers.get_signed_file_url(args["avatar"])
return {"avatar_url": avatar_url}
@setup_required
@login_required
@account_initialization_required

View File

@ -1,5 +1,5 @@
'use client'
import { useState } from 'react'
import { useEffect, useState } from 'react'
import Avatar from '@/app/components/base/avatar'
import { useCollaboration } from '../collaboration/hooks/use-collaboration'
import { useStore } from '../store'
@ -13,12 +13,46 @@ import {
PortalToFollowElemTrigger,
} from '@/app/components/base/portal-to-follow-elem'
import { useAppContext } from '@/context/app-context'
import { getAvatar } from '@/service/common'
const useAvatarUrls = (users: any[]) => {
const [avatarUrls, setAvatarUrls] = useState<Record<string, string>>({})
useEffect(() => {
const fetchAvatars = async () => {
const newAvatarUrls: Record<string, string> = {}
await Promise.all(
users.map(async (user) => {
if (user.avatar) {
try {
const response = await getAvatar({ avatar: user.avatar })
newAvatarUrls[user.sid] = response.avatar_url
}
catch (error) {
console.error('Failed to fetch avatar:', error)
newAvatarUrls[user.sid] = user.avatar
}
}
}),
)
setAvatarUrls(newAvatarUrls)
}
if (users.length > 0)
fetchAvatars()
}, [users])
return avatarUrls
}
const OnlineUsers = () => {
const appId = useStore(s => s.appId)
const { onlineUsers } = useCollaboration(appId)
const { userProfile } = useAppContext()
const [dropdownOpen, setDropdownOpen] = useState(false)
const avatarUrls = useAvatarUrls(onlineUsers || [])
const currentUserId = userProfile?.id
@ -33,6 +67,10 @@ const OnlineUsers = () => {
const visibleUsers = onlineUsers.slice(0, maxVisible)
const remainingCount = onlineUsers.length - maxVisible
const getAvatarUrl = (user: any) => {
return avatarUrls[user.sid] || user.avatar
}
return (
<div className="flex items-center rounded-full bg-white px-1 py-1">
<div className="flex items-center">
@ -59,7 +97,7 @@ const OnlineUsers = () => {
>
<Avatar
name={user.username || 'User'}
avatar={user.avatar}
avatar={getAvatarUrl(user)}
size={28}
className="ring-2 ring-white"
backgroundColor={userColor}
@ -113,7 +151,7 @@ const OnlineUsers = () => {
>
<Avatar
name={user.username || 'User'}
avatar={user.avatar}
avatar={getAvatarUrl(user)}
size={24}
backgroundColor={userColor}
/>

View File

@ -397,3 +397,7 @@ export const resetEmail = (body: { new_email: string; token: string }) =>
export const checkEmailExisted = (body: { email: string }) =>
post<CommonResponse>('/account/change-email/check-email-unique', { body }, { silent: true })
export const getAvatar: Fetcher<{ avatar_url: string }, { avatar: string }> = ({ avatar }) => {
return get<{ avatar_url: string }>(`/account/avatar?avatar=${avatar}`)
}