Rename to Tally; add Beauty category, Housing -> Household

This commit is contained in:
2026-09-18 22:05:47 +00:00
parent b394fd85a9
commit edbd05a3c9
10 changed files with 33 additions and 17 deletions

View File

@@ -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>

View File

@@ -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
(MondaySunday) 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.

View File

@@ -1,6 +1,6 @@
{
"expo": {
"name": "Pin & Penny",
"name": "Tally",
"slug": "expense-tracker",
"version": "1.0.0",
"orientation": "portrait",

View File

@@ -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" },
];

View File

@@ -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)),
];

View File

@@ -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 [];
}