diff --git a/src/api.js b/src/api.js index a7120f8..a85affd 100644 --- a/src/api.js +++ b/src/api.js @@ -769,3 +769,59 @@ export function tarotPatchReading(id, body) { export function tarotDeleteReading(id) { return apiDelete(`/api/tarot/readings/${id}`); } + +// ====== Saju ====== + +export function sajuInterpret(body) { + return apiPost('/api/saju/interpret', body); +} + +export function sajuListReadings({ page = 1, size = 20, favorite } = {}) { + const qs = new URLSearchParams(); + qs.set('page', page); + qs.set('size', size); + if (favorite !== undefined) qs.set('favorite', favorite); + return apiGet(`/api/saju/readings?${qs.toString()}`); +} + +export function sajuGetReading(id) { + return apiGet(`/api/saju/readings/${id}`); +} + +export function sajuPatchReading(id, body) { + return apiPatch(`/api/saju/readings/${id}`, body); +} + +export function sajuDeleteReading(id) { + return apiDelete(`/api/saju/readings/${id}`); +} + +export function sajuCurrentFortune(readingId) { + return apiGet(`/api/saju/current-fortune?reading_id=${readingId}`); +} + +// ====== Compatibility ====== + +export function compatInterpret(body) { + return apiPost('/api/saju/compat/interpret', body); +} + +export function compatListReadings({ page = 1, size = 20, favorite } = {}) { + const qs = new URLSearchParams(); + qs.set('page', page); + qs.set('size', size); + if (favorite !== undefined) qs.set('favorite', favorite); + return apiGet(`/api/saju/compat/readings?${qs.toString()}`); +} + +export function compatGetReading(id) { + return apiGet(`/api/saju/compat/readings/${id}`); +} + +export function compatPatchReading(id, body) { + return apiPatch(`/api/saju/compat/readings/${id}`, body); +} + +export function compatDeleteReading(id) { + return apiDelete(`/api/saju/compat/readings/${id}`); +} diff --git a/src/components/Icons.jsx b/src/components/Icons.jsx index d33463d..6ce1796 100644 --- a/src/components/Icons.jsx +++ b/src/components/Icons.jsx @@ -143,3 +143,13 @@ export const IconTarot = () => ); + +export const IconSaju = () => + svg( + <> + + + + + + ); diff --git a/src/pages/saju/Compatibility.jsx b/src/pages/saju/Compatibility.jsx new file mode 100644 index 0000000..e67e0c0 --- /dev/null +++ b/src/pages/saju/Compatibility.jsx @@ -0,0 +1,10 @@ +import React from 'react'; + +export default function Compatibility() { + return ( +
+

궁합 분석

+

UI 시안 적용 대기 중...

+
+ ); +} diff --git a/src/pages/saju/CompatibilityResult.jsx b/src/pages/saju/CompatibilityResult.jsx new file mode 100644 index 0000000..c5c9056 --- /dev/null +++ b/src/pages/saju/CompatibilityResult.jsx @@ -0,0 +1,10 @@ +import React from 'react'; + +export default function CompatibilityResult() { + return ( +
+

궁합 분석 결과

+

UI 시안 적용 대기 중...

+
+ ); +} diff --git a/src/pages/saju/Saju.jsx b/src/pages/saju/Saju.jsx new file mode 100644 index 0000000..b40e443 --- /dev/null +++ b/src/pages/saju/Saju.jsx @@ -0,0 +1,10 @@ +import React from 'react'; + +export default function Saju() { + return ( +
+

사주 분석

+

UI 시안 적용 대기 중...

+
+ ); +} diff --git a/src/pages/saju/SajuResult.jsx b/src/pages/saju/SajuResult.jsx new file mode 100644 index 0000000..a37bac5 --- /dev/null +++ b/src/pages/saju/SajuResult.jsx @@ -0,0 +1,10 @@ +import React from 'react'; + +export default function SajuResult() { + return ( +
+

사주 분석 결과

+

UI 시안 적용 대기 중...

+
+ ); +} diff --git a/src/routes.jsx b/src/routes.jsx index 284a422..e744f02 100644 --- a/src/routes.jsx +++ b/src/routes.jsx @@ -12,6 +12,7 @@ import { IconInsta, IconPortfolio, IconTarot, + IconSaju, } from './components/Icons'; const Home = lazy(() => import('./pages/home/Home')); @@ -34,6 +35,10 @@ const Tarot = lazy(() => import('./pages/tarot/Tarot')); const TarotTodayCard = lazy(() => import('./pages/tarot/TodayCard')); const TarotReading = lazy(() => import('./pages/tarot/Reading')); const TarotHistory = lazy(() => import('./pages/tarot/History')); +const Saju = lazy(() => import('./pages/saju/Saju')); +const SajuResult = lazy(() => import('./pages/saju/SajuResult')); +const Compatibility = lazy(() => import('./pages/saju/Compatibility')); +const CompatibilityResult = lazy(() => import('./pages/saju/CompatibilityResult')); export const navLinks = [ { @@ -153,6 +158,15 @@ export const navLinks = [ icon: , accent: '#a78bfa', }, + { + id: 'saju', + label: 'Saju', + path: '/saju', + subtitle: 'DESTINY', + description: '사주와 궁합으로 운명을 분석하는 동양 이학 랩', + icon: , + accent: '#d4a574', + }, ]; export const appRoutes = [ @@ -240,4 +254,20 @@ export const appRoutes = [ path: 'tarot/history', element: , }, + { + path: 'saju', + element: , + }, + { + path: 'saju/result', + element: , + }, + { + path: 'saju/compatibility', + element: , + }, + { + path: 'saju/compatibility/result', + element: , + }, ];