Kantongku: icon 3D semua kategori (tagihan, kesehatan, hiburan, bonus, lainnya)

This commit is contained in:
Bro
2026-08-16 16:31:39 +07:00
parent 4d551fca6b
commit 8ea2475c71
12 changed files with 25 additions and 12 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

+1 -1
View File
@@ -187,7 +187,7 @@ export function AddTransactionScreen() {
<View style={styles.categoryGrid}>
{categories.map((c) => {
const selected = c.id === selectedCategoryId;
const icon3d = getCategoryIcon3d(c.name);
const icon3d = getCategoryIcon3d(c.name, type);
return (
<Pressable
key={c.id}
+4 -2
View File
@@ -158,7 +158,9 @@ export function DashboardScreen() {
const remainingDays = totalDays - dayOfMonth;
const perDay = dayOfMonth > 0 ? compare.current / dayOfMonth : 0;
const projection = Math.round(compare.current + perDay * remainingDays);
const topIcon3d = topCategory ? getCategoryIcon3d(topCategory.categoryName) : null;
const topIcon3d = topCategory
? getCategoryIcon3d(topCategory.categoryName, 'expense')
: null;
// Saldo cukup berapa hari (rata-rata pengeluaran harian bulan ini)
const avgDailyExpense = dayOfMonth > 0 ? monthExpense / dayOfMonth : 0;
@@ -646,7 +648,7 @@ export function DashboardScreen() {
</View>
) : (
recent.map((t) => {
const icon3d = getCategoryIcon3d(t.categoryName);
const icon3d = getCategoryIcon3d(t.categoryName, t.type);
return (
<View key={t.id} style={[styles.card, styles.txRow]}>
<View
+1 -1
View File
@@ -181,7 +181,7 @@ export function EditTransactionScreen() {
<View style={styles.categoryGrid}>
{categories.map((c) => {
const selected = c.id === selectedCategoryId;
const icon3d = getCategoryIcon3d(c.name);
const icon3d = getCategoryIcon3d(c.name, type);
return (
<Pressable
key={c.id}
+1 -1
View File
@@ -239,7 +239,7 @@ export function HistoryScreen() {
</View>
}
renderItem={({ item }) => {
const icon3d = getCategoryIcon3d(item.categoryName);
const icon3d = getCategoryIcon3d(item.categoryName, item.type);
return (
<SwipeableRow
onEdit={() =>
+1 -1
View File
@@ -165,7 +165,7 @@ export function RecurringFormScreen() {
<View style={styles.categoryGrid}>
{categories.map((c) => {
const selected = c.id === selectedCategoryId;
const icon3d = getCategoryIcon3d(c.name);
const icon3d = getCategoryIcon3d(c.name, type);
return (
<Pressable
key={c.id}
+17 -6
View File
@@ -1,15 +1,26 @@
/**
* Mapping kategori -> icon 3D.
* Key: `${type}:${name}` (karena ada kategori "Lainnya" di income & expense).
* Kategori yang belum punya versi 3D otomatis fallback ke emoji.
*/
export const CATEGORY_3D: Record<string, any> = {
Makanan: require('../../assets/cat-makanan.png'),
Transportasi: require('../../assets/cat-transportasi.png'),
Belanja: require('../../assets/cat-belanja.png'),
Gaji: require('../../assets/cat-gaji.png'),
'expense:Makanan': require('../../assets/cat-makanan.png'),
'expense:Transportasi': require('../../assets/cat-transportasi.png'),
'expense:Belanja': require('../../assets/cat-belanja.png'),
'expense:Tagihan': require('../../assets/cat-tagihan.png'),
'expense:Kesehatan': require('../../assets/cat-kesehatan.png'),
'expense:Hiburan': require('../../assets/cat-hiburan.png'),
'expense:Lainnya': require('../../assets/cat-lain-expense.png'),
'income:Gaji': require('../../assets/cat-gaji.png'),
'income:Bonus / THR': require('../../assets/cat-bonus.png'),
'income:Lainnya': require('../../assets/cat-lain-income.png'),
};
export function getCategoryIcon3d(categoryName: string | null): any | null {
export function getCategoryIcon3d(
categoryName: string | null,
type?: string
): any | null {
if (!categoryName) return null;
return CATEGORY_3D[categoryName] ?? null;
const key = type ? `${type}:${categoryName}` : categoryName;
return CATEGORY_3D[key] ?? null;
}