{"version":3,"file":"useLocalisationPlugin.mjs","sources":[""],"sourcesContent":["import { useEffect, useState } from \"react\";\r\nimport { Localisation } from \"../../plugins/localisation\";\r\nimport type { TLocalisationResourceAddedEvent } from \"../../plugins/localisation/types\";\r\n\r\ntype TUseLocalisationPluginReturn = {\r\n  isLoading: boolean;\r\n  isReady: boolean;\r\n  isError: boolean;\r\n  plugin: Localisation | null;\r\n};\r\n\r\n/**\r\n * Хук для использования плагина локализации. Возвращает экземпляр вызова и состояние загрузки.\r\n * Если передан `code`, хук будет ожидать доступность указанного ключа локали,\r\n * даже если она подгружается асинхронно после инициализации плагина.\r\n *\r\n * @param code{string} Код локали, доступность которого необходимо проверить\r\n * @returns {TUseLocalisationPluginReturn} Возвращает объект с экземпляром плагина локализации (`plugin`),\r\n * флагом готовности (`isReady`), флагом загрузки (`isLoading`) и флагом ошибки (`isError`).\r\n * @example\r\n * import { useLocalisationPlugin } from \"@delement/ui/utils/react\";\r\n *\r\n * const App = () => {\r\n *   const { plugin, isReady, isLoading } = useLocalisationPlugin(\"forms.invalidInput\");\r\n *   return <div>{isReady ? plugin.getLocale(\"forms.invalidInput\") : \"loading\"}</div>;\r\n * };\r\n */\r\nexport const useLocalisationPlugin = (code?: string): TUseLocalisationPluginReturn => {\r\n\r\n  // экземпляр вызова плагина\r\n  const [ plugin, setPlugin ] = useState(() => Localisation.instance);\r\n\r\n  // Функция для определения начального состояния готовности\r\n  const getInitialReadyState = () => {\r\n    if (!Localisation.instance) {\r\n      return false;\r\n    }\r\n    if (!code) {\r\n      return Localisation.isReady;\r\n    }\r\n    return Localisation.isReady && Localisation.instance.isLocaleExist(code);\r\n  };\r\n\r\n  // состояние готовности\r\n  const [ isReady, setIsReady ] = useState(() => getInitialReadyState());\r\n\r\n  // состояние загрузки\r\n  const [ isLoading, setIsLoading ] = useState(() => !getInitialReadyState());\r\n\r\n  // состояние ошибки\r\n  const [ isError, setIsError ] = useState(false);\r\n\r\n  useEffect(() => {\r\n    let isMounted = true;\r\n    let unsubscribeResourceAdded: (() => void) | null = null;\r\n    let unsubscribeStoreAdded: (() => void) | null = null;\r\n\r\n    /**\r\n     * Отписывается от всех слушателей событий добавления ресурсов\r\n     */\r\n    const unsubscribeAll = () => {\r\n      if (unsubscribeResourceAdded) {\r\n        unsubscribeResourceAdded();\r\n        unsubscribeResourceAdded = null;\r\n      }\r\n      if (unsubscribeStoreAdded) {\r\n        unsubscribeStoreAdded();\r\n        unsubscribeStoreAdded = null;\r\n      }\r\n    };\r\n\r\n    /**\r\n     * Проверяет доступность локали и обновляет состояния.\r\n     * Если локаль найдена — отписывается от всех слушателей.\r\n     */\r\n    const checkLocaleAvailability = (instance: Localisation) => {\r\n      if (!isMounted) {\r\n        return;\r\n      }\r\n\r\n      if (!code) {\r\n        // Код не передан — плагин готов\r\n        setIsReady(true);\r\n        setIsLoading(false);\r\n        setIsError(false);\r\n        return;\r\n      }\r\n\r\n      if (instance.isLocaleExist(code)) {\r\n        // Локаль доступна — всё готово, отписываемся от слушателей\r\n        setIsReady(true);\r\n        setIsLoading(false);\r\n        setIsError(false);\r\n        unsubscribeAll();\r\n      } else {\r\n        // Локаль ещё не загружена — продолжаем ждать\r\n        setIsReady(false);\r\n        setIsLoading(true);\r\n        setIsError(false);\r\n      }\r\n    };\r\n\r\n    /**\r\n     * Обработчик события добавления ресурсов.\r\n     * Содержит точную информацию о добавленных ключах.\r\n     */\r\n    const handleResourceAdded = (data: TLocalisationResourceAddedEvent) => {\r\n      if (!isMounted || !plugin || !code) {\r\n        return;\r\n      }\r\n      if (typeof data.isHasCode === \"function\" && data.isHasCode(code)) {\r\n        checkLocaleAvailability(plugin);\r\n      }\r\n    };\r\n\r\n    /**\r\n     * Обработчик СТАНДАРТНОГО события i18next store \"added\".\r\n     * Используется как fallback, если ресурсы добавляются не через наши методы.\r\n     */\r\n    const handleStoreAdded = (_lng: string, _ns: string) => {\r\n      if (!isMounted || !plugin) {\r\n        return;\r\n      }\r\n      // Перепроверяем доступность локали при любом изменении store\r\n      checkLocaleAvailability(plugin);\r\n    };\r\n\r\n    /**\r\n     * Обработчик готовности плагина\r\n     */\r\n    const handlePluginReady = (instance: Localisation) => {\r\n      if (!isMounted) {\r\n        return;\r\n      }\r\n\r\n      setPlugin(instance);\r\n\r\n      // Проверяем доступность ДО подписки\r\n      if (instance.isLocaleExist(code)) {\r\n        // Локаль уже существует — сразу отмечаем как готово\r\n        setIsReady(true);\r\n        setIsLoading(false);\r\n        setIsError(false);\r\n        return; // Без подписки\r\n      }\r\n\r\n      // Локали нет — подписываемся и ждём\r\n      if (code) {\r\n        setIsReady(false);\r\n        setIsLoading(true);\r\n        setIsError(false);\r\n\r\n        unsubscribeResourceAdded = Localisation.onResourceAdded(handleResourceAdded);\r\n        instance.lib.store.on(\"added\", handleStoreAdded);\r\n        unsubscribeStoreAdded = () => {\r\n          instance.lib.store.off(\"added\", handleStoreAdded);\r\n        };\r\n      } else {\r\n        // Без кода — просто готово\r\n        setIsReady(true);\r\n        setIsLoading(false);\r\n        setIsError(false);\r\n      }\r\n    };\r\n\r\n    // Если плагин уже готов\r\n    if (Localisation.instance && Localisation.isReady) {\r\n      handlePluginReady(Localisation.instance);\r\n    } else {\r\n      // Иначе ждём инициализации\r\n      setIsReady(false);\r\n      setIsLoading(true);\r\n      setIsError(false);\r\n\r\n      Localisation.addReadyCallback(handlePluginReady);\r\n\r\n      Localisation.create()\r\n        .catch((err: unknown) => {\r\n          if (!isMounted) {\r\n            return;\r\n          }\r\n          setIsReady(false);\r\n          setIsError(true);\r\n          setIsLoading(false);\r\n          setPlugin(null);\r\n          console.error(`[useLocalisationPlugin] Localisation plugin is crushed with error`, err);\r\n        });\r\n    }\r\n\r\n    return () => {\r\n      isMounted = false;\r\n      unsubscribeAll();\r\n    };\r\n  }, [ code, plugin ]);\r\n\r\n  return {\r\n    isLoading,\r\n    isReady,\r\n    isError,\r\n    plugin,\r\n  };\r\n};\r\n"],"names":["useLocalisationPlugin","code","plugin","setPlugin","useState","Localisation","instance","getInitialReadyState","isReady","isLocaleExist","setIsReady","isLoading","setIsLoading","isError","setIsError","useEffect","isMounted","unsubscribeResourceAdded","unsubscribeStoreAdded","unsubscribeAll","checkLocaleAvailability","handleResourceAdded","data","isHasCode","handleStoreAdded","_lng","_ns","handlePluginReady","onResourceAdded","lib","store","on","off","addReadyCallback","create","catch","err","console","error"],"mappings":";;;;;;;;;;;;;;;;GA2BO,MAAMA,sBAAyBC;;AAGpC,MAAQC,OAAQC,WAAcC,SAAS,IAAMC,aAAaC;0DAG1D;MAAMC,qBAAuB,KAC3B,IAAKF,aAAaC,SAChB,OAAO,MAET,IAAKL,KACH,OAAOI,aAAaG,QAEtB,OAAOH,aAAaG,SAAWH,aAAaC,SAASG,cAAcR;uBAIrE;MAAQO,QAASE,YAAeN,SAAS,IAAMG;qBAG/C;MAAQI,UAAWC,cAAiBR,SAAS,KAAOG;mBAGpD;MAAQM,QAASC,YAAeV,SAAS,OAEzCW,UAAU,KACR,IAAIC,UAAY,KAChB,IAAIC,yBAAgD,KACpD,IAAIC,sBAA6C;;;OAKjD,MAAMC,eAAiB,KACrB,GAAIF,yBAA0B,CAC5BA,2BACAA,yBAA2B,IAC7B,CACA,GAAIC,sBAAuB,CACzBA,wBACAA,sBAAwB,IAC1B;;;;OAOF,MAAME,wBAA2Bd,WAC/B,IAAKU,UACH,OAGF,IAAKf,KAAM;;AAETS,WAAW,MACXE,aAAa,OACbE,WAAW,OACX,MACF,CAEA,GAAIR,SAASG,cAAcR,MAAO;;AAEhCS,WAAW,MACXE,aAAa,OACbE,WAAW,OACXK,gBACF,KAAO;;AAELT,WAAW,OACXE,aAAa,MACbE,WAAW,MACb;;;;OAOF,MAAMO,oBAAuBC,OAC3B,IAAKN,YAAcd,SAAWD,KAC5B,OAEF,UAAWqB,KAAKC,YAAc,YAAcD,KAAKC,UAAUtB,MACzDmB,wBAAwBlB;;;;OAQ5B,MAAMsB,iBAAmB,CAACC,KAAcC,OACtC,IAAKV,YAAcd,OACjB;6DAGFkB;wBAAwBlB;;;OAM1B,MAAMyB,kBAAqBrB,WACzB,IAAKU,UACH,OAGFb,UAAUG;oCAGV;GAAIA,SAASG,cAAcR,MAAO;;AAEhCS,WAAW,MACXE,aAAa,OACbE,WAAW,OACX,sBACF;;oCAGA;GAAIb,KAAM,CACRS,WAAW,OACXE,aAAa,MACbE,WAAW,OAEXG,yBAA2BZ,aAAauB,gBAAgBP,qBACxDf,SAASuB,IAAIC,MAAMC,GAAG,QAASP,kBAC/BN,sBAAwB,KACtBZ,SAASuB,IAAIC,MAAME,IAAI,QAASR,kBAEpC,KAAO;;AAELd,WAAW,MACXE,aAAa,OACbE,WAAW,MACb;wBAIF;GAAIT,aAAaC,UAAYD,aAAaG,QACxCmB,kBAAkBtB,aAAaC,cAC1B;;AAELI,WAAW,OACXE,aAAa,MACbE,WAAW,OAEXT,aAAa4B,iBAAiBN,mBAE9BtB,aAAa6B,SACVC,MAAOC,MACN,IAAKpB,UACH,OAEFN,WAAW,OACXI,WAAW,MACXF,aAAa,OACbT,UAAU,MACVkC,QAAQC,MAAM,oEAAqEF,MAEzF,CAEA,MAAO,KACLpB,UAAY,MACZG,mBAED,CAAElB,KAAMC,SAEX,MAAO,CACLS,oBACAH,gBACAK,gBACAX"}