Fix hydration mismatch and nativeButton warning in backup section

- Use date-fns format() instead of toLocaleDateString() for deterministic
  server/client date rendering
- Set nativeButton={false} on download link Button to suppress base-ui warning

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-03 20:15:29 -05:00
co-authored by Claude Opus 4.6
parent e59364e126
commit b90129a981
@@ -8,7 +8,7 @@ import {
IconPlus, IconPlus,
IconTrash, IconTrash,
} from "@tabler/icons-react"; } from "@tabler/icons-react";
import { formatDistanceToNow } from "date-fns"; import { format, formatDistanceToNow } from "date-fns";
import { AnimatePresence, motion } from "motion/react"; import { AnimatePresence, motion } from "motion/react";
import { useRef, useState } from "react"; import { useRef, useState } from "react";
import { toast } from "sonner"; import { toast } from "sonner";
@@ -42,12 +42,7 @@ function formatBytes(bytes: number): string {
} }
function formatBackupDate(dateStr: string): string { function formatBackupDate(dateStr: string): string {
return new Date(dateStr).toLocaleDateString(undefined, { return format(new Date(dateStr), "MMM d, h:mm a");
month: "short",
day: "numeric",
hour: "numeric",
minute: "2-digit",
});
} }
export function BackupSection({ export function BackupSection({
@@ -159,7 +154,7 @@ export function BackupSection({
<div className="flex items-center justify-between gap-4"> <div className="flex items-center justify-between gap-4">
<div className="flex items-start gap-3"> <div className="flex items-start gap-3">
<div className="mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary/10"> <div className="mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary/10">
<IconDatabaseExport size={16} className="text-primary" /> <IconDatabaseExport className="size-4 text-primary" />
</div> </div>
<div> <div>
<CardTitle>Database snapshots</CardTitle> <CardTitle>Database snapshots</CardTitle>
@@ -171,7 +166,7 @@ export function BackupSection({
</div> </div>
</div> </div>
<Button onClick={handleCreateBackup} disabled={creating}> <Button onClick={handleCreateBackup} disabled={creating}>
{creating ? <Spinner className="size-3" /> : <IconPlus size={14} />} {creating ? <Spinner className="size-3" /> : <IconPlus />}
{creating ? "Creating..." : "New backup"} {creating ? "Creating..." : "New backup"}
</Button> </Button>
</div> </div>
@@ -216,6 +211,7 @@ export function BackupSection({
<Button <Button
variant="ghost" variant="ghost"
size="icon-sm" size="icon-sm"
nativeButton={false}
render={ render={
<a <a
href={`/api/backup/${backup.filename}`} href={`/api/backup/${backup.filename}`}
@@ -239,7 +235,7 @@ export function BackupSection({
} }
> >
{deleting === backup.filename ? ( {deleting === backup.filename ? (
<Spinner className="size-3" /> <Spinner />
) : ( ) : (
<IconTrash /> <IconTrash />
)} )}
@@ -280,7 +276,7 @@ export function BackupSection({
<div className="flex items-center justify-between gap-4"> <div className="flex items-center justify-between gap-4">
<div className="flex items-start gap-3"> <div className="flex items-start gap-3">
<div className="mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted/50"> <div className="mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted/50">
<IconCloudUpload size={16} className="text-muted-foreground" /> <IconCloudUpload className="size-4 text-muted-foreground" />
</div> </div>
<div> <div>
<CardTitle>Restore</CardTitle> <CardTitle>Restore</CardTitle>
@@ -322,11 +318,7 @@ export function BackupSection({
onClick={() => fileInputRef.current?.click()} onClick={() => fileInputRef.current?.click()}
disabled={restoring} disabled={restoring}
> >
{restoring ? ( {restoring ? <Spinner /> : <IconCloudUpload />}
<Spinner className="size-3" />
) : (
<IconCloudUpload size={14} />
)}
{restoring ? "Restoring..." : "Upload"} {restoring ? "Restoring..." : "Upload"}
</Button> </Button>
</div> </div>
@@ -337,7 +329,7 @@ export function BackupSection({
<div className="flex items-center justify-between gap-4"> <div className="flex items-center justify-between gap-4">
<div className="flex items-start gap-3"> <div className="flex items-start gap-3">
<div className="mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted/50"> <div className="mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted/50">
<IconCalendarRepeat size={16} className="text-muted-foreground" /> <IconCalendarRepeat className="size-4 text-muted-foreground" />
</div> </div>
<div> <div>
<CardTitle>Scheduled backups</CardTitle> <CardTitle>Scheduled backups</CardTitle>