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