Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,17 @@
"remark-gfm": "^4.0.1"
},
"devDependencies": {
"@eslint/js": "^9.39.4",
"@eslint/js": "^10.0.1",
"@types/better-sqlite3": "^7.6.13",
"@types/react": "^19.2.15",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"electron": "^41.7.0",
"electron-builder": "^26.8.1",
"electron-vite": "^5.0.0",
"eslint": "^9.39.4",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint": "^10.4.0",
"eslint-plugin-react-hooks": "^7.1.1",
"globals": "^17.6.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"typescript": "^5.9.3",
Expand Down
255 changes: 102 additions & 153 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/renderer/components/ChatView/ChatView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ export default function ChatView({ sessionId }: ChatViewProps) {
const [showFiles, setShowFiles] = useState(false)

useEffect(() => {
// eslint-disable-next-line react-hooks/set-state-in-effect -- 切 session 時 reset 面板狀態再 fetch (reset-on-id)
setShowFiles(false)
setSessionFiles([])
let cancelled = false
Expand Down
2 changes: 1 addition & 1 deletion src/renderer/components/Dashboard/DashboardPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@ export default function DashboardPage() {

useEffect(() => {
let cancelled = false
setLoading(true)
;(async () => {
setLoading(true)
try {
const results = await Promise.allSettled([
window.api.getUsageStats(projectFilter, range),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export default function FontScaleSwitcher() {

const handleKeyDown = useCallback(
(event: KeyboardEvent<HTMLButtonElement>, currentIndex: number) => {
let nextIndex = currentIndex
let nextIndex: number
switch (event.key) {
case 'ArrowRight':
case 'ArrowDown':
Expand Down
4 changes: 4 additions & 0 deletions src/renderer/components/Sidebar/SearchBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,13 @@ export default function SearchBar() {
const searchTypeRef = useRef(searchType)
const scopeRef = useRef(scope)
const searchSeqRef = useRef(0)
// eslint-disable-next-line react-hooks/refs -- latest-ref: 最新值供 executeSearch async callback 讀, 刻意避免其 identity 變動
searchTypeRef.current = searchType
// eslint-disable-next-line react-hooks/refs -- latest-ref
scopeRef.current = scope

// 外部清搜尋(如切換專案)時同步 input
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync 外部 searchQuery 到本地 input state
useEffect(() => { setInput(searchQuery) }, [searchQuery])

const announceResult = useCallback((type: SearchScope, count: number, groups: number, q: string) => {
Expand Down Expand Up @@ -97,6 +100,7 @@ export default function SearchBar() {
// filter 變更時,若已有搜尋 query 則自動重新搜尋
useEffect(() => {
if (searchQuery) {
// eslint-disable-next-line react-hooks/set-state-in-effect -- filter 變更時重搜, executeSearch 內 setSearching 為刻意
executeSearch(searchQuery, buildSearchOptions(dateRange, sortBy))
}
// eslint-disable-next-line react-hooks/exhaustive-deps -- 只在 filter 變更時觸發
Expand Down
2 changes: 2 additions & 0 deletions src/renderer/components/Sidebar/SearchResults.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ export default function SearchResults() {

const groups = useMemo(() => groupSearchResults(searchResults), [searchResults])

// eslint-disable-next-line react-hooks/set-state-in-effect -- searchQuery 變更時 reset 摺疊 (reset-on-prop)
useEffect(() => { setCollapsedGroups(new Set()) }, [searchQuery])

const toggleGroup = (sessionId: string) => {
Expand Down Expand Up @@ -150,6 +151,7 @@ export default function SearchResults() {
{...listboxProps}
>
<div className={styles.count}>{t('sidebar.searchResults.count', { count: searchResults.length, groups: groups.length })}</div>
{/* eslint-disable-next-line react-hooks/refs -- ref-as-cache: contextCacheRef 快取 context, render 讀取為刻意 */}
{groups.map((g) => {
const collapsed = collapsedGroups.has(g.sessionId)
return (
Expand Down
1 change: 1 addition & 0 deletions src/renderer/components/Storage/StoragePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export default function StoragePage() {
}, [t])

useEffect(() => {
// eslint-disable-next-line react-hooks/set-state-in-effect -- mount-fetch: 載入 storage overview
refresh()
}, [refresh])

Expand Down
2 changes: 1 addition & 1 deletion src/renderer/components/ThemeSwitcher/ThemeSwitcher.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export default function ThemeSwitcher() {

const handleKeyDown = useCallback(
(event: KeyboardEvent<HTMLButtonElement>, currentIndex: number) => {
let nextIndex = currentIndex
let nextIndex: number
switch (event.key) {
case 'ArrowRight':
case 'ArrowDown':
Expand Down
Loading