use non reactive callback approach in message drafts

This commit is contained in:
Samuel Newman
2025-10-09 12:41:57 +03:00
parent 6760ef7862
commit 18b8a25aab
+14 -11
View File
@@ -1,15 +1,16 @@
import React, {useEffect, useMemo, useReducer, useRef} from 'react' import {createContext, useContext, useEffect, useMemo, useReducer} from 'react'
import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
import {useCurrentConvoId} from './current-convo-id' import {useCurrentConvoId} from './current-convo-id'
const MessageDraftsContext = React.createContext<{ const MessageDraftsContext = createContext<{
state: State state: State
dispatch: React.Dispatch<Actions> dispatch: React.Dispatch<Actions>
} | null>(null) } | null>(null)
MessageDraftsContext.displayName = 'MessageDraftsContext' MessageDraftsContext.displayName = 'MessageDraftsContext'
function useMessageDraftsContext() { function useMessageDraftsContext() {
const ctx = React.useContext(MessageDraftsContext) const ctx = useContext(MessageDraftsContext)
if (!ctx) { if (!ctx) {
throw new Error( throw new Error(
'useMessageDrafts must be used within a MessageDraftsContext', 'useMessageDrafts must be used within a MessageDraftsContext',
@@ -37,20 +38,22 @@ export function useMessageDraft() {
export function useSaveMessageDraft(message: string) { export function useSaveMessageDraft(message: string) {
const {currentConvoId} = useCurrentConvoId() const {currentConvoId} = useCurrentConvoId()
const {dispatch} = useMessageDraftsContext() const {dispatch} = useMessageDraftsContext()
const messageRef = useRef(message)
messageRef.current = message const onUnmount = useNonReactiveCallback((convoId: string) => {
dispatch({
type: 'set',
convoId,
draft: message,
})
})
useEffect(() => { useEffect(() => {
return () => { return () => {
if (currentConvoId) { if (currentConvoId) {
dispatch({ onUnmount(currentConvoId)
type: 'set',
convoId: currentConvoId,
draft: messageRef.current,
})
} }
} }
}, [currentConvoId, dispatch]) }, [currentConvoId, onUnmount])
} }
type State = {[convoId: string]: string} type State = {[convoId: string]: string}