189d2c67fSBartosz Kaszubowskiimport { css } from '@emotion/react'; 289d2c67fSBartosz Kaszubowskiimport { breakpoints, iconSize, SearchIcon, shadows, spacing, theme } from '@expo/styleguide'; 389d2c67fSBartosz Kaszubowskiimport { Dispatch, SetStateAction, useEffect, useState } from 'react'; 489d2c67fSBartosz Kaszubowski 589d2c67fSBartosz Kaszubowskiimport { isAppleDevice } from './utils'; 689d2c67fSBartosz Kaszubowski 789d2c67fSBartosz Kaszubowskiimport { Button } from '~/ui/components/Button'; 889d2c67fSBartosz Kaszubowskiimport { CALLOUT, KBD } from '~/ui/components/Text'; 989d2c67fSBartosz Kaszubowski 1089d2c67fSBartosz Kaszubowskitype Props = { 1189d2c67fSBartosz Kaszubowski setOpen: Dispatch<SetStateAction<boolean>>; 1289d2c67fSBartosz Kaszubowski}; 1389d2c67fSBartosz Kaszubowski 1489d2c67fSBartosz Kaszubowskiexport const CommandMenuTrigger = ({ setOpen }: Props) => { 1589d2c67fSBartosz Kaszubowski const [isMac, setIsMac] = useState<boolean | null>(null); 1689d2c67fSBartosz Kaszubowski 1789d2c67fSBartosz Kaszubowski useEffect(() => { 1889d2c67fSBartosz Kaszubowski setIsMac(typeof navigator !== 'undefined' && isAppleDevice()); 1989d2c67fSBartosz Kaszubowski }, []); 2089d2c67fSBartosz Kaszubowski 2189d2c67fSBartosz Kaszubowski useEffect(() => { 2289d2c67fSBartosz Kaszubowski if (isMac !== null) { 2389d2c67fSBartosz Kaszubowski const keyDownListener = (e: KeyboardEvent) => { 2489d2c67fSBartosz Kaszubowski if (e.key === 'k' && (isMac ? e.metaKey : e.ctrlKey)) { 2589d2c67fSBartosz Kaszubowski e.preventDefault(); 2689d2c67fSBartosz Kaszubowski setOpen(open => !open); 2789d2c67fSBartosz Kaszubowski } 2889d2c67fSBartosz Kaszubowski }; 2989d2c67fSBartosz Kaszubowski document.addEventListener('keydown', keyDownListener, false); 3089d2c67fSBartosz Kaszubowski return () => document.removeEventListener('keydown', keyDownListener); 3189d2c67fSBartosz Kaszubowski } 3289d2c67fSBartosz Kaszubowski }, [isMac]); 3389d2c67fSBartosz Kaszubowski 3489d2c67fSBartosz Kaszubowski return ( 3589d2c67fSBartosz Kaszubowski <Button theme="ghost" css={buttonStyle} onClick={() => setOpen(true)}> 36*00f79093SBartosz Kaszubowski <SearchIcon size={iconSize.sm} title="" /> 37*00f79093SBartosz Kaszubowski <CALLOUT css={labelStyle}>Search</CALLOUT> 3889d2c67fSBartosz Kaszubowski {isMac !== null && ( 3989d2c67fSBartosz Kaszubowski <div css={[keysWrapperStyle, hideOnMobileStyle]}> 4089d2c67fSBartosz Kaszubowski <KBD>{isMac ? '⌘' : 'Ctrl'}</KBD> <KBD>K</KBD> 4189d2c67fSBartosz Kaszubowski </div> 4289d2c67fSBartosz Kaszubowski )} 4389d2c67fSBartosz Kaszubowski </Button> 4489d2c67fSBartosz Kaszubowski ); 4589d2c67fSBartosz Kaszubowski}; 4689d2c67fSBartosz Kaszubowski 4789d2c67fSBartosz Kaszubowskiconst buttonStyle = css({ 4814c78e61SJon Samp backgroundColor: theme.background.default, 4989d2c67fSBartosz Kaszubowski padding: `0 ${spacing[3]}px`, 5089d2c67fSBartosz Kaszubowski borderColor: theme.border.default, 5114c78e61SJon Samp boxShadow: shadows.xs, 52*00f79093SBartosz Kaszubowski marginBottom: spacing[2.5], 5389d2c67fSBartosz Kaszubowski 5489d2c67fSBartosz Kaszubowski '&:focus': { 5514c78e61SJon Samp boxShadow: shadows.xs, 5689d2c67fSBartosz Kaszubowski }, 5789d2c67fSBartosz Kaszubowski 5889d2c67fSBartosz Kaszubowski '> div': { 5989d2c67fSBartosz Kaszubowski width: '100%', 6089d2c67fSBartosz Kaszubowski gap: spacing[2.5], 6189d2c67fSBartosz Kaszubowski }, 6289d2c67fSBartosz Kaszubowski 6389d2c67fSBartosz Kaszubowski kbd: { 6489d2c67fSBartosz Kaszubowski height: 20, 6589d2c67fSBartosz Kaszubowski lineHeight: '19px', 6689d2c67fSBartosz Kaszubowski }, 6789d2c67fSBartosz Kaszubowski}); 6889d2c67fSBartosz Kaszubowski 6989d2c67fSBartosz Kaszubowskiconst labelStyle = css({ 7089d2c67fSBartosz Kaszubowski color: theme.icon.secondary, 7189d2c67fSBartosz Kaszubowski}); 7289d2c67fSBartosz Kaszubowski 7389d2c67fSBartosz Kaszubowskiconst keysWrapperStyle = css({ 7489d2c67fSBartosz Kaszubowski marginLeft: 'auto', 7589d2c67fSBartosz Kaszubowski}); 7689d2c67fSBartosz Kaszubowski 7789d2c67fSBartosz Kaszubowskiconst hideOnMobileStyle = css({ 7889d2c67fSBartosz Kaszubowski [`@media screen and (max-width: ${breakpoints.medium}px)`]: { 7989d2c67fSBartosz Kaszubowski display: 'none', 8089d2c67fSBartosz Kaszubowski }, 8189d2c67fSBartosz Kaszubowski}); 82