···4646 (v) =>
4747 !v.path.startsWith("/media") && // cannot be a player link
4848 location.pathname !== v.path && // cannot be current link
4949- !v.path.startsWith("/s/"), // cannot be a quick search link
4949+ !v.path.startsWith("/s/") && // cannot be a quick search link
5050+ !v.path.startsWith("/onboarding"), // cannot be an onboarding link
5051 );
5152 return route?.path ?? "/";
5253 }, [routes, location]);
···11+import { isExtensionActive } from "@/backend/extension/messaging";
22+import { conf } from "@/setup/config";
33+import { useAuthStore } from "@/stores/auth";
44+import { useOnboardingStore } from "@/stores/onboarding";
55+66+export async function needsOnboarding(): Promise<boolean> {
77+ // if onboarding is dislabed, no onboarding needed
88+ if (!conf().HAS_ONBOARDING) return false;
99+1010+ // if extension is active and working, no onboarding needed
1111+ const extensionActive = await isExtensionActive();
1212+ if (extensionActive) return false;
1313+1414+ // if there is any custom proxy urls, no onboarding needed
1515+ const proxyUrls = useAuthStore.getState().proxySet;
1616+ if (proxyUrls) return false;
1717+1818+ // if onboarding has been skipped, no onboarding needed
1919+ const skipped = useOnboardingStore.getState().skipped;
2020+ if (skipped) return false;
2121+2222+ return true;
2323+}