@redneckz/wildless-cms-uni-blocks 0.14.1026 → 0.14.1028
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.
- package/bundle/blocks.schema.json +1 -1
- package/bundle/bundle.umd.js +353 -244
- package/bundle/bundle.umd.min.js +1 -1
- package/bundle/components/RatesTable/RatesTable.d.ts +6 -0
- package/bundle/components/RatesTable/RatesTableContent.d.ts +12 -0
- package/bundle/components/RatesTable/RatesTableItem.d.ts +9 -0
- package/bundle/components/RatesTable/renderDataPickForm.d.ts +1 -0
- package/bundle/components/RatesTable/renderDate.d.ts +6 -0
- package/bundle/components/RatesTable/renderLink.d.ts +1 -0
- package/bundle/hooks/useRates.d.ts +4 -0
- package/bundle/model/LinkProps.d.ts +2 -0
- package/bundle/ui-kit/LinkButton/LinkButtonContent.d.ts +11 -0
- package/bundle/ui-kit/Rate/Rate.d.ts +12 -0
- package/dist/components/Blocks.js +2 -0
- package/dist/components/Blocks.js.map +1 -1
- package/dist/components/Blocks.mobile.js +2 -0
- package/dist/components/Blocks.mobile.js.map +1 -1
- package/dist/components/RatesTable/RatesTable.d.ts +6 -0
- package/dist/components/RatesTable/RatesTable.js +17 -0
- package/dist/components/RatesTable/RatesTable.js.map +1 -0
- package/dist/components/RatesTable/RatesTableContent.d.ts +12 -0
- package/dist/components/RatesTable/RatesTableContent.js +2 -0
- package/dist/components/RatesTable/RatesTableContent.js.map +1 -0
- package/dist/components/RatesTable/RatesTableItem.d.ts +9 -0
- package/dist/components/RatesTable/RatesTableItem.js +16 -0
- package/dist/components/RatesTable/RatesTableItem.js.map +1 -0
- package/dist/components/RatesTable/renderDataPickForm.d.ts +1 -0
- package/dist/components/RatesTable/renderDataPickForm.js +8 -0
- package/dist/components/RatesTable/renderDataPickForm.js.map +1 -0
- package/dist/components/RatesTable/renderDate.d.ts +6 -0
- package/dist/components/RatesTable/renderDate.js +24 -0
- package/dist/components/RatesTable/renderDate.js.map +1 -0
- package/dist/components/RatesTable/renderLink.d.ts +1 -0
- package/dist/components/RatesTable/renderLink.js +8 -0
- package/dist/components/RatesTable/renderLink.js.map +1 -0
- package/dist/hooks/useRates.d.ts +4 -0
- package/dist/hooks/useRates.js +42 -0
- package/dist/hooks/useRates.js.map +1 -0
- package/dist/model/LinkProps.d.ts +2 -0
- package/dist/ui-kit/LinkButton/LinkButton.js +36 -2
- package/dist/ui-kit/LinkButton/LinkButton.js.map +1 -1
- package/dist/ui-kit/LinkButton/LinkButtonContent.d.ts +11 -0
- package/dist/ui-kit/Rate/Rate.d.ts +12 -0
- package/dist/ui-kit/Rate/Rate.js +11 -0
- package/dist/ui-kit/Rate/Rate.js.map +1 -0
- package/lib/common.css +1 -1
- package/lib/components/Blocks.js +2 -0
- package/lib/components/Blocks.js.map +1 -1
- package/lib/components/Blocks.mobile.js +2 -0
- package/lib/components/Blocks.mobile.js.map +1 -1
- package/lib/components/ButtonsBlock/ButtonsBlock.fixture.d.ts +1 -0
- package/lib/components/RatesTable/RatesTable.d.ts +6 -0
- package/lib/components/RatesTable/RatesTable.fixture.d.ts +6 -0
- package/lib/components/RatesTable/RatesTable.fixture.mobile.d.ts +6 -0
- package/lib/components/RatesTable/RatesTable.js +15 -0
- package/lib/components/RatesTable/RatesTable.js.map +1 -0
- package/lib/components/RatesTable/RatesTableContent.d.ts +12 -0
- package/lib/components/RatesTable/RatesTableContent.js +2 -0
- package/lib/components/RatesTable/RatesTableContent.js.map +1 -0
- package/lib/components/RatesTable/RatesTableItem.d.ts +9 -0
- package/lib/components/RatesTable/RatesTableItem.js +14 -0
- package/lib/components/RatesTable/RatesTableItem.js.map +1 -0
- package/lib/components/RatesTable/renderDataPickForm.d.ts +1 -0
- package/lib/components/RatesTable/renderDataPickForm.js +5 -0
- package/lib/components/RatesTable/renderDataPickForm.js.map +1 -0
- package/lib/components/RatesTable/renderDate.d.ts +6 -0
- package/lib/components/RatesTable/renderDate.js +21 -0
- package/lib/components/RatesTable/renderDate.js.map +1 -0
- package/lib/components/RatesTable/renderLink.d.ts +1 -0
- package/lib/components/RatesTable/renderLink.js +5 -0
- package/lib/components/RatesTable/renderLink.js.map +1 -0
- package/lib/hooks/useRates.d.ts +4 -0
- package/lib/hooks/useRates.js +39 -0
- package/lib/hooks/useRates.js.map +1 -0
- package/lib/model/LinkProps.d.ts +2 -0
- package/lib/ui-kit/LinkButton/LinkButton.js +36 -2
- package/lib/ui-kit/LinkButton/LinkButton.js.map +1 -1
- package/lib/ui-kit/LinkButton/LinkButtonContent.d.ts +11 -0
- package/lib/ui-kit/Rate/Rate.d.ts +12 -0
- package/lib/ui-kit/Rate/Rate.js +9 -0
- package/lib/ui-kit/Rate/Rate.js.map +1 -0
- package/mobile/bundle/bundle.umd.js +318 -209
- package/mobile/bundle/bundle.umd.min.js +1 -1
- package/mobile/bundle/components/RatesTable/RatesTable.d.ts +6 -0
- package/mobile/bundle/components/RatesTable/RatesTableContent.d.ts +12 -0
- package/mobile/bundle/components/RatesTable/RatesTableItem.d.ts +9 -0
- package/mobile/bundle/components/RatesTable/renderDataPickForm.d.ts +1 -0
- package/mobile/bundle/components/RatesTable/renderDate.d.ts +6 -0
- package/mobile/bundle/components/RatesTable/renderLink.d.ts +1 -0
- package/mobile/bundle/hooks/useRates.d.ts +4 -0
- package/mobile/bundle/model/LinkProps.d.ts +2 -0
- package/mobile/bundle/ui-kit/LinkButton/LinkButtonContent.d.ts +11 -0
- package/mobile/bundle/ui-kit/Rate/Rate.d.ts +12 -0
- package/mobile/dist/components/Blocks.js +2 -0
- package/mobile/dist/components/Blocks.js.map +1 -1
- package/mobile/dist/components/RatesTable/RatesTable.d.ts +6 -0
- package/mobile/dist/components/RatesTable/RatesTable.js +17 -0
- package/mobile/dist/components/RatesTable/RatesTable.js.map +1 -0
- package/mobile/dist/components/RatesTable/RatesTableContent.d.ts +12 -0
- package/mobile/dist/components/RatesTable/RatesTableContent.js +2 -0
- package/mobile/dist/components/RatesTable/RatesTableContent.js.map +1 -0
- package/mobile/dist/components/RatesTable/RatesTableItem.d.ts +9 -0
- package/mobile/dist/components/RatesTable/RatesTableItem.js +16 -0
- package/mobile/dist/components/RatesTable/RatesTableItem.js.map +1 -0
- package/mobile/dist/components/RatesTable/renderDataPickForm.d.ts +1 -0
- package/mobile/dist/components/RatesTable/renderDataPickForm.js +8 -0
- package/mobile/dist/components/RatesTable/renderDataPickForm.js.map +1 -0
- package/mobile/dist/components/RatesTable/renderDate.d.ts +6 -0
- package/mobile/dist/components/RatesTable/renderDate.js +24 -0
- package/mobile/dist/components/RatesTable/renderDate.js.map +1 -0
- package/mobile/dist/components/RatesTable/renderLink.d.ts +1 -0
- package/mobile/dist/components/RatesTable/renderLink.js +8 -0
- package/mobile/dist/components/RatesTable/renderLink.js.map +1 -0
- package/mobile/dist/hooks/useRates.d.ts +4 -0
- package/mobile/dist/hooks/useRates.js +42 -0
- package/mobile/dist/hooks/useRates.js.map +1 -0
- package/mobile/dist/model/LinkProps.d.ts +2 -0
- package/mobile/dist/ui-kit/LinkButton/LinkButton.js +36 -2
- package/mobile/dist/ui-kit/LinkButton/LinkButton.js.map +1 -1
- package/mobile/dist/ui-kit/LinkButton/LinkButtonContent.d.ts +11 -0
- package/mobile/dist/ui-kit/Rate/Rate.d.ts +12 -0
- package/mobile/dist/ui-kit/Rate/Rate.js +11 -0
- package/mobile/dist/ui-kit/Rate/Rate.js.map +1 -0
- package/mobile/lib/common.css +1 -1
- package/mobile/lib/components/Blocks.js +2 -0
- package/mobile/lib/components/Blocks.js.map +1 -1
- package/mobile/lib/components/RatesTable/RatesTable.d.ts +6 -0
- package/mobile/lib/components/RatesTable/RatesTable.js +15 -0
- package/mobile/lib/components/RatesTable/RatesTable.js.map +1 -0
- package/mobile/lib/components/RatesTable/RatesTableContent.d.ts +12 -0
- package/mobile/lib/components/RatesTable/RatesTableContent.js +2 -0
- package/mobile/lib/components/RatesTable/RatesTableContent.js.map +1 -0
- package/mobile/lib/components/RatesTable/RatesTableItem.d.ts +9 -0
- package/mobile/lib/components/RatesTable/RatesTableItem.js +14 -0
- package/mobile/lib/components/RatesTable/RatesTableItem.js.map +1 -0
- package/mobile/lib/components/RatesTable/renderDataPickForm.d.ts +1 -0
- package/mobile/lib/components/RatesTable/renderDataPickForm.js +5 -0
- package/mobile/lib/components/RatesTable/renderDataPickForm.js.map +1 -0
- package/mobile/lib/components/RatesTable/renderDate.d.ts +6 -0
- package/mobile/lib/components/RatesTable/renderDate.js +21 -0
- package/mobile/lib/components/RatesTable/renderDate.js.map +1 -0
- package/mobile/lib/components/RatesTable/renderLink.d.ts +1 -0
- package/mobile/lib/components/RatesTable/renderLink.js +5 -0
- package/mobile/lib/components/RatesTable/renderLink.js.map +1 -0
- package/mobile/lib/hooks/useRates.d.ts +4 -0
- package/mobile/lib/hooks/useRates.js +39 -0
- package/mobile/lib/hooks/useRates.js.map +1 -0
- package/mobile/lib/model/LinkProps.d.ts +2 -0
- package/mobile/lib/ui-kit/LinkButton/LinkButton.js +36 -2
- package/mobile/lib/ui-kit/LinkButton/LinkButton.js.map +1 -1
- package/mobile/lib/ui-kit/LinkButton/LinkButtonContent.d.ts +11 -0
- package/mobile/lib/ui-kit/Rate/Rate.d.ts +12 -0
- package/mobile/lib/ui-kit/Rate/Rate.js +9 -0
- package/mobile/lib/ui-kit/Rate/Rate.js.map +1 -0
- package/mobile/src/components/Blocks.ts +2 -0
- package/mobile/src/components/RatesTable/RatesTable.example.json +7 -0
- package/mobile/src/components/RatesTable/RatesTable.tsx +38 -0
- package/mobile/src/components/RatesTable/RatesTable.ui.json +7 -0
- package/mobile/src/components/RatesTable/RatesTableContent.ts +13 -0
- package/mobile/src/components/RatesTable/RatesTableItem.tsx +39 -0
- package/mobile/src/components/RatesTable/renderDataPickForm.tsx +9 -0
- package/mobile/src/components/RatesTable/renderDate.tsx +42 -0
- package/mobile/src/components/RatesTable/renderLink.tsx +8 -0
- package/mobile/src/hooks/useRates.ts +65 -0
- package/mobile/src/model/LinkProps.ts +2 -0
- package/mobile/src/ui-kit/LinkButton/LinkButton.tsx +54 -2
- package/mobile/src/ui-kit/LinkButton/LinkButtonContent.ts +12 -0
- package/mobile/src/ui-kit/Rate/Rate.tsx +27 -0
- package/package.json +1 -1
- package/src/components/Blocks.mobile.ts +2 -0
- package/src/components/Blocks.ts +2 -0
- package/src/components/ButtonsBlock/ButtonsBlock.fixture.tsx +21 -0
- package/src/components/RatesTable/RatesTable.example.json +7 -0
- package/src/components/RatesTable/RatesTable.fixture.mobile.tsx +26 -0
- package/src/components/RatesTable/RatesTable.fixture.tsx +26 -0
- package/src/components/RatesTable/RatesTable.tsx +38 -0
- package/src/components/RatesTable/RatesTable.ui.json +7 -0
- package/src/components/RatesTable/RatesTableContent.ts +13 -0
- package/src/components/RatesTable/RatesTableItem.tsx +39 -0
- package/src/components/RatesTable/renderDataPickForm.tsx +9 -0
- package/src/components/RatesTable/renderDate.tsx +42 -0
- package/src/components/RatesTable/renderLink.tsx +8 -0
- package/src/hooks/useRates.ts +65 -0
- package/src/model/LinkProps.ts +2 -0
- package/src/ui-kit/LinkButton/LinkButton.tsx +54 -2
- package/src/ui-kit/LinkButton/LinkButtonContent.ts +12 -0
- package/src/ui-kit/Rate/Rate.tsx +27 -0
|
@@ -408,24 +408,28 @@
|
|
|
408
408
|
className,
|
|
409
409
|
].join(' ');
|
|
410
410
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
411
|
+
function copy(source, target) {
|
|
412
|
+
for (const [k, v] of source.entries()) {
|
|
413
|
+
if (v !== null && v !== undefined) {
|
|
414
|
+
target.setItem(k, v);
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
target.removeItem(k);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
419
421
|
|
|
420
|
-
function
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
return cache.current[actionType];
|
|
422
|
+
function replicate(primary, secondary) {
|
|
423
|
+
copy(primary, secondary);
|
|
424
|
+
copy(secondary, primary);
|
|
425
|
+
return primary.bus.watch(({ type, event }) => {
|
|
426
|
+
if (event !== null && event !== undefined) {
|
|
427
|
+
secondary.setItem(type, event);
|
|
427
428
|
}
|
|
428
|
-
|
|
429
|
+
else {
|
|
430
|
+
secondary.removeItem(type);
|
|
431
|
+
}
|
|
432
|
+
});
|
|
429
433
|
}
|
|
430
434
|
|
|
431
435
|
class EventBus {
|
|
@@ -477,6 +481,146 @@
|
|
|
477
481
|
}
|
|
478
482
|
}
|
|
479
483
|
|
|
484
|
+
class StorageAdapter {
|
|
485
|
+
storage;
|
|
486
|
+
bus;
|
|
487
|
+
get size() {
|
|
488
|
+
return this.storage?.length ?? 0;
|
|
489
|
+
}
|
|
490
|
+
constructor(storage, bus = new EventBus()) {
|
|
491
|
+
this.storage = storage;
|
|
492
|
+
this.bus = bus;
|
|
493
|
+
}
|
|
494
|
+
hasItem(key) {
|
|
495
|
+
return Boolean(this.storage?.getItem(String(key)));
|
|
496
|
+
}
|
|
497
|
+
getItem(key) {
|
|
498
|
+
const _ = this.storage?.getItem(String(key)) ?? null;
|
|
499
|
+
try {
|
|
500
|
+
return JSON.parse(String(_));
|
|
501
|
+
}
|
|
502
|
+
catch (ex) {
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
entries() {
|
|
507
|
+
return Array.from({ length: this.size }, (_, i) => {
|
|
508
|
+
const k = String(this.storage?.key(i));
|
|
509
|
+
return [k, this.getItem(k)];
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
setItem(key, value) {
|
|
513
|
+
if (value !== null) {
|
|
514
|
+
this.storage?.setItem(String(key), JSON.stringify(value));
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
this.storage?.removeItem(String(key));
|
|
518
|
+
}
|
|
519
|
+
this.bus?.subject(key, value);
|
|
520
|
+
}
|
|
521
|
+
removeItem(key) {
|
|
522
|
+
this.storage?.removeItem(String(key));
|
|
523
|
+
this.bus?.subject(key, null);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
class Store {
|
|
528
|
+
bus;
|
|
529
|
+
store = new Map();
|
|
530
|
+
get size() {
|
|
531
|
+
return this.store.size;
|
|
532
|
+
}
|
|
533
|
+
constructor(bus = new EventBus()) {
|
|
534
|
+
this.bus = bus;
|
|
535
|
+
}
|
|
536
|
+
hasItem(key) {
|
|
537
|
+
return this.store.has(key);
|
|
538
|
+
}
|
|
539
|
+
getItem(key) {
|
|
540
|
+
return this.store.get(key);
|
|
541
|
+
}
|
|
542
|
+
entries() {
|
|
543
|
+
return this.store.entries();
|
|
544
|
+
}
|
|
545
|
+
setItem(key, value) {
|
|
546
|
+
this.store.set(key, value);
|
|
547
|
+
this.bus.subject(key, value);
|
|
548
|
+
}
|
|
549
|
+
removeItem(key) {
|
|
550
|
+
this.store.delete(key);
|
|
551
|
+
this.bus.subject(key, null);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
function useRerender() {
|
|
556
|
+
const [, setCount] = useState(0);
|
|
557
|
+
return useCallback(() => setCount(_ => (_ + 1) % (1 << 16)), []);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
const DEFAULT_METHODS = {};
|
|
561
|
+
/**
|
|
562
|
+
* MobX like reactivity (simplified).
|
|
563
|
+
* Can be used to migrate from Redux/MobX or something else
|
|
564
|
+
*
|
|
565
|
+
* @param store
|
|
566
|
+
* @returns reactive proxy backed by store
|
|
567
|
+
*/
|
|
568
|
+
function useStore(store, methods = DEFAULT_METHODS) {
|
|
569
|
+
const deps = useRef(null);
|
|
570
|
+
const render = useRerender();
|
|
571
|
+
useEffect(() => store.bus.watch(ev => {
|
|
572
|
+
if (deps.current?.has(String(ev.type))) {
|
|
573
|
+
render();
|
|
574
|
+
}
|
|
575
|
+
}), [store, render]);
|
|
576
|
+
return useMemo(() => new Proxy(methods, {
|
|
577
|
+
get(_, key) {
|
|
578
|
+
deps.current ||= new Set();
|
|
579
|
+
deps.current.add(key);
|
|
580
|
+
return store.getItem(key);
|
|
581
|
+
},
|
|
582
|
+
has(_, key) {
|
|
583
|
+
deps.current ||= new Set();
|
|
584
|
+
deps.current.add(key);
|
|
585
|
+
return store.hasItem(key);
|
|
586
|
+
},
|
|
587
|
+
set(_, key, value) {
|
|
588
|
+
store.setItem(key, value);
|
|
589
|
+
return true;
|
|
590
|
+
},
|
|
591
|
+
deleteProperty(_, key) {
|
|
592
|
+
store.removeItem(key);
|
|
593
|
+
return true;
|
|
594
|
+
}
|
|
595
|
+
}), [store]);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
const localStore = new Store(); // localStorage cache
|
|
599
|
+
replicate(localStore, new StorageAdapter(globalThis?.localStorage));
|
|
600
|
+
function useLocalStore(methods) {
|
|
601
|
+
return useStore(localStore, methods);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
605
|
+
const handlerDecorator = (handler) => {
|
|
606
|
+
return handlerDecorator._impl(handler);
|
|
607
|
+
};
|
|
608
|
+
handlerDecorator._impl = (handler) => handler;
|
|
609
|
+
handlerDecorator.setup = (impl) => {
|
|
610
|
+
handlerDecorator._impl = impl;
|
|
611
|
+
};
|
|
612
|
+
|
|
613
|
+
function useEmitterWithActions(eventBus, type) {
|
|
614
|
+
const cache = useRef({});
|
|
615
|
+
return useMemo(() => new Proxy({}, {
|
|
616
|
+
get(_, actionType) {
|
|
617
|
+
cache.current ||= {};
|
|
618
|
+
cache.current[actionType] ||= action => eventBus.fire(type, { ...(action ?? {}), type: actionType });
|
|
619
|
+
return cache.current[actionType];
|
|
620
|
+
}
|
|
621
|
+
}), [eventBus, type]);
|
|
622
|
+
}
|
|
623
|
+
|
|
480
624
|
const defaultEventBus = new EventBus();
|
|
481
625
|
|
|
482
626
|
const useDialogManager = () => useEmitterWithActions(defaultEventBus.emitter, 'dialog');
|
|
@@ -570,15 +714,48 @@
|
|
|
570
714
|
}, [method, href]);
|
|
571
715
|
|
|
572
716
|
/** @deprecated */
|
|
573
|
-
const LinkButton = JSX(({ disabled, children, method = 'LINK', href, ...rest }) => {
|
|
717
|
+
const LinkButton = JSX(({ disabled, children, method = 'LINK', href, id, additionalHrefs, ...rest }) => {
|
|
574
718
|
const handleFormSubmit = useFormSubmit({ method, href });
|
|
719
|
+
const linksStore = useLocalStore();
|
|
720
|
+
saveLinksToStore({ linksStore, href, id, additionalHrefs });
|
|
721
|
+
const adjustedHref = additionalHrefs
|
|
722
|
+
? (linksStore.links || []).find((store) => store.id === id)?.lastLink
|
|
723
|
+
: href;
|
|
575
724
|
const link = useLink();
|
|
576
|
-
const adjustedProps = link({ onClick: handleFormSubmit, href, ...rest });
|
|
725
|
+
const adjustedProps = link({ onClick: handleFormSubmit, href: adjustedHref, ...rest });
|
|
577
726
|
const buttonInner = children ?? jsx(ButtonInner, { ...adjustedProps });
|
|
578
727
|
return disabled ? (jsx(DisabledButton, { ...adjustedProps, children: buttonInner })) : (jsx(RegularButton, { ...adjustedProps, children: buttonInner }));
|
|
579
728
|
});
|
|
580
729
|
const RegularButton = JSX(({ className = '', href, rel, target, ariaLabel, version, rounded, onClick, type, data, children, text, }) => (jsx("a", { className: getRegularButtonClasses({ className, version, rounded }), href: href, rel: rel, target: target, "aria-label": ariaLabel || `Ссылка на ${text}`, role: href ? 'link' : 'button', onClick: onClick, type: type, ...getAspectsAttributes(data), children: children })));
|
|
581
730
|
const DisabledButton = JSX(({ className, ariaLabel, version, rounded, children }) => (jsx("button", { type: "button", "aria-disabled": "true", "aria-label": ariaLabel, tabIndex: -1, className: getDisabledButtonClasses({ className, rounded, version }), children: children })));
|
|
731
|
+
const getRandomHref = (href = '', additionalHrefs = []) => {
|
|
732
|
+
const hrefs = [href, ...additionalHrefs];
|
|
733
|
+
return hrefs[Math.floor(Math.random() * hrefs.length)];
|
|
734
|
+
};
|
|
735
|
+
// Отсчитываем 7 длей с текущей даты
|
|
736
|
+
const getTimeAfter7days = () => Date.now() + 7 * 24 * 60 * 60 * 1000;
|
|
737
|
+
// Сохраняем или заменяем рандомную ссылку в localStorage
|
|
738
|
+
const saveLinksToStore = ({ linksStore, id, href, additionalHrefs }) => {
|
|
739
|
+
const buttonLinkStore = (linksStore.links || []).find((store) => store.id === id);
|
|
740
|
+
// Если хранилища вообще нет
|
|
741
|
+
if (!linksStore.links) {
|
|
742
|
+
linksStore.links = [];
|
|
743
|
+
}
|
|
744
|
+
if ((!buttonLinkStore || buttonLinkStore.nextDueAt <= Date.now()) && additionalHrefs) {
|
|
745
|
+
// Получаем рандомную ссылку
|
|
746
|
+
const randomHref = getRandomHref(href, additionalHrefs);
|
|
747
|
+
// При наличии ссылки для этой кнопки в хранилище удаляем этот элемент из массива ссылок
|
|
748
|
+
const updatedLinks = linksStore.links?.filter((item) => item.id !== id);
|
|
749
|
+
// Добавляем новый элемент
|
|
750
|
+
updatedLinks.push({
|
|
751
|
+
id: id ?? '',
|
|
752
|
+
lastLink: randomHref,
|
|
753
|
+
nextDueAt: getTimeAfter7days(),
|
|
754
|
+
});
|
|
755
|
+
// Добавляем это все в хранилище
|
|
756
|
+
linksStore.links = updatedLinks;
|
|
757
|
+
}
|
|
758
|
+
};
|
|
582
759
|
|
|
583
760
|
// TODO Заменить LinkButton на Button и применить RoundedIcon
|
|
584
761
|
function renderBackwardButton({ version, handleClick, text = 'Вернуться назад', alwaysVisible = false, }) {
|
|
@@ -1384,150 +1561,6 @@
|
|
|
1384
1561
|
return (jsx(Dialog, { maxWidth: "lg", onClose: onClose, children: jsxs("div", { className: "flex flex-col gap-lg items-center rounded-md space-x-m", children: [jsx(Img, { image: { icon: statusIcon, iconVersion: 'normal' }, width: "136", height: "136" }), jsx(Headline, { className: "w-full", title: ok ? 'Ваша заявка отправлена' : 'Не удалось отправить заявку', description: ok ? responseOKDescription : responseFailDescription, headlineVersion: "XS", isEmbedded: true }), jsx(Button, { type: "button", onClick: onClose, children: "\u0425\u043E\u0440\u043E\u0448\u043E" })] }) }));
|
|
1385
1562
|
});
|
|
1386
1563
|
|
|
1387
|
-
function copy(source, target) {
|
|
1388
|
-
for (const [k, v] of source.entries()) {
|
|
1389
|
-
if (v !== null && v !== undefined) {
|
|
1390
|
-
target.setItem(k, v);
|
|
1391
|
-
}
|
|
1392
|
-
else {
|
|
1393
|
-
target.removeItem(k);
|
|
1394
|
-
}
|
|
1395
|
-
}
|
|
1396
|
-
}
|
|
1397
|
-
|
|
1398
|
-
function replicate(primary, secondary) {
|
|
1399
|
-
copy(primary, secondary);
|
|
1400
|
-
copy(secondary, primary);
|
|
1401
|
-
return primary.bus.watch(({ type, event }) => {
|
|
1402
|
-
if (event !== null && event !== undefined) {
|
|
1403
|
-
secondary.setItem(type, event);
|
|
1404
|
-
}
|
|
1405
|
-
else {
|
|
1406
|
-
secondary.removeItem(type);
|
|
1407
|
-
}
|
|
1408
|
-
});
|
|
1409
|
-
}
|
|
1410
|
-
|
|
1411
|
-
class StorageAdapter {
|
|
1412
|
-
storage;
|
|
1413
|
-
bus;
|
|
1414
|
-
get size() {
|
|
1415
|
-
return this.storage?.length ?? 0;
|
|
1416
|
-
}
|
|
1417
|
-
constructor(storage, bus = new EventBus()) {
|
|
1418
|
-
this.storage = storage;
|
|
1419
|
-
this.bus = bus;
|
|
1420
|
-
}
|
|
1421
|
-
hasItem(key) {
|
|
1422
|
-
return Boolean(this.storage?.getItem(String(key)));
|
|
1423
|
-
}
|
|
1424
|
-
getItem(key) {
|
|
1425
|
-
const _ = this.storage?.getItem(String(key)) ?? null;
|
|
1426
|
-
try {
|
|
1427
|
-
return JSON.parse(String(_));
|
|
1428
|
-
}
|
|
1429
|
-
catch (ex) {
|
|
1430
|
-
return null;
|
|
1431
|
-
}
|
|
1432
|
-
}
|
|
1433
|
-
entries() {
|
|
1434
|
-
return Array.from({ length: this.size }, (_, i) => {
|
|
1435
|
-
const k = String(this.storage?.key(i));
|
|
1436
|
-
return [k, this.getItem(k)];
|
|
1437
|
-
});
|
|
1438
|
-
}
|
|
1439
|
-
setItem(key, value) {
|
|
1440
|
-
if (value !== null) {
|
|
1441
|
-
this.storage?.setItem(String(key), JSON.stringify(value));
|
|
1442
|
-
}
|
|
1443
|
-
else {
|
|
1444
|
-
this.storage?.removeItem(String(key));
|
|
1445
|
-
}
|
|
1446
|
-
this.bus?.subject(key, value);
|
|
1447
|
-
}
|
|
1448
|
-
removeItem(key) {
|
|
1449
|
-
this.storage?.removeItem(String(key));
|
|
1450
|
-
this.bus?.subject(key, null);
|
|
1451
|
-
}
|
|
1452
|
-
}
|
|
1453
|
-
|
|
1454
|
-
class Store {
|
|
1455
|
-
bus;
|
|
1456
|
-
store = new Map();
|
|
1457
|
-
get size() {
|
|
1458
|
-
return this.store.size;
|
|
1459
|
-
}
|
|
1460
|
-
constructor(bus = new EventBus()) {
|
|
1461
|
-
this.bus = bus;
|
|
1462
|
-
}
|
|
1463
|
-
hasItem(key) {
|
|
1464
|
-
return this.store.has(key);
|
|
1465
|
-
}
|
|
1466
|
-
getItem(key) {
|
|
1467
|
-
return this.store.get(key);
|
|
1468
|
-
}
|
|
1469
|
-
entries() {
|
|
1470
|
-
return this.store.entries();
|
|
1471
|
-
}
|
|
1472
|
-
setItem(key, value) {
|
|
1473
|
-
this.store.set(key, value);
|
|
1474
|
-
this.bus.subject(key, value);
|
|
1475
|
-
}
|
|
1476
|
-
removeItem(key) {
|
|
1477
|
-
this.store.delete(key);
|
|
1478
|
-
this.bus.subject(key, null);
|
|
1479
|
-
}
|
|
1480
|
-
}
|
|
1481
|
-
|
|
1482
|
-
function useRerender() {
|
|
1483
|
-
const [, setCount] = useState(0);
|
|
1484
|
-
return useCallback(() => setCount(_ => (_ + 1) % (1 << 16)), []);
|
|
1485
|
-
}
|
|
1486
|
-
|
|
1487
|
-
const DEFAULT_METHODS = {};
|
|
1488
|
-
/**
|
|
1489
|
-
* MobX like reactivity (simplified).
|
|
1490
|
-
* Can be used to migrate from Redux/MobX or something else
|
|
1491
|
-
*
|
|
1492
|
-
* @param store
|
|
1493
|
-
* @returns reactive proxy backed by store
|
|
1494
|
-
*/
|
|
1495
|
-
function useStore(store, methods = DEFAULT_METHODS) {
|
|
1496
|
-
const deps = useRef(null);
|
|
1497
|
-
const render = useRerender();
|
|
1498
|
-
useEffect(() => store.bus.watch(ev => {
|
|
1499
|
-
if (deps.current?.has(String(ev.type))) {
|
|
1500
|
-
render();
|
|
1501
|
-
}
|
|
1502
|
-
}), [store, render]);
|
|
1503
|
-
return useMemo(() => new Proxy(methods, {
|
|
1504
|
-
get(_, key) {
|
|
1505
|
-
deps.current ||= new Set();
|
|
1506
|
-
deps.current.add(key);
|
|
1507
|
-
return store.getItem(key);
|
|
1508
|
-
},
|
|
1509
|
-
has(_, key) {
|
|
1510
|
-
deps.current ||= new Set();
|
|
1511
|
-
deps.current.add(key);
|
|
1512
|
-
return store.hasItem(key);
|
|
1513
|
-
},
|
|
1514
|
-
set(_, key, value) {
|
|
1515
|
-
store.setItem(key, value);
|
|
1516
|
-
return true;
|
|
1517
|
-
},
|
|
1518
|
-
deleteProperty(_, key) {
|
|
1519
|
-
store.removeItem(key);
|
|
1520
|
-
return true;
|
|
1521
|
-
}
|
|
1522
|
-
}), [store]);
|
|
1523
|
-
}
|
|
1524
|
-
|
|
1525
|
-
const localStore = new Store(); // localStorage cache
|
|
1526
|
-
replicate(localStore, new StorageAdapter(globalThis?.localStorage));
|
|
1527
|
-
function useLocalStore(methods) {
|
|
1528
|
-
return useStore(localStore, methods);
|
|
1529
|
-
}
|
|
1530
|
-
|
|
1531
1564
|
const sessionStore = new Store(); // sessionStorage cache
|
|
1532
1565
|
replicate(sessionStore, new StorageAdapter(globalThis?.sessionStorage));
|
|
1533
1566
|
function useSessionStore() {
|
|
@@ -8755,11 +8788,11 @@
|
|
|
8755
8788
|
return (jsx(BlockWrapper, { className: style('!bg-transparent', alignStyle, className), defaultPadding: "p-0", ...rest, children: renderButtonsSection(buttons) }));
|
|
8756
8789
|
});
|
|
8757
8790
|
|
|
8758
|
-
const Rate = JSX(({ rate = 0, title = 'Ставка', unit, fractionDigits = 2, depositeName, isShowDepositeName, color = 'text-secondary-text', }) => (jsxs("div", { children: [jsx(Text, { size: "text-l", font: "font-light", color: color, children: title }), jsxs("div", { className: "relative", children: [jsxs("div", { className: "flex @xl:justify-center gradient-color-text gap-xs", children: [jsx("span", { className: "font-mohave text-title-huge -mt-m tracking-[-15px]", children: toLocalNumberFormat(fractionDigits, { fixed: true })(rate) }), unit ? jsx("span", { className: "text-7xl mt-5", children: unit }) : null] }), depositeName && isShowDepositeName ? (jsx("div", { className: "absolute bottom-2 w-full text-left whitespace-nowrap", children: depositeName })) : null] })] })));
|
|
8791
|
+
const Rate$1 = JSX(({ rate = 0, title = 'Ставка', unit, fractionDigits = 2, depositeName, isShowDepositeName, color = 'text-secondary-text', }) => (jsxs("div", { children: [jsx(Text, { size: "text-l", font: "font-light", color: color, children: title }), jsxs("div", { className: "relative", children: [jsxs("div", { className: "flex @xl:justify-center gradient-color-text gap-xs", children: [jsx("span", { className: "font-mohave text-title-huge -mt-m tracking-[-15px]", children: toLocalNumberFormat(fractionDigits, { fixed: true })(rate) }), unit ? jsx("span", { className: "text-7xl mt-5", children: unit }) : null] }), depositeName && isShowDepositeName ? (jsx("div", { className: "absolute bottom-2 w-full text-left whitespace-nowrap", children: depositeName })) : null] })] })));
|
|
8759
8792
|
|
|
8760
8793
|
const UnknownRate = JSX(({ title = 'Ставка' }) => (jsxs("div", { className: "space-y-s lg:min-w-96", children: [jsx(Text, { size: "text-l", font: "font-light", color: "text-secondary-text", children: title }), jsx(Icon, { className: "w-10 h-auto lg:w-40", name: "PercentIcon" }), jsx("div", { className: "w-64", children: jsx(Paragraph, { size: "text-xl", font: "font-light", color: "text-primary-text", children: "\u041F\u0440\u043E\u0446\u0435\u043D\u0442\u043D\u0430\u044F \u0441\u0442\u0430\u0432\u043A\u0430 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B" }) })] })));
|
|
8761
8794
|
|
|
8762
|
-
const renderRate = ({ title = 'Ставка', rate = 0, unit = '%', fractionDigits = 2, color = 'text-secondary-text', children, ...rest }) => rate ? (jsxs("div", { className: "flex flex-col", children: [jsx("div", { className: "hidden lg:block min-w-96", children: jsx(Rate, { title: title, rate: rate, unit: unit, fractionDigits: fractionDigits, color: color, ...rest }) }), jsx(CalculatorValue, { className: "lg:hidden", title: title, value: rate, postfix: unit, fractionDigits: fractionDigits, fixed: true, color: color, ...rest }), children] })) : (jsx(UnknownRate, { title: title, ...rest }));
|
|
8795
|
+
const renderRate = ({ title = 'Ставка', rate = 0, unit = '%', fractionDigits = 2, color = 'text-secondary-text', children, ...rest }) => rate ? (jsxs("div", { className: "flex flex-col", children: [jsx("div", { className: "hidden lg:block min-w-96", children: jsx(Rate$1, { title: title, rate: rate, unit: unit, fractionDigits: fractionDigits, color: color, ...rest }) }), jsx(CalculatorValue, { className: "lg:hidden", title: title, value: rate, postfix: unit, fractionDigits: fractionDigits, fixed: true, color: color, ...rest }), children] })) : (jsx(UnknownRate, { title: title, ...rest }));
|
|
8763
8796
|
|
|
8764
8797
|
const DEFAULT_BONUS_CALCULATOR_PARAMS$1 = {
|
|
8765
8798
|
minSumTravel: 6000,
|
|
@@ -13340,6 +13373,125 @@
|
|
|
13340
13373
|
return (jsx(BlockWrapper, { version: "transparent", className: style(className), defaultPadding: "p-0", ...rest, children: dataType === 'offices' ? jsx(OfficesMap, {}) : jsx(AtmsMap, { descriptionData: data }) }));
|
|
13341
13374
|
});
|
|
13342
13375
|
|
|
13376
|
+
const RATES_URL = `${API_BASE_URI}/rates`;
|
|
13377
|
+
const ARCHIVE_RATES_URL = `${API_BASE_URI}/historyrates`;
|
|
13378
|
+
const EMPTY_RATES = [
|
|
13379
|
+
[
|
|
13380
|
+
{
|
|
13381
|
+
currencyPair: 'Валютная пара',
|
|
13382
|
+
buyRate: 0,
|
|
13383
|
+
sellRate: 0,
|
|
13384
|
+
},
|
|
13385
|
+
],
|
|
13386
|
+
];
|
|
13387
|
+
function useRates(isArchive) {
|
|
13388
|
+
const url = isArchive ? ARCHIVE_RATES_URL : RATES_URL;
|
|
13389
|
+
const rateKey = isArchive ? 'archiveRates' : 'rates';
|
|
13390
|
+
const ratesStore = useLocalStore();
|
|
13391
|
+
// проверяем, надо ли обновлять значения ставок
|
|
13392
|
+
const shouldUpdate = getShouldUpdate(isArchive, ratesStore);
|
|
13393
|
+
// костыль, не отправлять запрос на бэк, если уже был запрос менее 15 мин назад
|
|
13394
|
+
const { data } = useAsyncData(shouldUpdate ? url : '', fetchJSONUnsafe);
|
|
13395
|
+
// если есть data и значение надо обновить, то обновляем локалсторадж
|
|
13396
|
+
if (shouldUpdate && data) {
|
|
13397
|
+
const nextUpdate = getTimeAfter15Minutes();
|
|
13398
|
+
ratesStore[rateKey] = { rate: data, nextUpdate };
|
|
13399
|
+
}
|
|
13400
|
+
// берем данные из локалсторадж
|
|
13401
|
+
const rates = ratesStore[rateKey]?.rate;
|
|
13402
|
+
// возвращаем данные из локалсторадж или заглушку
|
|
13403
|
+
return Array.isArray(rates) ? rates : EMPTY_RATES;
|
|
13404
|
+
}
|
|
13405
|
+
// Отсчитываем 15 минут с текущего момента
|
|
13406
|
+
const getTimeAfter15Minutes = () => Date.now() + 15 * 60 * 1000;
|
|
13407
|
+
const getShouldUpdate = (isArchive, ratesStore) => isArchive
|
|
13408
|
+
? !ratesStore?.archiveRates || ratesStore?.archiveRates.nextUpdate <= Date.now()
|
|
13409
|
+
: !ratesStore?.rates || ratesStore?.rates.nextUpdate <= Date.now();
|
|
13410
|
+
|
|
13411
|
+
const sum = (list = []) => list.reduce((a, b) => a + b, 0);
|
|
13412
|
+
|
|
13413
|
+
const COLUMN_WIDTH = 140;
|
|
13414
|
+
const getHorizontalShift = (columns, activeColumnIndex) => sum(columns.slice(0, activeColumnIndex).map((_) => _?.cols?.length ?? 1)) * COLUMN_WIDTH;
|
|
13415
|
+
|
|
13416
|
+
const renderInnerTableRow = (activeColumnIndex) => (rowData, rowIdx) => {
|
|
13417
|
+
if (!rowData?.length) {
|
|
13418
|
+
return null;
|
|
13419
|
+
}
|
|
13420
|
+
const [headerColumn, ...columns] = rowData;
|
|
13421
|
+
const columnsStyle = style('flex duration-1000 text-center', rowIdx !== 0 ? 'font-normal' : 'font-light');
|
|
13422
|
+
return (jsxs("div", { className: "flex border-main-divider border-b border-solid h-full", children: [headerColumn?.data ? (jsx("div", { className: "whitespace-pre-wrap sm:whitespace-normal w-48 min-w-48 sm:w-56 sm:min-w-56 py-lg pr-lg sm:pr-0", children: jsx(Text, { size: "text-xl", font: "font-light", children: headerColumn.data }) })) : null, jsx("div", { className: "flex flex-grow overflow-hidden", children: jsx("div", { className: columnsStyle, style: {
|
|
13423
|
+
transform: `translateX(-${getHorizontalShift(columns, activeColumnIndex)}px)`,
|
|
13424
|
+
}, children: columns?.map((_, i) => (jsxs("div", { className: "flex flex-col flex-grow gap-s justify-center py-xl odd:bg-main-divider", children: [_?.data ? jsx(Text, { size: "text-xl", children: _.data }) : null, _?.cols ? renderCols(_.cols, activeColumnIndex) : null] }, `row${i}`))) }) })] }, String(rowIdx)));
|
|
13425
|
+
};
|
|
13426
|
+
const renderCols = (cols, rowIndex) => cols?.length > 0 ? (jsx("div", { className: style('flex', { 'text-secondary-text': rowIndex === 0 }), children: cols.map((data, i) => (jsx("div", { className: "w-20 mx-lg", children: jsx(Text, { size: "text-h6", font: "font-light", children: data }) }, String(i)))) })) : null;
|
|
13427
|
+
|
|
13428
|
+
const InnerTableBodyItem = JSX(({ rows }) => (jsx(SwipeListContainer, { visibleItemCount: 0, snapAlign: "snap-start", children: jsx("div", { children: rows?.map(renderInnerTableRow(0)) }) })));
|
|
13429
|
+
|
|
13430
|
+
const InnerTableBody = JSX(({ activeTabIndex, items }) => (jsx("div", { children: items.map((_, tableIdx) => {
|
|
13431
|
+
const key = `activeTabIdx:${activeTabIndex}-tableIdx:${tableIdx}`;
|
|
13432
|
+
return (jsxs("div", { className: "w-full @container", children: [jsx("div", { className: "flex py-m px-m bg-white @4xl:bg-gray relative", children: jsx(Text, { size: "text-xl", align: "text-left", children: _.title }) }), jsx("div", { className: "w-full sm:pl-xs overflow-hidden transition-height duration-500 ease-in-out", children: jsx("div", { className: "relative", children: jsx(InnerTableBodyItem, { rows: _.rowsData }) }) })] }, key));
|
|
13433
|
+
}) })));
|
|
13434
|
+
|
|
13435
|
+
const linkButtonVersion = 'link';
|
|
13436
|
+
|
|
13437
|
+
const TableColor = (isEqual = false) => `${isEqual ? 'text-white' : 'text-secondary-text'}`;
|
|
13438
|
+
const InnerTableHeader = JSX(({ currencies, linkToPDF, activeTabIndex, setActiveTabIndex }) => (jsxs("div", { className: "flex justify-between items-center w-full py-lg", children: [currencies && currencies.length > 1 ? (jsx("div", { className: "flex bg-secondary-light p-2xs rounded-md", children: currencies.map((currency, idx) => (jsx("div", { className: style('rounded-md px-4 py-3 cursor-pointer', {
|
|
13439
|
+
'bg-primary-main': idx === activeTabIndex,
|
|
13440
|
+
}), onClick: () => setActiveTabIndex(idx), children: jsx(Text, { size: "text-xl", font: "font-light", color: TableColor(idx === activeTabIndex), children: currency || idx + 1 }) }, currency))) })) : null, linkToPDF ? (jsx(LinkButton, { className: "text-primary-main", href: linkToPDF, version: linkButtonVersion, target: "_blank", appendLeft: jsx(Icon, { name: "DocDownloadIcon", iconVersion: "color", className: "mr-3xs", width: "20", height: "20" }), text: "\u0421\u043A\u0430\u0447\u0430\u0442\u044C \u0432 PDF" })) : null] })));
|
|
13441
|
+
|
|
13442
|
+
const EMPTY_DATA$1 = 'Данных нет';
|
|
13443
|
+
const InnerTable = UniBlock(({ tableSource }) => {
|
|
13444
|
+
const tableData = tableSource?.tableData;
|
|
13445
|
+
const [activeTabIndex, setActiveTabIndex] = useState(0);
|
|
13446
|
+
const handleActiveTabIndex = useCallback((_) => setActiveTabIndex(_), []);
|
|
13447
|
+
const items = tableData?.[activeTabIndex]?.items ?? [];
|
|
13448
|
+
const currencies = tableData?.map((item) => item.currency ?? '');
|
|
13449
|
+
return tableData ? (jsxs("div", { className: "bg-white z-10", children: [jsx(InnerTableHeader, { currencies: currencies, activeTabIndex: activeTabIndex, setActiveTabIndex: handleActiveTabIndex }), jsx(InnerTableBody, { activeTabIndex: activeTabIndex, items: items })] })) : (jsx("div", { className: "space-y-m text-center", children: jsx(Text, { size: "text-h6", children: EMPTY_DATA$1 }) }));
|
|
13450
|
+
});
|
|
13451
|
+
|
|
13452
|
+
const DIVIDER_STYLE = 'border-main-divider lg:border-b w-full py-s lg:py-xl';
|
|
13453
|
+
const TariffsTableRowContainer = JSX(({ children, tableInner, onClick }) => (jsxs("div", { className: style('self-start flex flex-col gap-xl', DIVIDER_STYLE), role: "row", children: [jsx("div", { className: style('flex flex-col lg:flex-row gap-x-5xl gap-y-xs'), children: children }), tableInner ? (jsx("div", { className: "origin-top animate-expansion", children: jsx(InnerTable, { ...tableInner, onClick: onClick }) })) : null] })));
|
|
13454
|
+
|
|
13455
|
+
const RATES_COLUMN_STYLE = `grid grid-cols-3 gap-s`;
|
|
13456
|
+
const Rate = UniBlock(({ currencyPair = '', buyRate = 0, sellRate = 0 }) => (jsxs("div", { className: style('mb-s', RATES_COLUMN_STYLE, DIVIDER_STYLE), children: [jsx("div", { children: formatCurrencyPair(currencyPair) }), jsx("div", { children: formatRate(buyRate) }), jsx("div", { children: formatRate(sellRate) })] })));
|
|
13457
|
+
const formatCurrencyPair = (currency) => currency.replace('_TOD', '');
|
|
13458
|
+
const formatRate = (rate) => rate.toFixed(4);
|
|
13459
|
+
|
|
13460
|
+
const TIMEZONE = 'МСК';
|
|
13461
|
+
const renderDate = ({ dateString, isArchive = false }) => {
|
|
13462
|
+
const date = new Date(String(dateString));
|
|
13463
|
+
const formatTime = date.toLocaleTimeString('ru-RU', {
|
|
13464
|
+
timeZone: 'Europe/Moscow',
|
|
13465
|
+
hour: '2-digit',
|
|
13466
|
+
minute: '2-digit',
|
|
13467
|
+
hour12: false,
|
|
13468
|
+
});
|
|
13469
|
+
const formatDate = date.toLocaleDateString('ru-RU', {
|
|
13470
|
+
timeZone: 'Europe/Moscow',
|
|
13471
|
+
day: 'numeric',
|
|
13472
|
+
month: 'long',
|
|
13473
|
+
year: 'numeric',
|
|
13474
|
+
});
|
|
13475
|
+
return isArchive ? (jsxs("div", { children: [jsx(Paragraph, { color: "text-secondary-text", font: "font-medium", children: formatDate }), jsxs(Paragraph, { color: "text-secondary-text", children: [formatTime, " (", TIMEZONE, ")"] })] })) : (jsxs(Text, { color: "text-secondary-text", children: ["\u041A\u0443\u0440\u0441\u044B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B \u043D\u0430 ", formatTime, " (", TIMEZONE, "), ", formatDate] }));
|
|
13476
|
+
};
|
|
13477
|
+
|
|
13478
|
+
const RatesTableItem = JSX(({ isArchive = false, isRatesValid, list = [], infoMessage }) => {
|
|
13479
|
+
const maxDate = isRatesValid
|
|
13480
|
+
? list.map((item) => item.lastUpdatedAt).reduce((a, b) => (String(a) > String(b) ? a : b))
|
|
13481
|
+
: '';
|
|
13482
|
+
return (jsxs("div", { className: "space-y-xl mb-3xl", children: [maxDate && renderDate({ dateString: maxDate, isArchive }), jsxs("div", { className: style(RATES_COLUMN_STYLE), children: [jsx(Text, { font: "font-medium", children: "\u0412\u0430\u043B\u044E\u0442\u0430" }), jsx(Text, { font: "font-medium", children: "\u041F\u043E\u043A\u0443\u043F\u043A\u0430" }), jsx(Text, { font: "font-medium", children: "\u041F\u0440\u043E\u0434\u0430\u0436\u0430" })] }), list.length > 0 ? (list.map((rate, i) => jsx(Rate, { ...rate }, String(i)))) : (jsx(Paragraph, { children: "\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u0434\u0430\u043D\u043D\u044B\u0445" })), jsx(Paragraph, { color: "text-secondary-text", children: infoMessage })] }));
|
|
13483
|
+
});
|
|
13484
|
+
|
|
13485
|
+
const renderDataPickForm = () => (jsxs("div", { className: "flex justify-start items-end space-x-xl", children: [jsx(DatePicker, { label: "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0435\u043D\u044C", maxDate: new Date() }), jsx(SubmitButton$1, { className: "h-fit", children: "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C" })] }));
|
|
13486
|
+
|
|
13487
|
+
const renderLink = (href) => (jsxs(Paragraph, { children: ["\u041F\u043E\u043B\u043D\u044B\u0439 \u0430\u0440\u0445\u0438\u0432 \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C ", jsx(Link, { href: href, children: "\u0437\u0434\u0435\u0441\u044C" })] }));
|
|
13488
|
+
|
|
13489
|
+
const RatesTable = JSX(({ href, className = '', infoMessage, title, isArchive = false, ...rest }) => {
|
|
13490
|
+
const ratesList = useRates(isArchive);
|
|
13491
|
+
const isRatesValid = ratesList[0].length > 0;
|
|
13492
|
+
return (jsxs(BlockWrapper, { className: style('p-6xl space-y-xl', className), defaultPadding: "p-0", ...rest, children: [jsx(Heading, { className: "mb-xl", children: title }), isArchive ? renderDataPickForm() : null, ratesList.map((list, i) => (jsx(RatesTableItem, { list: list, isRatesValid: isRatesValid, isArchive: isArchive, infoMessage: infoMessage }, String(i)))), href ? renderLink(href) : null] }));
|
|
13493
|
+
});
|
|
13494
|
+
|
|
13343
13495
|
const RichTextBlock = UniBlock((props) => {
|
|
13344
13496
|
const { __html, dynamicQueryParamText = {}, dynamicTextSource, richVersion = '', ...rest } = props;
|
|
13345
13497
|
const formatText = getFormatDynamicText(dynamicQueryParamText, dynamicTextSource?.list, __html);
|
|
@@ -13910,50 +14062,6 @@
|
|
|
13910
14062
|
: null }));
|
|
13911
14063
|
});
|
|
13912
14064
|
|
|
13913
|
-
const sum = (list = []) => list.reduce((a, b) => a + b, 0);
|
|
13914
|
-
|
|
13915
|
-
const COLUMN_WIDTH = 140;
|
|
13916
|
-
const getHorizontalShift = (columns, activeColumnIndex) => sum(columns.slice(0, activeColumnIndex).map((_) => _?.cols?.length ?? 1)) * COLUMN_WIDTH;
|
|
13917
|
-
|
|
13918
|
-
const renderInnerTableRow = (activeColumnIndex) => (rowData, rowIdx) => {
|
|
13919
|
-
if (!rowData?.length) {
|
|
13920
|
-
return null;
|
|
13921
|
-
}
|
|
13922
|
-
const [headerColumn, ...columns] = rowData;
|
|
13923
|
-
const columnsStyle = style('flex duration-1000 text-center', rowIdx !== 0 ? 'font-normal' : 'font-light');
|
|
13924
|
-
return (jsxs("div", { className: "flex border-main-divider border-b border-solid h-full", children: [headerColumn?.data ? (jsx("div", { className: "whitespace-pre-wrap sm:whitespace-normal w-48 min-w-48 sm:w-56 sm:min-w-56 py-lg pr-lg sm:pr-0", children: jsx(Text, { size: "text-xl", font: "font-light", children: headerColumn.data }) })) : null, jsx("div", { className: "flex flex-grow overflow-hidden", children: jsx("div", { className: columnsStyle, style: {
|
|
13925
|
-
transform: `translateX(-${getHorizontalShift(columns, activeColumnIndex)}px)`,
|
|
13926
|
-
}, children: columns?.map((_, i) => (jsxs("div", { className: "flex flex-col flex-grow gap-s justify-center py-xl odd:bg-main-divider", children: [_?.data ? jsx(Text, { size: "text-xl", children: _.data }) : null, _?.cols ? renderCols(_.cols, activeColumnIndex) : null] }, `row${i}`))) }) })] }, String(rowIdx)));
|
|
13927
|
-
};
|
|
13928
|
-
const renderCols = (cols, rowIndex) => cols?.length > 0 ? (jsx("div", { className: style('flex', { 'text-secondary-text': rowIndex === 0 }), children: cols.map((data, i) => (jsx("div", { className: "w-20 mx-lg", children: jsx(Text, { size: "text-h6", font: "font-light", children: data }) }, String(i)))) })) : null;
|
|
13929
|
-
|
|
13930
|
-
const InnerTableBodyItem = JSX(({ rows }) => (jsx(SwipeListContainer, { visibleItemCount: 0, snapAlign: "snap-start", children: jsx("div", { children: rows?.map(renderInnerTableRow(0)) }) })));
|
|
13931
|
-
|
|
13932
|
-
const InnerTableBody = JSX(({ activeTabIndex, items }) => (jsx("div", { children: items.map((_, tableIdx) => {
|
|
13933
|
-
const key = `activeTabIdx:${activeTabIndex}-tableIdx:${tableIdx}`;
|
|
13934
|
-
return (jsxs("div", { className: "w-full @container", children: [jsx("div", { className: "flex py-m px-m bg-white @4xl:bg-gray relative", children: jsx(Text, { size: "text-xl", align: "text-left", children: _.title }) }), jsx("div", { className: "w-full sm:pl-xs overflow-hidden transition-height duration-500 ease-in-out", children: jsx("div", { className: "relative", children: jsx(InnerTableBodyItem, { rows: _.rowsData }) }) })] }, key));
|
|
13935
|
-
}) })));
|
|
13936
|
-
|
|
13937
|
-
const linkButtonVersion = 'link';
|
|
13938
|
-
|
|
13939
|
-
const TableColor = (isEqual = false) => `${isEqual ? 'text-white' : 'text-secondary-text'}`;
|
|
13940
|
-
const InnerTableHeader = JSX(({ currencies, linkToPDF, activeTabIndex, setActiveTabIndex }) => (jsxs("div", { className: "flex justify-between items-center w-full py-lg", children: [currencies && currencies.length > 1 ? (jsx("div", { className: "flex bg-secondary-light p-2xs rounded-md", children: currencies.map((currency, idx) => (jsx("div", { className: style('rounded-md px-4 py-3 cursor-pointer', {
|
|
13941
|
-
'bg-primary-main': idx === activeTabIndex,
|
|
13942
|
-
}), onClick: () => setActiveTabIndex(idx), children: jsx(Text, { size: "text-xl", font: "font-light", color: TableColor(idx === activeTabIndex), children: currency || idx + 1 }) }, currency))) })) : null, linkToPDF ? (jsx(LinkButton, { className: "text-primary-main", href: linkToPDF, version: linkButtonVersion, target: "_blank", appendLeft: jsx(Icon, { name: "DocDownloadIcon", iconVersion: "color", className: "mr-3xs", width: "20", height: "20" }), text: "\u0421\u043A\u0430\u0447\u0430\u0442\u044C \u0432 PDF" })) : null] })));
|
|
13943
|
-
|
|
13944
|
-
const EMPTY_DATA$1 = 'Данных нет';
|
|
13945
|
-
const InnerTable = UniBlock(({ tableSource }) => {
|
|
13946
|
-
const tableData = tableSource?.tableData;
|
|
13947
|
-
const [activeTabIndex, setActiveTabIndex] = useState(0);
|
|
13948
|
-
const handleActiveTabIndex = useCallback((_) => setActiveTabIndex(_), []);
|
|
13949
|
-
const items = tableData?.[activeTabIndex]?.items ?? [];
|
|
13950
|
-
const currencies = tableData?.map((item) => item.currency ?? '');
|
|
13951
|
-
return tableData ? (jsxs("div", { className: "bg-white z-10", children: [jsx(InnerTableHeader, { currencies: currencies, activeTabIndex: activeTabIndex, setActiveTabIndex: handleActiveTabIndex }), jsx(InnerTableBody, { activeTabIndex: activeTabIndex, items: items })] })) : (jsx("div", { className: "space-y-m text-center", children: jsx(Text, { size: "text-h6", children: EMPTY_DATA$1 }) }));
|
|
13952
|
-
});
|
|
13953
|
-
|
|
13954
|
-
const DIVIDER_STYLE = 'border-main-divider lg:border-b w-full py-s lg:py-xl';
|
|
13955
|
-
const TariffsTableRowContainer = JSX(({ children, tableInner, onClick }) => (jsxs("div", { className: style('self-start flex flex-col gap-xl', DIVIDER_STYLE), role: "row", children: [jsx("div", { className: style('flex flex-col lg:flex-row gap-x-5xl gap-y-xs'), children: children }), tableInner ? (jsx("div", { className: "origin-top animate-expansion", children: jsx(InnerTable, { ...tableInner, onClick: onClick }) })) : null] })));
|
|
13956
|
-
|
|
13957
14065
|
const TariffsTableRow = JSX(({ row: { header, data = [] }, ...rest }) => {
|
|
13958
14066
|
const [tableInner, setTableInner] = useState(undefined);
|
|
13959
14067
|
const handleSetTableInner = useCallback((_) => {
|
|
@@ -14026,6 +14134,7 @@
|
|
|
14026
14134
|
CashbackCalculator,
|
|
14027
14135
|
CalculatorRko,
|
|
14028
14136
|
RkoTariffCardsTable,
|
|
14137
|
+
RatesTable,
|
|
14029
14138
|
};
|
|
14030
14139
|
|
|
14031
14140
|
const applyAspects = (aspects) => (ev) => {
|
|
@@ -14150,7 +14259,7 @@
|
|
|
14150
14259
|
slots: () => [HEADER_SLOT, FOOTER_SLOT, STICKY_FOOTER_SLOT],
|
|
14151
14260
|
});
|
|
14152
14261
|
|
|
14153
|
-
const packageVersion = "0.14.
|
|
14262
|
+
const packageVersion = "0.14.1027";
|
|
14154
14263
|
|
|
14155
14264
|
exports.Blocks = Blocks;
|
|
14156
14265
|
exports.ContentPage = ContentPage;
|