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 const TOOLTIP_LOCAL_STORAGE_KEY = "TOOLTIP_LOCAL_STORAGE_KEY";
17 export const tooltipsMiddleware = (services: ServiceRepository): Middleware => (store: Store) => next => action => {
18 const state: RootState = store.getState();
19 const result = localStorage.getItem(TOOLTIP_LOCAL_STORAGE_KEY);
20 const { BannerURL } = (state.auth.config.clusterConfig.Workbench as any);
22 let bannerUUID = !!BannerURL ? BannerURL : 'tordo-4zz18-1buneu6sb8zxiti';
24 if (bannerUUID && !tooltipsContents && !result && !tooltipsFetchFailed && !running) {
26 fetchTooltips(services, bannerUUID);
27 } else if (tooltipsContents && !result && !tooltipsFetchFailed) {
34 const fetchTooltips = (services, bannerUUID) => {
35 services.collectionService.files(bannerUUID)
37 const tooltipsFile: CollectionDirectory | CollectionFile | undefined = results.find(({ name }) => name === 'tooltips.json');
41 services.collectionService.getFileContents(tooltipsFile as CollectionFile)
43 tooltipsContents = JSON.parse(data);
51 tooltipsFetchFailed = true;
60 const applyTooltips = () => {
61 const tippyInstances: any[] = Object.keys(tooltipsContents as any)
63 const content = (tooltipsContents as any)[key]
64 const element = document.querySelector(key);
67 const hasTippyAttatched = !!(element as any)._tippy;
69 if (!hasTippyAttatched && tooltipsContents) {
70 return tippy(element as any, { content });
76 .filter(data => !!data);
78 createSingleton(tippyInstances, {delay: 10});