# All files / src/hooks useLoadNamespace.ts

0% Statements 0/23
0% Branches 0/10
0% Functions 0/5
0% Lines 0/22

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54

     import { useEffect, useState } from 'react';
    import i18n, { loadNamespace as loadNs } from '@/lib/i18n';

    /**
     * useLoadNamespace(ns)
     * Dynamically loads a translation namespace and reloads it on language changes.
     * Returns a boolean indicating loading state (nsLoading).
     *
     * Notes:
     * - Uses resolvedLanguage when available.
     * - Treats the namespace as "ready" only when both EN and the current language
     *   bundles exist, so fallbackLng works without showing raw keys.
     */
    export default function useLoadNamespace(ns: string): boolean {
      const initialLang = i18n.resolvedLanguage || i18n.language || 'en';
      const initialLoaded =
        i18n.hasResourceBundle('en', ns) && i18n.hasResourceBundle(initialLang, ns);

      const [nsLoading, setNsLoading] = useState<boolean>(!initialLoaded);

      useEffect(() => {
        let mounted = true;

        const doLoad = async (lng: string) => {
          try {
            setNsLoading(true);
            await loadNs(lng, ns);
          } finally {
            if (mounted) setNsLoading(false);
          }
        };

        // Initial load for current language.
        doLoad(i18n.resolvedLanguage || i18n.language || 'en');

        // Re-load on language change.
        const onLanguageChanged = (lng: string) => {
          doLoad(lng);
        };

        i18n.on('languageChanged', onLanguageChanged);

        return () => {
          mounted = false;
          i18n.off('languageChanged', onLanguageChanged);
        };
      }, [ns]);

      return nsLoading;
    }

    // Named export for compatibility
    export { useLoadNamespace };