Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
cc1e3ca
feat(testing): modularize test credentials and update to standardized…
JacksonR64 Jun 20, 2025
bd086f0
feat(e2e): improve authentication flow stability and timeout handling
JacksonR64 Jun 20, 2025
d3ec95c
feat(e2e): add comprehensive test isolation for parallel execution
JacksonR64 Jun 20, 2025
448e35c
fix(e2e): improve auth state persistence and fix analytics API errors
JacksonR64 Jun 20, 2025
633c7d6
feat(mobile): implement always-visible profile navigation and fix Mob…
JacksonR64 Jun 20, 2025
83f7192
fix: resolve CI preparation issues for GitHub PR readiness
JacksonR64 Jun 20, 2025
dcfbb93
feat: optimize e2e testing with mobile nav fixes and timeout improvem…
JacksonR64 Jun 20, 2025
bf99e44
fix(e2e): improve mobile test detection using project name
JacksonR64 Jun 20, 2025
a696486
fix(logging): clean up verbose debug output and improve error handling
JacksonR64 Jun 20, 2025
52290ce
fix(build): suppress Supabase realtime warnings in webpack config
JacksonR64 Jun 20, 2025
ed7a05a
docs: update URLs to production domain and enhance testing documentation
JacksonR64 Jun 20, 2025
ea110ab
fix(lint): resolve ESLint errors in e2e test files
JacksonR64 Jun 20, 2025
fcb2031
fix(typescript): resolve error.message type errors in catch blocks
JacksonR64 Jun 20, 2025
0d1efe4
fix(eslint): ignore Node.js script files with require() imports
JacksonR64 Jun 20, 2025
1207b6d
feat(ci): add comprehensive local CI verification script
JacksonR64 Jun 20, 2025
98f51ae
fix: resolve favicon aspect ratio, RSVP functionality, and analytics …
JacksonR64 Jun 20, 2025
5af56c3
fix: resolve NaN pricing issues in checkout and ticket selection
JacksonR64 Jun 20, 2025
cbba691
fix: update Stripe processing fees to accurate 2.9% + $0.30 rate
JacksonR64 Jun 20, 2025
5b866e2
fix: resolve ESLint warnings in main codebase
JacksonR64 Jun 20, 2025
5789634
fix: eliminate all remaining ESLint warnings in TypeScript files
JacksonR64 Jun 20, 2025
f48dea2
fix: remove development test scripts to eliminate final ESLint warnings
JacksonR64 Jun 20, 2025
e576c3c
feat: implement comprehensive UX improvements and search enhancements
JacksonR64 Jun 20, 2025
7e34ddd
Merge main into feat/bug-fixes-and-improvements
JacksonR64 Jun 20, 2025
939daa1
fix: resolve ESLint warning in test credentials config
JacksonR64 Jun 20, 2025
bd34a2d
fix: exclude deleted files from ESLint checks in CI workflows
JacksonR64 Jun 20, 2025
b13827e
fix: standardize card padding and add inner rounded boxes for consist…
JacksonR64 Jun 20, 2025
d86a548
fix: improve dark mode and mobile responsiveness for My Events cards
JacksonR64 Jun 20, 2025
825b937
feat: enhance RSVP cards with smart badges and collapsible past events
JacksonR64 Jun 20, 2025
bce2955
feat: create modular badge system and enhance dashboard UX
JacksonR64 Jun 20, 2025
016cc04
feat: comprehensive refund system implementation with E2E test suite
JacksonR64 Jun 21, 2025
e9fac1e
fix: resolve all TypeScript and ESLint errors in E2E test suite
JacksonR64 Jun 21, 2025
4fb602c
feat: unify search functionality and fix compact search bar animations
JacksonR64 Jun 22, 2025
191c560
fix: resolve nested button HTML error in CategoryFilter
JacksonR64 Jun 22, 2025
81c3b87
fix: enhance search functionality and resolve ESLint warnings
JacksonR64 Jun 24, 2025
df9fac3
fix: resolve infinite re-render loop in HomePageClient useEffect
JacksonR64 Jun 24, 2025
263658d
fix: resolve infinite loop in usePagination hook
JacksonR64 Jun 24, 2025
d7d445e
fix: resolve infinite re-render loop by removing problematic persiste…
JacksonR64 Jun 24, 2025
b028c17
feat: implement persistent search results functionality
JacksonR64 Jun 24, 2025
397bd9c
fix: create modular section spacing system and enhance animations
JacksonR64 Jun 24, 2025
95768ea
fix: improve section spacing, iOS Safari handling, and animation timing
JacksonR64 Jun 24, 2025
700992e
feat: enhance UI components with animations and mobile improvements
JacksonR64 Jun 24, 2025
a6f371a
fix: remove SearchProvider wrapper from layout after search extraction
JacksonR64 Jun 24, 2025
3297361
fix: add proper top spacing for fixed navigation bar
JacksonR64 Jun 24, 2025
bbf2841
feat: enhance past events display with reverse chronological order
JacksonR64 Jun 24, 2025
a641982
fix: perfect center alignment for mobile admin badge icon
JacksonR64 Jun 24, 2025
5085f6e
feat: simplify mobile admin badge to icon-only when collapsed
JacksonR64 Jun 24, 2025
22f3839
feat: add Google and Apple brand icons to sign-in page
JacksonR64 Jun 24, 2025
45f0e05
fix: show Apple logo always and move message to hover-only
JacksonR64 Jun 25, 2025
9502a70
feat: add custom hover tooltip for disabled Apple sign-in button
JacksonR64 Jun 25, 2025
cf14b84
feat: transform debug button into dynamic Apple message display
JacksonR64 Jun 25, 2025
1a0f531
fix: resolve final console warnings and Image component aspect ratio
JacksonR64 Jun 25, 2025
e771709
fix: implement capacity-aware ticket availability display
JacksonR64 Jun 26, 2025
fcec47e
fix: enhance form accessibility and calendar integration
JacksonR64 Jun 26, 2025
fd82a67
feat: restore improved refund dialog with enhanced dark mode support
JacksonR64 Jun 26, 2025
0cb8091
feat: restore lite modal styling with backdrop blur and transparency
JacksonR64 Jun 26, 2025
e494024
feat: convert RefundDialog to use LightweightModal component
JacksonR64 Jun 26, 2025
0b32a56
fix: improve refund button styling and modal readability
JacksonR64 Jun 26, 2025
4980ffd
fix: improve modal text readability and enable background scrolling
JacksonR64 Jun 26, 2025
8699438
fix: remove yellow/orange urgency borders from event cards and add So…
JacksonR64 Jun 26, 2025
6eb546c
feat: implement functional staff dashboard quick action buttons
JacksonR64 Jun 26, 2025
36e2e36
fix: improve staff dashboard display for free vs paid events
JacksonR64 Jun 26, 2025
e237eb0
feat: implement smart event sorting in staff dashboard
JacksonR64 Jun 26, 2025
20a4a9d
fix: correct conditional logic for paid vs free event display
JacksonR64 Jun 26, 2025
996597e
feat: redesign staff dashboard event card layout with top-right badges
JacksonR64 Jun 26, 2025
50e93ad
feat: create modular badge system with consistent styling across app
JacksonR64 Jun 26, 2025
264a350
feat: implement URL-based tab navigation for staff dashboard
JacksonR64 Jun 26, 2025
bb8d583
fix: resolve ticket purchasing system issues and migrate to database
JacksonR64 Jun 26, 2025
22abd22
feat: enhance event card layout and improve ticket count accuracy
JacksonR64 Jun 26, 2025
5932bf4
security: fix critical authentication vulnerabilities and enhance UX
JacksonR64 Jun 26, 2025
1285e94
fix: resolve Stripe telemetry fetch failures with proper CSP configur…
JacksonR64 Jun 26, 2025
534547a
fix: resolve remaining console errors with targeted CSP and dev-only …
JacksonR64 Jun 26, 2025
1b15d9b
fix: resolve Stripe Elements clientSecret mutation warning
JacksonR64 Jun 26, 2025
fb44b31
fix: resolve stale authentication redirect loop issue
JacksonR64 Jun 26, 2025
6ef1592
fix: add Supabase URL to Content Security Policy
JacksonR64 Jun 26, 2025
25c7948
fix: add complete Stripe telemetry endpoints to CSP
JacksonR64 Jun 26, 2025
07acf17
feat: implement PayPal payment success redirect handling
JacksonR64 Jun 26, 2025
a86b7c2
fix: improve DevOnlyErrorFilter to suppress expected 401 errors
JacksonR64 Jun 26, 2025
2a9861f
fix: prevent Google Calendar API calls for unauthenticated users
JacksonR64 Jun 26, 2025
ff1ee99
docs: enhance DevOnlyErrorFilter for third-party library warnings
JacksonR64 Jun 26, 2025
0c21284
feat: implement payment success auto-scroll and improve console viola…
JacksonR64 Jun 26, 2025
bd06d5e
fix: implement default-passive-events library to resolve passive even…
JacksonR64 Jun 26, 2025
b3cbda9
refactor: clean up passive event listener fix attempts and document u…
JacksonR64 Jun 26, 2025
51408a9
feat: improve dark mode UI for Stripe checkout and event map components
JacksonR64 Jun 26, 2025
551cd23
feat: implement lightweight modern loading indicator system
JacksonR64 Jun 26, 2025
9ba50f7
fix: resolve button overflow and improve dark mode UX
JacksonR64 Jun 26, 2025
bc76e1a
feat: implement comprehensive payment success anchor navigation and r…
JacksonR64 Jun 27, 2025
0b58c62
feat: implement modular card system with SOLID principles
JacksonR64 Jun 27, 2025
41844c5
refactor: cleanup debug logs and fix Stripe appearance configuration
JacksonR64 Jun 27, 2025
b865dfd
feat: add destructive-outline button variant and migrate RSVP card to…
JacksonR64 Jun 27, 2025
8be8020
fix: resolve Stripe appearance API console warnings
JacksonR64 Jun 27, 2025
2cbff69
fix: resolve Stripe appearance API warnings and enhance console filte…
JacksonR64 Jun 27, 2025
f1d6b49
fix: enhance Stripe console warning suppression with exact pattern ma…
JacksonR64 Jun 27, 2025
ed9dffa
fix: correct logo aspect ratio in Navigation component
JacksonR64 Jun 27, 2025
3c226a8
fix: address Lighthouse performance and security issues
JacksonR64 Jun 27, 2025
1320b4f
fix: reduce gap between logo and text in navigation
JacksonR64 Jun 27, 2025
2e60bd9
fix: optimize logo spacing with CSS object positioning
JacksonR64 Jun 27, 2025
58366bf
fix: crop logo to eliminate excessive whitespace using container appr…
JacksonR64 Jun 27, 2025
01f5951
fix: adjust logo container width to maintain full logo size
JacksonR64 Jun 27, 2025
ed379ec
fix: optimize logo SVG viewBox to eliminate excessive whitespace
JacksonR64 Jun 27, 2025
d9e1fce
fix: aggressively crop SVG viewBox to eliminate all logo whitespace
JacksonR64 Jun 27, 2025
7ee7d63
feat: improve logo design and navigation UX
JacksonR64 Jun 27, 2025
21967c9
refactor: improve responsive navigation design for tablet viewports
JacksonR64 Jun 27, 2025
fd14199
refactor: simplify ProfileDropdown to icon-only design
JacksonR64 Jun 27, 2025
bb0b621
fix: simplify ProfileDropdown positioning and update disconnect icon
JacksonR64 Jun 27, 2025
c0d9f95
feat: improve event card consistency and UX enhancements
JacksonR64 Jun 27, 2025
818d22b
perf: optimize development environment bundle size and webpack config…
JacksonR64 Jun 27, 2025
8e04b7c
chore: remove Claude AI files from git tracking and enhance .gitignore
JacksonR64 Jun 27, 2025
4ed107f
fix: resolve ESLint errors for clean CI build
JacksonR64 Jun 27, 2025
d801dfd
fix: resolve Next.js config warnings and improve build reliability
JacksonR64 Jun 27, 2025
314487a
fix: resolve ESLint and E2E test CI failures
JacksonR64 Jun 27, 2025
1455c06
feat: add consistent shadows to all event cards
JacksonR64 Jun 27, 2025
cc05cb5
fix: resolve console errors and improve Lighthouse score
JacksonR64 Jun 27, 2025
96163bc
fix: comprehensive console error resolution for preview deployments
JacksonR64 Jun 27, 2025
b4d0af9
fix: resolve React hydration mismatch errors (error #418)
JacksonR64 Jun 27, 2025
f001889
fix: resolve React Error #418 hydration mismatches with comprehensive…
JacksonR64 Jun 27, 2025
5e5ef20
fix: implement proper browser extension cleanup for hydration errors
JacksonR64 Jun 27, 2025
baf6947
fix: resolve React Error #418 and feedback.js console errors for perf…
JacksonR64 Jun 27, 2025
69361ac
fix: remove Vercel Analytics import causing build failure
JacksonR64 Jun 27, 2025
fd5cbb0
fix: resolve React Error #418 and feedback.js console errors completely
JacksonR64 Jun 27, 2025
d5d6665
fix: resolve React Error #418 hydration mismatches and Vercel toolbar…
JacksonR64 Jun 27, 2025
9b62073
fix: eliminate all React Error #418 hydration mismatches with compreh…
JacksonR64 Jun 27, 2025
f27afb9
fix: resolve 401 Unauthorized error on /api/manifest endpoint
JacksonR64 Jun 27, 2025
5581fc9
fix: resolve ESLint error in ClientDate component for CI compliance
JacksonR64 Jun 27, 2025
cd9ea75
fix: resolve middleware pattern to exclude API routes from auth
JacksonR64 Jun 27, 2025
2604d3d
fix: resolve SEO issue by explicitly allowing search engine indexing
JacksonR64 Jun 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/pr-quick-feedback.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ jobs:

- name: 🔍 Lint changed files only
run: |
# Get changed files
CHANGED_FILES=$(git diff --name-only origin/main...HEAD -- '*.ts' '*.tsx' '*.js' '*.jsx' | xargs)
# Get changed files (exclude deleted files)
CHANGED_FILES=$(git diff --name-only --diff-filter=d origin/main...HEAD -- '*.ts' '*.tsx' '*.js' '*.jsx' | xargs)
if [ ! -z "$CHANGED_FILES" ]; then
echo "Linting changed files: $CHANGED_FILES"
npx eslint $CHANGED_FILES
Expand Down
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,13 @@ lighthouse-report/
.env.test.local
.env.production.local
settings.local.json

# Claude AI assistant files (keep local only)
.claude/
claude/
*.claude.md
CLAUDE*.md
claude.*.md

# ESLint cache
.eslintcache
Expand Down
19 changes: 17 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,19 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Development Commands

### Core Development
- `npm run dev` - Start development server
- `claude run tmux-dev` - Start development server in tmux with Stripe webhooks (recommended)
- `npm run dev:with-stripe` - Start development server with Stripe webhooks
- `npm run dev` - Start development server (basic, no Stripe)
- `npm run build` - Production build with type checking
- `npm run lint` - ESLint checking
- `npm run type-check` - TypeScript validation

**🔄 After Code Changes:**
1. **Always restart dev server** before testing: `claude run tmux-dev` (kills old session, starts fresh with Stripe)
2. Verify changes are reflected on localhost:3000
3. Check tmux logs for any startup errors
4. Ensure Stripe webhooks are working (important for payments)

### 🔍 Local CI Verification (CRITICAL for avoiding CI failures)
- `npm run ci:local` - **Run this before every commit/push** - Comprehensive local CI check that matches GitHub Actions exactly
- `npm run ci:lint` - Quick lint + type check only
Expand All @@ -29,6 +37,13 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
- Same ESLint rules and TypeScript config as CI
- Tests run in CI mode (`--ci --coverage --watchAll=false`)

### Browser Tools (AgentDeskAI MCP)
**Before using browser automation tools, run the global command:**
```bash
# Start browser tools server (global command)
claude run browser-tools-start
```

### Testing Suite
- `npm test` - Unit tests with Jest
- `npm run test:ci` - CI testing with coverage
Expand Down Expand Up @@ -198,6 +213,6 @@ Required environment variables:

### Deployment
- **Platform**: Vercel with auto-deployment on main branch
- **Live URL**: https://local-loop-qa.vercel.app
- **Live URL**: https://localloopevents.xyz/
- **CI/CD**: 6 active GitHub workflows including performance testing and monitoring
- **Database backups**: Automated daily backups configured
4 changes: 2 additions & 2 deletions app/about/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,10 @@ export default function AboutPage() {
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<Link
href="/staff"
href="/auth/signup"
className="bg-blue-600 text-white px-6 py-3 rounded-lg hover:bg-blue-700 transition-colors"
>
Create Your First Event
Create Account
</Link>
<Link
href="/"
Expand Down
23 changes: 22 additions & 1 deletion app/api/analytics/performance/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,28 @@ export async function POST(request: NextRequest) {
return NextResponse.json({ error: 'Empty request body' }, { status: 400 })
}

const data: MetricData = await request.json()
// Safely parse JSON with better error handling
let data: MetricData
try {
const text = await request.text()
if (!text || text.trim() === '') {
return NextResponse.json({ error: 'Empty request body' }, { status: 400 })
}
data = JSON.parse(text)
} catch (jsonError) {
console.error('JSON parsing error:', jsonError)
return NextResponse.json({ error: 'Invalid JSON format' }, { status: 400 })
}

// Validate that data is an object
if (!data || typeof data !== 'object') {
return NextResponse.json({ error: 'Invalid data format' }, { status: 400 })
}

// Basic validation for required fields
if (!('timestamp' in data) || typeof data.timestamp !== 'number') {
return NextResponse.json({ error: 'Missing or invalid timestamp' }, { status: 400 })
}
const supabase = await createServerSupabaseClient()

// Get user info if available
Expand Down
28 changes: 16 additions & 12 deletions app/api/checkout/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ function getEventIdFromSlugOrId(eventIdOrSlug: string): string {
return slugToIdMap[eventIdOrSlug] || eventIdOrSlug;
}

// Sample ticket types have been migrated to live Supabase database

// Initialize Stripe with proper error handling
const getStripeInstance = () => {
const secretKey = process.env.STRIPE_SECRET_KEY
Expand Down Expand Up @@ -108,14 +110,15 @@ export async function POST(request: NextRequest) {
console.log('[DEBUG] Final actualEventId:', actualEventId)
console.log('[DEBUG] Requested ticket IDs:', ticketItems.map(item => item.ticket_type_id))

// Validate and fetch ticket types from database
// Fetch ticket types from Supabase database
// NOTE: Sample ticket data functionality has been DISABLED and migrated to database
const { data: ticketTypes, error: ticketTypesError } = await supabase
.from('ticket_types')
.select('*')
.in('id', ticketItems.map(item => item.ticket_type_id))
.eq('event_id', actualEventId)

console.log('[DEBUG] Query filters:', {
console.log('[DEBUG] Database query filters:', {
ticket_ids: ticketItems.map(item => item.ticket_type_id),
event_id: actualEventId
})
Expand Down Expand Up @@ -158,19 +161,19 @@ export async function POST(request: NextRequest) {

console.log('[DEBUG] ✅ Event timing is valid, calculating totals...')

// Calculate total amount
let total = 0
// Calculate subtotal (ticket prices only)
let subtotal = 0
for (const item of ticketItems) {
const ticketType = (ticketTypes as TicketType[]).find((tt: TicketType) => tt.id === item.ticket_type_id)
if (!ticketType) {
return NextResponse.json({ error: `Invalid ticket type: ${item.ticket_type_id}` }, { status: 400 })
}
total += ticketType.price * item.quantity
subtotal += ticketType.price * item.quantity
}

// Add processing fee (3% + $0.30)
const processingFee = Math.round(total * 0.03 + 30)
total += processingFee
// Calculate processing fee (2.9% + $0.30 - Stripe's standard rate)
const processingFee = Math.round(subtotal * 0.029 + 30)
const total = subtotal + processingFee

// Initialize Stripe
const stripe = getStripeInstance()
Expand Down Expand Up @@ -261,6 +264,8 @@ export async function POST(request: NextRequest) {
client_secret: paymentIntent.client_secret,
payment_intent_id: paymentIntent.id,
amount: total,
subtotal: subtotal,
fees: processingFee,
currency: 'usd',
event: {
id: eventData.id,
Expand All @@ -274,14 +279,13 @@ export async function POST(request: NextRequest) {
const ticketType = (ticketTypes as TicketType[]).find((tt: TicketType) => tt.id === item.ticket_type_id)
return {
ticket_type_id: item.ticket_type_id,
ticket_type_name: ticketType?.name || 'Ticket',
quantity: item.quantity,
unit_price: ticketType?.price || 0,
total_price: (ticketType?.price || 0) * item.quantity,
name: ticketType?.name || 'Ticket'
total_price: (ticketType?.price || 0) * item.quantity
}
}),
customer_info,
total_amount: total
customer_info
})

} catch (error) {
Expand Down
2 changes: 2 additions & 0 deletions app/api/debug-oauth/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,10 @@ export async function GET() {
}

if (authError) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
supabaseAuthError = authError as any // Type assertion to handle the error properly
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
} catch (err: any) {
supabaseAuthError = err
}
Expand Down
45 changes: 45 additions & 0 deletions app/api/manifest/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { NextResponse } from 'next/server'

export async function GET() {
const manifest = {
name: "LocalLoop - Community Events Platform",
short_name: "LocalLoop",
description: "Discover and join local community events with seamless calendar integration",
start_url: "/",
display: "standalone",
background_color: "#ffffff",
theme_color: "#2563eb",
orientation: "portrait-primary",
scope: "/",
lang: "en",
categories: [
"social",
"lifestyle",
"productivity"
],
icons: [
{
src: "/favicon-16x16.svg",
sizes: "16x16",
type: "image/svg+xml"
},
{
src: "/favicon-32x32.svg",
sizes: "32x32",
type: "image/svg+xml"
},
{
src: "/icon.svg",
sizes: "any",
type: "image/svg+xml"
}
]
}

return NextResponse.json(manifest, {
headers: {
'Content-Type': 'application/manifest+json',
'Cache-Control': 'public, max-age=86400', // Cache for 24 hours
},
})
}
Loading
Loading