This commit is contained in:
Michael Zhang 2023-06-11 15:08:16 -05:00
parent 4ecf26f4b2
commit 4e21a8ee92
11 changed files with 97 additions and 53 deletions

26
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "houhou",
"version": "0.0.0",
"version": "0.1.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "houhou",
"version": "0.0.0",
"version": "0.1.0",
"dependencies": {
"@chakra-ui/react": "^2.7.0",
"@emotion/react": "^11.11.1",
@ -29,6 +29,7 @@
"@vitejs/plugin-react": "^3.0.0",
"autoprefixer": "^10.4.14",
"postcss": "^8.4.24",
"prettier": "^2.8.8",
"sass": "^1.62.1",
"tailwindcss": "^3.3.2",
"typescript": "^4.9.5",
@ -3289,6 +3290,21 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
"node_modules/prettier": {
"version": "2.8.8",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
"integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
},
"engines": {
"node": ">=10.13.0"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@ -6355,6 +6371,12 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
"prettier": {
"version": "2.8.8",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
"integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
"dev": true
},
"prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",

View file

@ -1,7 +1,7 @@
{
"name": "houhou",
"private": true,
"version": "0.0.0",
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "vite",
@ -31,6 +31,7 @@
"@vitejs/plugin-react": "^3.0.0",
"autoprefixer": "^10.4.14",
"postcss": "^8.4.24",
"prettier": "^2.8.8",
"sass": "^1.62.1",
"tailwindcss": "^3.3.2",
"typescript": "^4.9.5",

2
src-tauri/Cargo.lock generated
View file

@ -1376,7 +1376,7 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "houhou"
version = "0.0.0"
version = "0.1.0"
dependencies = [
"anyhow",
"clap",

View file

@ -1,6 +1,6 @@
[package]
name = "houhou"
version = "0.0.0"
version = "0.1.0"
description = "A Tauri App"
authors = ["you"]
license = ""

View file

@ -24,14 +24,16 @@ pub struct GetKanjiResult {
kanji: Vec<Kanji>,
}
fn build_kanji(row: SqliteRow) -> Kanji {
let character = row.get("Character");
let meaning = row.get("Meaning");
let most_used_rank = row.get("MostUsedRank");
Kanji {
character,
meaning,
most_used_rank,
impl Kanji {
fn from_sqlite_row(row: SqliteRow) -> Self {
let character = row.get("Character");
let meaning = row.get("Meaning");
let most_used_rank = row.get("MostUsedRank");
Kanji {
character,
meaning,
most_used_rank,
}
}
}
@ -57,7 +59,7 @@ pub async fn get_kanji(
.await
.map_err(|_| ())?;
let kanji = result.into_iter().map(build_kanji).collect();
let kanji = result.into_iter().map(Kanji::from_sqlite_row).collect();
let count = sqlx::query("SELECT COUNT(*) FROM KanjiSet")
.fetch_one(&db.0)
@ -79,7 +81,7 @@ pub async fn get_single_kanji(
LEFT JOIN KanjiMeaningSet ON KanjiSet.ID = KanjiMeaningSet.Kanji_ID
GROUP BY KanjiSet.ID
HAVING MostUsedRank IS NOT NULL
AND Kanji.Character = ?
AND KanjiSet.Character = ?
"#,
)
.bind(character)
@ -87,5 +89,7 @@ pub async fn get_single_kanji(
.await
.map_err(|_| ())?;
Ok(Some(build_kanji(result)))
let kanji = Kanji::from_sqlite_row(result);
Ok(Some(kanji))
}

View file

@ -11,10 +11,7 @@ mod kanji;
use std::str::FromStr;
use anyhow::{Context, Result};
use sqlx::{
sqlite::{SqliteConnectOptions, SqlitePoolOptions},
SqlitePool,
};
use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions};
use tauri::SystemTray;
use crate::kanji::KanjiDb;

View file

@ -8,7 +8,7 @@
},
"package": {
"productName": "houhou",
"version": "0.0.0"
"version": "0.1.0"
},
"tauri": {
"allowlist": {

View file

@ -4,28 +4,28 @@ import { Kanji } from "../types/Kanji";
import styles from "./KanjiDisplay.module.scss";
import useSWR from "swr";
type GetSingleKanjiResult = Kanji;
interface KanjiDisplayProps {
kanjiCharacter: string;
}
export default function KanjiDisplay({ kanjiCharacter }: KanjiDisplayProps) {
const { data, error, isLoading } = useSWR(["get_single_kanji", kanjiCharacter], ([command, character]) => invoke<GetKanjiResult>(command, { character }));
const {
data: kanji,
error,
isLoading,
} = useSWR(["get_single_kanji", kanjiCharacter], ([command, character]) =>
invoke<GetSingleKanjiResult>(command, { character }),
);
if (!kanji) return <>Loading...</>;
return (
<>
<div className={styles.display}>{kanjiCharacter}</div>
<div className={styles.display}>{kanji.character}</div>
{JSON.stringify(isLoading)}
<p>
data:
{JSON.stringify(data)}
</p>
<p>
error:
{JSON.stringify(error)}
</p>
{kanji.meaning}
</>
);
}

View file

@ -8,3 +8,10 @@
padding: 4px 8px;
border: 1px solid lightgray;
}
.kanji-list-scroll {
display: flex;
flex-direction: column;
gap: 4px;
overflow-y: scroll;
}

View file

@ -20,22 +20,27 @@ interface KanjiListProps {
function KanjiList({ data, selectedCharacter }: KanjiListProps) {
return (
<>
Displaying {data.kanji.length} of {data.count} results.
{data.kanji.map((kanji) => (
<Link
key={kanji.character}
className={styles["kanji-link"]}
to={`/kanji/${kanji.character}`}
>
<Grid templateRows="repeat(2, 1fr)" templateColumns="1fr 3fr">
<GridItem rowSpan={2} style={{ fontSize: "24px", textAlign: "center" }}>
{kanji.character}
</GridItem>
<GridItem>{kanji.meaning}</GridItem>
<GridItem>#{kanji.most_used_rank} most used</GridItem>
</Grid>
</Link>
))}
<small>
Displaying {data.kanji.length} of {data.count} results.
</small>
<div className={styles["kanji-list-scroll"]}>
{data.kanji.map((kanji) => (
<Link
key={kanji.character}
className={styles["kanji-link"]}
to={`/kanji/${kanji.character}`}
>
<Grid templateRows="repeat(2, 1fr)" templateColumns="1fr 3fr">
<GridItem rowSpan={2} style={{ fontSize: "24px", textAlign: "center" }}>
{kanji.character}
</GridItem>
<GridItem>{kanji.meaning}</GridItem>
<GridItem>#{kanji.most_used_rank} most used</GridItem>
</Grid>
</Link>
))}
</div>
</>
);
}
@ -46,9 +51,6 @@ export default function KanjiPane() {
return (
<>
{JSON.stringify(error)}
{JSON.stringify(selectedKanji)}
<Stack spacing={7} direction="row">
<Box p={2} className={styles["kanji-list"]}>
{data && <KanjiList data={data} selectedCharacter={selectedKanji} />}

View file

@ -1,3 +1,14 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
html,
body {
width: 100%;
height: 100%;
padding: 0;
}
body {
overflow: hidden;
}