Skip to content

Commit d87590e

Browse files
committed
feat: allow for custom non-message data storage in MessageComposer
1 parent 8783237 commit d87590e

File tree

8 files changed

+63
-37
lines changed

8 files changed

+63
-37
lines changed

src/custom_types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ export interface CustomPollData {}
99
export interface CustomReactionData {}
1010
export interface CustomUserData {}
1111
export interface CustomThreadData {}
12+
export interface CustomMessageComposerData {}

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export type {
3535
CustomCommandData,
3636
CustomEventData,
3737
CustomMemberData,
38+
CustomMessageComposerData,
3839
CustomMessageData,
3940
CustomPollOptionData,
4041
CustomPollData,

src/messageComposer/CustomDataManager.ts

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
import type { CustomMessageData, DraftMessage, LocalMessage } from '..';
21
import { StateStore } from '..';
2+
import type {
3+
CustomMessageComposerData,
4+
CustomMessageData,
5+
DraftMessage,
6+
LocalMessage,
7+
} from '..';
38
import type { MessageComposer } from './messageComposer';
49

510
export type CustomDataManagerState = {
6-
data: CustomMessageData;
11+
message: CustomMessageData;
12+
custom: CustomMessageComposerData;
713
};
814

915
export type CustomDataManagerOptions = {
@@ -12,8 +18,9 @@ export type CustomDataManagerOptions = {
1218
};
1319

1420
const initState = (options: CustomDataManagerOptions): CustomDataManagerState => {
15-
if (!options) return { data: {} as CustomMessageData };
16-
return { data: {} as CustomMessageData };
21+
if (!options)
22+
return { message: {} as CustomMessageData, custom: {} as CustomMessageComposerData };
23+
return { message: {} as CustomMessageData, custom: {} as CustomMessageComposerData };
1724
};
1825

1926
export class CustomDataManager {
@@ -25,23 +32,36 @@ export class CustomDataManager {
2532
this.state = new StateStore<CustomDataManagerState>(initState({ composer, message }));
2633
}
2734

28-
get data() {
29-
return this.state.getLatestValue().data;
35+
get customMessageData() {
36+
return this.state.getLatestValue().message;
3037
}
3138

32-
isDataEqual = (
39+
get customComposerData() {
40+
return this.state.getLatestValue().custom;
41+
}
42+
43+
isMessageDataEqual = (
3344
nextState: CustomDataManagerState,
3445
previousState?: CustomDataManagerState,
35-
) => JSON.stringify(nextState.data) === JSON.stringify(previousState?.data);
46+
) => JSON.stringify(nextState.message) === JSON.stringify(previousState?.message);
3647

3748
initState = ({ message }: { message?: DraftMessage | LocalMessage } = {}) => {
3849
this.state.next(initState({ composer: this.composer, message }));
3950
};
4051

41-
setData(data: Partial<CustomMessageData>) {
52+
setMessageData(data: Partial<CustomMessageData>) {
53+
this.state.partialNext({
54+
message: {
55+
...this.state.getLatestValue().message,
56+
...data,
57+
},
58+
});
59+
}
60+
61+
setCustomData(data: Partial<CustomMessageComposerData>) {
4262
this.state.partialNext({
43-
data: {
44-
...this.state.getLatestValue().data,
63+
custom: {
64+
...this.state.getLatestValue().custom,
4565
...data,
4666
},
4767
});

src/messageComposer/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export * from './attachmentIdentity';
22
export * from './attachmentManager';
33
export * from './configuration';
4+
export * from './CustomDataManager';
45
export * from './fileUtils';
56
export * from './linkPreviewsManager';
67
export * from './messageComposer';

src/messageComposer/messageComposer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ export class MessageComposer {
511511
this.customDataManager.state.subscribe((nextValue, previousValue) => {
512512
if (
513513
typeof previousValue !== 'undefined' &&
514-
!this.customDataManager.isDataEqual(nextValue, previousValue)
514+
!this.customDataManager.isMessageDataEqual(nextValue, previousValue)
515515
) {
516516
this.logStateUpdateTimestamp();
517517
}

src/messageComposer/middleware/messageComposer/customData.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export const createCustomDataCompositionMiddleware = (composer: MessageComposer)
1111
input,
1212
nextHandler,
1313
}: MiddlewareHandlerParams<MessageComposerMiddlewareValueState>) => {
14-
const data = composer.customDataManager.data;
14+
const data = composer.customDataManager.customMessageData;
1515
if (!data) return nextHandler(input);
1616

1717
return nextHandler({
@@ -39,7 +39,7 @@ export const createDraftCustomDataCompositionMiddleware = (
3939
input,
4040
nextHandler,
4141
}: MiddlewareHandlerParams<MessageDraftComposerMiddlewareValueState>) => {
42-
const data = composer.customDataManager.data;
42+
const data = composer.customDataManager.customMessageData;
4343
if (!data) return nextHandler(input);
4444

4545
return nextHandler({

test/unit/MessageComposer/CustomDataManager.test.ts

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ describe('CustomDataManager', () => {
3333

3434
describe('constructor', () => {
3535
it('should initialize with empty data', () => {
36-
expect(customDataManager.data).toEqual({});
36+
expect(customDataManager.customMessageData).toEqual({});
3737
});
3838

3939
it('should initialize with message data if provided', () => {
@@ -56,19 +56,19 @@ describe('CustomDataManager', () => {
5656
message,
5757
});
5858

59-
expect(managerWithMessage.data).toEqual({});
59+
expect(managerWithMessage.customMessageData).toEqual({});
6060
});
6161
});
6262

6363
describe('initState', () => {
6464
it('should reset state to empty data', () => {
6565
// Set some data first
66-
customDataManager.setData({ test: 'value' });
67-
expect(customDataManager.data).toEqual({ test: 'value' });
66+
customDataManager.setMessageData({ test: 'value' });
67+
expect(customDataManager.customMessageData).toEqual({ test: 'value' });
6868

6969
// Reset state
7070
customDataManager.initState();
71-
expect(customDataManager.data).toEqual({});
71+
expect(customDataManager.customMessageData).toEqual({});
7272
});
7373

7474
it('should reset state with message data if provided', () => {
@@ -87,42 +87,45 @@ describe('CustomDataManager', () => {
8787
};
8888

8989
customDataManager.initState({ message });
90-
expect(customDataManager.data).toEqual({});
90+
expect(customDataManager.customMessageData).toEqual({});
9191
});
9292
});
9393

9494
describe('setCustomData', () => {
9595
it('should update data with new values', () => {
96-
customDataManager.setData({ field1: 'value1' });
97-
expect(customDataManager.data).toEqual({ field1: 'value1' });
96+
customDataManager.setMessageData({ field1: 'value1' });
97+
expect(customDataManager.customMessageData).toEqual({ field1: 'value1' });
9898

99-
customDataManager.setData({ field2: 'value2' });
100-
expect(customDataManager.data).toEqual({ field1: 'value1', field2: 'value2' });
99+
customDataManager.setMessageData({ field2: 'value2' });
100+
expect(customDataManager.customMessageData).toEqual({
101+
field1: 'value1',
102+
field2: 'value2',
103+
});
101104
});
102105

103106
it('should override existing values', () => {
104-
customDataManager.setData({ field1: 'value1' });
105-
customDataManager.setData({ field1: 'new-value' });
106-
expect(customDataManager.data).toEqual({ field1: 'new-value' });
107+
customDataManager.setMessageData({ field1: 'value1' });
108+
customDataManager.setMessageData({ field1: 'new-value' });
109+
expect(customDataManager.customMessageData).toEqual({ field1: 'new-value' });
107110
});
108111
});
109112

110113
describe('isDataEqual', () => {
111114
it('should return true for equal data', () => {
112-
const state1 = { data: { field1: 'value1' } };
113-
const state2 = { data: { field1: 'value1' } };
114-
expect(customDataManager.isDataEqual(state1, state2)).toBe(true);
115+
const state1 = { message: { field1: 'value1' } };
116+
const state2 = { message: { field1: 'value1' } };
117+
expect(customDataManager.isMessageDataEqual(state1, state2)).toBe(true);
115118
});
116119

117120
it('should return false for different data', () => {
118-
const state1 = { data: { field1: 'value1' } };
119-
const state2 = { data: { field1: 'value2' } };
120-
expect(customDataManager.isDataEqual(state1, state2)).toBe(false);
121+
const state1 = { message: { field1: 'value1' } };
122+
const state2 = { message: { field1: 'value2' } };
123+
expect(customDataManager.isMessageDataEqual(state1, state2)).toBe(false);
121124
});
122125

123126
it('should handle undefined previous state', () => {
124-
const state1 = { data: { field1: 'value1' } };
125-
expect(customDataManager.isDataEqual(state1, undefined)).toBe(false);
127+
const state1 = { message: { field1: 'value1' } };
128+
expect(customDataManager.isMessageDataEqual(state1, undefined)).toBe(false);
126129
});
127130
});
128131
});

test/unit/MessageComposer/middleware/messageComposer/customData.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ describe('Custom Data Middleware', () => {
2929
describe('createCustomDataCompositionMiddleware', () => {
3030
it('should initialize with custom data', async () => {
3131
const data = { key: 'value' };
32-
composer.customDataManager.setData(data);
32+
composer.customDataManager.setMessageData(data);
3333
const middleware = createCustomDataCompositionMiddleware(composer);
3434
const state: MessageComposerMiddlewareValueState = {
3535
message: { id: '1', type: 'regular' },
@@ -91,7 +91,7 @@ describe('Custom Data Middleware', () => {
9191
describe('createDraftCustomDataCompositionMiddleware', () => {
9292
it('should initialize with custom data', async () => {
9393
const data = { key: 'value' };
94-
composer.customDataManager.setData(data);
94+
composer.customDataManager.setMessageData(data);
9595
const middleware = createDraftCustomDataCompositionMiddleware(composer);
9696
const state: MessageDraftComposerMiddlewareValueState = {
9797
draft: {

0 commit comments

Comments
 (0)