diff --git a/apps/next/app/(generated)/page.tsx b/apps/next/app/(generated)/page.tsx index 726b835e..d2da6ae5 100644 --- a/apps/next/app/(generated)/page.tsx +++ b/apps/next/app/(generated)/page.tsx @@ -1,2 +1 @@ -'use client' export { default, dynamic } from 'app/routes/index' diff --git a/features/app-core/routes/bio/index.tsx b/features/app-core/routes/bio/index.tsx index 648ddbea..2aa3d432 100644 --- a/features/app-core/routes/bio/index.tsx +++ b/features/app-core/routes/bio/index.tsx @@ -5,8 +5,13 @@ import * as bioScreen from 'links-page/screens/BioScreen' /* --- /bio ------------------------------------------------------------------------------------ */ -const PageScreen = (props: bioScreen.BioScreenProps) => ( - +const PageScreen = async (props: bioScreen.BioScreenProps) => ( + ) /* --- Exports --------------------------------------------------------------------------------- */ diff --git a/features/app-core/routes/index.tsx b/features/app-core/routes/index.tsx index 76597f72..0ed6d1d3 100644 --- a/features/app-core/routes/index.tsx +++ b/features/app-core/routes/index.tsx @@ -5,11 +5,17 @@ import * as bioScreen from 'links-page/screens/BioScreen' /* --- / --------------------------------------------------------------------------------------- */ -const PageScreen = ( +const PageScreen = async ( props: bioScreen.BioScreenProps & { searchParams: Record } ) => { + console.log('PageScreen', { props, ...bioScreen.screenConfig }) return ( - + ) } diff --git a/features/links-page/screens/BioScreen.tsx b/features/links-page/screens/BioScreen.tsx index f430f56e..84951773 100644 --- a/features/links-page/screens/BioScreen.tsx +++ b/features/links-page/screens/BioScreen.tsx @@ -1,3 +1,4 @@ +'use client' import React from 'react' // Navigation import { diff --git a/packages/@aetherspace/navigation/AetherLink/AetherLink.web.tsx b/packages/@aetherspace/navigation/AetherLink/AetherLink.web.tsx index 972bf2c0..a70ba686 100644 --- a/packages/@aetherspace/navigation/AetherLink/AetherLink.web.tsx +++ b/packages/@aetherspace/navigation/AetherLink/AetherLink.web.tsx @@ -1,3 +1,4 @@ +'use client' // @ts-ignore import React, { useMemo, forwardRef } from 'react' import { Platform, Text } from 'react-native' diff --git a/packages/@aetherspace/navigation/AetherPage/AetherClientPage.web.tsx b/packages/@aetherspace/navigation/AetherPage/AetherClientPage.web.tsx new file mode 100644 index 00000000..4fbdec62 --- /dev/null +++ b/packages/@aetherspace/navigation/AetherPage/AetherClientPage.web.tsx @@ -0,0 +1,77 @@ +'use client' +import { SWRConfig } from 'swr' + +/* --- Helpers --------------------------------------------------------------------------------- */ + +// const getSSRData = () => { +// const $ssrData = document.getElementById('ssr-data') +// const ssrDataText = $ssrData?.getAttribute('data-ssr') +// const ssrData = ssrDataText ? (JSON.parse(ssrDataText) as Record) : null +// return ssrData +// } + +/* --- --------------------------------------------------------------------------- */ + +export const AetherClientPage = (props: any) => { + // Props + const { fallbackKey, screen, ...ssrData } = props + const PageScreen = screen + + // Render + return ( + + {!!ssrData &&
} + + + ) +} + +// export const AetherPage = (props: AetherPageProps) => { +// // Props +// const { params: routeParams, searchParams, screen, screenConfig, ...restProps } = props +// const { query, getGraphqlVars, getGraphqlData } = screenConfig + +// // State +// const [hydratedData, setHydratedData] = useState | null>(null) + +// // Screen +// const PageScreen = screen + +// // Vars +// const variables = getGraphqlVars({ ...searchParams, ...routeParams }) +// const fallbackKey = unstable_serialize([query, variables]) +// const isServer = typeof window === 'undefined' + +// // -- Effects -- + +// useEffect(() => { +// const ssrData = getSSRData() +// if (ssrData) setHydratedData(ssrData) // Save the SSR data to state, removing the SSR data from the DOM +// }, []) + +// // -- Browser -- + +// if (!isServer) { +// const hydrationData = hydratedData || getSSRData() +// const fallback = hydrationData ? { [fallbackKey]: hydrationData } : {} +// const renderHydrationData = !!hydrationData && !hydratedData // Only render the hydration data if it's not already in state + +// return ( +// +// {renderHydrationData &&
} +// +// +// ) +// } + +// // -- Server -- + +// const ssrData = use(getGraphqlData(query, variables)) + +// return ( +// +// {!!ssrData &&
} +// +// +// ) +// } diff --git a/packages/@aetherspace/navigation/AetherPage/AetherPage.types.ts b/packages/@aetherspace/navigation/AetherPage/AetherPage.types.ts index 2e877be3..d7c4ac37 100644 --- a/packages/@aetherspace/navigation/AetherPage/AetherPage.types.ts +++ b/packages/@aetherspace/navigation/AetherPage/AetherPage.types.ts @@ -13,7 +13,7 @@ export type AetherScreenConfig = { backgroundColor?: string } -export type AetherPageProps = { +export type AetherPageProps = SC & { params?: Record searchParams?: Record screen: React.FC> | ((props: any) => JSX.Element | null) diff --git a/packages/@aetherspace/navigation/AetherPage/AetherPage.web.tsx b/packages/@aetherspace/navigation/AetherPage/AetherPage.web.tsx index 3db64c99..094ed178 100644 --- a/packages/@aetherspace/navigation/AetherPage/AetherPage.web.tsx +++ b/packages/@aetherspace/navigation/AetherPage/AetherPage.web.tsx @@ -2,64 +2,110 @@ import { use, useEffect, useState } from 'react' import { SWRConfig, unstable_serialize } from 'swr' // Types import { AetherPageProps, AetherScreenConfig } from './AetherPage.types' +// Components +import { AetherClientPage } from './AetherClientPage.web' /* --- Helpers --------------------------------------------------------------------------------- */ -const getSSRData = () => { - const $ssrData = document.getElementById('ssr-data') - const ssrDataText = $ssrData?.getAttribute('data-ssr') - const ssrData = ssrDataText ? (JSON.parse(ssrDataText) as Record) : null - return ssrData -} +// const getSSRData = () => { +// const $ssrData = document.getElementById('ssr-data') +// const ssrDataText = $ssrData?.getAttribute('data-ssr') +// const ssrData = ssrDataText ? (JSON.parse(ssrDataText) as Record) : null +// return ssrData +// } /* --- --------------------------------------------------------------------------- */ -export const AetherPage = (props: AetherPageProps) => { +export const AetherServerPage = async ( + props: AetherPageProps +) => { // Props - const { params: routeParams, searchParams, screen, screenConfig, ...restProps } = props - const { query, getGraphqlVars, getGraphqlData } = screenConfig - - // State - const [hydratedData, setHydratedData] = useState | null>(null) - - // Screen - const PageScreen = screen + const { + params: routeParams, + searchParams, + screen, + screenConfig, + query, + getGraphqlVars, + getGraphqlData, + ...restProps + } = props || {} + console.log('Server:', { props }) + // const { query, getGraphqlVars, getGraphqlData } = screenConfig // Vars const variables = getGraphqlVars({ ...searchParams, ...routeParams }) const fallbackKey = unstable_serialize([query, variables]) - const isServer = typeof window === 'undefined' + console.log('Server:', { fallbackKey, variables }) + const ssrData = await getGraphqlData(query, variables) // use(getGraphqlData(query, variables)) + console.log('Server:', { ssrData }) - // -- Effects -- + // Render + return +} - useEffect(() => { - const ssrData = getSSRData() - if (ssrData) setHydratedData(ssrData) // Save the SSR data to state, removing the SSR data from the DOM - }, []) +// export const AetherClientPage = (props: any) => { +// // Props +// const { fallbackKey, screen, ...ssrData } = props +// const PageScreen = screen - // -- Browser -- +// // Render +// return ( +// +// {!!ssrData &&
} +// +// +// ) +// } - if (!isServer) { - const hydrationData = hydratedData || getSSRData() - const fallback = hydrationData ? { [fallbackKey]: hydrationData } : {} - const renderHydrationData = !!hydrationData && !hydratedData // Only render the hydration data if it's not already in state +export const AetherPage = AetherServerPage - return ( - - {renderHydrationData &&
} - - - ) - } +// export const AetherPage = (props: AetherPageProps) => { +// // Props +// const { params: routeParams, searchParams, screen, screenConfig, ...restProps } = props +// const { query, getGraphqlVars, getGraphqlData } = screenConfig - // -- Server -- +// // State +// const [hydratedData, setHydratedData] = useState | null>(null) - const ssrData = use(getGraphqlData(query, variables)) +// // Screen +// const PageScreen = screen - return ( - - {!!ssrData &&
} - - - ) -} +// // Vars +// const variables = getGraphqlVars({ ...searchParams, ...routeParams }) +// const fallbackKey = unstable_serialize([query, variables]) +// const isServer = typeof window === 'undefined' + +// // -- Effects -- + +// useEffect(() => { +// const ssrData = getSSRData() +// if (ssrData) setHydratedData(ssrData) // Save the SSR data to state, removing the SSR data from the DOM +// }, []) + +// // -- Browser -- + +// if (!isServer) { +// const hydrationData = hydratedData || getSSRData() +// const fallback = hydrationData ? { [fallbackKey]: hydrationData } : {} +// const renderHydrationData = !!hydrationData && !hydratedData // Only render the hydration data if it's not already in state + +// return ( +// +// {renderHydrationData &&
} +// +// +// ) +// } + +// // -- Server -- + +// const ssrData = use(getGraphqlData(query, variables)) + +// return ( +// +// {!!ssrData &&
} +// +// +// ) +// } diff --git a/packages/@aetherspace/primitives/AetherImage/AetherImage.tsx b/packages/@aetherspace/primitives/AetherImage/AetherImage.tsx index b160775b..88d43171 100644 --- a/packages/@aetherspace/primitives/AetherImage/AetherImage.tsx +++ b/packages/@aetherspace/primitives/AetherImage/AetherImage.tsx @@ -1,3 +1,4 @@ +'use client' import React, { useMemo, forwardRef } from 'react' import { Image, ImageSource } from 'expo-image' // Types diff --git a/packages/@aetherspace/primitives/AetherImage/AetherImage.web.tsx b/packages/@aetherspace/primitives/AetherImage/AetherImage.web.tsx index de172f21..29088c30 100644 --- a/packages/@aetherspace/primitives/AetherImage/AetherImage.web.tsx +++ b/packages/@aetherspace/primitives/AetherImage/AetherImage.web.tsx @@ -1,3 +1,4 @@ +'use client' // -i- Based on / inspired by: // - https://necolas.github.io/react-native-web/docs/image/ // - https://nextjs.org/docs/api-reference/next/image