({
challenges,
onCreate,
onOpen,
}: {
challenges: Challenge[];
onCreate: () => void;
onOpen: (id: string) => void;
})
| 308 | } |
| 309 | |
| 310 | function HomeView({ |
| 311 | challenges, |
| 312 | onCreate, |
| 313 | onOpen, |
| 314 | }: { |
| 315 | challenges: Challenge[]; |
| 316 | onCreate: () => void; |
| 317 | onOpen: (id: string) => void; |
| 318 | }) { |
| 319 | const [shareMessage, setShareMessage] = useState(""); |
| 320 | const [shareFallbackText, setShareFallbackText] = useState(""); |
| 321 | |
| 322 | async function shareChallenge(challenge: Challenge) { |
| 323 | const text = challengeShareText(challenge); |
| 324 | const copied = await copyText(text); |
| 325 | setShareMessage(copied ? "分享文案已复制。" : "复制失败,可手动复制下面的文案。"); |
| 326 | setShareFallbackText(copied ? "" : text); |
| 327 | } |
| 328 | |
| 329 | return ( |
| 330 | <section className="contentGrid"> |
| 331 | <div className="panel heroPanel"> |
| 332 | <span className="eyebrow">点亮城市</span> |
| 333 | <h1>勾选一个地图区域,让大家一起来点亮。</h1> |
| 334 | <p> |
| 335 | 选择学校、公园、街区或任意地点,生成一个可分享的地图挑战。参与者在范围内走动,经过的区域会被点亮。 |
| 336 | </p> |
| 337 | <div className="heroActions"> |
| 338 | <button className="primaryButton" onClick={onCreate}> |
| 339 | <Plus size={18} /> |
| 340 | 发起挑战 |
| 341 | </button> |
| 342 | <button |
| 343 | className="secondaryButton" |
| 344 | onClick={() => challenges[0] && onOpen(challenges[0].id)} |
| 345 | disabled={!challenges[0]} |
| 346 | > |
| 347 | <Play size={18} /> |
| 348 | 打开最新挑战 |
| 349 | </button> |
| 350 | </div> |
| 351 | </div> |
| 352 | <div className="challengeList"> |
| 353 | {shareMessage ? <div className="inlineNotice">{shareMessage}</div> : null} |
| 354 | {shareFallbackText ? <pre className="shareFallbackText">{shareFallbackText}</pre> : null} |
| 355 | {challenges.length === 0 ? ( |
| 356 | <div className="panel emptyPanel"> |
| 357 | <MapPin /> |
| 358 | <strong>还没有挑战</strong> |
| 359 | <span>现在可以发起第一个地图挑战。</span> |
| 360 | </div> |
| 361 | ) : ( |
| 362 | challenges.map((challenge) => ( |
| 363 | <article |
| 364 | key={challenge.id} |
| 365 | className="challengeCard" |
| 366 | > |
| 367 | <button className="challengeCardMain" onClick={() => onOpen(challenge.id)}> |
nothing calls this directly
no test coverage detected