chore: 添加保存调试日志、修复 time-tracking 类型、简化首页
This commit is contained in:
@@ -239,9 +239,18 @@ router.post(
|
||||
validateBody(saveFileSchema),
|
||||
asyncHandler(async (req: Request, res: Response) => {
|
||||
const { path: relPath, content } = req.body
|
||||
console.log('[save] relPath:', relPath)
|
||||
console.log('[save] content length:', content?.length)
|
||||
console.log('[save] content preview:', content?.slice(0, 100))
|
||||
const { fullPath } = resolveNotebookPath(relPath)
|
||||
console.log('[save] fullPath:', fullPath)
|
||||
await fs.mkdir(path.dirname(fullPath), { recursive: true })
|
||||
console.log('[save] before writeFile')
|
||||
await fs.writeFile(fullPath, content, 'utf-8')
|
||||
console.log('[save] after writeFile, checking file...')
|
||||
const writtenContent = await fs.readFile(fullPath, 'utf-8')
|
||||
console.log('[save] written content length:', writtenContent?.length)
|
||||
console.log('[save] written content preview:', writtenContent?.slice(0, 100))
|
||||
|
||||
successResponse(res, null)
|
||||
}),
|
||||
|
||||
@@ -183,7 +183,7 @@ class SessionPersistenceService implements SessionPersistence {
|
||||
try {
|
||||
const content = await fs.readFile(filePath, 'utf-8')
|
||||
const data = JSON.parse(content)
|
||||
data.activeDays = Object.values(data.days).filter(d => d.totalDuration > 0).length
|
||||
data.activeDays = Object.values(data.days).filter((d: any) => d.totalDuration > 0).length
|
||||
return data
|
||||
} catch (err) {
|
||||
return createEmptyMonthData(year, month)
|
||||
@@ -195,7 +195,7 @@ class SessionPersistenceService implements SessionPersistence {
|
||||
try {
|
||||
const content = await fs.readFile(filePath, 'utf-8')
|
||||
const data = JSON.parse(content)
|
||||
data.totalActiveDays = Object.values(data.months).filter(m => m.totalDuration > 0).length
|
||||
data.totalActiveDays = Object.values(data.months).filter((m: any) => m.totalDuration > 0).length
|
||||
return data
|
||||
} catch (err) {
|
||||
return createEmptyYearData(year)
|
||||
|
||||
@@ -389,7 +389,7 @@ class TimeTrackerService {
|
||||
const yearData = await this.persistence.getYearData(targetYear)
|
||||
totalDuration = yearData.yearlyTotal
|
||||
activeDays = Object.values(yearData.months).reduce((sum, m) => {
|
||||
return sum + Object.entries(m).filter(([_, d]) => (d as { totalDuration: number }).totalDuration > 0).length
|
||||
return sum + Object.entries(m).filter(([_, d]) => (d as any).totalDuration > 0).length
|
||||
}, 0)
|
||||
|
||||
for (const [month, summary] of Object.entries(yearData.months)) {
|
||||
|
||||
@@ -1,62 +1,7 @@
|
||||
import { useRef, useEffect, useState } from 'react'
|
||||
import React from 'react'
|
||||
|
||||
export const HomePage = () => {
|
||||
const webviewRef = useRef<HTMLWebViewElement>(null)
|
||||
const [isLoading, setIsLoading] = useState(true)
|
||||
const [error, setError] = useState<string | null>(null)
|
||||
|
||||
useEffect(() => {
|
||||
const startOpencodeServer = async () => {
|
||||
try {
|
||||
const result = await window.electronAPI?.opencodeStartServer()
|
||||
if (!result?.success) {
|
||||
setError(result?.error || 'Failed to start opencode server')
|
||||
}
|
||||
} catch (err) {
|
||||
setError(err instanceof Error ? err.message : 'Unknown error')
|
||||
}
|
||||
}
|
||||
|
||||
startOpencodeServer()
|
||||
|
||||
return () => {
|
||||
window.electronAPI?.opencodeStopServer()
|
||||
}
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
const webview = webviewRef.current
|
||||
if (!webview) return
|
||||
|
||||
webview.addEventListener('did-fail-load', (e) => {
|
||||
console.error('[HomePage] Failed to load:', e)
|
||||
setIsLoading(false)
|
||||
})
|
||||
|
||||
webview.addEventListener('did-finish-load', () => {
|
||||
setIsLoading(false)
|
||||
})
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<div className="h-full w-full relative">
|
||||
{isLoading && (
|
||||
<div className="absolute inset-0 flex items-center justify-center bg-white dark:bg-gray-900 z-10">
|
||||
<div className="text-gray-500 dark:text-gray-400">正在启动 opencode 服务...</div>
|
||||
</div>
|
||||
)}
|
||||
{error && (
|
||||
<div className="absolute inset-0 flex items-center justify-center bg-white dark:bg-gray-900 z-10">
|
||||
<div className="text-red-500">启动失败: {error}</div>
|
||||
</div>
|
||||
)}
|
||||
<webview
|
||||
ref={webviewRef}
|
||||
src="http://127.0.0.1:4096"
|
||||
className="w-full h-full"
|
||||
nodeintegration={false}
|
||||
webpreferences="contextIsolation=yes"
|
||||
/>
|
||||
</div>
|
||||
<div className="h-full w-full" />
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user