aboutsummaryrefslogtreecommitdiff
path: root/src/pages/Timer/Timer.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/pages/Timer/Timer.tsx')
-rw-r--r--src/pages/Timer/Timer.tsx102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/pages/Timer/Timer.tsx b/src/pages/Timer/Timer.tsx
new file mode 100644
index 0000000..3ceb674
--- /dev/null
+++ b/src/pages/Timer/Timer.tsx
@@ -0,0 +1,102 @@
+import React from 'react';
+
+import { post } from '../../requests';
+
+import {
+ Window,
+ ContentSection,
+ SmartList,
+} from 'react-benzin';
+import { User, Solution, RenderPropTypes } from '../../types';
+
+import TimerButton from './TimerButton';
+import SolutionCard from '../../components/SolutionCard/SolutionCard';
+
+import { Button, makeStyles } from '@material-ui/core';
+
+
+const useStyles = makeStyles(theme => ({
+ primary: {
+ padding: theme.spacing(4),
+ },
+ cell: {
+ padding: theme.spacing(5),
+ },
+}));
+
+
+interface PropTypes {
+ user: User;
+ recentSolutions: Solution[];
+ setRecentSolutions: (newRecentSolutions: Solution[]) => void;
+ setPage: (newPage: string) => void;
+}
+
+
+const Timer: React.FC<PropTypes> = ({ user, recentSolutions, setRecentSolutions, setPage }) => {
+ const classes = useStyles();
+
+ const registerResult = (result: string): void => {
+ const solution = { author_id: user.id, result };
+ post('solutions/', solution).then(response => {
+ setRecentSolutions([response.data].concat(recentSolutions));
+ });
+ };
+
+ const handleLearnMore = (): void => {
+ setPage('contribute');
+ };
+
+ const handleLogin = (): void => {
+ setPage('profile');
+ };
+
+ const removeSolution = (id: number): void => {
+ setRecentSolutions(recentSolutions.filter((solution => solution.id !== id)));
+ };
+
+ const renderItem: React.FC<RenderPropTypes> = ({ index, style }) => {
+ const solution = recentSolutions[index];
+ return (
+ <div style={style} className={classes.cell}>
+ <SolutionCard data={solution} removeThisCard={removeSolution} />
+ </div>
+ );
+ };
+
+ return (
+ <>
+ <Window type="primary">
+ <div className={classes.primary}>
+ <ContentSection sectionName="Welcome to ChronoCube!">
+ <p>
+ ChronoCube is a professional speedcubing timer.
+ Share your results publicly - let everyone see your progress and
+ achievements!
+ Every speedcuber will benefit
+ from using it - both amateur and professional!
+ </p>
+ <Button variant="contained" color="primary" onClick={handleLearnMore}> Learn more </Button>
+ </ContentSection>
+ {user.id === null &&
+ <ContentSection sectionName="Log into an account">
+ <p> Tell us your name so we can track your progress</p>
+ <Button variant="contained" color="primary" onClick={handleLogin} size="large"> Login </Button>
+ </ContentSection>
+ }
+ <TimerButton registerResult={registerResult} />
+ </div>
+ </Window>
+ <Window type="secondary" name="Recent solutions">
+ <SmartList
+ itemSize={270}
+ itemCount={recentSolutions.length}
+ renderItem={renderItem}
+ />
+ </Window>
+ </>
+ );
+};
+
+
+export default Timer;