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:
MythEclipse
2026-05-16 19:17:34 +07:00
co-authored by Claude Opus 4.7
parent 3c7d722973
commit 82025a19b2
51 changed files with 2865 additions and 1204 deletions
+7
View File
@@ -0,0 +1,7 @@
export {};
declare global {
interface Window {
webkitAudioContext?: typeof AudioContext;
}
}
+16
View File
@@ -0,0 +1,16 @@
export type MediaMode = "music" | "screen";
export interface MediaItem {
id?: string;
source: string;
title: string;
mode?: MediaMode;
durationMs?: number | null;
thumbnailUrl?: string | null;
}
export interface MediaState {
playing: boolean;
current: MediaItem | null;
queue: MediaItem[];
}
+29
View File
@@ -0,0 +1,29 @@
export type { AIStatus, MessageRecord, PageResult } from "../api/client";
export interface MessageMetadataAttachment {
name: string;
url: string;
size: number;
contentType?: string | null;
}
export interface MessageMetadataEmbed {
title?: string;
description?: string;
url?: string;
image?: string;
thumbnail?: string;
}
export interface MessageMetadataSticker {
name: string;
url: string;
}
export interface MessageMetadata {
attachments?: MessageMetadataAttachment[];
embeds?: MessageMetadataEmbed[];
stickers?: MessageMetadataSticker[];
reference?: { messageId?: string };
channel?: { threadName?: string };
}
+12
View File
@@ -0,0 +1,12 @@
export type DashboardTab = "voice" | "media" | "messages" | "review";
export interface UIState {
selectedGuild?: string;
selectedVoiceGuild?: string;
selectedVoiceChannel?: string;
selectedTextGuild?: string;
selectedTextChannel?: string;
activeTab?: DashboardTab;
isListening?: boolean;
isStreaming?: boolean;
}
+27
View File
@@ -0,0 +1,27 @@
export interface Guild {
id: string;
name: string;
icon?: string | null;
}
export interface Channel {
id: string;
name: string;
type?: string;
parentId?: string | null;
}
export interface VoiceStatus {
connected: boolean;
activeGuildId?: string | null;
activeChannelId?: string | null;
activeChannelName?: string | null;
}
export interface ActiveSpeaker {
id?: string;
userId?: string;
username: string;
avatar: string;
speaking: boolean;
}