diff options
author | polwex <polwex@sortug.com> | 2025-05-29 16:25:31 +0700 |
---|---|---|
committer | polwex <polwex@sortug.com> | 2025-05-29 16:25:31 +0700 |
commit | a03c92dc82ad527d7da6bbaa3c43000e2e5f0e69 (patch) | |
tree | 9a47cae250d043d31f751c1383bdcbe09d4bc9d8 /src/actions | |
parent | 7de09570c0d7907424c30f492207e80ff69e4061 (diff) |
better better
Diffstat (limited to 'src/actions')
-rw-r--r-- | src/actions/logintest/funcs.ts | 24 | ||||
-rw-r--r-- | src/actions/tones.ts | 47 |
2 files changed, 54 insertions, 17 deletions
diff --git a/src/actions/logintest/funcs.ts b/src/actions/logintest/funcs.ts new file mode 100644 index 0000000..4ffd5ef --- /dev/null +++ b/src/actions/logintest/funcs.ts @@ -0,0 +1,24 @@ +import { readFile, writeFile } from "node:fs/promises"; +import { unstable_rerenderRoute } from "waku/router/server"; + +export const getMessage = async () => { + const data = await readFile("./message.txt", "utf8"); + return data; +}; + +export const greet = async (formData: FormData) => { + "use server"; + // simulate a slow server response + await new Promise((resolve) => setTimeout(resolve, 1000)); + const currentData = await getMessage(); + await writeFile( + "./message.txt", + currentData + "\n" + formData.get("name") + " from server!", + ); + unstable_rerenderRoute("/"); +}; + +export const increment = async (count: number) => { + "use server"; + return count + 1; +}; diff --git a/src/actions/tones.ts b/src/actions/tones.ts index 8089453..7d85d1c 100644 --- a/src/actions/tones.ts +++ b/src/actions/tones.ts @@ -1,31 +1,31 @@ -'use server'; +"use server"; -import db from '@/lib/db'; -import { WordData } from '@/zoom/logic/types'; +import db from "@/lib/db"; +import { WordData } from "@/zoom/logic/types"; // Helper to extract tone from prosody - assuming prosody is an array of objects like [{tone: number}, ...] const getTonesFromProsody = (prosody: any): number[] | null => { if (Array.isArray(prosody) && prosody.length > 0) { - return prosody.map(p => p.tone).filter(t => typeof t === 'number'); + return prosody.map((p) => p.tone).filter((t) => typeof t === "number"); } return null; }; export async function fetchWordsByToneAndSyllables( syllableCount: number, - tones: (number | null)[] // Array of tones, one for each syllable. null means any tone. + tones: (number | null)[], // Array of tones, one for each syllable. null means any tone. ): Promise<WordData | null> { if (syllableCount !== tones.length) { console.error("Syllable count and tones array length mismatch"); return null; } - const queryParams: (string | number)[] = ['th', syllableCount, syllableCount]; // lang, syllables (for WHERE), syllables (for json_array_length) + const queryParams: (string | number)[] = ["th", syllableCount, syllableCount]; // lang, syllables (for WHERE), syllables (for json_array_length) let toneConditions = ""; const toneClauses: string[] = []; tones.forEach((tone, index) => { - if (tone !== null && typeof tone === 'number') { + if (tone !== null && typeof tone === "number") { // Assumes SQLite's json_extract function is available and prosody is like: [{"tone": 1}, {"tone": 3}, ...] // Path for first syllable's tone: '$[0].tone' toneClauses.push(`json_extract(prosody, '$[${index}].tone') = ?`); @@ -34,11 +34,20 @@ export async function fetchWordsByToneAndSyllables( }); if (toneClauses.length > 0) { - toneConditions = `AND ${toneClauses.join(' AND ')}`; + toneConditions = `AND ${toneClauses.join(" AND ")}`; } const queryString = ` - SELECT id, spelling, prosody, syllables, lang, type, frequency, confidence, ipa, senses_array + SELECT id, spelling, prosody, syllables, lang, type, frequency, confidence, ipa, + (SELECT + json_group_array(json_object( + 'pos', pos, + 'senses', s.senses, + 'forms', forms, + 'etymology', etymology, + 'related', related) + ) FROM senses s WHERE s.parent_id = expressions.id + ) as senses_array FROM expressions WHERE lang = ? AND syllables = ? @@ -52,7 +61,7 @@ export async function fetchWordsByToneAndSyllables( try { const query = db.db.query(queryString); - const row = query.get(...queryParams) as any; + const row = query.get(...queryParams) as any; if (!row) return null; @@ -69,13 +78,17 @@ export async function fetchWordsByToneAndSyllables( confidence: row.confidence, ipa: row.ipa ? JSON.parse(row.ipa) : [], // Senses parsing is simplified here. Adjust if full sense data is needed. - senses: row.senses_array ? JSON.parse(row.senses_array).map((s: any) => ({ - pos: s.pos, - senses: typeof s.senses === 'string' ? JSON.parse(s.senses) : s.senses, - forms: typeof s.forms === 'string' ? JSON.parse(s.forms) : s.forms, - etymology: s.etymology, - related: typeof s.related === 'string' ? JSON.parse(s.related) : s.related, - })) : [], + senses: row.senses_array + ? JSON.parse(row.senses_array).map((s: any) => ({ + pos: s.pos, + senses: + typeof s.senses === "string" ? JSON.parse(s.senses) : s.senses, + forms: typeof s.forms === "string" ? JSON.parse(s.forms) : s.forms, + etymology: s.etymology, + related: + typeof s.related === "string" ? JSON.parse(s.related) : s.related, + })) + : [], }; return word; } catch (error) { |