refactor: 모바일 public 페이지 API 모듈 적용

수정된 파일 (5개):
- pages/mobile/public/Album.jsx
  - fetch('/api/albums') → getAlbums()

- pages/mobile/public/Members.jsx
  - fetch('/api/members') → getMembers()

- pages/mobile/public/AlbumDetail.jsx
  - fetch('/api/albums') → getAlbums()
  - fetch('/api/albums/{id}/tracks') → getAlbumTracks()

- pages/mobile/public/AlbumGallery.jsx
  - fetch('/api/albums') → getAlbums()
  - fetch('/api/albums/{id}/photos') → getAlbumPhotos()

- pages/mobile/public/Schedule.jsx
  - fetch('/api/schedules?year=...') → getSchedules()
  - fetch('/api/schedules/categories') → getCategories()
  - fetch('/api/schedules?search=...') → searchSchedules()

Home.jsx는 이미 API 모듈 사용 중이므로 제외
This commit is contained in:
caadiq 2026-01-10 00:02:42 +09:00
parent 8e01692d6e
commit 1f9cf34e31
5 changed files with 14 additions and 19 deletions

View file

@ -1,6 +1,7 @@
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import { getAlbums } from '../../../api/public/albums';
// //
function MobileAlbum() { function MobileAlbum() {
@ -9,8 +10,7 @@ function MobileAlbum() {
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
useEffect(() => { useEffect(() => {
fetch('/api/albums') getAlbums()
.then(res => res.json())
.then(data => { .then(data => {
setAlbums(data); setAlbums(data);
setLoading(false); setLoading(false);

View file

@ -2,6 +2,7 @@ import { motion } from 'framer-motion';
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom'; import { useParams, useNavigate } from 'react-router-dom';
import { ArrowLeft, Play } from 'lucide-react'; import { ArrowLeft, Play } from 'lucide-react';
import { getAlbums, getAlbumTracks } from '../../../api/public/albums';
// //
function MobileAlbumDetail() { function MobileAlbumDetail() {
@ -13,15 +14,13 @@ function MobileAlbumDetail() {
useEffect(() => { useEffect(() => {
// //
fetch('/api/albums') getAlbums()
.then(res => res.json())
.then(data => { .then(data => {
const found = data.find(a => a.folder_name === name); const found = data.find(a => a.folder_name === name);
if (found) { if (found) {
setAlbum(found); setAlbum(found);
// //
fetch(`/api/albums/${found.id}/tracks`) getAlbumTracks(found.id)
.then(res => res.json())
.then(setTracks) .then(setTracks)
.catch(console.error); .catch(console.error);
} }

View file

@ -2,6 +2,7 @@ import { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom'; import { useParams, useNavigate } from 'react-router-dom';
import { ArrowLeft, X, ChevronLeft, ChevronRight } from 'lucide-react'; import { ArrowLeft, X, ChevronLeft, ChevronRight } from 'lucide-react';
import { motion, AnimatePresence } from 'framer-motion'; import { motion, AnimatePresence } from 'framer-motion';
import { getAlbums, getAlbumPhotos } from '../../../api/public/albums';
// //
function MobileAlbumGallery() { function MobileAlbumGallery() {
@ -13,14 +14,12 @@ function MobileAlbumGallery() {
const [selectedIndex, setSelectedIndex] = useState(null); const [selectedIndex, setSelectedIndex] = useState(null);
useEffect(() => { useEffect(() => {
fetch('/api/albums') getAlbums()
.then(res => res.json())
.then(data => { .then(data => {
const found = data.find(a => a.folder_name === name); const found = data.find(a => a.folder_name === name);
if (found) { if (found) {
setAlbum(found); setAlbum(found);
fetch(`/api/albums/${found.id}/photos`) getAlbumPhotos(found.id)
.then(res => res.json())
.then(setPhotos) .then(setPhotos)
.catch(console.error); .catch(console.error);
} }

View file

@ -1,6 +1,7 @@
import { motion, AnimatePresence } from 'framer-motion'; import { motion, AnimatePresence } from 'framer-motion';
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import { Instagram } from 'lucide-react'; import { Instagram } from 'lucide-react';
import { getMembers } from '../../../api/public/members';
// //
function MobileMembers() { function MobileMembers() {
@ -9,8 +10,7 @@ function MobileMembers() {
const [selectedMember, setSelectedMember] = useState(null); const [selectedMember, setSelectedMember] = useState(null);
useEffect(() => { useEffect(() => {
fetch('/api/members') getMembers()
.then(res => res.json())
.then(data => { .then(data => {
setMembers(data.filter(m => !m.is_former)); setMembers(data.filter(m => !m.is_former));
setFormerMembers(data.filter(m => m.is_former)); setFormerMembers(data.filter(m => m.is_former));

View file

@ -3,6 +3,7 @@ import { motion, AnimatePresence } from 'framer-motion';
import { Clock, Tag, Link2, ChevronLeft, ChevronRight, ChevronDown, Search, X, Calendar } from 'lucide-react'; import { Clock, Tag, Link2, ChevronLeft, ChevronRight, ChevronDown, Search, X, Calendar } from 'lucide-react';
import { useInfiniteQuery } from '@tanstack/react-query'; import { useInfiniteQuery } from '@tanstack/react-query';
import { useInView } from 'react-intersection-observer'; import { useInView } from 'react-intersection-observer';
import { getSchedules, getCategories, searchSchedules } from '../../../api/public/schedules';
// //
function MobileSchedule() { function MobileSchedule() {
@ -37,11 +38,7 @@ function MobileSchedule() {
} = useInfiniteQuery({ } = useInfiniteQuery({
queryKey: ['mobileScheduleSearch', searchTerm], queryKey: ['mobileScheduleSearch', searchTerm],
queryFn: async ({ pageParam = 0 }) => { queryFn: async ({ pageParam = 0 }) => {
const response = await fetch( return searchSchedules(searchTerm, { offset: pageParam, limit: SEARCH_LIMIT });
`/api/schedules?search=${encodeURIComponent(searchTerm)}&offset=${pageParam}&limit=${SEARCH_LIMIT}`
);
if (!response.ok) throw new Error('Search failed');
return response.json();
}, },
getNextPageParam: (lastPage) => { getNextPageParam: (lastPage) => {
if (lastPage.hasMore) { if (lastPage.hasMore) {
@ -72,8 +69,8 @@ function MobileSchedule() {
setLoading(true); setLoading(true);
Promise.all([ Promise.all([
fetch(`/api/schedules?year=${year}&month=${month}`).then(res => res.json()), getSchedules(year, month),
fetch('/api/schedules/categories').then(res => res.json()) getCategories()
]).then(([schedulesData, categoriesData]) => { ]).then(([schedulesData, categoriesData]) => {
setSchedules(schedulesData); setSchedules(schedulesData);
setCategories(categoriesData); setCategories(categoriesData);