@antscorp/antsomi-ui 1.3.3-beta.4 → 1.3.3-beta.40

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.
Files changed (197) hide show
  1. package/es/assets/images/iphone-top-bar.png +0 -0
  2. package/es/assets/images/iphone.png +0 -0
  3. package/es/assets/images/stars_slider.png +0 -0
  4. package/es/components/atoms/Input/Input.d.ts +3 -0
  5. package/es/components/atoms/Input/Input.js +4 -3
  6. package/es/components/atoms/InputDynamic/EditCaretPositioning.d.ts +2 -0
  7. package/es/components/atoms/InputDynamic/EditCaretPositioning.js +89 -0
  8. package/es/components/atoms/InputDynamic/InputDynamic.d.ts +30 -0
  9. package/es/components/atoms/InputDynamic/InputDynamic.js +320 -0
  10. package/es/components/atoms/InputDynamic/PopupShortLink.d.ts +16 -0
  11. package/es/components/atoms/InputDynamic/PopupShortLink.js +98 -0
  12. package/es/components/atoms/InputDynamic/index.d.ts +2 -0
  13. package/es/components/atoms/InputDynamic/index.js +1 -0
  14. package/es/components/atoms/InputDynamic/styled.d.ts +12 -0
  15. package/es/components/atoms/InputDynamic/styled.js +281 -0
  16. package/es/components/atoms/InputDynamic/utils.d.ts +22 -0
  17. package/es/components/atoms/InputDynamic/utils.js +751 -0
  18. package/es/components/atoms/MobileFrame/MobileFrame.d.ts +4 -0
  19. package/es/components/atoms/MobileFrame/MobileFrame.js +22 -0
  20. package/es/components/atoms/MobileFrame/constants.d.ts +4 -0
  21. package/es/components/atoms/MobileFrame/constants.js +4 -0
  22. package/es/components/atoms/MobileFrame/index.d.ts +2 -0
  23. package/es/components/atoms/MobileFrame/index.js +1 -0
  24. package/es/components/atoms/MobileFrame/styled.d.ts +3 -0
  25. package/es/components/atoms/MobileFrame/styled.js +33 -0
  26. package/es/components/atoms/Pagination/index.d.ts +1 -0
  27. package/es/components/atoms/PreviewTabs/PreviewTabs.d.ts +7 -0
  28. package/es/components/atoms/PreviewTabs/PreviewTabs.js +67 -0
  29. package/es/components/atoms/PreviewTabs/index.d.ts +2 -0
  30. package/es/components/atoms/PreviewTabs/index.js +1 -0
  31. package/es/components/atoms/PreviewTabs/styled.d.ts +6 -0
  32. package/es/components/atoms/PreviewTabs/styled.js +79 -0
  33. package/es/components/atoms/RateV2/RateV2.d.ts +18 -0
  34. package/es/components/atoms/RateV2/RateV2.js +73 -0
  35. package/es/components/atoms/RateV2/index.d.ts +1 -0
  36. package/es/components/atoms/RateV2/index.js +1 -0
  37. package/es/components/atoms/RequiredLabel/index.d.ts +1 -0
  38. package/es/components/atoms/RequiredLabel/index.js +4 -3
  39. package/es/components/atoms/Slider/index.d.ts +2 -1
  40. package/es/components/atoms/Slider/index.js +7 -14
  41. package/es/components/atoms/SliderV2/index.d.ts +6 -0
  42. package/es/components/atoms/SliderV2/index.js +21 -0
  43. package/es/components/atoms/Spin/Spin.d.ts +2 -1
  44. package/es/components/atoms/Spin/styled.d.ts +1 -1
  45. package/es/components/atoms/index.d.ts +7 -0
  46. package/es/components/atoms/index.js +5 -0
  47. package/es/components/common/ConfigProvider/GlobalStyle.js +66 -2
  48. package/es/components/icons/ArrowGrowIcon.d.ts +2 -1
  49. package/es/components/icons/AudioRecordIcon.d.ts +2 -1
  50. package/es/components/icons/BugIcon.d.ts +2 -1
  51. package/es/components/icons/CameraIcon.d.ts +2 -1
  52. package/es/components/icons/CaptureIcon.d.ts +2 -1
  53. package/es/components/icons/CheckSlimIcon.d.ts +2 -1
  54. package/es/components/icons/CloseIcon.d.ts +2 -1
  55. package/es/components/icons/CommentIcon.d.ts +2 -1
  56. package/es/components/icons/EventIcon.d.ts +2 -1
  57. package/es/components/icons/FreeDrawIcon.d.ts +2 -1
  58. package/es/components/icons/GPTIcon.d.ts +2 -1
  59. package/es/components/icons/GPTIconV2.d.ts +2 -1
  60. package/es/components/icons/GPTIconV3.d.ts +2 -1
  61. package/es/components/icons/HighlightIcon.d.ts +2 -1
  62. package/es/components/icons/IdeaIcon.d.ts +2 -1
  63. package/es/components/icons/InvisibleIcon.d.ts +2 -1
  64. package/es/components/icons/MuteIcon.d.ts +2 -1
  65. package/es/components/icons/OpenUrlIcon.d.ts +2 -1
  66. package/es/components/icons/PauseIcon.d.ts +2 -1
  67. package/es/components/icons/PlaneIcon.d.ts +2 -1
  68. package/es/components/icons/RequestIcon.d.ts +2 -1
  69. package/es/components/icons/StopRecordIcon.d.ts +2 -1
  70. package/es/components/icons/UserIcon.d.ts +2 -1
  71. package/es/components/icons/VerticalDotsIcon.d.ts +2 -1
  72. package/es/components/icons/WarningIcon.d.ts +2 -1
  73. package/es/components/molecules/CaptureScreen/CaptureScreen.d.ts +2 -1
  74. package/es/components/molecules/CaptureScreen/components/CommentBox/CommentBox.d.ts +2 -1
  75. package/es/components/molecules/CaptureScreen/components/Cursor/Cursor.d.ts +2 -1
  76. package/es/components/molecules/FontSetting/constants.d.ts +3 -0
  77. package/es/components/molecules/FontSetting/constants.js +22 -0
  78. package/es/components/molecules/FontSetting/index.d.ts +10 -4
  79. package/es/components/molecules/FontSetting/index.js +36 -35
  80. package/es/components/molecules/FontSetting/types.d.ts +1 -1
  81. package/es/components/molecules/Modal/Modal.d.ts +2 -2
  82. package/es/components/molecules/Modal/index.d.ts +1 -0
  83. package/es/components/molecules/Modal/styled.d.ts +1 -1
  84. package/es/components/molecules/ModalV2/ModalV2.d.ts +5 -0
  85. package/es/components/molecules/ModalV2/ModalV2.js +26 -0
  86. package/es/components/molecules/ModalV2/index.d.ts +2 -0
  87. package/es/components/molecules/ModalV2/index.js +1 -0
  88. package/es/components/molecules/ModalV2/styled.d.ts +7 -0
  89. package/es/components/molecules/ModalV2/styled.js +22 -0
  90. package/es/components/molecules/PreviewModal/PreviewModal.d.ts +7 -0
  91. package/es/components/molecules/PreviewModal/PreviewModal.js +30 -0
  92. package/es/components/molecules/PreviewModal/index.d.ts +2 -0
  93. package/es/components/molecules/PreviewModal/index.js +1 -0
  94. package/es/components/molecules/PreviewModal/styled.d.ts +4 -0
  95. package/es/components/molecules/PreviewModal/styled.js +39 -0
  96. package/es/components/molecules/ResizeGrid/ResizeGrid.d.ts +3 -0
  97. package/es/components/molecules/ResizeGrid/ResizeGrid.js +719 -0
  98. package/es/components/molecules/ResizeGrid/components/Cell/Cell.d.ts +3 -0
  99. package/es/components/molecules/ResizeGrid/components/Cell/Cell.js +86 -0
  100. package/es/components/molecules/ResizeGrid/components/Cell/index.d.ts +1 -0
  101. package/es/components/molecules/ResizeGrid/components/Cell/index.js +1 -0
  102. package/es/components/molecules/ResizeGrid/components/Cell/styled.d.ts +3 -0
  103. package/es/components/molecules/ResizeGrid/components/Cell/styled.js +80 -0
  104. package/es/components/molecules/ResizeGrid/constant.d.ts +35 -0
  105. package/es/components/molecules/ResizeGrid/constant.js +111 -0
  106. package/es/components/molecules/ResizeGrid/index.d.ts +2 -0
  107. package/es/components/molecules/ResizeGrid/index.js +1 -0
  108. package/es/components/molecules/ResizeGrid/styled.d.ts +10 -0
  109. package/es/components/molecules/ResizeGrid/styled.js +56 -0
  110. package/es/components/molecules/ResizeGrid/types.d.ts +147 -0
  111. package/es/components/molecules/ResizeGrid/types.js +1 -0
  112. package/es/components/molecules/RichMenu/RichMenuBlock/RichMenuBlock.d.ts +9 -0
  113. package/es/components/molecules/RichMenu/RichMenuBlock/RichMenuBlock.js +49 -0
  114. package/es/components/molecules/RichMenu/RichMenuBlock/RichMenuCell/index.d.ts +10 -0
  115. package/es/components/molecules/RichMenu/RichMenuBlock/RichMenuCell/index.js +47 -0
  116. package/es/components/molecules/RichMenu/RichMenuBlock/RichMenuCell/styled.d.ts +8 -0
  117. package/es/components/molecules/RichMenu/RichMenuBlock/RichMenuCell/styled.js +36 -0
  118. package/es/components/molecules/RichMenu/RichMenuBlock/constants.d.ts +2 -0
  119. package/es/components/molecules/RichMenu/RichMenuBlock/constants.js +765 -0
  120. package/es/components/molecules/RichMenu/RichMenuBlock/index.d.ts +3 -0
  121. package/es/components/molecules/RichMenu/RichMenuBlock/index.js +2 -0
  122. package/es/components/molecules/RichMenu/RichMenuBlock/styled.d.ts +9 -0
  123. package/es/components/molecules/RichMenu/RichMenuBlock/styled.js +17 -0
  124. package/es/components/molecules/RichMenu/RichMenuChatBar/RichMenuChatBar.d.ts +10 -0
  125. package/es/components/molecules/RichMenu/RichMenuChatBar/RichMenuChatBar.js +32 -0
  126. package/es/components/molecules/RichMenu/RichMenuChatBar/TypingChat/index.d.ts +6 -0
  127. package/es/components/molecules/RichMenu/RichMenuChatBar/TypingChat/index.js +15 -0
  128. package/es/components/molecules/RichMenu/RichMenuChatBar/TypingChat/styled.d.ts +4 -0
  129. package/es/components/molecules/RichMenu/RichMenuChatBar/TypingChat/styled.js +47 -0
  130. package/es/components/molecules/RichMenu/RichMenuChatBar/index.d.ts +2 -0
  131. package/es/components/molecules/RichMenu/RichMenuChatBar/index.js +1 -0
  132. package/es/components/molecules/RichMenu/RichMenuChatBar/styled.d.ts +9 -0
  133. package/es/components/molecules/RichMenu/RichMenuChatBar/styled.js +37 -0
  134. package/es/components/molecules/RichMenu/RichMenuMobileView/RichMenuMobileView.d.ts +10 -0
  135. package/es/components/molecules/RichMenu/RichMenuMobileView/RichMenuMobileView.js +37 -0
  136. package/es/components/molecules/RichMenu/RichMenuMobileView/index.d.ts +1 -0
  137. package/es/components/molecules/RichMenu/RichMenuMobileView/index.js +1 -0
  138. package/es/components/molecules/RichMenu/RichMenuMobileView/styled.d.ts +6 -0
  139. package/es/components/molecules/RichMenu/RichMenuMobileView/styled.js +20 -0
  140. package/es/components/molecules/RichMenu/index.d.ts +3 -0
  141. package/es/components/molecules/RichMenu/index.js +3 -0
  142. package/es/components/molecules/Select/Select.d.ts +4 -2
  143. package/es/components/molecules/Select/Test.d.ts +2 -1
  144. package/es/components/molecules/TreeSelect/TreeSelect.d.ts +4 -2
  145. package/es/components/molecules/UploadImage/MediaIcon.d.ts +2 -1
  146. package/es/components/molecules/index.d.ts +6 -0
  147. package/es/components/molecules/index.js +4 -0
  148. package/es/components/organism/Help/styled.d.ts +6 -2
  149. package/es/constants/index.d.ts +1 -0
  150. package/es/constants/index.js +1 -0
  151. package/es/constants/richMenu.d.ts +19 -0
  152. package/es/constants/richMenu.js +19 -0
  153. package/es/constants/storybook.d.ts +2 -1
  154. package/es/constants/theme.js +13 -2
  155. package/es/hooks/useDeepCompareEffect.d.ts +1 -0
  156. package/es/hooks/useDeepCompareEffect.js +21 -0
  157. package/es/locales/en/translation.json +3 -1
  158. package/es/locales/i18n.d.ts +3 -0
  159. package/es/locales/translations.d.ts +2 -0
  160. package/es/locales/vi/translation.json +2 -1
  161. package/es/test.d.ts +2 -1
  162. package/es/test.js +164 -66
  163. package/es/types/index.d.ts +12 -0
  164. package/es/types/index.js +2 -1
  165. package/es/types/richMenu.d.ts +191 -0
  166. package/es/types/richMenu.js +1 -0
  167. package/es/types/variables.d.ts +2 -0
  168. package/es/types/variables.js +1 -0
  169. package/es/utils/common.d.ts +2 -0
  170. package/es/utils/common.js +16 -0
  171. package/es/utils/handleError.d.ts +32 -2
  172. package/es/utils/handleError.js +42 -4
  173. package/package.json +9 -5
  174. package/dist/0173b5993573afa04880.woff +0 -0
  175. package/dist/0dfb9214dfd945cd7290.png +0 -1
  176. package/dist/2883cad25a2b4e87ce5f.eot +0 -0
  177. package/dist/4f54a37971347e3d7122.png +0 -1
  178. package/dist/574b7bee0563a9fe9a29.png +0 -1
  179. package/dist/6b586356e837581204dc.svg +0 -1
  180. package/dist/72eec5c1c786b45a667f.ttf +0 -0
  181. package/dist/bc6bf11c6f5e6743aa4c.png +0 -1
  182. package/dist/dbc405edd6e0806efbc9.svg +0 -1
  183. package/dist/e32f09119052a55cce3c.png +0 -1
  184. package/dist/e3851b9384a984c6fdb5.png +0 -1
  185. package/dist/index.js +0 -2
  186. package/dist/index.js.LICENSE.txt +0 -69
  187. package/dist/main.css +0 -69
  188. package/dist/public/icons/2d496b55d85a9545d7311c073af442bb.png +0 -0
  189. package/dist/public/icons/2fbb4e0927d18e3f8e5c6511ab88d5b3.png +0 -0
  190. package/dist/public/icons/725a52bd91a3ce534b10833df510e5fa.png +0 -0
  191. package/dist/public/icons/7d037e0b378e87a82804443636cd0e13.svg +0 -346
  192. package/dist/public/icons/90553767e0a05b9585a54797cfd9ce51.png +0 -0
  193. package/dist/public/icons/bb64e23a1ff390a416d765ee556096ab.svg +0 -87
  194. package/dist/public/icons/d327b24e9c5d8f486f08d253aab58ce6.png +0 -0
  195. package/dist/public/icons/f1cf266d0a0a53ce07f2dbb859869b7a.png +0 -0
  196. package/dist/public/icons/placeholder-image.png +0 -0
  197. package/dist/public/icons/transparent.svg +0 -1
Binary file
@@ -8,6 +8,9 @@ export interface InputProps extends AntdInputProps {
8
8
  onAfterChange?: (value: any) => void;
9
9
  errorArchive?: string;
10
10
  required?: boolean;
11
+ isReverseMask?: boolean;
12
+ labelColor?: string;
13
+ isHideErrMessage?: boolean;
11
14
  focused?: boolean;
12
15
  errorMsg?: string;
13
16
  disableUndo?: boolean;
@@ -24,7 +24,7 @@ import { StyledInput } from './styled';
24
24
  const PATH = '@antscorp/antsomi-ui/es/components/atoms/Input/Input.tsx';
25
25
  const OriginInput = props => {
26
26
  // Props
27
- const { debounce, errorArchive, required, focused, label, onAfterChange, onChange, errorMsg } = props, restProps = __rest(props, ["debounce", "errorArchive", "required", "focused", "label", "onAfterChange", "onChange", "errorMsg"]);
27
+ const { debounce, errorArchive, required, labelColor, isReverseMask, isHideErrMessage, focused, label, onAfterChange, onChange, errorMsg } = props, restProps = __rest(props, ["debounce", "errorArchive", "required", "labelColor", "isReverseMask", "isHideErrMessage", "focused", "label", "onAfterChange", "onChange", "errorMsg"]);
28
28
  // State
29
29
  const [value, setValue] = useState(props.value);
30
30
  const [isFocused, setFocused] = useState(false);
@@ -68,7 +68,7 @@ const OriginInput = props => {
68
68
  };
69
69
  const renderRequiredLabel = (label) => {
70
70
  if (required) {
71
- return (React.createElement(RequiredLabel, { color: "#666666", style: { marginBottom: 5 } }, label));
71
+ return (React.createElement(RequiredLabel, { isReverseMask: isReverseMask, color: labelColor || '#666666', style: { marginBottom: 5 } }, label));
72
72
  }
73
73
  return (React.createElement(Text, { color: "#666666", style: { marginBottom: 5 } }, label));
74
74
  };
@@ -84,10 +84,11 @@ const OriginInput = props => {
84
84
  }
85
85
  restProps.onBlur && restProps.onBlur(e);
86
86
  }, onChange: onChangeInput }, getPreventKeyboardAction(listDisableActions))),
87
- restProps.status === 'error' || errorArchive || requiredMsg ? (React.createElement(Text, { color: "#ff4d4f", style: { marginLeft: 8, marginTop: 5 } }, errorMsg || errorArchive || requiredMsg)) : null));
87
+ (restProps.status === 'error' || errorArchive || requiredMsg) && !isHideErrMessage ? (React.createElement(Text, { color: "#ff4d4f", style: { marginLeft: 8, marginTop: 5 } }, errorMsg || errorArchive || requiredMsg)) : null));
88
88
  };
89
89
  OriginInput.defaultProps = {
90
90
  debounce: 400,
91
+ isHideErrMessage: false,
91
92
  };
92
93
  export const Input = OriginInput;
93
94
  Input.TextArea = StyledInput.TextArea;
@@ -0,0 +1,2 @@
1
+ declare const EditCaretPositioning: any;
2
+ export default EditCaretPositioning;
@@ -0,0 +1,89 @@
1
+ /* eslint-disable no-cond-assign */
2
+ /* eslint-disable no-plusplus */
3
+ /* eslint-disable one-var */
4
+ /* eslint-disable func-names */
5
+ /* eslint-disable object-shorthand */
6
+ /* eslint-disable prefer-const */
7
+ const EditCaretPositioning = {};
8
+ if (window.getSelection && document.createRange) {
9
+ // saves caret position(s)
10
+ EditCaretPositioning.saveSelection = function (containerEl) {
11
+ var _a;
12
+ try {
13
+ let range = (_a = window === null || window === void 0 ? void 0 : window.getSelection()) === null || _a === void 0 ? void 0 : _a.getRangeAt(0);
14
+ let preSelectionRange = range === null || range === void 0 ? void 0 : range.cloneRange();
15
+ preSelectionRange === null || preSelectionRange === void 0 ? void 0 : preSelectionRange.selectNodeContents(containerEl);
16
+ preSelectionRange === null || preSelectionRange === void 0 ? void 0 : preSelectionRange.setEnd(range === null || range === void 0 ? void 0 : range.startContainer, range === null || range === void 0 ? void 0 : range.startOffset);
17
+ let start = preSelectionRange === null || preSelectionRange === void 0 ? void 0 : preSelectionRange.toString().length;
18
+ return {
19
+ start: start,
20
+ end: start + (range === null || range === void 0 ? void 0 : range.toString().length),
21
+ };
22
+ }
23
+ catch (e) {
24
+ // eslint-disable-next-line no-console
25
+ console.log('err:>', e);
26
+ }
27
+ return {
28
+ start: 0,
29
+ end: 0,
30
+ };
31
+ };
32
+ // restores caret position(s)
33
+ EditCaretPositioning.restoreSelection = function (containerEl, savedSel) {
34
+ let charIndex = 0, range = document.createRange();
35
+ range.setStart(containerEl, 0);
36
+ range.collapse(true);
37
+ let nodeStack = [containerEl], node, foundStart = false, stop = false;
38
+ while (!stop && (node = nodeStack.pop())) {
39
+ if (node.nodeType === 3) {
40
+ let nextCharIndex = charIndex + node.length;
41
+ if (!foundStart &&
42
+ savedSel &&
43
+ savedSel.start >= charIndex &&
44
+ savedSel.start <= nextCharIndex) {
45
+ range.setStart(node, savedSel.start - charIndex);
46
+ foundStart = true;
47
+ }
48
+ if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {
49
+ range.setEnd(node, savedSel.end - charIndex);
50
+ stop = true;
51
+ }
52
+ charIndex = nextCharIndex;
53
+ }
54
+ else {
55
+ let i = node.childNodes.length;
56
+ while (i--) {
57
+ nodeStack.push(node.childNodes[i]);
58
+ }
59
+ }
60
+ }
61
+ let sel = window.getSelection();
62
+ sel === null || sel === void 0 ? void 0 : sel.removeAllRanges();
63
+ sel === null || sel === void 0 ? void 0 : sel.addRange(range);
64
+ };
65
+ }
66
+ else if (document.selection && document.body.createTextRange) {
67
+ // saves caret position(s)
68
+ EditCaretPositioning.saveSelection = function (containerEl) {
69
+ let selectedTextRange = document.selection.createRange();
70
+ let preSelectionTextRange = document.body.createTextRange();
71
+ preSelectionTextRange.moveToElementText(containerEl);
72
+ preSelectionTextRange.setEndPoint('EndToStart', selectedTextRange);
73
+ let start = preSelectionTextRange.text.length;
74
+ return {
75
+ start: start,
76
+ end: start + selectedTextRange.text.length,
77
+ };
78
+ };
79
+ // restores caret position(s)
80
+ EditCaretPositioning.restoreSelection = function (containerEl, savedSel) {
81
+ let textRange = document.body.createTextRange();
82
+ textRange.moveToElementText(containerEl);
83
+ textRange.collapse(true);
84
+ textRange.moveEnd('character', savedSel.end);
85
+ textRange.moveStart('character', savedSel.start);
86
+ textRange.select();
87
+ };
88
+ }
89
+ export default EditCaretPositioning;
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import { DisableShortLinkTypeProps } from './PopupShortLink';
3
+ export type KeyTagType = 'shortlink' | 'shortlink_static';
4
+ export type SelectedPropertiesProps = {
5
+ keyTag: KeyTagType;
6
+ link: string;
7
+ urlDetected: string;
8
+ };
9
+ export type InputDynamicProps = {
10
+ value: string;
11
+ isViewMode?: boolean;
12
+ errors?: string[];
13
+ disabledOpts?: DisableShortLinkTypeProps;
14
+ canMultipleLine?: boolean;
15
+ onError?: Function;
16
+ onChange: (valueOut: string) => any;
17
+ addMessageToQueue?: Function;
18
+ };
19
+ export declare const InputDynamic: {
20
+ (props: InputDynamicProps): React.JSX.Element;
21
+ defaultProps: {
22
+ value: string;
23
+ isViewMode: boolean;
24
+ errors: never[];
25
+ canMultipleLine: boolean;
26
+ onError: () => void;
27
+ onChange: () => void;
28
+ addMessageToQueue: () => void;
29
+ };
30
+ };
@@ -0,0 +1,320 @@
1
+ // Libraries
2
+ import React, { useState, useLayoutEffect, useEffect, useRef, useCallback, } from 'react';
3
+ import classnames from 'classnames';
4
+ // Components
5
+ import CaretPositioning from './EditCaretPositioning';
6
+ import { WrapperInputStyle, TooltipHover } from './styled';
7
+ import { PopupShortLink } from './PopupShortLink';
8
+ import Icon from '@antscorp/icons';
9
+ // Utils
10
+ import { getObjectPropSafely, random, safeParse } from '@antscorp/antsomi-ui/es/utils';
11
+ import { convertBreakTag, convertDivToBreakTag, convertHtmlText, genShortLinkValue, getInsertLinkPatternWithAppendSpaceEnd, handleUpdateInputPersonalization, initialValue, pasteHtmlAtCaret, removeHtmlTag, spacingNonTracking, validateHTMLTags, } from './utils';
12
+ // Hooks
13
+ import { useDebounce } from '@antscorp/antsomi-ui/es/hooks/useDebounce';
14
+ const PATH = 'src/components/atoms/InputDynamic/InputDynamic.tsx';
15
+ const defaultProps = {
16
+ value: '',
17
+ isViewMode: false,
18
+ errors: [],
19
+ canMultipleLine: false,
20
+ onError: () => { },
21
+ onChange: () => { },
22
+ addMessageToQueue: () => { },
23
+ };
24
+ export const InputDynamic = (props) => {
25
+ const { value, isViewMode, errors, disabledOpts, canMultipleLine, onError, onChange, addMessageToQueue, } = props;
26
+ // States
27
+ const [textValue, setTextValue] = useState(initialValue(value));
28
+ const [initSelectedProperties, setInitSelectedProperties] = useState({
29
+ keyTag: 'shortlink_static',
30
+ link: '',
31
+ urlDetected: '',
32
+ });
33
+ const [popoverOpenShortLink, setPopoverOpenShortLink] = useState(false);
34
+ const [tooltipHoverDebounce, _tooltipHover, setTooltipHover] = useDebounce({ x: 0, y: 0 }, 200);
35
+ // Refs
36
+ const caretPositionRef = useRef(null);
37
+ const personalizationInputRef = useRef(null);
38
+ const onTriggerChange = (event = null) => {
39
+ var _a;
40
+ try {
41
+ let tmp = (_a = personalizationInputRef.current) === null || _a === void 0 ? void 0 : _a.innerHTML;
42
+ if (event !== null) {
43
+ caretPositionRef.current = CaretPositioning.saveSelection(event.currentTarget);
44
+ tmp = event.currentTarget.innerHTML;
45
+ }
46
+ tmp = tmp === null || tmp === void 0 ? void 0 : tmp.replace(
47
+ // replace old non tracking url to detect url
48
+ /<button(?=[^>]*class="insert-word")[^>]*value=['"]#(?:{nontrackurl\()?(https?:\/\/[0-9a-zA-Z-{}|"\./?_=&%:#*@;]+)(?:\)})?['"][^>]*>.*?<\/button>/g, match => {
49
+ const url = match.match(/(https?:\/\/[0-9a-zA-Z-\./?_=&%:#*@;]+)/);
50
+ if (url) {
51
+ return `<span id="${random(5)}" class="detect-url">${url[1]}</span>`;
52
+ }
53
+ return match; // If no match found, return the original string
54
+ }).replace(
55
+ // replace url to detect url
56
+ /((?<!class="detect-url">|#{shortlink(?:_static)?\(|<span style="line-height: 20px;margin-right: 8px;pointer-events:none;">)\bhttps*:\/\/[0-9a-zA-Z-{}|"\./?_=&%:#*@;]+)/g, match => `<span id="${random(5)}" class="detect-url">${match}</span>`);
57
+ tmp = convertDivToBreakTag(tmp);
58
+ setTextValue(tmp);
59
+ const text = convertHtmlText(tmp, 'raw', {}, {}, 'input', 'add');
60
+ const textConverted = convertBreakTag(text);
61
+ onChange(removeHtmlTag(textConverted));
62
+ }
63
+ catch (error) {
64
+ if (typeof addMessageToQueue === 'function') {
65
+ addMessageToQueue({
66
+ path: 'app/containers/UIDev/UIEditorPersonalization/Input/index.jsx',
67
+ func: 'onTriggerChange',
68
+ data: error,
69
+ });
70
+ }
71
+ // eslint-disable-next-line no-console
72
+ console.error(error);
73
+ }
74
+ };
75
+ const callback = (type, data) => {
76
+ var _a, _b;
77
+ switch (type) {
78
+ case 'REPLACE_DETECTED_URL': {
79
+ const innerHTML = getObjectPropSafely(() => { var _a; return (_a = personalizationInputRef.current) === null || _a === void 0 ? void 0 : _a.innerHTML; }, '');
80
+ if (innerHTML) {
81
+ // remove span url và focus vào vị trí remove để add tag shortlink vào vị trí này.
82
+ const index = Array.from((_a = personalizationInputRef.current) === null || _a === void 0 ? void 0 : _a.childNodes).findIndex((element) => element.id === data.id);
83
+ const range = document.createRange(); // Tạo một đối tượng Range
84
+ const sel = window.getSelection(); // Lấy đối tượng Selection hiện tại
85
+ range.setStart((_b = personalizationInputRef.current) === null || _b === void 0 ? void 0 : _b.childNodes[index], 0); // Đặt điểm bắt đầu của Range
86
+ range.collapse(true); // Thu gọn Range để tập trung vào điểm bắt đầu
87
+ sel === null || sel === void 0 ? void 0 : sel.removeAllRanges(); // Xóa tất cả các Range hiện có
88
+ sel === null || sel === void 0 ? void 0 : sel.addRange(range); // Thêm Range mới vào Selection
89
+ caretPositionRef.current = CaretPositioning.saveSelection(personalizationInputRef.current);
90
+ const newDataUpdate = innerHTML.replace(data.outerHTML, '');
91
+ personalizationInputRef.current.innerHTML = newDataUpdate;
92
+ }
93
+ break;
94
+ }
95
+ default:
96
+ break;
97
+ }
98
+ };
99
+ const onPaste = (e) => {
100
+ // cancel paste
101
+ e.preventDefault();
102
+ // get text representation of clipboard
103
+ const text = (e.originalEvent || e).clipboardData.getData('text/plain');
104
+ // insert text manually
105
+ document.execCommand('insertHTML', false, text);
106
+ };
107
+ const handleInsertSortLink = (url, type) => {
108
+ try {
109
+ const { id, value: linkValue, label: linkLabel } = genShortLinkValue(url, type);
110
+ setPopoverOpenShortLink(false);
111
+ if (personalizationInputRef.current instanceof HTMLElement) {
112
+ CaretPositioning.restoreSelection(personalizationInputRef.current, caretPositionRef.current);
113
+ pasteHtmlAtCaret(getInsertLinkPatternWithAppendSpaceEnd(id, linkValue, linkLabel), null);
114
+ onTriggerChange();
115
+ caretPositionRef.current = CaretPositioning.saveSelection(personalizationInputRef.current);
116
+ }
117
+ setInitSelectedProperties({ link: '', keyTag: 'shortlink_static', urlDetected: '' });
118
+ }
119
+ catch (err) {
120
+ if (typeof addMessageToQueue === 'function') {
121
+ addMessageToQueue({
122
+ path: 'app/containers/UIDev/UIEditorPersonalization/Input/index.jsx',
123
+ func: 'handleInsertText',
124
+ data: err,
125
+ });
126
+ }
127
+ }
128
+ };
129
+ const handleKeyPress = (e) => {
130
+ if (canMultipleLine)
131
+ return;
132
+ if (+e.charCode === 13) {
133
+ e.preventDefault();
134
+ }
135
+ };
136
+ const getDangerouslySetInnerHTML = (text) => {
137
+ if (text) {
138
+ const regex = /<[^<>]+>/g;
139
+ let tag;
140
+ // eslint-disable-next-line no-cond-assign
141
+ while ((tag = regex.exec(text))) {
142
+ if (!validateHTMLTags.isValidTag(tag[0])) {
143
+ const finalTag = tag[0].replace('<', '&#60').replace('>', '&#62');
144
+ text = text.replace(tag[0], finalTag);
145
+ }
146
+ }
147
+ text = text.replaceAll('\n', '<br>');
148
+ if (spacingNonTracking(text)) {
149
+ return text;
150
+ }
151
+ return safeParse(text, '').concat('<br />');
152
+ }
153
+ return '';
154
+ };
155
+ const toggleShortLinkModal = useCallback(() => {
156
+ setPopoverOpenShortLink(!popoverOpenShortLink);
157
+ }, [popoverOpenShortLink]);
158
+ /**
159
+ * [NOTE:open shortlink modal to edit]
160
+ */
161
+ useEffect(() => {
162
+ const handleClickTag = (e) => {
163
+ try {
164
+ e.stopPropagation();
165
+ if (e.target) {
166
+ const { value = '' } = e.target;
167
+ const shortLink = value.replace(/#|{|}|/g, '').split('(');
168
+ if (shortLink && shortLink.length >= 2) {
169
+ const link = shortLink[1].substring(0, shortLink[1].length - 1) || '';
170
+ setInitSelectedProperties(prev => (Object.assign(Object.assign({}, prev), { link, keyTag: shortLink[0], urlDetected: e.currentTarget })));
171
+ toggleShortLinkModal();
172
+ }
173
+ }
174
+ }
175
+ catch (err) {
176
+ // eslint-disable-next-line no-console
177
+ console.log('err', err);
178
+ }
179
+ };
180
+ const listTags = Array.from(document.querySelectorAll('#ants-ui-input-personalization .input-personal .insert-word'));
181
+ if (listTags && listTags.length > 0) {
182
+ listTags.forEach((tag) => {
183
+ tag.addEventListener('click', handleClickTag);
184
+ });
185
+ }
186
+ return () => {
187
+ listTags.forEach((tag) => {
188
+ tag.removeEventListener('click', handleClickTag);
189
+ });
190
+ };
191
+ }, [textValue, toggleShortLinkModal]);
192
+ /** Anchor tooltip */
193
+ useEffect(() => {
194
+ let listElement = [];
195
+ const handleMouseOver = (e, targetRect) => {
196
+ e === null || e === void 0 ? void 0 : e.stopPropagation();
197
+ const viewportTop = window.pageYOffset;
198
+ const viewportLeft = window.pageXOffset;
199
+ const offsetWidth = targetRect.width / 2;
200
+ const offsetHeight = targetRect.height / 2;
201
+ const tooltipHeight = 16;
202
+ const x = targetRect.left - viewportLeft + offsetWidth;
203
+ const y = targetRect.top - viewportTop - offsetHeight - tooltipHeight;
204
+ setTooltipHover({
205
+ x,
206
+ y,
207
+ });
208
+ };
209
+ const handleMouseOut = (e) => {
210
+ e === null || e === void 0 ? void 0 : e.stopPropagation();
211
+ setTooltipHover({ x: 0, y: 0 });
212
+ };
213
+ const handleClickDetectUrl = (e) => {
214
+ e === null || e === void 0 ? void 0 : e.stopPropagation();
215
+ setInitSelectedProperties(prev => {
216
+ var _a;
217
+ return (Object.assign(Object.assign({}, prev), { link: ((_a = e === null || e === void 0 ? void 0 : e.currentTarget) === null || _a === void 0 ? void 0 : _a.textContent) || '', urlDetected: e === null || e === void 0 ? void 0 : e.currentTarget }));
218
+ });
219
+ toggleShortLinkModal();
220
+ };
221
+ if (!isViewMode) {
222
+ const elements = document.querySelectorAll('#ants-ui-input-personalization .detect-url');
223
+ listElement = Array.from(elements);
224
+ if (listElement.length) {
225
+ listElement.forEach((element) => {
226
+ element.addEventListener('mouseover', e => handleMouseOver(e, element.getBoundingClientRect()));
227
+ element.addEventListener('mouseout', handleMouseOut);
228
+ /** Open shortlink modal */
229
+ element.addEventListener('click', handleClickDetectUrl);
230
+ });
231
+ }
232
+ }
233
+ return () => {
234
+ listElement.forEach((element) => {
235
+ element.removeEventListener('mouseover', handleMouseOver);
236
+ element.removeEventListener('mouseout', handleMouseOut);
237
+ });
238
+ };
239
+ }, [textValue, isViewMode, setTooltipHover, toggleShortLinkModal]);
240
+ /** Style & remove for tag shortlink button & icon remove */
241
+ useLayoutEffect(() => {
242
+ // get button Els [x] to create hover and style it
243
+ const iconRemoveEls = document.querySelectorAll('.editor-icon-remove');
244
+ const listIconRemove = iconRemoveEls && Array.from(iconRemoveEls);
245
+ // get button elements
246
+ const buttonElement = document.querySelectorAll('.insert-word');
247
+ const listBtnElement = buttonElement && Array.from(buttonElement);
248
+ const handleRemoveTag = (e) => {
249
+ var _a, _b, _c, _d, _e;
250
+ if (e && ((_a = e.target) === null || _a === void 0 ? void 0 : _a.nodeName) === 'EM' && ((_b = e.target) === null || _b === void 0 ? void 0 : _b.className) === 'editor-icon-remove') {
251
+ e.stopPropagation();
252
+ (_d = (_c = e.target) === null || _c === void 0 ? void 0 : _c.parentElement) === null || _d === void 0 ? void 0 : _d.remove();
253
+ setTextValue(personalizationInputRef && ((_e = personalizationInputRef.current) === null || _e === void 0 ? void 0 : _e.innerHTML));
254
+ }
255
+ };
256
+ listIconRemove.forEach(eachIcon => {
257
+ eachIcon.addEventListener('click', handleRemoveTag);
258
+ });
259
+ handleUpdateInputPersonalization(listIconRemove, listBtnElement);
260
+ return () => {
261
+ listIconRemove.forEach(eachIcon => {
262
+ eachIcon.removeEventListener('click', handleRemoveTag);
263
+ });
264
+ };
265
+ }, [textValue]);
266
+ useLayoutEffect(() => {
267
+ try {
268
+ // save caret position
269
+ if (!personalizationInputRef.current) {
270
+ return;
271
+ }
272
+ // Perhaps React (whose VDOM gets outdated because we often prevent
273
+ // rerendering) did not update the DOM. So we update it manually now.
274
+ if (caretPositionRef && caretPositionRef.current) {
275
+ CaretPositioning.restoreSelection(personalizationInputRef.current, caretPositionRef.current);
276
+ }
277
+ }
278
+ catch (error) {
279
+ if (typeof addMessageToQueue === 'function') {
280
+ addMessageToQueue({
281
+ path: PATH,
282
+ func: 'useLayoutEffect',
283
+ data: error,
284
+ });
285
+ }
286
+ if (typeof onError === 'function') {
287
+ onError(error, {
288
+ component: PATH,
289
+ action: 'useLayoutEffect saved caret position',
290
+ args: {},
291
+ });
292
+ }
293
+ }
294
+ }, [addMessageToQueue, onError, textValue]);
295
+ return (React.createElement(WrapperInputStyle, { id: "ants-ui-input-personalization" },
296
+ React.createElement("div", { className: classnames({
297
+ 'input-wrapper-outter': true,
298
+ 'styles-input-wrapper': !isViewMode,
299
+ 'input-error': (errors === null || errors === void 0 ? void 0 : errors.length) && (errors === null || errors === void 0 ? void 0 : errors.length) > 0,
300
+ }), style: Object.assign(Object.assign({}, (isViewMode && {
301
+ padding: 0,
302
+ minHeight: 0,
303
+ fontSize: 12,
304
+ border: 'none',
305
+ })), { width: '100%' }), onClick: () => { var _a; return (_a = personalizationInputRef.current) === null || _a === void 0 ? void 0 : _a.focus(); } },
306
+ React.createElement("div", { className: "input-personal", style: {
307
+ display: textValue && textValue !== '<br>' ? 'inline-block' : undefined,
308
+ }, contentEditable: !isViewMode, onBlur: onTriggerChange, onKeyPress: handleKeyPress, ref: personalizationInputRef,
309
+ // eslint-disable-next-line react/no-danger
310
+ dangerouslySetInnerHTML: {
311
+ __html: getDangerouslySetInnerHTML(textValue),
312
+ }, onPaste: onPaste }),
313
+ React.createElement(Icon, { type: "icon-ants-search-2", onClick: e => {
314
+ e.stopPropagation();
315
+ toggleShortLinkModal();
316
+ }, className: "customize-antsomi-profile", style: { width: 24, height: 24 } })),
317
+ React.createElement(TooltipHover, { isShow: tooltipHoverDebounce.x > 0 && tooltipHoverDebounce.y > 0, top: tooltipHoverDebounce.y, left: tooltipHoverDebounce.x }, "Click on the link to convert it to a shortlink"),
318
+ popoverOpenShortLink && (React.createElement(PopupShortLink, { open: popoverOpenShortLink, disabledOpts: disabledOpts, onOk: handleInsertSortLink, onClose: toggleShortLinkModal, initSelectedProperties: initSelectedProperties, callback: callback }))));
319
+ };
320
+ InputDynamic.defaultProps = defaultProps;
@@ -0,0 +1,16 @@
1
+ import { FC } from 'react';
2
+ import type { SelectedPropertiesProps } from './InputDynamic';
3
+ type PopupShortLinkProps = {
4
+ open: any;
5
+ onClose: Function;
6
+ onOk: Function;
7
+ disabledOpts?: DisableShortLinkTypeProps;
8
+ initSelectedProperties: SelectedPropertiesProps;
9
+ callback: Function;
10
+ };
11
+ export type ShortLinkType = 'individual' | 'general';
12
+ export type DisableShortLinkTypeProps = {
13
+ [key in ShortLinkType]?: boolean;
14
+ };
15
+ export declare const PopupShortLink: FC<PopupShortLinkProps>;
16
+ export {};
@@ -0,0 +1,98 @@
1
+ // Libraries
2
+ import React, { useEffect } from 'react';
3
+ import { Col, Row } from 'antd';
4
+ import { useImmer } from 'use-immer';
5
+ // Molecules
6
+ import { Modal } from '../../molecules';
7
+ // Components
8
+ import { Radio } from '../Radio';
9
+ // Styled
10
+ import { InputShortLink, InputWrapper } from './styled';
11
+ // Utils
12
+ import { validateURL } from './utils';
13
+ const OPTIONS = [
14
+ {
15
+ value: 'individual',
16
+ label: 'Individual',
17
+ },
18
+ {
19
+ value: 'general',
20
+ label: 'General',
21
+ },
22
+ ];
23
+ export const PopupShortLink = props => {
24
+ const { open, onClose, onOk, disabledOpts, initSelectedProperties, callback } = props;
25
+ const [state, setState] = useImmer({
26
+ link: '',
27
+ type: 'individual',
28
+ error: '',
29
+ });
30
+ useEffect(() => {
31
+ let type = 'individual';
32
+ if (initSelectedProperties && initSelectedProperties.keyTag) {
33
+ type = initSelectedProperties.keyTag === 'shortlink' ? 'individual' : 'general';
34
+ }
35
+ setState(draft => {
36
+ draft.link = initSelectedProperties.link;
37
+ draft.type = type;
38
+ });
39
+ }, [initSelectedProperties, setState]);
40
+ const handleClose = () => {
41
+ setState(draft => {
42
+ draft.link = '';
43
+ draft.error = '';
44
+ });
45
+ if (onClose)
46
+ onClose();
47
+ };
48
+ const handleValidate = ({ urlString = state.link, afterValidate }) => {
49
+ const isValid = validateURL(urlString);
50
+ setState(draft => {
51
+ draft.error = isValid ? '' : 'Invalid URL';
52
+ });
53
+ if (typeof afterValidate === 'function')
54
+ afterValidate(isValid);
55
+ };
56
+ const handleOnChange = (value) => {
57
+ if (state.error)
58
+ handleValidate({ urlString: value });
59
+ setState(draft => {
60
+ draft.link = value;
61
+ });
62
+ };
63
+ const handleOnOK = () => {
64
+ handleValidate({
65
+ afterValidate: (isValid) => {
66
+ if (isValid && onOk) {
67
+ if (initSelectedProperties.urlDetected) {
68
+ callback('REPLACE_DETECTED_URL', initSelectedProperties.urlDetected);
69
+ }
70
+ onOk(state.link, state.type);
71
+ handleClose();
72
+ }
73
+ },
74
+ });
75
+ };
76
+ const onChangeType = (event) => {
77
+ setState(draft => {
78
+ draft.type = event.target.value;
79
+ });
80
+ };
81
+ return (React.createElement(Modal, { open: open, onCancel: handleClose, title: React.createElement("div", { style: { color: 'rgba(0, 0, 0, 0.87)', fontWeight: 'normal', fontSize: '16px' } }, "Add Short Link"), okText: "OK", cancelText: "Cancel", closable: false, onOk: handleOnOK, okButtonProps: {
82
+ disabled: !validateURL(state.link),
83
+ type: !validateURL(state.link) ? 'default' : 'primary',
84
+ } },
85
+ React.createElement(Row, null,
86
+ React.createElement(Col, { span: 6 },
87
+ React.createElement("span", { style: { fontSize: 12, color: '#000' } }, "Short link type")),
88
+ React.createElement(Col, { span: 18 },
89
+ React.createElement(Radio.Group, { onChange: onChangeType, value: state.type }, OPTIONS.map(each => (React.createElement(Radio, { key: each.value, disabled: disabledOpts && disabledOpts[each.value], name: "shortlink-type", value: each.value }, each.label)))))),
90
+ React.createElement(Row, null,
91
+ React.createElement(Col, { span: 24 },
92
+ React.createElement(InputWrapper, null,
93
+ React.createElement(InputShortLink, { required: true, isReverseMask: true, isHideErrMessage: true, labelColor: "#000000", id: "input-short-link-url", label: "Your URL", value: state.link, onAfterChange: handleOnChange })))),
94
+ !!state.error && (React.createElement(Row, null,
95
+ React.createElement(Col, { span: 6 }),
96
+ React.createElement(Col, { span: 18 },
97
+ React.createElement("div", null, state.error))))));
98
+ };
@@ -0,0 +1,2 @@
1
+ export { InputDynamic } from './InputDynamic';
2
+ export type { InputDynamicProps } from './InputDynamic';
@@ -0,0 +1 @@
1
+ export { InputDynamic } from './InputDynamic';
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ export declare const WrapperInputStyle: import("styled-components").StyledComponent<"div", any, {}, never>;
3
+ export declare const SpanIcon: import("styled-components").StyledComponent<"span", any, {
4
+ isDisabled?: boolean | undefined;
5
+ }, never>;
6
+ export declare const InputWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
7
+ export declare const InputShortLink: import("styled-components").StyledComponent<import("react").ComponentType<any> | keyof import("react").JSX.IntrinsicElements, any, import("../Input/Input").InputProps, any>;
8
+ export declare const TooltipHover: import("styled-components").StyledComponent<"div", any, {
9
+ top: number;
10
+ left: number;
11
+ isShow: boolean;
12
+ }, never>;