"use client"
import { useParams, useRouter } from "next/navigation"
import { useMutation, useQuery } from "convex/react"
import { api } from "@/convex/_generated/api"
import { Badge } from "@/components/ui/badge"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { Button } from "@/components/ui/button"
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog"
import { Settings } from "lucide-react"
import * as React from "react"
function formatDate(timestamp?: number) {
if (!timestamp) return "Not analyzed yet";
return new Date(timestamp).toLocaleString();
}
export default function DataSourceDetailPage() {
const params = useParams<{ id: string }>()
const router = useRouter()
const dataSourceId = params?.id
const dataSource = useQuery(
api.dataSources.getById,
dataSourceId ? { dataSourceId: dataSourceId as any } : "skip"
)
const analysis = useQuery(
api.analyses.getLatestByDataSource,
dataSourceId ? { dataSourceId: dataSourceId as any } : "skip"
)
const removeDataSource = useMutation(api.dataSources.remove)
const [isDeleting, setIsDeleting] = React.useState(false)
const [isDialogOpen, setIsDialogOpen] = React.useState(false)
if (dataSource === undefined) {
return (
)
}
if (!dataSource) {
return (
Data source not found
This data source may have been removed or you no longer have access.
)
}
const statusVariant =
dataSource.analysisStatus === "completed"
? "secondary"
: dataSource.analysisStatus === "failed"
? "destructive"
: "outline"
return (
{dataSource.name || "Data Source"}
{dataSource.analysisStatus}
{dataSource.url}
Last analyzed: {formatDate(dataSource.lastAnalyzedAt)}
{dataSource.lastError && (
Error: {dataSource.lastError}
)}
{analysis ? (
<>
Features
{analysis.features.length}
Keywords
{analysis.keywords.length}
Personas
{analysis.personas.length}
Overview
Product:{" "}
{analysis.productName}
Tagline:{" "}
{analysis.tagline}
Category:{" "}
{analysis.category}
Positioning:{" "}
{analysis.positioning}
{analysis.description}
Top Features
{analysis.features.slice(0, 6).map((feature) => (
{feature.name}
{feature.description}
))}
Pain Points
{analysis.problemsSolved.slice(0, 6).map((problem) => (
{problem.problem}
Severity: {problem.severity} · {problem.emotionalImpact}
))}
Personas
{analysis.personas.slice(0, 4).map((persona) => (
{persona.name} · {persona.role}
{persona.industry} · {persona.companySize}
))}
Keywords
{analysis.keywords.slice(0, 12).map((keyword) => (
{keyword.term}
))}
>
) : (
Analysis
No analysis available yet. Trigger a new analysis to populate this
data source.
)}
)
}