Skip to content

Commit

Permalink
Fix SSR on web
Browse files Browse the repository at this point in the history
  • Loading branch information
janicduplessis committed Aug 29, 2019
1 parent 976da7c commit 0b93ef1
Showing 1 changed file with 30 additions and 11 deletions.
41 changes: 30 additions & 11 deletions src/NativeSafeAreaView.web.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ export default function NativeSafeAreaView({
onInsetsChange,
}: NativeSafeAreaViewProps) {
React.useEffect(() => {
// Skip for SSR.
if (typeof document === 'undefined') {
return;
}

const element = createContextElement();
document.body.appendChild(element);
const onEnd = () => {
Expand All @@ -42,43 +47,57 @@ export default function NativeSafeAreaView({
// @ts-ignore: missing properties
onInsetsChange({ nativeEvent: { insets } });
};
element.addEventListener(SUPPORTED_TRANSITION_EVENT, onEnd);
element.addEventListener(getSupportedTransitionEvent(), onEnd);
onEnd();
return () => {
document.body.removeChild(element);
element.removeEventListener(SUPPORTED_TRANSITION_EVENT, onEnd);
element.removeEventListener(getSupportedTransitionEvent(), onEnd);
};
}, [onInsetsChange]);

return <View style={style}>{children}</View>;
}

const SUPPORTED_TRANSITION_EVENT: string = (() => {
let _supportedTransitionEvent: string | null = null;
function getSupportedTransitionEvent(): string {
if (_supportedTransitionEvent !== null) {
return _supportedTransitionEvent;
}
const element = document.createElement('invalidtype');

_supportedTransitionEvent = CSSTransitions.Transition;
for (const key in CSSTransitions) {
if (element.style[key] !== undefined) {
return CSSTransitions[key];
_supportedTransitionEvent = CSSTransitions[key];
break;
}
}
return CSSTransitions.Transition;
})();
return _supportedTransitionEvent;
}

const SUPPORTED_ENV: 'constant' | 'env' = (() => {
type CssEnv = 'constant' | 'env';

let _supportedEnv: CssEnv | null = null;
function getSupportedEnv(): CssEnv {
if (_supportedEnv !== null) {
return _supportedEnv;
}
// @ts-ignore: Property 'CSS' does not exist on type 'Window'.ts(2339)
const { CSS } = window;
if (
CSS &&
CSS.supports &&
CSS.supports('top: constant(safe-area-inset-top)')
) {
return 'constant';
_supportedEnv = 'constant';
} else {
_supportedEnv = 'env';
}
return 'env';
})();
return _supportedEnv;
}

function getInset(side: string): string {
return `${SUPPORTED_ENV}(safe-area-inset-${side})`;
return `${getSupportedEnv()}(safe-area-inset-${side})`;
}

function createContextElement(): HTMLElement {
Expand Down

0 comments on commit 0b93ef1

Please sign in to comment.