import React, { useMemo, useCallback, memo } from 'react'
import { StyleSheet, View, Text, Animated, useWindowDimensions, TouchableHighlight } from 'react-native'
import { useDimensions } from '@/utils/hooks'
import Modal from './Modal'
import { useGetter } from '@/store'
// const menuItemHeight = 42
// const menuItemWidth = 100
const styles = StyleSheet.create({
menu: {
position: 'absolute',
borderWidth: StyleSheet.hairlineWidth,
borderColor: 'lightgray',
borderRadius: 2,
backgroundColor: 'white',
elevation: 1,
},
menuItem: {
paddingLeft: 10,
paddingRight: 10,
// height: menuItemHeight,
// width: menuItemWidth,
// alignItems: 'center',
justifyContent: 'center',
// backgroundColor: '#ccc',
},
menuText: {
// textAlign: 'center',
},
})
const Menu = ({
buttonPosition,
menus,
onPress = () => {},
longPress = () => {},
center = false,
hideMenu,
width = 100,
height = 42,
}) => {
const dimensions = useDimensions()
const theme = useGetter('common', 'theme')
// const fadeAnim = useRef(new Animated.Value(0)).current
// console.log(buttonPosition)
const screenSize = useMemo(() => {
const screenSize = {}
if (dimensions.window.height > dimensions.window.width) {
screenSize.height = dimensions.screen.height
screenSize.width = dimensions.screen.width
} else {
screenSize.height = dimensions.screen.width
screenSize.width = dimensions.screen.height
}
return screenSize
}, [dimensions])
const menuStyle = useMemo(() => {
let menuHeight = menus.length * height + 1
const topHeight = buttonPosition.y - 20
const bottomHeight = screenSize.height - buttonPosition.y - buttonPosition.h - 20
if (menuHeight > topHeight && menuHeight > bottomHeight) menuHeight = Math.max(topHeight, bottomHeight)
const menuWidth = width
const bottomSpace = screenSize.height - buttonPosition.y - buttonPosition.h - 20
const rightSpace = screenSize.width - buttonPosition.x - menuWidth - 20
const showInBottom = bottomSpace >= menuHeight
const showInRight = rightSpace >= menuWidth
const frameStyle = {
height: menuHeight,
top: showInBottom ? buttonPosition.y + buttonPosition.h : buttonPosition.y - menuHeight,
}
if (showInRight) {
frameStyle.left = buttonPosition.x
} else {
frameStyle.right = screenSize.width - buttonPosition.x - buttonPosition.w
}
return frameStyle
}, [screenSize, buttonPosition, menus, width, height])
const menuPress = useCallback((menu, index) => {
// if (menu.disabled) return
onPress(menu, index)
hideMenu()
}, [onPress, hideMenu])
const menuLongPress = useCallback((menu, index) => {
// if (menu.disabled) return
longPress(menu, index)
// hideMenu()
}, [longPress])
// console.log(menuStyle)
return (
true}>
{
menus.map((menu, index) => (
menu.disabled
? (
{menu.label}
)
: (
{ menuPress(menu, index) }}
onLongPress={() => { menuLongPress(menu, index) }}
>
{menu.label}
)
))
}
)
}
export default memo(({ visible, hideMenu, buttonPosition, menus, longPress, onPress, width, height }) => {
// console.log(visible)
return (
true}>
)
})