TrashcanItem.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /**
  2. * TrashcanItem
  3. * @author: oldj
  4. * @homepage: https://oldj.net
  5. */
  6. import ItemIcon from '@renderer/components/ItemIcon'
  7. import list_item_styles from '@renderer/components/List/ListItem.module.scss'
  8. import { actions } from '@renderer/core/agent'
  9. import { PopupMenu } from '@renderer/core/PopupMenu'
  10. import { ITrashcanListObject } from '@common/data'
  11. import useI18n from '@renderer/models/useI18n'
  12. import clsx from 'clsx'
  13. import React from 'react'
  14. import styles from './TrashcanItem.module.scss'
  15. import useHostsData from '@renderer/models/useHostsData'
  16. interface Props {
  17. data: ITrashcanListObject
  18. }
  19. const TrashcanItem = (props: Props) => {
  20. const { data } = props
  21. const { lang } = useI18n()
  22. const { hosts_data, loadHostsData } = useHostsData()
  23. const onSelect = (i: any) => {
  24. console.log(i)
  25. }
  26. const menu_for_all = new PopupMenu([
  27. {
  28. label: lang.trashcan_clear,
  29. enabled: hosts_data.trashcan.length > 0,
  30. click() {
  31. if (confirm(lang.trashcan_clear_confirm)) {
  32. actions
  33. .clearTrashcan()
  34. .then(loadHostsData)
  35. .catch((e) => console.error(e))
  36. }
  37. },
  38. },
  39. ])
  40. const menu_for_item = new PopupMenu([
  41. {
  42. label: lang.trashcan_restore,
  43. click() {
  44. actions.restoreItemFromTrashcan(data.id).then((success) => {
  45. success && loadHostsData()
  46. })
  47. },
  48. },
  49. {
  50. type: 'separator',
  51. },
  52. {
  53. label: lang.hosts_delete,
  54. click() {
  55. if (confirm(lang.trashcan_delete_confirm)) {
  56. actions.deleteItemFromTrashcan(data.id).then((success) => {
  57. success && loadHostsData()
  58. })
  59. }
  60. },
  61. },
  62. ])
  63. return (
  64. <div
  65. className={clsx(styles.root, data.is_root && styles.trashcan_title)}
  66. onContextMenu={(e) => {
  67. if (data.is_root) {
  68. menu_for_all.show()
  69. } else {
  70. menu_for_item.show()
  71. }
  72. e.preventDefault()
  73. e.stopPropagation()
  74. }}
  75. >
  76. <div className={styles.title} onClick={onSelect}>
  77. <span className={list_item_styles.icon}>
  78. <ItemIcon type={data.type} is_collapsed={true} />
  79. </span>
  80. {data.data.title || lang.untitled}
  81. {data.is_root ? <span className={styles.count}>{data.children?.length || 0}</span> : null}
  82. </div>
  83. </div>
  84. )
  85. }
  86. export default TrashcanItem