"use client";
import { Component, createElement, forwardRef } from "react";
import { assignToTarget } from "../../shared";
import { CssInterop } from "../../types";
import { getNormalizeConfig } from "../config";
import { interopComponents } from "./interopComponentsMap";
export { StyleSheet } from "./stylesheet";
export { colorScheme } from "./color-scheme";
export { rem } from "./rem";
const ForwardRefSymbol = Symbol.for("react.forward_ref");
export { useColorScheme } from "./useColorScheme";
export const cssInterop: CssInterop = (baseComponent, mapping): any => {
const configs = getNormalizeConfig(mapping);
/**
* Turns this:
*
* Into this:
*
*/
const interopComponent = forwardRef(function CssInteropComponent(
{ ...props }: Record,
ref: any,
) {
if (props.cssInterop === false) {
return createElement(baseComponent, props);
}
props = { ...props, ref };
for (const config of configs) {
const source = props[config.source];
// Ensure we only add non-empty strings
if (typeof source === "string" && source) {
assignToTarget(
props,
{
$$css: true,
[source]: source,
},
config,
{
objectMergeStyle: "toArray",
},
);
}
delete props[config.source];
}
if (
"$$typeof" in baseComponent &&
typeof baseComponent === "function" &&
baseComponent.$$typeof === ForwardRefSymbol
) {
delete props.cssInterop;
return (baseComponent as any).render(props, props.ref);
} else if (
typeof baseComponent === "function" &&
!(baseComponent.prototype instanceof Component)
) {
delete props.cssInterop;
return (baseComponent as any)(props);
} else {
return createElement(baseComponent, props);
}
});
interopComponent.displayName = `CssInterop.${
baseComponent.displayName ?? baseComponent.name ?? "unknown"
}`;
interopComponents.set(baseComponent, interopComponent);
return interopComponent;
};
// On web, these are the same
export const remapProps = cssInterop;
export const useUnstableNativeVariable = (name: string) => {
if (process.env.NODE_ENV !== "production") {
console.log("useUnstableNativeVariable is not supported on web.");
}
return undefined;
};
export function vars>(
variables: T,
) {
const $variables: Record = {};
for (const [key, value] of Object.entries(variables)) {
if (key.startsWith("--")) {
$variables[key] = value.toString();
} else {
$variables[`--${key}`] = value.toString();
}
}
return $variables;
}
export function useSafeAreaEnv(): {} | undefined {
return undefined;
}