@chayns-components/translation 5.0.0-beta.1134 → 5.0.0-beta.1137

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.
@@ -5,13 +5,16 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _react = _interopRequireDefault(require("react"));
8
+ var _clsx = _interopRequireDefault(require("clsx"));
8
9
  var _useAdaptiveTranslation = require("../hooks/useAdaptiveTranslation");
9
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
11
  const AdaptiveTranslation = ({
11
12
  children,
12
13
  to,
13
14
  from,
14
- tagName: TagName = 'span'
15
+ tagName: TagName = 'span',
16
+ style,
17
+ className
15
18
  }) => {
16
19
  const {
17
20
  text,
@@ -22,11 +25,12 @@ const AdaptiveTranslation = ({
22
25
  to
23
26
  });
24
27
  return /*#__PURE__*/_react.default.createElement(TagName, {
25
- className: "notranslate",
28
+ className: (0, _clsx.default)('notranslate', className),
26
29
  style: {
27
30
  // eslint-disable-next-line no-nested-ternary
28
31
  opacity: isLoading ? 0 : isFetching ? 0.5 : 1,
29
- transition: 'opacity 0.5s ease'
32
+ transition: 'opacity 0.5s ease',
33
+ ...style
30
34
  }
31
35
  }, text);
32
36
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AdaptiveTranslation.js","names":["_react","_interopRequireDefault","require","_useAdaptiveTranslation","e","__esModule","default","AdaptiveTranslation","children","to","from","tagName","TagName","text","isLoading","isFetching","useAdaptiveTranslation","createElement","className","style","opacity","transition","_default","exports"],"sources":["../../../src/components/AdaptiveTranslation.tsx"],"sourcesContent":["import React from 'react';\nimport { useAdaptiveTranslation } from '../hooks/useAdaptiveTranslation';\nimport { TranslationProps } from '../types/translation';\n\nconst AdaptiveTranslation = ({\n children,\n to,\n from,\n tagName: TagName = 'span',\n}: TranslationProps) => {\n const { text, isLoading, isFetching } = useAdaptiveTranslation(children, { from, to });\n\n return (\n <TagName\n className=\"notranslate\"\n style={{\n // eslint-disable-next-line no-nested-ternary\n opacity: isLoading ? 0 : isFetching ? 0.5 : 1,\n transition: 'opacity 0.5s ease',\n }}\n >\n {text}\n </TagName>\n );\n};\nexport default AdaptiveTranslation;\n"],"mappings":";;;;;;AAAC,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACD,IAAAC,uBAAA,GAAAD,OAAA;AAAyE,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGzE,MAAMG,mBAAmB,GAAGA,CAAC;EACzBC,QAAQ;EACRC,EAAE;EACFC,IAAI;EACJC,OAAO,EAAEC,OAAO,GAAG;AACL,CAAC,KAAK;EACpB,MAAM;IAAEC,IAAI;IAAEC,SAAS;IAAEC;EAAW,CAAC,GAAG,IAAAC,8CAAsB,EAACR,QAAQ,EAAE;IAAEE,IAAI;IAAED;EAAG,CAAC,CAAC;EAEtF,oBACIT,MAAA,CAAAM,OAAA,CAAAW,aAAA,CAACL,OAAO;IACJM,SAAS,EAAC,aAAa;IACvBC,KAAK,EAAE;MACH;MACAC,OAAO,EAAEN,SAAS,GAAG,CAAC,GAAGC,UAAU,GAAG,GAAG,GAAG,CAAC;MAC7CM,UAAU,EAAE;IAChB;EAAE,GAEDR,IACI,CAAC;AAElB,CAAC;AAAC,IAAAS,QAAA,GAAAC,OAAA,CAAAjB,OAAA,GACaC,mBAAmB","ignoreList":[]}
1
+ {"version":3,"file":"AdaptiveTranslation.js","names":["_react","_interopRequireDefault","require","_clsx","_useAdaptiveTranslation","e","__esModule","default","AdaptiveTranslation","children","to","from","tagName","TagName","style","className","text","isLoading","isFetching","useAdaptiveTranslation","createElement","clsx","opacity","transition","_default","exports"],"sources":["../../../src/components/AdaptiveTranslation.tsx"],"sourcesContent":["import React from 'react';\nimport clsx from 'clsx';\nimport { useAdaptiveTranslation } from '../hooks/useAdaptiveTranslation';\nimport { TranslationProps } from '../types/translation';\n\nconst AdaptiveTranslation = ({\n children,\n to,\n from,\n tagName: TagName = 'span',\n style,\n className,\n}: TranslationProps) => {\n const { text, isLoading, isFetching } = useAdaptiveTranslation(children, { from, to });\n\n return (\n <TagName\n className={clsx('notranslate', className)}\n style={{\n // eslint-disable-next-line no-nested-ternary\n opacity: isLoading ? 0 : isFetching ? 0.5 : 1,\n transition: 'opacity 0.5s ease',\n ...style,\n }}\n >\n {text}\n </TagName>\n );\n};\nexport default AdaptiveTranslation;\n"],"mappings":";;;;;;AAAC,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACD,IAAAC,KAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,uBAAA,GAAAF,OAAA;AAAyE,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGzE,MAAMG,mBAAmB,GAAGA,CAAC;EACzBC,QAAQ;EACRC,EAAE;EACFC,IAAI;EACJC,OAAO,EAAEC,OAAO,GAAG,MAAM;EACzBC,KAAK;EACLC;AACc,CAAC,KAAK;EACpB,MAAM;IAAEC,IAAI;IAAEC,SAAS;IAAEC;EAAW,CAAC,GAAG,IAAAC,8CAAsB,EAACV,QAAQ,EAAE;IAAEE,IAAI;IAAED;EAAG,CAAC,CAAC;EAEtF,oBACIV,MAAA,CAAAO,OAAA,CAAAa,aAAA,CAACP,OAAO;IACJE,SAAS,EAAE,IAAAM,aAAI,EAAC,aAAa,EAAEN,SAAS,CAAE;IAC1CD,KAAK,EAAE;MACH;MACAQ,OAAO,EAAEL,SAAS,GAAG,CAAC,GAAGC,UAAU,GAAG,GAAG,GAAG,CAAC;MAC7CK,UAAU,EAAE,mBAAmB;MAC/B,GAAGT;IACP;EAAE,GAEDE,IACI,CAAC;AAElB,CAAC;AAAC,IAAAQ,QAAA,GAAAC,OAAA,CAAAlB,OAAA,GACaC,mBAAmB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"translation.js","names":[],"sources":["../../../src/types/translation.ts"],"sourcesContent":["import { Language } from 'chayns-api';\nimport { Deferred } from '../utils/deferred';\n\nexport interface TranslationProps {\n children: string;\n to?: Exclude<Language, Language.Unknown>;\n from?: Exclude<Language, Language.Unknown>;\n tagName?: keyof HTMLElementTagNameMap;\n}\n\ninterface BaseTranslation {\n text: string;\n to: string;\n from: string;\n}\n\nexport interface QueuedItem extends BaseTranslation {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationBatchItem extends TranslationRequest {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationRequest extends BaseTranslation {\n id: number;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"translation.js","names":[],"sources":["../../../src/types/translation.ts"],"sourcesContent":["import { Language } from 'chayns-api';\nimport React from 'react';\nimport { Deferred } from '../utils/deferred';\n\nexport interface TranslationProps {\n children: string;\n to?: Exclude<Language, Language.Unknown>;\n from?: Exclude<Language, Language.Unknown>;\n tagName?: keyof HTMLElementTagNameMap;\n style?: React.CSSProperties;\n className?: string;\n}\n\ninterface BaseTranslation {\n text: string;\n to: string;\n from: string;\n}\n\nexport interface QueuedItem extends BaseTranslation {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationBatchItem extends TranslationRequest {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationRequest extends BaseTranslation {\n id: number;\n}\n"],"mappings":"","ignoreList":[]}
@@ -68,7 +68,7 @@ class TranslationHandler {
68
68
  await this.#handleTranslation(batch);
69
69
  }
70
70
  };
71
- #throttledProcessTranslationQueue = (0, _lodash.default)(this.#processedTranslationQueue, 1000, {
71
+ #throttledProcessTranslationQueue = (0, _lodash.default)(this.#processedTranslationQueue, 200, {
72
72
  leading: false
73
73
  });
74
74
  translateText = (original, from, to) => {
@@ -89,6 +89,9 @@ class TranslationHandler {
89
89
  from
90
90
  });
91
91
  void this.#throttledProcessTranslationQueue();
92
+ if (this.translationQueue.length >= _constants.MAX_ITEMS_PER_BATCH) {
93
+ void this.#throttledProcessTranslationQueue.flush();
94
+ }
92
95
  return deferred.promise;
93
96
  };
94
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"translationHandler.js","names":["_constants","require","_lodash","_interopRequireDefault","_deferred","_translation","e","__esModule","default","TranslationHandler","translationQueue","cachedTranslations","handleTranslation","batch","result","fetchTranslations","map","deferred","d","item","forEach","index","batchItem","from","to","text","resolve","ex","reject","processedTranslationQueue","#processedTranslationQueue","totalLength","length","shift","push","id","BATCH_SIZE_LIMIT","MAX_ITEMS_PER_BATCH","throttledProcessTranslationQueue","throttle","leading","translateText","original","_this$cachedTranslati","cachedTranslation","Promise","existingItem","find","promise","Deferred","translationHandler","_default","exports"],"sources":["../../../src/utils/translationHandler.ts"],"sourcesContent":["import { QueuedItem, TranslationBatchItem } from '../types/translation';\nimport { BATCH_SIZE_LIMIT, MAX_ITEMS_PER_BATCH } from '../constants/constants';\nimport throttle from 'lodash.throttle';\nimport { Deferred } from './deferred';\nimport { fetchTranslations } from '../api/translation';\n\nclass TranslationHandler {\n translationQueue: QueuedItem[] = [];\n\n cachedTranslations: Record<string, Record<string, Record<string, string>>> = {};\n\n #handleTranslation = async (batch: TranslationBatchItem[]) => {\n try {\n const result = await fetchTranslations(batch.map(({ deferred: d, ...item }) => item));\n\n result.forEach((item, index) => {\n const batchItem = batch[index];\n\n if (!batchItem) {\n return;\n }\n\n const { from, to, text } = batchItem;\n\n batchItem.deferred.resolve(item);\n this.cachedTranslations[from] ??= {};\n this.cachedTranslations[from][to] ??= {};\n this.cachedTranslations[from][to][text] = item;\n });\n } catch (ex) {\n batch.forEach((item) => {\n item.deferred.reject(ex);\n });\n }\n };\n\n #processedTranslationQueue = async () => {\n let totalLength = 0;\n let batch: TranslationBatchItem[] = [];\n\n while (this.translationQueue.length) {\n const { text, deferred, to, from } = this.translationQueue.shift() as QueuedItem;\n totalLength += text.length;\n batch.push({\n text,\n to,\n from,\n id: batch.length,\n deferred,\n });\n\n if (totalLength > BATCH_SIZE_LIMIT || batch.length >= MAX_ITEMS_PER_BATCH) {\n // eslint-disable-next-line no-await-in-loop\n await this.#handleTranslation(batch);\n batch = [];\n totalLength = 0;\n }\n }\n\n if (batch.length > 0) {\n await this.#handleTranslation(batch);\n }\n };\n\n #throttledProcessTranslationQueue = throttle(this.#processedTranslationQueue, 1000, {\n leading: false,\n });\n\n translateText = (original: string, from: string, to: string) => {\n const cachedTranslation = this.cachedTranslations[from]?.[to]?.[original];\n if (typeof cachedTranslation === 'string') {\n return Promise.resolve(cachedTranslation);\n }\n\n const existingItem = this.translationQueue.find(\n (item) => item.text === original && item.to === to && item.from === from,\n );\n if (existingItem) {\n return existingItem.deferred.promise;\n }\n const deferred = new Deferred<string>();\n this.translationQueue.push({ text: original, deferred, to, from });\n void this.#throttledProcessTranslationQueue();\n return deferred.promise;\n };\n}\n\nconst translationHandler = new TranslationHandler();\n\nexport default translationHandler;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"translationHandler.js","names":["_constants","require","_lodash","_interopRequireDefault","_deferred","_translation","e","__esModule","default","TranslationHandler","translationQueue","cachedTranslations","handleTranslation","batch","result","fetchTranslations","map","deferred","d","item","forEach","index","batchItem","from","to","text","resolve","ex","reject","processedTranslationQueue","#processedTranslationQueue","totalLength","length","shift","push","id","BATCH_SIZE_LIMIT","MAX_ITEMS_PER_BATCH","throttledProcessTranslationQueue","throttle","leading","translateText","original","_this$cachedTranslati","cachedTranslation","Promise","existingItem","find","promise","Deferred","flush","translationHandler","_default","exports"],"sources":["../../../src/utils/translationHandler.ts"],"sourcesContent":["import { QueuedItem, TranslationBatchItem } from '../types/translation';\nimport { BATCH_SIZE_LIMIT, MAX_ITEMS_PER_BATCH } from '../constants/constants';\nimport throttle from 'lodash.throttle';\nimport { Deferred } from './deferred';\nimport { fetchTranslations } from '../api/translation';\n\nclass TranslationHandler {\n translationQueue: QueuedItem[] = [];\n\n cachedTranslations: Record<string, Record<string, Record<string, string>>> = {};\n\n #handleTranslation = async (batch: TranslationBatchItem[]) => {\n try {\n const result = await fetchTranslations(batch.map(({ deferred: d, ...item }) => item));\n\n result.forEach((item, index) => {\n const batchItem = batch[index];\n\n if (!batchItem) {\n return;\n }\n\n const { from, to, text } = batchItem;\n\n batchItem.deferred.resolve(item);\n this.cachedTranslations[from] ??= {};\n this.cachedTranslations[from][to] ??= {};\n this.cachedTranslations[from][to][text] = item;\n });\n } catch (ex) {\n batch.forEach((item) => {\n item.deferred.reject(ex);\n });\n }\n };\n\n #processedTranslationQueue = async () => {\n let totalLength = 0;\n let batch: TranslationBatchItem[] = [];\n\n while (this.translationQueue.length) {\n const { text, deferred, to, from } = this.translationQueue.shift() as QueuedItem;\n totalLength += text.length;\n batch.push({\n text,\n to,\n from,\n id: batch.length,\n deferred,\n });\n\n if (totalLength > BATCH_SIZE_LIMIT || batch.length >= MAX_ITEMS_PER_BATCH) {\n // eslint-disable-next-line no-await-in-loop\n await this.#handleTranslation(batch);\n batch = [];\n totalLength = 0;\n }\n }\n\n if (batch.length > 0) {\n await this.#handleTranslation(batch);\n }\n };\n\n #throttledProcessTranslationQueue = throttle(this.#processedTranslationQueue, 200, {\n leading: false,\n });\n\n translateText = (original: string, from: string, to: string) => {\n const cachedTranslation = this.cachedTranslations[from]?.[to]?.[original];\n if (typeof cachedTranslation === 'string') {\n return Promise.resolve(cachedTranslation);\n }\n\n const existingItem = this.translationQueue.find(\n (item) => item.text === original && item.to === to && item.from === from,\n );\n if (existingItem) {\n return existingItem.deferred.promise;\n }\n const deferred = new Deferred<string>();\n this.translationQueue.push({ text: original, deferred, to, from });\n void this.#throttledProcessTranslationQueue();\n if (this.translationQueue.length >= MAX_ITEMS_PER_BATCH) {\n void this.#throttledProcessTranslationQueue.flush();\n }\n return deferred.promise;\n };\n}\n\nconst translationHandler = new TranslationHandler();\n\nexport default translationHandler;\n"],"mappings":"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","ignoreList":[]}
@@ -1,11 +1,14 @@
1
1
  import React from 'react';
2
+ import clsx from 'clsx';
2
3
  import { useAdaptiveTranslation } from '../hooks/useAdaptiveTranslation';
3
4
  const AdaptiveTranslation = _ref => {
4
5
  let {
5
6
  children,
6
7
  to,
7
8
  from,
8
- tagName: TagName = 'span'
9
+ tagName: TagName = 'span',
10
+ style,
11
+ className
9
12
  } = _ref;
10
13
  const {
11
14
  text,
@@ -16,11 +19,12 @@ const AdaptiveTranslation = _ref => {
16
19
  to
17
20
  });
18
21
  return /*#__PURE__*/React.createElement(TagName, {
19
- className: "notranslate",
22
+ className: clsx('notranslate', className),
20
23
  style: {
21
24
  // eslint-disable-next-line no-nested-ternary
22
25
  opacity: isLoading ? 0 : isFetching ? 0.5 : 1,
23
- transition: 'opacity 0.5s ease'
26
+ transition: 'opacity 0.5s ease',
27
+ ...style
24
28
  }
25
29
  }, text);
26
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AdaptiveTranslation.js","names":["React","useAdaptiveTranslation","AdaptiveTranslation","_ref","children","to","from","tagName","TagName","text","isLoading","isFetching","createElement","className","style","opacity","transition"],"sources":["../../../src/components/AdaptiveTranslation.tsx"],"sourcesContent":["import React from 'react';\nimport { useAdaptiveTranslation } from '../hooks/useAdaptiveTranslation';\nimport { TranslationProps } from '../types/translation';\n\nconst AdaptiveTranslation = ({\n children,\n to,\n from,\n tagName: TagName = 'span',\n}: TranslationProps) => {\n const { text, isLoading, isFetching } = useAdaptiveTranslation(children, { from, to });\n\n return (\n <TagName\n className=\"notranslate\"\n style={{\n // eslint-disable-next-line no-nested-ternary\n opacity: isLoading ? 0 : isFetching ? 0.5 : 1,\n transition: 'opacity 0.5s ease',\n }}\n >\n {text}\n </TagName>\n );\n};\nexport default AdaptiveTranslation;\n"],"mappings":"AAAC,OAAOA,KAAK,MAAM,OAAO;AAC1B,SAASC,sBAAsB,QAAQ,iCAAiC;AAGxE,MAAMC,mBAAmB,GAAGC,IAAA,IAKJ;EAAA,IALK;IACzBC,QAAQ;IACRC,EAAE;IACFC,IAAI;IACJC,OAAO,EAAEC,OAAO,GAAG;EACL,CAAC,GAAAL,IAAA;EACf,MAAM;IAAEM,IAAI;IAAEC,SAAS;IAAEC;EAAW,CAAC,GAAGV,sBAAsB,CAACG,QAAQ,EAAE;IAAEE,IAAI;IAAED;EAAG,CAAC,CAAC;EAEtF,oBACIL,KAAA,CAAAY,aAAA,CAACJ,OAAO;IACJK,SAAS,EAAC,aAAa;IACvBC,KAAK,EAAE;MACH;MACAC,OAAO,EAAEL,SAAS,GAAG,CAAC,GAAGC,UAAU,GAAG,GAAG,GAAG,CAAC;MAC7CK,UAAU,EAAE;IAChB;EAAE,GAEDP,IACI,CAAC;AAElB,CAAC;AACD,eAAeP,mBAAmB","ignoreList":[]}
1
+ {"version":3,"file":"AdaptiveTranslation.js","names":["React","clsx","useAdaptiveTranslation","AdaptiveTranslation","_ref","children","to","from","tagName","TagName","style","className","text","isLoading","isFetching","createElement","opacity","transition"],"sources":["../../../src/components/AdaptiveTranslation.tsx"],"sourcesContent":["import React from 'react';\nimport clsx from 'clsx';\nimport { useAdaptiveTranslation } from '../hooks/useAdaptiveTranslation';\nimport { TranslationProps } from '../types/translation';\n\nconst AdaptiveTranslation = ({\n children,\n to,\n from,\n tagName: TagName = 'span',\n style,\n className,\n}: TranslationProps) => {\n const { text, isLoading, isFetching } = useAdaptiveTranslation(children, { from, to });\n\n return (\n <TagName\n className={clsx('notranslate', className)}\n style={{\n // eslint-disable-next-line no-nested-ternary\n opacity: isLoading ? 0 : isFetching ? 0.5 : 1,\n transition: 'opacity 0.5s ease',\n ...style,\n }}\n >\n {text}\n </TagName>\n );\n};\nexport default AdaptiveTranslation;\n"],"mappings":"AAAC,OAAOA,KAAK,MAAM,OAAO;AAC1B,OAAOC,IAAI,MAAM,MAAM;AACvB,SAASC,sBAAsB,QAAQ,iCAAiC;AAGxE,MAAMC,mBAAmB,GAAGC,IAAA,IAOJ;EAAA,IAPK;IACzBC,QAAQ;IACRC,EAAE;IACFC,IAAI;IACJC,OAAO,EAAEC,OAAO,GAAG,MAAM;IACzBC,KAAK;IACLC;EACc,CAAC,GAAAP,IAAA;EACf,MAAM;IAAEQ,IAAI;IAAEC,SAAS;IAAEC;EAAW,CAAC,GAAGZ,sBAAsB,CAACG,QAAQ,EAAE;IAAEE,IAAI;IAAED;EAAG,CAAC,CAAC;EAEtF,oBACIN,KAAA,CAAAe,aAAA,CAACN,OAAO;IACJE,SAAS,EAAEV,IAAI,CAAC,aAAa,EAAEU,SAAS,CAAE;IAC1CD,KAAK,EAAE;MACH;MACAM,OAAO,EAAEH,SAAS,GAAG,CAAC,GAAGC,UAAU,GAAG,GAAG,GAAG,CAAC;MAC7CG,UAAU,EAAE,mBAAmB;MAC/B,GAAGP;IACP;EAAE,GAEDE,IACI,CAAC;AAElB,CAAC;AACD,eAAeT,mBAAmB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"translation.js","names":[],"sources":["../../../src/types/translation.ts"],"sourcesContent":["import { Language } from 'chayns-api';\nimport { Deferred } from '../utils/deferred';\n\nexport interface TranslationProps {\n children: string;\n to?: Exclude<Language, Language.Unknown>;\n from?: Exclude<Language, Language.Unknown>;\n tagName?: keyof HTMLElementTagNameMap;\n}\n\ninterface BaseTranslation {\n text: string;\n to: string;\n from: string;\n}\n\nexport interface QueuedItem extends BaseTranslation {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationBatchItem extends TranslationRequest {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationRequest extends BaseTranslation {\n id: number;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"translation.js","names":[],"sources":["../../../src/types/translation.ts"],"sourcesContent":["import { Language } from 'chayns-api';\nimport React from 'react';\nimport { Deferred } from '../utils/deferred';\n\nexport interface TranslationProps {\n children: string;\n to?: Exclude<Language, Language.Unknown>;\n from?: Exclude<Language, Language.Unknown>;\n tagName?: keyof HTMLElementTagNameMap;\n style?: React.CSSProperties;\n className?: string;\n}\n\ninterface BaseTranslation {\n text: string;\n to: string;\n from: string;\n}\n\nexport interface QueuedItem extends BaseTranslation {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationBatchItem extends TranslationRequest {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationRequest extends BaseTranslation {\n id: number;\n}\n"],"mappings":"","ignoreList":[]}
@@ -64,7 +64,7 @@ class TranslationHandler {
64
64
  await this.#handleTranslation(batch);
65
65
  }
66
66
  };
67
- #throttledProcessTranslationQueue = (() => throttle(this.#processedTranslationQueue, 1000, {
67
+ #throttledProcessTranslationQueue = (() => throttle(this.#processedTranslationQueue, 200, {
68
68
  leading: false
69
69
  }))();
70
70
  translateText = (original, from, to) => {
@@ -84,6 +84,9 @@ class TranslationHandler {
84
84
  from
85
85
  });
86
86
  void this.#throttledProcessTranslationQueue();
87
+ if (this.translationQueue.length >= MAX_ITEMS_PER_BATCH) {
88
+ void this.#throttledProcessTranslationQueue.flush();
89
+ }
87
90
  return deferred.promise;
88
91
  };
89
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"translationHandler.js","names":["BATCH_SIZE_LIMIT","MAX_ITEMS_PER_BATCH","throttle","Deferred","fetchTranslations","TranslationHandler","translationQueue","cachedTranslations","handleTranslation","batch","result","map","_ref","deferred","d","item","forEach","index","batchItem","from","to","text","resolve","ex","reject","processedTranslationQueue","#processedTranslationQueue","totalLength","length","shift","push","id","throttledProcessTranslationQueue","leading","translateText","original","cachedTranslation","Promise","existingItem","find","promise","translationHandler"],"sources":["../../../src/utils/translationHandler.ts"],"sourcesContent":["import { QueuedItem, TranslationBatchItem } from '../types/translation';\nimport { BATCH_SIZE_LIMIT, MAX_ITEMS_PER_BATCH } from '../constants/constants';\nimport throttle from 'lodash.throttle';\nimport { Deferred } from './deferred';\nimport { fetchTranslations } from '../api/translation';\n\nclass TranslationHandler {\n translationQueue: QueuedItem[] = [];\n\n cachedTranslations: Record<string, Record<string, Record<string, string>>> = {};\n\n #handleTranslation = async (batch: TranslationBatchItem[]) => {\n try {\n const result = await fetchTranslations(batch.map(({ deferred: d, ...item }) => item));\n\n result.forEach((item, index) => {\n const batchItem = batch[index];\n\n if (!batchItem) {\n return;\n }\n\n const { from, to, text } = batchItem;\n\n batchItem.deferred.resolve(item);\n this.cachedTranslations[from] ??= {};\n this.cachedTranslations[from][to] ??= {};\n this.cachedTranslations[from][to][text] = item;\n });\n } catch (ex) {\n batch.forEach((item) => {\n item.deferred.reject(ex);\n });\n }\n };\n\n #processedTranslationQueue = async () => {\n let totalLength = 0;\n let batch: TranslationBatchItem[] = [];\n\n while (this.translationQueue.length) {\n const { text, deferred, to, from } = this.translationQueue.shift() as QueuedItem;\n totalLength += text.length;\n batch.push({\n text,\n to,\n from,\n id: batch.length,\n deferred,\n });\n\n if (totalLength > BATCH_SIZE_LIMIT || batch.length >= MAX_ITEMS_PER_BATCH) {\n // eslint-disable-next-line no-await-in-loop\n await this.#handleTranslation(batch);\n batch = [];\n totalLength = 0;\n }\n }\n\n if (batch.length > 0) {\n await this.#handleTranslation(batch);\n }\n };\n\n #throttledProcessTranslationQueue = throttle(this.#processedTranslationQueue, 1000, {\n leading: false,\n });\n\n translateText = (original: string, from: string, to: string) => {\n const cachedTranslation = this.cachedTranslations[from]?.[to]?.[original];\n if (typeof cachedTranslation === 'string') {\n return Promise.resolve(cachedTranslation);\n }\n\n const existingItem = this.translationQueue.find(\n (item) => item.text === original && item.to === to && item.from === from,\n );\n if (existingItem) {\n return existingItem.deferred.promise;\n }\n const deferred = new Deferred<string>();\n this.translationQueue.push({ text: original, deferred, to, from });\n void this.#throttledProcessTranslationQueue();\n return deferred.promise;\n };\n}\n\nconst translationHandler = new TranslationHandler();\n\nexport default translationHandler;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"translationHandler.js","names":["BATCH_SIZE_LIMIT","MAX_ITEMS_PER_BATCH","throttle","Deferred","fetchTranslations","TranslationHandler","translationQueue","cachedTranslations","handleTranslation","batch","result","map","_ref","deferred","d","item","forEach","index","batchItem","from","to","text","resolve","ex","reject","processedTranslationQueue","#processedTranslationQueue","totalLength","length","shift","push","id","throttledProcessTranslationQueue","leading","translateText","original","cachedTranslation","Promise","existingItem","find","promise","flush","translationHandler"],"sources":["../../../src/utils/translationHandler.ts"],"sourcesContent":["import { QueuedItem, TranslationBatchItem } from '../types/translation';\nimport { BATCH_SIZE_LIMIT, MAX_ITEMS_PER_BATCH } from '../constants/constants';\nimport throttle from 'lodash.throttle';\nimport { Deferred } from './deferred';\nimport { fetchTranslations } from '../api/translation';\n\nclass TranslationHandler {\n translationQueue: QueuedItem[] = [];\n\n cachedTranslations: Record<string, Record<string, Record<string, string>>> = {};\n\n #handleTranslation = async (batch: TranslationBatchItem[]) => {\n try {\n const result = await fetchTranslations(batch.map(({ deferred: d, ...item }) => item));\n\n result.forEach((item, index) => {\n const batchItem = batch[index];\n\n if (!batchItem) {\n return;\n }\n\n const { from, to, text } = batchItem;\n\n batchItem.deferred.resolve(item);\n this.cachedTranslations[from] ??= {};\n this.cachedTranslations[from][to] ??= {};\n this.cachedTranslations[from][to][text] = item;\n });\n } catch (ex) {\n batch.forEach((item) => {\n item.deferred.reject(ex);\n });\n }\n };\n\n #processedTranslationQueue = async () => {\n let totalLength = 0;\n let batch: TranslationBatchItem[] = [];\n\n while (this.translationQueue.length) {\n const { text, deferred, to, from } = this.translationQueue.shift() as QueuedItem;\n totalLength += text.length;\n batch.push({\n text,\n to,\n from,\n id: batch.length,\n deferred,\n });\n\n if (totalLength > BATCH_SIZE_LIMIT || batch.length >= MAX_ITEMS_PER_BATCH) {\n // eslint-disable-next-line no-await-in-loop\n await this.#handleTranslation(batch);\n batch = [];\n totalLength = 0;\n }\n }\n\n if (batch.length > 0) {\n await this.#handleTranslation(batch);\n }\n };\n\n #throttledProcessTranslationQueue = throttle(this.#processedTranslationQueue, 200, {\n leading: false,\n });\n\n translateText = (original: string, from: string, to: string) => {\n const cachedTranslation = this.cachedTranslations[from]?.[to]?.[original];\n if (typeof cachedTranslation === 'string') {\n return Promise.resolve(cachedTranslation);\n }\n\n const existingItem = this.translationQueue.find(\n (item) => item.text === original && item.to === to && item.from === from,\n );\n if (existingItem) {\n return existingItem.deferred.promise;\n }\n const deferred = new Deferred<string>();\n this.translationQueue.push({ text: original, deferred, to, from });\n void this.#throttledProcessTranslationQueue();\n if (this.translationQueue.length >= MAX_ITEMS_PER_BATCH) {\n void this.#throttledProcessTranslationQueue.flush();\n }\n return deferred.promise;\n };\n}\n\nconst translationHandler = new TranslationHandler();\n\nexport default translationHandler;\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
2
  import { TranslationProps } from '../types/translation';
3
- declare const AdaptiveTranslation: ({ children, to, from, tagName: TagName, }: TranslationProps) => React.JSX.Element;
3
+ declare const AdaptiveTranslation: ({ children, to, from, tagName: TagName, style, className, }: TranslationProps) => React.JSX.Element;
4
4
  export default AdaptiveTranslation;
@@ -1,10 +1,13 @@
1
1
  import { Language } from 'chayns-api';
2
+ import React from 'react';
2
3
  import { Deferred } from '../utils/deferred';
3
4
  export interface TranslationProps {
4
5
  children: string;
5
6
  to?: Exclude<Language, Language.Unknown>;
6
7
  from?: Exclude<Language, Language.Unknown>;
7
8
  tagName?: keyof HTMLElementTagNameMap;
9
+ style?: React.CSSProperties;
10
+ className?: string;
8
11
  }
9
12
  interface BaseTranslation {
10
13
  text: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chayns-components/translation",
3
- "version": "5.0.0-beta.1134",
3
+ "version": "5.0.0-beta.1137",
4
4
  "description": "A set of beautiful React components for developing your own applications with chayns.",
5
5
  "sideEffects": false,
6
6
  "browserslist": [
@@ -67,6 +67,7 @@
67
67
  "typescript": "^5.8.3"
68
68
  },
69
69
  "dependencies": {
70
+ "clsx": "^2.1.1",
70
71
  "lodash.throttle": "^4.1.1"
71
72
  },
72
73
  "peerDependencies": {
@@ -77,5 +78,5 @@
77
78
  "publishConfig": {
78
79
  "access": "public"
79
80
  },
80
- "gitHead": "8dd4ac60583a0bc2d4fba25e65e573614d04fb53"
81
+ "gitHead": "64ec29f2750c1ee25e1c01c5ab1446d4594f403d"
81
82
  }