diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 8be16e4..19f1d20 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,6 +16,7 @@ jobs: - name: Create .env file run: | echo "DOCKER_HUB_USERNAME=${{ secrets.DOCKER_HUB_USERNAME }}" > .env + echo "NEXT_PUBLIC_API_URL=${{ secrets.NEXT_PUBLIC_API_URL }}" >> .env echo "NEXT_PUBLIC_GOOGLE_REDIRECT_CLIENT_ID=${{secrets.NEXT_PUBLIC_GOOGLE_REDIRECT_CLIENT_ID}}" >> .env echo "NEXT_PUBLIC_GOOGLE_REDIRECT_URI=${{secrets.NEXT_PUBLIC_GOOGLE_REDIRECT_URI}}" >> .env @@ -46,7 +47,7 @@ jobs: - name: Upload Deployment Package to S3 run: | - aws s3 cp deploy.zip s3://${{ secrets.AWS_S3_BUCKET }}/deploy.zip + aws s3 cp deploy.zip s3://${{ secrets.AWS_S3_BUCKET }}/main-deploy.zip - name: Trigger CodeDeploy (CLI) env: @@ -57,5 +58,5 @@ jobs: aws deploy create-deployment \ --application-name ${{ secrets.AWS_CODEDEPLOY_APP }} \ --deployment-group-name ${{ secrets.AWS_CODEDEPLOY_GROUP }} \ - --s3-location bucket=${{ secrets.S3_BUCKET }},bundleType=zip,key=deploy.zip \ + --s3-location bucket=${{ secrets.S3_BUCKET }},bundleType=zip,key=main-deploy.zip \ --file-exists-behavior OVERWRITE diff --git a/src/app/api/auth/refresh/route.js b/src/app/api/auth/refresh/route.js index ea0d7db..4629620 100644 --- a/src/app/api/auth/refresh/route.js +++ b/src/app/api/auth/refresh/route.js @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server'; import axios from 'axios'; -const API_BASE_URL = 'https://gdgocinha.site/auth'; // 프록시 대상 주소 +const API_BASE_URL = process.env.NEXT_PUBLIC_BASE_API_URL; export async function POST(req) { const targetUrl = `${API_BASE_URL}/refresh`; diff --git a/src/app/api/signin/route.js b/src/app/api/signin/route.js index 90970ea..5f2c6b7 100644 --- a/src/app/api/signin/route.js +++ b/src/app/api/signin/route.js @@ -1,7 +1,8 @@ import axios from 'axios'; import { NextResponse } from 'next/server'; +import process from "next/dist/build/webpack/loaders/resolve-url-loader/lib/postcss"; -const ORIGINAL_AUTH_URL = 'https://gdgocinha.site/auth'; +const ORIGINAL_AUTH_URL = process.env.NEXT_PUBLIC_BASE_API_URL; export async function POST(request) { try { diff --git a/src/app/auth/signin/custom/CustomAuthApi.js b/src/app/auth/signin/custom/CustomAuthApi.js index 0680020..6c2cd82 100644 --- a/src/app/auth/signin/custom/CustomAuthApi.js +++ b/src/app/auth/signin/custom/CustomAuthApi.js @@ -2,7 +2,7 @@ import axios from 'axios'; // 기존 직접 요청 URL -// const CUSTOM_AUTH_URL = 'https://gdgocinha.site/auth'; +// const CUSTOM_AUTH_URL = process.env.NEXT_PUBLIC_BASE_API_URL; // 새로운 프록시 URL (상대 경로 사용) const PROXY_AUTH_URL = '/api/signin'; diff --git a/src/app/auth/signin/google/GoogleAuthApi.js b/src/app/auth/signin/google/GoogleAuthApi.js index c660535..5b6f481 100644 --- a/src/app/auth/signin/google/GoogleAuthApi.js +++ b/src/app/auth/signin/google/GoogleAuthApi.js @@ -1,7 +1,8 @@ 'use client' import axios from 'axios'; +import process from "next/dist/build/webpack/loaders/resolve-url-loader/lib/postcss"; -const GOOGLE_AUTH_URL = 'https://gdgocinha.site/auth/oauth2/google'; +const GOOGLE_AUTH_URL = process.env.NEXT_PUBLIC_BASE_API_URL + '/auth/oauth2/google'; // Google 로그인 코드 교환 함수 export const exchangeGoogleToken = async (code) => { diff --git a/src/app/auth/signin/screen/AuthFindId.jsx b/src/app/auth/signin/screen/AuthFindId.jsx index 51a4319..145d1e5 100644 --- a/src/app/auth/signin/screen/AuthFindId.jsx +++ b/src/app/auth/signin/screen/AuthFindId.jsx @@ -6,6 +6,7 @@ import { Button } from '@nextui-org/react'; import { Autocomplete, AutocompleteItem, AutocompleteSection } from '@nextui-org/react'; import { majors } from '@/app/recruit/majors'; import axios from 'axios'; +import process from "next/dist/build/webpack/loaders/resolve-url-loader/lib/postcss"; export default function AuthFindId({ handleBackToLogin }) { const [name, setName] = useState(''); @@ -15,7 +16,7 @@ export default function AuthFindId({ handleBackToLogin }) { const handleSubmitFindId = async () => { try { const response = await axios.post( - 'https://www.gdgocinha.site/auth/findId', { + process.env.NEXT_PUBLIC_BASE_API_URL + '/auth/findId', { name, major, phoneNumber, diff --git a/src/app/auth/signin/screen/AuthResetPassword.jsx b/src/app/auth/signin/screen/AuthResetPassword.jsx index aedd185..5e4a900 100644 --- a/src/app/auth/signin/screen/AuthResetPassword.jsx +++ b/src/app/auth/signin/screen/AuthResetPassword.jsx @@ -4,12 +4,13 @@ import { useState } from 'react'; import TransparentInput from '@/components/ui/TransparentInput'; import { Button } from '@nextui-org/react'; import axios from 'axios'; +import process from "next/dist/build/webpack/loaders/resolve-url-loader/lib/postcss"; export default function AuthResetPassword({ handleBackToLogin, handleBackToResetRequest, setLoading }) { const [email, setEmail] = useState(''); const [newPassword, setNewPassword] = useState(''); const [verifyNewPassword, setVerifyNewPassword] = useState(''); - const API_AUTH_URL = 'https://gdgocinha.site/auth'; + const API_AUTH_URL = process.env.NEXT_PUBLIC_BASE_API_URL + '/auth'; const handleNewPassword = async () => { if (newPassword !== verifyNewPassword) { diff --git a/src/app/auth/signin/screen/AuthResetRequest.jsx b/src/app/auth/signin/screen/AuthResetRequest.jsx index d1d5347..67f3e4c 100644 --- a/src/app/auth/signin/screen/AuthResetRequest.jsx +++ b/src/app/auth/signin/screen/AuthResetRequest.jsx @@ -5,6 +5,7 @@ import { Button } from '@nextui-org/react'; import TransparentInput from '@/components/ui/TransparentInput'; import OtpInput from '@/components/ui/OtpInput'; import axios from 'axios'; +import process from "next/dist/build/webpack/loaders/resolve-url-loader/lib/postcss"; export default function AuthResetRequest({ handleNextStep, handleBackToLogin, setLoading }) { const [name, setName] = useState(''); @@ -12,7 +13,7 @@ export default function AuthResetRequest({ handleNextStep, handleBackToLogin, se const [otp, setOtp] = useState(''); const [isOtpDisabled, setIsOtpDisabled] = useState(true); const [isNextDisabled, setIsNextDisabled] = useState(true); - const API_AUTH_URL = 'https://gdgocinha.site/auth'; + const API_AUTH_URL = process.env.NEXT_PUBLIC_BASE_API_URL + '/auth'; const handleSendOtp = async () => { try { diff --git a/src/app/main/Header.jsx b/src/app/main/Header.jsx index 5246ab6..32499a8 100644 --- a/src/app/main/Header.jsx +++ b/src/app/main/Header.jsx @@ -1,41 +1,60 @@ -import React from 'react'; +import React, { useState } from 'react'; import gdgocIcon from '@public/src/images/GDGoC_icon.png'; import Image from 'next/image'; -import { Navbar, NavbarBrand, NavbarContent, NavbarItem, Link } from "@nextui-org/react"; -import { Heart, User } from "lucide-react"; +import { Navbar, NavbarBrand, NavbarContent, NavbarItem, NavbarMenuToggle, NavbarMenu, NavbarMenuItem, Link } from "@nextui-org/react"; +import { Heart, User, LogOut } from "lucide-react"; import { useAuthenticatedApi } from '@/hooks/useAuthenticatedApi.js'; export default function Header() { - + const [isMenuOpen, setIsMenuOpen] = useState(false); const { apiClient, handleLogout }= useAuthenticatedApi(); + const menuItems = [ + { name: "스터디", href: "/study" }, + { name: "공지사항", href: "#", onClick: () => alert('준비중입니다.') }, + { name: "프로젝트", href: "#", onClick: () => alert('준비중입니다.') }, + { name: "멤버", href: "#", onClick: () => alert('준비중입니다.') }, + { name: "로그아웃", href: "#", onClick: handleLogout } + ]; + return ( - - - gdgocIcon -
- GDGoC Inha univ. -
-
+ + + + + gdgocIcon +
+ GDGoC Inha univ. +
+
+
- + - - 공지사항 + + 스터디 - - 스터디 + alert('준비중입니다.')}> + 공지사항 - + alert('준비중입니다.')}> 프로젝트 - + alert('준비중입니다.')}> 멤버 @@ -43,12 +62,24 @@ export default function Header() { - - - - handleLogout()} /> + handleLogout()} /> + + + {menuItems.map((item, index) => ( + + + {item.name} + + + ))} +
); } diff --git a/src/app/main/components/CardCarousel.jsx b/src/app/main/components/CardCarousel.jsx index 7144878..7306c43 100644 --- a/src/app/main/components/CardCarousel.jsx +++ b/src/app/main/components/CardCarousel.jsx @@ -15,6 +15,20 @@ export default function CardCarousel({ id, title, children }) { pagination: false, drag: true, snap: true, + breakpoints: { + 1024: { + perPage: 3, + gap: '1.5rem', + }, + 768: { + perPage: 2, + gap: '1rem', + }, + 480: { + perPage: 1, + gap: '0.5rem', + }, + }, }); cardSplide.mount(); diff --git a/src/app/main/components/EventCard.jsx b/src/app/main/components/EventCard.jsx index 4cc43d2..b41a833 100644 --- a/src/app/main/components/EventCard.jsx +++ b/src/app/main/components/EventCard.jsx @@ -3,21 +3,21 @@ import {Button} from "@nextui-org/react"; export default function EventCard({ logo, title, statusLabel, statusColor, eventType, eventTypeColor, description, details, isHidden }) { return ( -
+
-

{title}

+

{title}

-
+
{statusLabel}
-
- {eventType} +
+ {eventType}
-

{description}

-
+

{description}

+

목적

{details.purpose}

diff --git a/src/app/main/components/MainCarousel.jsx b/src/app/main/components/MainCarousel.jsx index 3653b63..c242072 100644 --- a/src/app/main/components/MainCarousel.jsx +++ b/src/app/main/components/MainCarousel.jsx @@ -38,16 +38,16 @@ export default function MainCarousel({ slides }) { event background
-
- event poster +
+ event poster
-
+
-
+
{slide.tag1}
-
+
{slide.tag2}
diff --git a/src/app/main/page.jsx b/src/app/main/page.jsx index c3feb08..bb47d51 100644 --- a/src/app/main/page.jsx +++ b/src/app/main/page.jsx @@ -43,7 +43,7 @@ export default function Page() {
-
+
{renderEventCards(ongoingEvents)} @@ -52,7 +52,6 @@ export default function Page() { {renderEventCards(ongoingStudies)} - {/* FAQ 섹션 */}
diff --git a/src/app/recruit/page.jsx b/src/app/recruit/page.jsx index f1fcb86..938b38d 100644 --- a/src/app/recruit/page.jsx +++ b/src/app/recruit/page.jsx @@ -21,6 +21,7 @@ import Recruit11 from '@/app/recruit/screen/Recruit11'; import Loader from '@/components/ui/Loader.jsx'; import VerticalProgressBar from './VerticalProgressBar.jsx'; import HorizontalProgressBar from './HorizontalProgressBar.jsx'; +import process from "next/dist/build/webpack/loaders/resolve-url-loader/lib/postcss"; export default function Recruit() { const [mainRecruitData, setMainRecruitData] = useState(new Map()); @@ -41,7 +42,7 @@ export default function Recruit() { const formattedData = formatRecruitData(mainRecruitData); try { setLoading(true) - const response = await axios.post("https://www.gdgocinha.site/apply", formattedData); + const response = await axios.post(process.env.NEXT_PUBLIC_BASE_API_URL + "/apply", formattedData); router.push("/recruit/submit"); } catch (error) { if (error.response && error.response.status === 500) { diff --git a/src/app/recruit/screen/Recruit11.jsx b/src/app/recruit/screen/Recruit11.jsx index 6a12796..ed1e21a 100644 --- a/src/app/recruit/screen/Recruit11.jsx +++ b/src/app/recruit/screen/Recruit11.jsx @@ -38,8 +38,8 @@ export default function Recruit11({ step, setChecked, updateRecruitData }) {
  • • 👛 입금 계좌
  • - : 카카오뱅크 3333252211505 | 예금주명 - 엄수빈 + : 토스뱅크 1001-9049-2082 | 예금주명 + GDGoC INHA
  • • 💵 25-1 회비
  • diff --git a/src/hooks/useAuthApi.js b/src/hooks/useAuthApi.js index 6bbee7e..943eda0 100644 --- a/src/hooks/useAuthApi.js +++ b/src/hooks/useAuthApi.js @@ -2,8 +2,9 @@ import axios from 'axios'; import { useAuth } from '@/hooks/useAuth'; +import process from "next/dist/build/webpack/loaders/resolve-url-loader/lib/postcss"; -const API_AUTH_URL = 'https://gdgocinha.site/auth'; +const API_AUTH_URL = process.env.NEXT_PUBLIC_BASE_API_URL + '/auth'; const ROUTE_API_URL = '/api/auth'; export const useAuthApi = () => { diff --git a/src/hooks/useAuthenticatedApi.js b/src/hooks/useAuthenticatedApi.js index 9fcd4f2..8f676d7 100644 --- a/src/hooks/useAuthenticatedApi.js +++ b/src/hooks/useAuthenticatedApi.js @@ -3,6 +3,7 @@ import { useAuthApi } from './useAuthApi'; import { useMemo, useEffect, useRef, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import axios from 'axios'; +import process from "next/dist/build/webpack/loaders/resolve-url-loader/lib/postcss"; export const useAuthenticatedApi = () => { const { accessToken, setAccessToken, clearAuth } = useAuth(); @@ -39,7 +40,7 @@ export const useAuthenticatedApi = () => { //로그인 이후 api 요청 const apiClient = useMemo(() => { const client = axios.create({ - baseURL: 'https://gdgocinha.site/', + baseURL: process.env.NEXT_PUBLIC_BASE_API_URL, withCredentials: true, });