| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- "use client";
- import { useCallback, useEffect, useState } from "react";
- import {
- fetchProfile,
- updateProfile,
- uploadAvatar,
- UpdateProfilePayload,
- } from "../../agent/services/profileApi";
- import { Profile } from "../../agent/types";
- interface UseProfileOptions {
- userId: number | null;
- enabled?: boolean;
- }
- export function useProfile({ userId, enabled = true }: UseProfileOptions) {
- const [profile, setProfile] = useState<Profile | null>(null);
- const [loading, setLoading] = useState(false);
- const [updating, setUpdating] = useState(false);
- const [uploading, setUploading] = useState(false);
- // 加载个人资料
- const loadProfile = useCallback(async () => {
- if (!userId || !enabled) {
- return;
- }
- setLoading(true);
- try {
- const data = await fetchProfile(userId);
- setProfile(data);
- } catch (error) {
- console.error("获取个人资料失败:", error);
- } finally {
- setLoading(false);
- }
- }, [userId, enabled]);
- // 初始化时加载个人资料
- useEffect(() => {
- loadProfile();
- }, [loadProfile]);
- // 更新个人资料
- const update = useCallback(
- async (payload: UpdateProfilePayload) => {
- if (!userId) {
- throw new Error("用户ID不能为空");
- }
- setUpdating(true);
- try {
- const updated = await updateProfile(userId, payload);
- setProfile(updated);
- return updated;
- } finally {
- setUpdating(false);
- }
- },
- [userId]
- );
- // 上传头像
- const upload = useCallback(
- async (file: File) => {
- if (!userId) {
- throw new Error("用户ID不能为空");
- }
- setUploading(true);
- try {
- const updated = await uploadAvatar(userId, file);
- setProfile(updated);
- return updated;
- } finally {
- setUploading(false);
- }
- },
- [userId]
- );
- // 刷新个人资料
- const refresh = useCallback(() => {
- return loadProfile();
- }, [loadProfile]);
- return {
- profile,
- loading,
- updating,
- uploading,
- update,
- upload,
- refresh,
- };
- }
|