189d2c67fSBartosz Kaszubowskiimport { css } from '@emotion/react'; 2f4b1168bSBartosz Kaszubowskiimport { Button, shadows, theme } from '@expo/styleguide'; 3*0a4db0c7SBartosz Kaszubowskiimport { spacing } from '@expo/styleguide-base'; 4f4b1168bSBartosz Kaszubowskiimport { SearchSmIcon } from '@expo/styleguide-icons'; 589d2c67fSBartosz Kaszubowskiimport { Dispatch, SetStateAction, useEffect, useState } from 'react'; 689d2c67fSBartosz Kaszubowski 789d2c67fSBartosz Kaszubowskiimport { isAppleDevice } from './utils'; 889d2c67fSBartosz Kaszubowski 989d2c67fSBartosz Kaszubowskiimport { CALLOUT, KBD } from '~/ui/components/Text'; 1089d2c67fSBartosz Kaszubowski 1189d2c67fSBartosz Kaszubowskitype Props = { 1289d2c67fSBartosz Kaszubowski setOpen: Dispatch<SetStateAction<boolean>>; 1389d2c67fSBartosz Kaszubowski}; 1489d2c67fSBartosz Kaszubowski 1589d2c67fSBartosz Kaszubowskiexport const CommandMenuTrigger = ({ setOpen }: Props) => { 1689d2c67fSBartosz Kaszubowski const [isMac, setIsMac] = useState<boolean | null>(null); 1789d2c67fSBartosz Kaszubowski 1889d2c67fSBartosz Kaszubowski useEffect(() => { 1989d2c67fSBartosz Kaszubowski setIsMac(typeof navigator !== 'undefined' && isAppleDevice()); 2089d2c67fSBartosz Kaszubowski }, []); 2189d2c67fSBartosz Kaszubowski 2289d2c67fSBartosz Kaszubowski useEffect(() => { 2389d2c67fSBartosz Kaszubowski if (isMac !== null) { 2489d2c67fSBartosz Kaszubowski const keyDownListener = (e: KeyboardEvent) => { 2589d2c67fSBartosz Kaszubowski if (e.key === 'k' && (isMac ? e.metaKey : e.ctrlKey)) { 2689d2c67fSBartosz Kaszubowski e.preventDefault(); 2789d2c67fSBartosz Kaszubowski setOpen(open => !open); 2889d2c67fSBartosz Kaszubowski } 2989d2c67fSBartosz Kaszubowski }; 3089d2c67fSBartosz Kaszubowski document.addEventListener('keydown', keyDownListener, false); 3189d2c67fSBartosz Kaszubowski return () => document.removeEventListener('keydown', keyDownListener); 3289d2c67fSBartosz Kaszubowski } 3389d2c67fSBartosz Kaszubowski }, [isMac]); 3489d2c67fSBartosz Kaszubowski 3589d2c67fSBartosz Kaszubowski return ( 36f4b1168bSBartosz Kaszubowski <Button theme="secondary" css={buttonStyle} onClick={() => setOpen(true)}> 37f4b1168bSBartosz Kaszubowski <SearchSmIcon /> 38*0a4db0c7SBartosz Kaszubowski <CALLOUT theme="secondary" crawlable={false}> 396d6fc3a5SBartosz Kaszubowski Search 406d6fc3a5SBartosz Kaszubowski </CALLOUT> 4189d2c67fSBartosz Kaszubowski {isMac !== null && ( 42*0a4db0c7SBartosz Kaszubowski <div className="ml-auto max-lg-gutters:hidden"> 4389d2c67fSBartosz Kaszubowski <KBD>{isMac ? '⌘' : 'Ctrl'}</KBD> <KBD>K</KBD> 4489d2c67fSBartosz Kaszubowski </div> 4589d2c67fSBartosz Kaszubowski )} 4689d2c67fSBartosz Kaszubowski </Button> 4789d2c67fSBartosz Kaszubowski ); 4889d2c67fSBartosz Kaszubowski}; 4989d2c67fSBartosz Kaszubowski 5089d2c67fSBartosz Kaszubowskiconst buttonStyle = css({ 5114c78e61SJon Samp backgroundColor: theme.background.default, 52f4b1168bSBartosz Kaszubowski padding: `0 ${spacing[3]}px 0 ${spacing[2.5]}px`, 5389d2c67fSBartosz Kaszubowski borderColor: theme.border.default, 5414c78e61SJon Samp boxShadow: shadows.xs, 5500f79093SBartosz Kaszubowski marginBottom: spacing[2.5], 56f4b1168bSBartosz Kaszubowski minHeight: spacing[10], 57f4b1168bSBartosz Kaszubowski display: 'flex', 5889d2c67fSBartosz Kaszubowski 5989d2c67fSBartosz Kaszubowski '&:focus': { 6014c78e61SJon Samp boxShadow: shadows.xs, 6189d2c67fSBartosz Kaszubowski }, 6289d2c67fSBartosz Kaszubowski 63f4b1168bSBartosz Kaszubowski '> span': { 6489d2c67fSBartosz Kaszubowski width: '100%', 65f4b1168bSBartosz Kaszubowski gap: spacing[2], 66f4b1168bSBartosz Kaszubowski alignItems: 'center', 6789d2c67fSBartosz Kaszubowski }, 6889d2c67fSBartosz Kaszubowski 6989d2c67fSBartosz Kaszubowski kbd: { 7089d2c67fSBartosz Kaszubowski height: 20, 7189d2c67fSBartosz Kaszubowski lineHeight: '19px', 7289d2c67fSBartosz Kaszubowski }, 7389d2c67fSBartosz Kaszubowski}); 74