| 'use client'; | |
| import { useMemo } from 'react'; | |
| import useSWR, { useSWRConfig } from 'swr'; | |
| import { unstable_serialize } from 'swr/infinite'; | |
| import { updateChatVisibility } from '@/app/(chat)/actions'; | |
| import { | |
| getChatHistoryPaginationKey, | |
| type ChatHistory, | |
| } from '@/components/sidebar-history'; | |
| import type { VisibilityType } from '@/components/visibility-selector'; | |
| export function useChatVisibility({ | |
| chatId, | |
| initialVisibilityType, | |
| }: { | |
| chatId: string; | |
| initialVisibilityType: VisibilityType; | |
| }) { | |
| const { mutate, cache } = useSWRConfig(); | |
| const history: ChatHistory = cache.get('/api/history')?.data; | |
| const { data: localVisibility, mutate: setLocalVisibility } = useSWR( | |
| `${chatId}-visibility`, | |
| null, | |
| { | |
| fallbackData: initialVisibilityType, | |
| }, | |
| ); | |
| const visibilityType = useMemo(() => { | |
| if (!history) return localVisibility; | |
| const chat = history.chats.find((chat) => chat.id === chatId); | |
| if (!chat) return 'private'; | |
| return chat.visibility; | |
| }, [history, chatId, localVisibility]); | |
| const setVisibilityType = (updatedVisibilityType: VisibilityType) => { | |
| setLocalVisibility(updatedVisibilityType); | |
| mutate(unstable_serialize(getChatHistoryPaginationKey)); | |
| updateChatVisibility({ | |
| chatId: chatId, | |
| visibility: updatedVisibilityType, | |
| }); | |
| }; | |
| return { visibilityType, setVisibilityType }; | |
| } | |