44 lines
2.3 KiB
JavaScript
44 lines
2.3 KiB
JavaScript
export function useChatDraft(roomKey, { persist = true } = {}) {
|
|
const auth = useAuthStore()
|
|
const temp = useTempStore()
|
|
const apiBase = useRuntimeConfig().public.apiBase
|
|
const localDraft = ref(null)
|
|
const key = computed(() => {
|
|
const room = toValue(roomKey), user = auth.user?.id || auth.user?.user_id
|
|
return toValue(persist) && room && user && auth.activeTenant
|
|
? JSON.stringify([apiBase, user, String(auth.activeTenant), auth.profile?.id || '', room])
|
|
: null
|
|
})
|
|
watch([key, () => toValue(roomKey), () => auth.user?.id || auth.user?.user_id,
|
|
() => auth.activeTenant, () => auth.profile?.id], () => { localDraft.value = null }, { flush: 'sync' })
|
|
const current = () => key.value ? temp.getChatDraft(key.value) : localDraft.value
|
|
function update(patch) {
|
|
const value = { text: '', image: null, ...current(), ...patch, clientId: crypto.randomUUID() }
|
|
const next = value.text || value.image ? value : null
|
|
if (key.value) temp.setChatDraft(key.value, next)
|
|
else localDraft.value = next
|
|
}
|
|
const draft = computed({ get: () => current()?.text || '', set: text => update({ text }) })
|
|
const draftImage = computed({ get: () => current()?.image || null, set: image => update({ image }) })
|
|
const draftSending = computed(() => !!key.value && temp.isChatDraftSending(key.value))
|
|
const captureDraft = () => ({ key: key.value, value: current() })
|
|
function startDraftSend() {
|
|
if (draftSending.value) return null
|
|
const snapshot = captureDraft()
|
|
if (!snapshot.value) return null
|
|
if (snapshot.key) temp.startChatDraftSend(snapshot.key, snapshot.value.clientId)
|
|
return snapshot
|
|
}
|
|
function finishDraftSend(snapshot) {
|
|
if (snapshot.key) temp.finishChatDraftSend(snapshot.key, snapshot.value.clientId)
|
|
}
|
|
function clearDraft(snapshot) {
|
|
const saved = snapshot.key ? temp.getChatDraft(snapshot.key) : localDraft.value
|
|
// A late send response must only remove the draft that was actually sent.
|
|
if (!snapshot.value || saved?.clientId !== snapshot.value.clientId) return
|
|
if (snapshot.key) temp.setChatDraft(snapshot.key, null)
|
|
else localDraft.value = null
|
|
}
|
|
return { draft, draftImage, draftSending, captureDraft, clearDraft, startDraftSend, finishDraftSend }
|
|
}
|