mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-11-09 16:50:28 +03:00
remove iframe from RoomView as it isn't needed there (since you cant have persistence that way)
This commit is contained in:
parent
ca7691ddc5
commit
f39a262eb5
1 changed files with 10 additions and 124 deletions
|
|
@ -26,6 +26,8 @@ import { useSetting } from '../../state/hooks/settings';
|
||||||
import { useAccessibleTagColors, usePowerLevelTags } from '../../hooks/usePowerLevelTags';
|
import { useAccessibleTagColors, usePowerLevelTags } from '../../hooks/usePowerLevelTags';
|
||||||
import { useTheme } from '../../hooks/useTheme';
|
import { useTheme } from '../../hooks/useTheme';
|
||||||
import { createVirtualWidget, Edget, getWidgetData, getWidgetUrl } from './SmallWidget';
|
import { createVirtualWidget, Edget, getWidgetData, getWidgetUrl } from './SmallWidget';
|
||||||
|
import { PersistentCallContainer } from '../../pages/call/PersistentCallContainer';
|
||||||
|
import { CallActivationEffect } from '../../pages/call/CallActivation';
|
||||||
|
|
||||||
// --- Constants ---
|
// --- Constants ---
|
||||||
const FN_KEYS_REGEX = /^F\d+$/;
|
const FN_KEYS_REGEX = /^F\d+$/;
|
||||||
|
|
@ -77,9 +79,6 @@ export function RoomView({ room, eventId }: { room: Room; eventId?: string }) {
|
||||||
// Refs
|
// Refs
|
||||||
const roomInputRef = useRef<HTMLDivElement>(null);
|
const roomInputRef = useRef<HTMLDivElement>(null);
|
||||||
const roomViewRef = useRef<HTMLDivElement>(null); // Ref for the main Page container
|
const roomViewRef = useRef<HTMLDivElement>(null); // Ref for the main Page container
|
||||||
const iframeRef = useRef<HTMLIFrameElement>(null); // Ref for the iframe element
|
|
||||||
const widgetApiRef = useRef<ClientWidgetApi | null>(null); // Ref to store the widget API instance
|
|
||||||
const edgetRef = useRef<Edget | null>(null); // Ref to store the Edget instance
|
|
||||||
|
|
||||||
// State & Hooks
|
// State & Hooks
|
||||||
const [hideActivity] = useSetting(settingsAtom, 'hideActivity');
|
const [hideActivity] = useSetting(settingsAtom, 'hideActivity');
|
||||||
|
|
@ -123,136 +122,23 @@ export function RoomView({ room, eventId }: { room: Room; eventId?: string }) {
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
// Effect to setup and cleanup the widget API for call rooms
|
|
||||||
useEffect(() => {
|
|
||||||
// Only run if it's a call room
|
|
||||||
if (isCall) {
|
|
||||||
const iframeElement = iframeRef.current;
|
|
||||||
// Ensure iframe element exists before proceeding
|
|
||||||
if (!iframeElement) {
|
|
||||||
logger.warn(`Iframe element not found for room ${roomId}, cannot initialize widget.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info(`Setting up Element Call widget for room ${roomId}`);
|
|
||||||
const userId = mx.getUserId() ?? ''; // Ensure userId is not null
|
|
||||||
const url = getWidgetUrl(mx, roomId); // Generate the widget URL
|
|
||||||
|
|
||||||
// 1. Create the virtual widget definition
|
|
||||||
const app = createVirtualWidget(
|
|
||||||
mx,
|
|
||||||
`element-call-${roomId}`,
|
|
||||||
userId,
|
|
||||||
'Element Call',
|
|
||||||
'm.call', // Widget type
|
|
||||||
url,
|
|
||||||
false, // waitForIframeLoad - false as we manually control src loading
|
|
||||||
getWidgetData(
|
|
||||||
// Widget data
|
|
||||||
mx,
|
|
||||||
roomId,
|
|
||||||
{}, // Initial data (can be fetched if needed)
|
|
||||||
{
|
|
||||||
// Overwrite/specific data
|
|
||||||
skipLobby: true, // Example configuration
|
|
||||||
preload: false, // Set preload based on whether you want background loading
|
|
||||||
returnToLobby: false, // Example configuration
|
|
||||||
}
|
|
||||||
),
|
|
||||||
roomId
|
|
||||||
);
|
|
||||||
|
|
||||||
// 2. Instantiate Edget to manage widget communication
|
|
||||||
const edget = new Edget(app);
|
|
||||||
edgetRef.current = edget; // Store instance in ref
|
|
||||||
|
|
||||||
// 3. Start the widget messaging *before* setting the iframe src
|
|
||||||
try {
|
|
||||||
const widgetApi = edget.startMessaging(iframeElement);
|
|
||||||
widgetApiRef.current = widgetApi; // Store API instance
|
|
||||||
|
|
||||||
// Listen for the 'ready' event from the widget API
|
|
||||||
widgetApi.once('ready', () => {
|
|
||||||
logger.info(`Element Call widget is ready for room ${roomId}.`);
|
|
||||||
// Perform actions needed once the widget confirms it's ready
|
|
||||||
// Example: widgetApi.transport.send("action", { data: "..." });
|
|
||||||
});
|
|
||||||
|
|
||||||
widgetApi.on('action:im.vector.hangup', () => {
|
|
||||||
logger.info(`Received hangup action from widget in room ${roomId}.`);
|
|
||||||
// Handle hangup logic (e.g., navigate away, update room state)
|
|
||||||
});
|
|
||||||
|
|
||||||
// Add other necessary event listeners from the widget API
|
|
||||||
// widgetApi.on("action:some_other_action", (ev) => { ... });
|
|
||||||
|
|
||||||
// 4. Set the iframe src *after* messaging is initialized
|
|
||||||
logger.info(`Setting iframe src for room ${roomId}: ${url.toString()}`);
|
|
||||||
iframeElement.src = url.toString();
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(`Error initializing widget messaging for room ${roomId}:`, error);
|
|
||||||
// Handle initialization error (e.g., show an error message to the user)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 5. Return cleanup function
|
|
||||||
return () => {
|
|
||||||
logger.info(`Cleaning up Element Call widget for room ${roomId}`);
|
|
||||||
// Stop messaging and clean up resources
|
|
||||||
if (edgetRef.current) {
|
|
||||||
edgetRef.current.stopMessaging();
|
|
||||||
edgetRef.current = null;
|
|
||||||
}
|
|
||||||
widgetApiRef.current = null; // Clear API ref
|
|
||||||
|
|
||||||
// Clear iframe src to stop activity and free resources
|
|
||||||
if (iframeRef.current) {
|
|
||||||
iframeRef.current.src = 'about:blank';
|
|
||||||
logger.info(`Cleared iframe src for room ${roomId}`);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
// If not a call room, ensure any previous call state is cleaned up
|
|
||||||
// (This might be redundant if component unmounts/remounts correctly, but safe)
|
|
||||||
if (widgetApiRef.current && iframeRef.current) {
|
|
||||||
logger.info(`Room ${roomId} is no longer a call room, ensuring cleanup.`);
|
|
||||||
if (edgetRef.current) {
|
|
||||||
edgetRef.current.stopMessaging();
|
|
||||||
edgetRef.current = null;
|
|
||||||
}
|
|
||||||
widgetApiRef.current = null;
|
|
||||||
iframeRef.current.src = 'about:blank';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Explicitly return undefined if not a call room or no cleanup needed initially
|
|
||||||
return undefined;
|
|
||||||
}, [isCall, mx, roomId, editor]); // Dependencies: run effect if these change
|
|
||||||
|
|
||||||
// --- Render Logic ---
|
// --- Render Logic ---
|
||||||
|
|
||||||
// Render Call View
|
// Render Call View
|
||||||
if (isCall) {
|
if (isCall) {
|
||||||
// Initial src is set to about:blank. The useEffect hook will set the actual src later.
|
|
||||||
return (
|
return (
|
||||||
<Page
|
<Page
|
||||||
ref={roomViewRef}
|
ref={roomViewRef}
|
||||||
style={{ display: 'flex', flexDirection: 'column', height: '100%', overflow: 'hidden' }}
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
height: '100%',
|
||||||
|
width: '0%',
|
||||||
|
overflow: 'hidden',
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<RoomViewHeader />
|
<RoomViewHeader />
|
||||||
{/* Box grows to fill available space */}
|
<CallActivationEffect />
|
||||||
<Box grow="Yes" style={{ flex: 1, overflow: 'hidden', minHeight: 0 }}>
|
|
||||||
<iframe
|
|
||||||
ref={iframeRef}
|
|
||||||
src="about:blank" // Start with a blank page
|
|
||||||
style={{ width: '100%', height: '100%', border: 'none', display: 'block' }}
|
|
||||||
title={`Element Call - ${room.name || roomId}`}
|
|
||||||
// Sandbox attributes for security. Adjust as needed by Element Call.
|
|
||||||
//sandbox="allow-forms allow-scripts allow-same-origin allow-popups allow-modals allow-downloads"
|
|
||||||
// Permissions policy for features like camera, microphone.
|
|
||||||
allow="microphone; camera; display-capture; autoplay; clipboard-write;"
|
|
||||||
/>
|
|
||||||
</Box>
|
|
||||||
{/* Optional: Minimal footer or status indicators */}
|
|
||||||
</Page>
|
</Page>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue