diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..da2cd23 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,25 @@ +name: CI Test Build + +on: + pull_request: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4.2.2 + + - name: Set up Node.js + uses: actions/setup-node@v4.4.0 + with: + node-version: 'latest' + + - name: Install dependencies + run: npm install + + - name: Run test build + run: npm run build \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index 50e59f8..9a726c9 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -21,6 +21,7 @@ export default function Home() { }); const [payments, setPayments] = useState([]); + const [showBalanceDetails, setShowBalanceDetails] = useState(false); const addUser = () => { if (!newUserName.trim()) return; @@ -373,103 +374,8 @@ export default function Home() { {/* Payment Results */} {payments.length > 0 && ( - {/* Debug Information */} -
-
-
- - - -
-

Balance Details

-
- - {(() => { - const debug = debugBalances(trip); - return ( -
- {/* Expense Breakdown */} -
-

Expense Breakdown

-
- - - - - - - - - - - {debug.expenseBreakdown.map((item, index) => ( - - - - - - - ))} - -
ExpensePayerAttendeesSplit Amount
{item.expense}{item.payer}{item.attendees.join(', ')}${item.splitAmount.toFixed(2)}
-
-
- - {/* Direct Debts */} -
-

Direct Debts (Before Netting)

-
- - - - - - - - - - {debug.directDebts.map((item, index) => ( - - - - - - ))} - -
FromToAmount
{item.from}{item.to}${item.amount.toFixed(2)}
-
-
- - {/* Net Payments */} -
-

Net Payments (After Netting)

-
- - - - - - - - - - {debug.netPayments.map((item, index) => ( - - - - - - ))} - -
FromToAmount
{item.from}{item.to}${item.amount.toFixed(2)}
-
-
-
- ); - })()} -
- -
+ {/* Payment Summary - Show First */} +
@@ -518,15 +424,127 @@ export default function Home() {
-
-

How it works

-

- This updated algorithm ensures everyone gets paid exactly what they're owed by calculating precise balances and creating direct payments between debtors and creditors. -

-
+ + {/* Balance Details - Expandable Section */} +
+ + + {showBalanceDetails && ( +
+ {(() => { + const debug = debugBalances(trip); + return ( +
+ {/* Expense Breakdown */} +
+

Expense Breakdown

+
+ + + + + + + + + + + {debug.expenseBreakdown.map((item, index) => ( + + + + + + + ))} + +
ExpensePayerAttendeesSplit Amount
{item.expense}{item.payer}{item.attendees.join(', ')}${item.splitAmount.toFixed(2)}
+
+
+ + {/* Direct Debts */} +
+

Direct Debts (Before Netting)

+
+ + + + + + + + + + {debug.directDebts.map((item, index) => ( + + + + + + ))} + +
FromToAmount
{item.from}{item.to}${item.amount.toFixed(2)}
+
+
+ + {/* Net Payments */} +
+

Net Payments (After Netting)

+
+ + + + + + + + + + {debug.netPayments.map((item, index) => ( + + + + + + ))} + +
FromToAmount
{item.from}{item.to}${item.amount.toFixed(2)}
+
+
+
+ ); + })()} +
+ )} +
)}