'use client'; import { useState, useEffect } from 'react'; import { X, Save, Eye, EyeOff } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Plugin } from '@/lib/plugins/config'; interface S3ConfigModalProps { plugin: Plugin; isOpen: boolean; onClose: () => void; onSave: (config: Record) => void; } export function S3ConfigModal({ plugin, isOpen, onClose, onSave }: S3ConfigModalProps) { const [config, setConfig] = useState({ bucket: '', region: 'us-east-1', accessKeyId: '', secretAccessKey: '' }); const [showSecrets, setShowSecrets] = useState(false); const [isSaving, setIsSaving] = useState(false); useEffect(() => { if (plugin.settings) { setConfig({ bucket: plugin.settings.bucket || '', region: plugin.settings.region || 'us-east-1', accessKeyId: plugin.settings.accessKeyId || '', secretAccessKey: plugin.settings.secretAccessKey || '' }); } }, [plugin.settings]); const handleSave = async () => { setIsSaving(true); try { await onSave(config); onClose(); } catch (error) { console.error('Error saving S3 config:', error); } finally { setIsSaving(false); } }; if (!isOpen) return null; return (
{/* Header */}
☁️

Configurar AWS S3 Storage

Configura tu bucket de S3 para almacenamiento de archivos

{/* Content */}
{/* Bucket Configuration */}

Configuración del Bucket

setConfig(prev => ({ ...prev, bucket: e.target.value }))} placeholder="mi-bucket-s3" className="rounded-lg border-gray-200 dark:border-gray-700" />
{/* Credentials */}

Credenciales de AWS

setConfig(prev => ({ ...prev, accessKeyId: e.target.value }))} placeholder="AKIA..." className="rounded-lg border-gray-200 dark:border-gray-700" />
setConfig(prev => ({ ...prev, secretAccessKey: e.target.value }))} placeholder="••••••••••••••••••••••••••••••••••••••••" className="rounded-lg border-gray-200 dark:border-gray-700" />
{/* Policy de S3 */}

🔒 Policy de S3 requerida

Agrega esta policy a tu bucket S3 para permitir acceso público a las imágenes:

{`{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::${config.bucket || 'TU-BUCKET'}/*"
    }
  ]
}`}
              

Reemplaza "TU-BUCKET" con el nombre de tu bucket si no lo has llenado arriba.

{/* Info Box */}

💡 Información importante

  • • Asegúrate de que el bucket tenga los permisos correctos
  • • Las credenciales se almacenan de forma segura
  • • La policy permite acceso público solo para lectura
  • • Los archivos se acceden directamente desde S3
{/* Footer */}
); }