# Project Structure Analysis: Vue.js Migration from Blade ## Overview The BukidBountyApp has been fully migrated from Blade templates to a **Vue 3 SPA (Single Page Application)** with Pinia for state management. --- ## 1. Application Architecture ### Entry Point (`resources/js/app.js`) - **Vue 3** app created with `createApp()` - **Pinia** state manager initialized via `createPinia()` - Auto-imports all Vue components from `./Pages/**/*.vue` (excluding Fragments) - Main layout structure: - `TopHeader` (fixed header at top) - `main-content` area for page routing - `BottomNav` (fixed bottom navigation bar) - `BaseModal` (global modal component) ### Key Components #### Layout Components | Component | Location | Description | |-----------|----------|-------------| | `TopHeader.vue` | Pages/Core/Fragments/ | Fixed header with back button, title, and settings action | | `BottomNav.vue` | Pages/Core/Fragments/ | Bottom navigation with Home, Cart, Properties links | | `BaseModal.vue` | Components/Core/BaseModal.vue | Global modal using Teleport to body | --- ## 2. Pinia Stores Usage ### Current Store: `resources/js/stores/network.js` The project currently has one Pinia store for network status management: ```javascript import { defineStore } from 'pinia' export const useNetworkStore = defineStore('network', { state: () => ({ isOnline: navigator.onLine, isLoading: false }), actions: { setOnline(status) { this.isOnline = status if (status) this.isLoading = false }, startLoading() { this.isLoading = true }, stopLoading() { this.isLoading = false } } }) ``` ### How to Use Pinia Stores in Components ```vue ``` ### Creating a New Store ```javascript // stores/example.js import { defineStore } from 'pinia' export const useExampleStore = defineStore('example', { state: () => ({ count: 0, items: [] }), getters: { doubledCount: (state) => state.count * 2 }, actions: { increment() { this.count++ }, addItem(item) { this.items.push(item) } } }) ``` Then use in component: ```vue ``` --- ## 3. Composables (Vue Composition API) ### Key Composables | Composable | Location | Purpose | |------------|----------|---------| | `useNavigate` | composables/Core/useNavigate.js | SPA navigation between pages | | `useModal` | composables/Core/useModal.js | Global modal management | | `useAuth` | composables/Core/useAuth.js | User authentication/role state | ### Navigation Pattern ```vue ``` ### Global `$navigate` Helper The app exposes `window.$navigateHelper` which can be accessed via: - In components: `this.$navigate` - Globally: `window.$navigateHelper({ page, props })` --- ## 4. Page Routing System ### How It Works 1. **Initial page** is defined in `index.html`: `data-page='{"component":"Home","props":{}}'` 2. Pages are auto-imported from `resources/js/Pages/` directory 3. Component names use dot notation (e.g., `Auth.Login`, `AccountSettings`) 4. URLs use path notation: `/`, `/login`, `/auth/login` ### Page File Structure ``` Pages/ ├── Home.vue → / ├── Auth/ │ └── Login.vue → /auth/login ├── AccountSettings.vue → /account/settings └── Market/ ├── ListProductsMarket.vue └── ViewStoreMarket.vue ``` --- ## 5. Dependencies ```json { "dependencies": { "vue": "^3.5.27", "pinia": "^3.0.4", "axios": "^1.13.2" }, "devDependencies": { "@vitejs/plugin-vue": "^6.0.3", "vite": "^7.3.1" } } ``` --- ## 6. Summary: How to Access Pinia Stores ### From a Vue Component (Composition API) ```vue ``` ### From a Composable or Setup Function ```javascript import { useNetworkStore } from '../stores/network' const network = useNetworkStore() // Now you can access the store's state and actions ``` ### Global Access (Not Recommended) ```javascript window.$networkStore = useNetworkStore() // Available if defined globally ``` --- ## Migration Notes The project has successfully migrated from Blade to Vue with: - ✅ SPA routing via `useNavigate` composable - ✅ Pinia for state management - ✅ Global modal system - ✅ Auto-imported page components - ✅ Browser history navigation (popstate support)