From 62e7a756d559199ae62520aa31afbcb2a99f61ea Mon Sep 17 00:00:00 2001 From: Fernando Rojo Date: Wed, 19 May 2021 13:07:56 -0400 Subject: [PATCH 1/9] feat: remove SSR --- lerna.json | 6 +- packages/core/src/components/index.tsx | 1 - packages/core/src/css/breakpoints.ts | 2 + .../core/src/css/create-themed-component.tsx | 29 +++-- packages/core/src/css/index.tsx | 38 +------ packages/core/src/css/ssr-component.tsx | 5 +- packages/core/src/css/styled.tsx | 4 +- packages/core/src/css/use-breakpoint-index.ts | 79 ++++++++------ packages/core/src/index.ts | 2 - packages/core/src/provider/fresnel.tsx | 20 +++- packages/core/src/provider/index.tsx | 100 +++++++++++++----- packages/core/src/utils/deprecated-ssr.ts | 4 + 12 files changed, 164 insertions(+), 126 deletions(-) create mode 100644 packages/core/src/utils/deprecated-ssr.ts diff --git a/lerna.json b/lerna.json index b8880d4c..705aa70a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,10 +1,8 @@ { - "packages": [ - "packages/*" - ], + "packages": ["packages/*"], "npmClient": "yarn", "useWorkspaces": true, - "version": "1.5.18", + "version": "2.0.0", "command": { "publish": { "allowBranch": "master", diff --git a/packages/core/src/components/index.tsx b/packages/core/src/components/index.tsx index 92a67267..fbcdbf13 100644 --- a/packages/core/src/components/index.tsx +++ b/packages/core/src/components/index.tsx @@ -10,7 +10,6 @@ import { } from '@expo/html-elements' import { - // TODO I could import * as Native, but would that break tree shaking? View as rView, Text as rText, ScrollView as rScrollView, diff --git a/packages/core/src/css/breakpoints.ts b/packages/core/src/css/breakpoints.ts index 3b7ee962..9c4dce01 100644 --- a/packages/core/src/css/breakpoints.ts +++ b/packages/core/src/css/breakpoints.ts @@ -12,6 +12,8 @@ let hasSetBreakpoints = false * * import { DripsyProvider } from 'dripsy' * ``` + * + * @deprecated use `breakpoints` in your theme instead */ export function setBreakpoints(breakpoints: typeof defaultBreakpoints) { if (hasSetBreakpoints) { diff --git a/packages/core/src/css/create-themed-component.tsx b/packages/core/src/css/create-themed-component.tsx index 5729ab74..e77ba41c 100644 --- a/packages/core/src/css/create-themed-component.tsx +++ b/packages/core/src/css/create-themed-component.tsx @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/ban-ts-ignore */ -import React, { ComponentType, ComponentProps, useMemo } from 'react' +import React, { ComponentType, ComponentProps } from 'react' import type { ThemedOptions, StyledProps } from './types' import { useThemeUI } from '@theme-ui/core' import { useBreakpointIndex } from './use-breakpoint-index' @@ -7,16 +7,10 @@ import { SSRComponent } from './ssr-component' import { Platform, StyleSheet } from 'react-native' import { StyleSheetCache } from './cache' import { mapPropsToStyledComponent } from '.' +import { SUPPORT_FRESNEL_SSR } from '../utils/deprecated-ssr' type Props

= Omit, 'theme' | 'breakpoint'> -// const cache: Record< -// string, -// { -// dripsyStyle: Record -// } -// > = {} - export function createThemedComponent( Component: ComponentType

, { defaultStyle: baseStyle, ...options }: ThemedOptions = {} @@ -25,10 +19,11 @@ export function createThemedComponent( ComponentProps & T & P & - // needed for the ref field in TS + /** + * TODO this doesn't work. + */ React.RefAttributes > { - // without styled-components... const WrappedComponent = React.forwardRef< typeof Component, Props

& ComponentProps & T @@ -53,16 +48,14 @@ export function createThemedComponent( const { theme } = useThemeUI() const breakpoint = useBreakpointIndex({ - __shouldDisableListenerOnWeb: true, + __shouldDisableListenerOnWeb: SUPPORT_FRESNEL_SSR, }) - // const ssr = useIsSSR() - // change/remove this later maybe - const ssr = Platform.OS === 'web' const { responsiveSSRStyles, ...styles } = mapPropsToStyledComponent( { theme, - breakpoint: Platform.OS === 'web' && ssr ? undefined : breakpoint, + breakpoint: + Platform.OS === 'web' && SUPPORT_FRESNEL_SSR ? undefined : breakpoint, variant, sx, style, @@ -78,7 +71,11 @@ export function createThemedComponent( const TheComponent = SuperComponent || Component - if (Platform.OS === 'web' && ssr && !!responsiveSSRStyles?.length) { + if ( + Platform.OS === 'web' && + SUPPORT_FRESNEL_SSR && + !!responsiveSSRStyles?.length + ) { return ( (values: Values) => { -// const { width } = Dimensions.get('window') -// const getBreakpointIndex = () => { -// const breakpointPixels = [...defaultBreakpoints] -// .reverse() -// .find(breakpoint => width >= breakpoint) - -// let breakpointIndex = defaultBreakpoints.findIndex( -// breakpoint => breakpointPixels === breakpoint -// ) -// breakpointIndex = breakpointIndex === -1 ? 0 : breakpointIndex + 1 -// return breakpointIndex -// } -// const array = typeof values === 'function' ? values(theme) : values -// const index = getBreakpointIndex() -// return array[index >= array.length ? array.length - 1 : index] -// }, -// [theme] -// ) -// } - export function mapPropsToStyledComponent( props: StyledProps

, options: ThemedOptions diff --git a/packages/core/src/css/ssr-component.tsx b/packages/core/src/css/ssr-component.tsx index 9a07d5c6..81a371b8 100644 --- a/packages/core/src/css/ssr-component.tsx +++ b/packages/core/src/css/ssr-component.tsx @@ -1,11 +1,10 @@ /** @jsxRuntime classic */ /** @jsx jsx */ import { jsx, SxProps } from '@theme-ui/core' -import { ThemeUIStyleObject } from '@theme-ui/css' -import React, { ComponentProps, ComponentType, Fragment } from 'react' +import React, { ComponentProps, ComponentType } from 'react' import type { ResponsiveSSRStyles } from '.' import { SSRMediaQuery } from '../provider/fresnel' -import { getWebContainerCachedStyle, StyleSheetCache } from './cache' +import { StyleSheetCache } from './cache' type Props = { Component: ComponentType diff --git a/packages/core/src/css/styled.tsx b/packages/core/src/css/styled.tsx index 4d2ab434..cc971b42 100644 --- a/packages/core/src/css/styled.tsx +++ b/packages/core/src/css/styled.tsx @@ -2,8 +2,6 @@ import type { ComponentType } from 'react' import { createThemedComponent } from './create-themed-component' import type { ThemedOptions } from './types' -// type Props

= Omit, 'theme' | 'breakpoint'> - /** * `styled` is little more than a recreation of `createThemedComponent`, with a nicer API. It does the same thing, but looks a bit nicer to use and has a clean name 😇 * @@ -24,7 +22,7 @@ export function styled( defaultVariant, }: Pick, 'themeKey' | 'defaultVariant'> = {} ) { - return (defaultStyle: ThemedOptions['defaultStyle']) => { + return (defaultStyle?: ThemedOptions['defaultStyle']) => { return createThemedComponent(Component, { defaultVariant, themeKey, diff --git a/packages/core/src/css/use-breakpoint-index.ts b/packages/core/src/css/use-breakpoint-index.ts index aa776037..f242c031 100644 --- a/packages/core/src/css/use-breakpoint-index.ts +++ b/packages/core/src/css/use-breakpoint-index.ts @@ -2,17 +2,25 @@ import { useThemeUI } from '@theme-ui/core' import { Theme } from '@theme-ui/css' import { useEffect, useRef, useState } from 'react' import { Dimensions, Platform, ScaledSize } from 'react-native' +import { SUPPORT_FRESNEL_SSR } from '../utils/deprecated-ssr' + +export const useBreakpoints = () => + (useThemeUI().theme.breakpoints as number[] | undefined) ?? defaultBreakpoints import { defaultBreakpoints } from './breakpoints' -// TODO: Do we need options? type DefaultOptions = { /** + * @deprecated SSR support removed + * * @default `0`. * * Pass an optional index as the first one. This is useful if you think you know what device users will be on. + * */ defaultIndex?: number /** + * @deprecated SSR support removed + * * You're safe to ignore this. It's for internal use. * * ## Why? @@ -22,27 +30,40 @@ type DefaultOptions = { __shouldDisableListenerOnWeb?: boolean } -export function useBreakpointIndex({ - defaultIndex = 0, - __shouldDisableListenerOnWeb = false, -}: DefaultOptions = {}) { - // const { width = 0 } = useDimensions().window +export const getBreakpointIndex = ({ + width, + breakpoints, +}: { + width: number + breakpoints: number[] +}) => { + const breakpointPixels = [...breakpoints] + .reverse() + .find((breakpoint) => width >= breakpoint) - // const getIndex = useCallback(() => { - // // return 1; - // // const { width = 700 } = Dimensions.get("window"); - // const breakpointPixels = [...defaultBreakpoints] - // .reverse() - // .find(breakpoint => width >= breakpoint) + let breakpointIndex = breakpoints.findIndex( + (breakpoint) => breakpointPixels === breakpoint + ) + breakpointIndex = breakpointIndex === -1 ? 0 : breakpointIndex + 1 - // let breakpoint = defaultBreakpoints.findIndex( - // breakpoint => breakpointPixels === breakpoint - // ) - // breakpoint = breakpoint === -1 ? 0 : breakpoint + 1 - // return breakpoint - // }, [width]) + return breakpointIndex +} + +export const useBreakpointIndex = ({ + defaultIndex = 0, + __shouldDisableListenerOnWeb = false, +}: DefaultOptions = {}) => { + const breakpoints = useBreakpoints() + const [index, setIndex] = useState(() => { + if (SUPPORT_FRESNEL_SSR && Platform.OS === 'web') { + return defaultIndex + } - const [index, setIndex] = useState(defaultIndex) + return getBreakpointIndex({ + width: Dimensions.get('window').width, + breakpoints, + }) + }) const indexRef = useRef(index) @@ -60,18 +81,10 @@ export function useBreakpointIndex({ window: ScaledSize screen: ScaledSize }) => { - const breakpointPixels = [...defaultBreakpoints] - .reverse() - .find((breakpoint) => width >= breakpoint) - - let breakpointIndex = defaultBreakpoints.findIndex( - (breakpoint) => breakpointPixels === breakpoint - ) - breakpointIndex = breakpointIndex === -1 ? 0 : breakpointIndex + 1 + const breakpointIndex = getBreakpointIndex({ width, breakpoints }) if (breakpointIndex !== indexRef.current) { setIndex(breakpointIndex) } - // return breakpoint } if (!shouldDisableListener) { Dimensions.addEventListener('change', onChange) @@ -85,18 +98,14 @@ export function useBreakpointIndex({ Dimensions.removeEventListener('change', onChange) } } - }, [__shouldDisableListenerOnWeb]) + }, [__shouldDisableListenerOnWeb, breakpoints]) return index - // return getIndex() } -type Values = ((theme: Theme | null) => T[]) | T[] +type ResponsiveValues = ((theme: Theme | null) => T[]) | T[] -export function useResponsiveValue( - values: Values - // options: defaultOptions = {} -): T { +export function useResponsiveValue(values: ResponsiveValues): T { const { theme } = useThemeUI() const array = typeof values === 'function' ? values(theme) : values const index = useBreakpointIndex() diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index e92de5ca..a644ba7f 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -5,8 +5,6 @@ export * from './provider/fresnel' export { setBreakpoints } from './css/breakpoints' export * from './css/use-breakpoint-index' export { Styles, css } from './css' -// export { ThemeProvider, Th } from '@theme-ui/core' -// export { InitializeColorMode } from 'theme-ui' export type { Theme } from '@theme-ui/css' export { styled } from './css/styled' diff --git a/packages/core/src/provider/fresnel.tsx b/packages/core/src/provider/fresnel.tsx index dfa68916..3e6351dc 100644 --- a/packages/core/src/provider/fresnel.tsx +++ b/packages/core/src/provider/fresnel.tsx @@ -1,6 +1,7 @@ import React from 'react' import { createMedia } from '@artsy/fresnel' import { defaultBreakpoints } from '../css/breakpoints' +import { SUPPORT_FRESNEL_SSR } from '../utils/deprecated-ssr' const { MediaContextProvider, @@ -21,8 +22,21 @@ const { const ssrStyleReset = createMediaStyle() -const SSRStyleReset = () => ( -