EmptyTrashButton.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import React, { useCallback } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { toastSuccess } from '~/client/util/apiNotification';
  4. import {
  5. IDataWithMeta,
  6. IPageHasId,
  7. IPageInfo,
  8. } from '~/interfaces/page';
  9. import { useEmptyTrashModal } from '~/stores/modal';
  10. import { useSWRxDescendantsPageListForCurrrentPath, useSWRxPageInfoForList } from '~/stores/page';
  11. const EmptyTrashButton = () => {
  12. const { t } = useTranslation();
  13. const { open: openEmptyTrashModal } = useEmptyTrashModal();
  14. const { data: pagingResult, mutate } = useSWRxDescendantsPageListForCurrrentPath();
  15. const pageIds = pagingResult?.items?.map(page => page._id);
  16. const { injectTo } = useSWRxPageInfoForList(pageIds, true, true);
  17. let pageWithMetas: IDataWithMeta<IPageHasId, IPageInfo>[] = [];
  18. const convertToIDataWithMeta = (page) => {
  19. return { data: page };
  20. };
  21. if (pagingResult != null) {
  22. const dataWithMetas = pagingResult.items.map(page => convertToIDataWithMeta(page));
  23. pageWithMetas = injectTo(dataWithMetas);
  24. }
  25. const deletablePages = pageWithMetas.filter(page => page.meta?.isAbleToDeleteCompletely);
  26. const onEmptiedTrashHandler = useCallback(() => {
  27. toastSuccess(t('empty_trash'));
  28. mutate();
  29. }, [t, mutate]);
  30. const emptyTrashClickHandler = () => {
  31. if (deletablePages.length === 0) { return }
  32. openEmptyTrashModal(deletablePages, { onEmptiedTrash: onEmptiedTrashHandler, canDelepeAllPages: pagingResult?.totalCount === deletablePages.length });
  33. };
  34. return (
  35. <div className="d-flex align-items-center">
  36. <button
  37. type="button"
  38. className="btn btn-outline-secondary rounded-pill text-danger d-flex align-items-center"
  39. onClick={() => emptyTrashClickHandler()}
  40. >
  41. <i className="icon-fw icon-trash"></i>
  42. <div>{t('modal_empty.empty_the_trash')}</div>
  43. </button>
  44. </div>
  45. );
  46. };
  47. export default EmptyTrashButton;