toastListFoundation.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import BaseFoundation, { DefaultAdapter } from '../base/foundation';
  2. import { ToastInstance, ToastProps } from '../toast/toastFoundation';
  3. // eslint-disable-next-line @typescript-eslint/no-empty-interface
  4. export interface ToastListProps{
  5. }
  6. export interface ToastListState{
  7. list: ToastInstance[];
  8. removedItems: ToastInstance[];
  9. updatedItems: ToastInstance[]
  10. }
  11. export interface ToastListAdapter extends DefaultAdapter<ToastListProps, ToastListState>{
  12. updateToast: (list: ToastListState['list'], removedItems: ToastListState['removedItems'], updatedItems: ToastListState['updatedItems']) => void
  13. }
  14. export default class ToastListFoundation extends BaseFoundation<ToastListAdapter> {
  15. constructor(adapter: ToastListAdapter) {
  16. super({ ...ToastListFoundation.defaultAdapter, ...adapter });
  17. }
  18. hasToast(id: string) {
  19. const toastList = this._adapter.getState('list') as ToastListState['list'];
  20. return toastList.map(({ id }) =>id).includes(id);
  21. }
  22. addToast(toastOpts: ToastProps) {
  23. const toastList = this._adapter.getState('list') as ToastListState['list'];
  24. // const id = getUuid('toast');
  25. // let toastOpts = { ...opts, id };
  26. // console.log(toastOpts);
  27. toastList.push(toastOpts);
  28. this._adapter.updateToast(toastList, [], []);
  29. // return id;
  30. }
  31. updateToast(id: string, toastOpts: ToastProps) {
  32. let toastList = this._adapter.getState('list') as ToastListState['list'];
  33. toastList = toastList.map((toast) => toast.id === id ? { ...toast, ...toastOpts }: toast);
  34. const updatedItems = toastList.filter((toast => toast.id === id));
  35. this._adapter.updateToast(toastList, [], updatedItems);
  36. }
  37. removeToast(id: string) {
  38. let toastList = this._adapter.getState('list') as ToastListState['list'];
  39. const removedItems: ToastListState['removedItems'] = [];
  40. toastList = toastList.filter(toastOpts => {
  41. if (toastOpts.id === id) {
  42. removedItems.push(toastOpts);
  43. return false;
  44. }
  45. return true;
  46. });
  47. this._adapter.updateToast(toastList, removedItems, []);
  48. }
  49. destroyAll() {
  50. const toastList = this._adapter.getState('list');
  51. if (toastList.length > 0) {
  52. this._adapter.updateToast([], toastList, []);
  53. }
  54. }
  55. }