Agently / web /src /hooks /useConversations.js
CI Deploy
Deploy 2026-05-15 14:25 UTC
7949d20
Raw
History Blame Contribute Delete
1.73 kB
import { useState, useCallback, useEffect } from 'react'
import {
loadConversationsFromApi,
createConversation,
deleteConversationApi,
updateTitleApi,
} from '../api/conversations.js'
export function useConversations() {
const [conversations, setConversations] = useState([])
const [activeId, setActiveId] = useState(null)
const [loaded, setLoaded] = useState(false)
// Initial load
useEffect(() => {
if (!loaded) {
loadConversationsFromApi().then((data) => {
setConversations(data)
setLoaded(true)
if (data && data.length > 0 && !activeId) {
setActiveId(data[0].id)
}
})
}
}, [loaded, activeId])
const refreshConversations = useCallback(() => {
loadConversationsFromApi().then(setConversations)
}, [])
const createNewChat = useCallback(() => {
const fresh = createConversation()
setConversations((prev) => [fresh, ...prev])
setActiveId(fresh.id)
return fresh
}, [])
const deleteChat = useCallback(async (convId) => {
await deleteConversationApi(convId)
setConversations((prev) => prev.filter((c) => c.id !== convId))
}, [])
const updateTitle = useCallback(async (convId, title) => {
// Optimistically update local state immediately
setConversations((prev) =>
prev.map((c) => (c.id === convId ? { ...c, title } : c)),
)
try {
await updateTitleApi(convId, title)
} catch {
// Revert on failure — re-fetch from server
refreshConversations()
}
}, [refreshConversations])
return {
conversations,
setConversations,
activeId,
setActiveId,
loaded,
refreshConversations,
createNewChat,
deleteChat,
updateTitle,
}
}