Framework7/Svelte : Back not working - router has correct URL but displays root page

Hi,

After searching the forum and reading other “BACK” router issues, I’m unable to get a fix on my routing problem.

The back button works fine when routing back through one level of navigation. e.g.

HOME → Developer [BACK] → HOME

However if I’m deeper than one level of navigation then the back button changes to URL to the previous page, but displays my root page component. e.g.

URL: HOME → Developer → Dev 2 [BACK] → Developer
Display: home → developer → dev2 [BACK] → home

The app is a PWA with a tabbed view.

routes.js

var routes = [
  
  {
    name: 'Home',
    path: '/',
    component: HomePage,
  },
  
  {
    name: "Roster",
    path: '/roster/',
    component: RosterPage,
  },
  {
    name: "Friends",
    path: '/friends/',
    component: FriendsPage,
  },
  {
    name: "My Profile",
    path: '/profile',
    component: ProfilePage,
  },
  {
    name: "Settings",
    path: '/settings',
    component: SettingsPage,
  },
  {
    name: 'Swap',
    path: '/swap',
    component: SwapPage,
  },
  {
    name: 'Today',
    path: '/today',
    component: TodayPage,
  },
  {
    name: 'Upgrade to Pro',
    path: '/upgrade',
    component: UpgradeToProPage,
  },
  {
    name: 'FAQs',
    path: '/faq',
    component: FAQPage,
  },
  {
    name: 'Privacy Policy',
    path: '/privacy',
    component: PrivacyPolicyPage,
  },
  {
    name: 'Contact Us',
    path: '/contact',
    component: ContactUsPage,
  },
  {
    name: 'Weather',
    path: '/weather',
    component: WeatherPage,
  },
  {
    name: 'Logbook',
    path: '/logbook',
    component: LogbookPage,
  },
  {
    name: 'Messages',
    path: '/messages',
    component: MessageListPage,
  },
  {
    name: 'Commuter',
    path: '/commuter',
    component: CommuterPage,
  },
  {
    name: 'Social Profile',
    path: '/profile/:rpStatus/:userID',
    async: async function({router, to, resolve}) {
      var app = router.app
      var userID = to.params.userID
      var otherProfiles;
      let oProfileUnsub = otherUserProfilesStore.subscribe(d => otherProfiles = d)

      let profileData = otherProfiles.find(i => i.name === userID)
      let rosterpopMember = to.params.rpStatus

      console.log("Rosterpop Member?", rosterpopMember, rosterpopMember === "1" ? true : false);
      
      resolve (
        {
        name: `User ${userID}`,
        component: SocialProfilePage,
        },
        {
          props: {
            profileData: profileData,
            isRosterpopMember: rosterpopMember === "1" ? true : false
          }
        },
        oProfileUnsub()
      )
    },
  },
  {
    path: '/more/:DutyDate/:type/:FltNum',
    async: async function ({ router, to, resolve }) {
      // App instance
      var app = router.app;
      // Show Preloader
      app.preloader.show();

      // User ID from request
      var dutyDate = dayjs(to.params.DutyDate);
      var dutyType = to.params.type;
      var flightID = to.params.FltNum;
      console.log(to.params);
      // Simulate Ajax Request
      let duty;
      let roster;

      let rosterUnsub = rosterStore.subscribe(i => roster = i)

      console.log(dayjs(dutyDate).format("YYYY-MM-DD"), dutyType, flightID);

      let typeArray = roster.events[dutyDate.format("YYYY-MM")][dutyDate.format("YYYY-MM-DD")].events.filter(e => e.type === dutyType)

      if (flightID !== "0") {
        duty = typeArray.find(f => f.flightNo === flightID)
      } else {
        duty = typeArray[0]
      }

      duty = {...duty, hasNightstop: roster.events[dutyDate.format("YYYY-MM")][dutyDate.format("YYYY-MM-DD")].events.find(e => e.type === "nightstop")}

      if(duty.hasNightstop) {
        let nightstopEndDate = dayjs(duty.hasNightstop.end2.date)
        console.log(roster.events, nightstopEndDate.format("YYYY-MM"),nightstopEndDate.format("YYYY-MM-DD"));

        let stop = false
        let nextFlight;
        Object.keys(roster.events[nightstopEndDate.format("YYYY-MM")]).forEach((key, index) => {
          if(!stop && dayjs(key).isAfter(nightstopEndDate)) {
            stop = true
            nextFlight = roster.events[nightstopEndDate.format("YYYY-MM")][key].events?.find(e => e.type === "flight" && e.fromAirport?.code === duty.hasNightstop.airport.code)
            console.log("*** NEXT FLIGHT AFTER NIGHTSTOP ***", nextFlight, key);
          } 
        })
        duty = {...duty, nextFlight: nextFlight}
      }


      console.log(typeArray, duty);
      let flight;
      let storedData = false;
      let noData = false;
      let inDataWindow = dayjs(duty.start).isBetween(dayjs().startOf('day').subtract(2, 'day'),dayjs().endOf('day').add(1, 'day'))
      let inFuture = dayjs(duty.start).isAfter(dayjs().endOf('day').add(1, 'day'))
      if (duty.type === "flight") {
        let obj = {
          flightNo: duty.flightNo,
          from: duty.fromAirport.code,
          to: duty.toAirport.code,
          startDate: dayjs(duty.start).format('YYYY-MM-DD'),
          endDate: dayjs(duty.start).format('YYYY-MM-DD'),
        }
        await AppManager.getFlightData(obj).then((res) => {
          console.log("HANDLING getFlightData Response");
          console.log("FETCH FROM DB:", res);
          flight = res
        }).catch((err) => {
          console.log("CATCH ACTIVE", err);
            let data;
            let fdStoreUnsub = flightDataStore.subscribe((d) => data = d)
            if (data && data.find(i => Object.values(i[`${obj.flightNo}-${obj.from}-${obj.startDate}-${obj.to}-${obj.endDate}`]))) {
              let dataObj = data.find(i => Object.values(i[`${obj.flightNo}-${obj.from}-${obj.startDate}-${obj.to}-${obj.endDate}`]))
              flight = Object.values(dataObj)[0]
              storedData = true
            } else {
              noData = true
            }
            fdStoreUnsub()
        })

        if (!flight && !storedData) {
          noData = true
        }
      }

      console.log("FLIGHT DATA",flight);
      // Hide Preloader
      if(duty) {
        // Resolve route to load page
        console.log("** RESOLVING WITH THE FOLLOWING DUTY **", duty);
        
        if (dutyType === "flight") {
        resolve(
          {
            name: `Trip ${flightID}`,
            component: MoreDetailTripPage,
          },
          {
            props: {
              duty: duty,
              flight: flight,
              storedData: storedData,
              noData: noData,
              withinDepartureWindow: inDataWindow,
              flightIsInFuture: inFuture
            }
          }
          );
        } else if (dutyType === "report") {
          resolve(
          {
            name: `REPORT`,
            component: MoreDetailReportPage,
          },
          {
            props: {
              duty: duty,
            }
          }
          );
        } else if (dutyType === "clear") {
          resolve(
          {
            name: `CLEAR`,
            component: MoreDetailClearPage,
          },
          {
            props: {
              duty: duty,
            }
          }
          );
        }
        // } else {
        //   console.log("-- NO PLAYER FOUND --")
        }
        app.preloader.hide();
        rosterUnsub()
    },
  },

  // DEVELOPER //
  {
    path: '/developer/',
    component: DeveloperDashboard,
    
  },
  {
    path: '/developer/serverFiles',
    component: DeveloperServerFilesPage
  },
  {
    path: '/developer/serverFiles/hotelInspector',
    component: DeveloperServerFilesHotelInspectorPage
  },
  {
    path: '/developer/pusher',
    component: DeveloperPusherPage
  },
  {
    path: '/developer/pusher/data',
    component: DeveloperPusherDataPage
  },
  {
    path: '/developer/storeUnwinder',
    component: DeveloperStoreUnwindPage
  },
  {
    path: '/developer/debugViewer',
    component: DeveloperDebugViewerPage
  },
  {
    path: '/developer/cookies',
    component: DeveloperCookieCheckerPage
  },
  {
    path: '/developer/fontStyles',
    component: DeveloperFontStylesPage
  },
  {
    path: '/developer/notificationStyles',
    component: DeveloperNotificationStylesPage
  },
  {
    path: '/developer/messagingLogin',
    component: DeveloperMessagingLoginPage
  },

  // THIS IS WHERE THE DOCUNET CHECK ATTEMPT IS HAPPENING
  {
    path: '/external/:DocuNetLink',
    async: async function ({ router, to, resolve }) {

      /// ROUTER CODE TO TRY AND OPEN DOCUNET ELSE ALERT
      try {
        const response = await fetch("docunet://");
        console.log("Docunet response", response);
        // redirect to docunet
      } catch {
        alert('Unable to open DocuNet link');
      }

    }
  },
  {
    path: '/noDocunetApp',
    component: NoDocunetAppPage,
  },
  {
    path: '(.*)',
    component: NotFoundPage,
  },
];

app.js views

<Views tabs class="safe-areas">
    <DevMenu />
    <Menu />
    <Login />
    <FreeVersionBlocker />
    <!-- Tabbar for switching views-tabs -->
    <Toolbar id="mainTabbar" tabbar icons bottom>
      <Link
        tabLink="#view-home"
        text="Home"
        tabLinkActive={activeTab === "home"}
        on:click={() => {
          f7.views.current.router.back("/");
          activeTab = "home";
        }}><i><Home05Icon /></i></Link
      >
      <Link
        tabLink="#view-roster"
        text="Roster"
        tabLinkActive={activeTab === "roster"}
        on:click={() => {
          f7.views.current.router.back("/roster/");
          activeTab = "roster";
        }}><i><Calendar03Icon /></i></Link
      >
      <Link
        tabLink="#view-friends"
        text="Friends"
        tabLinkActive={activeTab === "friends"}
        on:click={() => {
          f7.views.current.router.back("/friends/");
          activeTab = "friends";
        }}><i><UserGroupIcon /></i></Link
      >
      <Link
        tabLink="#view-swap"
        text="Swap"
        tabLinkActive={activeTab === "swap"}
        on:click={() => {
          f7.views.current.router.back("/swap");
          activeTab = "swap";
        }}><i><ShuffleIcon /></i></Link
      >
      <Link
        tabLink="#view-today"
        text="Today"
        tabLinkActive={activeTab === "today"}
        on:click={() => {
          f7.views.current.router.back("/today");
          activeTab = "today";
        }}
        ><svelte:component
          this={AppManager.getTodayTabIcon($todaysDutyStore.type)}
        /></Link
      >
    </Toolbar>
    <View id="view-home" main tab tabActive url="/" />
    <View id="view-roster" name="roster" tab url="/roster/" />
    <View id="view-friends" name="friends" tab url="/friends/" />
    <View id="view-swap" name="swap" tab url="/swap" />
    <View id="view-today" name="today" tab url="/today" />
  </Views>

I imagine I’ve got an error in how I’m navigating, as I occasionally get a router-transition-forward router-transition class sticking on my main view:

<div class="view view-main tab-active tab router-transition-forward router-transition" id="view-home">

This displays like: