UX polish pass 2: toasts, optimistic updates, mod update detection
- Install sonner; <Toaster> mounted in Providers, auto-tracks theme. - Toasts replace inline result Alerts across ServerControls, PlayerManager, BackupManager, ModManager (install/remove/restore/delete/start/stop). - PlayerManager: optimistic op/deop/whitelist/ban/pardon via onMutate + rollback; UI updates instantly before RCON round-trip. - Modrinth search results now show author + "updated Xd ago" with full timestamp on hover; downloads on its own row. - New /api/mods/updates endpoint: per-installed-mod Modrinth latest-version lookup (parallel, 30min memo). Amber "Update available" badge rendered next to installed mod rows when filenames differ. - PlayerAvatar + Modrinth icons migrated to next/image (unoptimized, size hints) — fewer layout shifts. - Login page surfaces ?error= + NextAuth error codes (CredentialsSignin, SessionRequired, etc.), preserves callbackUrl, adds autocomplete hints and role="alert". Wrapped in Suspense per Next 16 requirement. - Snapshots + backups show relative "Xh ago" with exact timestamp on hover via new lib/time.ts helper. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
6c91f7fef0
commit
f9ae1afac1
12 changed files with 334 additions and 76 deletions
|
|
@ -16,6 +16,9 @@ export type SearchResult = {
|
|||
icon_url: string;
|
||||
downloads: number;
|
||||
project_id: string;
|
||||
author: string;
|
||||
date_modified: string;
|
||||
follows: number;
|
||||
};
|
||||
|
||||
export type ModDownload = {
|
||||
|
|
@ -53,12 +56,15 @@ export async function searchMods(query: string): Promise<SearchResult[]> {
|
|||
|
||||
const data = await res.json();
|
||||
return data.hits.map((h: Record<string, unknown>) => ({
|
||||
slug: h.slug,
|
||||
title: h.title,
|
||||
description: h.description,
|
||||
icon_url: h.icon_url || "",
|
||||
downloads: h.downloads,
|
||||
project_id: h.project_id,
|
||||
slug: h.slug as string,
|
||||
title: h.title as string,
|
||||
description: h.description as string,
|
||||
icon_url: (h.icon_url as string) || "",
|
||||
downloads: (h.downloads as number) ?? 0,
|
||||
project_id: h.project_id as string,
|
||||
author: (h.author as string) || "",
|
||||
date_modified: (h.date_modified as string) || "",
|
||||
follows: (h.follows as number) ?? 0,
|
||||
}));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue