From 6cda8096970af9962a9e755a13471b9ad3ea79b7 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 15 Mar 2025 06:42:32 +0000 Subject: [PATCH] Reverted to edit edt-ac485f97-7774-4a29-9d0a-ec4295ecbab8: "Configure Supabase environment variables Sets Supabase URL and anon key using environment variables." --- .env | 3 - .env.example | 3 - package-lock.json | 43 +---- package.json | 2 - src/components/Header.tsx | 8 +- src/components/SupabaseTestPanel.tsx | 172 ------------------- src/lib/supabase.ts | 8 +- src/pages/Settings.tsx | 239 +++++++++------------------ src/utils/supabaseTest.ts | 141 ---------------- 9 files changed, 86 insertions(+), 533 deletions(-) delete mode 100644 .env delete mode 100644 .env.example delete mode 100644 src/components/SupabaseTestPanel.tsx delete mode 100644 src/utils/supabaseTest.ts diff --git a/.env b/.env deleted file mode 100644 index f192697..0000000 --- a/.env +++ /dev/null @@ -1,3 +0,0 @@ - -VITE_SUPABASE_URL=your_supabase_url_here -VITE_SUPABASE_ANON_KEY=your_supabase_anon_key_here diff --git a/.env.example b/.env.example deleted file mode 100644 index f192697..0000000 --- a/.env.example +++ /dev/null @@ -1,3 +0,0 @@ - -VITE_SUPABASE_URL=your_supabase_url_here -VITE_SUPABASE_ANON_KEY=your_supabase_anon_key_here diff --git a/package-lock.json b/package-lock.json index b672b68..da48d6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,6 @@ "@radix-ui/react-tooltip": "^1.1.4", "@supabase/supabase-js": "^2.49.1", "@tanstack/react-query": "^5.56.2", - "@types/react-helmet": "^6.1.11", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.0.0", @@ -54,7 +53,6 @@ "react": "^18.3.1", "react-day-picker": "^8.10.1", "react-dom": "^18.3.1", - "react-helmet": "^6.1.0", "react-hook-form": "^7.53.0", "react-resizable-panels": "^2.1.3", "react-router-dom": "^6.26.2", @@ -3295,12 +3293,14 @@ "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -3317,15 +3317,6 @@ "@types/react": "*" } }, - "node_modules/@types/react-helmet": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.11.tgz", - "integrity": "sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -6845,27 +6836,6 @@ "react": "^18.3.1" } }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" - }, - "node_modules/react-helmet": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", - "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.1.1", - "react-side-effect": "^2.1.0" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, "node_modules/react-hook-form": { "version": "7.53.1", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.1.tgz", @@ -6977,15 +6947,6 @@ "react-dom": ">=16.8" } }, - "node_modules/react-side-effect": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", - "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", - "license": "MIT", - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-smooth": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.1.tgz", diff --git a/package.json b/package.json index 93e8717..13e2ce5 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,6 @@ "@radix-ui/react-tooltip": "^1.1.4", "@supabase/supabase-js": "^2.49.1", "@tanstack/react-query": "^5.56.2", - "@types/react-helmet": "^6.1.11", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.0.0", @@ -57,7 +56,6 @@ "react": "^18.3.1", "react-day-picker": "^8.10.1", "react-dom": "^18.3.1", - "react-helmet": "^6.1.0", "react-hook-form": "^7.53.0", "react-resizable-panels": "^2.1.3", "react-router-dom": "^6.26.2", diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 711b04c..8d51191 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -2,16 +2,12 @@ import React from 'react'; import { Bell } from 'lucide-react'; -interface HeaderProps { - title?: string; -} - -const Header: React.FC = ({ title }) => { +const Header: React.FC = () => { return (
-

{title || '반갑습니다'}

+

반갑습니다

젤리의 적자탈출

- - {!envStatus.valid && ( -

- 테스트를 실행하기 전에 먼저 .env 파일을 업데이트해주세요. -

- )} - - - ); -}; - -export default SupabaseTestPanel; diff --git a/src/lib/supabase.ts b/src/lib/supabase.ts index 80c35b7..f8b249e 100644 --- a/src/lib/supabase.ts +++ b/src/lib/supabase.ts @@ -1,10 +1,10 @@ import { createClient } from '@supabase/supabase-js'; -// Supabase URL과 anon key 설정 -// 환경변수에서 가져오기 -const supabaseUrl = import.meta.env.VITE_SUPABASE_URL; -const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY; +// Supabase 온프레미스 URL과 anon key 설정 +// 환경 변수를 우선적으로 사용하되, 하드코딩된 값을 기본값으로 설정 +const supabaseUrl = import.meta.env.VITE_SUPABASE_URL || 'https://xguihxuzqibwxjnimxev.supabase.co'; +const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InhndWloeHV6cWlid3hqbmlteGV2Iiwicm9sZSI6ImFub24iLCJpYXQiOjE2NzUwOTQ4MzUsImV4cCI6MTk5MDY3MDgzNX0.0PMlOxtKL4O9GGZuAP_Xl4f-Tut1qOnW4bNEmAtoB8w'; // 유효한 URL이 설정되었는지 확인 const isValidUrl = supabaseUrl && supabaseAnonKey && diff --git a/src/pages/Settings.tsx b/src/pages/Settings.tsx index fd4cb51..1955b91 100644 --- a/src/pages/Settings.tsx +++ b/src/pages/Settings.tsx @@ -1,172 +1,89 @@ -import { Helmet } from 'react-helmet'; +import React from 'react'; import { useNavigate } from 'react-router-dom'; -import NavBar from "@/components/NavBar"; -import Header from "@/components/Header"; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { Button } from "@/components/ui/button"; -import { Bell, Lock, Moon, User, HelpCircle, CreditCard } from "lucide-react"; -import SyncSettings from "@/components/SyncSettings"; -import SupabaseTestPanel from "@/components/SupabaseTestPanel"; +import NavBar from '@/components/NavBar'; +import SyncSettings from '@/components/SyncSettings'; +import { User, CreditCard, Bell, Lock, HelpCircle, LogOut, ChevronRight } from 'lucide-react'; +import { cn } from '@/lib/utils'; + +const SettingsOption = ({ + icon: Icon, + label, + description, + onClick, + color = "text-neuro-income" +}: { + icon: React.ElementType; + label: string; + description?: string; + onClick?: () => void; + color?: string; +}) => { + return
+
+
+ +
+
+

{label}

+ {description &&

{description}

} +
+ +
+
; +}; const Settings = () => { const navigate = useNavigate(); - - return ( -
- - 설정 | 예산 관리 - -
- -
- - - 일반 설정 - 고급 설정 - + return
+
+ {/* Header */} +
+

설정

- - {/* 프로필 관리 */} - - - 사용자 설정 - - 계정 정보 및 개인 설정을 관리합니다. - - - - - - - - - - - - {/* 결제 방법 */} - - - 결제 방법 - - 결제 카드 및 계좌 정보를 관리합니다. - - - - - - - - {/* 동기화 설정 */} - - - 동기화 설정 - - 클라우드 동기화 및 백업 기능을 관리합니다. - - - - - - - - {/* Supabase 테스트 패널 */} - - - - - {/* 테마 설정 */} - - - 앱 설정 - - 앱의 기본 설정 및 테마를 관리합니다. - - - - - - - - {/* 도움말 및 지원 */} - - - 도움말 및 지원 - - 문의사항 및 문제 해결을 위한 지원을 받으세요. - - - - - - - - -
+ {/* User Profile */} +
+
+ +
+
+

홍길동

+

honggildong@example.com

+
+
+
+ + {/* Data Sync Settings */} +
+

데이터 동기화

+ +
+ + {/* Settings Options */} +
+

계정

+ navigate('/profile-management')} /> + navigate('/payment-methods')} /> + navigate('/notification-settings')} /> +
+ +
+

앱 설정

+ navigate('/security-privacy-settings')} /> + navigate('/help-support')} /> +
+ +
+ +
+ +
+

앱 버전 0.1

+
+
-
- ); + ; }; export default Settings; diff --git a/src/utils/supabaseTest.ts b/src/utils/supabaseTest.ts deleted file mode 100644 index e2e4e85..0000000 --- a/src/utils/supabaseTest.ts +++ /dev/null @@ -1,141 +0,0 @@ - -import { supabase } from '@/lib/supabase'; -import { toast } from '@/components/ui/use-toast'; - -/** - * Supabase 환경 설정 확인 - * 환경 변수가 올바르게 설정되었는지 확인합니다. - */ -export const checkSupabaseEnvironment = (): { valid: boolean; message: string } => { - const supabaseUrl = import.meta.env.VITE_SUPABASE_URL; - const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY; - - if (!supabaseUrl || !supabaseAnonKey) { - return { - valid: false, - message: '환경 변수가 설정되지 않았습니다.' - }; - } - - if (supabaseUrl.includes('your_supabase_url_here') || - supabaseAnonKey.includes('your_supabase_anon_key_here')) { - return { - valid: false, - message: '환경 변수가 아직 실제 값으로 설정되지 않았습니다. .env 파일을 업데이트해주세요.' - }; - } - - return { - valid: true, - message: '환경 변수가 올바르게 설정되었습니다.' - }; -}; - -/** - * Supabase 연결 테스트 - * 현재 Supabase 연결 상태를 확인합니다. - */ -export const testSupabaseConnection = async (): Promise<{ success: boolean; message: string }> => { - // 먼저 환경 설정 확인 - const envCheck = checkSupabaseEnvironment(); - if (!envCheck.valid) { - return { - success: false, - message: `환경 설정 오류: ${envCheck.message}` - }; - } - - try { - // 서버에 핑 보내기 - const { data, error } = await supabase.from('_ping').select('*').limit(1); - - if (error) { - console.error('Supabase 연결 테스트 실패:', error); - return { - success: false, - message: `연결 오류: ${error.message}` - }; - } - - // 사용자 세션 확인 - const { data: userData, error: userError } = await supabase.auth.getUser(); - const isLoggedIn = userData?.user !== null; - - return { - success: true, - message: `Supabase 연결 성공! 로그인 상태: ${isLoggedIn ? '로그인됨' : '로그인 필요'}` - }; - } catch (err) { - const error = err as Error; - console.error('Supabase 테스트 중 예외 발생:', error); - return { - success: false, - message: `예외 발생: ${error.message}` - }; - } -}; - -/** - * 사용자 인터페이스에서 Supabase 연결 테스트를 실행 - * 결과를 토스트 메시지로 표시합니다. - */ -export const runSupabaseConnectionTest = async () => { - toast({ - title: "Supabase 연결 테스트", - description: "연결 상태를 확인 중입니다...", - }); - - const result = await testSupabaseConnection(); - - if (result.success) { - toast({ - title: "연결 성공", - description: result.message, - }); - } else { - toast({ - title: "연결 실패", - description: result.message, - variant: "destructive" - }); - } -}; - -/** - * Supabase 테이블 구조 확인 - * 지정된 테이블이 존재하는지 확인합니다. - */ -export const checkSupabaseTables = async (): Promise<{ exists: boolean; tables: string[] }> => { - // 먼저 환경 설정 확인 - const envCheck = checkSupabaseEnvironment(); - if (!envCheck.valid) { - return { exists: false, tables: [] }; - } - - try { - // 현재 스키마의 테이블 목록 가져오기 - const { data, error } = await supabase - .from('pg_tables') - .select('tablename') - .eq('schemaname', 'public'); - - if (error) { - console.error('테이블 확인 오류:', error); - return { exists: false, tables: [] }; - } - - const tables = data?.map(table => table.tablename) || []; - - // 필요한 테이블이 있는지 확인 - const requiredTables = ['transactions', 'budgets', 'category_budgets']; - const missingTables = requiredTables.filter(table => !tables.includes(table)); - - return { - exists: missingTables.length === 0, - tables - }; - } catch (error) { - console.error('테이블 확인 중 오류 발생:', error); - return { exists: false, tables: [] }; - } -};