feat: ship v0.9.0 with pomodoro, achievements, and injection history
Add pomodoro timer with goal notifications, writing streak milestones, and knowledge injection logging with UI previews across AI writing flows. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import type { ThemeId, Language } from '@shared/types'
|
||||
import type { ThemeId, Language, PomodoroDuration } from '@shared/types'
|
||||
import { useSettingsStore } from '@renderer/stores/useSettingsStore'
|
||||
import { ShortcutEditor } from '@renderer/components/settings/ShortcutEditor'
|
||||
import { AiSettingsPage } from '@renderer/components/settings/AiSettingsPage'
|
||||
@@ -159,6 +159,49 @@ export function SettingsPage(): React.JSX.Element {
|
||||
{t('settings.knowledgeAutoExtract')}
|
||||
</label>
|
||||
</div>
|
||||
<div className="setting-item">
|
||||
<span>{t('settings.pomodoroDuration')}</span>
|
||||
<select
|
||||
data-testid="settings-pomodoro-duration"
|
||||
className="form-control form-control--narrow"
|
||||
value={settings.pomodoroDurationMinutes ?? 25}
|
||||
onChange={(e) =>
|
||||
void settings.update({
|
||||
pomodoroDurationMinutes: Number(e.target.value) as PomodoroDuration
|
||||
})
|
||||
}
|
||||
>
|
||||
<option value={15}>15</option>
|
||||
<option value={25}>25</option>
|
||||
<option value={45}>45</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="setting-item">
|
||||
<label style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
|
||||
<input
|
||||
type="checkbox"
|
||||
data-testid="settings-system-notifications"
|
||||
checked={settings.enableSystemNotifications === true}
|
||||
onChange={(e) =>
|
||||
void settings.update({ enableSystemNotifications: e.target.checked })
|
||||
}
|
||||
/>
|
||||
{t('settings.systemNotifications')}
|
||||
</label>
|
||||
</div>
|
||||
<div className="setting-item">
|
||||
<label style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
|
||||
<input
|
||||
type="checkbox"
|
||||
data-testid="settings-goal-notifications"
|
||||
checked={settings.enableGoalNotifications !== false}
|
||||
onChange={(e) =>
|
||||
void settings.update({ enableGoalNotifications: e.target.checked })
|
||||
}
|
||||
/>
|
||||
{t('settings.goalNotifications')}
|
||||
</label>
|
||||
</div>
|
||||
<div className="setting-item">
|
||||
<span>{t('settings.extractThreshold')}</span>
|
||||
<input
|
||||
@@ -185,7 +228,7 @@ export function SettingsPage(): React.JSX.Element {
|
||||
{section === 'shortcuts' && <ShortcutEditor />}
|
||||
{section === 'about' && (
|
||||
<p style={{ color: 'var(--text-secondary)', lineHeight: 1.8 }}>
|
||||
{t('app.name')} v0.8.0
|
||||
{t('app.name')} v0.9.0
|
||||
<br />
|
||||
{t('app.tagline')}
|
||||
</p>
|
||||
|
||||
Reference in New Issue
Block a user