fix: conditional imports

This commit is contained in:
veganbeef 2025-07-17 14:29:24 -07:00
parent 2edd1bd2ae
commit d9c74f163b
No known key found for this signature in database
4 changed files with 58 additions and 28 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "@neynar/create-farcaster-mini-app", "name": "@neynar/create-farcaster-mini-app",
"version": "1.7.8", "version": "1.7.9",
"type": "module", "type": "module",
"private": false, "private": false,
"access": "public", "access": "public",

View File

@ -22,8 +22,9 @@ export default async function RootLayout({
let session = null; let session = null;
if (shouldUseSession) { if (shouldUseSession) {
try { try {
const { getSession } = await import('~/auth'); // @ts-ignore - auth module may not exist in all template variants
session = await getSession(); const authModule = eval('require("~/auth")');
session = await authModule.getSession();
} catch (error) { } catch (error) {
console.warn('Failed to get session:', error); console.warn('Failed to get session:', error);
} }

View File

@ -1,12 +1,9 @@
'use client'; 'use client';
import dynamic from 'next/dynamic'; import dynamic from 'next/dynamic';
import type { Session } from 'next-auth';
import { SessionProvider } from 'next-auth/react';
import { MiniAppProvider } from '@neynar/react'; import { MiniAppProvider } from '@neynar/react';
import { SafeFarcasterSolanaProvider } from '~/components/providers/SafeFarcasterSolanaProvider'; import { SafeFarcasterSolanaProvider } from '~/components/providers/SafeFarcasterSolanaProvider';
import { ANALYTICS_ENABLED } from '~/lib/constants'; import { ANALYTICS_ENABLED } from '~/lib/constants';
import { AuthKitProvider } from '@farcaster/auth-kit';
const WagmiProvider = dynamic( const WagmiProvider = dynamic(
() => import('~/components/providers/WagmiProvider'), () => import('~/components/providers/WagmiProvider'),
@ -15,12 +12,14 @@ const WagmiProvider = dynamic(
} }
); );
export function Providers({ export function Providers({
session, session,
children, children,
shouldUseSession = false, shouldUseSession = false,
}: { }: {
session: Session | null; session: any | null;
children: React.ReactNode; children: React.ReactNode;
shouldUseSession?: boolean; shouldUseSession?: boolean;
}) { }) {
@ -29,19 +28,41 @@ export function Providers({
// Only wrap with SessionProvider if next auth is used // Only wrap with SessionProvider if next auth is used
if (shouldUseSession) { if (shouldUseSession) {
// Dynamic import for auth components - will work if modules exist, fallback if not
const AuthWrapper = dynamic(
() => {
return Promise.resolve().then(() => {
// Use eval to avoid build-time module resolution
try {
// @ts-ignore - These modules may not exist in all template variants
const nextAuth = eval('require("next-auth/react")');
const authKit = eval('require("@farcaster/auth-kit")');
return ({ children }: { children: React.ReactNode }) => (
<nextAuth.SessionProvider session={session}>
<authKit.AuthKitProvider config={{}}>{children}</authKit.AuthKitProvider>
</nextAuth.SessionProvider>
);
} catch (error) {
// Fallback component when auth modules aren't available
return ({ children }: { children: React.ReactNode }) => <>{children}</>;
}
});
},
{ ssr: false }
);
return ( return (
<SessionProvider session={session}> <WagmiProvider>
<WagmiProvider> <MiniAppProvider
<MiniAppProvider analyticsEnabled={ANALYTICS_ENABLED}
analyticsEnabled={ANALYTICS_ENABLED} backButtonEnabled={true}
backButtonEnabled={true} >
> <SafeFarcasterSolanaProvider endpoint={solanaEndpoint}>
<SafeFarcasterSolanaProvider endpoint={solanaEndpoint}> <AuthWrapper>{children}</AuthWrapper>
<AuthKitProvider config={{}}>{children}</AuthKitProvider> </SafeFarcasterSolanaProvider>
</SafeFarcasterSolanaProvider> </MiniAppProvider>
</MiniAppProvider> </WagmiProvider>
</WagmiProvider>
</SessionProvider>
); );
} }
@ -53,7 +74,7 @@ export function Providers({
backButtonEnabled={true} backButtonEnabled={true}
> >
<SafeFarcasterSolanaProvider endpoint={solanaEndpoint}> <SafeFarcasterSolanaProvider endpoint={solanaEndpoint}>
<AuthKitProvider config={{}}>{children}</AuthKitProvider> {children}
</SafeFarcasterSolanaProvider> </SafeFarcasterSolanaProvider>
</MiniAppProvider> </MiniAppProvider>
</WagmiProvider> </WagmiProvider>

View File

@ -1,5 +1,6 @@
'use client'; 'use client';
import dynamic from 'next/dynamic';
import { useCallback, useState, type ComponentType } from 'react'; import { useCallback, useState, type ComponentType } from 'react';
import { useMiniApp } from '@neynar/react'; import { useMiniApp } from '@neynar/react';
import { ShareButton } from '../Share'; import { ShareButton } from '../Share';
@ -9,14 +10,21 @@ import { type Haptics } from '@farcaster/miniapp-sdk';
import { APP_URL } from '~/lib/constants'; import { APP_URL } from '~/lib/constants';
// Optional import for NeynarAuthButton - may not exist in all templates // Optional import for NeynarAuthButton - may not exist in all templates
let NeynarAuthButton: ComponentType | null = null; const NeynarAuthButton = dynamic(
try { () => {
const module = require('../NeynarAuthButton/index'); return Promise.resolve().then(() => {
NeynarAuthButton = module.NeynarAuthButton; try {
} catch (error) { // @ts-ignore - NeynarAuthButton may not exist in all template variants
// Component doesn't exist, that's okay const module = eval('require("../NeynarAuthButton/index")');
console.log('NeynarAuthButton not available in this template'); return module.default || module.NeynarAuthButton;
} } catch (error) {
// Return null component when module doesn't exist
return () => null;
}
});
},
{ ssr: false }
);
/** /**