31 |
{this.props['data-title']}
32 | {
33 |
34 | /*
35 | * Несмотря на то, что мы пробрасываем направление,
36 | * сам элемент изменит его только спустя какое-то время
37 | */
38 | }
39 |
40 | {marquee}
41 |
42 |
43 | {text}
44 |
45 |
46 | );
47 | }
48 |
49 | public handleClick = () => {
50 | const { isLeft } = this.state;
51 | this.setState({
52 | isLeft: !isLeft
53 | });
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/components/ExtEmbed/README.md:
--------------------------------------------------------------------------------
1 | # ExtEmbed
2 |
3 | Компонент ExtEmbed предназначен для встраивания на Турбо-страницу виджетов,
4 | требующих для своей работы загрузку внешних скриптов.
5 | ExtEmbed оборачивает содержимое виджета в безопасную песочницу c iframe.
6 |
7 | ExtEmbed принимает в качестве пропсов:
8 | * html (обязательный) - строка, содержащая html-разметку, которую необходимо поместить в песочницу;
9 | * iframeClass (опциональный) - строка, содержащая css-класс,
10 | который будет установлен тегу iframe для стилизации виджета (например, указания размеров);
11 | * iframeWidth и iframeHeight (опциональные) - строки для установки тегу iframe ширины и высоты соответственно;
12 | * isLoaded (опциональный) - параметр логического типа, с помощью которого ExtEmbed "поймет", что виджет загрузился,
13 | и скроет выводимую поверх виджета паранджу о загрузке.
14 | При отсутствии параметра ExtEmbed будет опираться на событие iframe.onload для скрытия паранджи.
15 | * onMessage (опциональный) - callback-функция, которая будет вызвана при обработке сообщения postMessage
16 |
17 | В случае необходимости обработки сообщений от виджета
18 | можно передать функцию для обработки сообщений в onMessage компонента ExtEmbed для коммуникации. Компонент ExtEmbed подписывается на сообщения в формате [postMessage](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage). Эти сообщения фильтруются и обрабатываются только сообщения от дочерних iframe. При получении таких сообщений вызваются callback-функции, переданные в пропс `onMessage`. Для обработки на стороне виджета нужно сделать 1 общий обработчик, который внутри будет рабирать сообщени по типам. Этот обработчик следует передавать в `onMessage` компонента ExtEmbed. Пример использования можно найти [тут](https://github.com/turboext/components/blob/master/components/ExtDirectadvertWidget/ExtDirectadvertWidget.tsx)
--------------------------------------------------------------------------------
/components/ExtGrattisTurboWidget/ExtGrattisTurboWidget.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import { ExtEmbed } from '../ExtEmbed/ExtEmbed';
3 |
4 | interface IProps {
5 | 'data-blockid': number;
6 | 'data-width'?: string;
7 | 'data-height'?: string;
8 | }
9 |
10 | const canUseDom = typeof window !== 'undefined' && Boolean(window.document);
11 |
12 | export function ExtGrattisTurboWidget(props: IProps): React.ReactNode {
13 | const {
14 | 'data-blockid': blockId,
15 | 'data-width': width = '100%',
16 | 'data-height': height = '559'
17 | } = props;
18 |
19 | const KEY = 'grattisWidgets';
20 | const URL_WIDGET_JS = '//cdn-widget.grattis.ru/widget-turbo.min.js';
21 |
22 |
23 | let title = '';
24 | let url = '';
25 |
26 | if (canUseDom) {
27 | const H1 = document.getElementsByTagName('h1');
28 |
29 | if (H1 && H1.length > 0) {
30 | title = H1[0].innerText;
31 | } else {
32 | ({ title } = document);
33 | }
34 |
35 | url = location ? `${location.protocol}//${location.host}${location.pathname}` : '';
36 | }
37 |
38 | const html = canUseDom ? `
39 |