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;