Skip to content

Commit 23cdcc8

Browse files
Copilotd-gubert
andcommitted
Track rid in ActionManager and pass to modals via props
Co-authored-by: d-gubert <1810309+d-gubert@users.noreply.github.com>
1 parent c25436d commit 23cdcc8

File tree

3 files changed

+29
-16
lines changed

3 files changed

+29
-16
lines changed

apps/meteor/app/ui-message/client/ActionManager.ts

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,25 @@ export class ActionManager implements IActionManager {
2323

2424
protected events = new Emitter<{ busy: { busy: boolean }; [viewId: string]: any }>();
2525

26-
protected appIdByTriggerId = new Map<string, string | undefined>();
26+
protected triggerIdInfo = new Map<string, { appId: string | undefined; rid: string | undefined }>();
2727

2828
protected viewInstances = new Map<
2929
string,
3030
{
3131
payload?: {
3232
view: UiKit.ContextualBarView;
3333
};
34+
rid?: string;
3435
close: () => void;
3536
}
3637
>();
3738

3839
public constructor(protected router: ContextType<typeof RouterContext>) {}
3940

4041
protected invalidateTriggerId(id: string) {
41-
const appId = this.appIdByTriggerId.get(id);
42-
this.appIdByTriggerId.delete(id);
43-
return appId;
42+
const info = this.triggerIdInfo.get(id);
43+
this.triggerIdInfo.delete(id);
44+
return info;
4445
}
4546

4647
public on(viewId: string, listener: (data: any) => void): void;
@@ -67,15 +68,20 @@ export class ActionManager implements IActionManager {
6768
this.events.emit('busy', { busy: false });
6869
}
6970

70-
public generateTriggerId(appId: string | undefined) {
71+
public generateTriggerId(appId: string | undefined, rid?: string) {
7172
const triggerId = Random.id();
72-
this.appIdByTriggerId.set(triggerId, appId);
73+
this.triggerIdInfo.set(triggerId, { appId, rid });
7374
setTimeout(() => this.invalidateTriggerId(triggerId), ActionManager.TRIGGER_TIMEOUT);
7475
return triggerId;
7576
}
7677

7778
public async emitInteraction(appId: string, userInteraction: DistributiveOmit<UiKit.UserInteraction, 'triggerId'>) {
78-
const triggerId = this.generateTriggerId(appId);
79+
// Get rid from interaction, or fallback to the rid stored for the view
80+
let rid = 'rid' in userInteraction ? userInteraction.rid : undefined;
81+
if (!rid && 'viewId' in userInteraction && userInteraction.viewId) {
82+
rid = this.getRidByViewId(userInteraction.viewId);
83+
}
84+
const triggerId = this.generateTriggerId(appId, rid);
7985

8086
return this.runWithTimeout(
8187
async () => {
@@ -138,11 +144,13 @@ export class ActionManager implements IActionManager {
138144
public handleServerInteraction(interaction: UiKit.ServerInteraction): UiKit.ServerInteraction['type'] | undefined {
139145
const { triggerId } = interaction;
140146

141-
const appId = this.invalidateTriggerId(triggerId);
142-
if (!appId) {
147+
const triggerInfo = this.invalidateTriggerId(triggerId);
148+
if (!triggerInfo?.appId) {
143149
return;
144150
}
145151

152+
const { rid } = triggerInfo;
153+
146154
switch (interaction.type) {
147155
case 'errors': {
148156
const { type, triggerId, viewId, appId, errors } = interaction;
@@ -158,7 +166,7 @@ export class ActionManager implements IActionManager {
158166

159167
case 'modal.open': {
160168
const { view } = interaction;
161-
this.openModal(view);
169+
this.openModal(view, rid);
162170
break;
163171
}
164172

@@ -230,6 +238,10 @@ export class ActionManager implements IActionManager {
230238
return this.viewInstances.get(viewId)?.payload;
231239
}
232240

241+
public getRidByViewId(viewId: string) {
242+
return this.viewInstances.get(viewId)?.rid;
243+
}
244+
233245
public openView(surface: 'modal', view: UiKit.ModalView): void;
234246

235247
public openView(surface: 'banner', view: UiKit.BannerView): void;
@@ -252,16 +264,18 @@ export class ActionManager implements IActionManager {
252264
}
253265
}
254266

255-
private openModal(view: UiKit.ModalView) {
267+
private openModal(view: UiKit.ModalView, rid?: string) {
256268
const instance = imperativeModal.open({
257269
component: UiKitModal,
258270
props: {
259271
key: view.id,
260272
initialView: view,
273+
rid,
261274
},
262275
});
263276

264277
this.viewInstances.set(view.id, {
278+
rid,
265279
close: () => {
266280
instance.close();
267281
this.viewInstances.delete(view.id);

apps/meteor/client/views/modal/uikit/UiKitModal.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,23 @@ import { UiKitContext } from '@rocket.chat/fuselage-ui-kit';
33
import { MarkupInteractionContext } from '@rocket.chat/gazzodown';
44
import type * as UiKit from '@rocket.chat/ui-kit';
55
import type { FormEvent } from 'react';
6-
import { useContext } from 'react';
76

87
import ModalBlock from './ModalBlock';
98
import { detectEmoji } from '../../../lib/utils/detectEmoji';
109
import { preventSyntheticEvent } from '../../../lib/utils/preventSyntheticEvent';
1110
import { useModalContextValue } from '../../../uikit/hooks/useModalContextValue';
1211
import { useUiKitActionManager } from '../../../uikit/hooks/useUiKitActionManager';
1312
import { useUiKitView } from '../../../uikit/hooks/useUiKitView';
14-
import { RoomContext } from '../../room/contexts/RoomContext';
1513

1614
type UiKitModalProps = {
1715
key: UiKit.ModalView['id']; // force re-mount when viewId changes
1816
initialView: UiKit.ModalView;
17+
rid?: string;
1918
};
2019

21-
const UiKitModal = ({ initialView }: UiKitModalProps) => {
20+
const UiKitModal = ({ initialView, rid }: UiKitModalProps) => {
2221
const actionManager = useUiKitActionManager();
2322
const { view, errors, values, updateValues, state } = useUiKitView(initialView);
24-
const rid = useContext(RoomContext)?.rid;
2523
const contextValue = useModalContextValue({ view, errors, values, updateValues, rid });
2624

2725
const handleSubmit = useEffectEvent((e: FormEvent) => {

packages/ui-contexts/src/ActionManagerContext.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@ export interface IActionManager {
1212
off(eventName: 'busy', listener: ({ busy }: { busy: boolean }) => void): void;
1313
notifyBusy(): void;
1414
notifyIdle(): void;
15-
generateTriggerId(appId: string | undefined): string;
15+
generateTriggerId(appId: string | undefined, rid?: string): string;
1616
emitInteraction(appId: string, userInteraction: DistributiveOmit<UiKit.UserInteraction, 'triggerId'>): Promise<void>;
1717
handleServerInteraction(interaction: UiKit.ServerInteraction): UiKit.ServerInteraction['type'] | undefined;
1818
getInteractionPayloadByViewId(viewId: UiKit.ContextualBarView['id']):
1919
| {
2020
view: UiKit.ContextualBarView;
2121
}
2222
| undefined;
23+
getRidByViewId(viewId: string): string | undefined;
2324
openView(surface: 'modal', view: UiKit.ModalView): void;
2425
openView(surface: 'banner', view: UiKit.BannerView): void;
2526
openView(surface: 'contextual_bar', view: UiKit.ContextualBarView): void;

0 commit comments

Comments
 (0)