+
Clerk: {isClerkEnabled() ? "활성화됨" : "비활성화됨"}
+ {CLERK_PUBLISHABLE_KEY && (
+
키: {CLERK_PUBLISHABLE_KEY.substring(0, 20)}...
+ )}
+
+ );
+};
diff --git a/src/hooks/useLogin.ts b/src/hooks/useLogin.ts
index 82874ff..c0f658e 100644
--- a/src/hooks/useLogin.ts
+++ b/src/hooks/useLogin.ts
@@ -4,6 +4,7 @@ import { useNavigate } from "react-router-dom";
import { useToast } from "@/hooks/useToast.wrapper";
import { useAuth } from "@/stores";
import { useTableSetup } from "@/hooks/useTableSetup";
+import { setUser, trackEvent } from "@/lib/sentry";
export function useLogin() {
const [email, setEmail] = useState("");
@@ -53,6 +54,14 @@ export function useLogin() {
setLoginError(errorMessage);
+ // 로그인 실패 이벤트 추적
+ trackEvent("login_failed", {
+ error_type: error.message?.includes("Invalid login credentials")
+ ? "invalid_credentials"
+ : "other",
+ email_domain: email.split("@")[1] || "unknown",
+ });
+
toast({
title: "로그인 실패",
description: errorMessage,
@@ -66,6 +75,20 @@ export function useLogin() {
variant: "default",
});
+ // Sentry에 사용자 정보 설정
+ setUser({
+ id: user.id || "unknown",
+ email: user.email,
+ username: user.user_metadata?.username,
+ });
+
+ // 로그인 성공 이벤트 추적
+ trackEvent("login", {
+ user_id: user.id,
+ email_domain: user.email?.split("@")[1] || "unknown",
+ login_time: new Date().toISOString(),
+ });
+
await setupTables();
navigate("/");
} else {
diff --git a/src/lib/appwrite/config.ts b/src/lib/appwrite/config.ts
index 1482a9e..5bafb09 100644
--- a/src/lib/appwrite/config.ts
+++ b/src/lib/appwrite/config.ts
@@ -26,14 +26,14 @@ const transactionsCollectionId =
// 서버 사이드 함수나 백엔드에서만 사용해야 함
const apiKey = "";
-// 개발 모드에서 설정 값 로깅
-appwriteLogger.info("현재 Appwrite 설정:", {
- endpoint,
- projectId,
- databaseId,
- transactionsCollectionId,
- apiKey: apiKey ? "설정됨" : "설정되지 않음", // API 키는 안전을 위해 완전한 값을 로깅하지 않음
-});
+// 개발 모드에서 설정 값 로깅 (임시 주석처리 - Appwrite 제거 예정)
+// appwriteLogger.info("현재 Appwrite 설정:", {
+// endpoint,
+// projectId,
+// databaseId,
+// transactionsCollectionId,
+// apiKey: apiKey ? "설정됨" : "설정되지 않음", // API 키는 안전을 위해 완전한 값을 로깅하지 않음
+// });
// 설정 객체 생성
export const config: AppwriteConfig = {
diff --git a/src/lib/clerk/index.tsx b/src/lib/clerk/index.tsx
new file mode 100644
index 0000000..35ca60e
--- /dev/null
+++ b/src/lib/clerk/index.tsx
@@ -0,0 +1,26 @@
+import React from "react";
+import { ClerkProvider } from "@clerk/clerk-react";
+
+const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY;
+
+if (!PUBLISHABLE_KEY) {
+ throw new Error("Missing Publishable Key");
+}
+
+interface ClerkProviderWrapperProps {
+ children: React.ReactNode;
+}
+
+export function ClerkProviderWrapper({ children }: ClerkProviderWrapperProps) {
+ return (
+