diff --git a/public/meta.png b/public/meta.png new file mode 100644 index 0000000..51837dd Binary files /dev/null and b/public/meta.png differ diff --git a/src/app/(after-login)/dashboard/[id]/edit/layout.tsx b/src/app/(after-login)/dashboard/[id]/edit/layout.tsx new file mode 100644 index 0000000..f59ee95 --- /dev/null +++ b/src/app/(after-login)/dashboard/[id]/edit/layout.tsx @@ -0,0 +1,35 @@ +import { ReactNode } from 'react'; +import { Metadata } from 'next'; +import axiosServerHelper from '@/utils/network/axiosServerHelper'; +import { Dashboard, dashboardSchema } from '@/apis/dashboards/types'; +import { safeResponse } from '@/utils/network/safeResponse'; + +export async function generateMetadata({ params }: { params: Promise<{ id: string }> }): Promise { + const resolvedParams = await params; + const id = resolvedParams.id; + const response = await axiosServerHelper(`/dashboards/${id}`); + const dashboardDetail = safeResponse(response.data, dashboardSchema); + return { + title: `Taskify - ${dashboardDetail.title} 수정`, + description: 'Taskify 대시보드에서 커뮤니티 일정을 한눈에 관리해 보세요.', + keywords: ['일정', '공유', '커뮤니티', '할 일', 'Taskify'], + openGraph: { + title: `Taskify - ${dashboardDetail.title} 수정`, + description: 'Taskify 대시보드에서 커뮤니티 일정을 한눈에 관리해 보세요.', + url: `https://taskify-lab.vercel.app/dashboard/${id}/edit`, + type: 'website', + images: [ + { + url: 'https://taskify-lab.vercel.app/meta.png', + width: 1200, + height: 630, + alt: 'Taskify 대시보드 수정 페이지 이미지', + }, + ], + }, + }; +} + +export default function Layout({ children }: { children: ReactNode }) { + return <>{children}; +} diff --git a/src/app/(after-login)/dashboard/[id]/page.tsx b/src/app/(after-login)/dashboard/[id]/page.tsx index f2d14db..44cd9b9 100644 --- a/src/app/(after-login)/dashboard/[id]/page.tsx +++ b/src/app/(after-login)/dashboard/[id]/page.tsx @@ -1,5 +1,35 @@ import ColumnList from '@/components/columns/ColumnList'; +import { Metadata } from 'next'; +import axiosServerHelper from '@/utils/network/axiosServerHelper'; +import { Dashboard, dashboardSchema } from '@/apis/dashboards/types'; +import { safeResponse } from '@/utils/network/safeResponse'; -export default function DashboardDetailPage() { +export async function generateMetadata({ params }: { params: Promise<{ id: string }> }): Promise { + const resolvedParams = await params; + const id = resolvedParams.id; + const response = await axiosServerHelper(`/dashboards/${id}`); + const dashboardDetail = safeResponse(response.data, dashboardSchema); + return { + title: `Taskify - ${dashboardDetail.title}`, + description: 'Taskify 대시보드에서 커뮤니티 일정을 한눈에 관리해 보세요.', + keywords: ['일정', '공유', '커뮤니티', '할 일', 'Taskify'], + openGraph: { + title: `Taskify - ${dashboardDetail.title}`, + description: 'Taskify 대시보드에서 커뮤니티 일정을 한눈에 관리해 보세요.', + url: `https://taskify-lab.vercel.app/dashboard/${id}`, + type: 'website', + images: [ + { + url: 'https://taskify-lab.vercel.app/meta.png', + width: 1200, + height: 630, + alt: 'Taskify 대시보드 페이지 이미지', + }, + ], + }, + }; +} + +export default async function DashboardDetailPage() { return ; } diff --git a/src/app/(after-login)/mydashboard/page.tsx b/src/app/(after-login)/mydashboard/page.tsx index 6a011b1..b5c554d 100644 --- a/src/app/(after-login)/mydashboard/page.tsx +++ b/src/app/(after-login)/mydashboard/page.tsx @@ -2,6 +2,26 @@ import MyDashboard from '@/components/dashboard/MyDashboard'; import MyInvitedDashboardList from '@/components/dashboard/MyInvitedDashboardList'; import { Page, PageInner } from '@/components/layout/Page'; +export const metadata = { + title: 'Taskify - 내 대시보드', + description: 'Taskify 내 대시보드에서 개인 일정을 쉽고 편하게 관리해 보세요.', + keywords: ['일정', '공유', '커뮤니티', '할 일', 'Taskify'], + openGraph: { + title: 'Taskify - 내 대시보드', + description: 'Taskify 내 대시보드에서 개인 일정을 쉽고 편하게 관리해 보세요.', + url: 'https://taskify-lab.vercel.app/mydashboard', + type: 'website', + images: [ + { + url: 'https://taskify-lab.vercel.app/meta.png', + width: 1200, + height: 630, + alt: 'Taskify 내 대시보드 이미지', + }, + ], + }, +}; + export default function MydashboardPage() { return ( diff --git a/src/app/(after-login)/mypage/page.tsx b/src/app/(after-login)/mypage/page.tsx index 52d1d98..4114a5f 100644 --- a/src/app/(after-login)/mypage/page.tsx +++ b/src/app/(after-login)/mypage/page.tsx @@ -7,6 +7,26 @@ import GoBackLink from '@/components/ui/Link/GoBackLink'; import axiosServerHelper from '@/utils/network/axiosServerHelper'; import { safeResponse } from '@/utils/network/safeResponse'; +export const metadata = { + title: 'Taskify - 마이페이지', + description: 'Taskify 마이페이지에서 계정 정보와 활동 내역을 한눈에 확인해 보세요.', + keywords: ['일정', '공유', '커뮤니티', '할 일', 'Taskify'], + openGraph: { + title: 'Taskify - 마이페이지', + description: 'Taskify 마이페이지에서 계정 정보와 활동 내역을 한눈에 확인해 보세요.', + url: 'https://taskify-lab.vercel.app/mypage', + type: 'website', + images: [ + { + url: 'https://taskify-lab.vercel.app/meta.png', + width: 1200, + height: 630, + alt: 'Taskify 마이페이지 이미지', + }, + ], + }, +}; + export default async function MyPage() { const response = await axiosServerHelper('/users/me'); const userData = safeResponse(response.data, userSchema); diff --git a/src/app/(before-login)/(auth)/login/page.tsx b/src/app/(before-login)/(auth)/login/page.tsx index 02c5ecf..126e138 100644 --- a/src/app/(before-login)/(auth)/login/page.tsx +++ b/src/app/(before-login)/(auth)/login/page.tsx @@ -2,6 +2,26 @@ import Link from 'next/link'; import LoginForm from '@/components/auth/LoginForm'; import Header from '@/components/auth/Header'; +export const metadata = { + title: 'Taskify - 로그인', + description: 'Taskify에 로그인하고, 함께 일정을 공유하며 더 나은 하루를 시작해 보세요.', + keywords: ['일정', '공유', '커뮤니티', '할 일', 'Taskify'], + openGraph: { + title: 'Taskify - 로그인', + description: 'Taskify에 로그인하고, 함께 일정을 공유하며 더 나은 하루를 시작해 보세요.', + url: 'https://taskify-lab.vercel.app/login', + type: 'website', + images: [ + { + url: 'https://taskify-lab.vercel.app/meta.png', + width: 1200, + height: 630, + alt: 'Taskify 로그인 이미지', + }, + ], + }, +}; + export default function Login() { return ( <> diff --git a/src/app/(before-login)/(auth)/signup/page.tsx b/src/app/(before-login)/(auth)/signup/page.tsx index 43cfd21..75f40b4 100644 --- a/src/app/(before-login)/(auth)/signup/page.tsx +++ b/src/app/(before-login)/(auth)/signup/page.tsx @@ -2,6 +2,26 @@ import Link from 'next/link'; import SignupForm from '@/components/auth/SignupForm'; import Header from '@/components/auth/Header'; +export const metadata = { + title: 'Taskify - 회원가입', + description: '새 계정을 만들고 Taskify와 함께 일정을 공유하며 즐겁게 관리해 보세요.', + keywords: ['일정', '공유', '커뮤니티', '할 일', 'Taskify'], + openGraph: { + title: 'Taskify - 회원가입', + description: '새 계정을 만들고 Taskify와 함께 일정을 공유하며 즐겁게 관리해 보세요.', + url: 'https://taskify-lab.vercel.app/signup', + type: 'website', + images: [ + { + url: 'https://taskify-lab.vercel.app/meta.png', + width: 1200, + height: 630, + alt: 'Taskify 회원가입 이미지', + }, + ], + }, +}; + export default function Signup() { return ( <> diff --git a/src/app/(before-login)/(landings)/layout.tsx b/src/app/(before-login)/(landings)/layout.tsx index 82f61b6..61221dd 100644 --- a/src/app/(before-login)/(landings)/layout.tsx +++ b/src/app/(before-login)/(landings)/layout.tsx @@ -48,6 +48,26 @@ const SNS_LIST: IconLinkItem[] = [ }, ]; +export const metadata = { + title: 'Taskify', + description: 'Taskify는 가족, 회사, 친구들과 함께 일정을 쉽고 즐겁게 관리할 수 있는 서비스입니다.', + keywords: ['일정', '공유', '커뮤니티', '할 일', 'Taskify'], + openGraph: { + title: 'Taskify', + description: 'Taskify는 가족, 회사, 친구들과 함께 일정을 쉽고 즐겁게 관리할 수 있는 서비스입니다.', + url: 'https://taskify-lab.vercel.app/', + type: 'website', + images: [ + { + url: 'https://taskify-lab.vercel.app/meta.png', + width: 1200, + height: 630, + alt: 'Taskify 랜딩 페이지 이미지', + }, + ], + }, +}; + export default function layout({ children }: PropsWithChildren) { return (