diff --git a/package-lock.json b/package-lock.json index 8e8cfeb..9acb102 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "@types/react-dom": "^19", "@types/react-syntax-highlighter": "^15.5.13", "babel-plugin-react-compiler": "1.0.0", + "baseline-browser-mapping": "^2.9.19", "typescript": "^5" } }, @@ -710,15 +711,15 @@ } }, "node_modules/@next/env": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.10.tgz", - "integrity": "sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz", + "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.10.tgz", - "integrity": "sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz", + "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==", "cpu": [ "arm64" ], @@ -732,9 +733,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.10.tgz", - "integrity": "sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz", + "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==", "cpu": [ "x64" ], @@ -748,9 +749,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.10.tgz", - "integrity": "sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz", + "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==", "cpu": [ "arm64" ], @@ -764,9 +765,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.10.tgz", - "integrity": "sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz", + "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==", "cpu": [ "arm64" ], @@ -780,9 +781,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.10.tgz", - "integrity": "sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz", + "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==", "cpu": [ "x64" ], @@ -796,9 +797,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.10.tgz", - "integrity": "sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz", + "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==", "cpu": [ "x64" ], @@ -812,9 +813,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.10.tgz", - "integrity": "sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz", + "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==", "cpu": [ "arm64" ], @@ -828,9 +829,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.10.tgz", - "integrity": "sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz", + "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==", "cpu": [ "x64" ], @@ -988,6 +989,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001760", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", @@ -2360,13 +2370,14 @@ } }, "node_modules/next": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/next/-/next-16.0.10.tgz", - "integrity": "sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", + "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==", "license": "MIT", "dependencies": { - "@next/env": "16.0.10", + "@next/env": "16.1.6", "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" @@ -2378,14 +2389,14 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.0.10", - "@next/swc-darwin-x64": "16.0.10", - "@next/swc-linux-arm64-gnu": "16.0.10", - "@next/swc-linux-arm64-musl": "16.0.10", - "@next/swc-linux-x64-gnu": "16.0.10", - "@next/swc-linux-x64-musl": "16.0.10", - "@next/swc-win32-arm64-msvc": "16.0.10", - "@next/swc-win32-x64-msvc": "16.0.10", + "@next/swc-darwin-arm64": "16.1.6", + "@next/swc-darwin-x64": "16.1.6", + "@next/swc-linux-arm64-gnu": "16.1.6", + "@next/swc-linux-arm64-musl": "16.1.6", + "@next/swc-linux-x64-gnu": "16.1.6", + "@next/swc-linux-x64-musl": "16.1.6", + "@next/swc-win32-arm64-msvc": "16.1.6", + "@next/swc-win32-x64-msvc": "16.1.6", "sharp": "^0.34.4" }, "peerDependencies": { diff --git a/package.json b/package.json index 2c2bfb7..eb1420c 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@types/react-dom": "^19", "@types/react-syntax-highlighter": "^15.5.13", "babel-plugin-react-compiler": "1.0.0", + "baseline-browser-mapping": "^2.9.19", "typescript": "^5" } } diff --git a/src/app/events/[eventId]/page.tsx b/src/app/events/[eventId]/page.tsx index e7a16b6..3ee0ecc 100644 --- a/src/app/events/[eventId]/page.tsx +++ b/src/app/events/[eventId]/page.tsx @@ -3,7 +3,7 @@ import CardList from "@/components/CardList"; import MarkdownContent from "@/components/ui/MarkdownContent"; import PageTitle from "@/components/ui/PageTitle"; import Paper from "@/components/ui/Paper"; -import { getAllEventIds, getEvent, getWorks } from "@/lib/microcms"; +import { getEvent, getWorks } from "@/lib/microcms"; import { unstable_noStore as noStore } from "next/cache"; import { notFound } from "next/navigation"; import styles from "./page.module.css"; @@ -13,17 +13,6 @@ type EventDetailsPageProps = { searchParams: Promise<{ draftKey?: string }>; }; -export const revalidate = 60; - -// 静的パスを生成 -export async function generateStaticParams() { - // getAllEventIdsを使用して全てのイベントIDを取得 - const allEventIds = await getAllEventIds(); - return allEventIds.map((content) => ({ - eventId: content.id, - })); -} - // propsを直接受け取り、paramsをawaitで解決する export default async function EventDetailsPage(props: EventDetailsPageProps) { // paramsオブジェクト自体をawaitで解決 diff --git a/src/app/page.module.css b/src/app/page.module.css index e69de29..8aa9213 100644 --- a/src/app/page.module.css +++ b/src/app/page.module.css @@ -0,0 +1,128 @@ +.container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 4rem 8rem; +} + +.title { + font-family: var(--font-roboto-slab); + font-size: 6rem; + color: #333; + margin-bottom: 2rem; +} + +.lead { + font-size: 1.8rem; + line-height: 1.8; + margin-bottom: 5rem; + text-align: center; +} + +.grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 2rem; + + div { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + svg { + width: 70px; + height: auto; + margin-bottom: 1rem; + } + } +} + +.card-title { + font-size: 2rem; + font-weight: 700; + margin-bottom: 3rem; +} + +.card-body { + font-size: 1.6rem; + color: #444; + margin-bottom: 3rem; +} + +.button { + display: inline-block; + width: 100%; + font-size: 1.6rem; + font-weight: 700; + background: var(--accent); + color: #444; + border-radius: 8px; + text-decoration: none; + text-align: center; + padding: 1.6rem 0; + position: relative; + transition: + background 160ms ease, + transform 160ms ease; + box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.1); +} + +.button::after { + content: "→"; + display: inline-block; + margin-left: 0.6rem; + transform: translateX(0); + transition: transform 160ms ease; + color: inherit; +} + +.button:hover { + background: color-mix(in srgb, var(--accent), #000 10%); +} + +.button:hover::after { + transform: translateX(6px); +} + +.link { + display: inline-block; + text-decoration: underline; + font-size: 1.6rem; + font-weight: 600; + margin-top: 1rem; +} + +@media (max-width: 899px) { + .grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 640px) { + .container { + padding: 2rem 4rem; + } + + .title { + font-size: 4rem; + } + + .lead { + font-size: 1.4rem; + } + + .card-title { + font-size: 1.8rem; + } + + .card-body { + font-size: 1.4rem; + } + + .button { + font-size: 1.4rem; + padding: 1.2rem 0; + } +} diff --git a/src/app/page.tsx b/src/app/page.tsx index ec3dc11..b114182 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,5 +1,54 @@ -import { redirect } from "next/navigation"; +import CalenderIcon from "@/components/CalenderIcon"; +import ProgramCodeIcon from "@/components/ProgramCodeIcon"; +import Paper from "@/components/ui/Paper"; +import Link from "next/link"; +import styles from "./page.module.css"; export default function Home() { - redirect("/events"); + return ( +
+

KCL Works

+ +

+ KCL Works は、KCL(Kyutech Code + Lab)に参加する九州工業大学の学生による作品と活動成果を紹介するポートフォリオサイトです。 +
+ ハッカソン、企業連携イベント、開発プロジェクトなど、学生の挑戦の記録を掲載しています。 +
+ + KCLについてはこちらをご覧ください + +

+

+ +
+ + +

Events

+

+ KCLで行われたハッカソンや企業連携イベントを紹介します。 +

+ + イベントを見る + +
+ + + +

Works

+

+ 学生が制作したアプリやプロダクトを掲載しています。 +

+ + 作品を見る + +
+
+
+ ); } diff --git a/src/app/works/[workId]/page.module.css b/src/app/works/[workId]/page.module.css index ddc131f..4b23de2 100644 --- a/src/app/works/[workId]/page.module.css +++ b/src/app/works/[workId]/page.module.css @@ -23,6 +23,30 @@ } } + .awards-row { + display: flex; + align-items: center; + gap: 1rem; + flex-wrap: wrap; + } + + .awards-label { + font-size: 1.6rem; + font-weight: 700; + margin-bottom: 0; + white-space: nowrap; + min-width: 5.2rem; + } + + .awards { + display: flex; + flex-direction: row; + gap: 0.5rem; + font-size: 1.6rem; + flex-wrap: wrap; + align-items: center; + } + .links { display: flex; flex-direction: column; @@ -88,5 +112,5 @@ align-items: center; height: calc(100vh - 200px); font-size: 1.6rem; - font-weight: 600;; + font-weight: 600; } diff --git a/src/app/works/[workId]/page.tsx b/src/app/works/[workId]/page.tsx index e2124ec..b1b424a 100644 --- a/src/app/works/[workId]/page.tsx +++ b/src/app/works/[workId]/page.tsx @@ -3,11 +3,12 @@ import Hero from "@/components/ui/Hero"; import MarkdownContent from "@/components/ui/MarkdownContent"; import Paper from "@/components/ui/Paper"; import Tag from "@/components/ui/Tag"; -import { getAllWorkIds, getWork } from "@/lib/microcms"; +import { getWork } from "@/lib/microcms"; import { unstable_noStore as noStore } from "next/cache"; import Link from "next/link"; import { notFound } from "next/navigation"; import styles from "./page.module.css"; +import awardFormatter from "@/lib/awardsFormatter"; interface WorkDetailsParams { workId: string; @@ -24,15 +25,6 @@ interface WorkDetailsPageProps { searchParams: Promise; } -export const revalidate = 60; // ページデータの再検証間隔 - -export async function generateStaticParams() { - const allWorkIds = await getAllWorkIds(); // getAllWorkIdsを使用 - return allWorkIds.map((content) => ({ - workId: content.id, - })); -} - export default async function WorkDetailsPage(props: WorkDetailsPageProps) { const params = await props.params; const searchParams = await props.searchParams; @@ -124,6 +116,19 @@ export default async function WorkDetailsPage(props: WorkDetailsPageProps) { )} + {workData.awards && workData.awards.length > 0 && ( + +
+

受賞歴

+
+ {awardFormatter(workData.awards) + .map((award) => `${award.eventTitle} - ${award.awardTitle}`) + .join("、")} +
+
+
+ )} + {workData.details && workData.details.length > 0 && (
{workData.details.map((detail, index) => ( diff --git a/src/components/CalenderIcon/index.tsx b/src/components/CalenderIcon/index.tsx new file mode 100644 index 0000000..a4da0ec --- /dev/null +++ b/src/components/CalenderIcon/index.tsx @@ -0,0 +1,19 @@ +const CalenderIcon = () => { + return ( + + Calender Icon + + + ); +}; + +export default CalenderIcon; diff --git a/src/components/CardList/index.tsx b/src/components/CardList/index.tsx index cb0e169..82bc1d6 100644 --- a/src/components/CardList/index.tsx +++ b/src/components/CardList/index.tsx @@ -3,6 +3,7 @@ import EventCard from "@/components/EventCard"; import WorkCard from "@/components/WorkCard"; import type { Event, Work } from "@/lib/microcms"; import dateFormatter from "@/lib/dateFormater"; +import awardFormatter from "@/lib/awardsFormatter"; interface EventCardListProps { contents: Event[]; @@ -38,6 +39,7 @@ const CardList = ({ contents, isEvent, ...props }: CardListProps) => { id={work.id} title={work.title} thumbnailUrl={work.thumbnail?.url || "/dummy.jpg"} + awards={awardFormatter(work.awards)} tags={ work.tags?.map((tag) => tag.name).filter(Boolean) as | string[] diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx index fe05709..6fd07cb 100644 --- a/src/components/Header/index.tsx +++ b/src/components/Header/index.tsx @@ -1,3 +1,6 @@ +"use client"; + +import { usePathname } from "next/navigation"; import Image from "next/image"; import Link from "next/link"; import Logo from "../../../public/logo_ver2.png"; @@ -5,12 +8,14 @@ import Toggle from "../ui/Toggle"; import styles from "./styles.module.css"; const Header = () => { + const pathname = usePathname(); + return (
- + KCL Works Logo - + {pathname !== "/" && }
); }; diff --git a/src/components/ProgramCodeIcon/index.tsx b/src/components/ProgramCodeIcon/index.tsx new file mode 100644 index 0000000..e303528 --- /dev/null +++ b/src/components/ProgramCodeIcon/index.tsx @@ -0,0 +1,27 @@ +const ProgramCodeIcon = () => { + return ( + + Program Code Icon + + + + + ); +}; + +export default ProgramCodeIcon; diff --git a/src/components/WorkCard/index.tsx b/src/components/WorkCard/index.tsx index 6574d3f..5631d0e 100644 --- a/src/components/WorkCard/index.tsx +++ b/src/components/WorkCard/index.tsx @@ -3,11 +3,14 @@ import Image from "next/image"; import styles from "./styles.module.css"; import Tag from "@/components/ui/Tag"; import Link from "next/link"; +import Badge from "@/components/ui/Badge"; +import type { formattedAward } from "@/lib/awardsFormatter"; interface WorkCardProps { id: string; // idを追加 title: string; thumbnailUrl: string; + awards?: formattedAward[]; tags: string[]; eventId?: string; eventTitle?: string; @@ -17,6 +20,7 @@ const WorkCard = ({ id, title, thumbnailUrl, + awards, tags, eventId, eventTitle, @@ -26,9 +30,20 @@ const WorkCard = ({ ? `/works/${id}?eventId=${eventId}&eventTitle=${encodeURIComponent(eventTitle)}` : `/works/${id}`; + const displayAwards = eventId + ? awards?.filter((a) => a.eventId === eventId) + : awards; + return ( - + + {displayAwards && displayAwards.length > 0 && ( +
+ {displayAwards.map((award) => ( + {award.awardTitle} + ))} +
+ )}
{ + const text = children ?? ""; + const len = text.length; + + let fontSizeRem = 1.6; + if (len > 6) fontSizeRem = 0.8; + else if (len > 4) fontSizeRem = 0.9; + else if (len > 3) fontSizeRem = 1.1; + else if (len > 2) fontSizeRem = 1.4; + + return ( +
+
+

+ {text} +

+
+
+ ); +}; + +export default Badge; diff --git a/src/components/ui/Badge/styles.module.css b/src/components/ui/Badge/styles.module.css new file mode 100644 index 0000000..4b0c720 --- /dev/null +++ b/src/components/ui/Badge/styles.module.css @@ -0,0 +1,61 @@ +.badge-container { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + background-color: #ff5733; + padding: 6px 10px; + max-width: 160px; + min-width: 50px; + min-height: 50px; + border-radius: 2px; +} + +.badge-container:before, +.badge-container:after, +.badge-wrapper, +.badge-wrapper:before { + position: absolute; + background-color: inherit; + width: 100%; + height: 100%; + border-radius: 2px; + content: ""; +} + +.badge-container:before { + transform: rotate(22deg); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} + +.badge-container:after { + transform: rotate(-22deg); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} + +.badge-wrapper { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + z-index: 1; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + width: 100%; +} + +.badge-wrapper:before { + transform: rotate(45deg); + z-index: -1; +} + +.badge { + font-size: 1.6rem; + font-weight: bold; + letter-spacing: 0.02rem; + color: white; + padding: 0.1rem 0.2rem; + text-align: center; + white-space: normal; + word-break: break-word; + line-height: 1.1; +} diff --git a/src/lib/awardsFormatter.ts b/src/lib/awardsFormatter.ts new file mode 100644 index 0000000..addb310 --- /dev/null +++ b/src/lib/awardsFormatter.ts @@ -0,0 +1,19 @@ +export type formattedAward = { + eventId: string; + eventTitle: string; + awardTitle: string; +}; + +export function awardFormatter( + awards: Array | undefined | null, +): formattedAward[] { + if (!Array.isArray(awards)) return []; + + return awards.map((item) => ({ + eventId: String(item?.event?.id ?? ""), + eventTitle: item?.event?.title ?? "", + awardTitle: item?.title ?? "", + })); +} + +export default awardFormatter; diff --git a/src/lib/microcms.ts b/src/lib/microcms.ts index 81be498..8b21166 100644 --- a/src/lib/microcms.ts +++ b/src/lib/microcms.ts @@ -22,9 +22,15 @@ export interface Event extends MicroCMSListContent { thumbnail?: MicroCMSImage; } +export interface Award extends MicroCMSListContent { + title: string; + event: Event; +} + export interface Work extends MicroCMSListContent { title: string; creators: string; + awards?: Award[]; description: string; details: WorkDetail[]; thumbnail?: MicroCMSImage; @@ -47,9 +53,15 @@ export const client = createClient({ }); export const getEvents = async (queries?: MicroCMSQueries) => { + const minDate = "2010-01-01"; + const minDateFilter = `date[greater_than]${minDate}`; + const combinedFilters = queries?.filters + ? `${queries.filters} and ${minDateFilter}` + : minDateFilter; + return client.getList({ endpoint: "events", - queries, + queries: { ...queries, filters: combinedFilters }, }); }; @@ -86,10 +98,22 @@ export const getAllEventIds = async ( let offset = 0; const limit = 100; // microCMSの最大取得件数 + const minDate = "2010-01-01"; + const minDateFilter = `date[greater_than_or_equal]${minDate}`; + const baseFilters = queries?.filters + ? `${queries.filters} and ${minDateFilter}` + : minDateFilter; + while (true) { const data = await client.getList({ endpoint: "events", - queries: { ...queries, fields: "id", limit, offset }, + queries: { + ...queries, + fields: "id", + limit, + offset, + filters: baseFilters, + }, }); allContentIds = [