Skip to content

Commit 4709f8c

Browse files
authored
feat: enhance ui for skipped version (#834)
1 parent 4696aa1 commit 4709f8c

File tree

4 files changed

+36
-24
lines changed

4 files changed

+36
-24
lines changed

docs/content.en/docs/release-notes/_index.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@ title: "Release Notes"
77

88
Information about release notes of Coco App is provided here.
99

10-
1110
## Latest (In development)
11+
1212
### ❌ Breaking changes
13+
1314
### 🚀 Features
15+
16+
- feat: enhance ui for skipped version #834
17+
1418
### 🐛 Bug fix
15-
### ✈️ Improvements
1619

20+
- fix: fix issue with update check failure #833
21+
22+
### ✈️ Improvements
1723

1824
## 0.7.1 (2025-07-27)
1925

@@ -24,7 +30,6 @@ Information about release notes of Coco App is provided here.
2430
### 🐛 Bug fix
2531

2632
- fix: correct enter key behavior #828
27-
- fix: fix issue with update check failure #833
2833

2934
### ✈️ Improvements
3035

src/components/Common/UI/Footer.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback } from "react";
1+
import { useCallback, useMemo } from "react";
22
import { ArrowDown01, CornerDownLeft } from "lucide-react";
33
import { useTranslation } from "react-i18next";
44
import clsx from "clsx";
@@ -44,14 +44,18 @@ export default function Footer({ setIsPinnedWeb }: FooterProps) {
4444
onPinChange: setIsPinnedWeb,
4545
});
4646

47-
const { setVisible, updateInfo } = useUpdateStore();
47+
const { setVisible, updateInfo, skipVersions } = useUpdateStore();
4848

4949
const { fixedWindow, modifierKey } = useShortcutsStore();
5050

5151
const openSetting = useCallback(() => {
5252
return platformAdapter.emitEvent("open_settings", "");
5353
}, []);
5454

55+
const hasUpdate = useMemo(() => {
56+
return updateInfo && !skipVersions.includes(updateInfo.version);
57+
}, [updateInfo, skipVersions]);
58+
5559
const renderLeft = () => {
5660
if (sourceData?.source?.name) {
5761
return (
@@ -97,7 +101,7 @@ export default function Footer({ setIsPinnedWeb }: FooterProps) {
97101
/>
98102

99103
<div className="relative text-xs text-gray-500 dark:text-gray-400">
100-
{updateInfo?.available ? (
104+
{hasUpdate ? (
101105
<div className="cursor-pointer" onClick={() => setVisible(true)}>
102106
<span>{t("search.footer.updateAvailable")}</span>
103107
<span className="absolute top-0 -right-2 size-1.5 bg-[#FF3434] rounded-full"></span>
@@ -127,7 +131,7 @@ export default function Footer({ setIsPinnedWeb }: FooterProps) {
127131
onClick={togglePin}
128132
className={clsx({
129133
"text-blue-500": isPinned,
130-
"pl-2": updateInfo?.available,
134+
"pl-2": hasUpdate,
131135
})}
132136
>
133137
<VisibleKey shortcut={fixedWindow} onKeyPress={togglePin}>

src/components/UpdateApp/index.tsx

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ const UpdateApp = ({ isCheckPage }: UpdateAppProps) => {
3232
const {
3333
visible,
3434
setVisible,
35-
skipVersion,
36-
setSkipVersion,
35+
skipVersions,
36+
setSkipVersions,
3737
isOptional,
3838
updateInfo,
3939
setUpdateInfo,
@@ -75,13 +75,13 @@ const UpdateApp = ({ isCheckPage }: UpdateAppProps) => {
7575
const update = await checkUpdate();
7676

7777
if (update) {
78-
setUpdateInfo(update);
78+
const { skipVersions } = useUpdateStore.getState();
7979

80-
if (skipVersion === update.version) return;
80+
setVisible(!skipVersions.includes(update.version));
8181

82-
setVisible(true);
82+
setUpdateInfo(update);
8383
}
84-
}, [skipVersion]);
84+
}, [skipVersions]);
8585

8686
const cursorClassName = useMemo(() => {
8787
return state.loading ? "cursor-not-allowed" : "cursor-pointer";
@@ -129,7 +129,9 @@ const UpdateApp = ({ isCheckPage }: UpdateAppProps) => {
129129
const handleSkip = () => {
130130
if (state.loading) return;
131131

132-
setSkipVersion(updateInfo?.version);
132+
const { skipVersions, updateInfo } = useUpdateStore.getState();
133+
134+
setSkipVersions([...skipVersions, updateInfo.version]);
133135

134136
isCheckPage ? hide_check() : setVisible(false);
135137
};
@@ -178,7 +180,7 @@ const UpdateApp = ({ isCheckPage }: UpdateAppProps) => {
178180
<img src={isDark ? darkIcon : lightIcon} className="h-6" />
179181

180182
<div className="text-[#333] text-sm leading-5 py-2 dark:text-[#D8D8D8] text-center">
181-
{updateInfo?.available ? (
183+
{updateInfo ? (
182184
isOptional ? (
183185
t("update.optional_description")
184186
) : (
@@ -192,7 +194,7 @@ const UpdateApp = ({ isCheckPage }: UpdateAppProps) => {
192194
)}
193195
</div>
194196

195-
{updateInfo?.available ? (
197+
{updateInfo ? (
196198
<div
197199
className="text-xs text-[#0072FF] cursor-pointer"
198200
onClick={() =>
@@ -219,21 +221,21 @@ const UpdateApp = ({ isCheckPage }: UpdateAppProps) => {
219221
cursorClassName,
220222
state.loading && "opacity-50"
221223
)}
222-
onClick={updateInfo?.available ? handleDownload : handleSkip}
224+
onClick={updateInfo ? handleDownload : handleSkip}
223225
>
224226
{state.loading ? (
225227
<div className="flex justify-center items-center gap-2">
226228
<LoaderCircle className="animate-spin size-5" />
227229
{percent}%
228230
</div>
229-
) : updateInfo?.available ? (
231+
) : updateInfo ? (
230232
t("update.button.install")
231233
) : (
232234
t("update.button.ok")
233235
)}
234236
</Button>
235237

236-
{updateInfo?.available && isOptional && (
238+
{!isCheckPage && updateInfo && isOptional && (
237239
<div
238240
className={clsx("text-xs text-[#999]", cursorClassName)}
239241
onClick={handleSkip}

src/stores/updateStore.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { persist } from "zustand/middleware";
44
export type IUpdateStore = {
55
visible: boolean;
66
setVisible: (visible: boolean) => void;
7-
skipVersion?: string;
8-
setSkipVersion: (skipVersion?: string) => void;
7+
skipVersions: string[];
8+
setSkipVersions: (skipVersions: string[]) => void;
99
isOptional: boolean;
1010
setIsOptional: (isOptional: boolean) => void;
1111
updateInfo?: any;
@@ -19,8 +19,9 @@ export const useUpdateStore = create<IUpdateStore>()(
1919
setVisible: (visible: boolean) => {
2020
return set({ visible });
2121
},
22-
setSkipVersion: (skipVersion?: string) => {
23-
return set({ skipVersion });
22+
skipVersions: [],
23+
setSkipVersions: (skipVersions: string[]) => {
24+
return set({ skipVersions });
2425
},
2526
isOptional: true,
2627
setIsOptional: (isOptional: boolean) => {
@@ -33,7 +34,7 @@ export const useUpdateStore = create<IUpdateStore>()(
3334
{
3435
name: "update-store",
3536
partialize: (state) => ({
36-
skipVersion: state.skipVersion,
37+
skipVersions: state.skipVersions,
3738
}),
3839
}
3940
)

0 commit comments

Comments
 (0)