From 43fb316fd4af93742acc240a5b0f7d93b620ce36 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Mon, 15 Dec 2025 14:04:54 -0500 Subject: [PATCH] Cleaning up the code for this page. Separate out the Novi calls. --- src/routes/+layout.svelte | 2 +- .../(idaa)/video_conferences/+page.svelte | 315 ++++++++++-------- 2 files changed, 180 insertions(+), 137 deletions(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index c704cf40..219ccbe5 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -2,7 +2,7 @@ /** @type {import('./$types').LayoutData} */ // /** @type {import('./$types').LayoutProps} */ - let log_lvl: number = 1; + let log_lvl: number = 0; // *** Import Svelte specific // import { tick } from 'svelte'; diff --git a/src/routes/idaa/(idaa)/video_conferences/+page.svelte b/src/routes/idaa/(idaa)/video_conferences/+page.svelte index 0e1244b1..57bccd27 100644 --- a/src/routes/idaa/(idaa)/video_conferences/+page.svelte +++ b/src/routes/idaa/(idaa)/video_conferences/+page.svelte @@ -22,7 +22,7 @@ let jitsi_api: any = null; const jitsi_container_id = 'jitsi_meet_external_api_container'; - async function getJitsiJwt( + async function get_jitsi_jwt( display_name: string, email: string, is_moderator: boolean, @@ -75,132 +75,15 @@ } } - onMount(async () => { - console.log('Jitsi: onMount - starting initialization...'); - const url_params = data.params; - console.log('Jitsi: url_params:', url_params); - - // --- Start with fallback data from URL --- - user_id = url_params.uuid; // Novi Customer GUID - display_name = url_params.full_name ?? 'Guest'; // May be overridden after fetching from Novi API - email = (url_params.email ?? 'guest@example.com').replace(/\s+/g, '+'); // May be overridden after fetching from Novi API - room_name = url_params.room ?? 'Default-Room'; - domain = url_params.domain ?? 'jitsi.dgrzone.com'; - - console.log( - `Jitsi: From URL params for: user_id: ${user_id}, display_name: ${display_name}, email: ${email}, room_name: ${room_name}, domain: ${domain}` - ); - - if (!user_id) { - const container = document.getElementById(jitsi_container_id); - if (container) { - container.innerHTML = '

User ID (uuid) is missing. Cannot start meeting.

'; - } - console.error('Jitsi: User ID (uuid) is missing. Cannot start meeting.'); - return; - } - - // --- Fetch dynamic data from Novi API --- - const novi_api_root_url = $ae_loc.site_cfg_json?.novi_api_root_url; - const novi_api_key = $ae_loc.site_cfg_json?.novi_idaa_api_key; - - if (novi_api_root_url && novi_api_key) { - // Update user details from Novi - const member_details = await get_novi_member_details(user_id, novi_api_root_url, novi_api_key); - if (member_details.display_name) { - display_name = member_details.display_name; - console.log(`Jitsi: Updated display_name based on Novi: ${display_name}`); - } - if (member_details.email) { - email = member_details.email; - console.log(`Jitsi: Updated email based on Novi: ${email}`); - } - - // Check for moderator status - const novi_idaa_group_guid_li = $ae_loc.site_cfg_json?.novi_idaa_group_guid_li ?? []; - const moderatorIdSet = await get_novi_group_moderators( - novi_idaa_group_guid_li, - novi_api_root_url, - novi_api_key - ); - - const normalizedUserId = String(user_id ?? '').toLowerCase().trim(); - console.log( - `Jitsi: Moderator IDs (${moderatorIdSet.size}) sample:`, - Array.from(moderatorIdSet).slice(0, 10) - ); - - if (normalizedUserId && moderatorIdSet.has(normalizedUserId)) { - is_moderator = true; - console.log(`Jitsi: User ${user_id} is a moderator.`); - } else { - console.log(`Jitsi: User ${user_id} is not a moderator.`); - } - } else { - console.warn( - 'Jitsi: Novi API URL or Key is not configured. Skipping user details fetch and moderator check.' - ); - } - - // --- Initialize Jitsi --- - let jwt_token = null; - console.log(`Jitsi: User is_moderator: ${is_moderator}`); - if (is_moderator) { - console.log('Jitsi: Attempting to get JWT token for moderator...'); - jwt_token = await getJitsiJwt(display_name, email, is_moderator, room_name, user_id); - if (!jwt_token) { - const container = document.getElementById(jitsi_container_id); - if (container) { - container.innerHTML = '

Authentication Failed. Please try again.

'; - } - console.error('Jitsi: Authentication failed. JWT token not received.'); - return; - } - console.log('Jitsi: Successfully received JWT token.'); - } else { - console.log('Jitsi: User is not a moderator, proceeding without JWT token.'); - } - - const disabled_sounds = [ - url_params.incoming_msg_sound === 'true' ? 'INCOMING_MSG_SOUND' : null, - url_params.participant_joined_sound === 'true' ? 'PARTICIPANT_JOINED_SOUND' : null, - url_params.participant_left_sound === 'true' ? 'PARTICIPANT_LEFT_SOUND' : null, - url_params.reaction_sound === 'true' ? 'REACTION_SOUND' : null, - url_params.raise_hand_sound === 'true' ? 'RAISE_HAND_SOUND' : null - ].filter((sound) => sound); - - console.log('Jitsi: Jitsi options being set up...'); - const options = { - roomName: room_name, - width: '100%', - height: '100%', - parentNode: document.getElementById(jitsi_container_id), - userInfo: { displayName: display_name, email: email }, - configOverwrite: { - prejoinPageEnabled: false, - startWithAudioMuted: true, - startWithVideoMuted: true, - enableLobby: is_moderator, - disableReactionsModeration: false, - disabledSounds: disabled_sounds - }, - interfaceConfigOverwrite: { - DISABLE_JOIN_LEAVE_NOTIFICATIONS: true, - NOTIFICATION_SOUND_URL: '' - }, - jwt: jwt_token - }; - console.log('Jitsi: Jitsi options:', options); - - console.log('Jitsi: Initializing JitsiMeetExternalAPI...'); - // @ts-ignore - jitsi_api = new JitsiMeetExternalAPI(domain, options); - console.log('Jitsi: JitsiMeetExternalAPI initialized:', jitsi_api); + onMount(() => { + init_jitsi(); }); onDestroy(() => { if (jitsi_api) { + console.log('Jitsi: Disposing of Jitsi API instance on component destroy.'); jitsi_api.dispose(); + jitsi_api = null; } }); @@ -320,10 +203,126 @@ return modIdSet; } + /** + * Initializes or re-initializes the Jitsi meeting. + * This function handles fetching user/moderator data, getting JWTs, and configuring/loading the Jitsi external API. + * If an existing Jitsi instance is present, it will be disposed of before creating a new one. + */ + async function init_jitsi() { + // Dispose of any existing Jitsi instance to allow for a clean restart + if (jitsi_api) { + console.log('Jitsi: Disposing of existing Jitsi API instance before re-initialization.'); + jitsi_api.dispose(); + jitsi_api = null; + } - // Move the code from onMount to here so that it can be called multiple times. There will be a reset/restart button later. The users should also be able to change a few setting that may require a re-init. - function init_jitsi() { - // Placeholder for code from onMount + console.log('Jitsi: Starting initialization...'); + const url_params = data.params; + console.log('Jitsi: url_params:', url_params); + + // --- Start with fallback data from URL --- + user_id = url_params.uuid; // Novi Customer GUID + display_name = url_params.full_name ?? 'Guest'; // May be overridden + email = (url_params.email ?? 'guest@example.com').replace(/\s+/g, '+'); // May be overridden + room_name = url_params.room ?? 'Default-Room'; + domain = url_params.domain ?? 'jitsi.dgrzone.com'; + + console.log( + `Jitsi: Initial data: user_id: ${user_id}, display_name: ${display_name}, email: ${email}, room_name: ${room_name}, domain: ${domain}` + ); + + if (!user_id) { + const container = document.getElementById(jitsi_container_id); + if (container) { + container.innerHTML = '

User ID (uuid) is missing. Cannot start meeting.

'; + } + console.error('Jitsi: User ID (uuid) is missing. Cannot start meeting.'); + return; + } + + // --- Fetch dynamic data from Novi API --- + const novi_api_root_url = $ae_loc.site_cfg_json?.novi_api_root_url; + const novi_api_key = $ae_loc.site_cfg_json?.novi_idaa_api_key; + + if (novi_api_root_url && novi_api_key) { + const member_details = await get_novi_member_details(user_id, novi_api_root_url, novi_api_key); + if (member_details.display_name) { + display_name = member_details.display_name; + console.log(`Jitsi: Updated display_name from Novi: ${display_name}`); + } + if (member_details.email) { + email = member_details.email; + console.log(`Jitsi: Updated email from Novi: ${email}`); + } + + const novi_idaa_group_guid_li = $ae_loc.site_cfg_json?.novi_idaa_group_guid_li ?? []; + const moderatorIdSet = await get_novi_group_moderators( + novi_idaa_group_guid_li, + novi_api_root_url, + novi_api_key + ); + const normalizedUserId = String(user_id ?? '').toLowerCase().trim(); + + if (normalizedUserId && moderatorIdSet.has(normalizedUserId)) { + is_moderator = true; + console.log(`Jitsi: User ${user_id} is a moderator.`); + } else { + is_moderator = false; // Explicitly set to false if not in the set + console.log(`Jitsi: User ${user_id} is not a moderator.`); + } + } else { + console.warn('Jitsi: Novi API not configured. Skipping user details/moderator check.'); + } + + // --- Initialize Jitsi --- + let jwt_token = null; + if (is_moderator) { + console.log('Jitsi: Attempting to get JWT for moderator...'); + jwt_token = await get_jitsi_jwt(display_name, email, is_moderator, room_name, user_id); + if (!jwt_token) { + const container = document.getElementById(jitsi_container_id); + if (container) container.innerHTML = '

Authentication Failed. Please try again.

'; + console.error('Jitsi: Authentication failed. JWT not received.'); + return; + } + console.log('Jitsi: Successfully received JWT.'); + } else { + console.log('Jitsi: Not a moderator, proceeding without JWT.'); + } + + const disabled_sounds = [ + url_params.incoming_msg_sound === 'true' ? 'INCOMING_MSG_SOUND' : null, + url_params.participant_joined_sound === 'true' ? 'PARTICIPANT_JOINED_SOUND' : null, + url_params.participant_left_sound === 'true' ? 'PARTICIPANT_LEFT_SOUND' : null, + url_params.reaction_sound === 'true' ? 'REACTION_SOUND' : null, + url_params.raise_hand_sound === 'true' ? 'RAISE_HAND_SOUND' : null + ].filter((sound) => sound); + + const options = { + roomName: room_name, + width: '100%', + height: '100%', + parentNode: document.getElementById(jitsi_container_id), + userInfo: { displayName: display_name, email: email }, + configOverwrite: { + prejoinPageEnabled: false, + startWithAudioMuted: true, + startWithVideoMuted: true, + enableLobby: is_moderator, + disableReactionsModeration: false, + disabledSounds: disabled_sounds + }, + interfaceConfigOverwrite: { + DISABLE_JOIN_LEAVE_NOTIFICATIONS: true, + NOTIFICATION_SOUND_URL: '' + }, + jwt: jwt_token + }; + + console.log('Jitsi: Initializing JitsiMeetExternalAPI with options:', options); + // @ts-ignore + jitsi_api = new JitsiMeetExternalAPI(domain, options); + console.log('Jitsi: JitsiMeetExternalAPI initialized:', jitsi_api); } @@ -337,23 +336,67 @@ {/if} {#if show_jitsi_tools} -
-

Jitsi Tools

+
+

Jitsi Tools and Settings

+
    {#if display_name && email} -

    {display_name} ({email})

    +
  • {display_name} ({email})
  • {/if} -

    Room: {room_name}

    -

    Domain: {domain}

    -

    User ID: {user_id}

    -

    Moderator: {is_moderator ? 'Yes' : 'No'}

    +
  • Room: {room_name}
  • +
  • Domain: {domain}
  • +
  • User ID: {user_id}
  • +
  • Moderator: {is_moderator ? 'Yes' : 'No'}
  • +
+ + +
+ Jitsi Sound Settings: + + + + + + + + +
+ + + + > + Re-sync Novi Data +
{/if}