BlueWallet/components/TooltipMenu.android.tsx

78 lines
2.1 KiB
TypeScript
Raw Normal View History

2024-05-20 10:54:13 +01:00
import React, { forwardRef, Ref, useCallback, useEffect, useMemo, useRef } from 'react';
2024-05-18 12:48:03 -04:00
import { Pressable, View } from 'react-native';
2024-05-20 10:54:13 +01:00
2024-05-18 12:48:03 -04:00
import showPopupMenu, { OnPopupMenuItemSelect, PopupMenuItem } from '../blue_modules/showPopupMenu.android';
import { ToolTipMenuProps } from './types';
2024-05-18 22:04:52 -04:00
const dismissMenu = () => {
console.log('dismissMenu Not implemented');
};
2024-05-18 12:48:03 -04:00
const BaseToolTipMenu = (props: ToolTipMenuProps, ref: Ref<{ dismissMenu?: () => void }>) => {
const menuRef = useRef<View>(null);
const {
actions,
children,
onPressMenuItem,
isMenuPrimaryAction = false,
buttonStyle = {},
enableAndroidRipple = true,
disabled = false,
onPress,
...restProps
} = props;
2024-05-18 12:56:57 -04:00
const handleToolTipSelection = useCallback<OnPopupMenuItemSelect>(
(selection: PopupMenuItem) => {
if (selection.id) {
onPressMenuItem(selection.id);
}
},
[onPressMenuItem],
);
2024-05-18 12:48:03 -04:00
useEffect(() => {
2024-05-18 22:04:52 -04:00
// @ts-ignore: fix later
if (ref && ref.current) {
// @ts-ignore: fix later
ref.current.dismissMenu = dismissMenu;
2024-05-18 12:48:03 -04:00
}
}, [ref]);
2024-05-18 12:56:57 -04:00
const menuItems = useMemo(() => {
2024-05-18 12:48:03 -04:00
const menu: { id: string; label: string }[] = [];
actions.forEach(action => {
if (Array.isArray(action)) {
action.forEach(actionToMap => {
menu.push({ id: actionToMap.id.toString(), label: actionToMap.text });
});
} else {
menu.push({ id: action.id.toString(), label: action.text });
}
});
2024-05-18 12:56:57 -04:00
return menu;
}, [actions]);
2024-05-18 12:48:03 -04:00
2024-05-18 12:56:57 -04:00
const showMenu = useCallback(() => {
2024-05-18 22:04:52 -04:00
if (menuRef.current) {
showPopupMenu(menuItems, handleToolTipSelection, menuRef.current);
}
2024-05-18 12:56:57 -04:00
}, [menuItems, handleToolTipSelection]);
2024-05-18 12:48:03 -04:00
return (
<Pressable
{...(enableAndroidRipple ? { android_ripple: { color: 'lightgrey' } } : {})}
ref={menuRef}
disabled={disabled}
style={buttonStyle}
{...(isMenuPrimaryAction ? { onPress: showMenu } : { onPress, onLongPress: showMenu })}
{...restProps}
>
{children}
</Pressable>
);
};
const ToolTipMenu = forwardRef(BaseToolTipMenu);
export default ToolTipMenu;