import type { Consumer, FC, ReactNode } from 'react';
import { withInitDataInState } from './compat/initData.js';
/**
* The default root exported by `@lynx-js/react` for you to render a JSX
* @public
*/
export interface Root {
/**
* Use this API to pass in your JSX to render
*
* @example
*
* ```ts
* import { root } from "@lynx-js/react"
*
* function App() {
* // Your app
* return ...
* }
*
* root.render();
* ```
*
* @example
*
* ```tsx
* import { root } from "@lynx-js/react"
*
* function App() {
* // Your app
* return ...
* }
*
* if (__MAIN_THREAD__) {
* root.render(
*
*
*
* );
* } else if (__BACKGROUND__) {
* fetchData().then((data) => {
* root.render(
*
*
*
* ); // You can render later after your data is ready
* })
* }
* ```
*
* @public
*/
render: (jsx: ReactNode) => void;
/**
* {@inheritDoc Lynx.registerDataProcessors}
* @deprecated use {@link Lynx.registerDataProcessors | lynx.registerDataProcessors} instead
* @public
*/
registerDataProcessors: (dataProcessorDefinition: DataProcessorDefinition) => void;
}
/**
* The default and only root of ReactLynx for you to render JSX
* @example
* ```ts
* import { root } from "@lynx-js/react"
* ```
*
* @public
*/
export declare const root: Root;
/**
* The {@link https://react.dev/reference/react/createContext#provider | Provider} Component that provide `initData`,
* you must wrap your JSX inside it
* @group Components
*
* @example
*
* ```ts
* import { root } from "@lynx-js/react"
*
* function App() {
* return (
* ...}/>
* )
* }
*
* root.render(
*
*
*
* );
*
* ```
*
* @public
*/
export declare const InitDataProvider: FC<{
children?: ReactNode | undefined;
}>;
/**
* The {@link https://react.dev/reference/react/createContext#consumer | Consumer} Component that provide `initData`.
* This should be used with {@link InitDataProvider}
* @group Components
* @public
*/
export declare const InitDataConsumer: Consumer;
/**
* A React Hooks for you to get `initData`.
* If `initData` is changed, a re-render will be triggered automatically.
*
* @example
*
* ```ts
* function App() {
* const initData = useInitData();
*
* initData.someProperty // use it
* }
* ```
*
* @public
*/
export declare const useInitData: () => InitData;
/**
* A React Hooks for you to get notified when `initData` changed.
*
* @example
* ```ts
* function App() {
* useInitDataChanged((data) => {
* data.someProperty // can use it
* })
* }
* ```
* @public
*/
export declare const useInitDataChanged: (callback: (data: InitData) => void) => void;
/**
* The interface you can extends so that the `useGlobalProps` returning value can be customized
*
* @public
*/
export interface GlobalProps {
}
/**
* The {@link https://react.dev/reference/react/createContext#provider | Provider} Component that provide `lynx.__globalProps`,
* you must wrap your JSX inside it
* @group Components
*
* @example
*
* ```ts
* import { root } from "@lynx-js/react"
*
* function App() {
* return (
* ...}/>
* )
* }
*
* root.render(
*
*
*
* );
*
* ```
*
* @public
*/
export declare const GlobalPropsProvider: FC<{
children?: ReactNode | undefined;
}>;
/**
* The {@link https://react.dev/reference/react/createContext#consumer | Consumer} Component that provide `lynx.__globalProps`.
* This should be used with {@link GlobalPropsProvider}
* @group Components
* @public
*/
export declare const GlobalPropsConsumer: Consumer;
/**
* A React Hooks for you to get `lynx.__globalProps`.
* If `lynx.__globalProps` is changed, a re-render will be triggered automatically.
*
* @example
*
* ```ts
* function App() {
* const globalProps = useGlobalProps();
*
* globalProps.someProperty // use it
* }
* ```
*
* @public
*/
export declare const useGlobalProps: () => GlobalProps;
/**
* A React Hooks for you to get notified when `__globalProps` changed.
*
* @example
* ```ts
* function App() {
* useGlobalPropsChanged((data) => {
* lynx.__globalProps.someProperty // can use lynx.__globalProps
* data.someProperty // can use data
* })
* }
* ```
* @public
*/
export declare const useGlobalPropsChanged: (callback: (data: GlobalProps) => void) => void;
/**
* The interface you can extends so that the `defaultDataProcessor` parameter can be customized
*
* Should be used with `lynx.registerDataProcessors`. See more examples at {@link Lynx.registerDataProcessors}.
*
* @public
*/
export interface InitDataRaw {
}
/**
* The interface you can extends so that the `defaultDataProcessor` returning value can be customized
*
* Should be used with `lynx.registerDataProcessors`. See more examples at {@link Lynx.registerDataProcessors}.
*
* @public
*/
export interface InitData {
}
export { withInitDataInState };
/**
* The data processors that registered with {@link Lynx.registerDataProcessors}.
*
* @example
*
* Extending `dataProcessors` interface
*
* ```ts
* import type { DataProcessors as WellKnownDataProcessors } from '@lynx-js/react';
*
* declare module '@lynx-js/react' {
* interface DataProcessors extends WellKnownDataProcessors {
* foo(bar: string): number;
* }
* }
* ```
*
* Then you can use `lynx.registerDataProcessors` with types.
*
* ```js
* lynx.registerDataProcessors({
* dataProcessors: {
* foo(bar) {
* return 1;
* }
* }
* })
* ```
*
* @public
*/
export interface DataProcessors {
/**
* Optional processor to override screen metrics used by the app
*
* @param metrics - The physical screen dimensions in pixels
*
* @returns New screen dimensions to be used by the app
*
* @example
*
* ```ts
* lynx.registerDataProcessors({
* dataProcessors: {
* getScreenMetricsOverride: (metrics) => {
* // Force a specific aspect ratio
* return {
* width: metrics.width,
* height: metrics.width * (16/9)
* };
* }
* }
* });
* ```
*/
getScreenMetricsOverride?(metrics: {
/**
* The physical pixel width of the screen
*/
width: number;
/**
* The physical pixel height of the screen
*/
height: number;
}): {
width: number;
height: number;
};
/**
* Custom unknown data processors.
*
* @remarks
*
* You may extends the `DataProcessors` interface for better TypeScript types. See {@link DataProcessors}.
*/
[processorName: string]: (...args: any[]) => any;
}
/**
* Definition of DataProcessor(s)
* @public
*/
export interface DataProcessorDefinition {
/**
* You can custom input and output type of `defaultDataProcessor` by extends {@link InitDataRaw} and {@link InitData}
*
* Should be used with `lynx.registerDataProcessors`. See more examples at {@link Lynx.registerDataProcessors}.
*
* @param rawInitData - initData passed from native code
* @returns
* @public
*/
defaultDataProcessor?: (rawInitData: InitDataRaw) => InitData;
/**
* Should be used with `lynx.registerDataProcessors`. See more examples at {@link Lynx.registerDataProcessors}.
*
* @public
*/
dataProcessors?: DataProcessors;
}
/**
* APIs under `lynx` global variable that added by ReactLynx.
*
* @example
*
* ```ts
* lynx.registerDataProcessors(...);
* lynx.querySelector(...);
* lynx.querySelectorAll(...);
* ```
*
* @public
*/
export interface Lynx {
/**
* An alias of `lynx.getJSModule("GlobalEventEmitter").trigger(eventName, params)` only in Lepus
*
* @public
*/
triggerGlobalEventFromLepus: (eventName: string, params: any) => void;
/**
* Register DataProcessors. You MUST call this before `root.render()`.
*
* @example
*
* You MUST call `lynx.registerDataProcessors` before calling `root.render()`.
*
* ```ts
* import { root } from "@lynx-js/react"
*
* // You MUST call this before `root.render()`
* lynx.registerDataProcessors({
* defaultDataProcessor: () => {...} // default DataProcessor
* dataProcessors: {
* getScreenMetricsOverride: () => {...} // named DataProcessor
* }
* })
*
* root.render();
* ```
*
* @example
*
* If you have a class component with `static defaultDataProcessor`
* or `static dataProcessors`, you can use it to register DataProcessors.
*
* ```ts
* import { root, Component } from "@lynx-js/react"
*
* class App extends Component {
* static defaultDataProcessor() {
* ...
* }
*
* static dataProcessors = {
* getScreenMetricsOverride() {
* ...
* }
* }
* }
*
* lynx.registerDataProcessors(App); // You can pass `App` because it has the required shape
* root.render();
* ```
*
* @example
*
* For developers who want fully typed `defaultDataProcessor`,
* they can achieve it by extends interface `InitDataRaw` and `InitData`.
*
* ```ts
* import { root } from "@lynx-js/react"
*
* interface ExistingInterface {
* somePropertyFromExistingInterface: number
* }
*
* declare module '@lynx-js/react' {
* interface InitDataRaw extends ExistingInterface {
* someAnotherCustomProperty: string
* }
* }
*
* lynx.registerDataProcessors({
* defaultDataProcessor: (initDataRaw) => {
* initDataRaw.somePropertyFromExistingInterface // will be typed
* }
* })
*
* ```
*
* @example
*
* For developers who want fully typed `defaultDataProcessor`,
* they can achieve it by extends interface `InitDataRaw` and `InitData`.
*
* ```ts
* import { root, useInitData } from "@lynx-js/react"
*
* interface AnotherExistingInterface {
* someAnotherPropertyFromExistingInterface: number
* }
*
* declare module '@lynx-js/react' {
* interface InitData extends AnotherExistingInterface {
* someCustomProperty: string
* }
* }
*
* root.registerDataProcessors({
* defaultDataProcessor: () => {
* return {
* someCustomProperty: 'value', // will be typed
* someAnotherPropertyFromExistingInterface: 1, // will be typed
* }
* }
* })
*
* function App() {
* const initData = useInitData();
*
* initData.someCustomProperty // will be typed
* initData.someAnotherPropertyFromExistingInterface // will be typed
* }
*
* ```
* @public
*/
registerDataProcessors: (dataProcessorDefinition?: DataProcessorDefinition) => void;
}
export { useLynxGlobalEventListener } from './hooks/useLynxGlobalEventListener.js';
export { runOnBackground } from './worklet/call/runOnBackground.js';
export { runOnMainThread } from './worklet/call/runOnMainThread.js';
export { MainThreadRef, useMainThreadRef } from './worklet/ref/workletRef.js';