import { SmartDevicesMap, GetSmartDevicesProps } from '../types/SdmModel';
/**
* 获取关联设备的功能点状态集合数据。
* @public
* @since @ray-js/panel-sdk 1.16.0
* @param selector - 选择器函数,入参为所有关联设备的 props 集合对象。
* key 为设备标识,value 为该设备的功能点键值对
* @typeOverride selector (devicesProps: { [key: string]: DpState }) => DpValue;
* @param equalityFn - 自定义比较函数,返回 true 则不触发重渲染,默认 shallow equal
* @typeOverride equalityFn (prev: DpValue, next: DpValue) => boolean;
* @returns 匹配选择器的功能点值,类型由 selector 返回值自动推导
* @typeOverride returns DpValue
* @remarks
* 使用前需挂载 SdmDevicesProvider 并配置关联设备映射。
* 性能优化(最佳实践):
* 1. 强烈建议始终将 selector 的颗粒度精确到具体的功能点,例如 `useDevicesProps(props => props.main?.switch_led)`,避免全量订阅导致无关设备或无关功能点改变时引发无效的重渲染。
* 2. 如果 selector 必须返回包含多个字段的对象,由于默认使用浅比较(shallow equal),只要提取的值未发生改变就不会触发重渲染。必要时也可传入 `equalityFn` 进行深度定制。
* @example 仅订阅单台设备的特定状态
* ```tsx
* import { useDevicesProps } from '@ray-js/panel-sdk';
*
* export default function Lamp1Switch() {
* // 仅在 lamp1 的 switch_led 变化时重渲染
* const switchLed = useDevicesProps(p => p?.lamp1?.switch_led);
*
* return lamp1 开关:{switchLed ? 'ON' : 'OFF'};
* }
* ```
* @example 自定义 rerender
* ```tsx
* // useDevicesProps 内部已针对 selector 返回值做 shallow equal 浅比较,无特殊场景时无需传入 equalityFn。
* import { useDevicesProps } from '@ray-js/panel-sdk';
*
* export default function PowerMap() {
* const powerMap = useDevicesProps(
* p => {
* const map: Record = {};
* Object.keys(p ?? {}).forEach(k => { map[k] = !!p[k]?.switch_led; });
* return map;
* },
* (prev, next) => JSON.stringify(prev) === JSON.stringify(next)
* );
*
* return (
*
* {Object.keys(powerMap).map(k => (
* {k}: {powerMap[k] ? 'ON' : 'OFF'}
* ))}
*
* );
* }
* ```
*/
export declare function useDevicesProps(selector: (devicesProps: GetSmartDevicesProps) => V, equalityFn?: (a: V, b: V) => boolean): V;