customUrl handling fixes

This commit is contained in:
Nuwan 2025-01-28 17:18:58 +05:30
parent 867b159c63
commit 0ed89f4e38
5 changed files with 146 additions and 72 deletions

View File

@ -548,19 +548,22 @@
context.RecordingActions.audioRecordingFormatChanged(`.${audioFormat}`)
break;
case '3012': //customUrl
logger.log(`[asyncJamClient] 3012 CustomUrl: ${response['CustomUrl']}`);
const customUrl = response['CustomUrl']
//window.location.href = "http://www.jamkazam.local:3000/client#/createSession/custom~yes|privacy~2|description~hello|inviteeIds~27bd4a30-d1b8-4eea-8454-01a104d59381"
//window.location.href = "http://www.jamkazam.local:3000/client#/joinSession/custom~yes|joinSessionId~2"
window.location.href = customUrl
logger.log(`_DEBUG_ [asyncJamClient] 3012 CustomUrl: ${customUrl}`);
//if localStorage is available and has customUrl key, remove it
if(localStorage){
if(localStorage.getItem('customUrl')){
localStorage.removeItem('customUrl')
}
//now set the customUrl which received from backend
if(customUrl){
const httpUrl = window.location.protocol + '//' + customUrl;
localStorage.setItem('customUrl', httpUrl);
window.location.href = httpUrl;
}
}
break;
// case '3013': //JKJoinSessionFromCustomUrlEvent
// logger.log(`[asyncJamClient] 3013 JKJoinSessionFromCustomUrlEvent: ${response['JKJoinSessionFromCustomUrlEvent']['CustomUrl']}`);
// if(context.JK.FindSessionScreen){
// const customUrl = response['JKJoinSessionFromCustomUrlEvent']['CustomUrl']
// context.JK.SessionUtils.joinSessionFromCustomUrlScheme(customUrl)
// }
// break;
default:
break;
}

View File

@ -153,7 +153,7 @@
// refreshes the currently active tab
function renderActive() {
console.log("_DEBUG_ renderActive isAdmin: " + isAdmin + " isMember: " + isMember);
//console.log("_DEBUG_ renderActive isAdmin: " + isAdmin + " isMember: " + isMember);
if (isMember) {
$("#btn-follow-band").hide();
$("#btn-edit-band-profile").show();
@ -549,7 +549,7 @@
error: app.ajaxError
})
.done(function(response) {
console.log("_DEBUG_ determineMembership response: " + JSON.stringify(response));
//console.log("_DEBUG_ determineMembership response: " + JSON.stringify(response));
isAdmin = isMember = false;
$.each(response, function(index, val) {
if (val.id === context.JK.currentUserId) {

View File

@ -0,0 +1,114 @@
(function (context, $) {
"use strict";
context.JK = context.JK || {};
context.JK.CustomUrlHandler = function () {
var hashchangeEvent;
var loadEvent;
function handleCustomUrlScheme(customUrl) {
var maxAttempts = 20;
//TODO: show a notification while waiting for the screen to load
//extract the hash from the custom URL passed in
var url = new URL(customUrl);
var hash = url.hash;
if (hash) { // if the hash contains the custom yes flag
var screenLoadInterval = setInterval(() => {
//handle create session. #/createSession is a valid hash. switch to the createSession screen and handle creating a session from the custom URL
if (hash.includes("#/createSession")) { // if the hash contains the createSession flag
if (JK.createScheduledSessionScreen && JK.CreateScheduledSessionDataIsLoaded) { // if the createScheduledSessionScreen is loaded
JK.createScheduledSessionScreen.createSessionByCustomUrlScheme(hash); // this will create a session
clearInterval(screenLoadInterval);
} else {
console.log("attempting to create session. ", maxAttempts);
maxAttempts--;
if (maxAttempts <= 0) {
clearInterval(screenLoadInterval);
}
}
}
//handle join session. there is no joinSession screen. JK.SessionUtils is a helper class that handles joining a session
if (hash.includes("#/joinSession")) { // if the hash contains the joinSession flag
if (JK.SessionUtils) { // if the SessionUtils is loaded
JK.SessionUtils.joinSessionFromCustomUrlScheme(hash);
clearInterval(screenLoadInterval);
} else {
console.log("attempting to join session", maxAttempts);
maxAttempts--;
if (maxAttempts <= 0) {
clearInterval(screenLoadInterval);
}
}
}
}, 1000); // check every second
}
}
function getCustomUrl() {
//get customUrl from local storage
if (localStorage.getItem("customUrl")) {
try{
return decodeURIComponent(localStorage.getItem("customUrl"));
}
catch(e){
console.error("error decoding customUrl", e);
return null;
}
}
return null;
}
function handle() {
//clear the event listeners
if (hashchangeEvent) {
window.removeEventListener('hashchange', hashchangeEvent);
}
if (loadEvent) {
window.removeEventListener('load', loadEvent);
}
// check periodically if localStorage has customUrl available for 10 seconds
//if available call handleCustomUrlScheme and clear the interval and localStorage customUrl
var attempts = 5;
var customUrlInterval = setInterval(() => {
const customUrl = getCustomUrl();
if (customUrl) {
handleCustomUrlScheme(customUrl);
localStorage.removeItem("customUrl");
clearInterval(customUrlInterval);
}
if (attempts < 0) {
localStorage.removeItem("customUrl");
clearInterval(customUrlInterval);
}
attempts--;
}, 1000);
}
function initialize() {
hashchangeEvent = window.addEventListener('hashchange', function () {
handle();
});
loadEvent = window.addEventListener('load', (event) => {
handle();
});
}
return {
initialize: initialize,
};
};
})(window, jQuery);

View File

@ -315,8 +315,13 @@
$fetchingSpinner.show();
$fetchingSpinnerLabel.show();
Promise.all([fetchScheduledSessions(), fetchUserDetail()]).then(function() {
var p1 = fetchScheduledSessions();
var p2 = fetchUserDetail();
Promise.all([p1, p2]).then(function() {
context.JK.CreateScheduledSessionDataIsLoaded = true;
}).catch(function() {
context.JK.CreateScheduledSessionDataIsLoaded = false;
});
}
@ -1554,6 +1559,7 @@
//when a user submits create new session form (in the new react website)
//this custom url scheme is loaded and as a result the JamKazam app loads create session window.
function createSessionByCustomUrlScheme(hash){
var qStr = hash.substring(hash.lastIndexOf('/') + 1);
@ -1567,6 +1573,7 @@
if(qp[0] === 'description') description = qp[1]
if(qp[0] === 'inviteeIds') inviteeIds = qp[1]
})
if(isCustom !== 'yes'){
return;
}
@ -1593,7 +1600,6 @@
waitUntilSessionCreated().then(function(){
//now async send invitations
console.log('_DEBUG_ waitUntilSessionCreated createSessionSettings.newSessionId', createSessionSettings.newSessionId)
if(createSessionSettings.newSessionId && inviteeIds !== undefined){
var inviteUserIds = inviteeIds.split(',').filter(Boolean); //filter to remove empty strings
inviteUserIds.forEach(function(inviteId){
@ -1613,7 +1619,6 @@
})
}
}).catch(function(error){
console.log('Error while creating session', error);
logger.debug(error)
});
}

View File

@ -389,6 +389,10 @@
JK.app.initialRouting();
var customUrlHandler = new JK.CustomUrlHandler();
customUrlHandler.initialize();
JK.hideCurtain(300);
}
@ -418,6 +422,8 @@
JK.RecordingUtils.init();
// Initialize the app
JK.app.initialize();
// Let's get things rolling...
@ -449,62 +455,8 @@
});
window.addEventListener('hashchange', function() {
console.log("_DEBUG_ hashchange event", window.location.hash);
handleCustomUrlScheme();
});
window.addEventListener('load', (event) => {
console.log("_DEBUG_ load event", window.location.hash);
handleCustomUrlScheme();
});
function handleCustomUrlScheme(){
// this is a hack to create a session from a custom URL scheme
// an example custom URL would be: https://www.jamkazam.com/client#/createSession/custom~yes|privacy~2|description~hello|inviteeIds~1,2,3,4
var maxAttempts = 5;
//TODO: show a notification while waiting for the screen to load
var hash = decodeURIComponent(window.location.hash)
if(hash.includes("custom~yes")){ // if the hash contains the custom yes flag
var screenLoadInterval = setInterval(() => {
//handle create session. #/createSession is a valid hash. switch to the createSession screen and handle creating a session from the custom URL
if(hash.includes("#/createSession")){ // if the hash contains the createSession flag
if (JK.createScheduledSessionScreen && JK.CreateScheduledSessionDataIsLoaded) { // if the createScheduledSessionScreen is loaded
JK.createScheduledSessionScreen.createSessionByCustomUrlScheme(hash); // this will create a session
clearInterval(screenLoadInterval);
}else{
console.log("attempting to create session. ", maxAttempts);
maxAttempts--;
if(maxAttempts <= 0){
clearInterval(screenLoadInterval);
}
}
}
//handle join session. there is no joinSession screen. JK.SessionUtils is a helper class that handles joining a session
if(hash.includes("#/joinSession")){ // if the hash contains the joinSession flag
if (JK.SessionUtils) { // if the SessionUtils is loaded
JK.SessionUtils.joinSessionFromCustomUrlScheme(hash);
clearInterval(screenLoadInterval);
}else{
console.log("attempting to join session", maxAttempts);
maxAttempts--;
if(maxAttempts <= 0){
clearInterval(screenLoadInterval);
}
}
}
}, 1000); // check every second
}
window.onUnloaded = function() {
JK.JamServer.disconnect();
}
</script>