Files
Automata/packages/editor-ui/src/stores/communityNodes.ts
Iván Ovejero 5ca2148c7e refactor(editor): Apply Prettier (no-changelog) (#4920)
*  Adjust `format` script

* 🔥 Remove exemption for `editor-ui`

* 🎨 Prettify

* 👕 Fix lint
2022-12-14 10:04:10 +01:00

96 lines
3.0 KiB
TypeScript

import {
getInstalledCommunityNodes,
installNewPackage,
uninstallPackage,
updatePackage,
} from '@/api/communityNodes';
import { getAvailableCommunityPackageCount } from '@/api/settings';
import { defineStore } from 'pinia';
import { useRootStore } from './n8nRootStore';
import { PublicInstalledPackage } from 'n8n-workflow';
import Vue from 'vue';
import { CommunityNodesState, CommunityPackageMap } from '@/Interface';
import { STORES } from '@/constants';
const LOADER_DELAY = 300;
export const useCommunityNodesStore = defineStore(STORES.COMMUNITY_NODES, {
state: (): CommunityNodesState => ({
// -1 means that package count has not been fetched yet
availablePackageCount: -1,
installedPackages: {},
}),
getters: {
getInstalledPackages(): PublicInstalledPackage[] {
return Object.values(this.installedPackages).sort((a, b) =>
a.packageName.localeCompare(b.packageName),
);
},
getInstalledPackageByName() {
return (name: string): PublicInstalledPackage => this.installedPackages[name];
},
},
actions: {
async fetchAvailableCommunityPackageCount(): Promise<void> {
if (this.availablePackageCount === -1) {
this.availablePackageCount = await getAvailableCommunityPackageCount();
}
},
async fetchInstalledPackages(): Promise<void> {
const rootStore = useRootStore();
const installedPackages = await getInstalledCommunityNodes(rootStore.getRestApiContext);
this.setInstalledPackages(installedPackages);
const timeout = installedPackages.length > 0 ? 0 : LOADER_DELAY;
setTimeout(() => {
return;
}, timeout);
},
async installPackage(packageName: string): Promise<void> {
try {
const rootStore = useRootStore();
await installNewPackage(rootStore.getRestApiContext, packageName);
await this.fetchInstalledPackages();
} catch (error) {
throw error;
}
},
async uninstallPackage(packageName: string): Promise<void> {
try {
const rootStore = useRootStore();
await uninstallPackage(rootStore.getRestApiContext, packageName);
this.removePackageByName(packageName);
} catch (error) {
throw error;
}
},
async updatePackage(packageName: string): Promise<void> {
try {
const rootStore = useRootStore();
const packageToUpdate: PublicInstalledPackage = this.getInstalledPackageByName(packageName);
const updatedPackage: PublicInstalledPackage = await updatePackage(
rootStore.getRestApiContext,
packageToUpdate.packageName,
);
this.updatePackageObject(updatedPackage);
} catch (error) {
throw error;
}
},
setInstalledPackages(packages: PublicInstalledPackage[]) {
this.installedPackages = packages.reduce(
(packageMap: CommunityPackageMap, pack: PublicInstalledPackage) => {
packageMap[pack.packageName] = pack;
return packageMap;
},
{},
);
},
removePackageByName(name: string): void {
Vue.delete(this.installedPackages, name);
},
updatePackageObject(newPackage: PublicInstalledPackage) {
this.installedPackages[newPackage.packageName] = newPackage;
},
},
});