Skip to content

Commit b50c044

Browse files
committed
refactor: remove toolbarStorage and persist toolbar state in MessageComposer indexdb
1 parent 0c1bc3e commit b50c044

File tree

4 files changed

+31
-46
lines changed

4 files changed

+31
-46
lines changed

packages/webapp/components/chatroom/components/MessageComposer/MessageComposer.tsx

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
55
import { MessageComposerContext } from './context/MessageComposerContext'
66
import { useAuthStore, useChatStore, useStore } from '@stores'
77
import { TChannelSettings } from '@types'
8-
import { toolbarStorage } from './helpers/toolbarStorage'
9-
import { getComposerState, clearComposerState, ComposerState } from '@db/messageComposerDB'
8+
import {
9+
getComposerState,
10+
clearComposerState,
11+
setComposerStateDebounced,
12+
ComposerState
13+
} from '@db/messageComposerDB'
1014
import { SignInDialog } from '@components/ui/dialogs'
1115

1216
import { EditorContent } from '@tiptap/react'
@@ -62,7 +66,7 @@ const MessageComposer = ({
6266
const channels = useChatStore((state) => state.channels)
6367
const { workspaceId } = useStore((state) => state.settings)
6468
const editorRef = useRef<HTMLDivElement | null>(null)
65-
const [isToolbarOpen, setIsToolbarOpen] = useState(() => toolbarStorage.get())
69+
const [isToolbarOpen, setIsToolbarOpen] = useState(false)
6670
const setOrUpdateChatRoom = useChatStore((state) => state.setOrUpdateChatRoom)
6771
const openDialog = useStore((state) => state.openDialog)
6872

@@ -94,7 +98,8 @@ const MessageComposer = ({
9498
loading,
9599
onSubmit: () => submitRef.current?.(),
96100
workspaceId,
97-
channelId
101+
channelId,
102+
isToolbarOpen
98103
})
99104

100105
const chatChannels = useChatStore((state) => state.workspaceSettings.channels)
@@ -133,6 +138,8 @@ const MessageComposer = ({
133138
if (draft?.html) {
134139
editor.chain().setContent(draft.html).focus('end').run()
135140
}
141+
// Restore toolbar state
142+
if (draft?.isToolbarOpen !== undefined) setIsToolbarOpen(draft.isToolbarOpen)
136143
})
137144
}, [editor, workspaceId, channelId, editMessageMemory, replyMessageMemory, commentMessageMemory])
138145

@@ -432,16 +439,21 @@ const MessageComposer = ({
432439
setAttributes()
433440
}, [editor, editorRef])
434441

435-
// Save toolbar toggle state to localStorage
436-
useEffect(() => {
437-
toolbarStorage.set(isToolbarOpen)
438-
}, [isToolbarOpen])
439-
440442
const toggleToolbar = useCallback(() => {
441443
setIsToolbarOpen(!isToolbarOpen)
442444
editor?.commands.focus()
443445
}, [setIsToolbarOpen, isToolbarOpen, editor])
444446

447+
// Persist toolbar state when it changes independently
448+
useEffect(() => {
449+
if (!workspaceId || !channelId || !editor) return
450+
451+
const text = editor.getText() || ''
452+
const html = editor.getHTML() || ''
453+
454+
setComposerStateDebounced(workspaceId, channelId, { text, html, isToolbarOpen })
455+
}, [isToolbarOpen, workspaceId, channelId, editor])
456+
445457
useEffect(() => {
446458
editor && setOrUpdateChatRoom('editorInstance', editor)
447459
editorRef.current && setOrUpdateChatRoom('editorRef', editorRef.current)

packages/webapp/components/chatroom/components/MessageComposer/helpers/toolbarStorage.ts

Lines changed: 0 additions & 35 deletions
This file was deleted.

packages/webapp/components/chatroom/components/MessageComposer/hooks/useTiptapEditor.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,14 @@ export const useTiptapEditor = ({
4848
loading,
4949
onSubmit,
5050
workspaceId,
51-
channelId
51+
channelId,
52+
isToolbarOpen
5253
}: {
5354
loading: boolean
5455
onSubmit: () => void
5556
workspaceId?: string
5657
channelId: string
58+
isToolbarOpen?: boolean
5759
}) => {
5860
const [html, setHtml] = useState('')
5961
const [text, setText] = useState('')
@@ -111,7 +113,11 @@ export const useTiptapEditor = ({
111113

112114
// Persist draft to IndexedDB with debouncing (500ms)
113115
if (workspaceId && channelId && text && html) {
114-
setComposerStateDebounced(workspaceId, channelId, { text, html })
116+
setComposerStateDebounced(workspaceId, channelId, {
117+
text,
118+
html,
119+
isToolbarOpen
120+
})
115121
}
116122
},
117123
onBlur: () => {

packages/webapp/db/messageComposerDB.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ export type ComposerState = {
4747
}>
4848
/** current caret/selection in the composer */
4949
selection?: { start: number; end: number }
50+
/** toolbar open/close state - persisted per room */
51+
isToolbarOpen?: boolean
5052
/** any editor-specific flags you want to persist without schema churn */
5153
meta?: Record<string, unknown>
5254
}

0 commit comments

Comments
 (0)