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
4 changes: 2 additions & 2 deletions .agent/skills/git-manager/cheatsheet.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ root 폴더에 .bare 폴더를 생성하고 그 안에 워크트리 폴더를
```bash

git -C .bare worktree list # 현재 생성된 모든 워크트리(작업 폴더) 목록 확인
git -C .bare worktree add ../<폴더명> <브랜치명> # 브랜치를 따면서 새 폴더 생성
git -C .bare worktree add ../<폴더명> # 기존 브랜치를 새 폴더로 체크아웃
git -C .bare worktree add ../<폴더명> <브랜치명> # 기존 브랜치를 새 폴더로 체크아웃
git -C .bare worktree add -b <브랜치명> ../<폴더명> # 브랜치를 따면서 새 폴더 생성
git -C .bare worktree remove <폴더명> # 작업 폴더 삭제 (Git 연결 해제)
git -C .bare worktree prune # 폴더를 강제 삭제(rm -rf)했을 때 찌꺼기 정리
git -C .bare worktree move <구폴더> ../<신폴더> # 워크트리 폴더 경로/이름 변경
Expand Down
4 changes: 3 additions & 1 deletion messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"privacy": "Privacy Policy",
"about": "About",
"terms": "Terms of Use",
"contact": "Contact",
"copyright": "© {year} VXD Blog. Built with Next.js & Notion."
},
"Privacy": {
Expand All @@ -48,7 +49,8 @@
"aboutAuthorTitle": "About the Author",
"aboutAuthorContent": "Hello! I'm an engineer who loves development. I enjoy exploring new technologies and sharing what I've learned.",
"contactTitle": "Contact",
"contactContent": "If you have any inquiries, please reach out through GitHub."
"contactContent": "If you have any inquiries, please reach out through GitHub or email.",
"emailLabel": "Send Email"
},
"Terms": {
"back": "Home",
Expand Down
4 changes: 3 additions & 1 deletion messages/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"privacy": "개인정보처리방침",
"about": "소개",
"terms": "이용약관",
"contact": "문의하기",
"copyright": "© {year} VXD Blog. Built with Next.js & Notion."
},
"Privacy": {
Expand All @@ -48,7 +49,8 @@
"aboutAuthorTitle": "운영자 소개",
"aboutAuthorContent": "안녕하세요! 개발을 좋아하는 엔지니어입니다. 새로운 기술을 탐구하고 배운 것을 정리하여 공유하는 것을 즐깁니다.",
"contactTitle": "연락처",
"contactContent": "문의사항이 있으시면 GitHub를 통해 연락해 주세요."
"contactContent": "문의사항이 있으시면 GitHub 또는 이메일을 통해 연락해 주세요.",
"emailLabel": "이메일 보내기"
},
"Terms": {
"back": "홈으로",
Expand Down
9 changes: 8 additions & 1 deletion src/app/[locale]/about/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { getTranslations } from 'next-intl/server';
import { Link } from '@/i18n/routing';
import { Metadata } from 'next';
import { ExternalLink } from 'lucide-react';
import { ExternalLink, Mail } from 'lucide-react';

type Props = {
params: Promise<{ locale: string }>;
Expand Down Expand Up @@ -70,6 +70,13 @@ export default async function AboutPage() {
VXD&apos;s GitHub
<ExternalLink className="w-4 h-4" />
</Link>
<a
href="mailto:visionexperiencedeveloper@gmail.com"
className="inline-flex items-center gap-2 mt-4 ml-4 px-4 py-2 text-sm font-medium text-neutral-700 dark:text-neutral-300 bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 rounded-lg hover:bg-neutral-200 dark:hover:bg-neutral-700 hover:border-neutral-300 dark:hover:border-neutral-600 transition-all"
>
{t('emailLabel')}
<Mail className="w-4 h-4" />
</a>
</section>
</div>
</div>
Expand Down
6 changes: 6 additions & 0 deletions src/components/utils/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ export async function Footer() {
>
{t('terms')}
</Link>
<a
href="mailto:visionexperiencedeveloper@gmail.com"
className="text-neutral-500 hover:text-neutral-900 dark:hover:text-neutral-100 transition-colors"
>
{t('contact')}
</a>
</nav>
<p className="text-neutral-500 text-sm">
{t('copyright', { year })}
Expand Down
1 change: 1 addition & 0 deletions src/lib/notion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ import { Client } from "@notionhq/client";

export const notion = new Client({
auth: process.env.NOTION_API_KEY,
timeoutMs: 180000,
});
13 changes: 13 additions & 0 deletions src/lib/services/posts.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,19 @@ const getCachedAllPosts = unstable_cache(async (): Promise<BlogPost[] | null> =>
.filter((page): page is PageObjectResponse => 'properties' in page)
.map(extractBlogPostFromPage);

// Sync cover images between translations
// If a post has no cover but has a translationId, try to use the translation's cover
const postsMap = new Map(posts.map(p => [p.id, p]));

posts.forEach(post => {
if (!post.cover && post.translationId) {
const translatedPost = postsMap.get(post.translationId);
if (translatedPost?.cover) {
post.cover = translatedPost.cover;
}
}
});

return posts;
}, ['all-posts'], { revalidate });

Expand Down