"use client"; import React from "react"; import { AudioPlayerProvider } from "../components/AudioPlayerContext"; import { NavidromeProvider, useNavidrome } from "../components/NavidromeContext"; import { NavidromeConfigProvider } from "../components/NavidromeConfigContext"; import { ThemeProvider } from "../components/ThemeProvider"; import { PostHogProvider } from "../components/PostHogProvider"; import { WhatsNewPopup } from "../components/WhatsNewPopup"; import Ihateserverside from "./ihateserverside"; import DynamicViewportTheme from "./DynamicViewportTheme"; import ThemeColorHandler from "./ThemeColorHandler"; import { useViewportThemeColor } from "@/hooks/use-viewport-theme-color"; import { LoginForm } from "./start-screen"; import Image from "next/image"; function NavidromeErrorBoundary({ children }: { children: React.ReactNode }) { const { error } = useNavidrome(); const [isClient, setIsClient] = React.useState(false); const [hasCompletedOnboarding, setHasCompletedOnboarding] = React.useState(true); // Default to true to prevent flash // Client-side hydration React.useEffect(() => { setIsClient(true); const onboardingStatus = localStorage.getItem('onboarding-completed'); setHasCompletedOnboarding(!!onboardingStatus); }, []); // Simple check: has config in localStorage or environment const hasAnyConfig = React.useMemo(() => { if (!isClient) return true; // Assume config exists during SSR to prevent flash // Check localStorage config const savedConfig = localStorage.getItem('navidrome-config'); if (savedConfig) { try { const config = JSON.parse(savedConfig); if (config.serverUrl && config.username && config.password) { return true; } } catch (e) { // Invalid config, continue to env check } } // Check environment variables (visible on client side with NEXT_PUBLIC_) if (process.env.NEXT_PUBLIC_NAVIDROME_URL && process.env.NEXT_PUBLIC_NAVIDROME_USERNAME && process.env.NEXT_PUBLIC_NAVIDROME_PASSWORD) { return true; } return false; }, [isClient]); // Don't show anything until client-side hydration is complete if (!isClient) { return <>{children}; } // Show start screen ONLY if: // 1. First-time user (no onboarding completed), OR // 2. User has completed onboarding BUT there's an error AND no config exists const shouldShowStartScreen = !hasCompletedOnboarding || (hasCompletedOnboarding && error && !hasAnyConfig); if (shouldShowStartScreen) { return (
Logo mice | navidrome client
); } return <>{children}; } export default function RootLayoutClient({ children }: { children: React.ReactNode }) { return ( {children} ); }