1
|
|
|
import React, { useEffect } from 'react' |
2
|
|
|
import PropTypes from 'prop-types' |
3
|
|
|
import { withTranslation } from 'react-i18next' |
4
|
|
|
import { Helmet } from 'react-helmet' |
5
|
|
|
import { connect } from 'react-redux' |
6
|
|
|
import { |
7
|
|
|
createMuiTheme, |
8
|
|
|
ThemeProvider, |
9
|
|
|
makeStyles, |
10
|
|
|
} from '@material-ui/core/styles' |
11
|
|
|
import { blue } from '@material-ui/core/colors' |
12
|
|
|
import CircularProgress from '@material-ui/core/CircularProgress' |
13
|
|
|
import settings from 'Settings' |
14
|
|
|
import { changeLangAsync } from './actions' |
15
|
|
|
import './global_styles/global.scss' |
16
|
|
|
import ButtonMenu from './components/ButtonMenu' |
17
|
|
|
import CVPage from './components/CV' |
18
|
|
|
import ProjectListPage from './components/ProjectList' |
19
|
|
|
|
20
|
|
|
const blueTheme = createMuiTheme({ |
21
|
|
|
palette: { |
22
|
|
|
primary: { |
23
|
|
|
main: blue[500], |
24
|
|
|
}, |
25
|
|
|
}, |
26
|
|
|
typography: { |
27
|
|
|
fontFamily: [ |
28
|
|
|
'Roboto', |
29
|
|
|
'"PingFang SC"', |
30
|
|
|
'"Hiragino Sans GB"', |
31
|
|
|
'"Microsoft YaHei"', |
32
|
|
|
'"WenQuanYi Micro Hei"', |
33
|
|
|
'sans-serif', |
34
|
|
|
'"Apple Color Emoji"', |
35
|
|
|
'"Segoe UI Emoji"', |
36
|
|
|
'"Segoe UI Symbol"', |
37
|
|
|
].join(','), |
38
|
|
|
}, |
39
|
|
|
}) |
40
|
|
|
|
41
|
|
|
const useStyles = makeStyles({ |
42
|
|
|
circularProgressRoot: { |
43
|
|
|
position: 'absolute', |
44
|
|
|
top: 'calc(50% - 10px)', |
45
|
|
|
left: 'calc(50% - 10px)', |
46
|
|
|
}, |
47
|
|
|
}) |
48
|
|
|
|
49
|
|
|
const App = ({ currentLang, userName, dispatch, t }) => { |
50
|
|
|
const classes = useStyles() |
51
|
|
|
|
52
|
|
|
useEffect(() => { |
53
|
|
|
dispatch(changeLangAsync(settings.default_lang)) |
54
|
|
|
}, []) |
55
|
|
|
|
56
|
|
|
return ( |
57
|
|
|
<ThemeProvider theme={blueTheme}> |
58
|
|
|
{!settings.generate_backend_pdf_template && <ButtonMenu />} |
59
|
|
|
{userName ? ( |
60
|
|
|
<> |
61
|
|
|
<CVPage /> |
62
|
|
|
<ProjectListPage /> |
63
|
|
|
<Helmet> |
64
|
|
|
<html lang={currentLang} /> |
65
|
|
|
<title>{t('Curriculum vitae of {{userName}}', { userName })}</title> |
66
|
|
|
<meta |
67
|
|
|
name="description" |
68
|
|
|
content={t('Curriculum vitae of {{userName}}', { userName })} |
69
|
|
|
/> |
70
|
|
|
</Helmet> |
71
|
|
|
</> |
72
|
|
|
) : ( |
73
|
|
|
<CircularProgress classes={{ root: classes.circularProgressRoot }} /> |
74
|
|
|
)} |
75
|
|
|
</ThemeProvider> |
76
|
|
|
) |
77
|
|
|
} |
78
|
|
|
|
79
|
|
|
App.propTypes = { |
80
|
|
|
currentLang: PropTypes.string, |
81
|
|
|
userName: PropTypes.string, |
82
|
|
|
dispatch: PropTypes.func.isRequired, |
83
|
|
|
t: PropTypes.func.isRequired, |
84
|
|
|
} |
85
|
|
|
|
86
|
|
|
const mapStateToProps = (state) => ({ |
87
|
|
|
currentLang: state.lang, |
88
|
|
|
userName: state.userData.name, |
89
|
|
|
}) |
90
|
|
|
|
91
|
|
|
export default connect(mapStateToProps)(withTranslation()(App)) |
92
|
|
|
|