import { type PresenceOpts, type PresenceResponse, type RoomSchemaShape, InstantCoreDatabase, InstantSchemaDef } from '@instantdb/core'; import { KeyboardEvent } from 'react'; export type PresenceHandle = PresenceResponse & { publishPresence: (data: Partial) => void; }; export type TypingIndicatorOpts = { timeout?: number | null; stopOnEnter?: boolean; writeOnly?: boolean; }; export type TypingIndicatorHandle = { active: PresenceShape[]; setActive(active: boolean): void; inputProps: { onKeyDown: (e: KeyboardEvent) => void; onBlur: () => void; }; }; export declare const defaultActivityStopTimeout = 1000; /** * Listen for broadcasted events given a room and topic. * * @see https://instantdb.com/docs/presence-and-topics * @example * function App({ roomId }) { * const room = db.room('chats', roomId); * db.rooms.useTopicEffect(room, 'emoji', (message, peer) => { * console.log(peer.name, 'sent', message); * }); * // ... * } */ export declare function useTopicEffect(room: InstantReactRoom, topic: TopicType, onEvent: (event: RoomSchema[RoomType]['topics'][TopicType], peer: RoomSchema[RoomType]['presence']) => any): void; /** * Broadcast an event to a room. * * @see https://instantdb.com/docs/presence-and-topics * @example * function App({ roomId }) { * const room = db.room('chat', roomId); * const publishTopic = db.rooms.usePublishTopic(room, "emoji"); * * return ( * * ); * } * */ export declare function usePublishTopic(room: InstantReactRoom, topic: TopicType): (data: RoomSchema[RoomType]['topics'][TopicType]) => void; /** * Listen for peer's presence data in a room, and publish the current user's presence. * * @see https://instantdb.com/docs/presence-and-topics * @example * function App({ roomId }) { * const { * peers, * publishPresence * } = db.room(roomType, roomId).usePresence({ keys: ["name", "avatar"] }); * * // ... * } */ export declare function usePresence(room: InstantReactRoom, opts?: PresenceOpts): PresenceHandle; /** * Publishes presence data to a room * * @see https://instantdb.com/docs/presence-and-topics * @example * function App({ roomId, nickname }) { * const room = db.room('chat', roomId); * db.rooms.useSyncPresence(room, { nickname }); * } */ export declare function useSyncPresence(room: InstantReactRoom, data: Partial, deps?: any[]): void; /** * Manage typing indicator state * * @see https://instantdb.com/docs/presence-and-topics * @example * function App({ roomId }) { * const room = db.room('chat', roomId); * const { * active, * setActive, * inputProps, * } = db.rooms.useTypingIndicator(room, "chat-input"); * * return ; * } */ export declare function useTypingIndicator(room: InstantReactRoom, inputName: string, opts?: TypingIndicatorOpts): TypingIndicatorHandle; export declare const rooms: { useTopicEffect: typeof useTopicEffect; usePublishTopic: typeof usePublishTopic; usePresence: typeof usePresence; useSyncPresence: typeof useSyncPresence; useTypingIndicator: typeof useTypingIndicator; }; export declare class InstantReactRoom, RoomSchema extends RoomSchemaShape, RoomType extends string & keyof RoomSchema> { core: InstantCoreDatabase; /** @deprecated use `core` instead */ _core: InstantCoreDatabase; type: RoomType; id: string; constructor(core: InstantCoreDatabase, type: RoomType, id: string); /** * @deprecated * `db.room(...).useTopicEffect` is deprecated. You can replace it with `db.rooms.useTopicEffect`. * * @example * * // Before * const room = db.room('chat', 'room-id'); * room.useTopicEffect('emoji', (message, peer) => { }); * * // After * const room = db.room('chat', 'room-id'); * db.rooms.useTopicEffect(room, 'emoji', (message, peer) => { }); */ useTopicEffect: (topic: TopicType, onEvent: (event: RoomSchema[RoomType]["topics"][TopicType], peer: RoomSchema[RoomType]["presence"]) => any) => void; /** * @deprecated * `db.room(...).usePublishTopic` is deprecated. You can replace it with `db.rooms.usePublishTopic`. * * @example * * // Before * const room = db.room('chat', 'room-id'); * const publish = room.usePublishTopic('emoji'); * * // After * const room = db.room('chat', 'room-id'); * const publish = db.rooms.usePublishTopic(room, 'emoji'); */ usePublishTopic: (topic: Topic) => ((data: RoomSchema[RoomType]["topics"][Topic]) => void); /** * @deprecated * `db.room(...).usePresence` is deprecated. You can replace it with `db.rooms.usePresence`. * * @example * * // Before * const room = db.room('chat', 'room-id'); * const { peers } = room.usePresence({ keys: ["name", "avatar"] }); * * // After * const room = db.room('chat', 'room-id'); * const { peers } = db.rooms.usePresence(room, { keys: ["name", "avatar"] }); */ usePresence: (opts?: PresenceOpts) => PresenceHandle; /** * @deprecated * `db.room(...).useSyncPresence` is deprecated. You can replace it with `db.rooms.useSyncPresence`. * * @example * * // Before * const room = db.room('chat', 'room-id'); * room.useSyncPresence(room, { nickname }); * * // After * const room = db.room('chat', 'room-id'); * db.rooms.useSyncPresence(room, { nickname }); */ useSyncPresence: (data: Partial, deps?: any[]) => void; /** * @deprecated * `db.room(...).useTypingIndicator` is deprecated. You can replace it with `db.rooms.useTypingIndicator`. * * @example * * // Before * const room = db.room('chat', 'room-id'); * const typing = room.useTypingIndiactor(room, 'chat-input'); * * // After * const room = db.room('chat', 'room-id'); * const typing = db.rooms.useTypingIndiactor(room, 'chat-input'); */ useTypingIndicator: (inputName: string, opts?: TypingIndicatorOpts) => TypingIndicatorHandle; } //# sourceMappingURL=InstantReactRoom.d.ts.map