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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user