@redneckz/wildless-cms-uni-blocks 0.6.41 → 0.6.42

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 (233) hide show
  1. package/bundle/blocks.schema.json +1 -1
  2. package/bundle/bundle.umd.js +130 -32
  3. package/bundle/bundle.umd.min.js +1 -1
  4. package/bundle/components/CarouselRecommendationCard/CarouselRecommendationCard.d.ts +5 -0
  5. package/bundle/components/CarouselRecommendationCard/CarouselRecommendationCardContent.d.ts +44 -0
  6. package/bundle/components/Header/HeaderSecondaryMenu.d.ts +2 -0
  7. package/bundle/hooks/useCachedAsyncData.d.ts +2 -0
  8. package/bundle/hooks/useLocation.d.ts +6 -0
  9. package/bundle/hooks/useRegions.d.ts +6 -0
  10. package/bundle/services/sitemap/SitemapProps.d.ts +8 -0
  11. package/bundle/ui-kit/Location/Location.d.ts +19 -0
  12. package/bundle/ui-kit/Location/SearchBar.d.ts +6 -0
  13. package/bundle/utils/groupBy.d.ts +1 -0
  14. package/dist/components/Blocks.js +4 -2
  15. package/dist/components/Blocks.js.map +1 -1
  16. package/dist/components/CarouselRecommendationCard/CarouselRecommendationCard.d.ts +5 -0
  17. package/dist/components/CarouselRecommendationCard/CarouselRecommendationCard.js +22 -0
  18. package/dist/components/CarouselRecommendationCard/CarouselRecommendationCard.js.map +1 -0
  19. package/dist/components/CarouselRecommendationCard/CarouselRecommendationCardContent.d.ts +44 -0
  20. package/dist/components/CarouselRecommendationCard/CarouselRecommendationCardContent.js +2 -0
  21. package/dist/components/CarouselRecommendationCard/CarouselRecommendationCardContent.js.map +1 -0
  22. package/dist/components/Header/Header.js +2 -2
  23. package/dist/components/Header/Header.js.map +1 -1
  24. package/dist/components/Header/HeaderBurger.js +4 -3
  25. package/dist/components/Header/HeaderBurger.js.map +1 -1
  26. package/dist/components/Header/HeaderSecondaryMenu.d.ts +2 -0
  27. package/dist/components/Header/HeaderSecondaryMenu.js +13 -4
  28. package/dist/components/Header/HeaderSecondaryMenu.js.map +1 -1
  29. package/dist/components/Recommendation/RecommendationCard.js +1 -1
  30. package/dist/components/Recommendation/RecommendationCard.js.map +1 -1
  31. package/dist/hooks/useCachedAsyncData.d.ts +2 -0
  32. package/dist/hooks/useCachedAsyncData.js +25 -0
  33. package/dist/hooks/useCachedAsyncData.js.map +1 -0
  34. package/dist/hooks/useLocation.d.ts +6 -0
  35. package/dist/hooks/useLocation.js +26 -0
  36. package/dist/hooks/useLocation.js.map +1 -0
  37. package/dist/hooks/useRegions.d.ts +6 -0
  38. package/dist/hooks/useRegions.js +11 -0
  39. package/dist/hooks/useRegions.js.map +1 -0
  40. package/dist/services/sitemap/SitemapProps.d.ts +8 -0
  41. package/dist/ui-kit/Location/Location.d.ts +19 -0
  42. package/dist/ui-kit/Location/Location.js +44 -0
  43. package/dist/ui-kit/Location/Location.js.map +1 -0
  44. package/dist/ui-kit/Location/SearchBar.d.ts +6 -0
  45. package/dist/ui-kit/Location/SearchBar.js +9 -0
  46. package/dist/ui-kit/Location/SearchBar.js.map +1 -0
  47. package/dist/ui-kit/SwipeListControl/SwipeListContainer.js +8 -4
  48. package/dist/ui-kit/SwipeListControl/SwipeListContainer.js.map +1 -1
  49. package/dist/utils/groupBy.d.ts +1 -0
  50. package/dist/utils/groupBy.js +13 -0
  51. package/dist/utils/groupBy.js.map +1 -0
  52. package/lib/common.css +1 -1
  53. package/lib/components/Blocks.js +4 -2
  54. package/lib/components/Blocks.js.map +1 -1
  55. package/lib/components/Carousel/Carousel.fixture.d.ts +1 -0
  56. package/lib/components/CarouselRecommendationCard/CarouselRecommendationCard.d.ts +5 -0
  57. package/lib/components/CarouselRecommendationCard/CarouselRecommendationCard.fixture.d.ts +9 -0
  58. package/lib/components/CarouselRecommendationCard/CarouselRecommendationCard.js +20 -0
  59. package/lib/components/CarouselRecommendationCard/CarouselRecommendationCard.js.map +1 -0
  60. package/lib/components/CarouselRecommendationCard/CarouselRecommendationCardContent.d.ts +44 -0
  61. package/lib/components/CarouselRecommendationCard/CarouselRecommendationCardContent.js +2 -0
  62. package/lib/components/CarouselRecommendationCard/CarouselRecommendationCardContent.js.map +1 -0
  63. package/lib/components/Header/Header.js +2 -2
  64. package/lib/components/Header/Header.js.map +1 -1
  65. package/lib/components/Header/HeaderBurger.js +4 -3
  66. package/lib/components/Header/HeaderBurger.js.map +1 -1
  67. package/lib/components/Header/HeaderSecondaryMenu.d.ts +2 -0
  68. package/lib/components/Header/HeaderSecondaryMenu.js +13 -4
  69. package/lib/components/Header/HeaderSecondaryMenu.js.map +1 -1
  70. package/lib/components/Recommendation/Recommendation.fixture.d.ts +1 -1
  71. package/lib/components/Recommendation/RecommendationCard.js +1 -1
  72. package/lib/components/Recommendation/RecommendationCard.js.map +1 -1
  73. package/lib/hooks/useCachedAsyncData.d.ts +2 -0
  74. package/lib/hooks/useCachedAsyncData.js +22 -0
  75. package/lib/hooks/useCachedAsyncData.js.map +1 -0
  76. package/lib/hooks/useLocation.d.ts +6 -0
  77. package/lib/hooks/useLocation.js +23 -0
  78. package/lib/hooks/useLocation.js.map +1 -0
  79. package/lib/hooks/useRegions.d.ts +6 -0
  80. package/lib/hooks/useRegions.js +8 -0
  81. package/lib/hooks/useRegions.js.map +1 -0
  82. package/lib/services/sitemap/SitemapProps.d.ts +8 -0
  83. package/lib/ui-kit/Location/Location.d.ts +19 -0
  84. package/lib/ui-kit/Location/Location.fixture.d.ts +6 -0
  85. package/lib/ui-kit/Location/Location.js +42 -0
  86. package/lib/ui-kit/Location/Location.js.map +1 -0
  87. package/lib/ui-kit/Location/SearchBar.d.ts +6 -0
  88. package/lib/ui-kit/Location/SearchBar.js +7 -0
  89. package/lib/ui-kit/Location/SearchBar.js.map +1 -0
  90. package/lib/ui-kit/SwipeListControl/SwipeListContainer.js +8 -4
  91. package/lib/ui-kit/SwipeListControl/SwipeListContainer.js.map +1 -1
  92. package/lib/utils/groupBy.d.ts +1 -0
  93. package/lib/utils/groupBy.js +10 -0
  94. package/lib/utils/groupBy.js.map +1 -0
  95. package/mobile/bundle/bundle.umd.js +48 -20
  96. package/mobile/bundle/bundle.umd.min.js +1 -1
  97. package/mobile/bundle/components/CarouselRecommendationCard/CarouselRecommendationCard.d.ts +5 -0
  98. package/mobile/bundle/components/CarouselRecommendationCard/CarouselRecommendationCardContent.d.ts +44 -0
  99. package/mobile/bundle/components/Header/HeaderSecondaryMenu.d.ts +2 -0
  100. package/mobile/bundle/hooks/useCachedAsyncData.d.ts +2 -0
  101. package/mobile/bundle/hooks/useLocation.d.ts +6 -0
  102. package/mobile/bundle/hooks/useRegions.d.ts +6 -0
  103. package/mobile/bundle/services/sitemap/SitemapProps.d.ts +8 -0
  104. package/mobile/bundle/ui-kit/Location/Location.d.ts +19 -0
  105. package/mobile/bundle/ui-kit/Location/SearchBar.d.ts +6 -0
  106. package/mobile/bundle/utils/groupBy.d.ts +1 -0
  107. package/mobile/dist/components/CarouselRecommendationCard/CarouselRecommendationCard.d.ts +5 -0
  108. package/mobile/dist/components/CarouselRecommendationCard/CarouselRecommendationCard.js +22 -0
  109. package/mobile/dist/components/CarouselRecommendationCard/CarouselRecommendationCard.js.map +1 -0
  110. package/mobile/dist/components/CarouselRecommendationCard/CarouselRecommendationCardContent.d.ts +44 -0
  111. package/mobile/dist/components/CarouselRecommendationCard/CarouselRecommendationCardContent.js +2 -0
  112. package/mobile/dist/components/CarouselRecommendationCard/CarouselRecommendationCardContent.js.map +1 -0
  113. package/mobile/dist/components/Header/HeaderBurger.js +4 -3
  114. package/mobile/dist/components/Header/HeaderBurger.js.map +1 -1
  115. package/mobile/dist/components/Header/HeaderSecondaryMenu.d.ts +2 -0
  116. package/mobile/dist/components/Header/HeaderSecondaryMenu.js +13 -4
  117. package/mobile/dist/components/Header/HeaderSecondaryMenu.js.map +1 -1
  118. package/mobile/dist/components/Recommendation/RecommendationCard.js +1 -1
  119. package/mobile/dist/components/Recommendation/RecommendationCard.js.map +1 -1
  120. package/mobile/dist/hooks/useCachedAsyncData.d.ts +2 -0
  121. package/mobile/dist/hooks/useCachedAsyncData.js +25 -0
  122. package/mobile/dist/hooks/useCachedAsyncData.js.map +1 -0
  123. package/mobile/dist/hooks/useLocation.d.ts +6 -0
  124. package/mobile/dist/hooks/useLocation.js +26 -0
  125. package/mobile/dist/hooks/useLocation.js.map +1 -0
  126. package/mobile/dist/hooks/useRegions.d.ts +6 -0
  127. package/mobile/dist/hooks/useRegions.js +11 -0
  128. package/mobile/dist/hooks/useRegions.js.map +1 -0
  129. package/mobile/dist/services/sitemap/SitemapProps.d.ts +8 -0
  130. package/mobile/dist/ui-kit/Location/Location.d.ts +19 -0
  131. package/mobile/dist/ui-kit/Location/Location.js +44 -0
  132. package/mobile/dist/ui-kit/Location/Location.js.map +1 -0
  133. package/mobile/dist/ui-kit/Location/SearchBar.d.ts +6 -0
  134. package/mobile/dist/ui-kit/Location/SearchBar.js +9 -0
  135. package/mobile/dist/ui-kit/Location/SearchBar.js.map +1 -0
  136. package/mobile/dist/ui-kit/SwipeListControl/SwipeListContainer.js +8 -4
  137. package/mobile/dist/ui-kit/SwipeListControl/SwipeListContainer.js.map +1 -1
  138. package/mobile/dist/utils/groupBy.d.ts +1 -0
  139. package/mobile/dist/utils/groupBy.js +13 -0
  140. package/mobile/dist/utils/groupBy.js.map +1 -0
  141. package/mobile/lib/components/CarouselRecommendationCard/CarouselRecommendationCard.d.ts +5 -0
  142. package/mobile/lib/components/CarouselRecommendationCard/CarouselRecommendationCard.js +20 -0
  143. package/mobile/lib/components/CarouselRecommendationCard/CarouselRecommendationCard.js.map +1 -0
  144. package/mobile/lib/components/CarouselRecommendationCard/CarouselRecommendationCardContent.d.ts +44 -0
  145. package/mobile/lib/components/CarouselRecommendationCard/CarouselRecommendationCardContent.js +2 -0
  146. package/mobile/lib/components/CarouselRecommendationCard/CarouselRecommendationCardContent.js.map +1 -0
  147. package/mobile/lib/components/Header/HeaderBurger.js +4 -3
  148. package/mobile/lib/components/Header/HeaderBurger.js.map +1 -1
  149. package/mobile/lib/components/Header/HeaderSecondaryMenu.d.ts +2 -0
  150. package/mobile/lib/components/Header/HeaderSecondaryMenu.js +13 -4
  151. package/mobile/lib/components/Header/HeaderSecondaryMenu.js.map +1 -1
  152. package/mobile/lib/components/Recommendation/RecommendationCard.js +1 -1
  153. package/mobile/lib/components/Recommendation/RecommendationCard.js.map +1 -1
  154. package/mobile/lib/hooks/useCachedAsyncData.d.ts +2 -0
  155. package/mobile/lib/hooks/useCachedAsyncData.js +22 -0
  156. package/mobile/lib/hooks/useCachedAsyncData.js.map +1 -0
  157. package/mobile/lib/hooks/useLocation.d.ts +6 -0
  158. package/mobile/lib/hooks/useLocation.js +23 -0
  159. package/mobile/lib/hooks/useLocation.js.map +1 -0
  160. package/mobile/lib/hooks/useRegions.d.ts +6 -0
  161. package/mobile/lib/hooks/useRegions.js +8 -0
  162. package/mobile/lib/hooks/useRegions.js.map +1 -0
  163. package/mobile/lib/services/sitemap/SitemapProps.d.ts +8 -0
  164. package/mobile/lib/ui-kit/Location/Location.d.ts +19 -0
  165. package/mobile/lib/ui-kit/Location/Location.js +42 -0
  166. package/mobile/lib/ui-kit/Location/Location.js.map +1 -0
  167. package/mobile/lib/ui-kit/Location/SearchBar.d.ts +6 -0
  168. package/mobile/lib/ui-kit/Location/SearchBar.js +7 -0
  169. package/mobile/lib/ui-kit/Location/SearchBar.js.map +1 -0
  170. package/mobile/lib/ui-kit/SwipeListControl/SwipeListContainer.js +8 -4
  171. package/mobile/lib/ui-kit/SwipeListControl/SwipeListContainer.js.map +1 -1
  172. package/mobile/lib/utils/groupBy.d.ts +1 -0
  173. package/mobile/lib/utils/groupBy.js +10 -0
  174. package/mobile/lib/utils/groupBy.js.map +1 -0
  175. package/mobile/src/components/CarouselRecommendationCard/CarouselRecommendationCard.example.json +19 -0
  176. package/mobile/src/components/CarouselRecommendationCard/CarouselRecommendationCard.tsx +62 -0
  177. package/mobile/src/components/CarouselRecommendationCard/CarouselRecommendationCard.ui.json +9 -0
  178. package/mobile/src/components/CarouselRecommendationCard/CarouselRecommendationCardContent.ts +45 -0
  179. package/mobile/src/components/Header/HeaderBurger.tsx +5 -7
  180. package/mobile/src/components/Header/HeaderSecondaryMenu.tsx +32 -5
  181. package/mobile/src/components/MiniGallery/MiniGallery.ui.json +1 -1
  182. package/mobile/src/components/Recommendation/Recommendation.example.json +6 -5
  183. package/mobile/src/components/Recommendation/Recommendation.ui.json +8 -0
  184. package/mobile/src/components/Recommendation/RecommendationCard.tsx +1 -1
  185. package/mobile/src/hooks/useCachedAsyncData.ts +37 -0
  186. package/mobile/src/hooks/useLocation.ts +48 -0
  187. package/mobile/src/hooks/useRegions.ts +16 -0
  188. package/mobile/src/services/sitemap/SitemapProps.ts +9 -0
  189. package/mobile/src/ui-kit/Location/Location.tsx +168 -0
  190. package/mobile/src/ui-kit/Location/SearchBar.tsx +30 -0
  191. package/mobile/src/ui-kit/SwipeListControl/SwipeListContainer.tsx +8 -4
  192. package/mobile/src/utils/groupBy.ts +10 -0
  193. package/package.json +2 -2
  194. package/src/components/Blocks.ts +4 -2
  195. package/src/components/Carousel/Carousel.fixture.tsx +22 -4
  196. package/src/components/CarouselRecommendationCard/CarouselRecommendationCard.example.json +19 -0
  197. package/src/components/CarouselRecommendationCard/CarouselRecommendationCard.fixture.tsx +47 -0
  198. package/src/components/CarouselRecommendationCard/CarouselRecommendationCard.tsx +62 -0
  199. package/src/components/CarouselRecommendationCard/CarouselRecommendationCard.ui.json +9 -0
  200. package/src/components/CarouselRecommendationCard/CarouselRecommendationCardContent.ts +45 -0
  201. package/src/components/Header/Header.tsx +6 -4
  202. package/src/components/Header/HeaderBurger.tsx +5 -7
  203. package/src/components/Header/HeaderSecondaryMenu.tsx +32 -5
  204. package/src/components/MiniGallery/MiniGallery.ui.json +1 -1
  205. package/src/components/Recommendation/Recommendation.example.json +6 -5
  206. package/src/components/Recommendation/Recommendation.fixture.tsx +11 -10
  207. package/src/components/Recommendation/Recommendation.ui.json +8 -0
  208. package/src/components/Recommendation/RecommendationCard.tsx +1 -1
  209. package/src/hooks/useCachedAsyncData.ts +37 -0
  210. package/src/hooks/useLocation.ts +48 -0
  211. package/src/hooks/useRegions.ts +16 -0
  212. package/src/services/sitemap/SitemapProps.ts +9 -0
  213. package/src/ui-kit/Location/Location.fixture.tsx +81 -0
  214. package/src/ui-kit/Location/Location.tsx +168 -0
  215. package/src/ui-kit/Location/SearchBar.tsx +30 -0
  216. package/src/ui-kit/SwipeListControl/SwipeListContainer.tsx +8 -4
  217. package/src/utils/groupBy.ts +10 -0
  218. package/bundle/hooks/useGeolocation.d.ts +0 -1
  219. package/dist/hooks/useGeolocation.d.ts +0 -1
  220. package/dist/hooks/useGeolocation.js +0 -21
  221. package/dist/hooks/useGeolocation.js.map +0 -1
  222. package/lib/hooks/useGeolocation.d.ts +0 -1
  223. package/lib/hooks/useGeolocation.js +0 -18
  224. package/lib/hooks/useGeolocation.js.map +0 -1
  225. package/mobile/bundle/hooks/useGeolocation.d.ts +0 -1
  226. package/mobile/dist/hooks/useGeolocation.d.ts +0 -1
  227. package/mobile/dist/hooks/useGeolocation.js +0 -21
  228. package/mobile/dist/hooks/useGeolocation.js.map +0 -1
  229. package/mobile/lib/hooks/useGeolocation.d.ts +0 -1
  230. package/mobile/lib/hooks/useGeolocation.js +0 -18
  231. package/mobile/lib/hooks/useGeolocation.js.map +0 -1
  232. package/mobile/src/hooks/useGeolocation.ts +0 -22
  233. package/src/hooks/useGeolocation.ts +0 -22
@@ -1,8 +1,11 @@
1
1
  import { JSX } from '@redneckz/uni-jsx';
2
- import { useGeolocation } from '../../hooks/useGeolocation';
2
+ import { useState } from '@redneckz/uni-jsx/lib/hooks';
3
+ import { useLocation } from '../../hooks/useLocation';
3
4
  import type { BgColorVersion } from '../../model/BgColorVersion';
4
5
  import type { IconVersion } from '../../model/IconVersion';
6
+ import type { ForeignOffice } from '../../services/sitemap/SitemapProps';
5
7
  import { Img } from '../../ui-kit/Img/Img';
8
+ import { Location } from '../../ui-kit/Location/Location';
6
9
  import { TopItem } from '../../ui-kit/TopItem/TopItem';
7
10
  import { HeaderSecondaryMenuButton } from './HeaderSecondaryMenuButton';
8
11
 
@@ -10,6 +13,7 @@ interface HeaderSecondaryMenuContent {
10
13
  defaultLocation?: string;
11
14
  officesLink?: string;
12
15
  bgColor?: BgColorVersion;
16
+ foreignOffices?: ForeignOffice[];
13
17
  }
14
18
 
15
19
  export interface HeaderSecondaryMenuProps extends HeaderSecondaryMenuContent {
@@ -30,8 +34,23 @@ const LINKS_ICON_VERSION_MAP: Record<BgColorVersion, IconVersion> = {
30
34
  };
31
35
 
32
36
  export const HeaderSecondaryMenu = JSX<HeaderSecondaryMenuProps>(
33
- ({ className, officesLink, defaultLocation = 'Москва', bgColor = 'bg-white' }) => {
34
- const [city, getCity] = useGeolocation(defaultLocation);
37
+ ({
38
+ className,
39
+ officesLink,
40
+ defaultLocation = 'Москва',
41
+ foreignOffices,
42
+ bgColor = 'bg-white',
43
+ }) => {
44
+ const [isShowLocationModal, setShowLocationModal] = useState<boolean>(false);
45
+
46
+ const [location, onChangeLocation] = useLocation(defaultLocation);
47
+
48
+ const showLocationModal = () => {
49
+ setShowLocationModal(true);
50
+ };
51
+ const hideLocationModal = () => {
52
+ setShowLocationModal(false);
53
+ };
35
54
 
36
55
  return (
37
56
  <div className={`flex items-center ${className || ''}`}>
@@ -39,9 +58,9 @@ export const HeaderSecondaryMenu = JSX<HeaderSecondaryMenuProps>(
39
58
  className="mr-5"
40
59
  flat={true}
41
60
  href="#"
42
- text={city}
61
+ text={location.name}
43
62
  ariaLabel="Местоположение"
44
- onClick={getCity}
63
+ onClick={showLocationModal}
45
64
  bgColor={bgColor}
46
65
  />
47
66
  {officesLink ? (
@@ -76,6 +95,14 @@ export const HeaderSecondaryMenu = JSX<HeaderSecondaryMenuProps>(
76
95
  asSVG
77
96
  />
78
97
  </HeaderSecondaryMenuButton>
98
+ {isShowLocationModal ? (
99
+ <Location
100
+ currentLocation={location}
101
+ foreignOffices={foreignOffices}
102
+ onChangeLocation={onChangeLocation}
103
+ close={hideLocationModal}
104
+ />
105
+ ) : null}
79
106
  </div>
80
107
  );
81
108
  },
@@ -8,7 +8,7 @@
8
8
  "button": {
9
9
  "icon": {
10
10
  "ui:field": "icon"
11
- },
11
+ },
12
12
  "iconRight": {
13
13
  "ui:field": "icon"
14
14
  }
@@ -28,11 +28,12 @@
28
28
  },
29
29
  "title": "Заголовок 2",
30
30
  "description": "Описание 2",
31
- "socialMedia": [
32
- { "href": "https://t.me" },
33
- { "href": "https://vk.com" },
34
- { "href": "https://ok.ru" }
35
- ]
31
+ "button": {
32
+ "href": "",
33
+ "text": "Подробнее",
34
+ "target": "_self",
35
+ "version": "primary"
36
+ }
36
37
  },
37
38
  {
38
39
  "image": {
@@ -1,9 +1,8 @@
1
+ import '../../setup-fixture';
2
+ import { Recommendation, RecommendationProps } from './Recommendation';
3
+ import type { ButtonWithIconProps } from '../../ui-kit/Button/ButtonProps';
1
4
  import type { LinkProps } from '../../model/LinkProps';
2
5
  import type { Picture } from '../../model/Picture';
3
- import '../../setup-fixture';
4
- import type { ButtonProps } from '../../ui-kit/Button/ButtonProps';
5
- import type { RecommendationProps } from './Recommendation';
6
- import { Recommendation } from './Recommendation';
7
6
 
8
7
  const cowCard: Picture = {
9
8
  src: 'cow-card.png',
@@ -51,6 +50,13 @@ const socialMedia: LinkProps[] = [
51
50
  { href: 'https://ok.ru' },
52
51
  ];
53
52
 
53
+ const button: ButtonWithIconProps = {
54
+ href: 'https://rshb.ru',
55
+ text: 'Подробнее',
56
+ target: '_blank',
57
+ version: 'secondary',
58
+ };
59
+
54
60
  export const defaultProps: RecommendationProps = {
55
61
  title: 'Мы в социальных сетях',
56
62
  recommendations: [
@@ -76,6 +82,7 @@ export const defaultProps: RecommendationProps = {
76
82
  title: 'Кредитные карты',
77
83
  description: 'Льготный период 120 дней',
78
84
  image: productBasket,
85
+ button,
79
86
  },
80
87
  {
81
88
  title: 'Кредитные карты',
@@ -111,12 +118,6 @@ export const shortProps: RecommendationProps = {
111
118
  ],
112
119
  };
113
120
 
114
- const button: ButtonProps = {
115
- text: 'Подробнее',
116
- href: '/credit-cards',
117
- version: 'secondary',
118
- };
119
-
120
121
  export const buttonProps: RecommendationProps = {
121
122
  title: 'Также интересуются',
122
123
  recommendations: [
@@ -4,6 +4,14 @@
4
4
  "items": {
5
5
  "image": {
6
6
  "ui:field": "picture"
7
+ },
8
+ "button": {
9
+ "icon": {
10
+ "ui:field": "icon"
11
+ },
12
+ "iconRight": {
13
+ "ui:field": "icon"
14
+ }
7
15
  }
8
16
  }
9
17
  }
@@ -41,7 +41,7 @@ export const RecommendationCard = JSX<RecommendationCardProps>(
41
41
  <SocialMedia className="pt-10 pb-0" media={socialMedia} version={version} />
42
42
  ) : null}
43
43
  {button?.text ? (
44
- <div className="pt-2">{renderButton({ button, buttonClassName: 'mt-16' })}</div>
44
+ <div className="pt-2">{renderButton({ button, buttonClassName: 'mt-16 px-5' })}</div>
45
45
  ) : null}
46
46
  </div>
47
47
  </BaseTile>
@@ -0,0 +1,37 @@
1
+ import { useCallback } from '@redneckz/uni-jsx/lib/hooks';
2
+ import type { AsyncDataResponse, Fetcher } from '@redneckz/uni-jsx/lib/hooks/useAsyncData';
3
+ import { useAsyncData } from '@redneckz/uni-jsx/lib/hooks/useAsyncData';
4
+
5
+ const STORAGE_DEFAULT_TTL = 86400000; // 24 * 60 * 60 * 1000
6
+
7
+ export function useCachedAsyncData<Data = any>(
8
+ key: string,
9
+ fetcher: Fetcher<Data, string>,
10
+ storage: any = globalThis?.localStorage,
11
+ ): AsyncDataResponse<Data> {
12
+ const cachedFetcher: typeof fetcher = useCallback(
13
+ async (...args) => {
14
+ const storageKey = `async:${key}`;
15
+ const storageData: string = storage.getItem(storageKey);
16
+
17
+ const cachedData = getParsedData(storageData);
18
+ if (cachedData) {
19
+ return cachedData;
20
+ }
21
+
22
+ const data = await fetcher(...args);
23
+ storage.setItem(storageKey, JSON.stringify({ data, timestamp: Date.now() }));
24
+
25
+ return data;
26
+ },
27
+ [key, fetcher],
28
+ );
29
+
30
+ return useAsyncData(key, cachedFetcher);
31
+ }
32
+
33
+ function getParsedData(storageData: string) {
34
+ const { data = null, timestamp = null } = storageData ? JSON.parse(storageData) : {};
35
+
36
+ return data && Date.now() - timestamp < STORAGE_DEFAULT_TTL ? data : undefined;
37
+ }
@@ -0,0 +1,48 @@
1
+ import { useCallback, useEffect, useState } from '@redneckz/uni-jsx/lib/hooks';
2
+ import { fetchJSONUnsafe } from '../utils/fetchJSON';
3
+ import { useCachedAsyncData } from './useCachedAsyncData';
4
+
5
+ const REGION_URL = '/api/v1/region';
6
+
7
+ export interface RegionData {
8
+ id?: number;
9
+ code?: string;
10
+ name?: string;
11
+ }
12
+
13
+ interface LocationStorageData {
14
+ manual?: boolean;
15
+ region: RegionData;
16
+ }
17
+
18
+ const localStorageLocation = globalThis?.localStorage.getItem('location');
19
+ const currentLocation: LocationStorageData | null = localStorageLocation
20
+ ? JSON.parse(localStorageLocation)
21
+ : null;
22
+
23
+ export function useLocation(
24
+ defaultLocation: string,
25
+ ): [RegionData, (newLocation: RegionData) => void] {
26
+ const [location, setLocation] = useState<RegionData>(
27
+ currentLocation?.region ?? { name: defaultLocation },
28
+ );
29
+ const { data } = useCachedAsyncData<RegionData>(REGION_URL, fetchJSONUnsafe);
30
+
31
+ useEffect(() => {
32
+ setLocation(
33
+ currentLocation?.region && currentLocation?.manual
34
+ ? currentLocation.region
35
+ : data || { name: defaultLocation },
36
+ );
37
+ }, [data]);
38
+
39
+ const onChangeLocation = useCallback(
40
+ (region: RegionData) => {
41
+ globalThis?.localStorage.setItem('location', JSON.stringify({ manual: true, region }));
42
+ setLocation(region);
43
+ },
44
+ [setLocation],
45
+ );
46
+
47
+ return [location, onChangeLocation];
48
+ }
@@ -0,0 +1,16 @@
1
+ import { useAsyncData } from '@redneckz/uni-jsx/lib/hooks/useAsyncData';
2
+ import { fetchJSONUnsafe } from '../utils/fetchJSON';
3
+
4
+ const REGIONS_URL = '/api/v1/regions';
5
+
6
+ export interface Region {
7
+ id?: number;
8
+ code?: string;
9
+ name?: string;
10
+ }
11
+
12
+ export function useRegions(): Region[] {
13
+ const { data } = useAsyncData<Region[]>(REGIONS_URL, fetchJSONUnsafe);
14
+
15
+ return data || [];
16
+ }
@@ -20,10 +20,19 @@ export interface DispositionItem extends LinkProps {
20
20
  icon?: Picture;
21
21
  }
22
22
 
23
+ /**
24
+ * @title Представительства за рубежом
25
+ * @required ["text", "href"]
26
+ */
27
+ export interface ForeignOffice extends LinkProps {
28
+ icon?: Picture;
29
+ }
30
+
23
31
  export interface SitemapDataProps {
24
32
  topItems?: TopMenuItem[];
25
33
  dispositions?: DispositionItem[];
26
34
  logo?: LogoType;
35
+ foreignOffices?: ForeignOffice[];
27
36
  defaultLocation?: string;
28
37
  officesLink?: string;
29
38
  }
@@ -0,0 +1,81 @@
1
+ import { Picture } from '../../model/Picture';
2
+ import type { ForeignOffice } from '../../services/sitemap/SitemapProps';
3
+ import '../../setup-fixture';
4
+ import { Location } from './Location';
5
+
6
+ const belarus: Picture = {
7
+ src: 'belarus.png',
8
+ format: 'webp',
9
+ size: {
10
+ width: 24,
11
+ height: 24,
12
+ },
13
+ };
14
+
15
+ const kazakhstan: Picture = {
16
+ src: 'kazakhstan.png',
17
+ format: 'webp',
18
+ size: {
19
+ width: 24,
20
+ height: 24,
21
+ },
22
+ };
23
+
24
+ const armenia: Picture = {
25
+ src: 'armenia.png',
26
+ format: 'webp',
27
+ size: {
28
+ width: 24,
29
+ height: 24,
30
+ },
31
+ };
32
+
33
+ const china: Picture = {
34
+ src: 'china.png',
35
+ format: 'webp',
36
+ size: {
37
+ width: 24,
38
+ height: 24,
39
+ },
40
+ };
41
+
42
+ const FOREIGN_OFFICES: ForeignOffice[] = [
43
+ {
44
+ text: 'Республика Беларусь',
45
+ href: '#',
46
+ icon: belarus,
47
+ },
48
+ {
49
+ text: 'Республика Казахстан',
50
+ href: '#',
51
+ icon: kazakhstan,
52
+ },
53
+ {
54
+ text: 'Республика Армения',
55
+ href: '#',
56
+ icon: armenia,
57
+ },
58
+ {
59
+ text: 'Китайская Народная Республика',
60
+ href: '#',
61
+ icon: china,
62
+ },
63
+ ];
64
+
65
+ const close = () => ({});
66
+ const onChangeLocation = () => ({});
67
+
68
+ const currentLocation = {
69
+ name: 'Москва',
70
+ };
71
+
72
+ export default {
73
+ default: (
74
+ <Location
75
+ close={close}
76
+ onChangeLocation={onChangeLocation}
77
+ currentLocation={currentLocation}
78
+ foreignOffices={FOREIGN_OFFICES}
79
+ />
80
+ ),
81
+ };
@@ -0,0 +1,168 @@
1
+ import { JSX } from '@redneckz/uni-jsx';
2
+ import { useCallback } from '@redneckz/uni-jsx/lib/hooks';
3
+ import { useLink } from '../../hooks/useLink';
4
+ import type { Region } from '../../hooks/useRegions';
5
+ import { useRegions } from '../../hooks/useRegions';
6
+ import { useSearch } from '../../hooks/useSearch';
7
+ import type { UniBlockProps } from '../../model/JSXBlock';
8
+ import type { ForeignOffice } from '../../services/sitemap/SitemapProps';
9
+ import { Text } from '../../ui-kit/Text/Text';
10
+ import { groupBy } from '../../utils/groupBy';
11
+ import { Img } from '../Img/Img';
12
+ import { SearchBar } from './SearchBar';
13
+
14
+ const SEARCH_TERM_MIN_LENGTH = 3;
15
+
16
+ interface RegionLinkProps {
17
+ onChangeLocation?: (region: Region) => void;
18
+ }
19
+
20
+ interface CloseButtonProps {
21
+ close?: () => void;
22
+ }
23
+
24
+ interface CurrentLocationProps {
25
+ currentLocation?: Region;
26
+ }
27
+
28
+ interface ForeignOfficeProps {
29
+ foreignOffices?: ForeignOffice[];
30
+ }
31
+
32
+ export type LocationProps = ForeignOfficeProps &
33
+ CloseButtonProps &
34
+ RegionLinkProps &
35
+ CurrentLocationProps &
36
+ UniBlockProps;
37
+
38
+ export const Location = JSX<LocationProps>(
39
+ ({ currentLocation, onChangeLocation, close, foreignOffices }) => {
40
+ const { term, setTerm } = useSearch();
41
+
42
+ const handleSearch = useCallback((_: string) => setTerm(_), []);
43
+
44
+ const regions: Region[] = cleanUpRegions(useRegions()).sort((a, b) =>
45
+ a.name.localeCompare(b.name),
46
+ );
47
+ const regionsGroupByLetter: Map<string, Region[]> = groupBy(regions, regionFirstLetter);
48
+
49
+ return (
50
+ <div className="absolute h-full w-full inset-0 bg-white text-l-light z-50">
51
+ <CloseButton close={close} />
52
+ <div className="container py-12">
53
+ <CurrentLocation currentLocation={currentLocation} />
54
+ <SearchBar onSearch={handleSearch} searchTerm={term} className="mb-7" />
55
+
56
+ {term && term.length >= SEARCH_TERM_MIN_LENGTH ? (
57
+ <div>
58
+ {regions
59
+ .filter((region) => region.name?.startsWith(term))
60
+ .map(renderRegion({ onChangeLocation, close }))}
61
+ </div>
62
+ ) : (
63
+ <div className="columns-5">
64
+ {Array.from(regionsGroupByLetter.entries()).map(
65
+ renderRegionGroup({ onChangeLocation, close }),
66
+ )}
67
+ </div>
68
+ )}
69
+
70
+ <ForeignOffices foreignOffices={foreignOffices} />
71
+ </div>
72
+ </div>
73
+ );
74
+ },
75
+ );
76
+
77
+ const regionFirstLetter = (region: Region) => region.name?.charAt(0) || '';
78
+
79
+ const cleanUpRegions = (regions: Region[]) =>
80
+ regions.map((region) => ({
81
+ ...region,
82
+ name: region.name?.replace(/республика|область|край'/gi, '').trim() || '',
83
+ }));
84
+
85
+ const CurrentLocation = JSX<CurrentLocationProps>(({ currentLocation }) =>
86
+ currentLocation ? (
87
+ <div className="mb-4">
88
+ <Text size="text-l" font="font-light">
89
+ Сейчас выбран:&nbsp;
90
+ </Text>
91
+ <button className="cursor-pointer" onClick={close}>
92
+ <Text color="text-green">{currentLocation.name}</Text>
93
+ </button>
94
+ </div>
95
+ ) : null,
96
+ );
97
+
98
+ const CloseButton = JSX<CloseButtonProps>(({ close }) => (
99
+ <button
100
+ className="visible peer-placeholder-shown:invisible absolute top-6 right-6 w-6 h-6 p-1 bg-transparent cursor-pointer border-none"
101
+ onClick={(e) => {
102
+ e.preventDefault();
103
+ close && close();
104
+ }}
105
+ >
106
+ <Img image="CloseIcon" width="24" height="24" />
107
+ </button>
108
+ ));
109
+
110
+ const renderRegionGroup =
111
+ ({ onChangeLocation, close }: RegionLinkProps & CloseButtonProps) =>
112
+ ([letter, regions]: [string, Region[]]) =>
113
+ (
114
+ <div key={letter} className="break-inside-avoid mb-7 w-[224px]">
115
+ <div className="mb-2.5">
116
+ <Text size="text-h6">{letter}</Text>
117
+ </div>
118
+ {regions.map(renderRegion({ onChangeLocation, close }))}
119
+ </div>
120
+ );
121
+
122
+ const renderRegion =
123
+ ({ onChangeLocation, close }: RegionLinkProps & CloseButtonProps) =>
124
+ (region: Region) =>
125
+ (
126
+ <div key={region.id} className="mb-1">
127
+ <button
128
+ className="cursor-pointer hover:text-primary-hover"
129
+ onClick={() => {
130
+ onChangeLocation && onChangeLocation(region);
131
+ close && close();
132
+ }}
133
+ >
134
+ {region.name}
135
+ </button>
136
+ </div>
137
+ );
138
+
139
+ const ForeignOffices = JSX<ForeignOfficeProps>(({ foreignOffices }) =>
140
+ foreignOffices?.length ? (
141
+ <div className="border-t border-main-divider mt-7 pt-7">
142
+ <div className="mb-4">
143
+ <Text size="text-m-light" color="text-secondary-text">
144
+ Представительства за рубежом:
145
+ </Text>
146
+ </div>
147
+ <div className="flex gap-10">
148
+ {foreignOffices.map((office, i: number) => (
149
+ <ForeignOffice key={String(i)} {...office} />
150
+ ))}
151
+ </div>
152
+ </div>
153
+ ) : null,
154
+ );
155
+
156
+ const ForeignOffice = JSX<ForeignOffice>(({ icon, ...rest }) => {
157
+ const link = useLink();
158
+ const { text, target, href, onClick } = link(rest);
159
+
160
+ return (
161
+ <div className="flex gap-x-3">
162
+ <Img image={icon} />
163
+ <a className="hover:text-primary-hover" href={href} target={target} onClick={onClick}>
164
+ {text}
165
+ </a>
166
+ </div>
167
+ );
168
+ });
@@ -0,0 +1,30 @@
1
+ import { JSX } from '@redneckz/uni-jsx';
2
+
3
+ export interface SearchBarInnerProps {
4
+ className?: string;
5
+ searchTerm?: string;
6
+ onSearch: (_: string) => void;
7
+ }
8
+
9
+ export const SearchBar = JSX<SearchBarInnerProps>(({ className, searchTerm, onSearch }) => {
10
+ return (
11
+ <form className={`font-sans relative ${className}`}>
12
+ <div className="absolute rounded h-full flex items-center justify-center pl-4 max-w-[170px] gap-3.5 pointer-events-none">
13
+ {searchTerm ? null : (
14
+ <label htmlFor="search-bar-input" className={`text-secondary-text `}>
15
+ Поиск по филиалам
16
+ </label>
17
+ )}
18
+ </div>
19
+ <input
20
+ id="search-bar-input"
21
+ className={`h-12 pl-4 w-full peer text-l text-black border border-solid rounded-md box-border
22
+ outline-none border-main-stroke hover:border-primary-hover active:border-primary-text focus:border-primary-text`}
23
+ value={searchTerm}
24
+ onChange={(e) => onSearch(e.target.value as string)}
25
+ type="text"
26
+ name="location-search-bar-input"
27
+ />
28
+ </form>
29
+ );
30
+ });
@@ -29,7 +29,7 @@ export const SwipeListContainer = JSX<SwipeListContainerProps>(
29
29
  className = '',
30
30
  containerRef,
31
31
  activeIndex,
32
- visibleItemCount,
32
+ visibleItemCount = 0,
33
33
  gap = 0,
34
34
  padding = 0,
35
35
  snapAlign = 'snap-center',
@@ -54,11 +54,15 @@ export const SwipeListContainer = JSX<SwipeListContainerProps>(
54
54
  },
55
55
  [onVisibleItemsChange, onVisibleIndicesChange],
56
56
  );
57
+ const additionPadding = visibleItemCount > 0 ? gap * Number(visibleItemCount) - 1 : 0;
57
58
 
58
59
  return (
59
60
  <div
60
61
  className={`box-border overflow-auto flex horizontal-list no-scrollbar ${className}`}
61
- style={{ ...getContainerStyle(padding), gap: `${gap}px` }}
62
+ style={{
63
+ ...getContainerStyle(padding, additionPadding),
64
+ gap: `${gap}px`,
65
+ }}
62
66
  role="list"
63
67
  ref={containerRef}
64
68
  >
@@ -83,11 +87,11 @@ export const SwipeListContainer = JSX<SwipeListContainerProps>(
83
87
  );
84
88
 
85
89
  // Styles used to compensate outer container padding to get rid of clipping effect
86
- const getContainerStyle = (padding: number): Record<string, string> => ({
90
+ const getContainerStyle = (padding: number, additionalPadding = 0): Record<string, string> => ({
87
91
  marginLeft: `${-padding}px`,
88
92
  marginRight: `${-padding}px`,
89
93
  paddingLeft: `${padding}px`,
90
- paddingRight: `${padding}px`,
94
+ paddingRight: `${padding + additionalPadding}px`,
91
95
  });
92
96
 
93
97
  const getVisibleIndices = (itemsVisibilityList: ItemsVisibilityList) =>
@@ -0,0 +1,10 @@
1
+ export const groupBy = <K, V>(list: Array<V>, keyGetter: (input: V) => K): Map<K, Array<V>> => {
2
+ const map = new Map<K, Array<V>>();
3
+ list.forEach((item) => {
4
+ const key = keyGetter(item);
5
+ const collection = map.get(key);
6
+ map.set(key, [...(collection || []), item]);
7
+ });
8
+
9
+ return map;
10
+ };
@@ -1 +0,0 @@
1
- export declare function useGeolocation(defaultLocation: string): [string, () => void];
@@ -1 +0,0 @@
1
- export declare function useGeolocation(defaultLocation: string): [string, () => void];
@@ -1,21 +0,0 @@
1
- Object.defineProperty(exports, "__esModule", { value: true });
2
- exports.useGeolocation = void 0;
3
- const hooks_1 = require("@redneckz/uni-jsx/lib/hooks");
4
- const DaDataAPI_1 = require("../api/DaDataAPI");
5
- const DaData = (0, DaDataAPI_1.DaDataAPI)('https://10.80.4.9');
6
- function useGeolocation(defaultLocation) {
7
- const [city, setCity] = (0, hooks_1.useState)(defaultLocation);
8
- (0, hooks_1.useEffect)(() => {
9
- setCity(globalThis?.localStorage.getItem('location') || defaultLocation);
10
- }, [defaultLocation]);
11
- const getCity = (0, hooks_1.useCallback)(() => {
12
- DaData.getFetcherAddress().then((_) => {
13
- const location = _ || defaultLocation;
14
- globalThis?.localStorage.setItem('location', location);
15
- setCity(location);
16
- });
17
- }, [defaultLocation]);
18
- return [city, getCity];
19
- }
20
- exports.useGeolocation = useGeolocation;
21
- //# sourceMappingURL=useGeolocation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useGeolocation.js","sourceRoot":"","sources":["../../src/hooks/useGeolocation.ts"],"names":[],"mappings":";;AAAA,uDAA+E;AAC/E,gDAA6C;AAE7C,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,mBAAmB,CAAC,CAAC;AAE9C,SAAgB,cAAc,CAAC,eAAuB;IACpD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAC,eAAe,CAAC,CAAC;IAElD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,eAAe,CAAC,CAAC;IAC3E,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,MAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAC/B,MAAM,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAG,CAAC,IAAI,eAAe,CAAC;YACtC,UAAU,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACvD,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACzB,CAAC;AAhBD,wCAgBC"}
@@ -1 +0,0 @@
1
- export declare function useGeolocation(defaultLocation: string): [string, () => void];