@beinformed/ui 1.31.4 → 1.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
4
 
5
+ ## [1.32.0](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.31.4...v1.32.0) (2023-08-07)
6
+
7
+
8
+ ### Features
9
+
10
+ * **useLocaleCodes:** add hook to retrieve available locale codes ([46d522f](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/commit/46d522f263f7f90c136bcc26dd026c78898b1c5f))
11
+
5
12
  ## [1.31.4](https://git.beinformed.com/public/nl.beinformed.bi.layout.lib.ui/compare/v1.31.1...v1.31.4) (2023-07-28)
6
13
 
7
14
 
@@ -1,4 +1,5 @@
1
1
  import _JSON$stringify from "@babel/runtime-corejs3/core-js-stable/json/stringify";
2
+ import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
2
3
  import { useSelector } from "react-redux";
3
4
  import { createSelector } from "reselect";
4
5
  import memoize from "lodash/memoize";
@@ -21,5 +22,11 @@ const useTranslate = () => useSelector(getMessage);
21
22
  /**
22
23
  */
23
24
  const useLocale = () => useSelector(getLocale);
24
- export { useTranslate, useMessage, useLocale };
25
+ const getLocaleCodes = createSelector(state => state.i18n.locales, locales => _mapInstanceProperty(locales).call(locales, locale => locale.code));
26
+
27
+ /**
28
+ * Retrieve all available locale codes
29
+ */
30
+ const useLocaleCodes = () => useSelector(getLocaleCodes);
31
+ export { useTranslate, useMessage, useLocale, useLocaleCodes };
25
32
  //# sourceMappingURL=useI18n.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useI18n.js","names":["useSelector","createSelector","memoize","getLocales","getLocale","getMessage","locales","localeCode","id","defaultMessage","placeholders","_len","arguments","length","args","Array","_key","_JSON$stringify","useMessage","useTranslate","useLocale"],"sources":["../../src/hooks/useI18n.js"],"sourcesContent":["// @flow\nimport { useSelector } from \"react-redux\";\nimport { createSelector } from \"reselect\";\nimport memoize from \"lodash/memoize\";\n\nimport { getLocales, getLocale } from \"../redux/selectors/i18n\";\n\nconst getMessage = createSelector(\n [getLocales, getLocale],\n (locales, localeCode) =>\n memoize(\n (id: string, defaultMessage?: string, placeholders?: Object) =>\n locales\n .getLocale(localeCode)\n .getMessage(id, defaultMessage, placeholders),\n (...args) => JSON.stringify(args),\n ),\n);\n\n/**\n */\nconst useMessage = (\n id: string,\n defaultMessage?: string,\n placeholders?: Object | null,\n): any => useSelector(getMessage)(id, defaultMessage, placeholders);\n\n/**\n */\nconst useTranslate = (): ((...any) => any) => useSelector(getMessage);\n\n/**\n */\nconst useLocale = (): string => useSelector(getLocale);\n\nexport { useTranslate, useMessage, useLocale };\n"],"mappings":";AACA,SAASA,WAAW,QAAQ,aAAa;AACzC,SAASC,cAAc,QAAQ,UAAU;AACzC,OAAOC,OAAO,MAAM,gBAAgB;AAEpC,SAASC,UAAU,EAAEC,SAAS,QAAQ,yBAAyB;AAE/D,MAAMC,UAAU,GAAGJ,cAAc,CAC/B,CAACE,UAAU,EAAEC,SAAS,CAAC,EACvB,CAACE,OAAO,EAAEC,UAAU,KAClBL,OAAO,CACL,CAACM,EAAU,EAAEC,cAAuB,EAAEC,YAAqB,KACzDJ,OAAO,CACJF,SAAS,CAACG,UAAU,CAAC,CACrBF,UAAU,CAACG,EAAE,EAAEC,cAAc,EAAEC,YAAY,CAAC,EACjD;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAAIC,IAAI,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAJF,IAAI,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;EAAA;EAAA,OAAKC,eAAA,CAAeH,IAAI,CAAC;AAAA,CACnC,CACJ,CAAC;;AAED;AACA;AACA,MAAMI,UAAU,GAAGA,CACjBV,EAAU,EACVC,cAAuB,EACvBC,YAA4B,KACpBV,WAAW,CAACK,UAAU,CAAC,CAACG,EAAE,EAAEC,cAAc,EAAEC,YAAY,CAAC;;AAEnE;AACA;AACA,MAAMS,YAAY,GAAGA,CAAA,KAAyBnB,WAAW,CAACK,UAAU,CAAC;;AAErE;AACA;AACA,MAAMe,SAAS,GAAGA,CAAA,KAAcpB,WAAW,CAACI,SAAS,CAAC;AAEtD,SAASe,YAAY,EAAED,UAAU,EAAEE,SAAS"}
1
+ {"version":3,"file":"useI18n.js","names":["useSelector","createSelector","memoize","getLocales","getLocale","getMessage","locales","localeCode","id","defaultMessage","placeholders","_len","arguments","length","args","Array","_key","_JSON$stringify","useMessage","useTranslate","useLocale","getLocaleCodes","state","i18n","_mapInstanceProperty","call","locale","code","useLocaleCodes"],"sources":["../../src/hooks/useI18n.js"],"sourcesContent":["// @flow\nimport { useSelector } from \"react-redux\";\nimport { createSelector } from \"reselect\";\nimport memoize from \"lodash/memoize\";\n\nimport { getLocales, getLocale } from \"../redux/selectors/i18n\";\n\nconst getMessage = createSelector(\n [getLocales, getLocale],\n (locales, localeCode) =>\n memoize(\n (id: string, defaultMessage?: string, placeholders?: Object) =>\n locales\n .getLocale(localeCode)\n .getMessage(id, defaultMessage, placeholders),\n (...args) => JSON.stringify(args),\n ),\n);\n\n/**\n */\nconst useMessage = (\n id: string,\n defaultMessage?: string,\n placeholders?: Object | null,\n): any => useSelector(getMessage)(id, defaultMessage, placeholders);\n\n/**\n */\nconst useTranslate = (): ((...any) => any) => useSelector(getMessage);\n\n/**\n */\nconst useLocale = (): string => useSelector(getLocale);\n\nconst getLocaleCodes = createSelector(\n (state) => state.i18n.locales,\n (locales) => locales.map((locale) => locale.code),\n);\n\n/**\n * Retrieve all available locale codes\n */\nconst useLocaleCodes = (): Array<string> => useSelector(getLocaleCodes);\n\nexport { useTranslate, useMessage, useLocale, useLocaleCodes };\n"],"mappings":";;AACA,SAASA,WAAW,QAAQ,aAAa;AACzC,SAASC,cAAc,QAAQ,UAAU;AACzC,OAAOC,OAAO,MAAM,gBAAgB;AAEpC,SAASC,UAAU,EAAEC,SAAS,QAAQ,yBAAyB;AAE/D,MAAMC,UAAU,GAAGJ,cAAc,CAC/B,CAACE,UAAU,EAAEC,SAAS,CAAC,EACvB,CAACE,OAAO,EAAEC,UAAU,KAClBL,OAAO,CACL,CAACM,EAAU,EAAEC,cAAuB,EAAEC,YAAqB,KACzDJ,OAAO,CACJF,SAAS,CAACG,UAAU,CAAC,CACrBF,UAAU,CAACG,EAAE,EAAEC,cAAc,EAAEC,YAAY,CAAC,EACjD;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAAIC,IAAI,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAJF,IAAI,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;EAAA;EAAA,OAAKC,eAAA,CAAeH,IAAI,CAAC;AAAA,CACnC,CACJ,CAAC;;AAED;AACA;AACA,MAAMI,UAAU,GAAGA,CACjBV,EAAU,EACVC,cAAuB,EACvBC,YAA4B,KACpBV,WAAW,CAACK,UAAU,CAAC,CAACG,EAAE,EAAEC,cAAc,EAAEC,YAAY,CAAC;;AAEnE;AACA;AACA,MAAMS,YAAY,GAAGA,CAAA,KAAyBnB,WAAW,CAACK,UAAU,CAAC;;AAErE;AACA;AACA,MAAMe,SAAS,GAAGA,CAAA,KAAcpB,WAAW,CAACI,SAAS,CAAC;AAEtD,MAAMiB,cAAc,GAAGpB,cAAc,CAClCqB,KAAK,IAAKA,KAAK,CAACC,IAAI,CAACjB,OAAO,EAC5BA,OAAO,IAAKkB,oBAAA,CAAAlB,OAAO,EAAAmB,IAAA,CAAPnB,OAAO,EAAMoB,MAAM,IAAKA,MAAM,CAACC,IAAI,CAClD,CAAC;;AAED;AACA;AACA;AACA,MAAMC,cAAc,GAAGA,CAAA,KAAqB5B,WAAW,CAACqB,cAAc,CAAC;AAEvE,SAASF,YAAY,EAAED,UAAU,EAAEE,SAAS,EAAEQ,cAAc"}
@@ -0,0 +1,30 @@
1
+ import configureMockStore from "redux-mock-store";
2
+ import { Provider } from "react-redux";
3
+ import { renderHook } from "@testing-library/react";
4
+
5
+ import { Locales } from "../../i18n";
6
+ import { useLocaleCodes } from "../useI18n";
7
+
8
+ const mockStore = configureMockStore();
9
+
10
+ describe("i18n hooks", () => {
11
+ it("useLocaleCodes available", () => {
12
+ const store = mockStore({
13
+ i18n: {
14
+ locale: "en",
15
+ locales: new Locales([
16
+ { code: "en", messages: {} },
17
+ { code: "nl", messages: {} },
18
+ ]),
19
+ },
20
+ });
21
+
22
+ const wrapper = ({ children }) => (
23
+ <Provider store={store}>{children}</Provider>
24
+ );
25
+
26
+ const { result } = renderHook(() => useLocaleCodes(), { wrapper });
27
+
28
+ expect(result.current).toStrictEqual(["en", "nl"]);
29
+ });
30
+ });
@@ -4,8 +4,9 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.useTranslate = exports.useMessage = exports.useLocale = void 0;
7
+ exports.useTranslate = exports.useMessage = exports.useLocaleCodes = exports.useLocale = void 0;
8
8
  var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));
9
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
9
10
  var _reactRedux = require("react-redux");
10
11
  var _reselect = require("reselect");
11
12
  var _memoize = _interopRequireDefault(require("lodash/memoize"));
@@ -31,4 +32,11 @@ const useTranslate = () => (0, _reactRedux.useSelector)(getMessage);
31
32
  exports.useTranslate = useTranslate;
32
33
  const useLocale = () => (0, _reactRedux.useSelector)(_i18n.getLocale);
33
34
  exports.useLocale = useLocale;
35
+ const getLocaleCodes = (0, _reselect.createSelector)(state => state.i18n.locales, locales => (0, _map.default)(locales).call(locales, locale => locale.code));
36
+
37
+ /**
38
+ * Retrieve all available locale codes
39
+ */
40
+ const useLocaleCodes = () => (0, _reactRedux.useSelector)(getLocaleCodes);
41
+ exports.useLocaleCodes = useLocaleCodes;
34
42
  //# sourceMappingURL=useI18n.js.map
@@ -33,4 +33,14 @@ const useTranslate = (): ((...any) => any) => useSelector(getMessage);
33
33
  */
34
34
  const useLocale = (): string => useSelector(getLocale);
35
35
 
36
- export { useTranslate, useMessage, useLocale };
36
+ const getLocaleCodes = createSelector(
37
+ (state) => state.i18n.locales,
38
+ (locales) => locales.map((locale) => locale.code),
39
+ );
40
+
41
+ /**
42
+ * Retrieve all available locale codes
43
+ */
44
+ const useLocaleCodes = (): Array<string> => useSelector(getLocaleCodes);
45
+
46
+ export { useTranslate, useMessage, useLocale, useLocaleCodes };
@@ -1 +1 @@
1
- {"version":3,"file":"useI18n.js","names":["_reactRedux","require","_reselect","_memoize","_interopRequireDefault","_i18n","getMessage","createSelector","getLocales","getLocale","locales","localeCode","memoize","id","defaultMessage","placeholders","_len","arguments","length","args","Array","_key","_stringify","default","useMessage","useSelector","exports","useTranslate","useLocale"],"sources":["../../src/hooks/useI18n.js"],"sourcesContent":["// @flow\nimport { useSelector } from \"react-redux\";\nimport { createSelector } from \"reselect\";\nimport memoize from \"lodash/memoize\";\n\nimport { getLocales, getLocale } from \"../redux/selectors/i18n\";\n\nconst getMessage = createSelector(\n [getLocales, getLocale],\n (locales, localeCode) =>\n memoize(\n (id: string, defaultMessage?: string, placeholders?: Object) =>\n locales\n .getLocale(localeCode)\n .getMessage(id, defaultMessage, placeholders),\n (...args) => JSON.stringify(args),\n ),\n);\n\n/**\n */\nconst useMessage = (\n id: string,\n defaultMessage?: string,\n placeholders?: Object | null,\n): any => useSelector(getMessage)(id, defaultMessage, placeholders);\n\n/**\n */\nconst useTranslate = (): ((...any) => any) => useSelector(getMessage);\n\n/**\n */\nconst useLocale = (): string => useSelector(getLocale);\n\nexport { useTranslate, useMessage, useLocale };\n"],"mappings":";;;;;;;;AACA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,QAAA,GAAAC,sBAAA,CAAAH,OAAA;AAEA,IAAAI,KAAA,GAAAJ,OAAA;AAEA,MAAMK,UAAU,GAAG,IAAAC,wBAAc,EAC/B,CAACC,gBAAU,EAAEC,eAAS,CAAC,EACvB,CAACC,OAAO,EAAEC,UAAU,KAClB,IAAAC,gBAAO,EACL,CAACC,EAAU,EAAEC,cAAuB,EAAEC,YAAqB,KACzDL,OAAO,CACJD,SAAS,CAACE,UAAU,CAAC,CACrBL,UAAU,CAACO,EAAE,EAAEC,cAAc,EAAEC,YAAY,CAAC,EACjD;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAAIC,IAAI,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAJF,IAAI,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;EAAA;EAAA,OAAK,IAAAC,UAAA,CAAAC,OAAA,EAAeJ,IAAI,CAAC;AAAA,CACnC,CACJ,CAAC;;AAED;AACA;AACA,MAAMK,UAAU,GAAGA,CACjBX,EAAU,EACVC,cAAuB,EACvBC,YAA4B,KACpB,IAAAU,uBAAW,EAACnB,UAAU,CAAC,CAACO,EAAE,EAAEC,cAAc,EAAEC,YAAY,CAAC;;AAEnE;AACA;AADAW,OAAA,CAAAF,UAAA,GAAAA,UAAA;AAEA,MAAMG,YAAY,GAAGA,CAAA,KAAyB,IAAAF,uBAAW,EAACnB,UAAU,CAAC;;AAErE;AACA;AADAoB,OAAA,CAAAC,YAAA,GAAAA,YAAA;AAEA,MAAMC,SAAS,GAAGA,CAAA,KAAc,IAAAH,uBAAW,EAAChB,eAAS,CAAC;AAACiB,OAAA,CAAAE,SAAA,GAAAA,SAAA"}
1
+ {"version":3,"file":"useI18n.js","names":["_reactRedux","require","_reselect","_memoize","_interopRequireDefault","_i18n","getMessage","createSelector","getLocales","getLocale","locales","localeCode","memoize","id","defaultMessage","placeholders","_len","arguments","length","args","Array","_key","_stringify","default","useMessage","useSelector","exports","useTranslate","useLocale","getLocaleCodes","state","i18n","_map","call","locale","code","useLocaleCodes"],"sources":["../../src/hooks/useI18n.js"],"sourcesContent":["// @flow\nimport { useSelector } from \"react-redux\";\nimport { createSelector } from \"reselect\";\nimport memoize from \"lodash/memoize\";\n\nimport { getLocales, getLocale } from \"../redux/selectors/i18n\";\n\nconst getMessage = createSelector(\n [getLocales, getLocale],\n (locales, localeCode) =>\n memoize(\n (id: string, defaultMessage?: string, placeholders?: Object) =>\n locales\n .getLocale(localeCode)\n .getMessage(id, defaultMessage, placeholders),\n (...args) => JSON.stringify(args),\n ),\n);\n\n/**\n */\nconst useMessage = (\n id: string,\n defaultMessage?: string,\n placeholders?: Object | null,\n): any => useSelector(getMessage)(id, defaultMessage, placeholders);\n\n/**\n */\nconst useTranslate = (): ((...any) => any) => useSelector(getMessage);\n\n/**\n */\nconst useLocale = (): string => useSelector(getLocale);\n\nconst getLocaleCodes = createSelector(\n (state) => state.i18n.locales,\n (locales) => locales.map((locale) => locale.code),\n);\n\n/**\n * Retrieve all available locale codes\n */\nconst useLocaleCodes = (): Array<string> => useSelector(getLocaleCodes);\n\nexport { useTranslate, useMessage, useLocale, useLocaleCodes };\n"],"mappings":";;;;;;;;;AACA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,QAAA,GAAAC,sBAAA,CAAAH,OAAA;AAEA,IAAAI,KAAA,GAAAJ,OAAA;AAEA,MAAMK,UAAU,GAAG,IAAAC,wBAAc,EAC/B,CAACC,gBAAU,EAAEC,eAAS,CAAC,EACvB,CAACC,OAAO,EAAEC,UAAU,KAClB,IAAAC,gBAAO,EACL,CAACC,EAAU,EAAEC,cAAuB,EAAEC,YAAqB,KACzDL,OAAO,CACJD,SAAS,CAACE,UAAU,CAAC,CACrBL,UAAU,CAACO,EAAE,EAAEC,cAAc,EAAEC,YAAY,CAAC,EACjD;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAAIC,IAAI,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAJF,IAAI,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;EAAA;EAAA,OAAK,IAAAC,UAAA,CAAAC,OAAA,EAAeJ,IAAI,CAAC;AAAA,CACnC,CACJ,CAAC;;AAED;AACA;AACA,MAAMK,UAAU,GAAGA,CACjBX,EAAU,EACVC,cAAuB,EACvBC,YAA4B,KACpB,IAAAU,uBAAW,EAACnB,UAAU,CAAC,CAACO,EAAE,EAAEC,cAAc,EAAEC,YAAY,CAAC;;AAEnE;AACA;AADAW,OAAA,CAAAF,UAAA,GAAAA,UAAA;AAEA,MAAMG,YAAY,GAAGA,CAAA,KAAyB,IAAAF,uBAAW,EAACnB,UAAU,CAAC;;AAErE;AACA;AADAoB,OAAA,CAAAC,YAAA,GAAAA,YAAA;AAEA,MAAMC,SAAS,GAAGA,CAAA,KAAc,IAAAH,uBAAW,EAAChB,eAAS,CAAC;AAACiB,OAAA,CAAAE,SAAA,GAAAA,SAAA;AAEvD,MAAMC,cAAc,GAAG,IAAAtB,wBAAc,EAClCuB,KAAK,IAAKA,KAAK,CAACC,IAAI,CAACrB,OAAO,EAC5BA,OAAO,IAAK,IAAAsB,IAAA,CAAAT,OAAA,EAAAb,OAAO,EAAAuB,IAAA,CAAPvB,OAAO,EAAMwB,MAAM,IAAKA,MAAM,CAACC,IAAI,CAClD,CAAC;;AAED;AACA;AACA;AACA,MAAMC,cAAc,GAAGA,CAAA,KAAqB,IAAAX,uBAAW,EAACI,cAAc,CAAC;AAACH,OAAA,CAAAU,cAAA,GAAAA,cAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beinformed/ui",
3
- "version": "1.31.4",
3
+ "version": "1.32.0",
4
4
  "description": "Toolbox for be informed javascript layouts",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "bugs": "http://support.beinformed.com",
@@ -112,40 +112,40 @@
112
112
  "@commitlint/config-conventional": "^17.6.7",
113
113
  "@testing-library/react": "^14.0.0",
114
114
  "auditjs": "^4.0.41",
115
- "babel-jest": "^29.6.1",
115
+ "babel-jest": "^29.6.2",
116
116
  "babel-plugin-styled-components": "^2.1.4",
117
117
  "cherry-pick": "^0.5.0",
118
118
  "commit-and-tag-version": "^11.2.2",
119
119
  "cross-env": "^7.0.3",
120
120
  "documentation": "^14.0.2",
121
- "eslint": "^8.45.0",
122
- "eslint-config-prettier": "^8.8.0",
121
+ "eslint": "^8.46.0",
122
+ "eslint-config-prettier": "^9.0.0",
123
123
  "eslint-plugin-babel": "^5.3.1",
124
- "eslint-plugin-ft-flow": "^2.0.3",
125
- "eslint-plugin-import": "^2.27.5",
124
+ "eslint-plugin-ft-flow": "^3.0.0",
125
+ "eslint-plugin-import": "^2.28.0",
126
126
  "eslint-plugin-jest": "^27.2.3",
127
- "eslint-plugin-jsdoc": "^46.4.4",
128
- "eslint-plugin-react": "^7.33.0",
127
+ "eslint-plugin-jsdoc": "^46.4.6",
128
+ "eslint-plugin-react": "^7.33.1",
129
129
  "eslint-plugin-react-hooks": "^4.5.0",
130
130
  "eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0",
131
131
  "flow-bin": "^0.200.1",
132
132
  "flow-copy-source": "^2.0.9",
133
- "flow-typed": "^3.8.0",
133
+ "flow-typed": "^3.9.0",
134
134
  "glob": "^10.3.3",
135
135
  "history": "^4.0.0",
136
136
  "husky": "^8.0.3",
137
- "jest": "^29.6.1",
138
- "jest-environment-jsdom": "^29.6.1",
137
+ "jest": "^29.6.2",
138
+ "jest-environment-jsdom": "^29.6.2",
139
139
  "jest-junit": "^16.0.0",
140
140
  "jest-sonar-reporter": "^2.0.0",
141
141
  "jscodeshift": "^0.15.0",
142
142
  "lint-staged": "^13.2.3",
143
143
  "polished": "^4.0.0",
144
- "prettier": "^3.0.0",
144
+ "prettier": "^3.0.1",
145
145
  "react": "^18.0.0",
146
146
  "react-dom": "^18.0.0",
147
147
  "react-helmet-async": "^1.0.0",
148
- "react-redux": "^8.1.1",
148
+ "react-redux": "^8.1.2",
149
149
  "react-router": "^5.0.0",
150
150
  "react-test-renderer": "^18.1.0",
151
151
  "redux": "^4.2.1",
@@ -0,0 +1,30 @@
1
+ import configureMockStore from "redux-mock-store";
2
+ import { Provider } from "react-redux";
3
+ import { renderHook } from "@testing-library/react";
4
+
5
+ import { Locales } from "../../i18n";
6
+ import { useLocaleCodes } from "../useI18n";
7
+
8
+ const mockStore = configureMockStore();
9
+
10
+ describe("i18n hooks", () => {
11
+ it("useLocaleCodes available", () => {
12
+ const store = mockStore({
13
+ i18n: {
14
+ locale: "en",
15
+ locales: new Locales([
16
+ { code: "en", messages: {} },
17
+ { code: "nl", messages: {} },
18
+ ]),
19
+ },
20
+ });
21
+
22
+ const wrapper = ({ children }) => (
23
+ <Provider store={store}>{children}</Provider>
24
+ );
25
+
26
+ const { result } = renderHook(() => useLocaleCodes(), { wrapper });
27
+
28
+ expect(result.current).toStrictEqual(["en", "nl"]);
29
+ });
30
+ });
@@ -33,4 +33,14 @@ const useTranslate = (): ((...any) => any) => useSelector(getMessage);
33
33
  */
34
34
  const useLocale = (): string => useSelector(getLocale);
35
35
 
36
- export { useTranslate, useMessage, useLocale };
36
+ const getLocaleCodes = createSelector(
37
+ (state) => state.i18n.locales,
38
+ (locales) => locales.map((locale) => locale.code),
39
+ );
40
+
41
+ /**
42
+ * Retrieve all available locale codes
43
+ */
44
+ const useLocaleCodes = (): Array<string> => useSelector(getLocaleCodes);
45
+
46
+ export { useTranslate, useMessage, useLocale, useLocaleCodes };