'use client'; import { useState, useCallback } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { uploadFiel } from '@/lib/api/fiel'; import type { FielStatus } from '@horux/shared'; interface FielUploadModalProps { onSuccess: (status: FielStatus) => void; onClose: () => void; } export function FielUploadModal({ onSuccess, onClose }: FielUploadModalProps) { const [cerFile, setCerFile] = useState(null); const [keyFile, setKeyFile] = useState(null); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const fileToBase64 = (file: File): Promise => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => { const result = reader.result as string; // Remove data URL prefix (e.g., "data:application/x-x509-ca-cert;base64,") const base64 = result.split(',')[1]; resolve(base64); }; reader.onerror = reject; }); }; const handleSubmit = useCallback(async (e: React.FormEvent) => { e.preventDefault(); setError(''); if (!cerFile || !keyFile || !password) { setError('Todos los campos son requeridos'); return; } setLoading(true); try { const cerBase64 = await fileToBase64(cerFile); const keyBase64 = await fileToBase64(keyFile); const result = await uploadFiel({ cerFile: cerBase64, keyFile: keyBase64, password, }); if (result.status) { onSuccess(result.status); } } catch (err: any) { setError(err.response?.data?.error || 'Error al subir la FIEL'); } finally { setLoading(false); } }, [cerFile, keyFile, password, onSuccess]); return (
Configurar FIEL (e.firma) Sube tu certificado y llave privada para sincronizar CFDIs con el SAT
setCerFile(e.target.files?.[0] || null)} className="cursor-pointer" />
setKeyFile(e.target.files?.[0] || null)} className="cursor-pointer" />
setPassword(e.target.value)} placeholder="Ingresa la contrasena de tu FIEL" />
{error && (

{error}

)}
); }