diff --git a/src/app/api/admin/group-bookings/route.ts b/src/app/api/admin/group-bookings/route.ts
index 5e52739..6fa5fb4 100644
--- a/src/app/api/admin/group-bookings/route.ts
+++ b/src/app/api/admin/group-bookings/route.ts
@@ -21,7 +21,8 @@ export async function PUT(request: NextRequest) {
return NextResponse.json({ ok: true });
}
return NextResponse.json({ error: "Unknown action" }, { status: 400 });
- } catch {
+ } catch (err) {
+ console.error("[admin/group-bookings] error:", err);
return NextResponse.json({ error: "Internal error" }, { status: 500 });
}
}
diff --git a/src/app/api/admin/mc-registrations/route.ts b/src/app/api/admin/mc-registrations/route.ts
index 91f3a95..7ac3267 100644
--- a/src/app/api/admin/mc-registrations/route.ts
+++ b/src/app/api/admin/mc-registrations/route.ts
@@ -19,7 +19,8 @@ export async function POST(request: NextRequest) {
}
const id = addMcRegistration(masterClassTitle.trim(), name.trim(), instagram.trim(), telegram?.trim() || undefined);
return NextResponse.json({ ok: true, id });
- } catch {
+ } catch (err) {
+ console.error("[admin/mc-registrations] error:", err);
return NextResponse.json({ error: "Internal error" }, { status: 500 });
}
}
@@ -48,7 +49,8 @@ export async function PUT(request: NextRequest) {
}
updateMcRegistration(id, name.trim(), instagram.trim(), telegram?.trim() || undefined);
return NextResponse.json({ ok: true });
- } catch {
+ } catch (err) {
+ console.error("[admin/mc-registrations] error:", err);
return NextResponse.json({ error: "Internal error" }, { status: 500 });
}
}
diff --git a/src/app/api/admin/open-day/bookings/route.ts b/src/app/api/admin/open-day/bookings/route.ts
index ee7055e..3aaf08f 100644
--- a/src/app/api/admin/open-day/bookings/route.ts
+++ b/src/app/api/admin/open-day/bookings/route.ts
@@ -28,7 +28,8 @@ export async function PUT(request: NextRequest) {
return NextResponse.json({ ok: true });
}
return NextResponse.json({ error: "Unknown action" }, { status: 400 });
- } catch {
+ } catch (err) {
+ console.error("[admin/open-day/bookings] error:", err);
return NextResponse.json({ error: "Internal error" }, { status: 500 });
}
}
diff --git a/src/app/api/admin/open-day/classes/route.ts b/src/app/api/admin/open-day/classes/route.ts
index 08a1344..f920510 100644
--- a/src/app/api/admin/open-day/classes/route.ts
+++ b/src/app/api/admin/open-day/classes/route.ts
@@ -39,7 +39,8 @@ export async function PUT(request: NextRequest) {
const { id, ...data } = body;
updateOpenDayClass(id, data);
return NextResponse.json({ ok: true });
- } catch {
+ } catch (err) {
+ console.error("[admin/open-day/classes] error:", err);
return NextResponse.json({ error: "Internal error" }, { status: 500 });
}
}
diff --git a/src/app/api/admin/open-day/route.ts b/src/app/api/admin/open-day/route.ts
index 04ced9b..ff89cf2 100644
--- a/src/app/api/admin/open-day/route.ts
+++ b/src/app/api/admin/open-day/route.ts
@@ -27,7 +27,8 @@ export async function POST(request: NextRequest) {
}
const id = createOpenDayEvent(body);
return NextResponse.json({ ok: true, id });
- } catch {
+ } catch (err) {
+ console.error("[admin/open-day] error:", err);
return NextResponse.json({ error: "Internal error" }, { status: 500 });
}
}
@@ -39,7 +40,8 @@ export async function PUT(request: NextRequest) {
const { id, ...data } = body;
updateOpenDayEvent(id, data);
return NextResponse.json({ ok: true });
- } catch {
+ } catch (err) {
+ console.error("[admin/open-day] error:", err);
return NextResponse.json({ error: "Internal error" }, { status: 500 });
}
}
diff --git a/src/app/api/admin/reminders/route.ts b/src/app/api/admin/reminders/route.ts
index 7437a6c..4abddb8 100644
--- a/src/app/api/admin/reminders/route.ts
+++ b/src/app/api/admin/reminders/route.ts
@@ -30,7 +30,8 @@ export async function PUT(request: NextRequest) {
status as ReminderStatus | null
);
return NextResponse.json({ ok: true });
- } catch {
+ } catch (err) {
+ console.error("[admin/reminders] error:", err);
return NextResponse.json({ error: "Internal error" }, { status: 500 });
}
}
diff --git a/src/app/api/admin/validate-instagram/route.ts b/src/app/api/admin/validate-instagram/route.ts
index 8cfd534..8278d2a 100644
--- a/src/app/api/admin/validate-instagram/route.ts
+++ b/src/app/api/admin/validate-instagram/route.ts
@@ -20,7 +20,8 @@ export async function GET(request: NextRequest) {
// Instagram returns 200 for existing profiles, 404 for non-existing
const valid = res.ok;
return NextResponse.json({ valid });
- } catch {
+ } catch (err) {
+ console.error("[admin/validate-instagram] error:", err);
// Network error or timeout — don't block the user
return NextResponse.json({ valid: true, uncertain: true });
}
diff --git a/src/app/api/group-booking/route.ts b/src/app/api/group-booking/route.ts
index f409fcf..a31ce7f 100644
--- a/src/app/api/group-booking/route.ts
+++ b/src/app/api/group-booking/route.ts
@@ -27,7 +27,8 @@ export async function POST(request: NextRequest) {
const id = addGroupBooking(cleanName, cleanPhone, cleanGroup, cleanIg, cleanTg);
return NextResponse.json({ ok: true, id });
- } catch {
+ } catch (err) {
+ console.error("[group-booking] POST error:", err);
return NextResponse.json({ error: "Internal error" }, { status: 500 });
}
}
diff --git a/src/app/api/master-class-register/route.ts b/src/app/api/master-class-register/route.ts
index d43eb2e..2c461d8 100644
--- a/src/app/api/master-class-register/route.ts
+++ b/src/app/api/master-class-register/route.ts
@@ -38,7 +38,8 @@ export async function POST(request: Request) {
);
return NextResponse.json({ ok: true, id });
- } catch {
+ } catch (err) {
+ console.error("[master-class-register] POST error:", err);
return NextResponse.json({ error: "Internal error" }, { status: 500 });
}
}
diff --git a/src/app/api/open-day-register/route.ts b/src/app/api/open-day-register/route.ts
index 64ae02d..66a2a22 100644
--- a/src/app/api/open-day-register/route.ts
+++ b/src/app/api/open-day-register/route.ts
@@ -58,6 +58,7 @@ export async function POST(request: NextRequest) {
if (msg.includes("UNIQUE")) {
return NextResponse.json({ error: "Вы уже записаны на это занятие" }, { status: 409 });
}
- return NextResponse.json({ error: msg }, { status: 500 });
+ console.error("[open-day-register] POST error:", e);
+ return NextResponse.json({ error: "Internal error" }, { status: 500 });
}
}
diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx
index f4860ef..d5c89d2 100644
--- a/src/components/layout/Header.tsx
+++ b/src/components/layout/Header.tsx
@@ -15,8 +15,15 @@ export function Header() {
const [bookingOpen, setBookingOpen] = useState(false);
useEffect(() => {
+ let ticking = false;
function handleScroll() {
- setScrolled(window.scrollY > UI_CONFIG.scrollThresholds.header);
+ if (!ticking) {
+ ticking = true;
+ requestAnimationFrame(() => {
+ setScrolled(window.scrollY > UI_CONFIG.scrollThresholds.header);
+ ticking = false;
+ });
+ }
}
window.addEventListener("scroll", handleScroll, { passive: true });
return () => window.removeEventListener("scroll", handleScroll);
@@ -128,7 +135,8 @@ export function Header() {