spacedrive/interface/hooks/useToasts.ts
Brendan Allan c65d92ee4c
[ENG-380] Interface code structure improvement (#581)
* beginnings of app directory

* settings mostly good

* colocate way more components

* flatten components folder

* reexport QueryClientProvider from client

* move CodeBlock back to interface

* colocate Explorer, KeyManager + more

* goddamn captialisation

* get toasts out of components

* please eslint

* no more src directory

* $ instead of :

* added back RowHeader component

* fix settings modal padding

* more spacing, less margin

* fix sidebar locations button

* fix tags sidebar link

* clean up back button

* added margin to explorer context menu to prevent contact with edge of viewport

* don't export QueryClientProvider from @sd/client

* basic guidelines

* import interface correctly

* remove old demo data

* fix onboarding layout

* fix onboarding navigation

* fix key manager settings button

---------

Co-authored-by: Jamie Pine <ijamespine@me.com>
2023-02-27 21:29:48 -08:00

35 lines
670 B
TypeScript

import { proxy, useSnapshot } from 'valtio';
interface Toast {
id: string;
title: string;
subtitle?: string;
duration?: number;
actionButton?: {
text: string;
onClick: () => void;
};
}
const state = proxy({
toasts: [] as Toast[]
});
const randomId = () => Math.random().toString(36).slice(2);
export function useToasts() {
return {
toasts: useSnapshot(state).toasts,
addToast: (toast: Omit<Toast, 'id'>) => {
state.toasts.push({
id: randomId(),
...toast
});
},
removeToast: (toast: Toast | string) => {
const id = typeof toast === 'string' ? toast : toast.id;
state.toasts = state.toasts.filter((t) => t.id !== id);
}
};
}