stats board
This commit is contained in:
parent
afd50c1f0e
commit
3080602727
6 changed files with 112 additions and 9 deletions
|
@ -1,4 +1,4 @@
|
|||
CREATE TABLE [SrsEntrySet] (
|
||||
CREATE TABLE IF NOT EXISTS [SrsEntrySet] (
|
||||
[ID] integer NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
[CreationDate] bigint NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
[NextAnswerDate] bigint,
|
||||
|
@ -15,4 +15,5 @@ CREATE TABLE [SrsEntrySet] (
|
|||
[Tags] [nvarchar(300)],
|
||||
[LastUpdateDate] BIGINT,
|
||||
[IsDeleted] BOOLEAN NOT NULL DEFAULT false,
|
||||
[ServerId] integer);
|
||||
[ServerId] integer
|
||||
);
|
|
@ -1,9 +1,42 @@
|
|||
use sqlx::SqlitePool;
|
||||
use sqlx::{Row, SqlitePool};
|
||||
use tauri::State;
|
||||
|
||||
pub struct SrsDb(pub SqlitePool);
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn get_srs_stats(db: State<'_, SrsDb>) -> Result<(), ()> {
|
||||
Ok(())
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
pub struct SrsStats {
|
||||
reviews_available: u32,
|
||||
|
||||
reviews_today: u32,
|
||||
total_items: u32,
|
||||
total_reviews: u32,
|
||||
|
||||
/// Used to calculate average success
|
||||
num_success: u32,
|
||||
num_failure: u32,
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn get_srs_stats(db: State<'_, SrsDb>) -> Result<SrsStats, String> {
|
||||
let row = sqlx::query(
|
||||
r#"
|
||||
SELECT
|
||||
COUNT(*) AS total_items,
|
||||
SUM(SuccessCount) AS num_success,
|
||||
SUM(FailureCount) AS num_failure
|
||||
FROM SrsEntrySet
|
||||
"#,
|
||||
)
|
||||
.fetch_one(&db.0)
|
||||
.await
|
||||
.map_err(|err| err.to_string())?;
|
||||
|
||||
Ok(SrsStats {
|
||||
reviews_available: 0,
|
||||
reviews_today: 0,
|
||||
total_items: row.get("total_items"),
|
||||
total_reviews: 0,
|
||||
num_success: row.get("num_success"),
|
||||
num_failure: row.get("num_failure"),
|
||||
})
|
||||
}
|
||||
|
|
7
src/components/DashboardReviewStats.module.scss
Normal file
7
src/components/DashboardReviewStats.module.scss
Normal file
|
@ -0,0 +1,7 @@
|
|||
.top-row {
|
||||
}
|
||||
|
||||
.reviews-stats {
|
||||
background-color: gray;
|
||||
color: white;
|
||||
}
|
|
@ -1,3 +1,58 @@
|
|||
export default function DashboardReviewStats() {
|
||||
return <></>;
|
||||
import {
|
||||
Grid,
|
||||
GridItem,
|
||||
Stat,
|
||||
StatArrow,
|
||||
StatGroup,
|
||||
StatHelpText,
|
||||
StatLabel,
|
||||
StatNumber,
|
||||
} from "@chakra-ui/react";
|
||||
import styles from "./DashboardReviewStats.module.scss";
|
||||
import useSWR from "swr";
|
||||
import { invoke } from "@tauri-apps/api/tauri";
|
||||
|
||||
interface SrsStats {
|
||||
reviews_available: number;
|
||||
|
||||
reviews_today: number;
|
||||
total_items: number;
|
||||
total_reviews: number;
|
||||
|
||||
/// Used to calculate average success
|
||||
num_success: number;
|
||||
num_failure: number;
|
||||
}
|
||||
|
||||
export default function DashboardReviewStats() {
|
||||
const {
|
||||
data: srsStats,
|
||||
error,
|
||||
isLoading,
|
||||
} = useSWR(["get_srs_stats"], ([command]) => invoke<SrsStats>(command));
|
||||
|
||||
if (!srsStats) return <>Loading...</>;
|
||||
|
||||
const averageSuccess = srsStats.num_success / (srsStats.num_success + srsStats.num_failure);
|
||||
const averageSuccessStr = `${Math.round(averageSuccess * 10000) / 100}%`;
|
||||
|
||||
const generateStat = (stat) => {
|
||||
return (
|
||||
<Stat>
|
||||
<StatLabel>{stat.label}</StatLabel>
|
||||
<StatNumber>{stat.value}</StatNumber>
|
||||
</Stat>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* JSON.stringify([srsStats, error, isLoading]) */}
|
||||
|
||||
<StatGroup>
|
||||
{generateStat({ label: "total items", value: srsStats.total_items })}
|
||||
{generateStat({ label: "average success", value: averageSuccessStr })}
|
||||
</StatGroup>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ $kanjiDisplaySize: 80px;
|
|||
border: 1px solid rgb(87, 87, 210);
|
||||
width: $kanjiDisplaySize;
|
||||
height: $kanjiDisplaySize;
|
||||
line-height: $kanjiDisplaySize;
|
||||
font-size: $kanjiDisplaySize * 0.8;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
import DashboardReviewStats from "../components/DashboardReviewStats";
|
||||
|
||||
export default function SrsPane() {
|
||||
return <></>;
|
||||
return (
|
||||
<main>
|
||||
<DashboardReviewStats />
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue