"use client" import { cn } from "@mdxui/primitives/lib/utils" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@mdxui/primitives/table" import { Badge } from "@mdxui/primitives/badge" interface FieldInfo { field: string type: string source: string required: boolean description: string } interface CategoryGroup { category: string fields: FieldInfo[] } const feedbackDataFields: CategoryGroup[] = [ { category: "User Input", fields: [ { field: "sentiment", type: "Sentiment", source: "FeedbackData", required: true, description: "User's satisfaction level: very-dissatisfied, dissatisfied, neutral, satisfied, very-satisfied", }, { field: "message", type: "string", source: "FeedbackData", required: false, description: "Optional text feedback message from the user", }, ], }, { category: "User Context", fields: [ { field: "user.id", type: "string", source: "FeedbackUser", required: false, description: "Unique identifier for the user", }, { field: "user.email", type: "string", source: "FeedbackUser", required: false, description: "User's email address", }, { field: "user.name", type: "string", source: "FeedbackUser", required: false, description: "User's display name", }, ], }, { category: "App Context", fields: [ { field: "context", type: "Record", source: "FeedbackData", required: false, description: "App-specific context data (e.g., conversationId, featureName, pageSection)", }, ], }, { category: "Auto-Captured Metadata", fields: [ { field: "metadata.url", type: "string", source: "FeedbackMetadata", required: true, description: "Current page URL when feedback was submitted", }, { field: "metadata.timestamp", type: "string", source: "FeedbackMetadata", required: true, description: "ISO timestamp of when feedback was submitted", }, { field: "metadata.viewport.width", type: "number", source: "FeedbackMetadata", required: true, description: "Browser viewport width in pixels", }, { field: "metadata.viewport.height", type: "number", source: "FeedbackMetadata", required: true, description: "Browser viewport height in pixels", }, { field: "metadata.userAgent", type: "string", source: "FeedbackMetadata", required: true, description: "Browser user agent string for device/browser identification", }, ], }, ] export interface FeedbackActivityTableProps { className?: string showCategories?: boolean } export function FeedbackActivityTable({ className, showCategories = true, }: FeedbackActivityTableProps) { return (
Field Type Source Description {feedbackDataFields.map((group, groupIndex) => ( <> {showCategories && ( {group.category} )} {group.fields.map((field, fieldIndex) => ( {field.field} {field.type} {field.source} {field.description} ))} ))}
) } // Dashboard-style sample data component interface FeedbackRecord { id: string sentiment: "very-dissatisfied" | "dissatisfied" | "neutral" | "satisfied" | "very-satisfied" message?: string userName?: string userEmail?: string page: string timestamp: string device: string } const sampleFeedbackRecords: FeedbackRecord[] = [ { id: "fb_001", sentiment: "very-satisfied", message: "The new dashboard design is much cleaner. Love the dark mode!", userName: "Alex Smith", userEmail: "alex.smith@company.com", page: "/dashboard", timestamp: "2026-01-29T21:42:15Z", device: "Desktop", }, { id: "fb_002", sentiment: "dissatisfied", message: "The loading time is too slow on mobile. Please optimize.", userName: "Maria Garcia", userEmail: "maria.g@startup.io", page: "/reports", timestamp: "2026-01-29T20:15:33Z", device: "Mobile", }, { id: "fb_003", sentiment: "satisfied", message: undefined, userName: "James Wilson", userEmail: "jwilson@enterprise.com", page: "/settings", timestamp: "2026-01-29T19:08:47Z", device: "Desktop", }, { id: "fb_004", sentiment: "neutral", message: "It's okay, but I expected more features in the pro plan.", userName: undefined, userEmail: undefined, page: "/pricing", timestamp: "2026-01-29T18:22:11Z", device: "Tablet", }, { id: "fb_005", sentiment: "very-dissatisfied", message: "Can't export my data. This is a critical bug!", userName: "Sarah Chen", userEmail: "sarah@bigcorp.com", page: "/export", timestamp: "2026-01-29T17:55:02Z", device: "Desktop", }, ] const sentimentLabels: Record = { "very-dissatisfied": "Very Dissatisfied", "dissatisfied": "Dissatisfied", "neutral": "Neutral", "satisfied": "Satisfied", "very-satisfied": "Very Satisfied", } const sentimentVariants: Record = { "very-dissatisfied": "destructive", "dissatisfied": "warning", "neutral": "secondary", "satisfied": "default", "very-satisfied": "default", } export interface FeedbackSampleDataProps { className?: string } export function FeedbackSampleData({ className }: FeedbackSampleDataProps) { return (
Sentiment Message User Page Device Date {sampleFeedbackRecords.map((record) => ( {sentimentLabels[record.sentiment]} {record.message ? ( {record.message} ) : ( No message )} {record.userName ? (
{record.userName} {record.userEmail}
) : ( Anonymous )}
{record.page} {record.device} {new Date(record.timestamp).toLocaleDateString("en-US", { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", })}
))}
) }