diff --git a/next.config.ts b/next.config.ts index df186e3..f6e0fe4 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,6 @@ import type { NextConfig } from 'next'; const nextConfig: NextConfig = { - /* config options here */ reactCompiler: true, images: { remotePatterns: [ @@ -9,6 +8,10 @@ const nextConfig: NextConfig = { protocol: 'https', hostname: 'rematedeploy-production.up.railway.app', }, + { + protocol: 'https', + hostname: 'lh3.googleusercontent.com', + }, ], }, }; diff --git a/src/apis/workspace/workspace.service.ts b/src/apis/workspace/workspace.service.ts index 0710562..2b76dcc 100644 --- a/src/apis/workspace/workspace.service.ts +++ b/src/apis/workspace/workspace.service.ts @@ -168,9 +168,9 @@ export const workspaceService = { headers: { Authorization: `Bearer ${accessToken}` }, }); - if (res.status === 403) throw new Error('강퇴 권한이 없습니다.'); + if (res.status === 403) throw new Error('삭제 권한이 없습니다.'); if (res.status === 404) throw new Error('멤버를 찾을 수 없습니다.'); - if (!res.ok) throw new Error('멤버 강퇴에 실패했습니다.'); + if (!res.ok) throw new Error('멤버 삭제에 실패했습니다.'); return res.json(); }, diff --git a/src/app/(after-login)/mypage/page.tsx b/src/app/(after-login)/mypage/page.tsx index 38276bc..31de1ef 100644 --- a/src/app/(after-login)/mypage/page.tsx +++ b/src/app/(after-login)/mypage/page.tsx @@ -178,17 +178,22 @@ export default function Page() { className='hidden' onChange={handleFileChange} /> +
fileInputRef.current?.click()} > - {previewUrl && ( + {previewUrl ? ( 프로필 이미지 + ) : ( +
+ {user?.name?.charAt(0) ?? ''} +
)}
diff --git a/src/app/(after-login)/workspace/[workspaceId]/settings/page.tsx b/src/app/(after-login)/workspace/[workspaceId]/settings/page.tsx index bf255d2..4526d32 100644 --- a/src/app/(after-login)/workspace/[workspaceId]/settings/page.tsx +++ b/src/app/(after-login)/workspace/[workspaceId]/settings/page.tsx @@ -77,11 +77,11 @@ export default function Page() { deleteMember(member.userId, { onSuccess: () => { setKickedIds((prev) => [...prev, member.userId]); - toast.success(`${member.name}님을 강퇴했습니다.`); + toast.success(`${member.name}님을 삭제했습니다.`); resolve(); }, onError: (error: Error) => { - toast.error(error.message || '멤버 강퇴에 실패했습니다.'); + toast.error(error.message || '멤버 삭제에 실패했습니다.'); reject(error); }, }); diff --git a/src/app/(before-login)/(auth)/login/page.tsx b/src/app/(before-login)/(auth)/login/page.tsx index 2314e26..f811510 100644 --- a/src/app/(before-login)/(auth)/login/page.tsx +++ b/src/app/(before-login)/(auth)/login/page.tsx @@ -20,6 +20,39 @@ interface LoginErrors { const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; +function generateState() { + return Math.random().toString(36).substring(2); +} + +function handleGoogleLogin() { + const state = generateState(); + sessionStorage.setItem('oauth_state', state); + + const params = new URLSearchParams({ + client_id: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID!, + redirect_uri: process.env.NEXT_PUBLIC_GOOGLE_REDIRECT_URI!, + response_type: 'code', + scope: 'openid email profile', + state, + }); + + window.location.href = `https://accounts.google.com/o/oauth2/v2/auth?${params}`; +} + +function handleKakaoLogin() { + const state = generateState(); + sessionStorage.setItem('oauth_state', state); + + const params = new URLSearchParams({ + client_id: process.env.NEXT_PUBLIC_KAKAO_REST_API_KEY!, + redirect_uri: process.env.NEXT_PUBLIC_KAKAO_REDIRECT_URI!, + response_type: 'code', + state, + }); + + window.location.href = `https://kauth.kakao.com/oauth/authorize?${params}`; +} + export default function Page() { const [form, setForm] = useState({ email: '', password: '' }); const [errors, setErrors] = useState({}); @@ -131,7 +164,7 @@ export default function Page() {