Skip to content

Commit addc4d6

Browse files
committed
fix(#1027,#1029): 修复记录回收站列表读取错误的问题,清空或删除记录会同步删除对应的文件
1 parent 170d4b4 commit addc4d6

11 files changed

Lines changed: 193 additions & 182 deletions

File tree

src-tauri/src/app_setup.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
use tauri::App;
22
#[cfg(target_os = "windows")]
33
use tauri::Manager;
4+
use crate::screenshot::cleanup_temp_screenshot_dir;
45
use crate::window;
56
use crate::tray::create_tray;
67

78
pub fn setup_app(app: &mut App) -> Result<(), Box<dyn std::error::Error>> {
89
let app_handle = app.handle();
910

11+
cleanup_temp_screenshot_dir(&app_handle);
12+
1013
// 在 Windows 上明确禁用窗口装饰
1114
#[cfg(target_os = "windows")]
1215
{

src-tauri/src/main.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ mod skills;
1414
mod tray;
1515
mod ai;
1616

17-
use screenshot::{screenshot};
17+
use screenshot::{cleanup_temp_screenshot_dir, screenshot};
1818
use fuzzy_search::{fuzzy_search, fuzzy_search_parallel};
1919
use keywords::{rank_keywords};
2020
use backup::{export_app_data, import_app_data, import_app_data_from_file};
@@ -82,10 +82,13 @@ fn main() {
8282

8383
.build(tauri::generate_context!())
8484
.expect("error while running tauri application")
85-
.run(|_app_handle, event| match event {
85+
.run(|app_handle, event| match event {
8686
#[cfg(target_os = "macos")]
8787
tauri::RunEvent::Reopen { has_visible_windows, .. } => {
88-
window::handle_macos_reopen(&_app_handle, has_visible_windows);
88+
window::handle_macos_reopen(&app_handle, has_visible_windows);
89+
}
90+
tauri::RunEvent::Exit => {
91+
cleanup_temp_screenshot_dir(&app_handle);
8992
}
9093
_ => {}
9194
});

src-tauri/src/screenshot.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,17 @@ fn normalized(s: &str) -> String {
2828
.replace("|", "-")
2929
}
3030

31+
pub fn cleanup_temp_screenshot_dir(app: &AppHandle) {
32+
if let Ok(temp_screenshot_folder) = app
33+
.path()
34+
.resolve("temp_screenshot", BaseDirectory::AppData)
35+
{
36+
if std::fs::metadata(&temp_screenshot_folder).is_ok() {
37+
let _ = std::fs::remove_dir_all(&temp_screenshot_folder);
38+
}
39+
}
40+
}
41+
3142
#[allow(dead_code)]
3243
#[tauri::command]
3344
pub fn screenshot(app: AppHandle) -> Vec<ScreenshotImage> {
@@ -43,9 +54,7 @@ pub fn screenshot(app: AppHandle) -> Vec<ScreenshotImage> {
4354
.path()
4455
.resolve("temp_screenshot", BaseDirectory::AppData)
4556
.unwrap();
46-
if std::fs::metadata(&temp_screenshot_folder).is_ok() {
47-
std::fs::remove_dir_all(&temp_screenshot_folder).unwrap();
48-
}
57+
cleanup_temp_screenshot_dir(&app);
4958
std::fs::create_dir(&temp_screenshot_folder).unwrap();
5059

5160
let mut files: Vec<ScreenshotImage> = Vec::new();

src/app/core/main/mark/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ import useMarkStore from "@/stores/mark"
1010
import { Button } from "@/components/ui/button"
1111
import { clearTrash } from "@/db/marks"
1212
import { confirm } from '@tauri-apps/plugin-dialog';
13-
import { filterMarks } from "./mark-filters.mjs";
13+
import { filterMarks, getTrashRecordFilters } from "./mark-filters";
1414

1515
export function NoteSidebar() {
1616
const t = useTranslations();
1717
const { trashState, marks, setMarks, recordFilters, initRecordViewMode } = useMarkStore()
18-
const visibleTrashMarks = React.useMemo(() => filterMarks(marks, recordFilters), [marks, recordFilters])
18+
const visibleTrashMarks = React.useMemo(() => filterMarks(marks, getTrashRecordFilters()), [marks])
1919

2020
useEffect(() => {
2121
initRecordViewMode()

src/app/core/main/mark/mark-filters.spec.mjs

Lines changed: 0 additions & 127 deletions
This file was deleted.
Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
1+
import type { Mark } from '@/db/marks'
2+
3+
type RecordTimePreset = 'all' | 'today' | 'last7Days' | 'last30Days'
4+
5+
type RecordFiltersLike = {
6+
search: string
7+
selectedTypes: Mark['type'][]
8+
timePreset: RecordTimePreset
9+
tagId: number | 'all'
10+
}
11+
112
const DAY_IN_MS = 24 * 60 * 60 * 1000
2-
const VALID_TYPES = new Set(['scan', 'text', 'image', 'link', 'file', 'recording', 'todo'])
3-
const VALID_TIME_PRESETS = new Set(['all', 'today', 'last7Days', 'last30Days'])
13+
const VALID_TYPES = new Set<Mark['type']>(['scan', 'text', 'image', 'link', 'file', 'recording', 'todo'])
14+
const VALID_TIME_PRESETS = new Set<RecordTimePreset>(['all', 'today', 'last7Days', 'last30Days'])
415

5-
function normalizeText(value) {
16+
function normalizeText(value?: string | null): string {
617
return (value || '').trim().toLowerCase()
718
}
819

9-
function matchesTimePreset(createdAt, timePreset, now) {
20+
function matchesTimePreset(createdAt: number, timePreset: RecordTimePreset, now: string | Date): boolean {
1021
if (timePreset === 'all') {
1122
return true
1223
}
@@ -38,7 +49,7 @@ function matchesTimePreset(createdAt, timePreset, now) {
3849
return true
3950
}
4051

41-
function matchesSearch(mark, search) {
52+
function matchesSearch(mark: Pick<Mark, 'content' | 'desc' | 'url'>, search: string): boolean {
4253
if (!search) {
4354
return true
4455
}
@@ -50,14 +61,16 @@ function matchesSearch(mark, search) {
5061
return haystack.includes(search)
5162
}
5263

53-
export function normalizeRecordFilters(filters) {
64+
export function normalizeRecordFilters(filters?: Partial<RecordFiltersLike>): RecordFiltersLike {
5465
const search = typeof filters?.search === 'string' ? filters.search : ''
5566
const selectedTypes = Array.isArray(filters?.selectedTypes)
56-
? filters.selectedTypes.filter((type) => VALID_TYPES.has(type))
67+
? filters.selectedTypes.filter((type): type is Mark['type'] => VALID_TYPES.has(type))
5768
: []
58-
const timePreset = VALID_TIME_PRESETS.has(filters?.timePreset) ? filters.timePreset : 'all'
69+
const timePreset: RecordTimePreset = filters?.timePreset && VALID_TIME_PRESETS.has(filters.timePreset) ? filters.timePreset : 'all'
5970
const parsedTagId = typeof filters?.tagId === 'string' ? Number(filters.tagId) : filters?.tagId
60-
const tagId = Number.isInteger(parsedTagId) && parsedTagId > 0 ? parsedTagId : 'all'
71+
const tagId: RecordFiltersLike['tagId'] = typeof parsedTagId === 'number' && Number.isInteger(parsedTagId) && parsedTagId > 0
72+
? parsedTagId
73+
: 'all'
6174

6275
return {
6376
search,
@@ -67,7 +80,16 @@ export function normalizeRecordFilters(filters) {
6780
}
6881
}
6982

70-
export function buildRecordFilterSummary(filters) {
83+
export function getTrashRecordFilters(): RecordFiltersLike {
84+
return {
85+
search: '',
86+
selectedTypes: [],
87+
timePreset: 'all',
88+
tagId: 'all',
89+
}
90+
}
91+
92+
export function buildRecordFilterSummary(filters?: Partial<RecordFiltersLike>) {
7193
const normalized = normalizeRecordFilters(filters)
7294

7395
return {
@@ -84,7 +106,10 @@ export function buildRecordFilterSummary(filters) {
84106
}
85107
}
86108

87-
export function filterMarks(marks, filters) {
109+
export function filterMarks(
110+
marks: Mark[],
111+
filters?: Partial<RecordFiltersLike> & { now?: string | Date }
112+
) {
88113
const normalizedFilters = normalizeRecordFilters(filters)
89114
const search = normalizeText(normalizedFilters.search)
90115
const selectedTypes = new Set(normalizedFilters.selectedTypes)

src/app/core/main/mark/mark-list.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Badge } from "@/components/ui/badge";
77
import useMarkStore from "@/stores/mark";
88
import { MarkLoading } from "./mark-loading";
99
import MarkEmpty from "./mark-empty";
10-
import { buildRecordFilterSummary, filterMarks } from "./mark-filters.mjs";
10+
import { buildRecordFilterSummary, filterMarks, getTrashRecordFilters } from "./mark-filters";
1111
import { MarkListDefaultView } from "./mark-list-default-view";
1212
import { MarkListCompactView } from "./mark-list-compact-view";
1313
import { MarkListCardView } from "./mark-list-card-view";
@@ -17,17 +17,22 @@ export const MarkList = React.memo(function MarkList() {
1717
const {
1818
marks,
1919
queues,
20+
trashState,
2021
recordFilters,
2122
recordViewMode,
2223
hasActiveRecordFilters,
2324
setVisibleMarkIds,
2425
} = useMarkStore()
2526

27+
const effectiveFilters = React.useMemo(() => (
28+
trashState ? getTrashRecordFilters() : recordFilters
29+
), [trashState, recordFilters])
30+
2631
const filteredMarks = React.useMemo(() => (
27-
filterMarks(marks, recordFilters)
28-
), [marks, recordFilters])
32+
filterMarks(marks, effectiveFilters)
33+
), [marks, effectiveFilters])
2934

30-
const filterSummary = React.useMemo(() => buildRecordFilterSummary(recordFilters), [recordFilters])
35+
const filterSummary = React.useMemo(() => buildRecordFilterSummary(effectiveFilters), [effectiveFilters])
3136

3237
React.useEffect(() => {
3338
setVisibleMarkIds(filteredMarks.map((mark: Mark) => mark.id))
@@ -50,7 +55,7 @@ export const MarkList = React.memo(function MarkList() {
5055
<div className="flex-1 overflow-y-auto">
5156
<div className="px-0">
5257
<div>
53-
{hasActiveRecordFilters() ? (
58+
{!trashState && hasActiveRecordFilters() ? (
5459
<div className="border-b bg-muted/20 px-3 py-2">
5560
<div className="flex flex-wrap items-center gap-2">
5661
<Badge variant="secondary" className="rounded-full px-2 py-0 text-[11px]">
@@ -89,7 +94,7 @@ export const MarkList = React.memo(function MarkList() {
8994
{
9095
filteredMarks.length ? (
9196
view
92-
) : hasActiveRecordFilters() ? (
97+
) : !trashState && hasActiveRecordFilters() ? (
9398
<div className="flex flex-col justify-center items-center flex-1 w-full pt-32 text-center">
9499
<p className="text-sm text-zinc-500">{t('emptyFiltered')}</p>
95100
<p className="mt-1 text-xs text-zinc-400">{t('emptyFilteredHint')}</p>

src/app/core/main/mark/tag-manage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import useMarkStore from "@/stores/mark"
2424
import useChatStore from "@/stores/chat"
2525
import { MarkLoading } from './mark-loading'
2626
import { ImageGallery } from './image-gallery'
27-
import { filterMarks } from './mark-filters.mjs'
27+
import { filterMarks } from './mark-filters'
2828
import { MarkListDefaultView } from './mark-list-default-view'
2929
import { MarkListCompactView } from './mark-list-compact-view'
3030
import { MarkListCardView } from './mark-list-card-view'

src/app/mobile/record/mobile-record-stream.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigge
1414
import { Sheet, SheetContent, SheetHeader, SheetTitle } from '@/components/ui/sheet'
1515
import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from '@/components/ui/drawer'
1616
import { Trash2, MoveRight, CheckSquare, Filter, Plus, ListChecks, RotateCcw, Search, ChevronDown, XCircle } from 'lucide-react'
17-
import { filterMarks } from '@/app/core/main/mark/mark-filters.mjs'
17+
import { filterMarks, getTrashRecordFilters } from '@/app/core/main/mark/mark-filters'
1818
import { getMarkTypeChipClasses, MARK_TYPE_OPTIONS } from '@/app/core/main/mark/mark-type-meta'
1919
import useMarkStore, { RecordTimePreset } from '@/stores/mark'
2020
import useTagStore from '@/stores/tag'
@@ -140,10 +140,16 @@ export function MobileRecordStream() {
140140

141141
const records = marks
142142
const tagMap = useMemo(() => new Map(tags.map((tag) => [tag.id, tag.name])), [tags])
143-
const mobileRecordFilters = useMemo(() => ({
144-
...recordFilters,
145-
tagId: 'all' as const,
146-
}), [recordFilters])
143+
const mobileRecordFilters = useMemo(() => {
144+
if (trashState) {
145+
return getTrashRecordFilters()
146+
}
147+
148+
return {
149+
...recordFilters,
150+
tagId: 'all' as const,
151+
}
152+
}, [trashState, recordFilters])
147153

148154
const filteredRecords = useMemo(() => {
149155
return filterMarks(records, mobileRecordFilters)

0 commit comments

Comments
 (0)