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