/** * FileOpenerDialog - Dialog for choosing how to open a file */ import { Edit2, FolderOpen } from 'lucide-react'; import React, { useCallback, useEffect, useState } from 'react'; import { useI18n } from '../application/i18n/I18nProvider'; import type { FileOpenerType, SystemAppInfo } from '../lib/sftpFileUtils'; import { getFileExtension, hasFileExtension, isKnownBinaryFile } from '../lib/sftpFileUtils'; import { Button } from './ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from './ui/dialog'; interface FileOpenerDialogProps { open: boolean; onClose: () => void; fileName: string; onSelect: (openerType: FileOpenerType, setAsDefault: boolean, systemApp?: SystemAppInfo) => void; onSelectSystemApp: () => Promise; } const FileOpenerDialog: React.FC = ({ open, onClose, fileName, onSelect, onSelectSystemApp, }) => { const { t } = useI18n(); const [isSelectingApp, setIsSelectingApp] = useState(false); const [rememberChoice, setRememberChoice] = useState(() => hasFileExtension(fileName)); useEffect(() => { if (open) { setRememberChoice(hasFileExtension(fileName)); } }, [open, fileName]); const extension = getFileExtension(fileName); // Show edit option for files that are not known binary formats const canEdit = !isKnownBinaryFile(fileName); const displayExtension = extension === 'file' ? t('sftp.opener.noExtension') : `.${extension}`; const handleSelectBuiltIn = useCallback((openerType: FileOpenerType) => { onSelect(openerType, rememberChoice); onClose(); }, [rememberChoice, onSelect, onClose]); const handleSelectSystemApp = useCallback(async () => { setIsSelectingApp(true); try { const result = await onSelectSystemApp(); if (result) { onSelect('system-app', rememberChoice, result); onClose(); } } catch (e) { console.error('Failed to select application:', e); } finally { setIsSelectingApp(false); } }, [onSelectSystemApp, rememberChoice, onSelect, onClose]); return ( { // Don't close while selecting system app if (!isOpen && !isSelectingApp) { onClose(); } }}> {t('sftp.opener.title')} {fileName}
{canEdit && ( )} {/* System application option */}
{/* Remember choice checkbox - always show, use 'file' for no extension */}
setRememberChoice(e.target.checked)} className="rounded border-border h-4 w-4 accent-primary" />
); }; export default FileOpenerDialog;