Files
TurboTrades/frontend/README.md
2026-01-10 04:57:43 +00:00

452 lines
10 KiB
Markdown

# TurboTrades Frontend
A modern, high-performance Vue 3 frontend for the TurboTrades marketplace, built with the Composition API, Pinia state management, and styled to match the skins.com aesthetic.
## 🚀 Features
- **Vue 3 + Composition API** - Modern Vue development with `<script setup>`
- **Pinia State Management** - Type-safe, intuitive state management
- **Vue Router** - Client-side routing with navigation guards
- **WebSocket Integration** - Real-time marketplace updates
- **Tailwind CSS** - Utility-first CSS framework with custom gaming theme
- **Axios** - HTTP client with interceptors for API calls
- **Toast Notifications** - Beautiful toast messages for user feedback
- **Responsive Design** - Mobile-first, works on all devices
- **Dark Theme** - Gaming-inspired dark mode design
- **Lucide Icons** - Beautiful, consistent icon system
## 📋 Prerequisites
- Node.js 18+
- npm or yarn
- Backend API running on `http://localhost:3000`
## 🛠️ Installation
1. **Navigate to the frontend directory**
```bash
cd TurboTrades/frontend
```
2. **Install dependencies**
```bash
npm install
```
3. **Create environment file (optional)**
```bash
cp .env.example .env
```
Edit `.env` if you need to customize:
```env
VITE_API_URL=http://localhost:3000
```
4. **Start development server**
```bash
npm run dev
```
The app will be available at `http://localhost:5173`
## 📁 Project Structure
```
frontend/
├── public/ # Static assets
├── src/
│ ├── assets/ # Stylesheets, images
│ │ └── main.css # Main CSS with Tailwind + custom styles
│ ├── components/ # Reusable Vue components
│ │ ├── NavBar.vue # Navigation bar with user menu
│ │ └── Footer.vue # Site footer
│ ├── composables/ # Reusable composition functions
│ ├── router/ # Vue Router configuration
│ │ └── index.js # Routes and navigation guards
│ ├── stores/ # Pinia stores
│ │ ├── auth.js # Authentication state
│ │ ├── market.js # Marketplace state
│ │ └── websocket.js # WebSocket connection state
│ ├── utils/ # Utility functions
│ │ └── axios.js # Axios instance with interceptors
│ ├── views/ # Page components
│ │ ├── HomePage.vue
│ │ ├── MarketPage.vue
│ │ ├── ItemDetailsPage.vue
│ │ ├── ProfilePage.vue
│ │ ├── InventoryPage.vue
│ │ └── ...
│ ├── App.vue # Root component
│ └── main.js # Application entry point
├── index.html # HTML entry point
├── package.json # Dependencies and scripts
├── tailwind.config.js # Tailwind configuration
├── vite.config.js # Vite configuration
└── README.md # This file
```
## 🎨 Design System
### Colors
```javascript
// Primary (Orange)
primary-500: #f58700
// Dark Backgrounds
dark-500: #0f1923
surface: #151d28
surface-light: #1a2332
surface-lighter: #1f2a3c
// Accent Colors
accent-blue: #3b82f6
accent-green: #10b981
accent-red: #ef4444
accent-yellow: #f59e0b
accent-purple: #8b5cf6
```
### Typography
- **Display Font**: Montserrat (headings)
- **Body Font**: Inter (body text)
### Components
Pre-built component classes available:
```html
<!-- Buttons -->
<button class="btn btn-primary">Primary Button</button>
<button class="btn btn-secondary">Secondary Button</button>
<button class="btn btn-outline">Outline Button</button>
<button class="btn btn-ghost">Ghost Button</button>
<!-- Cards -->
<div class="card">
<div class="card-body">
<!-- Content -->
</div>
</div>
<!-- Inputs -->
<input type="text" class="input" placeholder="Enter text">
<!-- Badges -->
<span class="badge badge-primary">Primary</span>
<span class="badge badge-success">Success</span>
```
## 🔌 API Integration
The frontend communicates with the backend via:
1. **REST API** - HTTP requests for CRUD operations
2. **WebSocket** - Real-time updates for marketplace
### Authentication Flow
```javascript
// Login (redirects to Steam OAuth)
authStore.login()
// Get current user
await authStore.fetchUser()
// Logout
await authStore.logout()
// Check authentication
if (authStore.isAuthenticated) {
// User is logged in
}
```
### Making API Calls
```javascript
import axios from 'axios'
// All requests automatically include credentials
const response = await axios.get('/api/market/items')
// Error handling is done automatically via interceptors
```
## 🌐 WebSocket Usage
```javascript
import { useWebSocketStore } from '@/stores/websocket'
const wsStore = useWebSocketStore()
// Connect
wsStore.connect()
// Listen for events
wsStore.on('price_update', (data) => {
console.log('Price updated:', data)
})
// Send message
wsStore.send({ type: 'ping' })
// Disconnect
wsStore.disconnect()
```
## 🗺️ Routes
| Path | Component | Auth Required | Description |
|------|-----------|---------------|-------------|
| `/` | HomePage | No | Landing page with featured items |
| `/market` | MarketPage | No | Browse marketplace |
| `/item/:id` | ItemDetailsPage | No | Item details and purchase |
| `/inventory` | InventoryPage | Yes | User's owned items |
| `/profile` | ProfilePage | Yes | User profile and settings |
| `/transactions` | TransactionsPage | Yes | Transaction history |
| `/sell` | SellPage | Yes | List items for sale |
| `/deposit` | DepositPage | Yes | Add funds |
| `/withdraw` | WithdrawPage | Yes | Withdraw funds |
| `/admin` | AdminPage | Admin | Admin dashboard |
| `/faq` | FAQPage | No | Frequently asked questions |
| `/support` | SupportPage | No | Support center |
## 🔐 Authentication Guards
Routes can be protected with meta fields:
```javascript
{
path: '/profile',
component: ProfilePage,
meta: {
requiresAuth: true, // Requires login
requiresAdmin: true, // Requires admin role
title: 'Profile' // Page title
}
}
```
## 🏪 Pinia Stores
### Auth Store (`useAuthStore`)
```javascript
const authStore = useAuthStore()
// State
authStore.user
authStore.isAuthenticated
authStore.balance
authStore.username
// Actions
await authStore.fetchUser()
authStore.login()
await authStore.logout()
await authStore.updateTradeUrl(url)
await authStore.updateEmail(email)
```
### Market Store (`useMarketStore`)
```javascript
const marketStore = useMarketStore()
// State
marketStore.items
marketStore.filters
marketStore.isLoading
// Actions
await marketStore.fetchItems()
await marketStore.purchaseItem(itemId)
await marketStore.listItem(itemData)
marketStore.updateFilter('search', 'AK-47')
marketStore.resetFilters()
```
### WebSocket Store (`useWebSocketStore`)
```javascript
const wsStore = useWebSocketStore()
// State
wsStore.isConnected
wsStore.connectionStatus
// Actions
wsStore.connect()
wsStore.disconnect()
wsStore.send(message)
wsStore.on(event, callback)
wsStore.off(event, callback)
```
## 🎯 Key Features
### Real-time Updates
The app automatically updates when:
- New items are listed
- Prices change
- Items are sold
- User balance changes
### Responsive Design
Breakpoints:
- Mobile: < 640px
- Tablet: 640px - 1024px
- Desktop: > 1024px
### Loading States
All data fetching operations show appropriate loading states:
- Skeleton loaders for initial load
- Spinners for actions
- Optimistic updates where appropriate
### Error Handling
Errors are automatically handled:
- Network errors show toast notifications
- 401 responses trigger token refresh or logout
- Form validation with inline error messages
## 🚀 Build & Deploy
### Development Build
```bash
npm run dev
```
### Production Build
```bash
npm run build
```
This creates an optimized build in the `dist` directory.
### Preview Production Build
```bash
npm run preview
```
### Deploy
The `dist` folder can be deployed to any static hosting service:
- **Netlify**: Drag & drop the `dist` folder
- **Vercel**: Connect your Git repository
- **GitHub Pages**: Use the `dist` folder
- **AWS S3**: Upload `dist` contents to S3 bucket
#### Environment Variables for Production
Create a `.env.production` file:
```env
VITE_API_URL=https://api.yourdomain.com
```
## 🧪 Development Tips
### Hot Module Replacement (HMR)
Vite provides instant HMR. Changes to your code will reflect immediately without full page reload.
### Vue DevTools
Install the Vue DevTools browser extension for easier debugging:
- Chrome: [Vue.js devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd)
- Firefox: [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/)
### VS Code Extensions
Recommended extensions:
- Volar (Vue Language Features)
- Tailwind CSS IntelliSense
- ESLint
- Prettier
## 📝 Customization
### Change Theme Colors
Edit `tailwind.config.js`:
```javascript
theme: {
extend: {
colors: {
primary: {
500: '#YOUR_COLOR',
},
},
},
}
```
### Add New Route
1. Create component in `src/views/`
2. Add route in `src/router/index.js`
3. Add navigation link in `NavBar.vue` or `Footer.vue`
### Add New Store
1. Create file in `src/stores/`
2. Define store with `defineStore`
3. Import and use in components
## 🐛 Troubleshooting
### WebSocket Not Connecting
- Check backend is running on port 3000
- Check browser console for errors
- Verify CORS settings in backend
### API Calls Failing
- Ensure backend is running
- Check network tab in browser DevTools
- Verify proxy settings in `vite.config.js`
### Styling Not Applied
- Restart dev server after Tailwind config changes
- Check for CSS class typos
- Verify Tailwind classes are in content paths
## 📄 License
ISC
## 🤝 Contributing
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request
## 📧 Support
For issues and questions:
- Create an issue on GitHub
- Email: support@turbotrades.com
- Discord: [Join our server](#)
## 🙏 Acknowledgments
- Design inspired by [skins.com](https://skins.com)
- Icons by [Lucide](https://lucide.dev)
- Built with [Vue 3](https://vuejs.org), [Vite](https://vitejs.dev), and [Tailwind CSS](https://tailwindcss.com)