mirror of
https://github.com/MODSetter/SurfSense.git
synced 2025-09-02 10:39:13 +00:00
124 lines
4.1 KiB
TypeScript
124 lines
4.1 KiB
TypeScript
"use client";
|
|
|
|
import { motion } from "framer-motion";
|
|
import { ArrowRight, Bot, Brain, CheckCircle, Sparkles, Zap } from "lucide-react";
|
|
import { Badge } from "@/components/ui/badge";
|
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
|
import { useLLMConfigs, useLLMPreferences } from "@/hooks/use-llm-configs";
|
|
|
|
const ROLE_ICONS = {
|
|
long_context: Brain,
|
|
fast: Zap,
|
|
strategic: Bot,
|
|
};
|
|
|
|
export function CompletionStep() {
|
|
const { llmConfigs } = useLLMConfigs();
|
|
const { preferences } = useLLMPreferences();
|
|
|
|
const assignedConfigs = {
|
|
long_context: llmConfigs.find((c) => c.id === preferences.long_context_llm_id),
|
|
fast: llmConfigs.find((c) => c.id === preferences.fast_llm_id),
|
|
strategic: llmConfigs.find((c) => c.id === preferences.strategic_llm_id),
|
|
};
|
|
|
|
return (
|
|
<div className="space-y-8">
|
|
{/* Success Message */}
|
|
<motion.div
|
|
initial={{ opacity: 0, scale: 0.95 }}
|
|
animate={{ opacity: 1, scale: 1 }}
|
|
transition={{ duration: 0.5 }}
|
|
className="text-center"
|
|
>
|
|
<div className="w-20 h-20 mx-auto mb-6 bg-green-100 rounded-full flex items-center justify-center">
|
|
<CheckCircle className="w-10 h-10 text-green-600" />
|
|
</div>
|
|
<h2 className="text-2xl font-bold mb-2">Setup Complete!</h2>
|
|
</motion.div>
|
|
|
|
{/* Configuration Summary */}
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ delay: 0.2 }}
|
|
>
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="flex items-center gap-2">
|
|
<Sparkles className="w-5 h-5" />
|
|
Your LLM Configuration
|
|
</CardTitle>
|
|
<CardDescription>Here's a summary of your setup</CardDescription>
|
|
</CardHeader>
|
|
<CardContent className="space-y-4">
|
|
{Object.entries(assignedConfigs).map(([role, config]) => {
|
|
if (!config) return null;
|
|
|
|
const IconComponent = ROLE_ICONS[role as keyof typeof ROLE_ICONS];
|
|
const roleDisplayNames = {
|
|
long_context: "Long Context LLM",
|
|
fast: "Fast LLM",
|
|
strategic: "Strategic LLM",
|
|
};
|
|
|
|
return (
|
|
<motion.div
|
|
key={role}
|
|
initial={{ opacity: 0, x: -10 }}
|
|
animate={{ opacity: 1, x: 0 }}
|
|
transition={{ delay: 0.3 + Object.keys(assignedConfigs).indexOf(role) * 0.1 }}
|
|
className="flex items-center justify-between p-3 bg-muted/50 rounded-lg"
|
|
>
|
|
<div className="flex items-center gap-3">
|
|
<div className="p-2 bg-background rounded-md">
|
|
<IconComponent className="w-4 h-4" />
|
|
</div>
|
|
<div>
|
|
<p className="font-medium">
|
|
{roleDisplayNames[role as keyof typeof roleDisplayNames]}
|
|
</p>
|
|
<p className="text-sm text-muted-foreground">{config.name}</p>
|
|
</div>
|
|
</div>
|
|
<div className="flex items-center gap-2">
|
|
<Badge variant="outline">{config.provider}</Badge>
|
|
<span className="text-sm text-muted-foreground">{config.model_name}</span>
|
|
</div>
|
|
</motion.div>
|
|
);
|
|
})}
|
|
</CardContent>
|
|
</Card>
|
|
</motion.div>
|
|
|
|
{/* Next Steps */}
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ delay: 0.6 }}
|
|
>
|
|
<Card className="border-primary/20 bg-primary/5">
|
|
<CardContent className="pt-6">
|
|
<div className="flex items-center gap-3 mb-4">
|
|
<div className="p-2 bg-primary rounded-md">
|
|
<ArrowRight className="w-4 h-4 text-primary-foreground" />
|
|
</div>
|
|
<h3 className="text-lg font-semibold">Ready to Get Started?</h3>
|
|
</div>
|
|
<p className="text-muted-foreground mb-4">
|
|
Click "Complete Setup" to enter your dashboard and start exploring!
|
|
</p>
|
|
<div className="flex flex-wrap gap-2 text-sm">
|
|
<Badge variant="secondary">
|
|
✓ {llmConfigs.length} LLM provider{llmConfigs.length > 1 ? "s" : ""} configured
|
|
</Badge>
|
|
<Badge variant="secondary">✓ All roles assigned</Badge>
|
|
<Badge variant="secondary">✓ Ready to use</Badge>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
</motion.div>
|
|
</div>
|
|
);
|
|
}
|