Skip to content

Commit d92ed55

Browse files
cyfung1031Copilot
andcommitted
🐛 修复 Check Update 页面异常问题 (#912)
* fix: 修复 Check Update 页面异常问题 * Update src/pages/batchupdate/App.tsx Co-authored-by: Copilot <[email protected]> * Apply suggestion from @Copilot Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Copilot <[email protected]>
1 parent 5feaa83 commit d92ed55

File tree

6 files changed

+86
-81
lines changed

6 files changed

+86
-81
lines changed

src/app/service/service_worker/client.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { type VSCodeConnect } from "../offscreen/vscode-connect";
2323
import type { GMInfoEnv } from "../content/types";
2424
import { type SystemService } from "./system";
2525
import { type ScriptInfo } from "@App/pkg/utils/scriptInstall";
26-
import type { ScriptService, TCheckScriptUpdateOption } from "./script";
26+
import type { ScriptService, TCheckScriptUpdateOption, TOpenBatchUpdatePageOption } from "./script";
2727

2828
export class ServiceWorkerClient extends Client {
2929
constructor(msgSender: MessageSend) {
@@ -202,8 +202,8 @@ export class ScriptClient extends Client {
202202
return this.do<void>("openUpdatePageByUUID", uuid);
203203
}
204204

205-
async openBatchUpdatePage(q: string) {
206-
return this.do<boolean>("openBatchUpdatePage", q);
205+
async openBatchUpdatePage(opts: TOpenBatchUpdatePageOption) {
206+
return this.do<boolean>("openBatchUpdatePage", opts);
207207
}
208208

209209
async checkScriptUpdate(opts: TCheckScriptUpdateOption) {

src/app/service/service_worker/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,10 @@ export default class ServiceWorkerManager {
224224
// 只针对该网域的有效脚本发现「有更新」进行弹出
225225
// 如该网域没有任何有效脚本则忽略
226226
const domain = newDomain;
227-
const anyOpened = await script.openBatchUpdatePage(domain ? `site=${domain}` : "", true);
227+
const anyOpened = await script.openBatchUpdatePage({
228+
q: domain ? `site=${domain}` : "",
229+
dontCheckNow: true,
230+
});
228231
if (anyOpened) {
229232
pendingOpen = 0;
230233
}

src/app/service/service_worker/script.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ export type TCheckScriptUpdateOption = Partial<
5959
{ checkType: "user"; noUpdateCheck?: number } | ({ checkType: "system" } & Record<string, any>)
6060
>;
6161

62+
export type TOpenBatchUpdatePageOption = { q: string; dontCheckNow: boolean };
63+
6264
export class ScriptService {
6365
logger: Logger;
6466
scriptCodeDAO: ScriptCodeDAO = new ScriptCodeDAO();
@@ -759,7 +761,8 @@ export class ScriptService {
759761
}
760762
}
761763

762-
async openBatchUpdatePage(q: string, dontCheckNow: boolean) {
764+
async openBatchUpdatePage(opts: TOpenBatchUpdatePageOption) {
765+
const { q, dontCheckNow } = opts;
763766
const p = q ? `?${q}` : "";
764767
await openInCurrentTab(`/src/batchupdate.html${p}`);
765768
if (!dontCheckNow) {
@@ -1300,7 +1303,7 @@ export class ScriptService {
13001303
this.group.on("sendUpdatePageOpened", this.sendUpdatePageOpened.bind(this));
13011304
this.group.on("batchUpdateListAction", this.batchUpdateListAction.bind(this));
13021305
this.group.on("openUpdatePageByUUID", this.openUpdatePageByUUID.bind(this));
1303-
this.group.on("openBatchUpdatePage", (q: string) => this.openBatchUpdatePage(q, false));
1306+
this.group.on("openBatchUpdatePage", this.openBatchUpdatePage.bind(this));
13041307
this.group.on("checkScriptUpdate", this.checkScriptUpdate.bind(this));
13051308

13061309
// 定时检查更新, 首次执行为5分钟后,然后每30分钟检查一次

src/pages/batchupdate/App.tsx

Lines changed: 67 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ const { GridItem } = Grid;
2525

2626
const { Text } = Typography;
2727

28+
// pageExecute is to store subscribe function(s) globally
29+
const pageExecute: Record<string, (data: any) => void> = {};
30+
2831
function App() {
2932
const { subscribeMessage } = useAppContext();
3033

@@ -63,83 +66,80 @@ function App() {
6366
}, 1000);
6467
}, [mTimeClose]);
6568

66-
useEffect(() => {
67-
const getBatchUpdateRecord = async (): Promise<TBatchUpdateRecordObject | null> => {
68-
let resultText = "";
69-
let r;
70-
let i = 0;
71-
while (true) {
72-
r = await scriptClient.getBatchUpdateRecordLite(i++);
73-
if (!r) break;
74-
const chunk = r.chunk;
75-
if (typeof chunk !== "string") break;
76-
resultText += chunk;
77-
if (r.ended) break;
78-
}
79-
return resultText ? JSON.parse(resultText) : null;
80-
};
81-
82-
const updateRecord = () => {
83-
getBatchUpdateRecord().then((batchUpdateRecordObjectLite) => {
84-
const list = batchUpdateRecordObjectLite?.list || [];
85-
const site = [] as TBatchUpdateRecord[];
86-
const other = [] as TBatchUpdateRecord[];
87-
const ignored = [] as TBatchUpdateRecord[];
88-
for (const entry of list) {
89-
let mEntry = entry;
90-
if (!entry.checkUpdate) {
91-
site.push(entry);
92-
continue;
93-
}
94-
const isIgnored = entry.script.ignoreVersion === entry.newMeta?.version?.[0];
95-
mEntry = {
96-
...entry,
97-
};
69+
const getBatchUpdateRecord = async (): Promise<TBatchUpdateRecordObject | null> => {
70+
let resultText = "";
71+
let r;
72+
let i = 0;
73+
while (true) {
74+
r = await scriptClient.getBatchUpdateRecordLite(i++);
75+
if (!r) break;
76+
const chunk = r.chunk;
77+
if (typeof chunk !== "string") break;
78+
resultText += chunk;
79+
if (r.ended) break;
80+
}
81+
return resultText ? JSON.parse(resultText) : null;
82+
};
9883

99-
if (isIgnored) {
100-
ignored.push(mEntry);
84+
const updateRecord = () => {
85+
getBatchUpdateRecord().then((batchUpdateRecordObjectLite) => {
86+
const list = batchUpdateRecordObjectLite?.list || [];
87+
const site = [] as TBatchUpdateRecord[];
88+
const other = [] as TBatchUpdateRecord[];
89+
const ignored = [] as TBatchUpdateRecord[];
90+
for (const entry of list) {
91+
if (!entry.checkUpdate) {
92+
site.push(entry);
93+
continue;
94+
}
95+
const isIgnored = entry.script.ignoreVersion === entry.newMeta?.version?.[0];
96+
const mEntry = {
97+
...entry,
98+
};
99+
100+
if (isIgnored) {
101+
ignored.push(mEntry);
102+
} else {
103+
if (!paramSite || mEntry.sites?.includes(paramSite)) {
104+
site.push(mEntry);
101105
} else {
102-
if (!paramSite || mEntry.sites?.includes(paramSite)) {
103-
site.push(mEntry);
104-
} else {
105-
other.push(mEntry);
106-
}
106+
other.push(mEntry);
107107
}
108108
}
109-
setRecords({ site, other, ignored });
110-
});
111-
};
112-
113-
const pageApi = {
114-
onScriptUpdateCheck(data: any) {
115-
if (
116-
mRecords === null &&
117-
((data.status ?? 0) & UpdateStatusCode.CHECKING_UPDATE) === 0 &&
118-
((data.status ?? 0) & UpdateStatusCode.CHECKED_BEFORE) === UpdateStatusCode.CHECKED_BEFORE
119-
) {
120-
setStatusText(
121-
t("updatepage.status_last_check").replace("$0", data.checktime ? dayFormat(new Date(data.checktime)) : "")
122-
);
123-
updateRecord();
124-
setCheckUpdateSpin(false);
125-
} else if (((data.status ?? 0) & UpdateStatusCode.CHECKING_UPDATE) === UpdateStatusCode.CHECKING_UPDATE) {
126-
setStatusText(t("updatepage.status_checking_updates"));
127-
setRecords(null);
128-
setCheckUpdateSpin(true);
129-
} else if (mRecords !== null && data.refreshRecord === true) {
130-
updateRecord();
131-
}
132-
},
133-
};
109+
}
110+
setRecords({ site, other, ignored });
111+
});
112+
};
113+
114+
const onScriptUpdateCheck = (data: any) => {
115+
if (
116+
mRecords === null &&
117+
((data.status ?? 0) & UpdateStatusCode.CHECKING_UPDATE) === 0 &&
118+
((data.status ?? 0) & UpdateStatusCode.CHECKED_BEFORE) === UpdateStatusCode.CHECKED_BEFORE
119+
) {
120+
setStatusText(
121+
t("updatepage.status_last_check").replace("$0", data.checktime ? dayFormat(new Date(data.checktime)) : "")
122+
);
123+
updateRecord();
124+
setCheckUpdateSpin(false);
125+
} else if (((data.status ?? 0) & UpdateStatusCode.CHECKING_UPDATE) === UpdateStatusCode.CHECKING_UPDATE) {
126+
setStatusText(t("updatepage.status_checking_updates"));
127+
setRecords(null);
128+
setCheckUpdateSpin(true);
129+
} else if (mRecords !== null && data.refreshRecord === true) {
130+
updateRecord();
131+
}
132+
};
134133

135-
return subscribeMessage("onScriptUpdateCheck", pageApi.onScriptUpdateCheck);
136-
}, [mRecords, paramSite, subscribeMessage, t]);
134+
// 每次render会重新定义 pageExecute 的 onScriptUpdateCheck
135+
pageExecute.onScriptUpdateCheck = onScriptUpdateCheck;
137136

137+
// 只在第一次render执行
138138
const doInitial = () => {
139139
// faster than useEffect
140140
setInitial(true);
141+
subscribeMessage("onScriptUpdateCheck", (msg) => pageExecute.onScriptUpdateCheck!(msg));
141142
scriptClient.fetchCheckUpdateStatus();
142-
// updateRecord();
143143
scriptClient.sendUpdatePageOpened();
144144
};
145145

src/pages/popup/App.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -287,10 +287,6 @@ function App() {
287287
return domain;
288288
};
289289

290-
const doCheckUpdateInPopupMenu = async () => {
291-
const domain = getUrlDomain(currentUrl);
292-
await requestOpenBatchUpdatePage(`autoclose=-1${domain ? `&site=${domain}` : ""}`);
293-
};
294290
const handleMenuClick = async (key: string) => {
295291
switch (key) {
296292
case "newScript":
@@ -300,7 +296,7 @@ function App() {
300296
window.open("/src/options.html#/script/editor?target=initial", "_blank");
301297
break;
302298
case "checkUpdate":
303-
await doCheckUpdateInPopupMenu(); // 在service_worker打开新tab及进行检查。
299+
requestOpenBatchUpdatePage(getUrlDomain(currentUrl));
304300
break;
305301
case "report_issue": {
306302
const browserInfo = `${navigator.userAgent}`;

src/pages/store/features/script.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
} from "@App/app/service/service_worker/client";
1212
import { message } from "../global";
1313
import type { SearchType, TBatchUpdateListAction } from "@App/app/service/service_worker/types";
14-
import { type TCheckScriptUpdateOption } from "@App/app/service/service_worker/script";
14+
import type { TOpenBatchUpdatePageOption, TCheckScriptUpdateOption } from "@App/app/service/service_worker/script";
1515

1616
export const scriptClient = new ScriptClient(message);
1717
export const subscribeClient = new SubscribeClient(message);
@@ -62,8 +62,11 @@ export const requestOpenUpdatePageByUUID = async (uuid: string) => {
6262
return await scriptClient.openUpdatePageByUUID(uuid);
6363
};
6464

65-
export const requestOpenBatchUpdatePage = async (q: string) => {
66-
return await scriptClient.openBatchUpdatePage(q);
65+
export const requestOpenBatchUpdatePage = async (domain: string) => {
66+
return await scriptClient.openBatchUpdatePage({
67+
q: `autoclose=-1${domain ? `&site=${domain}` : ""}`,
68+
dontCheckNow: false,
69+
} as TOpenBatchUpdatePageOption);
6770
};
6871

6972
export const requestCheckScriptUpdate = async (opts: TCheckScriptUpdateOption) => {

0 commit comments

Comments
 (0)