{"version":3,"file":"useFavoriteDatasources.cjs","sources":["../../../src/utils/useFavoriteDatasources.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nimport { type DataSourceInstanceSettings } from '@grafana/data';\n\nimport { config } from '../config';\n\nimport { UserStorage } from './userStorage';\n\nconst FAVORITE_DATASOURCES_KEY = 'favoriteDatasources';\n\nexport type FavoriteDatasources = {\n  enabled: boolean;\n  isLoading: boolean;\n  favoriteDatasources: string[];\n  initialFavoriteDataSources: string[];\n  addFavoriteDatasource: (ds: DataSourceInstanceSettings) => void;\n  removeFavoriteDatasource: (ds: DataSourceInstanceSettings) => void;\n  isFavoriteDatasource: (dsUid: string) => boolean;\n};\n\n// Initialize user storage as a singleton\nconst userStorage = new UserStorage('grafana-runtime');\n\n/**\n * A hook for managing favorite data sources using user storage.\n * This hook provides functionality to store and retrieve a list of favorite data source UIDs\n * using the backend user storage (with localStorage fallback).\n *\n * @returns An object containing:\n * - A boolean indicating if the feature is enabled\n * - An array of favorite data source UIDs\n * - An array of favorite data source UIDs that were initially loaded from storage\n * - A function to add a data source to favorites\n * - A function to remove a data source from favorites\n * - A function to check if a data source is favorited\n * @public\n */\nexport function useFavoriteDatasources(): FavoriteDatasources {\n  const [favoriteDatasources, setFavoriteDatasources] = useState<string[]>([]);\n  const [initialFavoriteDataSources, setInitialFavoriteDataSources] = useState<string[]>([]);\n  const [isLoading, setIsLoading] = useState(false);\n\n  // Load favorites from storage on mount\n  useEffect(() => {\n    if (!config.featureToggles.favoriteDatasources) {\n      return;\n    }\n\n    const loadFavorites = async () => {\n      setIsLoading(true);\n      const stored = await userStorage.getItem(FAVORITE_DATASOURCES_KEY);\n      if (stored) {\n        const parsed = JSON.parse(stored);\n        setFavoriteDatasources(parsed);\n        setInitialFavoriteDataSources(parsed);\n      }\n      setIsLoading(false);\n    };\n\n    loadFavorites();\n  }, []);\n\n  // Helper function to save favorites to storage\n  const saveFavorites = useCallback(async (newFavorites: string[]) => {\n    setIsLoading(true);\n    await userStorage.setItem(FAVORITE_DATASOURCES_KEY, JSON.stringify(newFavorites));\n    setFavoriteDatasources(newFavorites);\n    setIsLoading(false);\n  }, []);\n\n  const addFavoriteDatasource = useCallback(\n    (ds: DataSourceInstanceSettings) => {\n      if (ds.meta.builtIn) {\n        // Prevent storing built-in datasources (-- Grafana --, -- Mixed --, -- Dashboard --)\n        return;\n      }\n\n      if (!favoriteDatasources.includes(ds.uid)) {\n        const newFavorites = [...favoriteDatasources, ds.uid];\n        saveFavorites(newFavorites);\n      }\n    },\n    [favoriteDatasources, saveFavorites]\n  );\n\n  const removeFavoriteDatasource = useCallback(\n    (ds: DataSourceInstanceSettings) => {\n      const newFavorites = favoriteDatasources.filter((uid) => uid !== ds.uid);\n      if (newFavorites.length !== favoriteDatasources.length) {\n        saveFavorites(newFavorites);\n      }\n    },\n    [favoriteDatasources, saveFavorites]\n  );\n\n  const isFavoriteDatasource = useCallback(\n    (dsUid: string) => {\n      return favoriteDatasources.includes(dsUid);\n    },\n    [favoriteDatasources]\n  );\n\n  if (!config.featureToggles.favoriteDatasources) {\n    return {\n      enabled: false,\n      isLoading: false,\n      favoriteDatasources: [],\n      initialFavoriteDataSources: [],\n      addFavoriteDatasource: () => {},\n      removeFavoriteDatasource: () => {},\n      isFavoriteDatasource: () => false,\n    };\n  }\n\n  return {\n    enabled: true,\n    isLoading,\n    favoriteDatasources,\n    addFavoriteDatasource,\n    removeFavoriteDatasource,\n    isFavoriteDatasource,\n    initialFavoriteDataSources,\n  };\n}\n"],"names":["UserStorage","useState","useEffect","config","useCallback"],"mappings":"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"}