64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
import { Alert, Box, Snackbar, Button } from '@mui/material';
|
||
import { useEffect, useState } from 'react';
|
||
|
||
export const Notifier = () => {
|
||
const [open, setOpen] = useState(false);
|
||
const [message, setMessage] = useState('');
|
||
const [severity, setSeverity] = useState<
|
||
'error' | 'warning' | 'info' | 'success'
|
||
>('info');
|
||
const [hasUpdateAvailable, setHasUpdateAvailable] = useState(false);
|
||
|
||
useEffect(() => {
|
||
// Слушаем событие о наличии обновления
|
||
window.electron.ipcRenderer.on('update-available', () => {
|
||
setMessage('Доступно новое обновление');
|
||
setSeverity('info');
|
||
setHasUpdateAvailable(true);
|
||
setOpen(true);
|
||
});
|
||
|
||
return () => {
|
||
// Отписываемся от события при размонтировании
|
||
window.electron.ipcRenderer.removeAllListeners('update-available');
|
||
};
|
||
}, []);
|
||
|
||
const handleClose = () => {
|
||
setOpen(false);
|
||
};
|
||
|
||
const handleUpdate = () => {
|
||
window.electron.ipcRenderer.invoke('install-update');
|
||
setOpen(false);
|
||
};
|
||
|
||
return (
|
||
<Box>
|
||
<Snackbar
|
||
open={open}
|
||
autoHideDuration={hasUpdateAvailable ? null : 6000}
|
||
onClose={handleClose}
|
||
>
|
||
<Alert
|
||
severity={severity}
|
||
action={
|
||
hasUpdateAvailable && (
|
||
<>
|
||
<Button color="primary" size="small" onClick={handleUpdate}>
|
||
Обновить сейчас
|
||
</Button>
|
||
<Button color="secondary" size="small" onClick={handleClose}>
|
||
Позже
|
||
</Button>
|
||
</>
|
||
)
|
||
}
|
||
>
|
||
{message}
|
||
</Alert>
|
||
</Snackbar>
|
||
</Box>
|
||
);
|
||
};
|