import { useCallback, useState } from "react";
import { useListeners } from "./useListeners";
import { useLocalisationPlugin } from "./useLocalisationPlugin";
import { constants } from "../../constants";
import { Localisation } from "../../plugins/localisation";
type TPluginInstance = Localisation;
type TUseLocalisationLanguagesProps = {
isNormalize: boolean;
};
type TUseLocalisationLanguagesReturn = {
isLoading: boolean;
langList: string[];
lang: string | null;
getChangeFn: (lang: string) => void;
};
/**
* Получает данные о выбранном языке, список языков, состояние их загрузки и функцию смены языка
* @returns {TUseLocalisationLanguagesReturn} Возвращает текущий язык, список доступных языков, флаг загрузки и функцию `getChangeFn` для переключения языка.
* @example
* import { useLocalisationLanguages } from "@delement/ui/utils/react";
*
* const langSwitchBtn = () => {
*
* const { lang, langList, isLoading, getChangeFn } = useLocalisationLanguages();
*
* const onClick = async (e, lang) => {
* e.preventDefault();
* await getChangeFn(lang);
* };
*
* return (
*
*
*
*
* Текущий язык: {lang}
* Доступные языки: {langList.join(", ")}
*
* {langList.map(item => {
* return (
*
* onClick(e, item)} label={item}/>
*
* );
* }
* )}
*
* );
* };
*/
export const useLocalisationLanguages = (props?: TUseLocalisationLanguagesProps): TUseLocalisationLanguagesReturn => {
const {
isNormalize = false,
} = props || {};
const getCurrentLang = () => Localisation.instance?.lang ?? "";
const [ langList, setLangList ] = useState(() => Localisation.instance?.langList ?? []);
const [ lang, setLang ] = useState(() => isNormalize ? Localisation.getLangWithRegion(getCurrentLang()) : getCurrentLang());
const { plugin, isLoading } = useLocalisationPlugin();
const onChange = useCallback(({ detail }: CustomEvent<{
instance: TPluginInstance;
}>) => {
const { langList = [], lang = "" } = detail.instance;
setLangList(langList);
setLang(isNormalize ? Localisation.getLangWithRegion(lang) : getCurrentLang());
}, []);
const getChangeFn = useCallback(async (newLangCode = "") => {
const newLang = isNormalize ? Localisation.getLangWithRegion(newLangCode) : newLangCode;
return plugin?.getChangeLanguage(newLang!!)
.then((result) => {
setLang(newLang);
return result;
}) ?? await Promise.reject(`[useLocalisationLanguages]: Plugin are not ready`);
}, [ plugin ]);
useListeners({
listeners: {
[constants.localisationBubbles.localisationChange]: { fn: onChange },
},
});
return {
isLoading,
langList,
lang,
getChangeFn,
};
};