"use client" import { useState, useEffect } from "react" import { useAuth } from "@/contexts/auth-context" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Alert, AlertDescription } from "@/components/ui/alert" import { Badge } from "@/components/ui/badge" import { CheckCircle, AlertTriangle, Loader2, User, Camera } from "lucide-react" interface ProfileDialogProps { open: boolean onOpenChange: (open: boolean) => void } export function ProfileDialog({ open, onOpenChange }: ProfileDialogProps) { const { user, updateProfile } = useAuth() const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState("") const [success, setSuccess] = useState("") const [profileData, setProfileData] = useState({ name: user?.name || "", email: user?.email || "", department: user?.department || "", bio: user?.bio || "", phone: user?.phone || "", location: user?.location || "", }) const [avatar, setAvatar] = useState(user?.avatar || "") // 監聽用戶狀態變化,同步更新本地狀態 useEffect(() => { if (user) { setProfileData({ name: user.name || "", email: user.email || "", department: user.department || "", bio: user.bio || "", phone: user.phone || "", location: user.location || "", }) setAvatar(user.avatar || "") } }, [user]) const departments = ["HQBU", "ITBU", "MBU1", "MBU2", "SBU", "財務部", "人資部", "法務部"] const handleSave = async () => { setError("") setSuccess("") setIsLoading(true) try { await updateProfile({ ...profileData, avatar }) setSuccess("個人資料更新成功!") setTimeout(() => setSuccess(""), 3000) } catch (err) { setError("更新失敗,請稍後再試") } finally { setIsLoading(false) } } const handleAvatarFileSelect = async (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) return; // 驗證文件類型 const allowedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp']; if (!allowedTypes.includes(file.type)) { setError('只支援 JPEG、PNG、WebP 格式的圖片'); return; } // 驗證文件大小(限制 5MB) const maxSize = 5 * 1024 * 1024; // 5MB if (file.size > maxSize) { setError('圖片大小不能超過 5MB'); return; } setIsLoading(true); setError(''); setSuccess(''); try { const formData = new FormData(); formData.append('avatar', file); formData.append('userId', user?.id || ''); const response = await fetch('/api/upload/avatar', { method: 'POST', body: formData, }); const result = await response.json(); if (result.success) { setSuccess('頭像上傳成功!'); // 更新全局用戶狀態 await updateProfile({ avatar: result.data.imageUrl }); setTimeout(() => setSuccess(''), 3000); } else { setError(result.error || '上傳失敗'); } } catch (error) { const errorMsg = error instanceof Error ? error.message : '上傳失敗'; setError(`頭像上傳失敗:${errorMsg}`); } finally { setIsLoading(false); // 清空文件輸入 event.target.value = ''; } } return ( 個人資料 管理您的個人資料和帳號設定
{error && ( {error} )} {success && ( {success} )}
{user?.name?.charAt(0) || "U"}

{user?.name}

{user?.email}

{user?.department}
setProfileData({ ...profileData, name: e.target.value })} />
setProfileData({ ...profileData, email: e.target.value })} />
setProfileData({ ...profileData, phone: e.target.value })} placeholder="輸入電話號碼" />
setProfileData({ ...profileData, location: e.target.value })} placeholder="輸入工作地點" />
setProfileData({ ...profileData, bio: e.target.value })} placeholder="簡單介紹一下自己..." />
) }