all repos — caroster @ 6d34e82cb7b23a297cb314049eab1a599e50ffd7

[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      splittedUrl[localeParamIndex] = DEFAULT_LOCALE;
26      const withDefaultLocaleURL = splittedUrl.join('/');
27      // If navigator share capability
28      if (navigatorHasShareCapability) {
29        return await navigator.share({
30          title,
31          url: withDefaultLocaleURL,
32        });
33      }
34      // Else copy URL in clipboard
35      else if (navigatorHasClipboardCapability) {
36        await navigator.clipboard.writeText(withDefaultLocaleURL);
37        addToast(t('event.actions.copied'));
38        return true;
39      }
40      addToast(t('event.actions.noShareCapability'));
41    },
42  };
43};
44
45export default useShare;