OnlineAgentsList.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. "use client";
  2. import Image from "next/image";
  3. import { getAvatarUrl } from "@/utils/avatar";
  4. export interface OnlineAgent {
  5. id: number;
  6. nickname: string;
  7. avatar_url: string;
  8. }
  9. interface OnlineAgentsListProps {
  10. agents: OnlineAgent[];
  11. onAgentClick?: (agent: OnlineAgent) => void;
  12. }
  13. /**
  14. * 在线客服列表组件
  15. * 显示在线客服的头像和昵称
  16. */
  17. export function OnlineAgentsList({
  18. agents,
  19. onAgentClick,
  20. }: OnlineAgentsListProps) {
  21. if (agents.length === 0) {
  22. return (
  23. <div className="text-sm text-muted-foreground text-center py-4">
  24. 暂无在线客服
  25. </div>
  26. );
  27. }
  28. return (
  29. <div className="space-y-3">
  30. <div className="text-sm font-semibold text-foreground mb-3 text-center flex items-center justify-center gap-2">
  31. <div className="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
  32. <span>在线客服 ({agents.length})</span>
  33. </div>
  34. <div className="flex flex-wrap gap-3 justify-center">
  35. {agents.map((agent) => (
  36. <button
  37. key={agent.id}
  38. onClick={() => onAgentClick?.(agent)}
  39. className="flex flex-col items-center gap-2 p-3 rounded-xl hover:bg-primary/5 hover:shadow-md transition-all cursor-pointer group border border-transparent hover:border-primary/20"
  40. title={agent.nickname}
  41. >
  42. <div className="relative w-12 h-12 rounded-full overflow-hidden bg-gradient-to-br from-primary/20 to-primary/5 border-2 border-primary/30 group-hover:border-primary/60 transition-all shadow-sm group-hover:shadow-md">
  43. {getAvatarUrl(agent.avatar_url) ? (
  44. <Image
  45. src={getAvatarUrl(agent.avatar_url)!}
  46. alt={agent.nickname}
  47. fill
  48. className="object-cover"
  49. />
  50. ) : (
  51. <div className="w-full h-full flex items-center justify-center bg-gradient-to-br from-primary/20 to-primary/10 text-primary text-base font-semibold">
  52. {agent.nickname.charAt(0).toUpperCase()}
  53. </div>
  54. )}
  55. {/* 在线状态指示器 */}
  56. <div className="absolute bottom-0 right-0 w-3.5 h-3.5 bg-green-500 rounded-full border-2 border-background shadow-sm" />
  57. </div>
  58. <span className="text-xs font-medium text-muted-foreground group-hover:text-foreground transition-colors truncate max-w-[70px]">
  59. {agent.nickname}
  60. </span>
  61. </button>
  62. ))}
  63. </div>
  64. </div>
  65. );
  66. }