feat: d1 local cache

This commit is contained in:
shinya
2025-07-14 22:09:53 +08:00
parent 7e6f4bcadc
commit b61430856a
6 changed files with 992 additions and 121 deletions

View File

@@ -10,6 +10,7 @@ import {
clearSearchHistory,
deleteSearchHistory,
getSearchHistory,
subscribeToDataUpdates,
} from '@/lib/db.client';
import { SearchResult } from '@/lib/types';
@@ -85,7 +86,19 @@ function SearchPageClient() {
useEffect(() => {
// 无搜索参数时聚焦搜索框
!searchParams.get('q') && document.getElementById('searchInput')?.focus();
// 初始加载搜索历史
getSearchHistory().then(setSearchHistory);
// 监听搜索历史更新事件
const unsubscribe = subscribeToDataUpdates(
'searchHistoryUpdated',
(newHistory: string[]) => {
setSearchHistory(newHistory);
}
);
return unsubscribe;
}, []);
useEffect(() => {
@@ -95,11 +108,8 @@ function SearchPageClient() {
setSearchQuery(query);
fetchSearchResults(query);
// 保存到搜索历史
addSearchHistory(query).then(async () => {
const history = await getSearchHistory();
setSearchHistory(history);
});
// 保存到搜索历史 (事件监听会自动更新界面)
addSearchHistory(query);
} else {
setShowResults(false);
}
@@ -161,11 +171,8 @@ function SearchPageClient() {
// 直接发请求
fetchSearchResults(trimmed);
// 保存到搜索历史
addSearchHistory(trimmed).then(async () => {
const history = await getSearchHistory();
setSearchHistory(history);
});
// 保存到搜索历史 (事件监听会自动更新界面)
addSearchHistory(trimmed);
};
return (
@@ -276,9 +283,8 @@ function SearchPageClient() {
{searchHistory.length > 0 && (
<button
onClick={async () => {
await clearSearchHistory();
setSearchHistory([]);
onClick={() => {
clearSearchHistory(); // 事件监听会自动更新界面
}}
className='ml-3 text-sm text-gray-500 hover:text-red-500 transition-colors dark:text-gray-400 dark:hover:text-red-500'
>
@@ -303,12 +309,10 @@ function SearchPageClient() {
{/* 删除按钮 */}
<button
aria-label='删除搜索历史'
onClick={async (e) => {
onClick={(e) => {
e.stopPropagation();
e.preventDefault();
await deleteSearchHistory(item);
const history = await getSearchHistory();
setSearchHistory(history);
deleteSearchHistory(item); // 事件监听会自动更新界面
}}
className='absolute -top-1 -right-1 w-4 h-4 opacity-0 group-hover:opacity-100 bg-gray-400 hover:bg-red-500 text-white rounded-full flex items-center justify-center text-[10px] transition-colors'
>