|
| 1 | +import React, { useState } from 'react'; |
| 2 | +import styles from './ActivityComments.module.css'; |
| 3 | + |
| 4 | +const mockEvent = { |
| 5 | + name: 'Event Name', |
| 6 | + location: 'San Francisco, CA 94108', |
| 7 | + link: 'https://devforum.zoom.us', |
| 8 | + date: 'Monday, Sept 2', |
| 9 | + time: '9:00 AM - 11:00 AM EDT', |
| 10 | + organizer: 'Alex Brain', |
| 11 | + capacity: '7 / 20', |
| 12 | + rating: 4, |
| 13 | + status: 'Activated', |
| 14 | + avatars: [ |
| 15 | + 'https://randomuser.me/api/portraits/women/44.jpg', |
| 16 | + 'https://randomuser.me/api/portraits/men/45.jpg', |
| 17 | + 'https://randomuser.me/api/portraits/women/46.jpg', |
| 18 | + 'https://randomuser.me/api/portraits/men/47.jpg', |
| 19 | + 'https://randomuser.me/api/portraits/women/48.jpg', |
| 20 | + ], |
| 21 | +}; |
| 22 | + |
| 23 | +const mockComments = Array.from({ length: 3 }).map((_, idx) => ({ |
| 24 | + id: idx + 1, |
| 25 | + name: 'Jane Doe', |
| 26 | + profilePic: 'https://randomuser.me/api/portraits/women/44.jpg', |
| 27 | + timestamp: '5 min ago', |
| 28 | + text: |
| 29 | + 'this is activity comments. this is activity comments this is activity comments this is activity comments this is activity comments this is activity comments this is activity comments this is activity comments', |
| 30 | + visibility: 'Public', |
| 31 | + upvotes: 1, |
| 32 | + downvotes: 0, |
| 33 | +})); |
| 34 | + |
| 35 | +function ActivityComments() { |
| 36 | + const [activeTab, setActiveTab] = useState('Engagement'); |
| 37 | + const [commentTab, setCommentTab] = useState('Comment'); |
| 38 | + const [comments, setComments] = useState(mockComments); |
| 39 | + const [commentInput, setCommentInput] = useState(''); |
| 40 | + const [sortType, setSortType] = useState('Newest'); |
| 41 | + |
| 42 | + const handlePostComment = () => { |
| 43 | + if (!commentInput.trim()) return; |
| 44 | + setComments([ |
| 45 | + { |
| 46 | + id: comments.length + 1, |
| 47 | + name: 'Jane Doe', |
| 48 | + profilePic: 'https://randomuser.me/api/portraits/women/44.jpg', |
| 49 | + timestamp: 'Just now', |
| 50 | + text: commentInput, |
| 51 | + visibility: 'Public', |
| 52 | + upvotes: 0, |
| 53 | + downvotes: 0, |
| 54 | + }, |
| 55 | + ...comments, |
| 56 | + ]); |
| 57 | + setCommentInput(''); |
| 58 | + }; |
| 59 | + |
| 60 | + return ( |
| 61 | + <div> |
| 62 | + {/* Event Card */} |
| 63 | + <div className={styles.eventCard}> |
| 64 | + <div> |
| 65 | + <div className={styles.eventImage}>Finished</div> |
| 66 | + </div> |
| 67 | + <div className={styles.eventDetails}> |
| 68 | + <div style={{ display: 'flex', alignItems: 'center', gap: '12px', marginBottom: 8 }}> |
| 69 | + <span className={styles.eventMetaItem}>Event</span> |
| 70 | + <span className={styles.eventMetaItem}>/ In-person</span> |
| 71 | + </div> |
| 72 | + <div className={styles.eventTitle}>{mockEvent.name}</div> |
| 73 | + <div className={styles.eventMeta}> |
| 74 | + <span className={styles.eventMetaItem}>Location: {mockEvent.location}</span> |
| 75 | + <span className={styles.eventMetaItem}> |
| 76 | + Link:{' '} |
| 77 | + <a href={mockEvent.link} target="_blank" rel="noopener noreferrer"> |
| 78 | + {mockEvent.link} |
| 79 | + </a> |
| 80 | + </span> |
| 81 | + </div> |
| 82 | + <div className={styles.eventMeta}> |
| 83 | + <span className={styles.eventMetaItem}>Date: {mockEvent.date}</span> |
| 84 | + <span className={styles.eventMetaItem}>Time: {mockEvent.time}</span> |
| 85 | + <span className={styles.eventMetaItem}>Organizer: {mockEvent.organizer}</span> |
| 86 | + </div> |
| 87 | + <div className={styles.eventMeta}> |
| 88 | + <span className={styles.eventMetaItem}>Capacity: {mockEvent.capacity}</span> |
| 89 | + <span className={styles.eventMetaItem}> |
| 90 | + Overall Rating: {'★'.repeat(mockEvent.rating) + '☆'.repeat(5 - mockEvent.rating)} |
| 91 | + </span> |
| 92 | + <span className={styles.eventStatus}>Activated</span> |
| 93 | + </div> |
| 94 | + <div className={styles.eventAvatars}> |
| 95 | + {mockEvent.avatars.map((src, i) => ( |
| 96 | + <img key={i} src={src} alt="avatar" className={styles.avatar} /> |
| 97 | + ))} |
| 98 | + <span style={{ color: '#888', fontSize: '1rem', marginLeft: 4 }}>+5</span> |
| 99 | + </div> |
| 100 | + </div> |
| 101 | + <div className={styles.calendar}> |
| 102 | + <div style={{ fontWeight: 500, marginBottom: 8 }}>September 2024</div> |
| 103 | + <table style={{ width: '100%', fontSize: '0.95rem' }}> |
| 104 | + <thead> |
| 105 | + <tr style={{ color: '#888' }}> |
| 106 | + <th>S</th> |
| 107 | + <th>M</th> |
| 108 | + <th>T</th> |
| 109 | + <th>W</th> |
| 110 | + <th>T</th> |
| 111 | + <th>F</th> |
| 112 | + <th>S</th> |
| 113 | + </tr> |
| 114 | + </thead> |
| 115 | + <tbody> |
| 116 | + <tr> |
| 117 | + <td>1</td> |
| 118 | + <td>2</td> |
| 119 | + <td>3</td> |
| 120 | + <td>4</td> |
| 121 | + <td>5</td> |
| 122 | + <td>6</td> |
| 123 | + <td>7</td> |
| 124 | + </tr> |
| 125 | + <tr> |
| 126 | + <td>8</td> |
| 127 | + <td>9</td> |
| 128 | + <td>10</td> |
| 129 | + <td>11</td> |
| 130 | + <td>12</td> |
| 131 | + <td>13</td> |
| 132 | + <td>14</td> |
| 133 | + </tr> |
| 134 | + <tr> |
| 135 | + <td>15</td> |
| 136 | + <td>16</td> |
| 137 | + <td>17</td> |
| 138 | + <td>18</td> |
| 139 | + <td>19</td> |
| 140 | + <td>20</td> |
| 141 | + <td>21</td> |
| 142 | + </tr> |
| 143 | + <tr> |
| 144 | + <td>22</td> |
| 145 | + <td>23</td> |
| 146 | + <td>24</td> |
| 147 | + <td>25</td> |
| 148 | + <td>26</td> |
| 149 | + <td>27</td> |
| 150 | + <td>28</td> |
| 151 | + </tr> |
| 152 | + <tr> |
| 153 | + <td>29</td> |
| 154 | + <td>30</td> |
| 155 | + <td colSpan={5}></td> |
| 156 | + </tr> |
| 157 | + </tbody> |
| 158 | + </table> |
| 159 | + </div> |
| 160 | + </div> |
| 161 | + |
| 162 | + {/* Tabs */} |
| 163 | + <div className={styles.tabs}> |
| 164 | + <button |
| 165 | + className={`${styles.tab} ${activeTab === 'Description' ? styles.tabActive : ''}`} |
| 166 | + onClick={() => setActiveTab('Description')} |
| 167 | + > |
| 168 | + Description |
| 169 | + </button> |
| 170 | + <button |
| 171 | + className={`${styles.tab} ${activeTab === 'Analysis' ? styles.tabActive : ''}`} |
| 172 | + onClick={() => setActiveTab('Analysis')} |
| 173 | + > |
| 174 | + Analysis |
| 175 | + </button> |
| 176 | + <button |
| 177 | + className={`${styles.tab} ${activeTab === 'Resource' ? styles.tabActive : ''}`} |
| 178 | + onClick={() => setActiveTab('Resource')} |
| 179 | + > |
| 180 | + Resource |
| 181 | + </button> |
| 182 | + <button |
| 183 | + className={`${styles.tab} ${activeTab === 'Engagement' ? styles.tabActive : ''}`} |
| 184 | + onClick={() => setActiveTab('Engagement')} |
| 185 | + > |
| 186 | + Engagement |
| 187 | + </button> |
| 188 | + </div> |
| 189 | + |
| 190 | + {/* Engagement Tab Content */} |
| 191 | + {activeTab === 'Engagement' && ( |
| 192 | + <div> |
| 193 | + <div className={styles.commentTabs}> |
| 194 | + <button |
| 195 | + className={`${styles.commentTabBtn} ${ |
| 196 | + commentTab === 'Comment' ? styles.commentTabBtnActive : '' |
| 197 | + }`} |
| 198 | + onClick={() => setCommentTab('Comment')} |
| 199 | + > |
| 200 | + Comment |
| 201 | + </button> |
| 202 | + <button |
| 203 | + className={`${styles.commentTabBtn} ${ |
| 204 | + commentTab === 'Feedback' ? styles.commentTabBtnActive : '' |
| 205 | + }`} |
| 206 | + onClick={() => setCommentTab('Feedback')} |
| 207 | + > |
| 208 | + Feedback |
| 209 | + </button> |
| 210 | + </div> |
| 211 | + |
| 212 | + {/* Comment Section */} |
| 213 | + {commentTab === 'Comment' && ( |
| 214 | + <div> |
| 215 | + <div className={styles.commentHeaderRow}> |
| 216 | + <span className={styles.commentCount}> |
| 217 | + Comment <span style={{ color: '#888', fontWeight: 400 }}>25</span> |
| 218 | + </span> |
| 219 | + <button className={styles.sortBtn}> |
| 220 | + <span style={{ fontSize: '1.1em' }}>⇅</span> Sort |
| 221 | + </button> |
| 222 | + </div> |
| 223 | + <div className={styles.commentBox}> |
| 224 | + <img |
| 225 | + src="https://randomuser.me/api/portraits/women/44.jpg" |
| 226 | + alt="profile" |
| 227 | + className={styles.commentProfilePic} |
| 228 | + /> |
| 229 | + <textarea |
| 230 | + className={styles.commentInput} |
| 231 | + rows={2} |
| 232 | + placeholder="Write a comment..." |
| 233 | + value={commentInput} |
| 234 | + onChange={e => setCommentInput(e.target.value)} |
| 235 | + /> |
| 236 | + <button className={styles.postBtn} onClick={handlePostComment}> |
| 237 | + Post |
| 238 | + </button> |
| 239 | + </div> |
| 240 | + <div className={styles.commentsList}> |
| 241 | + {comments.map(comment => ( |
| 242 | + <div key={comment.id} className={styles.commentItem}> |
| 243 | + <div className={styles.commentTopRow}> |
| 244 | + <img |
| 245 | + src={comment.profilePic} |
| 246 | + alt="profile" |
| 247 | + className={styles.commentProfilePic} |
| 248 | + /> |
| 249 | + <span className={styles.commentName}>{comment.name}</span> |
| 250 | + <span className={styles.commentTimestamp}>{comment.timestamp}</span> |
| 251 | + <span className={styles.commentVisibility}>{comment.visibility}</span> |
| 252 | + </div> |
| 253 | + <div className={styles.commentText}>{comment.text}</div> |
| 254 | + <div className={styles.commentActionsRow}> |
| 255 | + <button className={styles.upvoteBtn}> |
| 256 | + <span style={{ fontSize: '1.1em' }}>↑</span> |
| 257 | + </button> |
| 258 | + <button className={styles.downvoteBtn}> |
| 259 | + <span style={{ fontSize: '1.1em' }}>↓</span> |
| 260 | + </button> |
| 261 | + <button className={styles.replyBtn}> |
| 262 | + <span style={{ fontSize: '1.1em' }}>💬</span> |
| 263 | + </button> |
| 264 | + </div> |
| 265 | + </div> |
| 266 | + ))} |
| 267 | + </div> |
| 268 | + <button className={styles.loadMoreBtn}>Load More</button> |
| 269 | + </div> |
| 270 | + )} |
| 271 | + |
| 272 | + {/* Feedback Section */} |
| 273 | + {commentTab === 'Feedback' && ( |
| 274 | + <div style={{ padding: '32px', color: '#888' }}>Feedback section coming soon.</div> |
| 275 | + )} |
| 276 | + </div> |
| 277 | + )} |
| 278 | + </div> |
| 279 | + ); |
| 280 | +} |
| 281 | + |
| 282 | +export default ActivityComments; |
0 commit comments