'use client'; import React, { useState } from 'react'; import { PublishSettings, ScriptConfig } from '@/lib/vfs/types'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Switch } from '@/components/ui/switch'; import { Badge } from '@/components/ui/badge'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Plus, Edit, Trash2, Code } from 'lucide-react'; interface ScriptsTabProps { settings: PublishSettings; onChange: (settings: PublishSettings) => void; } export function ScriptsTab({ settings, onChange }: ScriptsTabProps) { const [editingScript, setEditingScript] = useState(null); const [isDialogOpen, setIsDialogOpen] = useState(false); const [scriptPosition, setScriptPosition] = useState<'head' | 'body'>('head'); const allScripts = [ ...settings.headScripts.map(s => ({ ...s, position: 'head' as const })), ...settings.bodyScripts.map(s => ({ ...s, position: 'body' as const })), ]; const handleAddScript = () => { const newScript: ScriptConfig = { id: `script-${Date.now()}`, name: '', content: '', type: 'inline', enabled: true, }; setEditingScript(newScript); setScriptPosition('head'); setIsDialogOpen(true); }; const handleEditScript = (script: ScriptConfig, position: 'head' | 'body') => { setEditingScript(script); setScriptPosition(position); setIsDialogOpen(true); }; const handleDeleteScript = (scriptId: string) => { if (!confirm('Are you sure you want to delete this script?')) return; onChange({ ...settings, headScripts: settings.headScripts.filter(s => s.id !== scriptId), bodyScripts: settings.bodyScripts.filter(s => s.id !== scriptId), }); }; const handleToggleScript = (scriptId: string, position: 'head' | 'body') => { const scripts = position === 'head' ? settings.headScripts : settings.bodyScripts; const updatedScripts = scripts.map(s => s.id === scriptId ? { ...s, enabled: !s.enabled } : s ); onChange({ ...settings, [position === 'head' ? 'headScripts' : 'bodyScripts']: updatedScripts, }); }; const handleSaveScript = () => { if (!editingScript || !editingScript.name.trim()) { alert('Please provide a name for the script'); return; } const targetArray = scriptPosition === 'head' ? settings.headScripts : settings.bodyScripts; const otherArray = scriptPosition === 'head' ? settings.bodyScripts : settings.headScripts; // Check if editing existing or creating new const existingIndex = targetArray.findIndex(s => s.id === editingScript.id); let updatedScripts; if (existingIndex >= 0) { // Update existing updatedScripts = [...targetArray]; updatedScripts[existingIndex] = editingScript; } else { // Check if it exists in the other position const existsInOther = otherArray.some(s => s.id === editingScript.id); if (existsInOther) { // Move from other position to current const filtered = otherArray.filter(s => s.id !== editingScript.id); onChange({ ...settings, [scriptPosition === 'head' ? 'headScripts' : 'bodyScripts']: [...targetArray, editingScript], [scriptPosition === 'head' ? 'bodyScripts' : 'headScripts']: filtered, }); setIsDialogOpen(false); setEditingScript(null); return; } else { // Add new updatedScripts = [...targetArray, editingScript]; } } onChange({ ...settings, [scriptPosition === 'head' ? 'headScripts' : 'bodyScripts']: updatedScripts, }); setIsDialogOpen(false); setEditingScript(null); }; return (

Script Management

Add custom scripts to your published deployment

{allScripts.length === 0 ? (

No Scripts Added

Add tracking scripts, analytics, or custom code to your deployment

) : (
{allScripts.map((script) => (

{script.name}

{script.position === 'head' ? '' : 'before '} {script.type} {script.async && async} {script.defer && defer}

{script.type === 'inline' ? `${script.content.length} characters` : script.content}

handleToggleScript(script.id, script.position)} />
))}
)} {/* Script Editor Dialog */} {editingScript?.name ? 'Edit Script' : 'Add Script'} Configure a custom script to inject into your published deployment {editingScript && (
setEditingScript({ ...editingScript, name: e.target.value }) } />
{editingScript.type === 'inline' ? (