Appearance
Developer Guide
Quick Start for Developers
Repository Setup
bash
git clone <repository-url>
cd acqmarketplace
pnpm install
cp .env.example .env
pnpm devEssential File Locations
- Routes:
src/components/routing/AppRoutes.tsx- Complete route map - Auth:
src/contexts/AuthContext.tsx- User authentication - API Client:
src/integrations/supabase/client.ts- Database connection - Types:
src/integrations/supabase/types.ts- Auto-generated from DB
Development Workflow
1. Adding a New Feature
bash
# 1. Create feature branch
git checkout -b feature/new-listing-filters
# 2. Add route in AppRoutes.tsx
# 3. Create page component in src/pages/
# 4. Add any required database changes via Supabase migrations
# 5. Create UI components in src/components/
# 6. Add TanStack Query hooks for data fetching2. Database Changes
bash
# Link to Supabase project
pnpm supabase:link
# Create migration
supabase migration new add_listing_filters
# Apply locally
supabase db reset
# Deploy to staging/production via Supabase dashboard3. Component Development
typescript
// Use shadcn/ui components
import { Button } from "@/components/ui/button"
import { Card } from "@/components/ui/card"
// Follow semantic token pattern
<div className="bg-background text-foreground border border-border">Code Conventions
File Naming
- Components: PascalCase (e.g.,
UserProfile.tsx) - Hooks: camelCase with
useprefix (e.g.,useListings.ts) - Pages: PascalCase (e.g.,
ListingDetail.tsx) - Types: PascalCase (e.g.,
Listing.ts)
Import Organization
typescript
// 1. React imports
import { useState, useEffect } from 'react'
// 2. Third-party libraries
import { useQuery } from '@tanstack/react-query'
// 3. Internal components/hooks
import { Button } from '@/components/ui/button'
import { useAuth } from '@/contexts/AuthContext'
// 4. Types
import type { Listing } from '@/types/database'State Management Patterns
typescript
// Server state: Use TanStack Query
const { data: listings, isLoading } = useQuery({
queryKey: ['listings', filters],
queryFn: () => fetchListings(filters)
})
// Form state: Use react-hook-form
const form = useForm({
resolver: zodResolver(schema),
defaultValues: { title: '', price: 0 }
})
// Global state: Use React Context
const { user } = useAuth()Common Tasks
Adding a New Route
- Add to AppRoutes.tsx:
typescript
<Route
path="/new-feature"
element={
<AppLayout>
<ProtectedRoute>
<NewFeaturePage />
</ProtectedRoute>
</AppLayout>
}
/>- Create page component:
typescript
// src/pages/NewFeaturePage.tsx
export default function NewFeaturePage() {
return (
<div className="container mx-auto p-6">
<h1>New Feature</h1>
</div>
)
}Creating API Hooks
typescript
// src/hooks/useListings.ts
export function useListings(filters = {}) {
return useQuery({
queryKey: ['listings', filters],
queryFn: async () => {
const { data, error } = await supabase
.from('listings')
.select('*')
.eq('status', 'active')
if (error) throw error
return data
}
})
}Debugging
React DevTools
- Install React DevTools browser extension
- Use Profiler for performance analysis
- Inspect TanStack Query cache
Console Debugging
typescript
// Use structured logging
console.log('🔍 User data:', { user, role, subscription })
// Debug queries
const query = useQuery({
queryKey: ['debug-data'],
queryFn: fetchData,
onSuccess: (data) => console.log('✅ Query success:', data),
onError: (error) => console.error('❌ Query error:', error)
})Network Monitoring
- Use browser DevTools Network tab
- Monitor Supabase requests in Console
- Check Edge Function logs in Supabase dashboard
Essential Documentation:
- Architecture Overview - System structure
- Database Schema - Data model
- UI Style Guide - Component patterns