Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
57 changes: 57 additions & 0 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ import Activities from './pages/Activities';
import Settings from './pages/Settings';
import Navigation from './components/Navigation';
import BackupReminder from './components/BackupReminder';
import TestModal from './components/TestModal';
import TestResults from './components/TestResults';
import FirstTimeTestPopup from './components/FirstTimeTestPopup';
import { useDataManager } from './hooks/useDataManager';
import { useTestManager } from './hooks/useTestManager';
import { useNotifications } from './hooks/useNotifications';
import { testLocalStorage, debugLocalStorage } from './utils/storageTest';
import './styles/global.css';
Expand All @@ -19,12 +23,29 @@ const App = () => {
settings,
setActivities,
setSettings,
addActivity,
createBackup
} = useDataManager();

// Инициализация системы уведомлений
const { sendTestNotification, getNotificationStatus, clearNotifications } = useNotifications({ settings });

// Инициализация системы тестов
const {
isTestModalOpen,
isResultsModalOpen,
currentTestResult,
testHistory,
shouldShowFirstTimePopup,
openTestModal,
closeTestModal,
openResultsModal,
closeResultsModal,
completeTest,
markFirstTestCompleted,
addRecommendedActivities
} = useTestManager({ settings, setSettings, addActivity });

const theme = createTheme({
palette: {
mode: settings.theme,
Expand Down Expand Up @@ -79,6 +100,15 @@ const App = () => {
createBackup();
};

const handleStartFirstTest = () => {
markFirstTestCompleted();
openTestModal();
};

const handleSkipFirstTest = () => {
markFirstTestCompleted();
};

return (
<ThemeProvider theme={theme}>
<CssBaseline />
Expand Down Expand Up @@ -106,6 +136,8 @@ const App = () => {
activities={activities}
setActivities={setActivities}
settings={settings}
onOpenTest={openTestModal}
testHistory={testHistory}
/>
}
/>
Expand All @@ -126,12 +158,37 @@ const App = () => {
setSettings={setSettings}
activities={activities}
setActivities={setActivities}
testHistory={testHistory}
onOpenTest={openTestModal}
onOpenTestResult={openResultsModal}
/>
}
/>
</Routes>
</Container>
<Navigation />

{/* Модальные окна тестов */}
<FirstTimeTestPopup
open={shouldShowFirstTimePopup}
onStartTest={handleStartFirstTest}
onSkip={handleSkipFirstTest}
/>

<TestModal
open={isTestModalOpen}
onClose={closeTestModal}
onComplete={completeTest}
/>

{currentTestResult && (
<TestResults
open={isResultsModalOpen}
onClose={closeResultsModal}
testResult={currentTestResult}
onAddActivitiesToCalendar={addRecommendedActivities}
/>
)}
</Box>
</Router>
</ThemeProvider>
Expand Down
120 changes: 120 additions & 0 deletions src/components/FirstTimeTestPopup.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import React from 'react';
import {
Dialog,
DialogTitle,
DialogContent,
DialogActions,
Button,
Typography,
Box,
Avatar,
Card,
CardContent
} from '@mui/material';
import { Psychology, Close, QuestionAnswer } from '@mui/icons-material';

interface FirstTimeTestPopupProps {
open: boolean;
onStartTest: () => void;
onSkip: () => void;
}

const FirstTimeTestPopup: React.FC<FirstTimeTestPopupProps> = ({
open,
onStartTest,
onSkip
}) => {
return (
<Dialog
open={open}
maxWidth="sm"
fullWidth
PaperProps={{
sx: {
borderRadius: 3,
textAlign: 'center'
}
}}
>
<DialogTitle sx={{ pb: 1 }}>
<Avatar
sx={{
width: 64,
height: 64,
bgcolor: 'primary.main',
mx: 'auto',
mb: 2
}}
>
<Psychology sx={{ fontSize: 32 }} />
</Avatar>
<Typography variant="h5" component="div" sx={{ fontWeight: 600 }}>
Добро пожаловать!
</Typography>
</DialogTitle>

<DialogContent>
<Typography variant="body1" sx={{ mb: 3 }}>
Для персонализированных рекомендаций по отдыху рекомендуем пройти
короткий тест на определение типов усталости.
</Typography>

<Card sx={{ mb: 3, bgcolor: 'primary.light', color: 'primary.contrastText' }}>
<CardContent sx={{ py: 2 }}>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 2, mb: 1 }}>
<QuestionAnswer />
<Typography variant="h6" component="div">
Что даст тест?
</Typography>
</Box>
<Typography variant="body2" sx={{ textAlign: 'left' }}>
• Определение ваших доминирующих типов усталости<br/>
• Персональные рекомендации по восстановлению<br/>
• Готовые активности для календаря отдыха<br/>
• Понимание причин вашей усталости
</Typography>
</CardContent>
</Card>

<Box sx={{
display: 'flex',
justifyContent: 'space-between',
gap: 2,
bgcolor: 'background.default',
p: 2,
borderRadius: 2
}}>
<Typography variant="body2" color="text.secondary">
<strong>Время:</strong> 5-10 минут
</Typography>
<Typography variant="body2" color="text.secondary">
<strong>Вопросов:</strong> 40
</Typography>
<Typography variant="body2" color="text.secondary">
<strong>Можно пересдать:</strong> в любое время
</Typography>
</Box>
</DialogContent>

<DialogActions sx={{ p: 3, pt: 1, justifyContent: 'center', gap: 2 }}>
<Button
onClick={onSkip}
variant="outlined"
startIcon={<Close />}
>
Пропустить
</Button>
<Button
onClick={onStartTest}
variant="contained"
size="large"
startIcon={<Psychology />}
>
Пройти тест
</Button>
</DialogActions>
</Dialog>
);
};

export default FirstTimeTestPopup;
Loading