From f4d8ee37400f25d4fec3638b1ba73e8661c30959 Mon Sep 17 00:00:00 2001
From: eug-vs <eug-vs@keemail.me>
Date: Sat, 21 Mar 2020 14:29:05 +0300
Subject: feat: add types.d.ts, migrate Scoreboard

---
 src/index.tsx                       |  7 +---
 src/pages/Scoreboard/Scoreboard.js  | 68 ---------------------------------
 src/pages/Scoreboard/Scoreboard.tsx | 76 +++++++++++++++++++++++++++++++++++++
 src/types.d.ts                      | 12 ++++++
 4 files changed, 90 insertions(+), 73 deletions(-)
 delete mode 100644 src/pages/Scoreboard/Scoreboard.js
 create mode 100644 src/pages/Scoreboard/Scoreboard.tsx
 create mode 100644 src/types.d.ts

diff --git a/src/index.tsx b/src/index.tsx
index eb43b7e..360ca89 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -5,6 +5,7 @@ import {
   BenzinThemeProvider,
   Header,
 } from 'react-benzin';
+import { User, Solution } from './types';
 
 import 'typeface-roboto';
 
@@ -20,15 +21,11 @@ import GitHubIcon from '@material-ui/icons/GitHub';
 
 import { get } from './requests';
 
-interface User {
-  username: string;
-  id: number | null;
-}
 
 const App: React.FC = () => {
   const [page, setPage] = useState<string>('app');
   const [user, setUser] = useState<User>({ username: 'anonymous', id: null });
-  const [recentSolutions, setRecentSolutions] = useState([]);
+  const [recentSolutions, setRecentSolutions] = useState<Solution[]>([]);
 
   const headerContents = {
     app: (<TimerIcon />),
diff --git a/src/pages/Scoreboard/Scoreboard.js b/src/pages/Scoreboard/Scoreboard.js
deleted file mode 100644
index 47c0899..0000000
--- a/src/pages/Scoreboard/Scoreboard.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import React, { useEffect, useState } from 'react';
-
-import { makeStyles } from '@material-ui/core/styles';
-
-import { Window, SmartList } from 'react-benzin';
-
-import SolutionCard from '../../components/SolutionCard/SolutionCard';
-import Loading from '../../components/Loading/Loading';
-
-import { get } from '../../requests';
-
-
-const useStyles = makeStyles(theme => ({
-  cell: {
-    display: 'flex',
-    justifyContent: 'center',
-    padding: theme.spacing(4),
-
-    '& .MuiCard-root': {
-      width: '30%',
-    }
-  }
-}));
-
-const Scoreboard = () => {
-  const classes = useStyles();
-  const [solutions, setSolutions] = useState([]);
-
-  const updateSolutions = () => {
-    get('scoreboard/').then(response => {
-        setSolutions(response.data);
-    });
-  };
-
-  const removeSolution = id => {
-    updateSolutions();
-  };
-
-  useEffect(() => {
-    setTimeout(updateSolutions, 300);
-  }, []);
-
-  const renderItem = ({ index, style }) => {
-    return (
-      <div style={style} className={classes.cell}>
-        <SolutionCard data={solutions[index]} removeThisCard={removeSolution}/>
-      </div>
-    )
-  };
-
-  return (
-    <Window type="mono">
-      { solutions.length === 0 &&
-      <div className={classes.cell}>
-        <Loading/>
-      </div>
-      }
-      <SmartList
-        itemSize={300}
-        itemCount={solutions.length}
-        renderItem={renderItem}
-      />
-    </Window>
-  )
-};
-
-
-export default Scoreboard;
diff --git a/src/pages/Scoreboard/Scoreboard.tsx b/src/pages/Scoreboard/Scoreboard.tsx
new file mode 100644
index 0000000..c6826d2
--- /dev/null
+++ b/src/pages/Scoreboard/Scoreboard.tsx
@@ -0,0 +1,76 @@
+import React, { useEffect, useState } from 'react';
+
+import { makeStyles } from '@material-ui/core/styles';
+
+import { Window, SmartList } from 'react-benzin';
+import { Solution } from '../../types';
+
+import SolutionCard from '../../components/SolutionCard/SolutionCard';
+import Loading from '../../components/Loading/Loading';
+
+import { get } from '../../requests';
+
+
+const useStyles = makeStyles(theme => ({
+  cell: {
+    display: 'flex',
+    justifyContent: 'center',
+    padding: theme.spacing(4),
+
+    '& .MuiCard-root': {
+      width: '30%',
+    }
+  }
+}));
+
+
+interface RenderPropTypes {
+  index: number;
+  style: React.CSSProperties;
+}
+
+
+const Scoreboard: React.FC = () => {
+  const classes = useStyles();
+  const [solutions, setSolutions] = useState<Solution[]>([]);
+
+  const updateSolutions = () => {
+    get('scoreboard/').then(response => {
+        setSolutions(response.data);
+    });
+  };
+
+  const removeSolution = (id: number) => {
+    updateSolutions();
+  };
+
+  useEffect(() => {
+    setTimeout(updateSolutions, 300);
+  }, []);
+
+  const renderItem: React.FC<RenderPropTypes> = ({ index, style }) => {
+    return (
+      <div style={style} className={classes.cell}>
+        <SolutionCard data={solutions[index]} removeThisCard={removeSolution}/>
+      </div>
+    )
+  };
+
+  return (
+    <Window type="mono">
+      { solutions.length === 0 &&
+      <div className={classes.cell}>
+        <Loading/>
+      </div>
+      }
+      <SmartList
+        itemSize={300}
+        itemCount={solutions.length}
+        renderItem={renderItem}
+      />
+    </Window>
+  )
+};
+
+
+export default Scoreboard;
diff --git a/src/types.d.ts b/src/types.d.ts
new file mode 100644
index 0000000..cfc60bc
--- /dev/null
+++ b/src/types.d.ts
@@ -0,0 +1,12 @@
+export interface User {
+  username: string;
+  id: number | null;
+}
+
+export interface Solution {
+  id: number;
+  result: string;
+  date: string;
+  author: User;
+}
+
-- 
cgit v1.2.3