1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { CollectionDirectory, CollectionFile } from "models/collection-file";
6 import { Middleware, Store } from "redux";
7 import { ServiceRepository } from "services/services";
8 import { RootState } from "store/store";
9 import tippy, { createSingleton } from 'tippy.js';
10 import 'tippy.js/dist/tippy.css';
13 let tooltipsContents = null;
14 let tooltipsFetchFailed = false;
15 export const TOOLTIP_LOCAL_STORAGE_KEY = "TOOLTIP_LOCAL_STORAGE_KEY";
17 const tippySingleton = createSingleton([], {delay: 10});
19 export const tooltipsMiddleware = (services: ServiceRepository): Middleware => (store: Store) => next => action => {
20 const state: RootState = store.getState();
22 if (state && state.auth && state.auth.config && state.auth.config.clusterConfig && state.auth.config.clusterConfig.Workbench) {
23 const hideTooltip = localStorage.getItem(TOOLTIP_LOCAL_STORAGE_KEY);
24 const { BannerUUID: bannerUUID } = state.auth.config.clusterConfig.Workbench;
26 if (bannerUUID && !tooltipsContents && !hideTooltip && !tooltipsFetchFailed && !running) {
28 fetchTooltips(services, bannerUUID);
29 } else if (tooltipsContents && !hideTooltip && !tooltipsFetchFailed) {
37 const fetchTooltips = (services, bannerUUID) => {
38 services.collectionService.files(bannerUUID)
40 const tooltipsFile: CollectionDirectory | CollectionFile | undefined = results.find(({ name }) => name === 'tooltips.json');
44 services.collectionService.getFileContents(tooltipsFile as CollectionFile)
46 tooltipsContents = JSON.parse(data);
54 tooltipsFetchFailed = true;
63 const applyTooltips = () => {
64 const tippyInstances: any[] = Object.keys(tooltipsContents as any)
66 const content = (tooltipsContents as any)[key]
67 const element = document.querySelector(key);
70 const hasTippyAttatched = !!(element as any)._tippy;
72 if (!hasTippyAttatched && tooltipsContents) {
73 return tippy(element as any, { content });
79 .filter(data => !!data);
81 if (tippyInstances.length > 0) {
82 tippySingleton.setInstances(tippyInstances);