about summary refs log tree commit diff
path: root/src/components/hooks
diff options
context:
space:
mode:
authorAlex Benzer <abenzer@users.noreply.github.com>2025-09-04 07:20:46 -0700
committerGitHub <noreply@github.com>2025-09-04 07:20:46 -0700
commit625b4e61dbf11c1d485bf8e8265df4d5af0c9657 (patch)
tree8d36b6564cb2b679269dea4b1fc3a8d3887d2fd2 /src/components/hooks
parent0b02d9d9a7ca33dab256a35e4fc9b8feabe20d34 (diff)
downloadvoidsky-625b4e61dbf11c1d485bf8e8265df4d5af0c9657.tar.zst
Welcome modal on logged-out homepage (#8944)
* Adds welcome modal to logged-out homepage

* Adds metrics and feature gate for welcome modal

* Slightly smaller text for mobile screens to avoid wrapping

* Remove unused SVG

* Adds text gradient and "X" close button

* Fix color on "Already have an account?" text

* tweak hooks, react import

* rm stylesheet

* use hardcoded colors

* add focus guards and scope

* no such thing as /home

* reduce spacign

* use css animations

* use session storage

* fix animation fill mode

* add a11y props

* Fix link/button color mismatch, reduce gap between buttons, show modal until user dismisses it

* Fix "Already have an account?" line left-aligning in small window sizes

* Adds "dismissed" and "presented" metric events

---------

Co-authored-by: Samuel Newman <mozzius@protonmail.com>
Diffstat (limited to 'src/components/hooks')
-rw-r--r--src/components/hooks/useWelcomeModal.native.ts3
-rw-r--r--src/components/hooks/useWelcomeModal.ts43
2 files changed, 46 insertions, 0 deletions
diff --git a/src/components/hooks/useWelcomeModal.native.ts b/src/components/hooks/useWelcomeModal.native.ts
new file mode 100644
index 000000000..f5bc1aa4e
--- /dev/null
+++ b/src/components/hooks/useWelcomeModal.native.ts
@@ -0,0 +1,3 @@
+export function useWelcomeModal() {
+  throw new Error('useWelcomeModal is web only')
+}
diff --git a/src/components/hooks/useWelcomeModal.ts b/src/components/hooks/useWelcomeModal.ts
new file mode 100644
index 000000000..7183f361e
--- /dev/null
+++ b/src/components/hooks/useWelcomeModal.ts
@@ -0,0 +1,43 @@
+import {useEffect, useState} from 'react'
+
+import {isWeb} from '#/platform/detection'
+import {useSession} from '#/state/session'
+
+export function useWelcomeModal() {
+  const {hasSession} = useSession()
+  const [isOpen, setIsOpen] = useState(false)
+
+  const open = () => setIsOpen(true)
+  const close = () => {
+    setIsOpen(false)
+    // Mark that user has actively closed the modal, don't show again this session
+    if (typeof window !== 'undefined') {
+      sessionStorage.setItem('welcomeModalClosed', 'true')
+    }
+  }
+
+  useEffect(() => {
+    // Only show modal if:
+    // 1. User is not logged in
+    // 2. We're on the web (this is a web-only feature)
+    // 3. We're on the homepage (path is '/' or '/home')
+    // 4. User hasn't actively closed the modal in this session
+    if (isWeb && !hasSession && typeof window !== 'undefined') {
+      const currentPath = window.location.pathname
+      const isHomePage = currentPath === '/'
+      const hasUserClosedModal =
+        sessionStorage.getItem('welcomeModalClosed') === 'true'
+
+      if (isHomePage && !hasUserClosedModal) {
+        // Small delay to ensure the page has loaded
+        const timer = setTimeout(() => {
+          open()
+        }, 1000)
+
+        return () => clearTimeout(timer)
+      }
+    }
+  }, [hasSession])
+
+  return {isOpen, open, close}
+}