diff --git a/android/app/build.gradle b/android/app/build.gradle index e63127c..01eb02e 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,3 +1,4 @@ + apply plugin: 'com.android.application' android { @@ -49,6 +50,9 @@ dependencies { androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" implementation project(':capacitor-cordova-android-plugins') + + // 스플래시 화면 플러그인 추가 + implementation "androidx.core:core-splashscreen:1.0.0" } apply from: 'capacitor.build.gradle' diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 340e7df..b467a2d 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,3 +1,4 @@ + @@ -15,7 +16,8 @@ android:label="@string/title_activity_main" android:theme="@style/AppTheme.NoActionBarLaunch" android:launchMode="singleTask" - android:exported="true"> + android:exported="true" + android:screenOrientation="portrait"> diff --git a/android/app/src/main/java/com/lovable/zellyfinance/MainActivity.java b/android/app/src/main/java/com/lovable/zellyfinance/MainActivity.java index e0fa4b1..525207d 100644 --- a/android/app/src/main/java/com/lovable/zellyfinance/MainActivity.java +++ b/android/app/src/main/java/com/lovable/zellyfinance/MainActivity.java @@ -1,5 +1,16 @@ + package com.lovable.zellyfinance; +import android.os.Bundle; import com.getcapacitor.BridgeActivity; +import com.getcapacitor.Plugin; -public class MainActivity extends BridgeActivity {} +public class MainActivity extends BridgeActivity { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // 스플래시 화면 처리를 위한 추가 초기화 코드 + registerPlugin(com.capacitorjs.plugins.splashscreen.SplashScreenPlugin.class); + } +} diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml index 0dc34be..4a911cb 100644 --- a/android/app/src/main/res/values/ic_launcher_background.xml +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ - #f2f2f2 - \ No newline at end of file + #F0F4F8 + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index be874e5..411d88b 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,3 +1,4 @@ + @@ -18,5 +19,6 @@ - \ No newline at end of file + diff --git a/capacitor.config.ts b/capacitor.config.ts index b6ea95f..ca21441 100644 --- a/capacitor.config.ts +++ b/capacitor.config.ts @@ -11,10 +11,12 @@ const config: CapacitorConfig = { }, plugins: { SplashScreen: { - launchShowDuration: 2000, - backgroundColor: "#f2f2f2", + launchShowDuration: 3000, // 스플래시 화면 표시 시간 3초로 증가 + backgroundColor: "#F0F4F8", // 배경색 밝은 회색으로 변경 androidScaleType: "CENTER_CROP", - showSpinner: false + showSpinner: true, // 로딩 스피너 표시 + spinnerColor: "#6BCB77", // 스피너 색상 (브랜드 색상) + androidSpinnerStyle: "large" // 안드로이드 스피너 크기 }, Keyboard: { resize: "body", diff --git a/package-lock.json b/package-lock.json index f27b1b3..fce5e07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@capacitor/core": "^7.1.0", "@capacitor/ios": "^7.1.0", "@capacitor/keyboard": "^7.0.0", + "@capacitor/splash-screen": "^7.0.0", "@hookform/resolvers": "^3.9.0", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", @@ -236,6 +237,15 @@ "@capacitor/core": ">=7.0.0" } }, + "node_modules/@capacitor/splash-screen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@capacitor/splash-screen/-/splash-screen-7.0.0.tgz", + "integrity": "sha512-y25WNRcl+MY/ltb3OZPZPpNmhVFW9270QneJY8tjY7FJc78zWEszj1cX84LJS4LeTHfHi4NcNW4y0/oewWG88A==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=7.0.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", diff --git a/package.json b/package.json index 35a3358..3ef6b20 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@capacitor/core": "^7.1.0", "@capacitor/ios": "^7.1.0", "@capacitor/keyboard": "^7.0.0", + "@capacitor/splash-screen": "^7.0.0", "@hookform/resolvers": "^3.9.0", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", diff --git a/src/components/RecentTransactionsSection.tsx b/src/components/RecentTransactionsSection.tsx index 7266932..bb7300b 100644 --- a/src/components/RecentTransactionsSection.tsx +++ b/src/components/RecentTransactionsSection.tsx @@ -1,29 +1,27 @@ - import React, { useState } from 'react'; import { Transaction } from './TransactionCard'; import TransactionEditDialog from './TransactionEditDialog'; import { ChevronRight } from 'lucide-react'; import { useBudget } from '@/contexts/BudgetContext'; import { Link } from 'react-router-dom'; - interface RecentTransactionsSectionProps { transactions: Transaction[]; onUpdateTransaction?: (transaction: Transaction) => void; } - -const RecentTransactionsSection: React.FC = ({ +const RecentTransactionsSection: React.FC = ({ transactions, - onUpdateTransaction + onUpdateTransaction }) => { const [selectedTransaction, setSelectedTransaction] = useState(null); const [isDialogOpen, setIsDialogOpen] = useState(false); - const { updateTransaction, deleteTransaction } = useBudget(); - + const { + updateTransaction, + deleteTransaction + } = useBudget(); const handleTransactionClick = (transaction: Transaction) => { setSelectedTransaction(transaction); setIsDialogOpen(true); }; - const handleUpdateTransaction = (updatedTransaction: Transaction) => { if (onUpdateTransaction) { onUpdateTransaction(updatedTransaction); @@ -31,16 +29,13 @@ const RecentTransactionsSection: React.FC = ({ // 직접 컨텍스트를 통해 업데이트 updateTransaction(updatedTransaction); }; - const handleDeleteTransaction = (id: string) => { // 직접 컨텍스트를 통해 삭제 deleteTransaction(id); }; - const formatCurrency = (amount: number) => { return amount.toLocaleString('ko-KR') + '원'; }; - const getCategoryIcon = (category: string) => { switch (category) { case '식비': @@ -61,9 +56,7 @@ const RecentTransactionsSection: React.FC = ({ return '💰'; } }; - - return ( -
+ return

최근 지출

@@ -71,44 +64,24 @@ const RecentTransactionsSection: React.FC = ({
- {transactions.length > 0 ? ( - transactions.map((transaction) => ( -
handleTransactionClick(transaction)} - > + {transactions.length > 0 ? transactions.map(transaction =>
handleTransactionClick(transaction)} className="flex justify-between py-3 px-4 cursor-pointer hover:bg-gray-50">
{getCategoryIcon(transaction.category)}
-

{transaction.title}

+

{transaction.title}

{transaction.date}

-

-{formatCurrency(transaction.amount)}

+

-{formatCurrency(transaction.amount)}

{transaction.category}

-
- )) - ) : ( -
+
) :
지출 내역이 없습니다 -
- )} +
}
- {selectedTransaction && ( - - )} -
- ); + {selectedTransaction && } +
; }; - export default RecentTransactionsSection; diff --git a/src/components/analytics/CategorySpendingList.tsx b/src/components/analytics/CategorySpendingList.tsx index 30b1b73..0adb5e0 100644 --- a/src/components/analytics/CategorySpendingList.tsx +++ b/src/components/analytics/CategorySpendingList.tsx @@ -12,11 +12,13 @@ interface CategorySpending { interface CategorySpendingListProps { categories: CategorySpending[]; totalExpense: number; + className?: string; } const CategorySpendingList: React.FC = ({ categories, - totalExpense + totalExpense, + className = "" }) => { const isMobile = useIsMobile(); @@ -31,7 +33,7 @@ const CategorySpendingList: React.FC = ({ }; return ( -
+
{categories.some(cat => cat.current > 0) ? (
{categories.map((category) => ( diff --git a/src/pages/Analytics.tsx b/src/pages/Analytics.tsx index 287ae0c..2cdb0e1 100644 --- a/src/pages/Analytics.tsx +++ b/src/pages/Analytics.tsx @@ -164,6 +164,7 @@ const Analytics = () => {
diff --git a/src/pages/Transactions.tsx b/src/pages/Transactions.tsx index 9c6a96e..9887053 100644 --- a/src/pages/Transactions.tsx +++ b/src/pages/Transactions.tsx @@ -155,7 +155,7 @@ const Transactions = () => { {/* Transactions By Date */} {!isLoading && transactions.length > 0 && ( -
+
{Object.entries(groupedTransactions).map(([date, transactions]) => (