diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml
index 350bf3256..fd5ea84e6 100644
--- a/.github/workflows/web.yml
+++ b/.github/workflows/web.yml
@@ -34,7 +34,7 @@ jobs:
- uses: pnpm/action-setup@v6
name: Install pnpm
with:
- version: 11
+ version: 11.11.0
- name: Install dependencies 📦
run: pnpm install
@@ -66,7 +66,7 @@ jobs:
- uses: pnpm/action-setup@v6
name: Install pnpm
with:
- version: 11
+ version: 11.11.0
- name: Install dependencies 📦
run: pnpm install
diff --git a/web/app/components/MessageThreadHeader.vue b/web/app/components/MessageThreadHeader.vue
index 6d13a7e20..1e1a81eb2 100644
--- a/web/app/components/MessageThreadHeader.vue
+++ b/web/app/components/MessageThreadHeader.vue
@@ -27,6 +27,7 @@ const phonesStore = usePhonesStore()
const threadsStore = useThreadsStore()
const appStore = useAppStore()
const notificationsStore = useNotificationsStore()
+const redirectPreferenceStore = useRedirectPreferenceStore()
const selectedMenuItem = ref(-1)
@@ -71,6 +72,7 @@ async function logout() {
authStore.resetState()
phonesStore.resetState()
threadsStore.resetState()
+ redirectPreferenceStore.resetState()
notificationsStore.addNotification({
type: 'info',
message: 'You have successfully logged out',
diff --git a/web/app/components/RedirectPromptPopover.vue b/web/app/components/RedirectPromptPopover.vue
new file mode 100644
index 000000000..859a71dac
--- /dev/null
+++ b/web/app/components/RedirectPromptPopover.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+ Skip this page next time?
+
+
+
+
+
+
+ Always open dashboard
+
+
+
+
+
+
+
diff --git a/web/app/layouts/website.vue b/web/app/layouts/website.vue
index 1aadb1b64..3b6565a5a 100644
--- a/web/app/layouts/website.vue
+++ b/web/app/layouts/website.vue
@@ -80,7 +80,11 @@ function goToPricing() {
Blog
For Free
-
- Dashboard
-
+
+ Dashboard
+
+
+
diff --git a/web/app/middleware/redirectToThreads.ts b/web/app/middleware/redirectToThreads.ts
new file mode 100644
index 000000000..a605286fb
--- /dev/null
+++ b/web/app/middleware/redirectToThreads.ts
@@ -0,0 +1,11 @@
+import { STORAGE_KEY } from '~/stores/redirectPreference'
+
+export default defineNuxtRouteMiddleware(() => {
+ try {
+ if (localStorage.getItem(STORAGE_KEY) === 'true') {
+ return navigateTo('/threads', { replace: true })
+ }
+ } catch (error) {
+ console.error(error)
+ }
+})
diff --git a/web/app/pages/index.vue b/web/app/pages/index.vue
index 524c6637b..9790b5e7f 100644
--- a/web/app/pages/index.vue
+++ b/web/app/pages/index.vue
@@ -28,6 +28,7 @@ import {
definePageMeta({
layout: 'website',
+ middleware: ['redirect-to-threads'],
})
useSeoMeta({
diff --git a/web/app/pages/settings/index.vue b/web/app/pages/settings/index.vue
index ea1752533..1f381416b 100644
--- a/web/app/pages/settings/index.vue
+++ b/web/app/pages/settings/index.vue
@@ -47,6 +47,7 @@ const authStore = useAuthStore()
const phonesStore = usePhonesStore()
const billingStore = useBillingStore()
const notificationsStore = useNotificationsStore()
+const redirectPreferenceStore = useRedirectPreferenceStore()
const firebaseUser = ref(null)
const gravatarUrl = ref(null)
@@ -773,6 +774,7 @@ async function deleteUserAccount() {
await signOut(auth)
authStore.resetState()
phonesStore.resetState()
+ redirectPreferenceStore.resetState()
notificationsStore.addNotification({
type: 'info',
message: 'You have successfully logged out',
diff --git a/web/app/stores/redirectPreference.ts b/web/app/stores/redirectPreference.ts
new file mode 100644
index 000000000..030def894
--- /dev/null
+++ b/web/app/stores/redirectPreference.ts
@@ -0,0 +1,47 @@
+import { defineStore } from 'pinia'
+import { ref } from 'vue'
+
+export const STORAGE_KEY = 'httpsms_redirect_to_threads'
+
+function readFlag(): boolean {
+ try {
+ return localStorage.getItem(STORAGE_KEY) === 'true'
+ } catch (error) {
+ console.error(error)
+ return false
+ }
+}
+
+export const useRedirectPreferenceStore = defineStore(
+ 'redirectPreference',
+ () => {
+ const enabled = ref(readFlag())
+ const dismissedThisSession = ref(false)
+
+ function enable() {
+ try {
+ localStorage.setItem(STORAGE_KEY, 'true')
+ enabled.value = true
+ navigateTo('/threads', { replace: true })
+ } catch (error) {
+ console.error(error)
+ }
+ }
+
+ function dismiss() {
+ dismissedThisSession.value = true
+ }
+
+ function resetState() {
+ enabled.value = false
+ dismissedThisSession.value = false
+ try {
+ localStorage.removeItem(STORAGE_KEY)
+ } catch (error) {
+ console.error(error)
+ }
+ }
+
+ return { enabled, dismissedThisSession, enable, dismiss, resetState }
+ },
+)