index.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import { __assign, __awaiter, __generator, __spreadArray } from "tslib";
  2. import { PINYIN_MAP } from './constants';
  3. import { RareWordsKeyboardProps } from './props';
  4. import { formatZDatas, loadFontFace, matchWordsRecommend } from './utils';
  5. import { ZDATAS } from './zdatas';
  6. import '../_util/assert-component2';
  7. import { useEffect, useEvent, useState } from 'functional-mini/component';
  8. import { useComponentEvent } from '../_util/hooks/useComponentEvent';
  9. import { useEvent as useStableCallback } from '../_util/hooks/useEvent';
  10. import { mountComponent } from '../_util/component';
  11. import { useInstanceBoundingClientRect } from '../_util/hooks/useInstanceBoundingClientRect';
  12. var wordsData = formatZDatas(ZDATAS.datas);
  13. var RareWordsKeyboard = function (props) {
  14. var _a = useState({
  15. showErrorPage: false,
  16. loading: false,
  17. }), fontState = _a[0], setFontState = _a[1];
  18. var _b = useState(0), maxDisplayNum = _b[0], setMaxDisplayNum = _b[1];
  19. var _c = useState({
  20. inputValue: [],
  21. displayStr: '',
  22. matchWordsList: [],
  23. showMoreWords: false, // 是否展示更多候选字
  24. }), keyboardState = _c[0], setKeyboardState = _c[1];
  25. var _d = useComponentEvent(props), triggerEvent = _d.triggerEvent, triggerEventOnly = _d.triggerEventOnly;
  26. var handleHide = useStableCallback(function () {
  27. setKeyboardState({
  28. inputValue: [],
  29. matchWordsList: [],
  30. displayStr: '',
  31. showMoreWords: false,
  32. });
  33. triggerEventOnly('close');
  34. });
  35. // 计算展示值和候选字列表
  36. function computeMatchWords(inputValue) {
  37. var displayStr = Array.isArray(inputValue)
  38. ? inputValue.join('')
  39. : inputValue;
  40. var curMatchWords = matchWordsRecommend(wordsData, displayStr);
  41. return {
  42. displayStr: displayStr,
  43. matchWordsList: curMatchWords,
  44. };
  45. }
  46. function loadFont() {
  47. setFontState(function (pre) {
  48. return __assign(__assign({}, pre), { loading: true });
  49. });
  50. loadFontFace()
  51. .then(function () {
  52. setFontState({ showErrorPage: false, loading: false });
  53. })
  54. .catch(function (err) {
  55. setFontState({ showErrorPage: true, loading: false });
  56. triggerEvent('error', err);
  57. });
  58. }
  59. var getBoundingClientRect = useInstanceBoundingClientRect().getBoundingClientRect;
  60. function computeMaxDisplayNum() {
  61. return __awaiter(this, void 0, void 0, function () {
  62. var _a, singleWords, wordsWrap, maxDisplayNumInOneLine;
  63. return __generator(this, function (_b) {
  64. switch (_b.label) {
  65. case 0: return [4 /*yield*/, Promise.all([
  66. getBoundingClientRect('.ant-rare-words-keyboard-match_words_hidden'),
  67. getBoundingClientRect('.ant-rare-words-keyboard-match_words_inner'),
  68. ])];
  69. case 1:
  70. _a = _b.sent(), singleWords = _a[0], wordsWrap = _a[1];
  71. if (!(wordsWrap === null || wordsWrap === void 0 ? void 0 : wordsWrap.width) || !(singleWords === null || singleWords === void 0 ? void 0 : singleWords.width))
  72. return [2 /*return*/];
  73. maxDisplayNumInOneLine = parseInt(((wordsWrap === null || wordsWrap === void 0 ? void 0 : wordsWrap.width) / (singleWords === null || singleWords === void 0 ? void 0 : singleWords.width)).toString(), 10);
  74. setMaxDisplayNum(maxDisplayNumInOneLine);
  75. return [2 /*return*/];
  76. }
  77. });
  78. });
  79. }
  80. useEffect(function () {
  81. loadFont();
  82. computeMaxDisplayNum();
  83. }, []);
  84. useEvent('handleRetry', function () {
  85. loadFont();
  86. });
  87. useEvent('handleWordClick', function (e) {
  88. var _a = e.currentTarget.dataset.value, value = _a === void 0 ? '' : _a;
  89. if (!value)
  90. return;
  91. triggerEvent('change', value);
  92. handleHide();
  93. });
  94. useEvent('hanleLookMore', function () {
  95. if (keyboardState.matchWordsList.length <= maxDisplayNum) {
  96. handleHide();
  97. return;
  98. }
  99. setKeyboardState(function (old) {
  100. return __assign(__assign({}, old), { showMoreWords: !old.showMoreWords });
  101. });
  102. });
  103. // 隐藏键盘,失去焦点
  104. useEvent('handleHide', function () {
  105. handleHide();
  106. });
  107. // 点击键盘key值
  108. useEvent('handleKeyClick', function (e) {
  109. if (fontState.loading) {
  110. return;
  111. }
  112. var _a = e.target.dataset.value, value = _a === void 0 ? '' : _a;
  113. if (!value) {
  114. return;
  115. }
  116. setKeyboardState(function (old) {
  117. var inputValue = __spreadArray(__spreadArray([], old.inputValue, true), [value], false);
  118. return __assign(__assign(__assign({}, old), { inputValue: inputValue }), computeMatchWords(inputValue));
  119. });
  120. });
  121. // 点击删除
  122. useEvent('handleDelete', function () {
  123. if (keyboardState.inputValue.length === 0) {
  124. return;
  125. }
  126. setKeyboardState(function (old) {
  127. var inputValue = __spreadArray([], old.inputValue, true);
  128. inputValue.pop();
  129. return __assign(__assign(__assign({}, old), { inputValue: __spreadArray([], inputValue, true) }), computeMatchWords(inputValue));
  130. });
  131. });
  132. return __assign(__assign(__assign(__assign({}, fontState), { maxDisplayNum: maxDisplayNum }), keyboardState), { pinyinMaps: PINYIN_MAP });
  133. };
  134. mountComponent(RareWordsKeyboard, RareWordsKeyboardProps);