Skip to content

Commit eac697e

Browse files
committed
fix: preserve user-edited onboarding, gate resume button, re-check dialog on hide, dedupe reminders type
1 parent 32fe8ed commit eac697e

6 files changed

Lines changed: 20 additions & 39 deletions

File tree

src-tauri/src/commands/fs.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -197,28 +197,24 @@ pub fn set_dialog_open(state: tauri::State<'_, crate::DialogState>, open: bool)
197197
state.is_open.store(open, Ordering::SeqCst);
198198
}
199199

200-
fn write_onboarding_file(base: &Path, rel_path: &str, content: &str, is_new_version: bool) {
200+
fn write_onboarding_file(base: &Path, rel_path: &str, content: &str, _is_new_version: bool) {
201201
let path = base.join(rel_path);
202202
if let Some(parent) = path.parent() {
203203
let _ = fs::create_dir_all(parent);
204204
}
205-
if !path.exists() || is_new_version {
205+
// Only write if file doesn't exist — preserve user edits across version changes
206+
if !path.exists() {
206207
let _ = fs::write(&path, content);
207208
}
208209
}
209210

210211
#[tauri::command]
211212
pub fn remove_onboarding_files() -> Result<(), String> {
212213
if let Ok(base) = get_papercache_dir() {
213-
let welcome = base.join("Welcome.md");
214-
let _ = fs::remove_file(&welcome);
215-
214+
// Only remove generated onboarding content — preserve Welcome.md and commands/
216215
let onboarding_dir = base.join("onboarding");
217216
let _ = fs::remove_dir_all(&onboarding_dir);
218217

219-
let commands_dir = base.join("commands");
220-
let _ = fs::remove_dir_all(&commands_dir);
221-
222218
let marker = base.join(".onboarding_version");
223219
let _ = fs::remove_file(&marker);
224220
}
@@ -324,7 +320,7 @@ pub fn run_onboarding(app: &AppHandle) {
324320

325321
write_onboarding_file(&base, "onboarding/Graph.md", &format!(
326322
"# Graph View\n\n\
327-
Press **{0} + G** to open the interactive 2D knowledge graph.\n\n\
323+
Press **{0} + G** to open the interactive 3D knowledge graph.\n\n\
328324
## Features\n\n\
329325
- Every note is a flat circle node; internal links become edges between nodes\n\
330326
- Nodes cluster by folder with distinct HSL colors\n\

src-tauri/src/commands/notifications.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ pub async fn schedule_reminders(
5353
let _ = app_clone.emit("reminder-fired", &key);
5454
});
5555

56-
new_handles.insert(reminder.key, handle);
56+
if let Some(old) = new_handles.insert(reminder.key, handle) {
57+
old.abort();
58+
}
5759
}
5860

5961
{

src-tauri/src/lib.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,14 @@ pub fn run() {
9393
let gen_at_spawn = gen.fetch_add(1, Ordering::SeqCst) + 1;
9494
let w2 = w.clone();
9595
let g2 = gen.clone();
96+
let dialog_open = is_dialog_open.clone();
9697
std::thread::spawn(move || {
9798
std::thread::sleep(
9899
std::time::Duration::from_millis(200),
99100
);
100-
if g2.load(Ordering::SeqCst) == gen_at_spawn {
101+
if g2.load(Ordering::SeqCst) == gen_at_spawn
102+
&& !dialog_open.load(Ordering::SeqCst)
103+
{
101104
let _ = w2.hide();
102105
}
103106
});

src/components/TimersPage.tsx

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ interface TimerItemProps {
1919
timer: Timer
2020
onRemove: (id: string) => void
2121
onPause: (id: string) => void
22-
onResume: (id: string) => void
2322
}
2423

2524
function formatTime(ms: number): string {
@@ -33,7 +32,7 @@ function formatTime(ms: number): string {
3332
return `${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`
3433
}
3534

36-
function TimerItem({ timer, onRemove, onPause, onResume }: TimerItemProps) {
35+
function TimerItem({ timer, onRemove, onPause }: TimerItemProps) {
3736
const tickTimer = useTimerStore((s) => s.tickTimer)
3837
const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)
3938

@@ -76,13 +75,9 @@ function TimerItem({ timer, onRemove, onPause, onResume }: TimerItemProps) {
7675
<div className="timer-header">
7776
<span className="timer-label">{timer.label || 'Timer'}</span>
7877
<div className="timer-controls">
79-
{!isCompleted && (
80-
<button
81-
className="timer-btn"
82-
onClick={() => (isPaused ? onResume(timer.id) : onPause(timer.id))}
83-
title={isPaused ? 'Resume' : 'Pause'}
84-
>
85-
{isPaused ? '▶' : '⏸'}
78+
{timer.status === 'running' && (
79+
<button className="timer-btn" onClick={() => onPause(timer.id)} title="Pause">
80+
8681
</button>
8782
)}
8883
<button
@@ -125,7 +120,6 @@ export function TimersPage({ onClose }: TimersPageProps) {
125120
const addTimer = useTimerStore((s) => s.addTimer)
126121
const removeTimer = useTimerStore((s) => s.removeTimer)
127122
const pauseTimer = useTimerStore((s) => s.pauseTimer)
128-
const resumeTimer = useTimerStore((s) => s.resumeTimer)
129123
const completeTimer = useTimerStore((s) => s.completeTimer)
130124
const addToast = useAppStore((s) => s.addToast)
131125

@@ -291,13 +285,7 @@ export function TimersPage({ onClose }: TimersPageProps) {
291285
</div>
292286
) : (
293287
timers.map((t) => (
294-
<TimerItem
295-
key={t.id}
296-
timer={t}
297-
onRemove={handleRemove}
298-
onPause={pauseTimer}
299-
onResume={resumeTimer}
300-
/>
288+
<TimerItem key={t.id} timer={t} onRemove={handleRemove} onPause={pauseTimer} />
301289
))
302290
)}
303291
</div>

src/hooks/useReminders.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,7 @@ import { listen } from '@tauri-apps/api/event'
33
import { useAppStore, type Note } from '../store/useAppStore'
44
import { SETTINGS_KEYS } from '../lib/settingsKeys'
55
import { parseAllTasks } from '../lib/taskUtils'
6-
7-
interface ReminderPayload {
8-
key: string
9-
label: string
10-
dueAt: number // Unix ms
11-
}
6+
import type { ReminderPayload } from '../types'
127

138
// Monotonically increasing token to prevent stale scheduleReminders calls
149
let scheduleToken = 0

src/store/useTimerStore.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,7 @@ export const useTimerStore = create<TimerState>((set) => ({
7777
}))
7878
},
7979

80-
resumeTimer: (id) => {
81-
// Backend does not support pause/resume yet; resume via a fresh schedule
82-
set((state) => ({
83-
timers: state.timers.map((t) => (t.id === id ? { ...t, status: 'completed' } : t)),
84-
}))
80+
resumeTimer: () => {
81+
// Backend does not support pause/resume yet; resume action is gated in the UI
8582
},
8683
}))

0 commit comments

Comments
 (0)