diff --git a/apps/meteor/client/providers/ServerProvider.tsx b/apps/meteor/client/providers/ServerProvider.tsx index fd719cf5aae..20f357250d8 100644 --- a/apps/meteor/client/providers/ServerProvider.tsx +++ b/apps/meteor/client/providers/ServerProvider.tsx @@ -69,6 +69,9 @@ const getStream = >(eventName: K, callback: (...args: StreamerCallbackArgs) => void): (() => void) => sdk.stream(streamName, [eventName], callback).stop; +const writeStream = >(streamName: N, streamKey: K, ...args: StreamerCallbackArgs) => + sdk.publish(streamName, [streamKey, ...args]); + const disconnect = () => Meteor.disconnect(); const reconnect = () => Meteor.reconnect(); @@ -92,6 +95,7 @@ const ServerProvider = ({ children }: ServerProviderProps) => { callEndpoint, uploadToEndpoint, getStream, + writeStream, disconnect, reconnect, }), diff --git a/apps/meteor/tests/mocks/client/ServerProviderMock.tsx b/apps/meteor/tests/mocks/client/ServerProviderMock.tsx index 76c17db1f55..0013872b103 100644 --- a/apps/meteor/tests/mocks/client/ServerProviderMock.tsx +++ b/apps/meteor/tests/mocks/client/ServerProviderMock.tsx @@ -59,6 +59,7 @@ const getStream = () => () => () => undefined; // to be implemented const callEndpoint = () => { throw new Error('not implemented'); }; // to be implemented +const writeStream = () => undefined; // to be implemented const contextValue: ServerContextValue = { connected: true, @@ -72,6 +73,7 @@ const contextValue: ServerContextValue = { getStream, reconnect: () => undefined, disconnect: () => undefined, + writeStream, }; type ServerProviderMockProps = { diff --git a/packages/mock-providers/src/MockedAppRootBuilder.tsx b/packages/mock-providers/src/MockedAppRootBuilder.tsx index 625934876a1..228b6b9276f 100644 --- a/packages/mock-providers/src/MockedAppRootBuilder.tsx +++ b/packages/mock-providers/src/MockedAppRootBuilder.tsx @@ -85,6 +85,7 @@ export class MockedAppRootBuilder { callMethod: () => Promise.reject(new Error('not implemented')), disconnect: () => Promise.reject(new Error('not implemented')), reconnect: () => Promise.reject(new Error('not implemented')), + writeStream: () => Promise.reject(new Error('not implemented')), }; private router: ContextType = { diff --git a/packages/ui-contexts/src/ServerContext.ts b/packages/ui-contexts/src/ServerContext.ts index d81fb783274..0edb41f95e8 100644 --- a/packages/ui-contexts/src/ServerContext.ts +++ b/packages/ui-contexts/src/ServerContext.ts @@ -48,6 +48,7 @@ export type ServerContextValue = { retransmitToSelf?: boolean | undefined; }, ) => (eventName: K, callback: (...args: StreamerCallbackArgs) => void) => () => void; + writeStream: >(streamName: N, eventName: K, ...args: StreamerCallbackArgs) => void; disconnect: () => void; reconnect: () => void; }; @@ -65,6 +66,9 @@ export const ServerContext = createContext({ throw new Error('not implemented'); }, getStream: () => () => (): void => undefined, + writeStream: () => { + throw new Error('not implemented'); + }, disconnect: () => { throw new Error('not implemented'); }, diff --git a/packages/ui-contexts/src/hooks/useWriteStream.ts b/packages/ui-contexts/src/hooks/useWriteStream.ts new file mode 100644 index 00000000000..aeba6dd5672 --- /dev/null +++ b/packages/ui-contexts/src/hooks/useWriteStream.ts @@ -0,0 +1,19 @@ +import type { StreamNames, StreamKeys, StreamerCallbackArgs } from '@rocket.chat/ddp-client'; +import { useCallback, useContext } from 'react'; + +import { ServerContext } from '../ServerContext'; + +type WriteStreamCallback = >(eventName: K, ...args: StreamerCallbackArgs) => void; + +export function useWriteStream(streamName: N): WriteStreamCallback { + const { writeStream } = useContext(ServerContext); + + if (!writeStream) { + throw new Error(`cannot use useWriteStream(${streamName}) hook without a wrapping ServerContext`); + } + + return useCallback( + >(eventName: K, ...args: StreamerCallbackArgs) => writeStream(streamName, eventName, ...args), + [writeStream, streamName], + ); +} diff --git a/packages/ui-contexts/src/index.ts b/packages/ui-contexts/src/index.ts index 1ca969a47ed..954193351be 100644 --- a/packages/ui-contexts/src/index.ts +++ b/packages/ui-contexts/src/index.ts @@ -96,6 +96,7 @@ export { useAccountsCustomFields } from './hooks/useAccountsCustomFields'; export { useUserPresence } from './hooks/useUserPresence'; export { useUnstoreLoginToken } from './hooks/useUnstoreLoginToken'; export { useOnLogout } from './hooks/useOnLogout'; +export { useWriteStream } from './hooks/useWriteStream'; export { UploadResult } from './ServerContext'; export { TranslationKey, TranslationLanguage } from './TranslationContext';