diff --git a/packages/client/src/components/ClientApp.svelte b/packages/client/src/components/ClientApp.svelte index 1259367791..0f25f84f1d 100644 --- a/packages/client/src/components/ClientApp.svelte +++ b/packages/client/src/components/ClientApp.svelte @@ -47,23 +47,19 @@ // Handle no matching route $: { if (dataLoaded && $routeStore.routerLoaded && !$routeStore.activeRoute) { - if ($authStore) { - // There is a logged in user, so handle them - if ($screenStore.screens.length) { - // Find the best route to push the user to initially - const route = getBestRoute( - $authStore, - $screenStore.screens, - $devToolsStore.role - ) - permissionError = false - routeStore.actions.navigate(route) - } else { - // No screens likely means the user has no permissions to view this app - permissionError = true - } + if ($screenStore.screens.length) { + // If we have some available screens, find the best route to push the + // user to initially + const route = getBestRoute($screenStore.screens) + permissionError = false + routeStore.actions.navigate(route) + } else if ($authStore) { + // If the user is logged in but has no screens, they don't have + // permission to use the app + permissionError = true } else { - // The user is not logged in, redirect them to login + // If they have no screens and are not logged in, it probably means + // they should log in to gain access const returnUrl = `${window.location.pathname}${window.location.hash}` CookieUtils.setCookie(Constants.Cookies.ReturnUrl, returnUrl) window.location = "/builder/auth/login" @@ -71,20 +67,27 @@ } } - const getBestRoute = (user, screens) => { - // Rank all screens, preferring all home screens - const rankScreen = screen => { - const roleId = screen.routing.roleId - let rank = RoleUtils.getRolePriority(roleId) - if (screen.routing.homeScreen) { - rank += 100 - } - return rank + // Assigns a rank to a potential screen route, preferring home screens + // and higher roles + const rankScreen = screen => { + const roleId = screen.routing.roleId + let rank = RoleUtils.getRolePriority(roleId) + if (screen.routing.homeScreen) { + rank += 100 } + return rank + } + + // Determines the best route to push the user to initially from a set of + // available screens + const getBestRoute = screens => { + // Enrich and rank all screens, preferring all home screens const enrichedScreens = screens?.map(screen => ({ ...screen, rank: rankScreen(screen), })) + + // Sort ranked screens const rankedScreens = enrichedScreens?.sort((a, b) => { // First sort by rank if (a.rank !== b.rank) {