@meduza/ui-kit-2 0.1.24 → 0.1.26

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.
@@ -1,2 +1,2 @@
1
- declare const postMessage: (element: string, action: string) => void;
1
+ declare const postMessage: (category: string, element: string, action: string) => void;
2
2
  export default postMessage;
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.24",
2
+ "version": "0.1.26",
3
3
  "license": "MIT",
4
4
  "description": "UIKit for Meduza",
5
5
  "repository": "https://github.com/meduza-corp/ui-kit-2.git",
@@ -40,7 +40,7 @@ export const Image: React.FC<ImageProps> = ({
40
40
  return
41
41
  }
42
42
 
43
- postMessage('fullscreen_click', 'click')
43
+ postMessage('', 'fullscreen_click', 'click')
44
44
  lightBox.show(optimized, width, height, alt)
45
45
  }
46
46
 
@@ -13,5 +13,6 @@ export interface RelatedBlockProps {
13
13
  }
14
14
  only_on?: string
15
15
  }
16
+ trackClick?: boolean
16
17
  styleContext?: string[] | string
17
18
  }
@@ -1,6 +1,8 @@
1
1
  import React from 'react'
2
2
  import { RelatedBlockProps } from './RelatedBlock.types'
3
3
  import { makeClassName, ClassNames } from '../utils/makeClassName'
4
+ import postMessage from '../utils/postMessage'
5
+
4
6
  import makeStyleContext from '../utils/makeStyleContext'
5
7
 
6
8
  import styles from './RelatedBlock.module.css'
@@ -10,6 +12,7 @@ export const RelatedBlock: React.FC<RelatedBlockProps> = ({
10
12
  data: { title, related },
11
13
  only_on: onlyOn
12
14
  },
15
+ trackClick,
13
16
  styleContext
14
17
  }) => {
15
18
  let classNames: ClassNames = [
@@ -21,6 +24,12 @@ export const RelatedBlock: React.FC<RelatedBlockProps> = ({
21
24
  classNames = makeStyleContext(classNames, styleContext, styles)
22
25
  }
23
26
 
27
+ const handleClick = (url) => {
28
+ if (trackClick) {
29
+ postMessage('simpleRelated', url, 'click')
30
+ }
31
+ }
32
+
24
33
  return (
25
34
  <div data-testid="related-block" className={makeClassName(classNames)}>
26
35
  <h3 className={styles.header}>{title}</h3>
@@ -31,6 +40,7 @@ export const RelatedBlock: React.FC<RelatedBlockProps> = ({
31
40
  href={item.full_url || `/${item.url}`}
32
41
  target="_blank"
33
42
  rel="noopener noreferrer"
43
+ onClick={(): void => handleClick(item.full_url || item.url)}
34
44
  >
35
45
  <span className={styles.first}>{item.title}</span>
36
46
  {item.second_title && ' '}
@@ -37,6 +37,15 @@
37
37
  box-shadow: inset 0 4px #b88b59, inset 0 5px rgba(0, 0, 0, 0.2);
38
38
  }
39
39
 
40
+ .root,
41
+ .wrapper {
42
+ margin: 16px 0;
43
+
44
+ @media $portraitTablet {
45
+ margin: 25px 0;
46
+ }
47
+ }
48
+
40
49
  .overlay,
41
50
  .overlayHeader {
42
51
  position: absolute;
@@ -55,12 +64,14 @@
55
64
  top: 0;
56
65
 
57
66
  height: 150px;
58
-
59
-
60
67
  }
61
68
 
62
69
  .isRich .overlayHeader {
63
- background: linear-gradient(180deg, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 97%);
70
+ background: linear-gradient(
71
+ 180deg,
72
+ rgba(0, 0, 0, 0.5) 0%,
73
+ rgba(0, 0, 0, 0) 97%
74
+ );
64
75
  }
65
76
 
66
77
  .body {
@@ -17,6 +17,7 @@ const Example: React.FC = () => {
17
17
  return (
18
18
  <>
19
19
  <div className={styles.root}>
20
+ <div style={{ height: '1000px' }}></div>
20
21
  <div className={styles.card}>
21
22
  <RelatedRichBlock block={mock.rich} styleContext={['no_mods']} />
22
23
  </div>
@@ -1,7 +1,9 @@
1
1
  /* eslint-disable react/jsx-no-target-blank */
2
2
  import React, { useState, useEffect } from 'react'
3
+ import { useInView } from 'react-intersection-observer'
3
4
  import { RelatedRichBlockProps } from './RelatedRichBlock.types'
4
5
 
6
+ import postMessage from '../utils/postMessage'
5
7
  import { makeClassName, ClassNames } from '../utils/makeClassName'
6
8
  import makeStyleContext from '../utils/makeStyleContext'
7
9
  import generateGradient from '../utils/generateGradient'
@@ -30,15 +32,35 @@ export const RelatedRichBlock: React.FC<RelatedRichBlockProps> = ({
30
32
  const style: React.CSSProperties = {}
31
33
  const styleHeader: React.CSSProperties = {}
32
34
 
33
- const [isRich, setIsRich] = useState(false)
35
+ const [type, setType] = useState('unset')
34
36
 
35
37
  const cardType = `is${toCapitalize(layout)}`
36
38
 
37
39
  useEffect(() => {
38
- // setIsRich(Math.random() >= 0.5)
39
- setIsRich(true)
40
+ setType(Math.random() >= 0.5 ? 'simpleRelated' : 'richRelated')
40
41
  }, [])
41
42
 
43
+ const [ref, inView] = useInView({
44
+ threshold: 0,
45
+ triggerOnce: true
46
+ })
47
+
48
+ useEffect(() => {
49
+ if (inView) {
50
+ if (
51
+ (onlyOn === 'mobile' && window.innerWidth <= 511) ||
52
+ (onlyOn === 'desktop' && window.innerWidth >= 512) ||
53
+ !onlyOn
54
+ ) {
55
+ postMessage(type, url, 'view')
56
+ }
57
+ }
58
+ }, [inView])
59
+
60
+ const handleClick = () => {
61
+ postMessage(type, url, 'click')
62
+ }
63
+
42
64
  let classNames: ClassNames = [
43
65
  [styles.root, true],
44
66
  [styles[cardType], !!layout && !!styles[cardType]],
@@ -69,8 +91,16 @@ export const RelatedRichBlock: React.FC<RelatedRichBlockProps> = ({
69
91
  )
70
92
  }
71
93
 
72
- if (!isRich) {
73
- return <RelatedBlock block={fallback} />
94
+ if (type === 'unset') {
95
+ return <div className={styles.wrapper} />
96
+ }
97
+
98
+ if (type === 'simpleRelated') {
99
+ return (
100
+ <div ref={ref} className={styles.wrapper}>
101
+ <RelatedBlock block={fallback} trackClick={true} />
102
+ </div>
103
+ )
74
104
  }
75
105
 
76
106
  return (
@@ -79,6 +109,8 @@ export const RelatedRichBlock: React.FC<RelatedRichBlockProps> = ({
79
109
  className={makeClassName(classNames)}
80
110
  href={url}
81
111
  target="_blank"
112
+ onClick={(): void => handleClick()}
113
+ ref={ref}
82
114
  >
83
115
  {layout === 'rich' && (
84
116
  <>
@@ -41,7 +41,7 @@
41
41
  {
42
42
  "type": "rich_title",
43
43
  "data": {
44
- "first": "«Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
44
+ "first": "1 «Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
45
45
  "second": "Автор фильма «Котлован» — о том, как сделал его из обращений россиян к Путину",
46
46
  "as": "h3",
47
47
  "featured": false
@@ -114,7 +114,7 @@
114
114
  {
115
115
  "type": "rich_title",
116
116
  "data": {
117
- "first": "«Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
117
+ "first": "2 «Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
118
118
  "second": "Автор фильма «Котлован» — о том, как сделал его из обращений россиян к Путину",
119
119
  "as": "h3",
120
120
  "featured": false
@@ -187,7 +187,7 @@
187
187
  {
188
188
  "type": "rich_title",
189
189
  "data": {
190
- "first": "«Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
190
+ "first": "3 «Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
191
191
  "second": "Автор фильма «Котлован» — о том, как сделал его из обращений россиян к Путину",
192
192
  "as": "h3",
193
193
  "featured": false
@@ -260,7 +260,7 @@
260
260
  {
261
261
  "type": "rich_title",
262
262
  "data": {
263
- "first": "«В биеннале есть что-то очень садистское»",
263
+ "first": "4 «В биеннале есть что-то очень садистское»",
264
264
  "second": "Куратор Венецианской биеннале современного искусства Ральф Ругофф — как он добивался, чтобы выставка не была для зрителей мучением",
265
265
  "as": "h3",
266
266
  "featured": true
@@ -327,7 +327,7 @@
327
327
  {
328
328
  "type": "rich_title",
329
329
  "data": {
330
- "first": "До «обнуления» много говорили, что Путин в 2024 году может уйти в Госсовет. Теперь закон о нем внесли в Думу. Что там сказано?",
330
+ "first": "5 До «обнуления» много говорили, что Путин в 2024 году может уйти в Госсовет. Теперь закон о нем внесли в Думу. Что там сказано?",
331
331
  "as": "h3",
332
332
  "featured": false
333
333
  },
@@ -28,13 +28,13 @@ export const Spoiler: React.FC<SpoilerProps> = ({
28
28
  setSpoiled(!spoiled)
29
29
 
30
30
  if (spoiled) {
31
- postMessage('closeSpoiler', 'click')
31
+ postMessage('', 'closeSpoiler', 'click')
32
32
  const rect = ref.current.getBoundingClientRect()
33
33
  if (rect.top < 0) {
34
34
  ref.current.scrollIntoView({ behavior: 'smooth' })
35
35
  }
36
36
  } else {
37
- postMessage('openSpoiler', 'click')
37
+ postMessage('', 'openSpoiler', 'click')
38
38
  }
39
39
  }
40
40
 
@@ -1,9 +1,14 @@
1
1
  const POST_MESSAGE_PREFIX = 'mdzKitMsg'
2
2
 
3
- const postMessage = (element: string, action: string): void => {
3
+ const postMessage = (
4
+ category: string,
5
+ element: string,
6
+ action: string
7
+ ): void => {
4
8
  const target = window.top
5
9
 
6
10
  const msg = `${POST_MESSAGE_PREFIX}=${JSON.stringify({
11
+ category,
7
12
  element,
8
13
  action
9
14
  })}`