-
-
INSTALLED
+
{getPackageBadgeText(pkg)}
v{pkg?.installed_versions?.[0]}
diff --git a/modules/desktop/src/components/packages/packages.svelte b/modules/desktop/src/components/packages/packages.svelte
index 4ddd9e3..48230bb 100644
--- a/modules/desktop/src/components/packages/packages.svelte
+++ b/modules/desktop/src/components/packages/packages.svelte
@@ -12,6 +12,7 @@
import NoUpdates from "./no-updates.svelte";
import { packagesStore, scrollStore } from "$libs/stores";
import { afterUpdate, beforeUpdate } from "svelte";
+ import { packageWasUpdated } from "$libs/packages/pkg-utils";
const { packageList: allPackages } = packagesStore;
export let packageFilter: SideMenuOptions = SideMenuOptions.all;
@@ -38,7 +39,10 @@
].includes(pkg.state);
},
[SideMenuOptions.installed_updates_available]: (pkg: GUIPackage) => {
- return [PackageStates.UPDATING, PackageStates.NEEDS_UPDATE].includes(pkg.state);
+ return (
+ [PackageStates.UPDATING, PackageStates.NEEDS_UPDATE].includes(pkg.state) ||
+ packageWasUpdated(pkg)
+ );
},
[SideMenuOptions.recently_updated]: (pkg: GUIPackage) => {
return moment(pkg.last_modified).isAfter(moment().subtract(30, "days"));
diff --git a/modules/desktop/src/libs/packages/pkg-utils.ts b/modules/desktop/src/libs/packages/pkg-utils.ts
index 8fb4791..fa5d2a7 100644
--- a/modules/desktop/src/libs/packages/pkg-utils.ts
+++ b/modules/desktop/src/libs/packages/pkg-utils.ts
@@ -1,6 +1,7 @@
import log from "$libs/logger";
import type { GUIPackage } from "$libs/types";
import SemVer from "@teaxyz/lib/semver";
+import { t } from "$libs/translations";
// Find a list of available versions for a package based on the bottles
export const findAvailableVersions = (pkg: Pick
) => {
@@ -67,3 +68,21 @@ export const isPackageUpToDate = (pkg: GUIPackage) => {
// if the installed version is equal or newer than the latest version, it's up to date
return semverCompare(pkg.installed_versions[0], pkg.version) >= 0;
};
+
+export const packageWasInstalled = (pkg: GUIPackage) => {
+ return pkg.displayState?.state === "INSTALLED";
+};
+
+export const packageWasUpdated = (pkg: GUIPackage) => {
+ return pkg.displayState?.state === "UPDATED";
+};
+
+export const packageHadError = (pkg: GUIPackage) => {
+ return pkg.displayState?.state === "ERROR";
+};
+
+export const getPackageBadgeText = (pkg: GUIPackage) => {
+ // UPDATED is a "pseudo-state" that overrides other states
+ const state = packageWasUpdated(pkg) ? "UPDATED" : pkg.state;
+ return t.get(`package.cta-${state}`);
+};
diff --git a/modules/desktop/src/libs/stores/pkgs.ts b/modules/desktop/src/libs/stores/pkgs.ts
index 73a96ef..f0a1f4e 100644
--- a/modules/desktop/src/libs/stores/pkgs.ts
+++ b/modules/desktop/src/libs/stores/pkgs.ts
@@ -21,7 +21,7 @@ import {
import { getReadme, getContributors, getRepoAsPackage } from "$libs/github";
import { NotificationType } from "@tea/ui/types";
import { trackInstall, trackInstallFailed } from "$libs/analytics";
-import { addInstalledVersion, isInstalling } from "$libs/packages/pkg-utils";
+import { addInstalledVersion, isInstalling, packageWasUpdated } from "$libs/packages/pkg-utils";
import withDebounce from "$libs/utils/debounce";
import { trimGithubSlug } from "$libs/github";
import { notificationStore } from "$libs/stores";
@@ -230,19 +230,18 @@ const installPkg = async (pkg: GUIPackage, version?: string) => {
await installPackage(pkg, versionToInstall);
trackInstall(pkg.full_name);
+ // If the package was AVAILABLE previously then it was just installed, otherwise it was updated
+ const state = pkg.state === PackageStates.AVAILABLE ? "INSTALLED" : "UPDATED";
+ updatePackage(pkg.full_name, { displayState: { state, version: versionToInstall } });
+
await refreshSinglePackage(pkg.full_name);
- if (pkg.state === PackageStates.AVAILABLE) {
- updatePackage(pkg.full_name, {
- displayState: { kind: "INSTALLED_SUCCESSFULLY", version: versionToInstall }
- });
- }
} catch (error) {
log.error(error);
let message = "Unknown Error";
if (error instanceof Error) message = error.message;
trackInstallFailed(pkg.full_name, message || "unknown");
updatePackage(pkg.full_name, {
- displayState: { kind: "INSTALLATION_ERROR", errorMessage: message, version: versionToInstall }
+ displayState: { state: "ERROR", errorMessage: message, version: versionToInstall }
});
} finally {
updatePackage(pkg.full_name, { install_progress_percentage: 100 });
@@ -364,6 +363,19 @@ const resetPackageDisplayState = (pkg: GUIPackage) => {
});
};
+const resetAllPackagesUpdatedState = () => {
+ packageMap.update((pkgs) => {
+ Object.values(pkgs.packages).forEach((pkg) => {
+ // only reset the display state if the package was updated,
+ // installed and error display states should not be reset here
+ if (packageWasUpdated(pkg)) {
+ pkg.displayState = null;
+ }
+ });
+ return pkgs;
+ });
+};
+
export default {
packageList,
search: searchPackages,
@@ -374,5 +386,6 @@ export default {
deletePkg,
destroy,
cachePkgImage,
- resetPackageDisplayState
+ resetPackageDisplayState,
+ resetAllPackagesUpdatedState
};
diff --git a/modules/desktop/src/libs/translations/languages/en.json b/modules/desktop/src/libs/translations/languages/en.json
index 7cd44fe..9acba15 100644
--- a/modules/desktop/src/libs/translations/languages/en.json
+++ b/modules/desktop/src/libs/translations/languages/en.json
@@ -12,6 +12,7 @@
"cta-UNINSTALL": "UNINSTALL",
"cta-NEEDS_UPDATE": "UPDATE",
"cta-UPDATING": "UPDATING",
+ "cta-UPDATED": "UPDATED",
"cta-PRUNE": "PRUNE",
"cta-PRUNING": "PRUNING"
},
diff --git a/modules/desktop/src/libs/types.ts b/modules/desktop/src/libs/types.ts
index 6de77d0..48e746c 100644
--- a/modules/desktop/src/libs/types.ts
+++ b/modules/desktop/src/libs/types.ts
@@ -13,12 +13,13 @@ export enum PackageStates {
UPDATING = "UPDATING"
}
-// PackageDisplayState is for showing temporary UI elements when a package is installed or updated. It is not persisted.
+// PackageDisplayState is a TEMPORARY state for showing temporary UI elements when a package is
+// installed or updated. It is not persisted.
export interface PackageDisplayState {
- // INSTALLED_SUCCESSFULLY -> The pacakge was installed successfully show some confetti!
- // UPDATED_SUCCESSFULLY -> The package was updated successfully change the badge temporarily
- // INSTALLATION_ERROR -> The package failed to install show an error overlay temporarily
- kind: "INSTALLED_SUCCESSFULLY" | "UPDATED_SUCCESSFULLY" | "INSTALLATION_ERROR";
+ // INSTALLED -> The package was installed successfully. Let's show some confetti!
+ // UPDATED -> The package was updated successfully so change the badge temporarily
+ // ERROR -> The package failed to install so show an error overlay temporarily
+ state: "INSTALLED" | "UPDATED" | "ERROR";
errorMessage?: string;
version: string;
}
diff --git a/modules/desktop/src/routes/+layout.svelte b/modules/desktop/src/routes/+layout.svelte
index 7277e89..4404908 100644
--- a/modules/desktop/src/routes/+layout.svelte
+++ b/modules/desktop/src/routes/+layout.svelte
@@ -27,6 +27,9 @@
const fromPath = from?.url.href.replace(from.url.origin, "");
setNewPath(nextPath, fromPath || "/");
}
+
+ // the updated state should be reset any time the user navigates
+ packagesStore.resetAllPackagesUpdatedState();
});
const syncPath = async () => {
diff --git a/modules/desktop/src/routes/+page.svelte b/modules/desktop/src/routes/+page.svelte
index 3f06d04..1f8ee9c 100644
--- a/modules/desktop/src/routes/+page.svelte
+++ b/modules/desktop/src/routes/+page.svelte
@@ -41,7 +41,6 @@
}
}
updating = false;
- sideMenuOption = SideMenuOptions.all;
}
$: needsUpdateCount = pkgsToUpdate.length;
diff --git a/modules/desktop/test/specs/app.e2e.ts b/modules/desktop/test/specs/app.e2e.ts
index 03d7bc3..79f6c15 100644
--- a/modules/desktop/test/specs/app.e2e.ts
+++ b/modules/desktop/test/specs/app.e2e.ts
@@ -83,7 +83,6 @@ describe("basic smoke test", () => {
await expect(updateBtn).toExist();
updateBtn.click();
- // FIXME: This should test for the button saying "UPDATED", but that feature is not done yet so uncomment this when it is
- //await utils.verifyInstalledBadge(slug, "UPDATED");
+ await utils.verifyInstalledBadge(slug, "UPDATED");
});
});
diff --git a/modules/desktop/test/specs/utils.ts b/modules/desktop/test/specs/utils.ts
index 253a109..679c438 100644
--- a/modules/desktop/test/specs/utils.ts
+++ b/modules/desktop/test/specs/utils.ts
@@ -91,7 +91,7 @@ export function setupUtils(browser: WebdriverIO.Browser) {
const verifyInstalledBadge = async (
slug: string,
- state: "INSTALLED" | "UPDATE" = "INSTALLED"
+ state: "INSTALLED" | "UPDATE" | "UPDATED" = "INSTALLED"
) => {
// wait 30 seconds for the badge to show up
for (let i = 0; i < 30; i++) {