Ubuntu
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
import {
reactive,
computed,
readonly,
DeepReadonly,
} from 'vue';
import { AjaxHelper } from 'CoreHome';
import { Container } from '../types';
interface ContainersStoreState {
containers: Container[];
isLoadingContainers: boolean;
isLoadingSingle: boolean;
isUpdating: boolean;
}
class ContainersStore {
private privateState = reactive({
containers: [],
isLoadingContainers: false,
isLoadingSingle: false,
isUpdating: false,
});
private state = computed(() => readonly(this.privateState));
readonly isLoading = computed(() => {
const state = this.state.value;
return state.isLoadingContainers || state.isLoadingSingle;
});
readonly isUpdating = computed(() => this.state.value.isUpdating);
readonly containers = computed(() => this.state.value.containers);
private fetchPromise: Promise | null = null;
reload(): ReturnType {
this.privateState.containers = [];
this.fetchPromise = null;
return this.fetchContainers();
}
fetchContainers(): Promise {
this.privateState.isLoadingContainers = true;
this.privateState.containers = [];
if (!this.fetchPromise) {
this.fetchPromise = AjaxHelper.fetch({
method: 'TagManager.getContainers',
filter_limit: '-1',
});
}
return Promise.resolve(this.fetchPromise).then((containers) => {
this.privateState.containers = containers;
this.privateState.isLoadingContainers = false;
return this.containers.value;
}).finally(() => {
this.privateState.isLoadingContainers = false;
});
}
findContainer(idContainer: string): Promise> {
// before going through an API request we first try to find it in loaded containers
const found = this.containers.value.find((v) => v.idcontainer === idContainer);
if (found) {
return Promise.resolve(found);
}
// otherwise we fetch it via API
this.privateState.isLoadingSingle = true;
return AjaxHelper.fetch({
idContainer,
method: 'TagManager.getContainer',
filter_limit: '-1',
}).then((record) => {
this.privateState.containers = [...this.privateState.containers, record];
return readonly(record);
}).finally(() => {
this.privateState.isLoadingSingle = false;
});
}
deleteContainer(idContainer: string): Promise {
this.privateState.isUpdating = true;
this.privateState.containers = [];
return AjaxHelper.fetch(
{
idContainer,
method: 'TagManager.deleteContainer',
},
{ withTokenInUrl: true },
).finally(() => {
this.privateState.isUpdating = false;
});
}
createOrUpdateContainer(
container: DeepReadonly|Container,
method: string,
): Promise<{ value: number }> {
this.privateState.isUpdating = true;
return AjaxHelper.post<{ value: number }>(
{
method,
idContainer: container.idcontainer,
},
{
name: container.name,
description: container.description,
context: container.context,
},
{ withTokenInUrl: true },
).finally(() => {
this.privateState.isUpdating = false;
});
}
}
export default new ContainersStore();