import React, {useEffect, useRef, useState} from 'react'; import SignInModal from './SignInModal'; import SignUpModal from './SignUpModal'; // The sign in and sign up dialogs for every server-rendered link to either. // Nothing of its own is drawn: it listens for clicks on any // [data-auth-dialog="sign_in"] or [data-auth-dialog="sign_up"] link (the menu, // the home page's buttons) and opens that dialog over the page. The layout // mounts it once, for visitors who aren't signed in. // // The link's own href is the page for the same thing, so it stays the // fallback without JavaScript. export default function AuthDialog({urls, recaptcha_site_key: recaptchaSiteKey, site_name: siteName}) { const [opened, setOpened] = useState(null); // 'sign_in', 'sign_up' or null const open = useRef(null); open.current = setOpened; useEffect(() => { function onClick(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey) return; const trigger = event.target.closest('[data-auth-dialog]'); if (!trigger) return; event.preventDefault(); open.current(trigger.dataset.authDialog); } document.addEventListener('click', onClick); return () => document.removeEventListener('click', onClick); }, []); if (opened === 'sign_in') { return setOpened(null)} onSwitch={() => setOpened('sign_up')} />; } if (opened === 'sign_up') { return setOpened(null)} onSwitch={() => setOpened('sign_in')} />; } return null; }