Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 44 additions & 17 deletions src/app/(dashboard)/dashboard/treasury/page.tsx
Original file line number Diff line number Diff line change
@@ -1,29 +1,56 @@
import BitcoinTreasury from "@/components/dashboard/bitcoin-treasury";
import { prisma } from "@/lib/db";

export const dynamic = "force-dynamic";

export default async function TreasuryPage() {
let org = null;
let txs: Awaited<ReturnType<typeof prisma.bitcoin_transactions.findMany>> = [];
let dbError = false;
try {
const org = (await prisma.organizations.findFirst()) || ({ id: 'demo-org' } as any);
const txs = await prisma.bitcoin_transactions.findMany({
where: { organization_id: org.id },
orderBy: { transaction_date: 'desc' },
take: 10
});
const balanceSats = txs.reduce((acc, t) => acc + Number(t.amount_sats), 0);
return (
<main className="space-y-6">
<BitcoinTreasury organizationId={org.id} walletBalance={balanceSats} recentTransactions={txs as any} />
</main>
);
org = await prisma.organizations.findFirst();
if (org) {
txs = await prisma.bitcoin_transactions.findMany({
where: { organization_id: org.id },
orderBy: { transaction_date: "desc" },
take: 10,
});
}
} catch {
// Fallback demo rendering when DB is not available
const demoTxs = [
{ txid: 'demo-tx-1', amount_sats: 21000, category: 'operations', transaction_date: new Date().toISOString() },
] as any;
dbError = true;
}

if (dbError || !org) {
return (
<main className="space-y-6">
<BitcoinTreasury organizationId={'demo-org'} walletBalance={21000} recentTransactions={demoTxs} />
<h1 className="text-3xl font-bold">Treasury</h1>
<p className="text-gray-300">
{dbError
? "The treasury register is currently unreachable. No balance can be shown."
: "No organization is registered yet, so there is no treasury to show."}
</p>
</main>
);
}

const balanceSats = txs.reduce((acc, t) => acc + Number(t.amount_sats), 0);
return (
<main className="space-y-6">
<BitcoinTreasury
organizationId={org.id}
walletBalance={balanceSats}
recentTransactions={txs.map((t) => ({
...t,
amount_sats: Number(t.amount_sats),
transaction_date:
t.transaction_date instanceof Date
? t.transaction_date.toISOString()
: String(t.transaction_date),
description: t.description ?? undefined,
to_address: t.to_address ?? undefined,
from_address: t.from_address ?? undefined,
}))}
/>
</main>
);
}
11 changes: 0 additions & 11 deletions src/app/(dashboard)/dashboard/voting/VotingWalletConnector.tsx

This file was deleted.

53 changes: 33 additions & 20 deletions src/app/(dashboard)/dashboard/voting/page.tsx
Original file line number Diff line number Diff line change
@@ -1,34 +1,47 @@
import VotingInterface from "@/components/dashboard/voting-interface";
import VotingWalletConnector from "./VotingWalletConnector";
import { Democracy } from "@/lib/solon/democracy";
import { prisma } from "@/lib/db";
import { Suspense } from "react";

export const dynamic = "force-dynamic";

export default async function VotingPage() {
let session: any;
let session = null;
let dbError = false;
try {
session = await prisma.voting_sessions.findFirst({ orderBy: { start_date: 'desc' } });
session = await prisma.voting_sessions.findFirst({ orderBy: { start_date: "desc" } });
} catch {
// ignore and fallback
dbError = true;
}

if (dbError) {
return (
<main className="space-y-6">
<h1 className="text-3xl font-bold">Voting</h1>
<p className="text-gray-300">
The voting register is currently unreachable. No session data can be shown.
</p>
</main>
);
}
session = session || {
id: 'demo-session',
title: 'Adopt Bitcoin-Treasury Budget 2025',
voting_type: 'simple_majority',
status: 'active',
organization_id: 'demo-org',
decision_id: null,
start_date: new Date(),
total_votes_cast: 0,
bitcoin_signature_required: true
} as any;

if (!session) {
return (
<main className="space-y-6">
<h1 className="text-3xl font-bold">Voting</h1>
<p className="text-gray-300">
No voting session has been opened yet. When one opens, registered members vote
here by signing the canonical vote message with their own Bitcoin wallet.
</p>
</main>
);
}

const tally = await new Democracy().tally(session.id);

return (
<main className="space-y-6">
<h1 className="text-3xl font-bold">Open Vote</h1>
<Suspense>
<VotingWalletConnector />
</Suspense>
<VotingInterface session={{ ...(session as any), tally: { yes: 0, no: 0, abstain: 0 } }} userWallet={''} canVote={true} />
<VotingInterface session={session} tally={tally} />
</main>
);
}
7 changes: 7 additions & 0 deletions src/app/api/health/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { NextResponse } from "next/server";

export const dynamic = "force-dynamic";

export async function GET() {
return NextResponse.json({ status: "ok" });
}
11 changes: 0 additions & 11 deletions src/app/api/solon/transparency/route.ts

This file was deleted.

Loading