stream-chat
Version:
JS SDK for the Stream Chat API
71 lines (59 loc) • 1.96 kB
text/typescript
import { StateStore } from '..';
import type {
CustomMessageComposerData,
CustomMessageData,
DraftMessage,
LocalMessage,
} from '..';
import type { MessageComposer } from './messageComposer';
import type { DeepPartial } from '../types.utility';
export type CustomDataManagerState = {
message: CustomMessageData;
custom: CustomMessageComposerData;
};
export type CustomDataManagerOptions = {
composer: MessageComposer;
message?: DraftMessage | LocalMessage;
};
const initState = (options: CustomDataManagerOptions): CustomDataManagerState => {
if (!options)
return { message: {} as CustomMessageData, custom: {} as CustomMessageComposerData };
return { message: {} as CustomMessageData, custom: {} as CustomMessageComposerData };
};
export class CustomDataManager {
composer: MessageComposer;
state: StateStore<CustomDataManagerState>;
constructor({ composer, message }: CustomDataManagerOptions) {
this.composer = composer;
this.state = new StateStore<CustomDataManagerState>(initState({ composer, message }));
}
get customMessageData() {
return this.state.getLatestValue().message;
}
get customComposerData() {
return this.state.getLatestValue().custom;
}
isMessageDataEqual = (
nextState: CustomDataManagerState,
previousState?: CustomDataManagerState,
) => JSON.stringify(nextState.message) === JSON.stringify(previousState?.message);
initState = ({ message }: { message?: DraftMessage | LocalMessage } = {}) => {
this.state.next(initState({ composer: this.composer, message }));
};
setMessageData(data: DeepPartial<CustomMessageData>) {
this.state.partialNext({
message: {
...this.state.getLatestValue().message,
...data,
},
});
}
setCustomData(data: DeepPartial<CustomMessageComposerData>) {
this.state.partialNext({
custom: {
...this.state.getLatestValue().custom,
...data,
},
});
}
}