[desktop] Don't show what's new on fresh installs

This commit is contained in:
Manav Rathi
2024-07-13 08:56:32 +05:30
parent b525e91aa1
commit 6e9dd8d4c8
3 changed files with 35 additions and 20 deletions

View File

@@ -390,7 +390,7 @@ export default function Gallery() {
}, SYNC_INTERVAL_IN_MICROSECONDS);
if (electron) {
electron.onMainWindowFocus(() => syncWithRemote(false, true));
if (await shouldShowWhatsNew()) setOpenWhatsNew(true);
if (await shouldShowWhatsNew(electron)) setOpenWhatsNew(true);
}
};
main();

View File

@@ -1,3 +1,4 @@
import { ensureElectron } from "@/next/electron";
import { ut } from "@/next/i18n";
import ArrowForward from "@mui/icons-material/ArrowForward";
import {
@@ -30,7 +31,7 @@ export const WhatsNew: React.FC<WhatsNewProps> = ({ open, onClose }) => {
const fullScreen = useMediaQuery("(max-width: 428px)");
useEffect(() => {
if (open) void didShowWhatsNew();
if (open) void didShowWhatsNew(ensureElectron());
}, [open]);
return (

View File

@@ -1,4 +1,4 @@
import { ensureElectron } from "@/next/electron";
import type { Electron } from "@/next/types/ipc";
/**
* The current changelog version.
@@ -9,31 +9,45 @@ import { ensureElectron } from "@/next/electron";
* integer, we increment it whenever we want to show this dialog again. Usually
* we'd do this for each app update, but not necessarily.
*
* The "What's new" dialog is shown when either we do not have a previously
* saved changelog version, or if the saved changelog version is less than the
* current {@link changelogVersion}.
* The "What's new" dialog is shown when the saved changelog version is less
* than the current {@link changelogVersion}.
*
* The shown changelog version is persisted on the Node.js layer since there we
* can store it in the user preferences store, which is not cleared on logout.
* The shown changelog version is saved on the Node.js layer since there we can
* store it in the user preferences store, which is not cleared on logout.
*
* On app start, the Node.js layer waits for the {@link onShowWhatsNew} callback
* to get attached. When a callback is attached, it checks the above conditions
* and if they are satisfied, it invokes the callback. The callback should
* return the current {@link changelogVersion} to allow the Node.js layer to
* update the persisted state.
* On app start, we read the last saved version:
*
* - If it is not present, we set it to the current version _without_ showing
* the what's new dialog. This is to handle fresh installs.
*
* - If it is present and less than the current version, we show the what's
* new dialog. Otherwise do nothing.
*
* The what's new dialog sets the saved version to the current one whenever it
* is shown.
*/
const changelogVersion = 1;
/**
* Return true if we should show the {@link WhatsNew} dialog.
*
* It has the side affect of updating the persisted version (whilst returning
* false) if there was no previous persisted changelog version version present.
*/
export const shouldShowWhatsNew = async () => {
const electron = globalThis.electron;
if (!electron) return false;
const lastShownVersion = (await electron.lastShownChangelogVersion()) ?? 0;
export const shouldShowWhatsNew = async (electron: Electron) => {
const lastShownVersion = await electron.lastShownChangelogVersion();
if (!lastShownVersion) {
// On a fresh install, save the current version but don't show the
// what's new dialog.
await electron.setLastShownChangelogVersion(changelogVersion);
return false;
}
// Show what's new if the saved version is older than the current one.
return lastShownVersion < changelogVersion;
};
export const didShowWhatsNew = async () =>
// We should only have been called if we're in electron.
ensureElectron().setLastShownChangelogVersion(changelogVersion);
/**
* Set the saved changelog version to the current changelog version.
*/
export const didShowWhatsNew = async (electron: Electron) =>
electron.setLastShownChangelogVersion(changelogVersion);