summaryrefslogtreecommitdiff
path: root/frontend/src/components/Toast.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/components/Toast.tsx')
-rw-r--r--frontend/src/components/Toast.tsx54
1 files changed, 54 insertions, 0 deletions
diff --git a/frontend/src/components/Toast.tsx b/frontend/src/components/Toast.tsx
new file mode 100644
index 00000000..559c37c6
--- /dev/null
+++ b/frontend/src/components/Toast.tsx
@@ -0,0 +1,54 @@
+import { ToastData, findModule, joinClassNames } from 'decky-frontend-lib';
+import { FunctionComponent } from 'react';
+
+interface ToastProps {
+ toast: {
+ data: ToastData;
+ nToastDurationMS: number;
+ };
+}
+
+const toastClasses = findModule((mod) => {
+ if (typeof mod !== 'object') return false;
+
+ if (mod.ToastPlaceholder) {
+ return true;
+ }
+
+ return false;
+});
+
+const templateClasses = findModule((mod) => {
+ if (typeof mod !== 'object') return false;
+
+ if (mod.ShortTemplate) {
+ return true;
+ }
+
+ return false;
+});
+
+const Toast: FunctionComponent<ToastProps> = ({ toast }) => {
+ return (
+ <div
+ style={{ '--toast-duration': `${toast.nToastDurationMS}ms` } as React.CSSProperties}
+ className={joinClassNames(toastClasses.ToastPopup, toastClasses.toastEnter)}
+ >
+ <div
+ onClick={toast.data.onClick}
+ className={joinClassNames(templateClasses.ShortTemplate, toast.data.className || '')}
+ >
+ {toast.data.logo && <div className={templateClasses.StandardLogoDimensions}>{toast.data.logo}</div>}
+ <div className={joinClassNames(templateClasses.Content, toast.data.contentClassName || '')}>
+ <div className={templateClasses.Header}>
+ {toast.data.icon && <div className={templateClasses.Icon}>{toast.data.icon}</div>}
+ <div className={templateClasses.Title}>{toast.data.title}</div>
+ </div>
+ <div className={templateClasses.Body}>{toast.data.body}</div>
+ </div>
+ </div>
+ </div>
+ );
+};
+
+export default Toast;