"use client" import { useState, useEffect } from 'react' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Textarea } from '@/components/ui/textarea' import { Badge } from '@/components/ui/badge' import { Card, CardContent } from '@/components/ui/card' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Label } from '@/components/ui/label' import { CheckCircle, XCircle, Copy, AlertTriangle, Search, ExternalLink } from 'lucide-react' import { AdminFeature, FeatureSimilarity, FeatureReviewData } from '@/types/admin.types' import { adminApi, formatDate, getStatusColor, getComplexityColor } from '@/lib/api/admin' interface FeatureReviewDialogProps { feature: AdminFeature open: boolean onOpenChange: (open: boolean) => void onReview: (featureId: string, reviewData: FeatureReviewData) => Promise } export function FeatureReviewDialog({ feature, open, onOpenChange, onReview }: FeatureReviewDialogProps) { const [status, setStatus] = useState<'approved' | 'rejected' | 'duplicate'>('approved') const [notes, setNotes] = useState('') const [canonicalFeatureId, setCanonicalFeatureId] = useState('') const [similarFeatures, setSimilarFeatures] = useState([]) const [loadingSimilar, setLoadingSimilar] = useState(false) const [submitting, setSubmitting] = useState(false) const [searchQuery, setSearchQuery] = useState('') // Load similar features when dialog opens useEffect(() => { if (open && feature.name) { loadSimilarFeatures(feature.name) } }, [open, feature.name]) const loadSimilarFeatures = async (query: string) => { try { setLoadingSimilar(true) const features = await adminApi.findSimilarFeatures(query, 0.7, 5) setSimilarFeatures(features) } catch (error) { console.error('Error loading similar features:', error) } finally { setLoadingSimilar(false) } } const handleSubmit = async () => { if (!status) return const reviewData: FeatureReviewData = { status, notes: notes.trim() || undefined, canonical_feature_id: status === 'duplicate' ? canonicalFeatureId : undefined, admin_reviewed_by: 'admin' // TODO: Get from auth context } try { setSubmitting(true) await onReview(feature.id, reviewData) } catch (error) { console.error('Error reviewing feature:', error) } finally { setSubmitting(false) } } const handleStatusChange = (newStatus: string) => { setStatus(newStatus as 'approved' | 'rejected' | 'duplicate') if (newStatus !== 'duplicate') { setCanonicalFeatureId('') } } const filteredSimilarFeatures = similarFeatures.filter(f => f.name.toLowerCase().includes(searchQuery.toLowerCase()) ) return ( Review Feature: {feature.name} Review and approve, reject, or mark as duplicate this custom feature submission.
{/* Feature Details */}

{feature.name}

{feature.status} {feature.complexity}
{feature.description && (

{feature.description}

)}
Template: {feature.template_title || 'Unknown'}
Submitted: {formatDate(feature.created_at)}
{feature.similarity_score && (
Similarity Score: {(feature.similarity_score * 100).toFixed(1)}%
)}
Usage Count: {feature.usage_count}
{feature.business_rules && (

Business Rules:

                      {JSON.stringify(feature.business_rules, null, 2)}
                    
)} {feature.technical_requirements && (

Technical Requirements:

                      {JSON.stringify(feature.technical_requirements, null, 2)}
                    
)}
{/* Similar Features */}

Similar Features

setSearchQuery(e.target.value)} className="pl-10 pr-4 py-2 border rounded-md text-sm" />
{loadingSimilar ? (

Loading similar features...

) : filteredSimilarFeatures.length > 0 ? (
{filteredSimilarFeatures.map((similar) => (
{similar.name} {similar.complexity} {similar.match_type} ({(similar.score * 100).toFixed(1)}%)

{similar.feature_type}

))}
) : (

No similar features found

)}
{/* Review Form */}
{status === 'duplicate' && (
setCanonicalFeatureId(e.target.value)} placeholder="Enter the ID of the canonical feature" className="w-full px-3 py-2 border rounded-md" />

Select a similar feature above or enter the canonical feature ID manually

)}