{"version":3,"file":"useLocale.mjs","names":["useLocaleReact"],"sources":["../../../src/client/useLocale.ts"],"sourcesContent":["'use client';\n\nimport {\n  getLocalizedUrl,\n  getPathWithoutLocale,\n} from '@intlayer/core/localization';\nimport { checkIsURLAbsolute } from '@intlayer/core/utils';\nimport type {\n  DeclaredLocales,\n  LocalesValues,\n} from '@intlayer/types/module_augmentation';\nimport { usePathname, useRouter } from 'next/navigation.js';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n  type UseLocaleResult as UseLocaleResultReact,\n  useLocale as useLocaleReact,\n} from 'react-intlayer';\n\nexport type UseLocaleProps = {\n  isCookieEnabled?: boolean;\n  onLocaleChange?: (locale: DeclaredLocales) => void;\n  onChange?:\n    | 'replace'\n    | 'push'\n    | 'none'\n    | ((params: { locale: LocalesValues; path: string }) => void);\n};\n\nexport type UseLocaleResult = UseLocaleResultReact & {\n  pathWithoutLocale: string;\n};\n\nconst usePathWithoutLocale = () => {\n  const pathname = usePathname(); // updates on client navigations\n  const [fullPath, setFullPath] = useState(pathname);\n\n  useEffect(() => {\n    // Runs only on client; avoids suspense.\n    const search = typeof window !== 'undefined' ? window.location.search : '';\n    setFullPath(search ? `${pathname}${search}` : pathname);\n  }, [pathname]);\n\n  // Your own helper\n  return useMemo(() => getPathWithoutLocale(fullPath), [fullPath]);\n};\n\n/**\n * Hook to manage the current locale in Next.js App Router.\n *\n * This hook extends the base `useLocale` from `react-intlayer` by adding\n * Next.js-specific navigation logic for locale changes.\n *\n * @param props - Optional properties to configure locale change behavior.\n * @returns An object containing the current locale, path without locale, and functions to update the locale.\n *\n * @example\n * ```tsx\n * 'use client';\n *\n * import { useLocale } from 'next-intlayer';\n *\n * const LocaleSwitcher = () => {\n *   const { setLocale } = useLocale({ onChange: 'push' });\n *\n *   return (\n *     <button onClick={() => setLocale('fr')}>Switch to French</button>\n *   );\n * };\n * ```\n */\nexport const useLocale = ({\n  onChange = 'replace',\n  onLocaleChange,\n  isCookieEnabled,\n}: UseLocaleProps = {}): UseLocaleResult => {\n  const { replace, push } = useRouter();\n  const pathWithoutLocale = usePathWithoutLocale();\n\n  const redirectionFunction = useCallback(\n    (locale: LocalesValues) => {\n      if (!onChange) return;\n\n      const currentDomain =\n        process.env['INTLAYER_ROUTING_DOMAINS'] !== 'false' &&\n        typeof window !== 'undefined'\n          ? window.location.hostname\n          : undefined;\n\n      const pathWithLocale = getLocalizedUrl(pathWithoutLocale, locale, {\n        currentDomain,\n      });\n\n      if (typeof onChange === 'function') {\n        onChange({ locale, path: pathWithLocale });\n        return;\n      }\n\n      // Cross-domain navigation: the Next.js router cannot navigate to a\n      // different origin, so fall back to a full page load.\n      if (\n        process.env['INTLAYER_ROUTING_DOMAINS'] !== 'false' &&\n        checkIsURLAbsolute(pathWithLocale)\n      ) {\n        try {\n          const parsed = new URL(pathWithLocale);\n          if (parsed.protocol === 'http:' || parsed.protocol === 'https:') {\n            window.location.href = pathWithLocale;\n          }\n        } catch {\n          // Malformed URL — skip redirect\n        }\n        return;\n      }\n\n      if (onChange === 'replace') {\n        replace(pathWithLocale);\n      }\n      if (onChange === 'push') {\n        push(pathWithLocale);\n      }\n\n      onLocaleChange?.(locale as DeclaredLocales);\n    },\n    [replace, push, pathWithoutLocale, onChange, onLocaleChange]\n  );\n\n  const reactLocaleHook = useLocaleReact({\n    onLocaleChange: redirectionFunction,\n    isCookieEnabled,\n  });\n\n  return {\n    ...reactLocaleHook,\n    pathWithoutLocale,\n  } as UseLocaleResult;\n};\n"],"mappings":";;;;;;;;;AAgCA,MAAM,6BAA6B;CACjC,MAAM,WAAW,YAAY;CAC7B,MAAM,CAAC,UAAU,eAAe,SAAS,QAAQ;CAEjD,gBAAgB;EAEd,MAAM,SAAS,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;EACxE,YAAY,SAAS,GAAG,WAAW,WAAW,QAAQ;CACxD,GAAG,CAAC,QAAQ,CAAC;CAGb,OAAO,cAAc,qBAAqB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACjE;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAa,aAAa,EACxB,WAAW,WACX,gBACA,oBACkB,CAAC,MAAuB;CAC1C,MAAM,EAAE,SAAS,SAAS,UAAU;CACpC,MAAM,oBAAoB,qBAAqB;CAuD/C,OAAO;EACL,GANsBA,YAAe;GACrC,gBAjD0B,aACzB,WAA0B;IACzB,IAAI,CAAC,UAAU;IAQf,MAAM,iBAAiB,gBAAgB,mBAAmB,QAAQ,EAChE,eANA,QAAQ,IAAI,gCAAgC,WAC5C,OAAO,WAAW,cACd,OAAO,SAAS,WAChB,OAIN,CAAC;IAED,IAAI,OAAO,aAAa,YAAY;KAClC,SAAS;MAAE;MAAQ,MAAM;KAAe,CAAC;KACzC;IACF;IAIA,IACE,QAAQ,IAAI,gCAAgC,WAC5C,mBAAmB,cAAc,GACjC;KACA,IAAI;MACF,MAAM,SAAS,IAAI,IAAI,cAAc;MACrC,IAAI,OAAO,aAAa,WAAW,OAAO,aAAa,UACrD,OAAO,SAAS,OAAO;KAE3B,QAAQ,CAER;KACA;IACF;IAEA,IAAI,aAAa,WACf,QAAQ,cAAc;IAExB,IAAI,aAAa,QACf,KAAK,cAAc;IAGrB,iBAAiB,MAAyB;GAC5C,GACA;IAAC;IAAS;IAAM;IAAmB;IAAU;GAAc,CAIzB;GAClC;EACF,CAGmB;EACjB;CACF;AACF"}