From 214124ad9339da63546df2dcff5907b594a0adbe Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Thu, 8 Jun 2023 04:39:32 -0500 Subject: [PATCH] update --- .envrc | 3 +- src-tauri/.gitignore | 4 +- .../migrations/20230608093603_initial.sql | 18 +++++++++ src-tauri/src/kanji.rs | 1 + src-tauri/src/main.rs | 27 +++++++++---- src-tauri/src/srs.rs | 9 +++++ src/App.module.scss | 2 +- src/components/DashboardReviewStats.tsx | 3 ++ src/panes/KanjiPane.module.scss | 16 +++++++- src/panes/KanjiPane.tsx | 39 ++++++++++++------- 10 files changed, 95 insertions(+), 27 deletions(-) create mode 100644 src-tauri/migrations/20230608093603_initial.sql create mode 100644 src-tauri/src/srs.rs create mode 100644 src/components/DashboardReviewStats.tsx diff --git a/.envrc b/.envrc index 287881b..bf2d0c5 100644 --- a/.envrc +++ b/.envrc @@ -1,3 +1,4 @@ strict_env -export HOUHOU_SRC=$PWD \ No newline at end of file +export HOUHOU_SRC=$PWD +export DATABASE_URL=$HOUHOU_SRC/src-tauri/SrsDatabase.sqlite \ No newline at end of file diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore index c68d73a..abbc2c6 100644 --- a/src-tauri/.gitignore +++ b/src-tauri/.gitignore @@ -3,4 +3,6 @@ /target/ *-shm -*-wal \ No newline at end of file +*-wal + +SrsDatabase.sqlite \ No newline at end of file diff --git a/src-tauri/migrations/20230608093603_initial.sql b/src-tauri/migrations/20230608093603_initial.sql new file mode 100644 index 0000000..b8a3c20 --- /dev/null +++ b/src-tauri/migrations/20230608093603_initial.sql @@ -0,0 +1,18 @@ +CREATE TABLE [SrsEntrySet] ( + [ID] integer NOT NULL PRIMARY KEY AUTOINCREMENT, + [CreationDate] bigint NOT NULL DEFAULT CURRENT_TIMESTAMP, + [NextAnswerDate] bigint, + [Meanings] [nvarchar(300)] NOT NULL, + [Readings] [nvarchar(100)] NOT NULL, + [CurrentGrade] smallint NOT NULL DEFAULT 0, + [FailureCount] integer NOT NULL DEFAULT 0, + [SuccessCount] integer NOT NULL DEFAULT 0, + [AssociatedVocab] [nvarchar(100)], + [AssociatedKanji] [nvarchar(10)], + [MeaningNote] [nvarchar(1000)], + [ReadingNote] [nvarchar(1000)], + [SuspensionDate] bigint, + [Tags] [nvarchar(300)], + [LastUpdateDate] BIGINT, + [IsDeleted] BOOLEAN NOT NULL DEFAULT false, + [ServerId] integer); \ No newline at end of file diff --git a/src-tauri/src/kanji.rs b/src-tauri/src/kanji.rs index 984576d..98ddb09 100644 --- a/src-tauri/src/kanji.rs +++ b/src-tauri/src/kanji.rs @@ -29,6 +29,7 @@ impl Kanji { let character = row.get("Character"); let meaning = row.get("Meaning"); let most_used_rank = row.get("MostUsedRank"); + Kanji { character, meaning, diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 778fa34..dacc2f2 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -7,23 +7,23 @@ extern crate derivative; extern crate serde; mod kanji; +mod srs; use std::str::FromStr; use anyhow::{Context, Result}; use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions}; use tauri::SystemTray; +use tokio::fs; use crate::kanji::KanjiDb; - -// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command -#[tauri::command] -fn greet(name: &str) -> String { - format!("Hello, {}! You've been greeted from Rust!", name) -} +use crate::srs::SrsDb; #[tokio::main] async fn main() -> Result<()> { + let app_dir = dirs::config_dir().unwrap().join("houhou"); + fs::create_dir_all(&app_dir).await?; + // Open kanji db let kanji_db_options = SqliteConnectOptions::from_str("./KanjiDatabase.sqlite")?.read_only(true); @@ -31,15 +31,28 @@ async fn main() -> Result<()> { .connect_with(kanji_db_options) .await?; + // Open SRS db + let srs_db_path = app_dir.join("srs_db.sqlite"); + let srs_db_options = + SqliteConnectOptions::from_str(&srs_db_path.display().to_string())? + .create_if_missing(true); + println!("Opening srs database at {} ...", srs_db_path.display()); + let srs_pool = SqlitePoolOptions::new() + .connect_with(srs_db_options) + .await?; + println!("Running migrations..."); + sqlx::migrate!().run(&srs_pool).await?; + // System tray let tray = SystemTray::new(); // Build tauri tauri::Builder::default() .manage(KanjiDb(kanji_pool)) + .manage(SrsDb(srs_pool)) .system_tray(tray) .invoke_handler(tauri::generate_handler![ - greet, + srs::get_srs_stats, kanji::get_kanji, kanji::get_single_kanji ]) diff --git a/src-tauri/src/srs.rs b/src-tauri/src/srs.rs new file mode 100644 index 0000000..a55ba0b --- /dev/null +++ b/src-tauri/src/srs.rs @@ -0,0 +1,9 @@ +use sqlx::SqlitePool; +use tauri::State; + +pub struct SrsDb(pub SqlitePool); + +#[tauri::command] +pub async fn get_srs_stats(db: State<'_, SrsDb>) -> Result<(), ()> { + Ok(()) +} diff --git a/src/App.module.scss b/src/App.module.scss index 9df3058..00f2847 100644 --- a/src/App.module.scss +++ b/src/App.module.scss @@ -27,5 +27,5 @@ main.main { .link-active { border-top-color: #09c; - background-color: lightskyblue; + background-color: hsl(203, 91%, 91%); } diff --git a/src/components/DashboardReviewStats.tsx b/src/components/DashboardReviewStats.tsx new file mode 100644 index 0000000..d79e5eb --- /dev/null +++ b/src/components/DashboardReviewStats.tsx @@ -0,0 +1,3 @@ +export default function DashboardReviewStats() { + return <>; +} diff --git a/src/panes/KanjiPane.module.scss b/src/panes/KanjiPane.module.scss index 87d0e2e..ad8a1d7 100644 --- a/src/panes/KanjiPane.module.scss +++ b/src/panes/KanjiPane.module.scss @@ -6,12 +6,24 @@ .kanji-link { padding: 4px 8px; - border: 1px solid lightgray; + border-left: 4px solid transparent; + user-select: none; } .kanji-list-scroll { + direction: rtl; + overflow-y: scroll; +} + +.kanji-list-inner { display: flex; flex-direction: column; gap: 4px; - overflow-y: scroll; + + direction: ltr; } + +.kanji-link-active { + border-left-color: #09c; + background-color: hsl(203, 91%, 91%); +} \ No newline at end of file diff --git a/src/panes/KanjiPane.tsx b/src/panes/KanjiPane.tsx index e2a4e1b..5d19e0b 100644 --- a/src/panes/KanjiPane.tsx +++ b/src/panes/KanjiPane.tsx @@ -6,6 +6,7 @@ import styles from "./KanjiPane.module.scss"; import { Link, useParams } from "react-router-dom"; import KanjiDisplay from "../components/KanjiDisplay"; import { Kanji } from "../types/Kanji"; +import classNames from "classnames"; export interface GetKanjiResult { count: number; @@ -25,21 +26,29 @@ function KanjiList({ data, selectedCharacter }: KanjiListProps) {
- {data.kanji.map((kanji) => ( - - - - {kanji.character} - - {kanji.meaning} - #{kanji.most_used_rank} most used - - - ))} +
+ {data.kanji.map((kanji) => { + const active = kanji.character == selectedCharacter; + const className = classNames(styles['kanji-link'], active && styles['kanji-link-active']) + return + + + {kanji.character} + + {kanji.meaning} + + + #{kanji.most_used_rank} most used + + + + + })} +
);