mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-06-17 08:47:49 +00:00
59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import type { ToastData } from '@decky/api';
|
|
import { joinClassNames } from '@decky/ui';
|
|
import { FC, useEffect, useState } from 'react';
|
|
import { ReactElement } from 'react-markdown/lib/react-markdown';
|
|
|
|
import { useDeckyToasterState } from './DeckyToasterState';
|
|
import Toast, { toastClasses } from './Toast';
|
|
|
|
interface DeckyToasterProps {}
|
|
|
|
interface RenderedToast {
|
|
component: ReactElement;
|
|
data: ToastData;
|
|
}
|
|
|
|
const DeckyToaster: FC<DeckyToasterProps> = () => {
|
|
const { toasts, removeToast } = useDeckyToasterState();
|
|
const [renderedToast, setRenderedToast] = useState<RenderedToast | null>(null);
|
|
console.log(toasts);
|
|
if (toasts.size > 0) {
|
|
const [activeToast] = toasts;
|
|
if (!renderedToast || activeToast != renderedToast.data) {
|
|
// TODO play toast sound
|
|
console.log('rendering toast', activeToast);
|
|
setRenderedToast({ component: <Toast key={Math.random()} toast={activeToast} />, data: activeToast });
|
|
}
|
|
} else {
|
|
if (renderedToast) setRenderedToast(null);
|
|
}
|
|
useEffect(() => {
|
|
// not actually node but TS is shit
|
|
let interval: NodeJS.Timeout | number | null;
|
|
if (renderedToast) {
|
|
interval = setTimeout(
|
|
() => {
|
|
interval = null;
|
|
console.log('clear toast', renderedToast.data);
|
|
removeToast(renderedToast.data);
|
|
},
|
|
(renderedToast.data.duration || 5e3) + 1000,
|
|
);
|
|
console.log('set int', interval);
|
|
}
|
|
return () => {
|
|
if (interval) {
|
|
console.log('clearing int', interval);
|
|
clearTimeout(interval);
|
|
}
|
|
};
|
|
}, [renderedToast]);
|
|
return (
|
|
<div className={joinClassNames('deckyToaster', toastClasses.ToastPlaceholder)}>
|
|
{renderedToast && renderedToast.component}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default DeckyToaster;
|