all repos — caroster @ af77ff038286cd2975dbaf3140a13a1adc198379

[Octree] Group carpool to your event https://caroster.io

frontend/hooks/useShare.ts (view raw)

 1import {useTranslation} from 'react-i18next';
 2import {Enum_Userspermissionsuser_Lang as SupportedLocales} from '../generated/graphql';
 3import useToastStore from '../stores/useToastStore';
 4
 5const DEFAULT_LOCALE = process.env.DEFAULT_LOCALE || 'share';
 6
 7const navigatorHasShareCapability =
 8  typeof navigator !== 'undefined' && !!navigator.share;
 9const navigatorHasClipboardCapability =
10  typeof navigator !== 'undefined' && !!navigator.clipboard;
11
12const useShare = () => {
13  const {t} = useTranslation();
14  const addToast = useToastStore(s => s.addToast);
15
16  return {
17    navigatorHasShareCapability,
18    share: async ({title}) => {
19      const url = typeof window !== 'undefined' ? window.location.href : '';
20      if (!url || !title) return null;
21      const splittedUrl = url.split('/');
22      const localeParamIndex = splittedUrl.findIndex(
23        member => SupportedLocales[member]
24      );
25      const urlCopy = [...splittedUrl]
26      urlCopy[localeParamIndex] = DEFAULT_LOCALE;
27      const withDefaultLocaleURL = urlCopy.join('/');
28      // If navigator share capability
29      if (navigatorHasShareCapability) {
30        return await navigator.share({
31          title,
32          url: withDefaultLocaleURL,
33        });
34      }
35      // Else copy URL in clipboard
36      else if (navigatorHasClipboardCapability) {
37        await navigator.clipboard.writeText(withDefaultLocaleURL);
38        addToast(t('event.actions.copied'));
39        return true;
40      }
41      addToast(t('event.actions.noShareCapability'));
42    },
43  };
44};
45
46export default useShare;