feat: migrate and redesign dashboard to modern React
- Full rewrite of legacy vanilla JS UI into React SPA - Implement modern design system using Tailwind CSS and shadcn/ui primitives - Create typed API modules and hooks for voice, media, and moderation - Add new features: separated Music and Screen Share panels, Image Grid - Implement unified WebSocket hook for real-time state and PCM audio - Improve visualizer with smooth CSS transitions and live state sync - Add __dirname polyfill for ES module compatibility - Ensure responsive layout for mobile and desktop Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
3c7d722973
commit
82025a19b2
@@ -1,5 +1,6 @@
|
||||
import type { MessageRecord } from "../../api/client";
|
||||
import { MessageCard } from "../messages/MessageCard";
|
||||
import type { MessageRecord } from "../../types/messages";
|
||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card";
|
||||
import { MessageFeed } from "../messages/MessageFeed";
|
||||
|
||||
export interface ReviewPanelProps {
|
||||
messages: MessageRecord[];
|
||||
@@ -8,30 +9,21 @@ export interface ReviewPanelProps {
|
||||
|
||||
export function ReviewPanel({ messages, onReanalyze }: ReviewPanelProps) {
|
||||
const reviewItems = messages.filter(
|
||||
(m) =>
|
||||
m.ai_status === "warn" ||
|
||||
m.ai_status === "flagged" ||
|
||||
m.ai_status === "error",
|
||||
(message) =>
|
||||
message.ai_status === "warn" ||
|
||||
message.ai_status === "flagged" ||
|
||||
message.ai_status === "error",
|
||||
);
|
||||
|
||||
return (
|
||||
<div className="review-panel">
|
||||
<div className="review-header">
|
||||
<h2>Needs Review</h2>
|
||||
<span className="review-count">{reviewItems.length}</span>
|
||||
</div>
|
||||
|
||||
{reviewItems.length === 0 ? (
|
||||
<div className="empty-state">
|
||||
<p>No items to review</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="review-list">
|
||||
{reviewItems.map((msg) => (
|
||||
<MessageCard key={msg.id} message={msg} onReanalyze={onReanalyze} />
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>Needs Review</CardTitle>
|
||||
<CardDescription>{reviewItems.length} captured messages require attention.</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<MessageFeed messages={reviewItems} onReanalyze={onReanalyze} emptyText="No warned, flagged, or errored messages." />
|
||||
</CardContent>
|
||||
</Card>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user