1*89d2c67fSBartosz Kaszubowskiimport { css } from '@emotion/react'; 2*89d2c67fSBartosz Kaszubowskiimport { breakpoints, iconSize, SearchIcon, shadows, spacing, theme } from '@expo/styleguide'; 3*89d2c67fSBartosz Kaszubowskiimport { Dispatch, SetStateAction, useEffect, useState } from 'react'; 4*89d2c67fSBartosz Kaszubowski 5*89d2c67fSBartosz Kaszubowskiimport { isAppleDevice } from './utils'; 6*89d2c67fSBartosz Kaszubowski 7*89d2c67fSBartosz Kaszubowskiimport { Button } from '~/ui/components/Button'; 8*89d2c67fSBartosz Kaszubowskiimport { CALLOUT, KBD } from '~/ui/components/Text'; 9*89d2c67fSBartosz Kaszubowski 10*89d2c67fSBartosz Kaszubowskitype Props = { 11*89d2c67fSBartosz Kaszubowski setOpen: Dispatch<SetStateAction<boolean>>; 12*89d2c67fSBartosz Kaszubowski}; 13*89d2c67fSBartosz Kaszubowski 14*89d2c67fSBartosz Kaszubowskiexport const CommandMenuTrigger = ({ setOpen }: Props) => { 15*89d2c67fSBartosz Kaszubowski const [isMac, setIsMac] = useState<boolean | null>(null); 16*89d2c67fSBartosz Kaszubowski 17*89d2c67fSBartosz Kaszubowski useEffect(() => { 18*89d2c67fSBartosz Kaszubowski setIsMac(typeof navigator !== 'undefined' && isAppleDevice()); 19*89d2c67fSBartosz Kaszubowski }, []); 20*89d2c67fSBartosz Kaszubowski 21*89d2c67fSBartosz Kaszubowski useEffect(() => { 22*89d2c67fSBartosz Kaszubowski if (isMac !== null) { 23*89d2c67fSBartosz Kaszubowski const keyDownListener = (e: KeyboardEvent) => { 24*89d2c67fSBartosz Kaszubowski if (e.key === 'k' && (isMac ? e.metaKey : e.ctrlKey)) { 25*89d2c67fSBartosz Kaszubowski e.preventDefault(); 26*89d2c67fSBartosz Kaszubowski setOpen(open => !open); 27*89d2c67fSBartosz Kaszubowski } 28*89d2c67fSBartosz Kaszubowski }; 29*89d2c67fSBartosz Kaszubowski document.addEventListener('keydown', keyDownListener, false); 30*89d2c67fSBartosz Kaszubowski return () => document.removeEventListener('keydown', keyDownListener); 31*89d2c67fSBartosz Kaszubowski } 32*89d2c67fSBartosz Kaszubowski }, [isMac]); 33*89d2c67fSBartosz Kaszubowski 34*89d2c67fSBartosz Kaszubowski return ( 35*89d2c67fSBartosz Kaszubowski <Button theme="ghost" css={buttonStyle} onClick={() => setOpen(true)}> 36*89d2c67fSBartosz Kaszubowski <SearchIcon size={iconSize.small} /> 37*89d2c67fSBartosz Kaszubowski <CALLOUT css={[labelStyle, hideOnMobileStyle]}>Search</CALLOUT> 38*89d2c67fSBartosz Kaszubowski {isMac !== null && ( 39*89d2c67fSBartosz Kaszubowski <div css={[keysWrapperStyle, hideOnMobileStyle]}> 40*89d2c67fSBartosz Kaszubowski <KBD>{isMac ? '⌘' : 'Ctrl'}</KBD> <KBD>K</KBD> 41*89d2c67fSBartosz Kaszubowski </div> 42*89d2c67fSBartosz Kaszubowski )} 43*89d2c67fSBartosz Kaszubowski </Button> 44*89d2c67fSBartosz Kaszubowski ); 45*89d2c67fSBartosz Kaszubowski}; 46*89d2c67fSBartosz Kaszubowski 47*89d2c67fSBartosz Kaszubowskiconst buttonStyle = css({ 48*89d2c67fSBartosz Kaszubowski width: '20vw', 49*89d2c67fSBartosz Kaszubowski minWidth: 240, 50*89d2c67fSBartosz Kaszubowski maxWidth: 320, 51*89d2c67fSBartosz Kaszubowski padding: `0 ${spacing[3]}px`, 52*89d2c67fSBartosz Kaszubowski borderColor: theme.border.default, 53*89d2c67fSBartosz Kaszubowski boxShadow: shadows.input, 54*89d2c67fSBartosz Kaszubowski marginRight: spacing[3], 55*89d2c67fSBartosz Kaszubowski 56*89d2c67fSBartosz Kaszubowski '&:focus': { 57*89d2c67fSBartosz Kaszubowski boxShadow: shadows.button, 58*89d2c67fSBartosz Kaszubowski }, 59*89d2c67fSBartosz Kaszubowski 60*89d2c67fSBartosz Kaszubowski '> div': { 61*89d2c67fSBartosz Kaszubowski width: '100%', 62*89d2c67fSBartosz Kaszubowski gap: spacing[2.5], 63*89d2c67fSBartosz Kaszubowski }, 64*89d2c67fSBartosz Kaszubowski 65*89d2c67fSBartosz Kaszubowski kbd: { 66*89d2c67fSBartosz Kaszubowski height: 20, 67*89d2c67fSBartosz Kaszubowski lineHeight: '19px', 68*89d2c67fSBartosz Kaszubowski }, 69*89d2c67fSBartosz Kaszubowski 70*89d2c67fSBartosz Kaszubowski [`@media screen and (max-width: ${breakpoints.medium}px)`]: { 71*89d2c67fSBartosz Kaszubowski minWidth: 42, 72*89d2c67fSBartosz Kaszubowski width: 42, 73*89d2c67fSBartosz Kaszubowski marginRight: 0, 74*89d2c67fSBartosz Kaszubowski }, 75*89d2c67fSBartosz Kaszubowski}); 76*89d2c67fSBartosz Kaszubowski 77*89d2c67fSBartosz Kaszubowskiconst labelStyle = css({ 78*89d2c67fSBartosz Kaszubowski color: theme.icon.secondary, 79*89d2c67fSBartosz Kaszubowski}); 80*89d2c67fSBartosz Kaszubowski 81*89d2c67fSBartosz Kaszubowskiconst keysWrapperStyle = css({ 82*89d2c67fSBartosz Kaszubowski marginLeft: 'auto', 83*89d2c67fSBartosz Kaszubowski}); 84*89d2c67fSBartosz Kaszubowski 85*89d2c67fSBartosz Kaszubowskiconst hideOnMobileStyle = css({ 86*89d2c67fSBartosz Kaszubowski [`@media screen and (max-width: ${breakpoints.medium}px)`]: { 87*89d2c67fSBartosz Kaszubowski display: 'none', 88*89d2c67fSBartosz Kaszubowski }, 89*89d2c67fSBartosz Kaszubowski}); 90