diff --git a/package.json b/package.json index 9bd6bfe..395f062 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@tailwindcss/vite": "^4.1.11", + "idb": "^8.0.3", "solid-js": "^1.9.7", "tailwindcss": "^4.1.11" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 180b09d..1b8e398 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@tailwindcss/vite': specifier: ^4.1.11 version: 4.1.11(vite@7.1.1(jiti@2.5.1)(lightningcss@1.30.1)) + idb: + specifier: ^8.0.3 + version: 8.0.3 solid-js: specifier: ^1.9.7 version: 1.9.8 @@ -581,6 +584,9 @@ packages: html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + idb@8.0.3: + resolution: {integrity: sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==} + is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -1298,6 +1304,8 @@ snapshots: html-entities@2.3.3: {} + idb@8.0.3: {} + is-what@4.1.16: {} jiti@2.5.1: {} diff --git a/src/App.tsx b/src/App.tsx index d6cff48..59677a1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,89 +1,123 @@ -import { createSignal, For } from "solid-js"; - -type Entry = { - weight: number; - timestamp: Date; -}; +import { createResource, createSignal, For, Show } from "solid-js"; +import { openDatabase, type Entry } from "./data"; export default function App() { - const [entries, setEntries] = createSignal( - [ - { - timestamp: new Date(), - weight: 100, - }, - ], - { - equals: false, - } - ); + const [database] = createResource(openDatabase); + + const [entries, { refetch }] = createResource(database, async (database) => { + const entries = await database.getAll("entries"); + + return entries; + }); - function handleSubmit( + async function handleSubmit( event: SubmitEvent & { currentTarget: HTMLFormElement } ) { event.preventDefault(); + console.debug("handleSubmit", event); const input = event.currentTarget.elements.namedItem("weight"); if (!(input instanceof HTMLInputElement)) throw new Error("Expected input element"); const weight = input.valueAsNumber; - setEntries((entries) => { - entries.push({ weight, timestamp: new Date() }); - return entries; - }); + + const currentDatabase = database(); + console.debug("currentDatabase", currentDatabase); + const now = new Date(); + currentDatabase?.add( + "entries", + { + timestamp: now, + weight, + }, + now.getTime() + ); + event.currentTarget.reset(); + refetch(); + } + + async function remove(date: Date) { + const currentDatabase = database(); + if (!currentDatabase) throw new Error("Expected database to be ready"); + + currentDatabase.delete("entries", date.getTime()); + refetch(); } return ( -
-

Waight

-
    +
    +

    Waight

    +
      {(entry) => ( -
    1. -

      {entry.weight}

      +
    2. +

      + {entry.weight} ㎏ +

      +
    3. )}
    -
    - - - -
    + + + + Add + + +
    ); } diff --git a/src/data.ts b/src/data.ts new file mode 100644 index 0000000..3491759 --- /dev/null +++ b/src/data.ts @@ -0,0 +1,25 @@ +import { + openDB, + type DBSchema, + type IDBPDatabase, + type IDBPTransaction, + type StoreNames, +} from "idb"; + +export type Entry = { + weight: number; + timestamp: Date; +}; + +interface Schema extends DBSchema { + entries: { key: number; value: Entry; indexes: { timestamp: Date } }; +} + +export async function openDatabase() { + return await openDB("waight", 1, { + upgrade(database, oldVersion, newVersion, transaction, event) { + const store = database.createObjectStore("entries"); + store.createIndex("timestamp", "timestamp"); + }, + }); +}