Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions app/admin/AdminLayoutClient.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
'use client';

import { SessionProvider } from 'next-auth/react';
import { Suspense } from 'react';
import ProtectedRoute from '@/app/entities/common/Layout/ProtectedRoute';
import SVGLoadingSpinner from '@/app/entities/common/Loading/SVGLoadingSpinner';

interface AdminLayoutClientProps {
children: React.ReactNode;
}

const AdminLayoutClient = ({ children }: AdminLayoutClientProps) => {
return (
<SessionProvider>
<ProtectedRoute>
<Suspense fallback={<SVGLoadingSpinner />}>{children}</Suspense>
</ProtectedRoute>
</SessionProvider>
);
};

export default AdminLayoutClient;
24 changes: 12 additions & 12 deletions app/admin/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
'use client';
import { SessionProvider } from 'next-auth/react';
import { Suspense } from 'react';
import ProtectedRoute from '@/app/entities/common/Layout/ProtectedRoute';
import SVGLoadingSpinner from '@/app/entities/common/Loading/SVGLoadingSpinner';
import type { Metadata } from 'next';
import AdminLayoutClient from './AdminLayoutClient';

export const metadata: Metadata = {
title: '관리자 | ShipFriend TechBlog',
robots: {
index: false,
follow: false,
googleBot: { index: false, follow: false },
},
};

interface AdminPageLayoutProps {
children: React.ReactNode;
}

const AdminPageLayout = ({ children }: AdminPageLayoutProps) => {
return (
<SessionProvider>
<ProtectedRoute>
<Suspense fallback={<SVGLoadingSpinner />}>{children}</Suspense>
</ProtectedRoute>
</SessionProvider>
);
return <AdminLayoutClient>{children}</AdminLayoutClient>;
};

export default AdminPageLayout;
2 changes: 1 addition & 1 deletion app/api/portfolio/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ const shipfriend: PortfolioItem = {
url: '/posts/%EB%8B%A4%ED%81%AC%EB%AA%A8%EB%93%9C-fouc-%EA%B9%9C%EB%B9%A1%EC%9E%84-%ED%98%84%EC%83%81-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0',
},
],
mainImage: '/plane.png',
mainImage: '/images/projects/shipfriend/main.webp',
images: [
'/images/projects/shipfriend/bloglist.webp',
'/images/projects/shipfriend/blog-detail.webp',
Expand Down
10 changes: 7 additions & 3 deletions app/atelier/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Metadata } from 'next';
import { SITE_URL } from '@/app/lib/site';
import AtelierClientLayout from './AtelierClientLayout';

export const metadata: Metadata = {
Expand All @@ -7,12 +8,12 @@ export const metadata: Metadata = {
openGraph: {
title: 'Atelier - ShipFriend TechBlog',
description: '생각들을 던져두는 곳, Atelier 페이지입니다.',
url: 'https://shipfriend.dev/atelier',
url: `${SITE_URL}/atelier`,
siteName: 'ShipFriend TechBlog',
type: 'website',
images: [
{
url: 'https://shipfriend.dev/images/atelier/atelier-og-thumbnail.webp',
url: `${SITE_URL}/images/atelier/atelier-og-thumbnail.webp`,
width: 1200,
height: 630,
alt: 'Atelier',
Expand All @@ -23,7 +24,10 @@ export const metadata: Metadata = {
card: 'summary_large_image',
title: 'Atelier - ShipFriend TechBlog',
description: '생각들을 던져두는 곳, Atelier 페이지입니다.',
images: ['https://shipfriend.dev/images/atelier/atelier-og-thumbnail.webp'],
images: [`${SITE_URL}/images/atelier/atelier-og-thumbnail.webp`],
},
alternates: {
canonical: `${SITE_URL}/atelier`,
},
};

Expand Down
3 changes: 2 additions & 1 deletion app/entities/common/NavBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,12 @@ const NavBar = () => {
className={`${fixedStyle} fixed h-16 top-0 px-4 w-screen inline-flex items-center justify-center z-40 backdrop-blur-sm`}
>
<div>
<Link href={'/'}>
<Link href={'/'} aria-label="ShipFriend TechBlog 홈">
<Profile
profileThumbnail={'/images/profile/profile.jpg'}
username={'Jeongwoo Seo'}
/>
<span className="sr-only">ShipFriend TechBlog</span>
</Link>
</div>
<ul
Expand Down
68 changes: 19 additions & 49 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,38 @@ import React from 'react';
import Footer from '@/app/entities/common/Footer';
import NavBar from '@/app/entities/common/NavBar';
import ToastProvider from '@/app/entities/common/Toast/ToastProvider';
import {
DEFAULT_SOCIAL_IMAGE,
SITE_DESCRIPTION,
SITE_NAME,
SITE_URL,
} from '@/app/lib/site';
import { GoogleAnalytics } from '@next/third-parties/google';

const SITE_NAME = 'ShipFriend TechBlog';
const SITE_DESCRIPTION = '문제 해결 경험과 개발 지식을 공유하는 개발 블로그입니다.';
const SITE_URL = process.env.NEXT_PUBLIC_DEPLOYMENT_URL || 'https://shipfriend.dev';

export const metadata: Metadata = {
metadataBase: new URL(SITE_URL),
title: SITE_NAME,
description: SITE_DESCRIPTION,
applicationName: SITE_NAME,
authors: [{ name: 'ShipFriend', url: 'https://github.com/ShipFriend0516' }],
creator: 'ShipFriend',
publisher: SITE_NAME,
icons: {
icon: '/favicon.ico',
apple: '/assets/apple-touch-icon.png',
shortcut: '/favicon-16.png',
other: [
icon: [
{ url: '/favicon.ico' },
{
rel: 'icon',
url: '/favicon-32.png',
url: '/assets/favicon-32x32.png',
sizes: '32x32',
type: 'image/png',
},
{
rel: 'icon',
url: '/favicon-16.png',
url: '/assets/favicon-16x16.png',
sizes: '16x16',
type: 'image/png',
},
],
apple: '/assets/apple-touch-icon.png',
shortcut: '/assets/favicon-16x16.png',
},
keywords: [
'ShipFriend',
Expand All @@ -51,7 +56,7 @@ export const metadata: Metadata = {
siteName: SITE_NAME,
images: [
{
url: `${SITE_URL}/images/profile/profile-banner.png`,
url: DEFAULT_SOCIAL_IMAGE,
width: 1424,
height: 752,
alt: 'ShipFriend TechBlog Open Graph Image',
Expand All @@ -64,7 +69,7 @@ export const metadata: Metadata = {
card: 'summary_large_image',
title: SITE_NAME,
description: SITE_DESCRIPTION,
images: [`${SITE_URL}/images/profile/profile-banner.png`],
images: [DEFAULT_SOCIAL_IMAGE],
},
alternates: {
canonical: SITE_URL,
Expand All @@ -75,7 +80,6 @@ export const metadata: Metadata = {
},
},
other: {
'application-name': 'ShipFriend TechBlog 🌱',
author: 'ShipFriend',
'article:tag': 'technology,programming,web development',
},
Expand Down Expand Up @@ -150,34 +154,6 @@ export default function RootLayout({
}: Readonly<{
children: React.ReactNode;
}>) {
const siteSchema = {
'@context': 'https://schema.org',
'@graph': [
{
'@type': 'WebSite',
'@id': `${SITE_URL}/#website`,
url: SITE_URL,
name: SITE_NAME,
description: SITE_DESCRIPTION,
inLanguage: 'ko-KR',
publisher: {
'@id': `${SITE_URL}/#organization`,
},
},
{
'@type': 'Organization',
'@id': `${SITE_URL}/#organization`,
name: SITE_NAME,
url: SITE_URL,
logo: {
'@type': 'ImageObject',
url: `${SITE_URL}/assets/apple-touch-icon.png`,
},
sameAs: ['https://github.com/ShipFriend0516'],
},
],
};

return (
<html lang="ko" suppressHydrationWarning>
<head>
Expand All @@ -186,12 +162,6 @@ export default function RootLayout({
__html: preventFOUC,
}}
/>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(siteSchema),
}}
/>
</head>
<body
className={`${pretendard.variable} font-sans antialiased min-h-screen flex flex-col justify-between`}
Expand Down
31 changes: 13 additions & 18 deletions app/lib/rss.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Feed } from 'feed';
import { SITE_DESCRIPTION, SITE_NAME, SITE_URL } from '@/app/lib/site';

export interface FeedPost {
title: string;
Expand All @@ -14,40 +15,34 @@ export interface FeedPost {
* 요청 시점에 직렬화(feed.rss2()/atom1()/json1())해서 응답합니다.
*/
export function buildFeed(posts: FeedPost[]) {
const site_url =
process.env.NEXT_PUBLIC_DEPLOYMENT_URL ||
process.env.NEXTAUTH_URL ||
'http://localhost:3000';

const feed = new Feed({
title: 'ShipFriend TechBlog',
description:
'개인 개발 블로그로, Nextjs로 개발되었습니다. 개발 관련 글을 작성합니다.',
id: site_url,
link: site_url,
image: `${site_url}/favicon.png`,
favicon: `${site_url}/favicon.ico`,
title: SITE_NAME,
description: SITE_DESCRIPTION,
id: `${SITE_URL}/`,
link: `${SITE_URL}/`,
image: `${SITE_URL}/assets/android-chrome-512x512.png`,
favicon: `${SITE_URL}/favicon.ico`,
copyright: `All rights reserved ${new Date().getFullYear()}`,
generator: 'Feed for Next.js',
feedLinks: {
rss2: `${site_url}/rss.xml`,
json: `${site_url}/feed.json`,
atom: `${site_url}/atom.xml`,
rss2: `${SITE_URL}/rss.xml`,
json: `${SITE_URL}/feed.json`,
atom: `${SITE_URL}/atom.xml`,
},
});

posts.forEach((post) => {
feed.addItem({
title: post.title,
id: `${site_url}/posts/${post.slug}`,
link: `${site_url}/posts/${post.slug}`,
id: `${SITE_URL}/posts/${encodeURIComponent(post.slug)}`,
link: `${SITE_URL}/posts/${encodeURIComponent(post.slug)}`,
description: post.subTitle,
content: post.content,
author: [
{
name: '개발자 서정우',
email: 'sjw4371@naver.com',
link: site_url,
link: `${SITE_URL}/`,
},
],
date: new Date(post.date),
Expand Down
14 changes: 14 additions & 0 deletions app/lib/site.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export const SITE_NAME = 'ShipFriend TechBlog';
export const SITE_DESCRIPTION =
'문제 해결 경험과 개발 지식을 공유하는 개발 블로그입니다.';

export const SITE_URL = (
process.env.NEXT_PUBLIC_DEPLOYMENT_URL || 'https://shipfriend.dev'
).replace(/\/$/, '');

export const DEFAULT_SOCIAL_IMAGE = `${SITE_URL}/images/profile/profile-banner.png`;

export function absoluteUrl(pathOrUrl: string): string {
if (/^https?:\/\//i.test(pathOrUrl)) return pathOrUrl;
return new URL(pathOrUrl, `${SITE_URL}/`).toString();
}
7 changes: 7 additions & 0 deletions app/not-found.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
import type { Metadata } from 'next';
import LottiePlayer from '@/app/entities/common/Animation/LottiePlayer';
import notfoundAnimation from '@/app/public/assets/notfound.json';

export const metadata: Metadata = {
title: '페이지를 찾을 수 없음 | ShipFriend TechBlog',
robots: { index: false, follow: false },
};

const NotFound = () => {
return (
<div className={' relative mx-auto max-w-4xl'}>
Expand Down
Loading
Loading