- **EULA Persistence Fix**: Fixed EULA dialog showing on every login
- Added eulaAcceptedAt/eulaVersion to AuthResponse interface
- Updated login/register/getUserById endpoints to return EULA fields
- Changed EULACheck to use refreshUser() instead of window.reload()
- **Touch Target Accessibility**: All interactive elements now meet 48x48px minimum
- Fixed 14 undersized IconButtons across 5 files
- Changed size="small" to size="medium" with minWidth/minHeight constraints
- Updated children page, AI chat, analytics cards, legal viewer
- **Alt Text for Images**: Complete image accessibility for screen readers
- Added photoAlt field to children table (Migration V009)
- PhotoUpload component now includes alt text input field
- All Avatar components have meaningful alt text
- Default alt text: "Photo of {childName}", "{userName}'s profile photo"
- **Medical Tracking Consolidation**: Unified medical page with tabs
- Medicine page now has 3 tabs: Medication, Temperature, Doctor Visit
- Backward compatibility for legacy 'medicine' activity type
- Created dedicated /track/growth page for physical measurements
- **Track Page Updates**:
- Simplified to 6 options: Feeding, Sleep, Diaper, Medical, Activity, Growth
- Fixed grid layout to 3 cards per row with minWidth: 200px
- Updated terminology from "Medicine" to "Medical"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
78 lines
2.2 KiB
TypeScript
78 lines
2.2 KiB
TypeScript
'use client';
|
|
|
|
import { useState, useEffect } from 'react';
|
|
import { useAuth } from '@/lib/auth/AuthContext';
|
|
import { EULADialog } from './EULADialog';
|
|
import { useRouter } from 'next/navigation';
|
|
import apiClient from '@/lib/api/client';
|
|
|
|
export function EULACheck() {
|
|
const { user, logout, refreshUser } = useAuth();
|
|
const router = useRouter();
|
|
const [showDialog, setShowDialog] = useState(false);
|
|
const [checking, setChecking] = useState(true);
|
|
|
|
useEffect(() => {
|
|
// Only check EULA acceptance for authenticated users
|
|
if (user) {
|
|
console.log('🔍 Checking EULA acceptance:', {
|
|
userId: user.id,
|
|
eulaAcceptedAt: user.eulaAcceptedAt,
|
|
eulaVersion: user.eulaVersion,
|
|
});
|
|
|
|
// Show dialog if user hasn't accepted EULA
|
|
if (!user.eulaAcceptedAt) {
|
|
console.log('⚠️ User has not accepted EULA, showing dialog');
|
|
setShowDialog(true);
|
|
} else {
|
|
console.log('✅ EULA already accepted on', user.eulaAcceptedAt);
|
|
}
|
|
}
|
|
setChecking(false);
|
|
}, [user]);
|
|
|
|
const handleAccept = async () => {
|
|
try {
|
|
console.log('✅ User accepted EULA, calling API...');
|
|
|
|
const response = await apiClient.post('/api/v1/auth/eula/accept', {
|
|
version: '2025-10-04',
|
|
});
|
|
|
|
console.log('✅ EULA acceptance recorded:', response.data);
|
|
|
|
// Close dialog immediately
|
|
setShowDialog(false);
|
|
|
|
// Refresh user data to get updated EULA acceptance
|
|
await refreshUser();
|
|
|
|
console.log('✅ User data refreshed after EULA acceptance');
|
|
} catch (error) {
|
|
console.error('❌ Failed to accept EULA:', error);
|
|
alert('Failed to accept EULA. Please try again.');
|
|
}
|
|
};
|
|
|
|
const handleDecline = async () => {
|
|
console.log('❌ User declined EULA, logging out...');
|
|
alert('You must accept the Terms of Service, Privacy Policy, and EULA to use ParentFlow.');
|
|
await logout();
|
|
router.push('/login');
|
|
};
|
|
|
|
// Don't render anything while checking or if user hasn't loaded
|
|
if (checking || !user) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<EULADialog
|
|
open={showDialog}
|
|
onAccept={handleAccept}
|
|
onDecline={handleDecline}
|
|
/>
|
|
);
|
|
}
|