dialog-session-list.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { useDialog } from "@tui/ui/dialog"
  2. import { DialogSelect } from "@tui/ui/dialog-select"
  3. import { useRoute } from "@tui/context/route"
  4. import { useSync } from "@tui/context/sync"
  5. import { createMemo, createSignal, onMount } from "solid-js"
  6. import { Locale } from "@/util/locale"
  7. import { Keybind } from "@/util/keybind"
  8. import { useTheme } from "../context/theme"
  9. import { useSDK } from "../context/sdk"
  10. import { DialogSessionRename } from "./dialog-session-rename"
  11. export function DialogSessionList() {
  12. const dialog = useDialog()
  13. const sync = useSync()
  14. const { theme } = useTheme()
  15. const route = useRoute()
  16. const sdk = useSDK()
  17. const [toDelete, setToDelete] = createSignal<string>()
  18. const options = createMemo(() => {
  19. const today = new Date().toDateString()
  20. return sync.data.session
  21. .filter((x) => x.parentID === undefined)
  22. .map((x) => {
  23. const date = new Date(x.time.updated)
  24. let category = date.toDateString()
  25. if (category === today) {
  26. category = "Today"
  27. }
  28. const isDeleting = toDelete() === x.id
  29. return {
  30. title: isDeleting ? "Press delete again to confirm" : x.title,
  31. bg: isDeleting ? theme.error : undefined,
  32. value: x.id,
  33. category,
  34. footer: Locale.time(x.time.updated),
  35. }
  36. })
  37. })
  38. onMount(() => {
  39. dialog.setSize("large")
  40. })
  41. return (
  42. <DialogSelect
  43. title="Sessions"
  44. options={options()}
  45. limit={50}
  46. onMove={() => {
  47. setToDelete(undefined)
  48. }}
  49. onSelect={(option) => {
  50. route.navigate({
  51. type: "session",
  52. sessionID: option.value,
  53. })
  54. dialog.clear()
  55. }}
  56. keybind={[
  57. {
  58. keybind: Keybind.parse("delete")[0],
  59. title: "delete",
  60. onTrigger: async (option) => {
  61. if (toDelete() === option.value) {
  62. sdk.client.session.delete({
  63. path: {
  64. id: option.value,
  65. },
  66. })
  67. setToDelete(undefined)
  68. return
  69. }
  70. setToDelete(option.value)
  71. },
  72. },
  73. {
  74. keybind: Keybind.parse("r")[0],
  75. title: "rename",
  76. onTrigger: async (option) => {
  77. dialog.replace(() => <DialogSessionRename session={option.value} />)
  78. },
  79. },
  80. ]}
  81. />
  82. )
  83. }