diff --git a/apps/landing/public/spinner.svg b/apps/landing/public/spinner.svg new file mode 100644 index 00000000..654d4a89 --- /dev/null +++ b/apps/landing/public/spinner.svg @@ -0,0 +1,5 @@ + +
+ + +
diff --git a/apps/landing/src/app/StarButton.css b/apps/landing/src/app/StarButton.css new file mode 100644 index 00000000..23331d25 --- /dev/null +++ b/apps/landing/src/app/StarButton.css @@ -0,0 +1,9 @@ +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + diff --git a/apps/landing/src/app/StarButton.tsx b/apps/landing/src/app/StarButton.tsx index f3eb6ed1..71f6dee7 100644 --- a/apps/landing/src/app/StarButton.tsx +++ b/apps/landing/src/app/StarButton.tsx @@ -1,10 +1,37 @@ +'use client' + +import './StarButton.css' + import { Center, css, Flex, Image, Text } from '@devup-ui/react' import Link from 'next/link' +import { useEffect, useState } from 'react' + +export default function StarButton() { + const [starCount, setStarCount] = useState(null) -export default async function StarButton() { - const res = await fetch('https://api.github.com/repos/dev-five-git/devup-ui') - const data = await res.json() - const starCount = data.stargazers_count + useEffect(() => { + const abortController = new AbortController() + const fetchStarCount = async () => { + try { + const data = await fetch( + 'https://api.github.com/repos/dev-five-git/devup-ui', + { + signal: abortController.signal, + }, + ).then((res) => res.json()) + setStarCount(data.stargazers_count) + } catch (error) { + console.error(error) + } finally { + setStarCount((prev) => (typeof prev === 'number' ? prev : -1)) + } + } + fetchStarCount() + + return () => { + abortController.abort() + } + }, []) return ( - - {starCount} - + {starCount === null ? ( + Loading + ) : ( + + {starCount} + + )} diff --git a/apps/landing/src/app/markdown.css b/apps/landing/src/app/markdown.css index 76722b3e..4cf3eb56 100644 --- a/apps/landing/src/app/markdown.css +++ b/apps/landing/src/app/markdown.css @@ -1,4 +1,4 @@ -@import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css'); +@import url(https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css); table { border-collapse: collapse;