refactor(frontend): migrate JS modules to TypeScript
Wholesale JS -> TS migration of the frontend — stores, utils, actions,
and all Svelte component scripts adopt type annotations. Compile-time
surfaces (app.d.ts, lib/types/) added for shared DTO types.
Build plumbing:
- package.json: dev:frontend script that runs svelte-kit sync first
- tauri.conf.json: beforeDevCommand points at dev:frontend
- run.sh: dropped the sed-hack that temporarily blanked beforeDevCommand;
now relies on npm run dev:frontend to avoid double-Vite
- jsconfig.json: allowImportingTsExtensions
Preserves all Group 1 behaviour:
- page.svelte.ts keeps loadHistory / loadTasks Tauri-first, no
localStorage; saveTranscriptMeta + mapTranscriptRow + mapTaskRow
intact; update_task_cmd and update_transcript_meta_cmd invocations
carry the correct payload shape.
- Toasts, preferences stores typed without behaviour change.
- Viewer still routes segment edits through saveTranscriptMeta; the
Task 1.5 TODO markers are gone.
taskExtractor.ts is functionally improved during the migration:
- multi-task matches in the same sentence
- list-style shopping-verb expansion (get bread, milk, and cheese)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,10 +1,16 @@
|
||||
<script>
|
||||
<script lang="ts">
|
||||
import { invoke } from '@tauri-apps/api/core';
|
||||
import { ListTree, Check, Timer, Loader2 } from 'lucide-svelte';
|
||||
|
||||
let { parentTaskId, reduceMotion = false } = $props();
|
||||
|
||||
let subtasks = $state([]);
|
||||
interface Subtask {
|
||||
id: string;
|
||||
text: string;
|
||||
done: boolean;
|
||||
}
|
||||
|
||||
let subtasks = $state<Subtask[]>([]);
|
||||
let loading = $state(false);
|
||||
let error = $state('');
|
||||
let decomposing = $state(false);
|
||||
@@ -13,7 +19,7 @@
|
||||
loading = true;
|
||||
error = '';
|
||||
try {
|
||||
subtasks = await invoke('list_subtasks_cmd', { parentTaskId });
|
||||
subtasks = await invoke<Subtask[]>('list_subtasks_cmd', { parentTaskId });
|
||||
} catch (e) {
|
||||
error = String(e);
|
||||
} finally {
|
||||
@@ -25,7 +31,7 @@
|
||||
decomposing = true;
|
||||
error = '';
|
||||
try {
|
||||
subtasks = await invoke('decompose_and_store', { parentTaskId });
|
||||
subtasks = await invoke<Subtask[]>('decompose_and_store', { parentTaskId });
|
||||
} catch (e) {
|
||||
error = String(e);
|
||||
} finally {
|
||||
@@ -33,7 +39,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
async function checkStep(subtaskId) {
|
||||
async function checkStep(subtaskId: string) {
|
||||
try {
|
||||
await invoke('complete_subtask_cmd', { subtaskId });
|
||||
const idx = subtasks.findIndex(s => s.id === subtaskId);
|
||||
@@ -41,7 +47,7 @@
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
function startTimer(subtaskId) {
|
||||
function startTimer(subtaskId: string) {
|
||||
window.dispatchEvent(new CustomEvent('kon:start-timer', {
|
||||
detail: { taskId: subtaskId, seconds: 120 }
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user