Spaces:
Running
Running
| import React, { useState } from 'react'; | |
| import { AlertTriangle, FileText, ShieldAlert } from 'lucide-react'; | |
| interface Props { | |
| open: boolean; | |
| dossierLevel?: string; | |
| onCancel: () => void; | |
| onConfirm: () => Promise<void> | void; | |
| loading?: boolean; | |
| } | |
| /** | |
| * F1: explicit consent to generate structure without regulation pack. | |
| */ | |
| const GenerationConsentModal: React.FC<Props> = ({ | |
| open, | |
| dossierLevel = 'blind', | |
| onCancel, | |
| onConfirm, | |
| loading = false, | |
| }) => { | |
| const [ack, setAck] = useState(false); | |
| if (!open) return null; | |
| return ( | |
| <div | |
| style={{ | |
| position: 'fixed', | |
| inset: 0, | |
| zIndex: 9999, | |
| background: 'rgba(0,0,0,0.65)', | |
| display: 'flex', | |
| alignItems: 'center', | |
| justifyContent: 'center', | |
| padding: '1.5rem', | |
| }} | |
| role="dialog" | |
| aria-modal="true" | |
| aria-labelledby="consent-title" | |
| > | |
| <div | |
| className="glass-card" | |
| style={{ | |
| maxWidth: 520, | |
| width: '100%', | |
| padding: '1.75rem', | |
| border: '1px solid rgba(245,158,11,0.4)', | |
| background: 'var(--bg-elevated, #1a1a2e)', | |
| }} | |
| > | |
| <div style={{ display: 'flex', gap: '0.75rem', alignItems: 'flex-start', marginBottom: '1rem' }}> | |
| <ShieldAlert size={28} color="#f59e0b" style={{ flexShrink: 0 }} /> | |
| <div> | |
| <h2 id="consent-title" style={{ margin: 0, fontSize: '1.25rem', color: '#fff' }}> | |
| Generacja bez regulaminu naboru | |
| </h2> | |
| <p style={{ margin: '0.35rem 0 0', fontSize: '0.8rem', color: 'var(--text-muted)' }}> | |
| Status dossier: <strong style={{ color: '#f87171' }}>{dossierLevel || 'blind'}</strong> | |
| </p> | |
| </div> | |
| </div> | |
| <p style={{ color: '#e5e7eb', lineHeight: 1.65, fontSize: '0.95rem', margin: '0 0 1rem' }}> | |
| Nie mamy w systemie regulaminu / wytycznych tego naboru. | |
| Możemy wygenerować <strong style={{ color: '#fff' }}>szkielet sekcji</strong> na podstawie | |
| opisu projektu i danych firmy (tryb strukturalny). | |
| </p> | |
| <ul style={{ color: '#d1d5db', fontSize: '0.9rem', lineHeight: 1.6, margin: '0 0 1rem', paddingLeft: '1.2rem' }}> | |
| <li> | |
| <strong style={{ color: '#fbbf24' }}>Nie</strong> będzie to ugruntowane w regułach naboru | |
| </li> | |
| <li>Limity, koszty, DNSH i checklista mogą być niekompletne</li> | |
| <li>Ostateczna weryfikacja z oficjalnymi dokumentami leży po Twojej stronie</li> | |
| </ul> | |
| <div | |
| style={{ | |
| display: 'flex', | |
| gap: '0.5rem', | |
| padding: '0.75rem', | |
| background: 'rgba(245,158,11,0.1)', | |
| borderRadius: 8, | |
| marginBottom: '1rem', | |
| fontSize: '0.85rem', | |
| color: '#fde68a', | |
| }} | |
| > | |
| <AlertTriangle size={16} style={{ flexShrink: 0, marginTop: 2 }} /> | |
| Preferujemy dołączenie regulaminu (URL/PDF) zamiast tej ścieżki. | |
| </div> | |
| <label | |
| style={{ | |
| display: 'flex', | |
| gap: '0.65rem', | |
| alignItems: 'flex-start', | |
| cursor: 'pointer', | |
| marginBottom: '1.25rem', | |
| color: '#e5e7eb', | |
| fontSize: '0.9rem', | |
| lineHeight: 1.5, | |
| }} | |
| > | |
| <input | |
| type="checkbox" | |
| checked={ack} | |
| onChange={(e) => setAck(e.target.checked)} | |
| style={{ marginTop: 4, width: 16, height: 16 }} | |
| /> | |
| <span> | |
| Rozumiem ryzyka i chcę wygenerować strukturę wniosku bez regulaminu w systemie. | |
| </span> | |
| </label> | |
| <div style={{ display: 'flex', gap: '0.75rem', flexWrap: 'wrap', justifyContent: 'flex-end' }}> | |
| <button | |
| type="button" | |
| onClick={onCancel} | |
| disabled={loading} | |
| className="btn" | |
| style={{ | |
| padding: '0.65rem 1.1rem', | |
| background: 'transparent', | |
| border: '1px solid rgba(255,255,255,0.2)', | |
| color: '#fff', | |
| borderRadius: 8, | |
| cursor: 'pointer', | |
| }} | |
| > | |
| Anuluj | |
| </button> | |
| <button | |
| type="button" | |
| disabled={!ack || loading} | |
| onClick={() => onConfirm()} | |
| style={{ | |
| padding: '0.65rem 1.1rem', | |
| background: ack ? 'linear-gradient(90deg, #d97706, #b45309)' : 'rgba(255,255,255,0.1)', | |
| border: 'none', | |
| color: '#fff', | |
| borderRadius: 8, | |
| fontWeight: 700, | |
| cursor: ack ? 'pointer' : 'not-allowed', | |
| display: 'inline-flex', | |
| alignItems: 'center', | |
| gap: '0.4rem', | |
| opacity: loading ? 0.7 : 1, | |
| }} | |
| > | |
| <FileText size={16} /> | |
| {loading ? 'Zapisuję…' : 'Akceptuję i generuję strukturę'} | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default GenerationConsentModal; | |