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