feat: secure inline review sidecar

This commit is contained in:
akai
2026-07-10 12:37:13 +08:00
parent 48383b3db6
commit da756eed47
17 changed files with 556 additions and 86 deletions
@@ -80,9 +80,14 @@ const ReviewModeToggler: React.FC<ReviewModeTogglerProps> = ({ bookKey }) => {
try {
const launch = await launchInlineReviewEditor(appService, bookData.book);
const data = await loadInlineReviewData(launch.url, launch.sessionId);
const data = await loadInlineReviewData(
launch.url,
launch.sessionId,
launch.accessToken,
);
setBookData(bookKey, {
baseUrl: launch.url,
accessToken: launch.accessToken,
sessionId: launch.sessionId,
reviewRoot: launch.reviewRoot,
version: launch.version,
@@ -25,7 +25,6 @@ import { useReaderStore } from '@/store/readerStore';
import { useReviewModeStore } from '@/store/reviewModeStore';
import { useThemeStore } from '@/store/themeStore';
import { getPanelTopInset } from '@/utils/insets';
import { openExternalUrl } from '@/utils/open';
import { useReviewPanelDrag } from '../hooks/useReviewPanelDrag';
import { useReviewPanelFloatingResize } from '../hooks/useReviewPanelFloatingResize';
import {
@@ -762,8 +761,8 @@ const ReviewPanel: React.FC = () => {
? new URL(payload.download_url, baseUrl).toString()
: '';
setExportInfo(downloadUrl || payload.output || '');
if (downloadUrl && !appService?.isDesktopApp) {
await downloadReviewedEpub(downloadUrl);
if (downloadUrl) {
await downloadReviewedEpub(downloadUrl, bookState.accessToken);
}
setMessage(`已导出:${payload.output || downloadUrl}`);
} catch (error) {
@@ -983,17 +982,9 @@ const ReviewPanel: React.FC = () => {
<button
type='button'
className='eink-bordered border-base-300 bg-base-100 hover:bg-base-200 rounded-md border p-3 text-start text-sm'
onClick={() => {
if (appService?.isDesktopApp) {
openExternalUrl(exportInfo);
} else {
void downloadReviewedEpub(exportInfo);
}
}}
onClick={() => void downloadReviewedEpub(exportInfo, bookState.accessToken)}
>
<span className='font-semibold'>
{appService?.isDesktopApp ? '在浏览器下载导出文件' : '重新下载导出文件'}
</span>
<span className='font-semibold'></span>
<span className='text-base-content/60 mt-1 block break-all text-xs'>
{exportInfo}
</span>