Match homepage design with professional green gradient background:
- Dark green gradient (from-[#1a4d2e] via-[#2d5a3d] to-[#1a4d2e])
- Clean white card with strong shadow (shadow-2xl)
- Brand green color for titles (#1a4d2e)
- Full screen height for better visual impact
- Consistent with homepage branding
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Updated login and register pages with homepage branding:
- Dark green gradient background (from-[#1a3d2e] to-[#2d5a45])
- Semi-transparent white card (bg-white/95 backdrop-blur-sm)
- Enhanced shadow for depth (shadow-2xl)
- Brand color for titles (#1a3d2e)
- Consistent with homepage visual identity
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added logo display at the top of both login and register forms
- Added Next.js Image component for optimized logo rendering
- Logo size: 120x120px, centered above page title
- Fixed Card padding consistency on register page (added p-8)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Create comprehensive data deletion page at /data-deletion
- Include GDPR-compliant deletion instructions
- Provide multiple deletion methods (account and email)
- Detail data retention policies and legal obligations
- Add instructions for OAuth provider (Google/Facebook) data removal
This page is required by Facebook to enable the app to go Live.
URL: https://dev.dsp5-archi-o24a-15m-g3.fr/data-deletion🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Update providers to always render GoogleOAuthProvider with dummy ID when not configured
- This prevents "must be used within GoogleOAuthProvider" errors during SSR
- The login page still checks for valid client ID before showing Google button
- Fixes dev mode errors and ensures consistent behavior
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix window.location usage in tirages page by adding SSR check
- Fix router.push call during SSR in profil page using useEffect
- Extract GoogleLoginButton to separate component to fix OAuth provider context
- Add null safety check for user object in profil page
- All pages now prerender successfully without errors
This fixes the 404 page not found error by ensuring proper SSR/CSR separation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add export const dynamic = 'force-dynamic' to login and profile pages
- Fixes 'Google OAuth components must be used within GoogleOAuthProvider' error
- Fixes 'location is not defined' error during static generation
- Both pages now render client-side only
Replace all instances of process.env.NEXT_PUBLIC_API_URL with
API_BASE_URL constant for consistency and to ensure the API URL
is properly defined at runtime.
Files updated:
- app/admin/marketing-data/page.tsx
- app/admin/tirages/page.tsx
- app/employe/dashboard/page.tsx
- app/employe/gains-client/page.tsx
- app/employe/historique/page.tsx
- components/admin/TicketManagement.tsx
This fixes the "undefined" API URL issue that was preventing
API calls from working correctly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Remove trailing whitespace for code consistency.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Make GoogleOAuthProvider conditional in layout.tsx (only render if clientId exists)
- Add hasGoogleAuth and hasFacebookAuth flags in login page
- Conditionally render OAuth buttons and section only when configured
- Add fallback message when OAuth is not configured
- Prevents "Missing required parameter client_id" error when NEXT_PUBLIC_GOOGLE_CLIENT_ID is not set
This allows the app to run without OAuth credentials configured, making deployment easier when OAuth is not yet set up.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add padding (p-8) and responsive px-4 to login page Card for better layout
- Create forgot-password page to fix 404 error when clicking "Mot de passe oublié?"
- Implement basic password reset form with email validation
- Add success state showing confirmation message after email submission
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Rename handleGoogleLoginSuccess to handleGoogleLogin and update the onClick handler to use the correct function name. This fixes the client-side exception on the login page.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fix missing indentation that was causing a 500 error on the homepage. The grid div wrapper was incorrectly indented.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Replace Next.js default template page with a complete landing page featuring:
- Hero section with main CTA buttons
- "How to Play" section explaining the 3-step participation process
- Updated prizes showcase section
- Enhanced final CTA section with dual action buttons
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add useEffect hook to check for auth token in localStorage only on client-side, preventing "localStorage is not defined" error during static page generation. Use state variable hasToken to display token presence in the UI.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The Button component only accepts: 'primary' | 'secondary' | 'outline' |
'danger' | 'success'. Changed 'default' to 'primary' as the closest equivalent.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Change role comparisons from lowercase to uppercase to match User type:
- "client" → "CLIENT"
- "employee" → "EMPLOYEE"
- "admin" → "ADMIN"
The User type only defines uppercase role values.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add null check for user.updatedAt before passing to formatDate function.
The User type defines updatedAt as optional (string | undefined), so we
need to handle the undefined case to prevent TypeScript compilation errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Change user.isEmailVerified to user.isVerified to match the User type
definition. The User type has isVerified property, not isEmailVerified.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add type assertion to handle prize types that may not exist in PRIZE_CONFIG.
This is the same fix applied to app/client/page.tsx to prevent TypeScript
compilation errors when accessing PRIZE_CONFIG with dynamic prize types
(PHYSICAL, DISCOUNT, GRAND_PRIZE).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fix property access to match the Ticket type definition:
- ticket.user_name → ticket.user?.firstName + lastName
- ticket.user_email → ticket.user?.email
- ticket.prize_name → ticket.prize?.name
- ticket.played_at → ticket.playedAt
The Ticket type uses camelCase and nested objects (user, prize),
not snake_case flat properties.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add Record<string, React.ReactElement> type to badges object to allow
dynamic string indexing in app/employe/verification/page.tsx.
This matches the fix already applied to page-new.tsx and resolves the
TypeScript compilation error.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add Record<string, React.ReactElement> type to badges object to allow
dynamic string indexing. This fixes TypeScript error where status string
parameter cannot be used to index the badges object.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Change validateTicket action parameters from lowercase "validate"/"reject"
to uppercase "APPROVE"/"REJECT" to match the function signature.
The employeeService.validateTicket function expects action type of
'APPROVE' | 'REJECT', not 'validate' | 'reject'.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Remove invalid comparisons against lowercase 'employee' role that don't exist
in the User type. The role type only includes uppercase 'EMPLOYEE'.
Fixed in:
- app/employe/dashboard/page.tsx (lines 42, 117)
- app/employe/layout.tsx (lines 28, 48)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add type assertion to handle prize types that may not exist in PRIZE_CONFIG
(PHYSICAL, DISCOUNT, GRAND_PRIZE). This prevents TypeScript compilation errors
when accessing the PRIZE_CONFIG object with dynamic prize types.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Remove lowercase 'admin' role checks that don't exist in the User type.
The role type is 'CLIENT' | 'EMPLOYEE' | 'ADMIN', so comparing against
lowercase 'admin' causes TypeScript compilation errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>