Files
react-native/packages/react-native-popup-menu-android/js/PopupMenuAndroid.android.js
T
Tim Yung 177697f539 RN: Migrate to HostInstance Type (#46742)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/46742

Migrates type definitions in React Native to use the newly created `HostInstance` type instead of `NativeMethods` and `React.ElementRef<HostComponent<T>>`.

Changelog:
[General][Changed] - Simplified Flow types to use `HostInstance` (which changing nominal types).

Reviewed By: NickGerleman

Differential Revision: D63646763

fbshipit-source-id: 904894dc40da4d2e70bcb6df47018fc6248ea972
2024-10-01 22:51:48 -07:00

81 lines
1.9 KiB
JavaScript

/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
* @flow strict-local
*/
import type {RefObject} from 'react';
import type {HostInstance} from 'react-native';
import type {SyntheticEvent} from 'react-native/Libraries/Types/CoreEventTypes';
import PopupMenuAndroidNativeComponent, {
Commands,
} from './PopupMenuAndroidNativeComponent.android';
import nullthrows from 'nullthrows';
import * as React from 'react';
import {useCallback, useImperativeHandle, useRef} from 'react';
type PopupMenuSelectionEvent = SyntheticEvent<
$ReadOnly<{
item: number,
}>,
>;
type PopupMenuDismissEvent = SyntheticEvent<$ReadOnly<{}>>;
export type PopupMenuAndroidInstance = {
+show: () => void,
};
type Props = {
menuItems: $ReadOnlyArray<string>,
onSelectionChange: number => void,
onDismiss?: () => void,
children: React.Node,
instanceRef: RefObject<?PopupMenuAndroidInstance>,
};
export default function PopupMenuAndroid({
menuItems,
onSelectionChange,
onDismiss,
children,
instanceRef,
}: Props): React.Node {
const nativeRef = useRef<HostInstance | null>(null);
const _onSelectionChange = useCallback(
(event: PopupMenuSelectionEvent) => {
onSelectionChange(event.nativeEvent.item);
},
[onSelectionChange],
);
const _onDismiss = useCallback(
(event: PopupMenuDismissEvent) => {
onDismiss?.();
},
[onDismiss],
);
useImperativeHandle(instanceRef, ItemViewabilityInstance => {
return {
show() {
Commands.show(nullthrows(nativeRef.current));
},
};
});
return (
<PopupMenuAndroidNativeComponent
ref={nativeRef}
onPopupMenuSelectionChange={_onSelectionChange}
onPopupMenuDismiss={_onDismiss}
menuItems={menuItems}>
{children}
</PopupMenuAndroidNativeComponent>
);
}