mirror of
https://github.com/hicccc77/WeFlow.git
synced 2026-03-26 07:35:50 +00:00
116 lines
3.6 KiB
TypeScript
116 lines
3.6 KiB
TypeScript
import { Minimize2, Power, X } from 'lucide-react'
|
||
import { useEffect, useState } from 'react'
|
||
import './WindowCloseDialog.scss'
|
||
|
||
interface WindowCloseDialogProps {
|
||
open: boolean
|
||
canMinimizeToTray: boolean
|
||
onSelect: (action: 'tray' | 'quit', rememberChoice: boolean) => void
|
||
onCancel: () => void
|
||
}
|
||
|
||
export default function WindowCloseDialog({
|
||
open,
|
||
canMinimizeToTray,
|
||
onSelect,
|
||
onCancel
|
||
}: WindowCloseDialogProps) {
|
||
const [rememberChoice, setRememberChoice] = useState(false)
|
||
|
||
useEffect(() => {
|
||
if (!open) return
|
||
setRememberChoice(false)
|
||
|
||
const handleKeyDown = (event: KeyboardEvent) => {
|
||
if (event.key === 'Escape') {
|
||
event.preventDefault()
|
||
onCancel()
|
||
}
|
||
}
|
||
|
||
window.addEventListener('keydown', handleKeyDown)
|
||
return () => window.removeEventListener('keydown', handleKeyDown)
|
||
}, [open, onCancel])
|
||
|
||
if (!open) return null
|
||
|
||
return (
|
||
<div className="window-close-dialog-overlay" onClick={onCancel}>
|
||
<div
|
||
className="window-close-dialog"
|
||
onClick={(event) => event.stopPropagation()}
|
||
role="dialog"
|
||
aria-modal="true"
|
||
aria-labelledby="window-close-dialog-title"
|
||
>
|
||
<button
|
||
type="button"
|
||
className="window-close-dialog-close"
|
||
onClick={onCancel}
|
||
aria-label="关闭提示"
|
||
>
|
||
<X size={18} />
|
||
</button>
|
||
|
||
<div className="window-close-dialog-header">
|
||
<span className="window-close-dialog-kicker">退出行为</span>
|
||
<h2 id="window-close-dialog-title">关闭 WeFlow</h2>
|
||
<p>
|
||
{canMinimizeToTray
|
||
? '你可以保留后台进程与本地 API,或者直接完全退出应用。'
|
||
: '当前系统托盘不可用,本次只能完全退出应用。'}
|
||
</p>
|
||
</div>
|
||
|
||
<div className="window-close-dialog-body">
|
||
{canMinimizeToTray && (
|
||
<button
|
||
type="button"
|
||
className="window-close-dialog-option"
|
||
onClick={() => onSelect('tray', rememberChoice)}
|
||
>
|
||
<span className="window-close-dialog-option-icon">
|
||
<Minimize2 size={18} />
|
||
</span>
|
||
<span className="window-close-dialog-option-text">
|
||
<strong>最小化到系统托盘</strong>
|
||
<span>继续保留后台进程和本地 API,稍后可从托盘恢复。</span>
|
||
</span>
|
||
</button>
|
||
)}
|
||
|
||
<button
|
||
type="button"
|
||
className="window-close-dialog-option is-danger"
|
||
onClick={() => onSelect('quit', rememberChoice)}
|
||
>
|
||
<span className="window-close-dialog-option-icon">
|
||
<Power size={18} />
|
||
</span>
|
||
<span className="window-close-dialog-option-text">
|
||
<strong>完全关闭</strong>
|
||
<span>结束 WeFlow 进程,并停止当前保留的本地 API。</span>
|
||
</span>
|
||
</button>
|
||
</div>
|
||
|
||
<label className="window-close-dialog-remember">
|
||
<input
|
||
type="checkbox"
|
||
checked={rememberChoice}
|
||
onChange={(event) => setRememberChoice(event.target.checked)}
|
||
/>
|
||
<span className="window-close-dialog-checkbox" aria-hidden="true" />
|
||
<span className="window-close-dialog-remember-text">下次不再提示,直接按本次选择处理</span>
|
||
</label>
|
||
|
||
<div className="window-close-dialog-actions">
|
||
<button type="button" className="window-close-dialog-cancel" onClick={onCancel}>
|
||
取消
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
)
|
||
}
|