Nora / frontend /components /MoodDetailDialog.tsx
GitHub Action
Deploy clean version of Nora
59bd45e
import React from 'react';
import { X } from 'lucide-react';
import { MoodItem, MoodType } from '../types';
interface MoodDetailDialogProps {
mood: MoodItem | null;
onClose: () => void;
}
export const MoodDetailDialog: React.FC<MoodDetailDialogProps> = ({ mood, onClose }) => {
if (!mood) return null;
const getMoodEmoji = (type: MoodType) => {
switch (type) {
case MoodType.HAPPY: return '😊';
case MoodType.CALM: return '😌';
case MoodType.TIRED: return '😴';
case MoodType.ANXIOUS: return '😰';
case MoodType.HOPEFUL: return '🌟';
default: return '😐';
}
};
const getMoodColor = (type: MoodType) => {
switch (type) {
case MoodType.HAPPY: return 'from-rose-200 to-orange-100';
case MoodType.CALM: return 'from-violet-200 to-purple-100';
case MoodType.TIRED: return 'from-blue-200 to-slate-200';
case MoodType.ANXIOUS: return 'from-stone-200 to-orange-50';
case MoodType.HOPEFUL: return 'from-yellow-100 to-amber-50';
default: return 'from-slate-200 to-slate-100';
}
};
const formatDate = (timestamp: number) => {
const date = new Date(timestamp);
const now = new Date();
const diff = now.getTime() - date.getTime();
const days = Math.floor(diff / (1000 * 60 * 60 * 24));
if (days === 0) {
return `今天 ${date.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })}`;
} else if (days === 1) {
return `昨天 ${date.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })}`;
} else if (days < 7) {
return `${days}天前`;
} else {
return date.toLocaleDateString('zh-CN', { month: 'long', day: 'numeric' });
}
};
return (
<div className="
fixed inset-0 z-[200]
flex items-center justify-center
bg-black/30 backdrop-blur-sm
animate-[fadeIn_0.3s_ease-out]
p-4
">
<div className={`
relative w-full max-w-sm
bg-gradient-to-br ${getMoodColor(mood.type)}
rounded-3xl shadow-2xl
border border-white/50
p-6
animate-[slideUp_0.3s_ease-out]
`}>
{/* 关闭按钮 */}
<button
onClick={onClose}
className="
absolute top-4 right-4
p-2 rounded-full
bg-white/50 hover:bg-white/70
text-slate-600 hover:text-slate-800
transition-all duration-200
"
>
<X size={20} />
</button>
{/* 内容 */}
<div className="flex flex-col items-center text-center space-y-4">
{/* Emoji */}
<div className="text-6xl animate-bounce">
{getMoodEmoji(mood.type)}
</div>
{/* 心情类型 */}
<h3 className="text-2xl font-medium text-slate-700">
{mood.type}
</h3>
{/* 强度指示器 */}
<div className="w-full space-y-2">
<div className="flex justify-between text-sm text-slate-600">
<span>情绪强度</span>
<span className="font-medium">{Math.round(mood.intensity * 10)}/10</span>
</div>
<div className="w-full h-2 bg-white/50 rounded-full overflow-hidden">
<div
className="h-full bg-gradient-to-r from-slate-400 to-slate-600 rounded-full transition-all duration-500"
style={{ width: `${mood.intensity * 100}%` }}
/>
</div>
</div>
{/* 时间 */}
<div className="text-sm text-slate-600">
{formatDate(mood.date)}
</div>
{/* 提示 */}
<p className="text-xs text-slate-500 italic">
"每一种情绪都值得被记录和珍惜"
</p>
</div>
</div>
<style>{`
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(20px) scale(0.95);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
`}</style>
</div>
);
};