- **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>
81 lines
2.1 KiB
TypeScript
81 lines
2.1 KiB
TypeScript
'use client';
|
|
|
|
import {
|
|
Dialog,
|
|
DialogTitle,
|
|
DialogContent,
|
|
DialogActions,
|
|
Button,
|
|
Typography,
|
|
Box,
|
|
IconButton,
|
|
} from '@mui/material';
|
|
import { Close } from '@mui/icons-material';
|
|
import { TermsContent } from './TermsContent';
|
|
import { PrivacyContent } from './PrivacyContent';
|
|
import { EULAContent } from './EULAContent';
|
|
|
|
interface LegalDocumentViewerProps {
|
|
open: boolean;
|
|
onClose: () => void;
|
|
documentType: 'terms' | 'privacy' | 'eula' | 'cookies';
|
|
title: string;
|
|
}
|
|
|
|
export function LegalDocumentViewer({ open, onClose, documentType, title }: LegalDocumentViewerProps) {
|
|
const lastUpdated = 'October 4, 2025';
|
|
|
|
const getContent = () => {
|
|
switch (documentType) {
|
|
case 'terms':
|
|
return <TermsContent />;
|
|
case 'privacy':
|
|
return <PrivacyContent />;
|
|
case 'eula':
|
|
return <EULAContent />;
|
|
default:
|
|
return (
|
|
<Typography color="error">
|
|
Document content not available. Please visit the{' '}
|
|
<a href={`/legal/${documentType}`} target="_blank" rel="noopener">
|
|
full page
|
|
</a>
|
|
.
|
|
</Typography>
|
|
);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Dialog
|
|
open={open}
|
|
onClose={onClose}
|
|
maxWidth="md"
|
|
fullWidth
|
|
sx={{
|
|
zIndex: (theme) => theme.zIndex.modal + 1, // Ensure this dialog appears above the EULA dialog
|
|
}}
|
|
>
|
|
<DialogTitle sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
|
|
<Typography variant="h6">{title}</Typography>
|
|
<IconButton onClick={onClose} size="medium" sx={{ minWidth: 48, minHeight: 48 }} aria-label="close">
|
|
<Close />
|
|
</IconButton>
|
|
</DialogTitle>
|
|
|
|
<DialogContent dividers sx={{ maxHeight: '60vh', overflowY: 'auto' }}>
|
|
<Typography variant="body2" color="text.secondary" paragraph>
|
|
Last Updated: {lastUpdated}
|
|
</Typography>
|
|
{getContent()}
|
|
</DialogContent>
|
|
|
|
<DialogActions sx={{ p: 2 }}>
|
|
<Button onClick={onClose} variant="contained" color="primary">
|
|
Close
|
|
</Button>
|
|
</DialogActions>
|
|
</Dialog>
|
|
);
|
|
}
|