Zeichen's app for both server and client.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

111 lines
2.0 KiB

  1. import * as Storage from '../services/Storage'
  2. const save = async ({ userId, stateRef, router, id, setNotes, }) => {
  3. stateRef.current.updatedAt = new Date().toISOString()
  4. const newNote = await Storage.save({ userId, })('notes')(stateRef.current)
  5. if (router.query.id !== id) {
  6. await router.replace(
  7. {
  8. pathname: '/notes/[id]',
  9. query: { id, },
  10. },
  11. undefined,
  12. {
  13. shallow: true,
  14. }
  15. )
  16. }
  17. setNotes(oldNotes => {
  18. let notes
  19. if (oldNotes.some((a) => a.id === id)) {
  20. notes = oldNotes.map(n => n.id === id ? newNote : n)
  21. } else {
  22. notes = [newNote, ...oldNotes]
  23. }
  24. return notes.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))
  25. })
  26. }
  27. const triggerAutoSave = ({
  28. stateRef,
  29. timeoutRef,
  30. router,
  31. id,
  32. setNotes,
  33. userId,
  34. }) => {
  35. if (timeoutRef.current !== null) {
  36. clearTimeout(timeoutRef.current)
  37. }
  38. timeoutRef.current = setTimeout(async () => {
  39. await save({ userId, stateRef, router, id, setNotes, })
  40. timeoutRef.current = null
  41. }, 3000)
  42. }
  43. export const updateContent = ({
  44. stateRef,
  45. timeoutRef,
  46. router,
  47. id,
  48. setNotes,
  49. userId,
  50. }) => e => {
  51. stateRef.current.content = e
  52. triggerAutoSave({
  53. userId,
  54. stateRef,
  55. timeoutRef,
  56. router,
  57. id,
  58. setNotes,
  59. })
  60. }
  61. export const updateTitle = ({
  62. stateRef,
  63. timeoutRef,
  64. router,
  65. id,
  66. setNotes,
  67. setTitle,
  68. userId,
  69. }) => e => {
  70. setTitle(stateRef.current.title = e.target.value)
  71. triggerAutoSave({
  72. userId,
  73. stateRef,
  74. timeoutRef,
  75. router,
  76. id,
  77. setNotes,
  78. })
  79. }
  80. export const remove = ({
  81. setNotes,
  82. notes,
  83. router,
  84. userId,
  85. }) => note => async () => {
  86. setNotes(notes.filter(n => n.id !== note.id))
  87. await router.replace(
  88. {
  89. pathname: '/notes',
  90. },
  91. undefined,
  92. {
  93. shallow: true,
  94. }
  95. )
  96. const result = await Storage.remove({ userId, })('notes')(note)
  97. if (!result) {
  98. setNotes(notes)
  99. }
  100. }
  101. export const load = async ({ setNotes, userId, }) => {
  102. const theNotes = await Storage.load({ userId, })('notes')
  103. setNotes(theNotes)
  104. }