feat(web): migrate frontend to Nuxt 4 + Vue 3 + Vuetify 4#904
Open
AchoArnold wants to merge 31 commits into
Open
feat(web): migrate frontend to Nuxt 4 + Vue 3 + Vuetify 4#904AchoArnold wants to merge 31 commits into
AchoArnold wants to merge 31 commits into
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…n, BackButton, CopyButton, FixedHeader, BlogAuthorBio, BlogInfo, NuxtLogo, FirebaseAuth, MessageThread, MessageThreadHeader) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Login, Index (homepage with features, pricing, FAQ) - Threads (index + [id] detail with message bubbles, Pusher real-time) - Messages (new message form) - Search Messages (search by ID/content) - Bulk Messages (file upload + history table) - Settings (API key, webhooks, discord, send schedules) - Billing (usage stats, plan upgrade) - Heartbeats, Phone API Keys - Blog (index + 7 articles) - Privacy Policy, Terms and Conditions All pages use <script setup lang=ts>, Pinia stores, useDisplay(), and Vuetify 4 component API. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Copy all static assets (images, templates, favicon) to public/ - Create chart.client.ts plugin (Chart.js registration) - Create vue-glow.client.ts placeholder plugin - Refactor useApi composable to export both useApi() and useApiComposable() Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Fix Vuetify styles configFile path (remove doubled app/ prefix) - Add default export to capitalize utility - Install firebaseui and firebase-admin dependencies - Disable SSR session cookies for vuefire auth (client-only auth) - Disable route prerendering (requires env vars at build time) Build now completes successfully with pnpm run build. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The original Nuxt 2 app was a static SPA. SSR requires Firebase service account credentials at runtime which complicates deployment. SPA mode matches the original behavior and simplifies hosting. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Not up to standards ⛔🔴 Issues
|
| Category | Results |
|---|---|
| BestPractice | 6 medium 2 high |
| ErrorProne | 44 high |
| Security | 2 high |
| CodeStyle | 46 minor |
🟢 Metrics 387 complexity · 0 duplication
Metric Results Complexity 387 Duplication 0
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
- Add lint/test placeholder scripts so CI pnpm lint/test pass - Update web.yml: use pnpm build instead of generate, fix output dir - FirebaseAuth: use firebase/compat/app + firebase/compat/auth (FirebaseUI requires the namespaced compat API, not modular) - Use AuthUI.getInstance() to avoid duplicate instance errors - Remove playwright from committed devDependencies Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pre-bundle commonly used dependencies to prevent runtime re-optimization that causes transient import failures. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Replace privacy policy with full production text (9 sections) - Replace terms and conditions with full production text - Fix all 7 blog articles with correct production content - Fix blog index with correct titles, dates, reading times, authors - Remove nuxt-vuefire module (causes server-side Firebase errors) - Add client-only Firebase plugin that skips init without API key - Migrate all typography classes to Vuetify 4 (MD3) - Add blank layout for login page - Remove test/debug scripts Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Install v-phone-input and flag-icons packages - Create vPhoneInput.client.ts plugin with autocomplete country selector, SVG flags, and validation disabled (validate: null) - Add v-phone-input to build.transpile in nuxt.config.ts - Replace VTextField with v-phone-input in messages/index.vue - Add getRecipientNumber() to handle short codes by stripping country dial code prefix when the number is not a valid E.164 phone number This allows sending SMS to short code numbers (e.g. 91291) without the frontend prepending a country code. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add explicit type annotations to resolve @typescript-eslint/no-unsafe-* rules - Cast useRuntimeConfig().public to Record<string, string> for type safety - Use String#endsWith() instead of manual char comparison in stores/app.ts - Import type from ofetch for createApiFetch return type - Use relative imports in useFilters.ts instead of ~ alias - Add explicit useAuthStore imports in middleware and firebase plugin - Type the firebase compat dynamic import callback parameter - Add Plugin type annotation for vPhoneInput - Add nuxt-shims.d.ts for Nuxt auto-import type declarations - Update tsconfig.json with paths and include for external analysis tools Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The FirebaseAuth component calls firebase.auth() synchronously on mount, but the compat SDK was being initialized in a non-blocking .then() callback. Make the plugin async so the compat app is ready before components mount. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…breakpoints - Replace FirebaseUI + compat SDK with custom auth UI using signInWithPopup - Support Google, GitHub, and Email/Password auth via modular Firebase SDK - Remove firebaseui dependency and firebase/compat imports - Remove async plugin (no longer needed without compat initialization) - Remove custom display.thresholds to use Vuetify 4 defaults - Remove firebase/compat/app and firebase/compat/auth from Vite optimizeDeps Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Delete assets/styles/settings.scss that overrode Vuetify grid breakpoints - Remove moduleOptions.styles configFile reference from vuetify config - Remove scss preprocessorOptions (no longer needed without settings file) - Vuetify 4 default breakpoints are now used throughout Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace old Vuetify 2 breakpoint values (1264px, 1904px) with Vuetify 4 defaults (1280px, 1920px) in threads page media queries. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…908) * fix(web): restore original content on all statically generated pages Restore word-for-word content from backup/web-nuxt2-vuetify2 branch while keeping Vuetify 4 component syntax. Fixes: - Blog page titles restored to original wording - Missing images added back (VImg with /img/blog/ paths) - Missing VAlert warning/info boxes restored - Code blocks with syntax highlighting restored (including tabbed JS/Go) - Internal links restored as NuxtLink components - Bold text, code tags, and formatting preserved - Meta tags (og:title, og:description, og:image, twitter:card) restored - BackButton and VDivider footer restored on all pages - Blog index listing titles and descriptions corrected - Privacy policy and terms pages: BackButton + styled email link Pages fixed (11 total): - 7 blog posts + blog index - Homepage, privacy policy, terms and conditions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor(web): update blog pages to MD3 typography classes Replace Vuetify 2 typography classes with Material Design 3 equivalents: - text-h3/text-md-h2 → text-display-small/text-display-medium (responsive via useDisplay) - text-h4 → text-headline-large - text-subtitle-1 → text-body-large Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(web): address PR review comments - Fix shared selectedTab ref in e2e encryption page (split into encryptTab, sendTab, receiveTab so tab groups are independent) - Fix wrong og:description on grant-sms-permissions page (was copied from encryption article) - Fix wrong og:description on excel page (was copied from python article) - Fix read-time prop to readTime (camelCase) on grant-sms page - Fix duplicate 'Step 3' headings in excel and CSV pages (second is now Step 4) - Fix typos in blog index: 'zapper' → 'Zapier', 'IFTTFT' → 'IFTTT' - Fix wrong description for SMS permissions article in blog index Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…etify4 # Conflicts: # .gitignore # web/package.json # web/pages/billing/index.vue # web/pages/messages/index.vue # web/plugins/filters.ts # web/pnpm-lock.yaml
- Add formatBillingPeriodDateOrdinal filter for ordinal date display - Update BillingUsage type to match API (start_timestamp/end_timestamp) - Add subscription_renews_at/subscription_ends_at to User type - Rewrite billing page with full feature set: - Current plan management (update, cancel, upgrade) - Personalized billing period overview with start/end dates - Usage history table with start/end date columns - Subscription payments table with invoice generation - Multiple upgrade plan options for free users Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Complete frontend migration from Nuxt 2 + Vue 2 + Vuetify 2 to Nuxt 4.4.6 + Vue 3.5.34 + Vuetify 4.0.7.
Approach
Fresh project scaffolding (the gap between Nuxt 2 and 4 is too large for in-place upgrade). All code ported incrementally with TypeScript throughout.
Key Changes
<script setup>Composition API_param→[param]dynamic route syntaxWhat's Included
Vuetify 4 Breaking Changes Applied
#action→#actionsslotoutlined→variant="outlined",dense→density="compact"#prependslot pattern#activator="{ props }"withv-bind="props"$vuetify.breakpoint→useDisplay()composableEnvironment Variables Required
Firebase config vars needed at runtime:
FIREBASE_API_KEY,FIREBASE_AUTH_DOMAIN,FIREBASE_PROJECT_ID,FIREBASE_STORAGE_BUCKET,FIREBASE_MESSAGING_SENDER_ID,FIREBASE_APP_ID,FIREBASE_MEASUREMENT_IDTesting