From 08e9f14ac4e8ebd31c7120bd0749e32355e0644d Mon Sep 17 00:00:00 2001 From: shchoon Date: Tue, 18 Feb 2025 16:45:42 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Feat:=20=EB=A9=94=EC=9D=B8=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20isr=20=EA=B8=B0=EB=8A=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/action/invalidateHomeData.ts | 7 ++++++ src/app/components/Navbar.tsx | 35 ++++++++++++++++++++++------ src/app/page.tsx | 20 ++++++++-------- src/libs/apis/todayAuthors.ts | 9 +++---- src/libs/apis/todayTopic.ts | 9 +++---- src/libs/isr/GetIndex.ts | 9 +++++++ src/libs/isr/GetRevalidationTime.ts | 7 ------ 7 files changed, 60 insertions(+), 36 deletions(-) create mode 100644 src/app/action/invalidateHomeData.ts create mode 100644 src/libs/isr/GetIndex.ts delete mode 100644 src/libs/isr/GetRevalidationTime.ts diff --git a/src/app/action/invalidateHomeData.ts b/src/app/action/invalidateHomeData.ts new file mode 100644 index 0000000..5beccfe --- /dev/null +++ b/src/app/action/invalidateHomeData.ts @@ -0,0 +1,7 @@ +"use server"; + +import { revalidateTag } from "next/cache"; + +export const InvalidateHomeData = async () => { + revalidateTag("homeData"); +}; diff --git a/src/app/components/Navbar.tsx b/src/app/components/Navbar.tsx index 9f80635..aef5809 100644 --- a/src/app/components/Navbar.tsx +++ b/src/app/components/Navbar.tsx @@ -2,17 +2,41 @@ import Image from "next/image"; import { useRouter } from "next/navigation"; - -import Logo from "/public/Logo.png"; -import BookIcon from "/public/icons/Books.png"; +import { useEffect } from "react"; import { useSearchStore } from "@/stores/searchStore"; import SearchBar from "./SearchBar"; +import { InvalidateHomeData } from "../action/invalidateHomeData"; + +import Logo from "/public/Logo.png"; +import BookIcon from "/public/icons/Books.png"; export default function Navbar() { const router = useRouter(); const { resetSearchState } = useSearchStore(); + useEffect(() => { + revalidateData(); + }, []); + + const revalidateData = async () => { + const currentDate = new Date().getDate(); + + if (localStorage.getItem("date") !== currentDate.toString()) { + await InvalidateHomeData(); + localStorage.setItem("date", currentDate.toString()); + } + }; + + const handleHomeClick = async () => { + if (window.location.pathname === "/") { + return; + } + await revalidateData(); + resetSearchState(); + router.push("/"); + }; + return (
{ - resetSearchState(); - router.push("/"); - }} + onClick={handleHomeClick} />

오늘의 주제

-

{topics[randomIndex]}

+

{topics[index]}

오늘의 작가

-

{authors[randomIndex]}

+

{authors[index]}

diff --git a/src/libs/apis/todayAuthors.ts b/src/libs/apis/todayAuthors.ts index 36d540c..70babd1 100644 --- a/src/libs/apis/todayAuthors.ts +++ b/src/libs/apis/todayAuthors.ts @@ -1,10 +1,7 @@ import authors from "@/data/authors"; -export const todayAuthors = async ( - randomIndex: number, - revalidationTime: number, -) => { - const query = authors[randomIndex]; +export const todayAuthors = async (index: number) => { + const query = authors[index]; const res = await fetch( `${process.env.NEXT_PUBLIC_API_URL}v3/search/book?query=${query}&target=person`, { @@ -13,7 +10,7 @@ export const todayAuthors = async ( "Content-Type": "application/json", Authorization: `KakaoAK ${process.env.NEXT_PUBLIC_KAKAO_API_KEY}`, }, - next: { revalidate: revalidationTime }, + next: { tags: ["homeData"] }, }, ); diff --git a/src/libs/apis/todayTopic.ts b/src/libs/apis/todayTopic.ts index 9044d41..b6a2fc8 100644 --- a/src/libs/apis/todayTopic.ts +++ b/src/libs/apis/todayTopic.ts @@ -1,10 +1,7 @@ import topics from "@/data/topics"; -export const todayTopic = async ( - randomIndex: number, - revalidationTime: number, -) => { - const query = topics[randomIndex]; +export const todayTopic = async (index: number) => { + const query = topics[index]; const res = await fetch( `${process.env.NEXT_PUBLIC_API_URL}v3/search/book?query=${query}`, { @@ -13,7 +10,7 @@ export const todayTopic = async ( "Content-Type": "application/json", Authorization: `KakaoAK ${process.env.NEXT_PUBLIC_KAKAO_API_KEY}`, }, - next: { revalidate: revalidationTime }, + next: { tags: ["homeData"] }, }, ); diff --git a/src/libs/isr/GetIndex.ts b/src/libs/isr/GetIndex.ts new file mode 100644 index 0000000..87d902d --- /dev/null +++ b/src/libs/isr/GetIndex.ts @@ -0,0 +1,9 @@ +export default function GetIndex() { + const currentDate = new Date().getDate(); + + if (currentDate === 31) { + return 7; + } else { + return currentDate % 15; + } +} diff --git a/src/libs/isr/GetRevalidationTime.ts b/src/libs/isr/GetRevalidationTime.ts deleted file mode 100644 index 8732b83..0000000 --- a/src/libs/isr/GetRevalidationTime.ts +++ /dev/null @@ -1,7 +0,0 @@ -export default function GetRevalidationTime() { - const now = new Date(); - const setTime = new Date(); - setTime.setUTCHours(15, 0, 0); - - return (Date.parse(setTime.toString()) - Date.parse(now.toString())) / 1000; -} From 99d44522025074ea7bd4bbcd6c7b400d5839adc2 Mon Sep 17 00:00:00 2001 From: shchoon Date: Tue, 18 Feb 2025 18:08:51 +0900 Subject: [PATCH 2/2] =?UTF-8?q?git-action:=20ci=20git-action=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/CI.yaml | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/CI.yaml diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml new file mode 100644 index 0000000..3c8f27c --- /dev/null +++ b/.github/workflows/CI.yaml @@ -0,0 +1,37 @@ +name: Node.js CI + +on: + push: + branches: + - main + pull_request: + branches: + - main + - dev + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + node: [18, 20] + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + + - name: Install dependencies + run: npm ci + + - name: Run build + run: npm run build + env: + NEXT_PUBLIC_API_URL: ${{ secrets.NEXT_PUBLIC_API_URL}} + NEXT_PUBLIC_KAKAO_API_KEY: ${{ secrets.NEXT_PUBLIC_KAKAO_API_KEY }}