Rename to Tally; add Beauty category, Housing -> Household
This commit is contained in:
@@ -156,7 +156,7 @@ export default function App() {
|
||||
<ScrollView ref={scrollRef} style={s.scroll} contentContainerStyle={s.container}>
|
||||
<View style={s.header}>
|
||||
<View style={{ flexDirection: "row", justifyContent: "space-between", alignItems: "center" }}>
|
||||
<Text style={s.headerTitle}>Pin & Penny</Text>
|
||||
<Text style={s.headerTitle}>Tally</Text>
|
||||
<Pressable onPress={() => setMenuOpen(!menuOpen)} accessibilityLabel={menuOpen ? "Close menu" : "Open records menu"}>
|
||||
<Text style={[s.headerTotal, { fontSize: 20 }]}>{menuOpen ? "\u2715" : "\u2630"}</Text>
|
||||
</Pressable>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Pin & Penny — Expo app (web + mobile from one codebase)
|
||||
# Tally — Expo app (web + mobile from one codebase)
|
||||
|
||||
React Native (Expo SDK 57) version of the expense tracker. The same code runs as a
|
||||
website, an iOS app and an Android app. Data is stored on-device with AsyncStorage,
|
||||
@@ -11,8 +11,8 @@ working as before; this folder is the future-proof rewrite.
|
||||
|
||||
- **Daily / Weekly / Monthly tabs** — the same expenses regrouped by day, by week
|
||||
(Monday–Sunday) or by month, each group with its own total.
|
||||
- **Categories** — Food, Transport, Housing, Utilities, Shopping, Health,
|
||||
Entertainment, Other.
|
||||
- **Categories** — Food, Transport, Household, Utilities, Shopping, Health,
|
||||
Beauty, Entertainment, Other.
|
||||
- **Repeats** — mark an expense Daily, Weekly or Monthly. They appear under
|
||||
“Repeating expenses” with the next due date and a **Log next occurrence** button.
|
||||
- **Summary** — totals plus a per-category spending breakdown of whatever is shown.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"expo": {
|
||||
"name": "Pin & Penny",
|
||||
"name": "Tally",
|
||||
"slug": "expense-tracker",
|
||||
"version": "1.0.0",
|
||||
"orientation": "portrait",
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
export const CATEGORIES = [
|
||||
{ name: "Food", color: "#9ed6a4" },
|
||||
{ name: "Transport", color: "#a9c8f0" },
|
||||
{ name: "Housing", color: "#eab88f" },
|
||||
{ name: "Household", color: "#eab88f" },
|
||||
{ name: "Utilities", color: "#8fd8c4" },
|
||||
{ name: "Shopping", color: "#f5b98a" },
|
||||
{ name: "Health", color: "#f2a3a3" },
|
||||
{ name: "Beauty", color: "#dba9e8" },
|
||||
{ name: "Entertainment", color: "#f2cd88" },
|
||||
{ name: "Other", color: "#c9c9c9" },
|
||||
];
|
||||
|
||||
@@ -176,7 +176,7 @@ export function seedSamples() {
|
||||
mk("New shoes", 79.99, "Shopping", addDaysStr(t, -8)),
|
||||
mk("Team lunch", 13.4, "Food", addDaysStr(t, -9), "weekly"),
|
||||
mk("Internet", 59.99, "Utilities", addDaysStr(t, -12), "monthly"),
|
||||
mk("Rent", 1200.0, "Housing", first, "monthly"),
|
||||
mk("Rent", 1200.0, "Household", first, "monthly"),
|
||||
mk("Concert ticket", 45.0, "Entertainment", addDaysStr(t, -20)),
|
||||
mk("Groceries", 62.1, "Food", addDaysStr(t, -33)),
|
||||
];
|
||||
|
||||
@@ -14,7 +14,14 @@ export async function loadExpenses() {
|
||||
return seed;
|
||||
}
|
||||
const arr = JSON.parse(raw);
|
||||
return Array.isArray(arr) ? arr : [];
|
||||
if (!Array.isArray(arr)) return [];
|
||||
// Migrate the Housing -> Household rename in stored entries.
|
||||
let changed = false;
|
||||
arr.forEach((e) => {
|
||||
if (e && e.category === "Housing") { e.category = "Household"; changed = true; }
|
||||
});
|
||||
if (changed) await saveExpenses(arr);
|
||||
return arr;
|
||||
} catch (e) {
|
||||
return [];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user