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, readonly, computed, DeepReadonly, } from 'vue'; import MatomoUrl from '../MatomoUrl/MatomoUrl'; import { Widget, WidgetContainer } from './types'; interface WidgetsStoreState { isFetchedFirstTime: boolean; categorizedWidgets: Record; } export function getWidgetChildren(widget: Widget): Widget[] { const container = widget as WidgetContainer; if (container.widgets) { return container.widgets; } return []; } class WidgetsStore { private privateState = reactive({ isFetchedFirstTime: false, categorizedWidgets: {}, }); private state = computed((): DeepReadonly => { if (!this.privateState.isFetchedFirstTime) { // initiating a side effect in a computed property seems wrong, but it needs to be // executed after knowing a user's logged in and it will succeed. this.fetchAvailableWidgets(); } return readonly(this.privateState); }); readonly widgets = computed(() => this.state.value.categorizedWidgets); private fetchAvailableWidgets(): Promise { // if there's no idSite, don't make the request since it will just fail if (!MatomoUrl.parsed.value.idSite) { return Promise.resolve(this.widgets.value); } this.privateState.isFetchedFirstTime = true; return new Promise((resolve, reject) => { try { window.widgetsHelper.getAvailableWidgets((widgets: Record) => { const casted = widgets as unknown as Record; this.privateState.categorizedWidgets = casted; resolve(this.widgets.value); }); } catch (e) { reject(e); } }); } reloadAvailableWidgets(): Promise { if (typeof window.widgetsHelper === 'object' && window.widgetsHelper.availableWidgets) { // lets also update widgetslist so will be easier to update list of available widgets in // dashboard selector immediately delete window.widgetsHelper.availableWidgets; } return this.fetchAvailableWidgets(); } } export default new WidgetsStore();