diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 350bf325..fd5ea84e 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 6d13a7e2..1e1a81eb 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 00000000..b0af4c29 --- /dev/null +++ b/web/app/components/RedirectPromptPopover.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/web/app/layouts/website.vue b/web/app/layouts/website.vue index 1aadb1b6..bc644931 100644 --- a/web/app/layouts/website.vue +++ b/web/app/layouts/website.vue @@ -100,16 +100,21 @@ function goToPricing() { Get Started  For Free - - Dashboard - + + Dashboard + + + diff --git a/web/app/middleware/redirectToThreads.ts b/web/app/middleware/redirectToThreads.ts new file mode 100644 index 00000000..b9fd58b0 --- /dev/null +++ b/web/app/middleware/redirectToThreads.ts @@ -0,0 +1,9 @@ +export default defineNuxtRouteMiddleware(() => { + try { + if (localStorage.getItem('httpsms_redirect_to_threads') === '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 524c6637..9790b5e7 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 17e35c7c..9aa28d5f 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 00000000..020a76c0 --- /dev/null +++ b/web/app/stores/redirectPreference.ts @@ -0,0 +1,47 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' + +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() { + enabled.value = true + try { + localStorage.setItem(STORAGE_KEY, 'true') + } catch (error) { + console.error(error) + } + navigateTo('/threads', { replace: true }) + } + + 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 } + }, +)