🩹(frontend) fix missing notification when state is clear

Notify iframe's parent while integrating Visio when state
is cleared. Requested by Eleonore.
This commit is contained in:
lebaudantoine
2025-04-03 23:26:01 +02:00
committed by aleb_the_flash
parent 66f307b7e8
commit 6324be9fd3
6 changed files with 32 additions and 13 deletions

View File

@@ -66,6 +66,7 @@ export const CreateMeetingButton = () => {
setRoom(undefined) setRoom(undefined)
setCallbackId(undefined) setCallbackId(undefined)
setIsPending(false) setIsPending(false)
popupManager.clearState()
} }
if (isPending) { if (isPending) {

View File

@@ -24,6 +24,21 @@ export class PopupManager {
} }
} }
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private messageParent(type: ClientMessageType, data: any) {
window?.parent.postMessage(
{
type: type,
data: data,
},
'*'
)
}
public clearState() {
this.messageParent(ClientMessageType.STATE_CLEAR, {})
}
public setupMessageListener( public setupMessageListener(
onCallbackId: (id: string) => void, onCallbackId: (id: string) => void,
onRoomData: (data: CallbackCreationRoomData) => void onRoomData: (data: CallbackCreationRoomData) => void
@@ -39,18 +54,12 @@ export class PopupManager {
case PopupMessageType.ROOM_DATA: case PopupMessageType.ROOM_DATA:
if (!data?.room) return if (!data?.room) return
onRoomData(data.room) onRoomData(data.room)
window?.parent.postMessage( this.messageParent(ClientMessageType.ROOM_CREATED, {
{ room: {
type: ClientMessageType.ROOM_CREATED, url: getRouteUrl('room', data.room.slug),
data: { ...data.room,
room: {
url: getRouteUrl('room', data.room.slug),
...data.room,
},
},
}, },
'*' })
)
return return
} }
} }

View File

@@ -4,6 +4,7 @@ export type CallbackCreationRoomData = {
export enum ClientMessageType { export enum ClientMessageType {
ROOM_CREATED = 'ROOM_CREATED', ROOM_CREATED = 'ROOM_CREATED',
STATE_CLEAR = 'STATE_CLEAR',
} }
export interface PopupMessageData { export interface PopupMessageData {

View File

@@ -21,7 +21,10 @@ function App() {
</div> </div>
<div className="group"> <div className="group">
<label>Visioconference</label> <label>Visioconference</label>
<VisioCreateButton onRoomCreated={(data) => setRoomUrl(data.url)} /> <VisioCreateButton
onRoomCreated={(data) => setRoomUrl(data.url)}
onClear={() => setRoomUrl("")}
/>
</div> </div>
<div className="group"> <div className="group">
<label>Description</label> <label>Description</label>

View File

@@ -4,6 +4,7 @@ export type ConfigType = typeof DEFAULT_CONFIG
export enum ClientMessageType { export enum ClientMessageType {
ROOM_CREATED = 'ROOM_CREATED', ROOM_CREATED = 'ROOM_CREATED',
STATE_CLEAR = 'STATE_CLEAR',
} }
export type RoomData = { export type RoomData = {

View File

@@ -4,10 +4,12 @@ import { DEFAULT_CONFIG } from '@/Config'
export const VisioCreateButton = ({ export const VisioCreateButton = ({
onRoomCreated, onRoomCreated,
onClear,
readOnly = false, readOnly = false,
slug, slug,
}: { }: {
onRoomCreated: (roomData: RoomData) => void onRoomCreated: (roomData: RoomData) => void
onClear: () => void
readOnly?: boolean readOnly?: boolean
slug?: string slug?: string
}) => { }) => {
@@ -20,13 +22,15 @@ export const VisioCreateButton = ({
const { type, data } = event.data const { type, data } = event.data
if (type == ClientMessageType.ROOM_CREATED && data?.room) { if (type == ClientMessageType.ROOM_CREATED && data?.room) {
onRoomCreated(data.room) onRoomCreated(data.room)
} else if (type == ClientMessageType.STATE_CLEAR) {
onClear()
} }
} }
window.addEventListener('message', onMessage) window.addEventListener('message', onMessage)
return () => { return () => {
window.removeEventListener('message', onMessage) window.removeEventListener('message', onMessage)
} }
}, [onRoomCreated]) }, [onRoomCreated, onClear])
return ( return (
// eslint-disable-next-line jsx-a11y/iframe-has-title // eslint-disable-next-line jsx-a11y/iframe-has-title