@douyinfe/semi-ui
Version:
A modern, comprehensive, flexible design system and UI library. Connect DesignOps & DevOps. Quickly build beautiful React apps. Maintained by Douyin-fe team.
95 lines (94 loc) • 3.69 kB
TypeScript
import React from 'react';
import PropTypes from 'prop-types';
import { ContextValue } from './context';
import { ResponsiveMap, BreakpointScreens } from './responsiveTypes';
export interface ConfigProviderProps extends Omit<ContextValue, 'onBreakpoint' | 'screens'> {
/**
* Custom responsive map configuration
* If not provided, default responsive map will be used
*/
responsiveMap?: ResponsiveMap;
/**
* Enable responsive observing in ConfigProvider.
*
* - When false (default): ConfigProvider will not register any matchMedia listeners.
* - When true: listeners will be registered lazily on first subscription.
*/
responsiveObserve?: boolean;
}
interface ConfigProviderState {
screens: BreakpointScreens;
}
/**
* Default responsive map configuration
* Can be accessed via ConfigProvider.defaultResponsiveMap
*/
export declare const defaultResponsiveMap: ResponsiveMap;
export declare const ConfigConsumer: React.Consumer<ContextValue>;
export default class ConfigProvider extends React.Component<ConfigProviderProps, ConfigProviderState> {
static propTypes: {
locale: PropTypes.Requireable<object>;
timeZone: PropTypes.Requireable<NonNullable<string | number>>;
getPopupContainer: PropTypes.Requireable<(...args: any[]) => any>;
direction: PropTypes.Requireable<string>;
responsiveMap: PropTypes.Requireable<object>;
responsiveObserve: PropTypes.Requireable<boolean>;
};
static defaultProps: {
locale: import("../locale/interface").Locale;
direction: string;
responsiveObserve: boolean;
};
/**
* Default responsive map - static property for backward compatibility
*/
static defaultResponsiveMap: ResponsiveMap;
private unRegisters;
private hasRegisteredMediaQueries;
private hasWarnedResponsiveObserve;
private screensListeners;
private changeListeners;
/**
* Synchronous source of truth for current breakpoint matches.
* `setState` is async, so reading `this.state.screens` immediately after
* registering listeners returns stale values. Subscriber callbacks read
* from this ref to always get the freshest snapshot.
*/
private currentScreensRef;
constructor(props: ConfigProviderProps);
componentDidMount(): void;
componentDidUpdate(prevProps: ConfigProviderProps): void;
componentWillUnmount(): void;
private ensureMediaQueriesRegistered;
/**
* Register media query listeners.
*
* To avoid stale-state bug in immediate subscriber callbacks, we
* synchronously read all `matchMedia(...).matches` once *before* attaching
* the change listeners, write the result to both `currentScreensRef` and
* `state.screens` in a single batched setState, and only then start
* tracking changes (with `callInInit: false` so we don't double-fire).
*/
private registerMediaQueries;
/**
* Unregister all media query listeners
*/
private unregisterMediaQueries;
/**
* Update screen state and notify listeners
*/
private updateScreen;
/**
* Notify all registered listeners
*/
private notifyListeners;
/**
* Subscribe to breakpoint changes
* @param callback Function to call when breakpoint changes
* @returns Unsubscribe function
*/
private handleBreakpoint;
renderChildren(): string | number | boolean | Iterable<React.ReactNode> | React.JSX.Element;
render(): React.JSX.Element;
}
export type { ResponsiveMap, BreakpointScreens, Breakpoint, OnBreakpointScreensCallback, OnBreakpointChangeCallback, } from './responsiveTypes';