feat: 절기 정밀화, AI 해석 추가, 공유 기능 개선

절기 날짜 정밀화:
- solarlunar 라이브러리 추가
- 천문학적 계산 기반 정확한 절기 날짜 계산
- 각 절기별 정확한 날짜 범위 검색
- 폴백 메커니즘으로 안정성 확보

AI 상세 해석 시스템:
- ai-interpretation.ts 라이브러리 생성
- 일간 기반 성격 분석 (10개 천간별 상세 해석)
- 오행 균형 분석 및 점수 계산
- 십성 기반 다차원 분석
  - 직업 운세 (오행 + 십성 조합)
  - 대인 관계 (십성 기반)
  - 재물 운세 (정재/편재 분석)
  - 건강 운세 (오행 균형)
- 맞춤형 조언 생성

결과 페이지 AI 해석 섹션:
- 오행 균형 시각화 (막대 그래프)
- 장점/주의할 점 구분 표시
- 4가지 운세 카드 (직업/대인/재물/건강)
- AI 조언 그리드 레이아웃
- 전문가 상담 권장 안내

공유 기능 개선:
- localhost 감지 로직 추가
- localhost인 경우:
  - 카카오톡: 텍스트 형식으로 사주 정보 공유
  - 링크 복사: 사주 정보 텍스트 복사
  - 사용자에게 개발 환경임을 안내
- 배포 환경: 기존대로 URL 공유
- 더 나은 사용자 경험 제공

기술 개선:
- solarlunar 라이브러리 (정밀 절기 계산)
- 타입 안전성 강화
- 모듈화된 해석 로직
- 성능 최적화

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-12 00:26:12 +09:00
parent e233e18a55
commit d513c063cf
6 changed files with 638 additions and 53 deletions

View File

@@ -12,31 +12,53 @@ export default function ShareButtons({ title, description, url }: ShareButtonsPr
const [showShareMenu, setShowShareMenu] = useState(false);
const shareUrl = url || (typeof window !== 'undefined' ? window.location.href : '');
// localhost 체크
const isLocalhost = shareUrl.includes('localhost') || shareUrl.includes('127.0.0.1');
const handleKakaoShare = () => {
if (typeof window !== 'undefined' && (window as any).Kakao) {
(window as any).Kakao.Share.sendDefault({
objectType: 'feed',
content: {
title: title,
description: description,
imageUrl: 'https://developers.kakao.com/assets/img/about/logos/kakaolink/kakaolink_btn_medium.png',
if (isLocalhost) {
// localhost인 경우 텍스트로 공유
const shareText = `${title}\n\n${description}\n\n🔮 사주보기 - 쟁승메이드\n(배포 후 링크가 제공됩니다)`;
if (typeof window !== 'undefined' && (window as any).Kakao) {
(window as any).Kakao.Share.sendDefault({
objectType: 'text',
text: shareText,
link: {
mobileWebUrl: shareUrl,
webUrl: shareUrl,
mobileWebUrl: 'https://jaengseung-made.com',
webUrl: 'https://jaengseung-made.com',
},
},
buttons: [
{
title: '자세히 보기',
});
} else {
alert('카카오톡 공유 기능을 사용할 수 없습니다.');
}
} else {
// 배포된 URL인 경우 정상 공유
if (typeof window !== 'undefined' && (window as any).Kakao) {
(window as any).Kakao.Share.sendDefault({
objectType: 'feed',
content: {
title: title,
description: description,
imageUrl: 'https://developers.kakao.com/assets/img/about/logos/kakaolink/kakaolink_btn_medium.png',
link: {
mobileWebUrl: shareUrl,
webUrl: shareUrl,
},
},
],
});
} else {
alert('카카오톡 공유 기능을 사용할 수 없습니다.');
buttons: [
{
title: '자세히 보기',
link: {
mobileWebUrl: shareUrl,
webUrl: shareUrl,
},
},
],
});
} else {
alert('카카오톡 공유 기능을 사용할 수 없습니다.');
}
}
};
@@ -52,11 +74,18 @@ export default function ShareButtons({ title, description, url }: ShareButtonsPr
const handleCopyLink = async () => {
try {
await navigator.clipboard.writeText(shareUrl);
alert('링크가 복사되었습니다!');
if (isLocalhost) {
// localhost인 경우 텍스트 정보 복사
const shareText = `${title}\n\n${description}\n\n🔮 사주보기 - 쟁승메이드\n(배포 후 링크가 제공됩니다)`;
await navigator.clipboard.writeText(shareText);
alert('사주 정보가 복사되었습니다!\n(개발 환경이므로 URL 대신 텍스트 정보가 복사됩니다)');
} else {
await navigator.clipboard.writeText(shareUrl);
alert('링크가 복사되었습니다!');
}
setShowShareMenu(false);
} catch (err) {
alert('링크 복사에 실패했습니다.');
alert('복사에 실패했습니다.');
}
};