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() {