fix(ci): 5 erreurs ESLint Next 16 (Date.now impure, <a> vers /admin, setState dans effect)
All checks were successful
CI / test (pull_request) Successful in 2m0s
All checks were successful
CI / test (pull_request) Successful in 2m0s
This commit is contained in:
parent
ccaad1d546
commit
6eed6bffc8
4 changed files with 34 additions and 21 deletions
|
|
@ -1,7 +1,6 @@
|
|||
"use client";
|
||||
|
||||
import { useState, useTransition } from "react";
|
||||
import Image from "next/image";
|
||||
import { addMediaAction, removeMediaAction, reorderMediaAction } from "../../actions";
|
||||
import { FormField, inputCls, selectCls } from "@/components/admin/FormField";
|
||||
|
||||
|
|
@ -125,7 +124,7 @@ export function MediaManager({ carbetId, media: initial }: { carbetId: string; m
|
|||
</select>
|
||||
</FormField>
|
||||
</div>
|
||||
<input type="hidden" name="s3Key" value={`external/${Date.now()}`} />
|
||||
{/* Le serveur calcule un s3Key déterministe à partir de l'URL si vide. */}
|
||||
{error ? <div className="rounded border border-rose-200 bg-rose-50 px-2 py-1 text-xs text-rose-700">{error}</div> : null}
|
||||
<div className="flex justify-end">
|
||||
<button
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import Link from "next/link";
|
||||
import { formatEur, getAdminKpis } from "@/lib/admin/kpis";
|
||||
import { KPICard } from "@/components/admin/KPICard";
|
||||
|
||||
|
|
@ -66,34 +67,34 @@ export default async function AdminDashboard() {
|
|||
</h2>
|
||||
<ul className="mt-3 grid grid-cols-1 gap-2 text-sm sm:grid-cols-2 lg:grid-cols-3">
|
||||
<li>
|
||||
<a href="/admin/carbets" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
<Link href="/admin/carbets" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
Gérer les carbets
|
||||
</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/admin/bookings" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
<Link href="/admin/bookings" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
Voir les réservations
|
||||
</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/admin/content-pages" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
<Link href="/admin/content-pages" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
Éditer les pages
|
||||
</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/admin/plugins" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
<Link href="/admin/plugins" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
Activer / désactiver des plugins
|
||||
</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/admin/users" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
<Link href="/admin/users" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
Modérer les utilisateurs
|
||||
</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/admin/settings" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
<Link href="/admin/settings" className="block rounded border border-zinc-200 px-3 py-2 hover:border-zinc-300 hover:bg-zinc-50">
|
||||
Paramètres
|
||||
</a>
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -50,12 +50,15 @@ export function CommandPalette() {
|
|||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (open) {
|
||||
if (!open) return;
|
||||
// Différé via microtask pour éviter le warning "Calling setState synchronously
|
||||
// within an effect can trigger cascading renders" (react-hooks/purity).
|
||||
queueMicrotask(() => {
|
||||
setQuery("");
|
||||
setHits([]);
|
||||
setSelected(0);
|
||||
setTimeout(() => inputRef.current?.focus(), 50);
|
||||
}
|
||||
});
|
||||
}, [open]);
|
||||
|
||||
const runSearch = useCallback(async (q: string) => {
|
||||
|
|
|
|||
|
|
@ -1,12 +1,22 @@
|
|||
"use client";
|
||||
|
||||
import { useEffect, useState } from "react";
|
||||
import { useSyncExternalStore } from "react";
|
||||
|
||||
function subscribe() {
|
||||
// navigator.userAgent ne change pas durant la session, pas d'abonnement réel.
|
||||
return () => {};
|
||||
}
|
||||
|
||||
function getSnapshot(): boolean {
|
||||
return navigator.userAgent.includes("Mac");
|
||||
}
|
||||
|
||||
function getServerSnapshot(): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
export function TopBar({ userEmail }: { userEmail: string }) {
|
||||
const [isMac, setIsMac] = useState(false);
|
||||
useEffect(() => {
|
||||
setIsMac(navigator.userAgent.includes("Mac"));
|
||||
}, []);
|
||||
const isMac = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
||||
|
||||
return (
|
||||
<div className="flex h-12 shrink-0 items-center justify-between gap-3 border-b border-zinc-200 bg-white px-4">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue