import { Box, Pressable, Text } from 'native-base'; import { StyleProp, ViewStyle } from 'react-native'; import { PianoKey, NoteNameBehavior, octaveKeys, keyToStr } from '../../models/Piano'; type PianoKeyProps = { pianoKey: PianoKey; showNoteName: NoteNameBehavior; bg: string; bgPressed: string; bgHovered: string; onKeyDown: () => void; onKeyUp: () => void; text: Parameters[0]; style: StyleProp; }; const isNoteVisible = ( noteNameBehavior: NoteNameBehavior, isPressed: boolean, isHovered: boolean ) => { if (noteNameBehavior === NoteNameBehavior.always) return true; if (noteNameBehavior === NoteNameBehavior.never) return false; if (noteNameBehavior === NoteNameBehavior.onpress) { return isPressed; } else if (noteNameBehavior === NoteNameBehavior.onhover) { return isHovered; } return false; }; const PianoKeyComp = ({ pianoKey, showNoteName, bg, bgPressed, bgHovered, onKeyDown, onKeyUp, text, style, }: PianoKeyProps) => { const textDefaultProps = { style: { userSelect: 'none', WebkitUserSelect: 'none', MozUserSelect: 'none', msUserSelect: 'none', }, fontSize: 'xl', color: 'black', } as Parameters[0]; const textProps = { ...textDefaultProps, ...text }; return ( {({ isHovered, isPressed }) => ( { if (isPressed) return bgPressed; if (isHovered) return bgHovered; return bg; })()} w="100%" h="100%" borderWidth="1px" borderColor="black" justifyContent="flex-end" alignItems="center" > {isNoteVisible(showNoteName, isPressed, isHovered) && ( {keyToStr(pianoKey, false)} )} )} ); }; PianoKeyComp.defaultProps = { key: octaveKeys[0], showNoteNames: NoteNameBehavior.onhover, keyBg: 'white', keyBgPressed: 'gray.200', keyBgHovered: 'gray.100', onKeyDown: () => {}, onKeyUp: () => {}, text: {}, style: {}, }; export default PianoKeyComp;