@redneckz/wildless-cms-uni-blocks 0.14.575 → 0.14.576

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 (213) hide show
  1. package/bundle/api/LeadServiceAPI.d.ts +0 -12
  2. package/bundle/api/dadataHints/dadataHints.d.ts +2 -0
  3. package/bundle/api/dadataHints/dadataHintsType.d.ts +27 -0
  4. package/bundle/api/dadataHints/hintsListsOptions.d.ts +33 -0
  5. package/bundle/blocks.schema.json +1 -1
  6. package/bundle/bundle.umd.js +151 -38
  7. package/bundle/bundle.umd.min.js +1 -1
  8. package/bundle/components/ApplicationForm/ApplicationFormContent.d.ts +1 -0
  9. package/bundle/components/ApplicationLeadForm/ApplicationLeadFormContent.d.ts +1 -0
  10. package/bundle/index.d.ts +0 -1
  11. package/bundle/ui-kit/FormField/Fields/EmailField.d.ts +2 -0
  12. package/bundle/ui-kit/Input/InputPopup.d.ts +7 -0
  13. package/bundle/ui-kit/Input/InputProps.d.ts +1 -0
  14. package/bundle/ui-kit/Input/useInputPopup.d.ts +10 -0
  15. package/dist/api/LeadServiceAPI.d.ts +0 -12
  16. package/dist/api/LeadServiceAPI.js.map +1 -1
  17. package/dist/api/dadataHints/dadataHints.d.ts +2 -0
  18. package/dist/api/dadataHints/dadataHints.js +30 -0
  19. package/dist/api/dadataHints/dadataHints.js.map +1 -0
  20. package/dist/api/dadataHints/dadataHintsType.d.ts +27 -0
  21. package/dist/api/dadataHints/dadataHintsType.js +2 -0
  22. package/dist/api/dadataHints/dadataHintsType.js.map +1 -0
  23. package/dist/api/dadataHints/hintsListsOptions.d.ts +33 -0
  24. package/dist/api/dadataHints/hintsListsOptions.js +33 -0
  25. package/dist/api/dadataHints/hintsListsOptions.js.map +1 -0
  26. package/dist/components/ApplicationForm/ApplicationFormContent.d.ts +1 -0
  27. package/dist/components/ApplicationLeadForm/ApplicationLeadFormContent.d.ts +1 -0
  28. package/dist/index.d.ts +0 -1
  29. package/dist/index.js +1 -3
  30. package/dist/index.js.map +1 -1
  31. package/dist/ui-kit/FormField/Fields/EmailField.d.ts +2 -0
  32. package/dist/ui-kit/FormField/Fields/EmailField.js +12 -0
  33. package/dist/ui-kit/FormField/Fields/EmailField.js.map +1 -0
  34. package/dist/ui-kit/FormField/Fields/MiddleNameField.js +1 -1
  35. package/dist/ui-kit/FormField/Fields/MiddleNameField.js.map +1 -1
  36. package/dist/ui-kit/FormField/Fields/SurnameField.js +1 -1
  37. package/dist/ui-kit/FormField/Fields/SurnameField.js.map +1 -1
  38. package/dist/ui-kit/FormField/getField.js +3 -2
  39. package/dist/ui-kit/FormField/getField.js.map +1 -1
  40. package/dist/ui-kit/Input/InputControl.js +17 -1
  41. package/dist/ui-kit/Input/InputControl.js.map +1 -1
  42. package/dist/ui-kit/Input/InputPopup.d.ts +7 -0
  43. package/dist/ui-kit/Input/InputPopup.js +6 -0
  44. package/dist/ui-kit/Input/InputPopup.js.map +1 -0
  45. package/dist/ui-kit/Input/InputProps.d.ts +1 -0
  46. package/dist/ui-kit/Input/useInputPopup.d.ts +10 -0
  47. package/dist/ui-kit/Input/useInputPopup.js +62 -0
  48. package/dist/ui-kit/Input/useInputPopup.js.map +1 -0
  49. package/lib/api/LeadServiceAPI.d.ts +0 -12
  50. package/lib/api/LeadServiceAPI.js.map +1 -1
  51. package/lib/api/dadataHints/dadataHints.d.ts +2 -0
  52. package/lib/api/dadataHints/dadataHints.js +27 -0
  53. package/lib/api/dadataHints/dadataHints.js.map +1 -0
  54. package/lib/api/dadataHints/dadataHintsType.d.ts +27 -0
  55. package/lib/api/dadataHints/dadataHintsType.js +2 -0
  56. package/lib/api/dadataHints/dadataHintsType.js.map +1 -0
  57. package/lib/api/dadataHints/hintsListsOptions.d.ts +33 -0
  58. package/lib/api/dadataHints/hintsListsOptions.js +31 -0
  59. package/lib/api/dadataHints/hintsListsOptions.js.map +1 -0
  60. package/lib/common.css +1 -1
  61. package/lib/components/ApplicationForm/ApplicationFormContent.d.ts +1 -0
  62. package/lib/components/ApplicationLeadForm/ApplicationLeadFormContent.d.ts +1 -0
  63. package/lib/index.d.ts +0 -1
  64. package/lib/index.js +0 -1
  65. package/lib/index.js.map +1 -1
  66. package/lib/ui-kit/FormField/Fields/EmailField.d.ts +2 -0
  67. package/lib/ui-kit/FormField/Fields/EmailField.js +10 -0
  68. package/lib/ui-kit/FormField/Fields/EmailField.js.map +1 -0
  69. package/lib/ui-kit/FormField/Fields/MiddleNameField.js +1 -1
  70. package/lib/ui-kit/FormField/Fields/MiddleNameField.js.map +1 -1
  71. package/lib/ui-kit/FormField/Fields/SurnameField.js +1 -1
  72. package/lib/ui-kit/FormField/Fields/SurnameField.js.map +1 -1
  73. package/lib/ui-kit/FormField/getField.js +3 -2
  74. package/lib/ui-kit/FormField/getField.js.map +1 -1
  75. package/lib/ui-kit/Input/InputControl.js +17 -1
  76. package/lib/ui-kit/Input/InputControl.js.map +1 -1
  77. package/lib/ui-kit/Input/InputPopup.d.ts +7 -0
  78. package/lib/ui-kit/Input/InputPopup.js +4 -0
  79. package/lib/ui-kit/Input/InputPopup.js.map +1 -0
  80. package/lib/ui-kit/Input/InputProps.d.ts +1 -0
  81. package/lib/ui-kit/Input/useInputPopup.d.ts +10 -0
  82. package/lib/ui-kit/Input/useInputPopup.js +59 -0
  83. package/lib/ui-kit/Input/useInputPopup.js.map +1 -0
  84. package/mobile/bundle/api/LeadServiceAPI.d.ts +0 -12
  85. package/mobile/bundle/api/dadataHints/dadataHints.d.ts +2 -0
  86. package/mobile/bundle/api/dadataHints/dadataHintsType.d.ts +27 -0
  87. package/mobile/bundle/api/dadataHints/hintsListsOptions.d.ts +33 -0
  88. package/mobile/bundle/bundle.umd.js +151 -38
  89. package/mobile/bundle/bundle.umd.min.js +1 -1
  90. package/mobile/bundle/components/ApplicationForm/ApplicationFormContent.d.ts +1 -0
  91. package/mobile/bundle/components/ApplicationLeadForm/ApplicationLeadFormContent.d.ts +1 -0
  92. package/mobile/bundle/index.d.ts +0 -1
  93. package/mobile/bundle/ui-kit/FormField/Fields/EmailField.d.ts +2 -0
  94. package/mobile/bundle/ui-kit/Input/InputPopup.d.ts +7 -0
  95. package/mobile/bundle/ui-kit/Input/InputProps.d.ts +1 -0
  96. package/mobile/bundle/ui-kit/Input/useInputPopup.d.ts +10 -0
  97. package/mobile/dist/api/LeadServiceAPI.d.ts +0 -12
  98. package/mobile/dist/api/LeadServiceAPI.js.map +1 -1
  99. package/mobile/dist/api/dadataHints/dadataHints.d.ts +2 -0
  100. package/mobile/dist/api/dadataHints/dadataHints.js +30 -0
  101. package/mobile/dist/api/dadataHints/dadataHints.js.map +1 -0
  102. package/mobile/dist/api/dadataHints/dadataHintsType.d.ts +27 -0
  103. package/mobile/dist/api/dadataHints/dadataHintsType.js +2 -0
  104. package/mobile/dist/api/dadataHints/dadataHintsType.js.map +1 -0
  105. package/mobile/dist/api/dadataHints/hintsListsOptions.d.ts +33 -0
  106. package/mobile/dist/api/dadataHints/hintsListsOptions.js +33 -0
  107. package/mobile/dist/api/dadataHints/hintsListsOptions.js.map +1 -0
  108. package/mobile/dist/components/ApplicationForm/ApplicationFormContent.d.ts +1 -0
  109. package/mobile/dist/components/ApplicationLeadForm/ApplicationLeadFormContent.d.ts +1 -0
  110. package/mobile/dist/index.d.ts +0 -1
  111. package/mobile/dist/index.js +1 -3
  112. package/mobile/dist/index.js.map +1 -1
  113. package/mobile/dist/ui-kit/FormField/Fields/EmailField.d.ts +2 -0
  114. package/mobile/dist/ui-kit/FormField/Fields/EmailField.js +12 -0
  115. package/mobile/dist/ui-kit/FormField/Fields/EmailField.js.map +1 -0
  116. package/mobile/dist/ui-kit/FormField/Fields/MiddleNameField.js +1 -1
  117. package/mobile/dist/ui-kit/FormField/Fields/MiddleNameField.js.map +1 -1
  118. package/mobile/dist/ui-kit/FormField/Fields/SurnameField.js +1 -1
  119. package/mobile/dist/ui-kit/FormField/Fields/SurnameField.js.map +1 -1
  120. package/mobile/dist/ui-kit/FormField/getField.js +3 -2
  121. package/mobile/dist/ui-kit/FormField/getField.js.map +1 -1
  122. package/mobile/dist/ui-kit/Input/InputControl.js +17 -1
  123. package/mobile/dist/ui-kit/Input/InputControl.js.map +1 -1
  124. package/mobile/dist/ui-kit/Input/InputPopup.d.ts +7 -0
  125. package/mobile/dist/ui-kit/Input/InputPopup.js +6 -0
  126. package/mobile/dist/ui-kit/Input/InputPopup.js.map +1 -0
  127. package/mobile/dist/ui-kit/Input/InputProps.d.ts +1 -0
  128. package/mobile/dist/ui-kit/Input/useInputPopup.d.ts +10 -0
  129. package/mobile/dist/ui-kit/Input/useInputPopup.js +62 -0
  130. package/mobile/dist/ui-kit/Input/useInputPopup.js.map +1 -0
  131. package/mobile/lib/api/LeadServiceAPI.d.ts +0 -12
  132. package/mobile/lib/api/LeadServiceAPI.js.map +1 -1
  133. package/mobile/lib/api/dadataHints/dadataHints.d.ts +2 -0
  134. package/mobile/lib/api/dadataHints/dadataHints.js +27 -0
  135. package/mobile/lib/api/dadataHints/dadataHints.js.map +1 -0
  136. package/mobile/lib/api/dadataHints/dadataHintsType.d.ts +27 -0
  137. package/mobile/lib/api/dadataHints/dadataHintsType.js +2 -0
  138. package/mobile/lib/api/dadataHints/dadataHintsType.js.map +1 -0
  139. package/mobile/lib/api/dadataHints/hintsListsOptions.d.ts +33 -0
  140. package/mobile/lib/api/dadataHints/hintsListsOptions.js +31 -0
  141. package/mobile/lib/api/dadataHints/hintsListsOptions.js.map +1 -0
  142. package/mobile/lib/common.css +1 -1
  143. package/mobile/lib/components/ApplicationForm/ApplicationFormContent.d.ts +1 -0
  144. package/mobile/lib/components/ApplicationLeadForm/ApplicationLeadFormContent.d.ts +1 -0
  145. package/mobile/lib/index.d.ts +0 -1
  146. package/mobile/lib/index.js +0 -1
  147. package/mobile/lib/index.js.map +1 -1
  148. package/mobile/lib/ui-kit/FormField/Fields/EmailField.d.ts +2 -0
  149. package/mobile/lib/ui-kit/FormField/Fields/EmailField.js +10 -0
  150. package/mobile/lib/ui-kit/FormField/Fields/EmailField.js.map +1 -0
  151. package/mobile/lib/ui-kit/FormField/Fields/MiddleNameField.js +1 -1
  152. package/mobile/lib/ui-kit/FormField/Fields/MiddleNameField.js.map +1 -1
  153. package/mobile/lib/ui-kit/FormField/Fields/SurnameField.js +1 -1
  154. package/mobile/lib/ui-kit/FormField/Fields/SurnameField.js.map +1 -1
  155. package/mobile/lib/ui-kit/FormField/getField.js +3 -2
  156. package/mobile/lib/ui-kit/FormField/getField.js.map +1 -1
  157. package/mobile/lib/ui-kit/Input/InputControl.js +17 -1
  158. package/mobile/lib/ui-kit/Input/InputControl.js.map +1 -1
  159. package/mobile/lib/ui-kit/Input/InputPopup.d.ts +7 -0
  160. package/mobile/lib/ui-kit/Input/InputPopup.js +4 -0
  161. package/mobile/lib/ui-kit/Input/InputPopup.js.map +1 -0
  162. package/mobile/lib/ui-kit/Input/InputProps.d.ts +1 -0
  163. package/mobile/lib/ui-kit/Input/useInputPopup.d.ts +10 -0
  164. package/mobile/lib/ui-kit/Input/useInputPopup.js +59 -0
  165. package/mobile/lib/ui-kit/Input/useInputPopup.js.map +1 -0
  166. package/mobile/src/api/LeadServiceAPI.ts +0 -14
  167. package/mobile/src/api/dadataHints/dadataHints.ts +33 -0
  168. package/mobile/src/api/dadataHints/dadataHintsType.ts +33 -0
  169. package/mobile/src/api/dadataHints/hintsListsOptions.ts +44 -0
  170. package/mobile/src/components/ApplicationForm/ApplicationFormContent.ts +1 -0
  171. package/mobile/src/components/ApplicationLeadForm/ApplicationLeadFormContent.ts +1 -0
  172. package/mobile/src/index.ts +0 -1
  173. package/mobile/src/ui-kit/FormField/Fields/EmailField.tsx +18 -0
  174. package/mobile/src/ui-kit/FormField/Fields/MiddleNameField.tsx +2 -2
  175. package/mobile/src/ui-kit/FormField/Fields/SurnameField.tsx +1 -0
  176. package/mobile/src/ui-kit/FormField/getField.tsx +3 -8
  177. package/mobile/src/ui-kit/Input/InputControl.tsx +48 -18
  178. package/mobile/src/ui-kit/Input/InputPopup.tsx +26 -0
  179. package/mobile/src/ui-kit/Input/InputProps.ts +1 -0
  180. package/mobile/src/ui-kit/Input/useInputPopup.tsx +85 -0
  181. package/package.json +2 -2
  182. package/src/api/LeadServiceAPI.ts +0 -14
  183. package/src/api/dadataHints/dadataHints.ts +33 -0
  184. package/src/api/dadataHints/dadataHintsType.ts +33 -0
  185. package/src/api/dadataHints/hintsListsOptions.ts +44 -0
  186. package/src/components/ApplicationForm/ApplicationFormContent.ts +1 -0
  187. package/src/components/ApplicationLeadForm/ApplicationLeadForm.fixture.tsx +4 -4
  188. package/src/components/ApplicationLeadForm/ApplicationLeadFormContent.ts +1 -0
  189. package/src/index.ts +0 -1
  190. package/src/ui-kit/FormField/Fields/EmailField.tsx +18 -0
  191. package/src/ui-kit/FormField/Fields/MiddleNameField.tsx +2 -2
  192. package/src/ui-kit/FormField/Fields/SurnameField.tsx +1 -0
  193. package/src/ui-kit/FormField/getField.tsx +3 -8
  194. package/src/ui-kit/Input/InputControl.tsx +48 -18
  195. package/src/ui-kit/Input/InputPopup.tsx +26 -0
  196. package/src/ui-kit/Input/InputProps.ts +1 -0
  197. package/src/ui-kit/Input/useInputPopup.tsx +85 -0
  198. package/bundle/api/DaDataAPI.d.ts +0 -15
  199. package/dist/api/DaDataAPI.d.ts +0 -15
  200. package/dist/api/DaDataAPI.js +0 -33
  201. package/dist/api/DaDataAPI.js.map +0 -1
  202. package/lib/api/DaDataAPI.d.ts +0 -15
  203. package/lib/api/DaDataAPI.js +0 -30
  204. package/lib/api/DaDataAPI.js.map +0 -1
  205. package/mobile/bundle/api/DaDataAPI.d.ts +0 -15
  206. package/mobile/dist/api/DaDataAPI.d.ts +0 -15
  207. package/mobile/dist/api/DaDataAPI.js +0 -33
  208. package/mobile/dist/api/DaDataAPI.js.map +0 -1
  209. package/mobile/lib/api/DaDataAPI.d.ts +0 -15
  210. package/mobile/lib/api/DaDataAPI.js +0 -30
  211. package/mobile/lib/api/DaDataAPI.js.map +0 -1
  212. package/mobile/src/api/DaDataAPI.ts +0 -48
  213. package/src/api/DaDataAPI.ts +0 -48
@@ -85,6 +85,7 @@ export type FieldDefaultDef = Required &
85
85
  export type FieldCommonDef = FieldDefaultDef & {
86
86
  /** @default "common" */
87
87
  fieldType: 'common';
88
+ dadata?: boolean;
88
89
  };
89
90
 
90
91
  /**
package/src/index.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  export { setupHooks } from '@redneckz/uni-jsx/lib/hooks';
2
2
  export { setup } from '@redneckz/uni-jsx/lib/setup';
3
- export { DaDataAPI } from './api/DaDataAPI';
4
3
  export { Blocks } from './components/Blocks';
5
4
  export { ContentPage } from './components/ContentPage/ContentPage';
6
5
  export { handlerDecorator } from './hooks/handlerDecorator';
@@ -0,0 +1,18 @@
1
+ import { JSX } from '@redneckz/uni-jsx';
2
+ import { type FieldDef } from '../../../components/ApplicationForm/ApplicationFormContent';
3
+ import { InputControl } from '../../Input/InputControl';
4
+ import { type CustomFieldProps } from '../CustomFieldProps';
5
+ import { validatorObj } from '../getObjectValidator';
6
+ import { getValidation } from '../getValidation';
7
+
8
+ export const EmailField = JSX<CustomFieldProps>(({ field, input }) => {
9
+ const { required, ...rest } = input as FieldDef;
10
+
11
+ return (
12
+ <InputControl
13
+ label="Электронная почта"
14
+ {...getValidation(field('email'), validatorObj.email, required)}
15
+ {...rest}
16
+ />
17
+ );
18
+ });
@@ -2,6 +2,6 @@ import { JSX } from '@redneckz/uni-jsx';
2
2
  import { InputControl } from '../../Input/InputControl';
3
3
  import { type CustomFieldProps } from '../CustomFieldProps';
4
4
 
5
- export const MiddleNameField = JSX<CustomFieldProps>(({ field }) => (
6
- <InputControl label="Отчество (Обязательно, при наличии)" {...field('middleName')} />
5
+ export const MiddleNameField = JSX<CustomFieldProps>(({ field, input }) => (
6
+ <InputControl label="Отчество (Обязательно, при наличии)" {...field('middleName')} {...input} />
7
7
  ));
@@ -8,5 +8,6 @@ export const SurnameField = JSX<CustomFieldProps>(({ field, input }) => (
8
8
  <InputControl
9
9
  label="Фамилия"
10
10
  {...getValidation(field('surname'), validatorObj.surname, input?.required)}
11
+ {...input}
11
12
  />
12
13
  ));
@@ -14,6 +14,7 @@ import { ConsentInformField } from './Fields/ConsentInformField';
14
14
  import { ConsentPhotoFlg } from './Fields/ConsentPhotoField';
15
15
  import { ConsentProviderField } from './Fields/ConsentProviderField';
16
16
  import { ConsentToReceiveMaterialsField } from './Fields/ConsentToReceiveMaterialsField';
17
+ import { EmailField } from './Fields/EmailField';
17
18
  import { FeedbackMethodField } from './Fields/FeedbackMethodField';
18
19
  import { FeedbackTypeField } from './Fields/FeedbackTypeField';
19
20
  import { IsClientField } from './Fields/IsClientField';
@@ -51,15 +52,9 @@ export const getField =
51
52
  const InputsMap = {
52
53
  surname: <SurnameField field={field} input={input} />,
53
54
  name: <NameField field={field} input={input} />,
54
- middleName: <MiddleNameField field={field} />,
55
+ middleName: <MiddleNameField field={field} input={input} />,
55
56
  phone: <PhoneField field={field} input={input} />,
56
- email: (
57
- <InputControl
58
- label="Электронная почта"
59
- {...getValidation(field('email'), validatorObj.email, required)}
60
- {...rest}
61
- />
62
- ),
57
+ email: <EmailField field={field} input={input} />,
63
58
  fullName: (
64
59
  <InputControl
65
60
  label="ФИО"
@@ -1,8 +1,12 @@
1
1
  import { JSX } from '@redneckz/uni-jsx';
2
+ import { useBool } from '@redneckz/uni-jsx/lib/hooks/useBool';
3
+ import { useOutsideClick } from '@redneckz/uni-jsx/lib/hooks/useOutsideClick';
4
+ import { noop } from '../../utils/noop';
2
5
  import { style } from '../../utils/style';
3
6
  import { Input } from './Input';
4
7
  import { type InputProps } from './InputProps';
5
8
  import { renderErrorText } from './renderErrorText';
9
+ import { useInputPopup } from './useInputPopup';
6
10
 
7
11
  export const InputControl = JSX<InputProps>(
8
12
  ({
@@ -11,25 +15,51 @@ export const InputControl = JSX<InputProps>(
11
15
  value = '',
12
16
  placeholder,
13
17
  error,
14
- onChange,
18
+ errors,
19
+ onChange = noop,
15
20
  onBlur,
16
21
  isTextarea,
17
22
  type,
18
- ...rest
19
- }) => (
20
- <div className={style('shrink-0 w-full', className)}>
21
- <Input
22
- type={type || 'text'}
23
- aria-label={label}
24
- label={label && rest?.errors ? `${label}*` : label}
25
- valid={Boolean(!error)}
26
- value={value}
27
- onChange={onChange}
28
- onBlur={onBlur}
29
- isTextarea={isTextarea}
30
- placeholder={rest?.errors && !label ? `${placeholder}*` : placeholder}
31
- />
32
- {renderErrorText(error)}
33
- </div>
34
- ),
23
+ name = '',
24
+ dadata = false,
25
+ }) => {
26
+ const [isOpen, { setFalse: close, setTrue: open }] = useBool();
27
+ const popupRef = useOutsideClick<HTMLDivElement>(close);
28
+
29
+ const inputRef = useInputPopup({
30
+ isOpen: isOpen && dadata,
31
+ name,
32
+ value,
33
+ onChange,
34
+ });
35
+
36
+ return (
37
+ <div
38
+ className={style('shrink-0 w-full', className)}
39
+ ref={popupRef}
40
+ onBlur={close}
41
+ onFocus={open}
42
+ >
43
+ <div ref={inputRef}>
44
+ <Input
45
+ type={type || 'text'}
46
+ aria-label={label}
47
+ label={getLabel(errors, label)}
48
+ valid={Boolean(!error)}
49
+ value={value}
50
+ onChange={onChange}
51
+ onBlur={onBlur}
52
+ isTextarea={isTextarea}
53
+ placeholder={getPlaceholder(placeholder, errors, label)}
54
+ />
55
+ </div>
56
+ {renderErrorText(error)}
57
+ </div>
58
+ );
59
+ },
35
60
  );
61
+
62
+ const getLabel = (errors?: string[], label?: string) => (label && errors ? `${label}*` : label);
63
+
64
+ const getPlaceholder = (placeholder?: string, errors?: string[], label?: string) =>
65
+ errors && !label ? `${placeholder}*` : placeholder;
@@ -0,0 +1,26 @@
1
+ import { JSX } from '@redneckz/uni-jsx';
2
+ import { type DaDataSuggestion } from '../../api/dadataHints/dadataHintsType';
3
+
4
+ export interface InputPopupProps {
5
+ options?: Array<DaDataSuggestion>;
6
+ onChange: (e: string) => void;
7
+ value?: string;
8
+ }
9
+
10
+ export const InputPopup = JSX<InputPopupProps>(({ options, onChange }) => (
11
+ <div
12
+ className="bg-white text-l max-h-64 overflow-y-auto overflow-x-hidden rounded-md shadow-2xl"
13
+ role="list"
14
+ >
15
+ {options?.map((item, key) => (
16
+ <div
17
+ key={key.toString()}
18
+ className="flex px-m py-s cursor-pointer hover:bg-main-divider pr-5xl relative"
19
+ role="listitem"
20
+ onMouseDown={() => onChange(item.processedValue)}
21
+ >
22
+ <span className="min-h-6">{item.processedValue}</span>
23
+ </div>
24
+ ))}
25
+ </div>
26
+ ));
@@ -18,4 +18,5 @@ export interface InputProps<V = string> extends ControlProps<V>, LabelProps {
18
18
  isTextarea?: boolean;
19
19
  error?: string;
20
20
  errors?: string[];
21
+ dadata?: boolean;
21
22
  }
@@ -0,0 +1,85 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from '@redneckz/uni-jsx/lib/hooks';
2
+ import { getDaDataHints } from '../../api/dadataHints/dadataHints';
3
+ import { type DaDataSuggestion } from '../../api/dadataHints/dadataHintsType';
4
+ import { hintsListsOptions } from '../../api/dadataHints/hintsListsOptions';
5
+ import { debounce } from '../../utils/debounce';
6
+ import { usePopupManager } from '../PopupManager/usePopupManager';
7
+ import { InputPopup } from './InputPopup';
8
+
9
+ interface InputPopupOptions {
10
+ isOpen?: boolean;
11
+ name: string;
12
+ value?: string;
13
+ onChange: (e: string) => void;
14
+ }
15
+
16
+ export function useInputPopup({ isOpen, value, name, onChange }: InputPopupOptions) {
17
+ const prevInputValue = useRef(value);
18
+ const currentInputValue = useRef(value);
19
+ const [hintsList, setHintsList] = useState<Array<DaDataSuggestion>>([]);
20
+ const popup = usePopupManager();
21
+
22
+ const defaultHintsListOptions = hintsListsOptions[name];
23
+
24
+ const close = useCallback(() => {
25
+ currentInputValue.current = value;
26
+ popup.close();
27
+ }, [value]);
28
+
29
+ const handleChange = useCallback(
30
+ (option: string) => {
31
+ close();
32
+ currentInputValue.current = option;
33
+ onChange && onChange(option);
34
+ },
35
+ [close, onChange],
36
+ );
37
+
38
+ const inputRef = useRef<HTMLDivElement | null>(null);
39
+
40
+ const getHintsList = useMemo(
41
+ () => async (searchValue: string) => {
42
+ if (!defaultHintsListOptions) {
43
+ return;
44
+ }
45
+ const result = await getDaDataHints({
46
+ url: defaultHintsListOptions.url,
47
+ requestData: {
48
+ ...defaultHintsListOptions?.requestData,
49
+ },
50
+ query: searchValue,
51
+ });
52
+ if (result?.length) {
53
+ setHintsList(result);
54
+ }
55
+ },
56
+ [],
57
+ );
58
+
59
+ const debouncedGetHintsList = useMemo(() => debounce(getHintsList, 300), [getHintsList]);
60
+
61
+ useEffect(() => {
62
+ if (!isOpen || !inputRef.current || currentInputValue.current === value) {
63
+ close();
64
+
65
+ return;
66
+ }
67
+
68
+ const inputElement = inputRef.current;
69
+ const { top, left, width, height } = inputElement.getBoundingClientRect();
70
+
71
+ if (value && prevInputValue.current !== value) {
72
+ debouncedGetHintsList(value);
73
+
74
+ prevInputValue.current = value;
75
+ }
76
+
77
+ popup.update(<InputPopup options={hintsList} value={value} onChange={handleChange} />, {
78
+ top: top + globalThis.scrollY + height,
79
+ left,
80
+ width,
81
+ });
82
+ }, [isOpen, hintsList, value, handleChange]);
83
+
84
+ return inputRef;
85
+ }
@@ -1,15 +0,0 @@
1
- interface DaDataSuggestion<T> {
2
- value?: string;
3
- unrestricted_value?: string;
4
- data?: T;
5
- }
6
- interface DaDataAddress {
7
- city?: string | null;
8
- }
9
- export interface DaDataResult {
10
- suggestions?: DaDataSuggestion<DaDataAddress>[];
11
- }
12
- export declare function DaDataAPI(baseURL?: string): {
13
- getFetcherAddress: () => Promise<string | null | undefined>;
14
- };
15
- export {};
@@ -1,15 +0,0 @@
1
- interface DaDataSuggestion<T> {
2
- value?: string;
3
- unrestricted_value?: string;
4
- data?: T;
5
- }
6
- interface DaDataAddress {
7
- city?: string | null;
8
- }
9
- export interface DaDataResult {
10
- suggestions?: DaDataSuggestion<DaDataAddress>[];
11
- }
12
- export declare function DaDataAPI(baseURL?: string): {
13
- getFetcherAddress: () => Promise<string | null | undefined>;
14
- };
15
- export {};
@@ -1,33 +0,0 @@
1
- Object.defineProperty(exports, "__esModule", { value: true });
2
- exports.DaDataAPI = void 0;
3
- const getGeolocation_1 = require("../utils/getGeolocation");
4
- function DaDataAPI(baseURL = '') {
5
- async function getFetcherAddress() {
6
- if (!('geolocation' in navigator)) {
7
- return null;
8
- }
9
- try {
10
- const coords = await (0, getGeolocation_1.getGeolocation)();
11
- const response = await fetch(`${baseURL}/geolocate`, {
12
- method: 'POST',
13
- mode: 'cors',
14
- body: JSON.stringify({
15
- lat: coords.latitude,
16
- lon: coords.longitude,
17
- count: 1,
18
- }),
19
- });
20
- const data = (await response.json());
21
- return data?.suggestions?.[0]?.data?.city;
22
- }
23
- catch (e) {
24
- console.error(e);
25
- return null;
26
- }
27
- }
28
- return {
29
- getFetcherAddress,
30
- };
31
- }
32
- exports.DaDataAPI = DaDataAPI;
33
- //# sourceMappingURL=DaDataAPI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DaDataAPI.js","sourceRoot":"","sources":["../../src/api/DaDataAPI.ts"],"names":[],"mappings":";;AAAA,4DAAyD;AAgBzD,SAAgB,SAAS,CAAC,OAAO,GAAG,EAAE;IACpC,KAAK,UAAU,iBAAiB;QAC9B,IAAI,CAAC,CAAC,aAAa,IAAI,SAAS,CAAC,EAAE;YACjC,OAAO,IAAI,CAAC;SACb;QAED,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAc,GAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,YAAY,EAAE;gBACnD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,GAAG,EAAE,MAAM,CAAC,QAAQ;oBACpB,GAAG,EAAE,MAAM,CAAC,SAAS;oBACrB,KAAK,EAAE,CAAC;iBACT,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;YAErD,OAAO,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;SAC3C;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAEjB,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,OAAO;QACL,iBAAiB;KAClB,CAAC;AACJ,CAAC;AA/BD,8BA+BC"}
@@ -1,15 +0,0 @@
1
- interface DaDataSuggestion<T> {
2
- value?: string;
3
- unrestricted_value?: string;
4
- data?: T;
5
- }
6
- interface DaDataAddress {
7
- city?: string | null;
8
- }
9
- export interface DaDataResult {
10
- suggestions?: DaDataSuggestion<DaDataAddress>[];
11
- }
12
- export declare function DaDataAPI(baseURL?: string): {
13
- getFetcherAddress: () => Promise<string | null | undefined>;
14
- };
15
- export {};
@@ -1,30 +0,0 @@
1
- import { getGeolocation } from '../utils/getGeolocation.js';
2
- export function DaDataAPI(baseURL = '') {
3
- async function getFetcherAddress() {
4
- if (!('geolocation' in navigator)) {
5
- return null;
6
- }
7
- try {
8
- const coords = await getGeolocation();
9
- const response = await fetch(`${baseURL}/geolocate`, {
10
- method: 'POST',
11
- mode: 'cors',
12
- body: JSON.stringify({
13
- lat: coords.latitude,
14
- lon: coords.longitude,
15
- count: 1,
16
- }),
17
- });
18
- const data = (await response.json());
19
- return data?.suggestions?.[0]?.data?.city;
20
- }
21
- catch (e) {
22
- console.error(e);
23
- return null;
24
- }
25
- }
26
- return {
27
- getFetcherAddress,
28
- };
29
- }
30
- //# sourceMappingURL=DaDataAPI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DaDataAPI.js","sourceRoot":"","sources":["../../src/api/DaDataAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAgBzD,MAAM,UAAU,SAAS,CAAC,OAAO,GAAG,EAAE;IACpC,KAAK,UAAU,iBAAiB;QAC9B,IAAI,CAAC,CAAC,aAAa,IAAI,SAAS,CAAC,EAAE;YACjC,OAAO,IAAI,CAAC;SACb;QAED,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,YAAY,EAAE;gBACnD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,GAAG,EAAE,MAAM,CAAC,QAAQ;oBACpB,GAAG,EAAE,MAAM,CAAC,SAAS;oBACrB,KAAK,EAAE,CAAC;iBACT,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;YAErD,OAAO,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;SAC3C;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAEjB,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,OAAO;QACL,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
@@ -1,15 +0,0 @@
1
- interface DaDataSuggestion<T> {
2
- value?: string;
3
- unrestricted_value?: string;
4
- data?: T;
5
- }
6
- interface DaDataAddress {
7
- city?: string | null;
8
- }
9
- export interface DaDataResult {
10
- suggestions?: DaDataSuggestion<DaDataAddress>[];
11
- }
12
- export declare function DaDataAPI(baseURL?: string): {
13
- getFetcherAddress: () => Promise<string | null | undefined>;
14
- };
15
- export {};
@@ -1,15 +0,0 @@
1
- interface DaDataSuggestion<T> {
2
- value?: string;
3
- unrestricted_value?: string;
4
- data?: T;
5
- }
6
- interface DaDataAddress {
7
- city?: string | null;
8
- }
9
- export interface DaDataResult {
10
- suggestions?: DaDataSuggestion<DaDataAddress>[];
11
- }
12
- export declare function DaDataAPI(baseURL?: string): {
13
- getFetcherAddress: () => Promise<string | null | undefined>;
14
- };
15
- export {};
@@ -1,33 +0,0 @@
1
- Object.defineProperty(exports, "__esModule", { value: true });
2
- exports.DaDataAPI = void 0;
3
- const getGeolocation_1 = require("../utils/getGeolocation");
4
- function DaDataAPI(baseURL = '') {
5
- async function getFetcherAddress() {
6
- if (!('geolocation' in navigator)) {
7
- return null;
8
- }
9
- try {
10
- const coords = await (0, getGeolocation_1.getGeolocation)();
11
- const response = await fetch(`${baseURL}/geolocate`, {
12
- method: 'POST',
13
- mode: 'cors',
14
- body: JSON.stringify({
15
- lat: coords.latitude,
16
- lon: coords.longitude,
17
- count: 1,
18
- }),
19
- });
20
- const data = (await response.json());
21
- return data?.suggestions?.[0]?.data?.city;
22
- }
23
- catch (e) {
24
- console.error(e);
25
- return null;
26
- }
27
- }
28
- return {
29
- getFetcherAddress,
30
- };
31
- }
32
- exports.DaDataAPI = DaDataAPI;
33
- //# sourceMappingURL=DaDataAPI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DaDataAPI.js","sourceRoot":"","sources":["../../src/api/DaDataAPI.ts"],"names":[],"mappings":";;AAAA,4DAAyD;AAgBzD,SAAgB,SAAS,CAAC,OAAO,GAAG,EAAE;IACpC,KAAK,UAAU,iBAAiB;QAC9B,IAAI,CAAC,CAAC,aAAa,IAAI,SAAS,CAAC,EAAE;YACjC,OAAO,IAAI,CAAC;SACb;QAED,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAc,GAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,YAAY,EAAE;gBACnD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,GAAG,EAAE,MAAM,CAAC,QAAQ;oBACpB,GAAG,EAAE,MAAM,CAAC,SAAS;oBACrB,KAAK,EAAE,CAAC;iBACT,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;YAErD,OAAO,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;SAC3C;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAEjB,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,OAAO;QACL,iBAAiB;KAClB,CAAC;AACJ,CAAC;AA/BD,8BA+BC"}
@@ -1,15 +0,0 @@
1
- interface DaDataSuggestion<T> {
2
- value?: string;
3
- unrestricted_value?: string;
4
- data?: T;
5
- }
6
- interface DaDataAddress {
7
- city?: string | null;
8
- }
9
- export interface DaDataResult {
10
- suggestions?: DaDataSuggestion<DaDataAddress>[];
11
- }
12
- export declare function DaDataAPI(baseURL?: string): {
13
- getFetcherAddress: () => Promise<string | null | undefined>;
14
- };
15
- export {};
@@ -1,30 +0,0 @@
1
- import { getGeolocation } from '../utils/getGeolocation.js';
2
- export function DaDataAPI(baseURL = '') {
3
- async function getFetcherAddress() {
4
- if (!('geolocation' in navigator)) {
5
- return null;
6
- }
7
- try {
8
- const coords = await getGeolocation();
9
- const response = await fetch(`${baseURL}/geolocate`, {
10
- method: 'POST',
11
- mode: 'cors',
12
- body: JSON.stringify({
13
- lat: coords.latitude,
14
- lon: coords.longitude,
15
- count: 1,
16
- }),
17
- });
18
- const data = (await response.json());
19
- return data?.suggestions?.[0]?.data?.city;
20
- }
21
- catch (e) {
22
- console.error(e);
23
- return null;
24
- }
25
- }
26
- return {
27
- getFetcherAddress,
28
- };
29
- }
30
- //# sourceMappingURL=DaDataAPI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DaDataAPI.js","sourceRoot":"","sources":["../../src/api/DaDataAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAgBzD,MAAM,UAAU,SAAS,CAAC,OAAO,GAAG,EAAE;IACpC,KAAK,UAAU,iBAAiB;QAC9B,IAAI,CAAC,CAAC,aAAa,IAAI,SAAS,CAAC,EAAE;YACjC,OAAO,IAAI,CAAC;SACb;QAED,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,YAAY,EAAE;gBACnD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,GAAG,EAAE,MAAM,CAAC,QAAQ;oBACpB,GAAG,EAAE,MAAM,CAAC,SAAS;oBACrB,KAAK,EAAE,CAAC;iBACT,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;YAErD,OAAO,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;SAC3C;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAEjB,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,OAAO;QACL,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
@@ -1,48 +0,0 @@
1
- import { getGeolocation } from '../utils/getGeolocation';
2
-
3
- interface DaDataSuggestion<T> {
4
- value?: string;
5
- unrestricted_value?: string;
6
- data?: T;
7
- }
8
-
9
- interface DaDataAddress {
10
- city?: string | null;
11
- }
12
-
13
- export interface DaDataResult {
14
- suggestions?: DaDataSuggestion<DaDataAddress>[];
15
- }
16
-
17
- export function DaDataAPI(baseURL = '') {
18
- async function getFetcherAddress() {
19
- if (!('geolocation' in navigator)) {
20
- return null;
21
- }
22
-
23
- try {
24
- const coords = await getGeolocation();
25
- const response = await fetch(`${baseURL}/geolocate`, {
26
- method: 'POST',
27
- mode: 'cors',
28
- body: JSON.stringify({
29
- lat: coords.latitude,
30
- lon: coords.longitude,
31
- count: 1,
32
- }),
33
- });
34
-
35
- const data = (await response.json()) as DaDataResult;
36
-
37
- return data?.suggestions?.[0]?.data?.city;
38
- } catch (e) {
39
- console.error(e);
40
-
41
- return null;
42
- }
43
- }
44
-
45
- return {
46
- getFetcherAddress,
47
- };
48
- }
@@ -1,48 +0,0 @@
1
- import { getGeolocation } from '../utils/getGeolocation';
2
-
3
- interface DaDataSuggestion<T> {
4
- value?: string;
5
- unrestricted_value?: string;
6
- data?: T;
7
- }
8
-
9
- interface DaDataAddress {
10
- city?: string | null;
11
- }
12
-
13
- export interface DaDataResult {
14
- suggestions?: DaDataSuggestion<DaDataAddress>[];
15
- }
16
-
17
- export function DaDataAPI(baseURL = '') {
18
- async function getFetcherAddress() {
19
- if (!('geolocation' in navigator)) {
20
- return null;
21
- }
22
-
23
- try {
24
- const coords = await getGeolocation();
25
- const response = await fetch(`${baseURL}/geolocate`, {
26
- method: 'POST',
27
- mode: 'cors',
28
- body: JSON.stringify({
29
- lat: coords.latitude,
30
- lon: coords.longitude,
31
- count: 1,
32
- }),
33
- });
34
-
35
- const data = (await response.json()) as DaDataResult;
36
-
37
- return data?.suggestions?.[0]?.data?.city;
38
- } catch (e) {
39
- console.error(e);
40
-
41
- return null;
42
- }
43
- }
44
-
45
- return {
46
- getFetcherAddress,
47
- };
48
- }