1
- import React , { useMemo } from 'react' ;
1
+ import React , { useMemo , useState , useEffect } from 'react' ;
2
2
import styled from 'styled-components' ;
3
3
import media from '../../lib/styles/media' ;
4
4
import { useQuery } from '@apollo/react-hooks' ;
@@ -14,6 +14,7 @@ import { Link } from 'react-router-dom';
14
14
import gtag from '../../lib/gtag' ;
15
15
import optimizeImage from '../../lib/optimizeImage' ;
16
16
import RelatedPostAd from './RelatedPostAd' ;
17
+ import { ellipsis } from '../../lib/styles/utils' ;
17
18
// import { detectAnyAdblocker } from 'just-detect-adblock';
18
19
19
20
function RelatedPostsForGuest ( {
@@ -29,6 +30,19 @@ function RelatedPostsForGuest({
29
30
} ,
30
31
} ) ;
31
32
33
+ const [ isMobile , setIsMobile ] = useState ( false ) ;
34
+
35
+ useEffect ( ( ) => {
36
+ setIsMobile ( window . innerWidth < 519 ) ;
37
+ const handler = ( ) => {
38
+ setIsMobile ( window . innerWidth < 519 ) ;
39
+ } ;
40
+ window . addEventListener ( 'resize' , handler ) ;
41
+ return ( ) => {
42
+ window . removeEventListener ( 'resize' , handler ) ;
43
+ } ;
44
+ } , [ ] ) ;
45
+
32
46
const postsWithAds = useMemo ( ( ) => {
33
47
if ( ! data ?. post ) return null ;
34
48
let sliced : ( PartialPost | undefined ) [ ] =
@@ -60,13 +74,52 @@ function RelatedPostsForGuest({
60
74
61
75
if ( ! postsWithAds ) return null ;
62
76
77
+ if ( isMobile ) {
78
+ return (
79
+ < Wrapper >
80
+ < h4 > 관심 있을 만한 포스트</ h4 >
81
+ { postsWithAds . map ( ( post , index ) => {
82
+ return post ? (
83
+ < Row key = { post . id ?? index } >
84
+ < div className = "fourty" >
85
+ < div className = "thumbnail-wrapper" >
86
+ < img
87
+ src = { optimizeImage (
88
+ post . thumbnail ??
89
+ post . user . profile . thumbnail ??
90
+ userThumbnail ,
91
+ 640 ,
92
+ ) }
93
+ alt = { post . title }
94
+ />
95
+ </ div >
96
+ </ div >
97
+ < div className = "content" >
98
+ < h5 > { post . title } </ h5 >
99
+ < p >
100
+ { post . short_description . replace ( / & # x 3 A ; / g, ':' ) }
101
+ { post . short_description . length === 150 && '...' }
102
+ </ p >
103
+ </ div >
104
+ </ Row >
105
+ ) : (
106
+ < RelatedPostAd isMobile />
107
+ ) ;
108
+ } ) }
109
+ </ Wrapper >
110
+ ) ;
111
+ }
112
+
63
113
return (
64
114
< Wrapper >
65
115
< h4 > 관심 있을 만한 포스트</ h4 >
66
116
< Grid >
67
- { postsWithAds . map ( ( post ) =>
117
+ { postsWithAds . map ( ( post , index ) =>
68
118
post ? (
69
- < Item onClick = { ( ) => gtag ( 'event' , 'recommend_guest_click' ) } >
119
+ < Item
120
+ onClick = { ( ) => gtag ( 'event' , 'recommend_guest_click' ) }
121
+ key = { post . id ?? index }
122
+ >
70
123
< StyledLink to = { `/@${ post . user . username } /${ post . url_slug } ` } >
71
124
< div className = "thumbnail-wrapper" >
72
125
< img
@@ -83,7 +136,7 @@ function RelatedPostsForGuest({
83
136
</ StyledLink >
84
137
</ Item >
85
138
) : (
86
- < Item >
139
+ < Item style = { { margin : '-3.375rem' } } >
87
140
< RelatedPostAd />
88
141
</ Item >
89
142
) ,
@@ -115,6 +168,55 @@ const Grid = styled.div`
115
168
margin-top: 1.5rem;
116
169
` ;
117
170
171
+ const Row = styled . div `
172
+ display: flex;
173
+ .fourty {
174
+ width: 40%;
175
+ margin-right: 0.75rem;
176
+ }
177
+ .thumbnail-wrapper {
178
+ width: 100%;
179
+ padding-top: 52.35%;
180
+ position: relative;
181
+
182
+ img {
183
+ position: absolute;
184
+ left: 0;
185
+ top: 0;
186
+ width: 100%;
187
+ height: 100%;
188
+ object-fit: cover;
189
+ display: block;
190
+ }
191
+ }
192
+ & + & {
193
+ margin-top: 0.5rem;
194
+ }
195
+ .content {
196
+ width: 60%;
197
+ }
198
+ h5 {
199
+ margin-top: 0;
200
+ margin-bottom: 0.625rem;
201
+ font-size: 0.875rem;
202
+ color: ${ palette . gray8 } ;
203
+ ${ ellipsis }
204
+ }
205
+
206
+ p {
207
+ margin: 0;
208
+ font-size: 0.75rem;
209
+ display: -webkit-box;
210
+ -webkit-line-clamp: 3;
211
+ line-height: 1.5;
212
+ height: 3.375rem;
213
+ overflow: hidden;
214
+ word-break: keep-all;
215
+ color: ${ palette . gray6 } ;
216
+ -webkit-box-orient: vertical;
217
+ }
218
+ ` ;
219
+
118
220
const Item = styled . div `
119
221
position: relative;
120
222
width: 33.333%;
0 commit comments