diff --git a/package.json b/package.json
index 181761e..48d8527 100644
--- a/package.json
+++ b/package.json
@@ -24,6 +24,7 @@
},
"dependencies": {
"@babel/preset-react": "^7.14.5",
+ "@reduxjs/toolkit": "^1.6.1",
"@types/koa-bodyparser": "^4.3.0",
"@types/koa-multer": "^1.0.0",
"@types/koa-send": "^4.1.3",
@@ -58,6 +59,7 @@
"pug": "^3.0.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
+ "react-redux": "^7.2.4",
"react-router-dom": "^5.2.1",
"reflect-metadata": "^0.1.13",
"rndstr": "^1.0.0",
diff --git a/src/backend/controllers/session.ts b/src/backend/controllers/session.ts
index 8afb445..fd24134 100644
--- a/src/backend/controllers/session.ts
+++ b/src/backend/controllers/session.ts
@@ -4,6 +4,7 @@
*/
import { CurrentUser, Get, JsonController } from 'routing-controllers';
+import { getScores } from '../functions/get-scores';
import { User } from '../models/entities/user';
@JsonController('/session')
@@ -11,4 +12,9 @@ export class SessionController {
@Get() get(@CurrentUser({ required: true }) user: User) {
return user;
}
+
+ @Get('/score')
+ async getScore(@CurrentUser({ required: true }) user: User) {
+ return getScores(user);
+ }
}
diff --git a/src/backend/models/entities/user.ts b/src/backend/models/entities/user.ts
index 23e8ff2..3b5e5cd 100644
--- a/src/backend/models/entities/user.ts
+++ b/src/backend/models/entities/user.ts
@@ -1,10 +1,11 @@
import { Entity, Column, PrimaryGeneratedColumn, Index } from 'typeorm';
import { AlertMode, alertModes } from '../../../common/types/alert-mode';
import { visibilities, Visibility } from '../../../common/types/visibility';
+import { IUser } from '../../../common/types/user';
@Entity()
@Index(['username', 'host'], { unique: true })
-export class User {
+export class User implements IUser {
@PrimaryGeneratedColumn()
public id: number;
diff --git a/src/common/types/score.ts b/src/common/types/score.ts
index 32a36a2..9d0b01a 100644
--- a/src/common/types/score.ts
+++ b/src/common/types/score.ts
@@ -1,9 +1,9 @@
-export type Score = {
+export interface Score {
notesCount: number;
followingCount: number;
followersCount: number;
notesDelta: string;
followingDelta: string;
followersDelta: string;
-};
+}
diff --git a/src/common/types/user.ts b/src/common/types/user.ts
new file mode 100644
index 0000000..46e7214
--- /dev/null
+++ b/src/common/types/user.ts
@@ -0,0 +1,22 @@
+import { AlertMode } from './alert-mode';
+import { Visibility } from './visibility';
+
+export interface IUser {
+ id: number;
+ username: string;
+ host: string;
+ token: string;
+ misshaiToken: string;
+ prevNotesCount: number;
+ prevFollowingCount: number;
+ prevFollowersCount: number;
+ alertMode: AlertMode;
+ visibility: Visibility;
+ localOnly: boolean;
+ remoteFollowersOnly: boolean;
+ template: string | null;
+ prevRating: number;
+ rating: number;
+ bannedFromRanking: boolean;
+}
+
diff --git a/src/frontend/App.tsx b/src/frontend/App.tsx
index 8de69d5..dbeebf1 100644
--- a/src/frontend/App.tsx
+++ b/src/frontend/App.tsx
@@ -1,16 +1,19 @@
import * as React from 'react';
import { BrowserRouter, Link, Route, Switch, useLocation } from 'react-router-dom';
+import { Provider } from 'react-redux';
import { IndexPage } from './pages';
import { RankingPage } from './pages/ranking';
import { Header } from './components/Header';
import { TermPage } from './pages/term';
+import { store } from './store';
import 'xeltica-ui/dist/css/xeltica-ui.min.css';
import './style.scss';
const AppInner : React.VFC = () => {
const $location = useLocation();
+
return (
<>
@@ -30,7 +33,9 @@ const AppInner : React.VFC = () => {
};
export const App: React.VFC = () => (
-
-
-
+
+
+
+
+
);
diff --git a/src/frontend/components/SessionData.tsx b/src/frontend/components/SessionData.tsx
new file mode 100644
index 0000000..4299867
--- /dev/null
+++ b/src/frontend/components/SessionData.tsx
@@ -0,0 +1,44 @@
+import React from 'react';
+import { useGetScoreQuery } from '../services/session';
+
+export const SessionData: React.VFC = () => {
+ const { data: score, error, isLoading } = useGetScoreQuery(undefined);
+
+ return isLoading ? (
+
Loading...
+ ) : score === undefined ? (
+
No score
+ ) : (
+ <>
+
+ みす廃データ
+
+
+
+ 内容 |
+ スコア |
+ 前日比 |
+
+
+
+
+ ノート |
+ {score.notesCount} |
+ {score.notesDelta} |
+
+
+ フォロー |
+ {score.followingCount} |
+ {score.followingDelta} |
+
+
+ フォロワー |
+ {score.followersCount} |
+ {score.followersDelta} |
+
+
+
+
+ >
+ );
+};
diff --git a/src/frontend/components/Tab.tsx b/src/frontend/components/Tab.tsx
index 4fbe361..af5e4de 100644
--- a/src/frontend/components/Tab.tsx
+++ b/src/frontend/components/Tab.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import React from 'react';
export type TabItem = {
label: string;
@@ -11,14 +11,14 @@ export type TabProps = {
};
// タブコンポーネント
-export const Tab: React.FC
= (props) => {
+export const Tab: React.VFC = (props) => {
return (
{props.items.map((item, index) => {
return (