1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00
lens/renderer/_vue/store/modules/clusters.ts

280 lines
8.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Vue from "vue"
import { ClusterInfo } from "../../../../main/cluster"
import { MutationTree, ActionTree, GetterTree } from "vuex"
import { PromiseIpc } from 'electron-promise-ipc'
import { Tracker } from "../../../../common/tracker"
import { remote } from "electron"
import { clusterStore } from "../../../../common/cluster-store"
import { Workspace } from "../../../../common/workspace-store"
const promiseIpc = new PromiseIpc( { maxTimeoutMs: 120000 } );
const tracker = new Tracker(remote.app);
export interface LensWebview {
id: string;
loaded: boolean;
webview?: any;
}
export interface ClusterState {
lenses: LensWebview[];
clusters: ClusterInfo[];
}
const state: ClusterState = {
lenses: [],
clusters: []
}
const actions: ActionTree<ClusterState, any> = {
async refreshClusters({commit}, currentWorkspace: Workspace) {
const clusters: ClusterInfo[] = await promiseIpc.send('getClusters', currentWorkspace.id).catch((error: Error) => {
return false;
})
if(!clusters) return false;
commit('updateClusters', clusters);
clusters.forEach((cluster: ClusterInfo) => {
const lens: LensWebview = {
id: cluster.id,
webview: null,
loaded: false
};
commit("updateLens", lens)
})
return true;
},
async getCluster({commit, getters}, id: string) {
const cluster: ClusterInfo = getters.clusters.find((c: ClusterInfo) => c.id === id)
if(!cluster) return null;
const remoteCluster = await promiseIpc.send("getCluster", cluster.id)
if(!remoteCluster) return null;
Object.assign(cluster, remoteCluster)
commit('updateCluster', cluster);
return cluster;
},
async refineCluster({commit}, id: string) {
console.log("VUEX: ACTION: REFINE CLUSTER", id);
const remoteCluster = await promiseIpc.send("getCluster", id)
if(!remoteCluster) return null;
commit('updateCluster', remoteCluster);
return remoteCluster;
},
async stopCluster({dispatch, getters}, id: string) {
const cluster: ClusterInfo = getters.clusters.find((c: ClusterInfo) => c.id === id)
if (!cluster) return;
const lens = getters.lensById(cluster.id)
if (lens) {
await dispatch("detachWebview", lens)
await promiseIpc.send("stopCluster", cluster.id)
tracker.event("cluster", "stop")
}
},
async removeCluster({getters, dispatch}, id: string) {
const cluster: ClusterInfo = getters.clusters.find((c: ClusterInfo) => c.id === id)
if (!cluster) {
return
}
const lens = this.getters.lensById(cluster.id)
if (lens) {
dispatch("detachWebview", lens)
}
await promiseIpc.send("removeCluster", cluster.id).catch((error: Error) => {
return false;
})
tracker.event("cluster", "remove´");
await dispatch("refreshClusters", getters.currentWorkspace)
return true;
},
async addCluster({commit, getters, dispatch}, data) {
const res = await promiseIpc.send("addCluster", data)
if(!res) return null;
tracker.event("cluster", "add");
commit('updateClusters', res.allClusters);
await dispatch("refreshClusters", getters.currentWorkspace);
return res.addedCluster;
},
async clearClusters({commit, getters, dispatch}){
// todo: clean from main process as well?
getters.lenses.forEach((lens: LensWebview) => {
if (lens.webview) {
dispatch("detachWebview", lens)
}
})
commit('updateLenses', []);
commit('updateClusters', []);
return true;
},
async uploadClusterIcon({commit}, data) {
const res = await promiseIpc.send("saveClusterIcon", data)
tracker.event("cluster", "upload-icon")
if (res.cluster) commit("updateCluster", res.cluster)
return res
},
async resetClusterIcon({commit}, data) {
const res = await promiseIpc.send("resetClusterIcon", data.clusterId)
tracker.event("cluster", "reset-icon")
if (res.cluster) commit("updateCluster", res.cluster)
return res
},
// For data structure see: cluster-manager.ts / FeatureInstallRequest
async installClusterFeature({commit}, data) {
// Custom no timeout IPC as install can take very variable time
const ipc = new PromiseIpc();
const response = await ipc.send('installFeature', data)
console.log("installer result:", response);
const cluster = await ipc.send('refreshCluster', data.clusterId)
tracker.event("cluster", "install-feature")
commit("updateCluster", cluster)
return response
},
// For data structure see: cluster-manager.ts / FeatureInstallRequest
async upgradeClusterFeature({commit}, data) {
// Custom no timeout IPC as install can take very variable time
const ipc = new PromiseIpc();
const response = await ipc.send('upgradeFeature', data)
console.log("upgrade result:", response);
const cluster = await ipc.send('refreshCluster', data.clusterId)
tracker.event("cluster", "upgrade-feature")
commit("updateCluster", cluster)
return response
},
// For data structure see: cluster-manager.ts / FeatureInstallRequest
async uninstallClusterFeature({commit}, data) {
// Custom no timeout IPC as uninstall can take very variable time
const ipc = new PromiseIpc();
const response = await ipc.send('uninstallFeature', data)
console.log("uninstaller result:", response);
const cluster = await ipc.send('refreshCluster', data.clusterId)
tracker.event("cluster", "uninstall-feature")
commit("updateCluster", cluster)
return response
},
attachWebview({commit}, lens: LensWebview) {
const container: any = document.getElementById("lens-container");
if (!container || !lens.webview) {
return
}
container.style = "display: block;"
let webview = null
container.childNodes.forEach((child: any) => {
if (child === lens.webview) {
webview = child
}
})
if (!webview) {
container.appendChild(lens.webview)
}
container.childNodes.forEach((child: any) => {
if (child !== lens.webview) {
child.style = "display: none;"
} else {
child.style = "top: 0; bottom: 20px; position: absolute; width: 100%;"
}
})
promiseIpc.send("enableClusterSettingsMenuItem", lens.id)
},
detachWebview({commit}, lens: LensWebview) {
const container: any = document.getElementById("lens-container");
if (!container) { return }
container.childNodes.forEach((child: any) => {
if (child === lens.webview) {
container.removeChild(lens.webview)
lens.webview = null
lens.loaded = false
commit("updateLens", lens)
}
})
promiseIpc.send("disableClusterSettingsMenuItem")
},
hideWebviews({commit}) {
const container: any = document.getElementById("lens-container");
if (!container) { return }
container.style = "display: none;"
container.childNodes.forEach((child: any) => {
child.style = "display: none;"
})
promiseIpc.send("disableClusterSettingsMenuItem")
},
destroyWebviews({commit}) {
state.lenses.forEach((lens) => {
this.dispatch("detachWebview", lens)
})
},
storeCluster({commit}, cluster: ClusterInfo) {
clusterStore.storeCluster(cluster);
commit("updateCluster", cluster)
promiseIpc.send("clusterStored", cluster.id)
}
}
const getters: GetterTree<ClusterState, any> = {
clusters: state => state.clusters,
clusterById: state => (id: string) => {
const cluster = state.clusters.find(c => c.id === id);
if (cluster) {
return cluster;
} else {
return null;
}
},
lenses: state => state.lenses,
lensById: state => (id: string) => {
const lens = state.lenses.find(c => c.id === id);
if (lens) {
return lens;
} else {
return null;
}
},
}
const mutations: MutationTree<ClusterState> = {
updateClusters(state, clusters: ClusterInfo[]) {
Vue.set(state, 'clusters', [...clusters])
},
updateCluster(state, cluster) {
state.clusters.forEach((c, index) => {
if(c.id === cluster.id) {
Vue.set(state.clusters, index, cluster)
}
})
},
updateLenses(state, data) {
Vue.set(state, 'lenses', [...data])
},
updateLens(state, lens: LensWebview) {
const lensIndex = state.lenses.findIndex(l => l.id == lens.id);
if (lensIndex >= 0) {
state.lenses[lensIndex] = lens
Vue.set(state.lenses, lensIndex, lens)
} else {
console.log("update new lens")
state.lenses.push(lens)
}
}
}
export default {
namespaced: false,
state,
getters,
mutations,
actions
}