Race condition: the axios 401 interceptor uses a dynamic import, so handleUnauthorized() fires AFTER doInitialize() sets isInitialized=true. handleUnauthorized() then reset isInitialized to false, leaving the app stuck on a loading spinner with no way to recover. Fix: remove isInitialized=false from handleUnauthorized() in all three apps. When handleUnauthorized() redirects via window.location.href, all JS state resets naturally. When it skips the redirect (already on a public page like /login), the app should render normally in an unauthenticated state. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Admin Dashboard
This folder will contain the Admin SPA using Vuexy Vue.
Setup
- Copy Vuexy Vue full-version (TypeScript) here:
cp -r /path/to/vuexy/typescript-version/full-version/* .
- Install dependencies:
pnpm install
- Create
.env.local:
VITE_API_URL=http://localhost:8000/api/v1
VITE_APP_NAME="Crewli Admin"
- Start development:
pnpm dev
Port
Runs on http://localhost:5173 (Vite default).
Production: point VITE_API_URL at your API, e.g. https://api.crewli.app/api/v1, with DNS/TLS for admin.crewli.app (and matching Laravel FRONTEND_ADMIN_URL / CORS / Sanctum settings — see repo README.md and api/.env.example).