2024-05-03 13:53:21 -07:00
|
|
|
import { createClient } from "@liveblocks/client"
|
2024-11-17 12:35:56 -05:00
|
|
|
import { createLiveblocksContext, createRoomContext } from "@liveblocks/react"
|
2024-05-03 13:53:21 -07:00
|
|
|
import YLiveblocksProvider from "@liveblocks/yjs"
|
2024-05-05 14:33:09 -07:00
|
|
|
import { colors } from "./lib/colors"
|
2024-05-03 13:53:21 -07:00
|
|
|
|
|
|
|
const client = createClient({
|
|
|
|
// publicApiKey: process.env.NEXT_PUBLIC_LIVEBLOCKS_PUBLIC_KEY!,
|
|
|
|
authEndpoint: "/api/lb-auth",
|
|
|
|
// throttle: 100,
|
|
|
|
async resolveUsers({ userIds }) {
|
|
|
|
// Used only for Comments and Notifications. Return a list of user information
|
|
|
|
// retrieved from `userIds`. This info is used in comments, mentions etc.
|
|
|
|
|
|
|
|
// const usersData = await __fetchUsersFromDB__(userIds);
|
|
|
|
//
|
|
|
|
// return usersData.map((userData) => ({
|
|
|
|
// name: userData.name,
|
|
|
|
// avatar: userData.avatar.src,
|
|
|
|
// }));
|
|
|
|
|
|
|
|
return []
|
|
|
|
},
|
|
|
|
async resolveMentionSuggestions({ text }) {
|
|
|
|
// Used only for Comments. Return a list of userIds that match `text`.
|
|
|
|
// These userIds are used to create a mention list when typing in the
|
|
|
|
// composer.
|
|
|
|
//
|
|
|
|
// For example when you type "@jo", `text` will be `"jo"`, and
|
|
|
|
// you should to return an array with John and Joanna's userIds:
|
|
|
|
// ["john@example.com", "joanna@example.com"]
|
|
|
|
|
|
|
|
// const users = await getUsers({ search: text });
|
|
|
|
// return users.map((user) => user.id);
|
|
|
|
|
|
|
|
return []
|
|
|
|
},
|
|
|
|
async resolveRoomsInfo({ roomIds }) {
|
|
|
|
// Used only for Comments and Notifications. Return a list of room information
|
|
|
|
// retrieved from `roomIds`.
|
|
|
|
|
|
|
|
// const roomsData = await __fetchRoomsFromDB__(roomIds);
|
|
|
|
//
|
|
|
|
// return roomsData.map((roomData) => ({
|
|
|
|
// name: roomData.name,
|
|
|
|
// url: roomData.url,
|
|
|
|
// }));
|
|
|
|
|
|
|
|
return []
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
// Presence represents the properties that exist on every user in the Room
|
|
|
|
// and that will automatically be kept in sync. Accessible through the
|
|
|
|
// `user.presence` property. Must be JSON-serializable.
|
|
|
|
type Presence = {
|
|
|
|
// cursor: { x: number, y: number } | null,
|
|
|
|
// ...
|
|
|
|
}
|
|
|
|
|
|
|
|
// Optionally, Storage represents the shared document that persists in the
|
|
|
|
// Room, even after all users leave. Fields under Storage typically are
|
|
|
|
// LiveList, LiveMap, LiveObject instances, for which updates are
|
|
|
|
// automatically persisted and synced to all connected clients.
|
|
|
|
type Storage = {
|
|
|
|
// author: LiveObject<{ firstName: string, lastName: string }>,
|
|
|
|
// ...
|
|
|
|
}
|
|
|
|
|
|
|
|
// Optionally, UserMeta represents static/readonly metadata on each user, as
|
|
|
|
// provided by your own custom auth back end (if used). Useful for data that
|
|
|
|
// will not change during a session, like a user's name or avatar.
|
|
|
|
type UserMeta = {
|
2024-05-03 14:27:45 -07:00
|
|
|
id: string
|
|
|
|
info: {
|
|
|
|
name: string
|
|
|
|
email: string
|
2024-05-05 14:33:09 -07:00
|
|
|
color: keyof typeof colors
|
2024-05-03 14:27:45 -07:00
|
|
|
}
|
2024-05-03 13:53:21 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Optionally, the type of custom events broadcast and listened to in this
|
|
|
|
// room. Use a union for multiple events. Must be JSON-serializable.
|
|
|
|
type RoomEvent = {
|
|
|
|
// type: "NOTIFICATION",
|
|
|
|
// ...
|
|
|
|
}
|
|
|
|
|
|
|
|
// Optionally, when using Comments, ThreadMetadata represents metadata on
|
|
|
|
// each thread. Can only contain booleans, strings, and numbers.
|
|
|
|
export type ThreadMetadata = {
|
|
|
|
// resolved: boolean;
|
|
|
|
// quote: string;
|
|
|
|
// time: number;
|
|
|
|
}
|
|
|
|
|
2024-05-03 14:27:45 -07:00
|
|
|
export type UserAwareness = {
|
|
|
|
user?: UserMeta["info"]
|
|
|
|
}
|
|
|
|
|
|
|
|
export type AwarenessList = [number, UserAwareness][]
|
|
|
|
|
2024-05-03 13:53:21 -07:00
|
|
|
// Room-level hooks, use inside `RoomProvider`
|
|
|
|
export const {
|
2024-05-05 14:33:09 -07:00
|
|
|
RoomProvider,
|
|
|
|
useRoom,
|
|
|
|
useMyPresence,
|
|
|
|
useUpdateMyPresence,
|
|
|
|
useSelf,
|
|
|
|
useOthers,
|
|
|
|
useOthersMapped,
|
|
|
|
useOthersListener,
|
|
|
|
useOthersConnectionIds,
|
|
|
|
useOther,
|
|
|
|
useBroadcastEvent,
|
|
|
|
useEventListener,
|
|
|
|
useErrorListener,
|
|
|
|
useStorage,
|
|
|
|
useBatch,
|
|
|
|
useHistory,
|
|
|
|
useUndo,
|
|
|
|
useRedo,
|
|
|
|
useCanUndo,
|
|
|
|
useCanRedo,
|
|
|
|
useMutation,
|
|
|
|
useStatus,
|
|
|
|
useLostConnectionListener,
|
|
|
|
useThreads,
|
|
|
|
useCreateThread,
|
|
|
|
useEditThreadMetadata,
|
|
|
|
useCreateComment,
|
|
|
|
useEditComment,
|
|
|
|
useDeleteComment,
|
|
|
|
useAddReaction,
|
|
|
|
useRemoveReaction,
|
|
|
|
useThreadSubscription,
|
|
|
|
useMarkThreadAsRead,
|
|
|
|
useRoomNotificationSettings,
|
|
|
|
useUpdateRoomNotificationSettings,
|
|
|
|
|
|
|
|
// These hooks can be exported from either context
|
|
|
|
useUser,
|
|
|
|
useRoomInfo,
|
2024-05-03 13:53:21 -07:00
|
|
|
} = createRoomContext<Presence, Storage, UserMeta, RoomEvent, ThreadMetadata>(
|
|
|
|
client
|
|
|
|
)
|
|
|
|
|
|
|
|
// Project-level hooks, use inside `LiveblocksProvider`
|
|
|
|
export const {
|
2024-05-05 14:33:09 -07:00
|
|
|
LiveblocksProvider,
|
|
|
|
useMarkInboxNotificationAsRead,
|
|
|
|
useMarkAllInboxNotificationsAsRead,
|
|
|
|
useInboxNotifications,
|
|
|
|
useUnreadInboxNotificationsCount,
|
2024-05-03 13:53:21 -07:00
|
|
|
} = createLiveblocksContext<UserMeta, ThreadMetadata>(client)
|
|
|
|
|
|
|
|
export type TypedLiveblocksProvider = YLiveblocksProvider<
|
|
|
|
Presence,
|
|
|
|
Storage,
|
|
|
|
UserMeta,
|
|
|
|
RoomEvent
|
|
|
|
>
|