fix tab bar bounce on iOS overscroll, add mock legislation seed endpoint + dev button

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 17:43:09 +01:00
parent 8240fdd916
commit d9f9006d4b
5 changed files with 137 additions and 1 deletions

View File

@@ -94,11 +94,14 @@
* {
@apply border-border outline-ring/50;
}
html,
body {
@apply bg-background text-foreground;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
sans-serif;
-webkit-font-smoothing: antialiased;
height: 100%;
overflow: hidden;
}
}

View File

@@ -52,6 +52,7 @@ export function SettingsPage() {
string | null
>(null)
const [devReload, setDevReload] = useState<string | null>(null)
const [devSeedMock, setDevSeedMock] = useState<string | null>(null)
useEffect(() => {
loadCachedResult(db).then((cached) => {
@@ -409,6 +410,41 @@ export function SettingsPage() {
</Button>
</div>
</div>
<div className="flex items-center justify-between px-4 py-3">
<span className="text-sm">Testdaten laden</span>
<div className="flex items-center gap-2">
{devSeedMock && (
<span
className={`text-xs ${devSeedMock.startsWith("ok") ? "text-green-600" : "text-destructive"}`}
>
{devSeedMock}
</span>
)}
<Button
size="sm"
variant="outline"
onClick={async () => {
setDevSeedMock(null)
try {
const res = await fetch(
`${BACKEND_URL}/legislation/seed-mock`,
{ method: "POST" },
)
if (!res.ok) {
setDevSeedMock(`${res.status}`)
return
}
const data = await res.json()
setDevSeedMock(`ok (${data.count})`)
} catch (e) {
setDevSeedMock(String(e))
}
}}
>
Laden
</Button>
</div>
</div>
<div className="flex items-center justify-between px-4 py-3">
<span className="text-sm">Abgeordnete neu laden</span>
<div className="flex items-center gap-2">

View File

@@ -192,7 +192,7 @@ function AppLayout() {
}
>
<DbProvider>
<div className="flex-1 overflow-y-auto">
<div className="flex-1 overflow-y-auto overscroll-contain">
<Outlet />
</div>
</DbProvider>

View File

@@ -7,11 +7,17 @@ import {
getLegislationText,
getUpcomingLegislation,
getUserVote,
seedMockLegislation,
} from "./service"
export const legislationRouter = new Hono()
// static routes FIRST — before /:id param routes
legislationRouter.post("/seed-mock", async (c) => {
const ids = await seedMockLegislation()
return c.json({ ok: true, count: ids.length, ids }, 201)
})
legislationRouter.get("/upcoming", async (c) => {
const items = await getUpcomingLegislation()
return c.json(items)

View File

@@ -163,3 +163,94 @@ export async function getLegislationResults(
return { pollId, votes: results }
}
const MOCK_LEGISLATION = [
{
dipVorgangsId: 999001,
title: "Entwurf eines Gesetzes zur Förderung erneuerbarer Energien",
abstract:
"Der Gesetzentwurf sieht eine umfassende Reform der Förderung erneuerbarer Energien vor, einschließlich beschleunigter Genehmigungsverfahren für Wind- und Solaranlagen.",
beratungsstand: "1. Beratung",
summary:
"Erneuerbare Energien sollen stärker gefördert werden. Genehmigungsverfahren für Windräder und Solaranlagen werden vereinfacht und beschleunigt.",
},
{
dipVorgangsId: 999002,
title: "Gesetz zur Stärkung der digitalen Infrastruktur",
abstract:
"Ausbau des Glasfasernetzes und 5G-Versorgung in ländlichen Gebieten soll durch staatliche Zuschüsse und vereinfachte Bauvorschriften beschleunigt werden.",
beratungsstand: "Beschlussempfehlung liegt vor",
summary:
"Schnelleres Internet für alle: Glasfaser und 5G sollen mit staatlicher Hilfe auch aufs Land kommen. Bürokratie beim Netzausbau wird abgebaut.",
},
{
dipVorgangsId: 999003,
title: "Entwurf eines Gesetzes zur Reform des Mietrechts",
abstract:
"Der Entwurf enthält Maßnahmen zur Begrenzung von Mieterhöhungen, Stärkung des Kündigungsschutzes und Einführung eines bundesweiten Mietspiegels.",
beratungsstand: "Überwiesen",
summary:
"Mieter sollen besser geschützt werden: strengere Grenzen für Mieterhöhungen, stärkerer Kündigungsschutz und ein einheitlicher Mietspiegel für ganz Deutschland.",
},
{
dipVorgangsId: 999004,
title: "Gesetz zur Verbesserung der Pflegeversorgung",
abstract:
"Erhöhung der Pflegelöhne, Einführung verbindlicher Personalschlüssel in Pflegeeinrichtungen und Ausweitung der ambulanten Pflegeleistungen.",
beratungsstand: "1. Beratung",
summary:
"Bessere Pflege: Höhere Löhne für Pflegekräfte, mehr Personal pro Station und bessere Unterstützung für Pflege zu Hause.",
},
{
dipVorgangsId: 999005,
title: "Entwurf eines Klimaanpassungsgesetzes",
abstract:
"Kommunen erhalten Mittel für Klimaanpassungsmaßnahmen wie Hochwasserschutz, Stadtbegrünung und hitzeresistente Infrastruktur.",
beratungsstand: "Beschlussempfehlung liegt vor",
summary:
"Städte und Gemeinden bekommen Geld für Schutz vor Klimafolgen: besserer Hochwasserschutz, mehr Grün in Städten und hitzefeste Gebäude.",
},
]
export async function seedMockLegislation() {
const expires = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000) // 30 days
const inserted: number[] = []
for (const mock of MOCK_LEGISLATION) {
const rows = await db
.insert(legislationTexts)
.values({
dipVorgangsId: mock.dipVorgangsId,
title: mock.title,
abstract: mock.abstract,
beratungsstand: mock.beratungsstand,
expiresAt: expires,
})
.onConflictDoUpdate({
target: legislationTexts.dipVorgangsId,
set: {
title: mock.title,
abstract: mock.abstract,
beratungsstand: mock.beratungsstand,
fetchedAt: new Date(),
expiresAt: expires,
},
})
.returning({ id: legislationTexts.id })
const legId = rows[0].id
inserted.push(legId)
if (mock.summary) {
await db
.insert(legislationSummaries)
.values({ legislationId: legId, summary: mock.summary })
.onConflictDoUpdate({
target: legislationSummaries.legislationId,
set: { summary: mock.summary, generatedAt: new Date() },
})
}
}
return inserted
}