UNPKG

@liveblocks/react

Version:

A set of React hooks and providers to use Liveblocks declaratively. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.

142 lines (139 loc) 4.49 kB
import { getUmbrellaStoreForClient, useAddRoomCommentReaction, useClient, useClientOrNull, useCreateRoomComment, useCreateRoomThread, useCreateTextMention, useDeleteRoomComment, useDeleteRoomThread, useDeleteTextMention, useEditRoomComment, useEditRoomThreadMetadata, useLatest, useMarkRoomThreadAsRead, useMarkRoomThreadAsResolved, useMarkRoomThreadAsUnresolved, useMentionSuggestionsCache, useRemoveRoomCommentReaction, useReportTextEditor, useResolveMentionSuggestions, useRoomAttachmentUrl, useRoomPermissions, useRoomThreadSubscription, useSignal, useSyncExternalStoreWithSelector, useYjsProvider } from "./chunk-YZRXMG3Z.js"; // src/lib/use-layout-effect.ts import { useEffect, useLayoutEffect as useOriginalLayoutEffect } from "react"; var useLayoutEffect = typeof window !== "undefined" ? useOriginalLayoutEffect : useEffect; // src/use-mention-suggestions.ts import { stableStringify } from "@liveblocks/core"; import { useEffect as useEffect2, useRef, useState } from "react"; var MENTION_SUGGESTIONS_DEBOUNCE = 500; function normalizeMentionSuggestions(suggestions) { return suggestions.map( (suggestion) => typeof suggestion === "string" ? { kind: "user", id: suggestion } : suggestion ); } function useMentionSuggestions(roomId, search) { const [mentionSuggestions, setMentionSuggestions] = useState(); const lastInvokedAt = useRef(); const resolveMentionSuggestions = useResolveMentionSuggestions(); const mentionSuggestionsCache = useMentionSuggestionsCache(); useEffect2(() => { if (search === void 0 || !resolveMentionSuggestions) { return; } const resolveMentionSuggestionsArgs = { text: search, roomId }; const mentionSuggestionsCacheKey = stableStringify( resolveMentionSuggestionsArgs ); let debounceTimeout; let isCanceled = false; const getMentionSuggestions = async () => { try { lastInvokedAt.current = performance.now(); const rawMentionSuggestions = await resolveMentionSuggestions( resolveMentionSuggestionsArgs ); if (!isCanceled) { const normalizedSuggestions = normalizeMentionSuggestions( rawMentionSuggestions ); setMentionSuggestions(normalizedSuggestions); mentionSuggestionsCache.set( mentionSuggestionsCacheKey, normalizedSuggestions ); } } catch (error) { console.error(error?.message); } }; if (mentionSuggestionsCache.has(mentionSuggestionsCacheKey)) { const cachedSuggestions = mentionSuggestionsCache.get( mentionSuggestionsCacheKey ); setMentionSuggestions(cachedSuggestions); } else if (!lastInvokedAt.current || Math.abs(performance.now() - lastInvokedAt.current) > MENTION_SUGGESTIONS_DEBOUNCE) { void getMentionSuggestions(); } else { debounceTimeout = window.setTimeout(() => { void getMentionSuggestions(); }, MENTION_SUGGESTIONS_DEBOUNCE); } return () => { isCanceled = true; window.clearTimeout(debounceTimeout); }; }, [search, roomId, resolveMentionSuggestions, mentionSuggestionsCache]); return mentionSuggestions; } // src/use-sync-source.ts import { kInternal } from "@liveblocks/core"; import { useEffect as useEffect3, useState as useState2 } from "react"; function useSyncSource() { const client = useClient(); const createSyncSource = client[kInternal].createSyncSource; const [syncSource, setSyncSource] = useState2(); useEffect3(() => { const newSyncSource = createSyncSource(); setSyncSource(newSyncSource); return () => newSyncSource.destroy(); }, [createSyncSource]); return syncSource; } export { getUmbrellaStoreForClient, useAddRoomCommentReaction, useClientOrNull, useCreateRoomComment, useCreateRoomThread, useCreateTextMention, useDeleteRoomComment, useDeleteRoomThread, useDeleteTextMention, useEditRoomComment, useEditRoomThreadMetadata, useLatest, useLayoutEffect, useMarkRoomThreadAsRead, useMarkRoomThreadAsResolved, useMarkRoomThreadAsUnresolved, useMentionSuggestions, useMentionSuggestionsCache, useRemoveRoomCommentReaction, useReportTextEditor, useResolveMentionSuggestions, useRoomAttachmentUrl, useRoomPermissions, useRoomThreadSubscription, useSignal, useSyncExternalStoreWithSelector, useSyncSource, useYjsProvider }; //# sourceMappingURL=_private.js.map