feat: enhance testing and admin page functionality
- Mocked `useRouter` from `next/navigation` in tests to improve routing behavior during testing. - Updated admin page tests to reflect changes in title display and removed unnecessary back link check. - Refactored admin page header to improve accessibility and layout, displaying month and year more clearly. - Removed unused imports and components to streamline code and enhance maintainability.
This commit is contained in:
@@ -6,14 +6,14 @@
|
||||
"use client";
|
||||
|
||||
import { useRef, useState, useEffect, useCallback } from "react";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/navigation";
|
||||
import { settingsButton } from "@telegram-apps/sdk-react";
|
||||
import { useAppStore } from "@/store/app-store";
|
||||
import { useShallow } from "zustand/react/shallow";
|
||||
import { useMonthData } from "@/hooks/use-month-data";
|
||||
import { useSwipe } from "@/hooks/use-swipe";
|
||||
import { useStickyScroll } from "@/hooks/use-sticky-scroll";
|
||||
import { useAutoRefresh } from "@/hooks/use-auto-refresh";
|
||||
import { useTranslation } from "@/i18n/use-translation";
|
||||
import { CalendarHeader } from "@/components/calendar/CalendarHeader";
|
||||
import { CalendarGrid } from "@/components/calendar/CalendarGrid";
|
||||
import { DutyList } from "@/components/duty/DutyList";
|
||||
@@ -80,7 +80,7 @@ export function CalendarPage({ isAllowed, initDataRaw }: CalendarPageProps) {
|
||||
}))
|
||||
);
|
||||
|
||||
const { t } = useTranslation();
|
||||
const router = useRouter();
|
||||
|
||||
const { retry } = useMonthData({
|
||||
initDataRaw,
|
||||
@@ -138,6 +138,35 @@ export function CalendarPage({ isAllowed, initDataRaw }: CalendarPageProps) {
|
||||
}
|
||||
}, [loading, accessDenied, setAppContentReady]);
|
||||
|
||||
// Show native Settings button in Telegram context menu for admins; click navigates to /admin.
|
||||
useEffect(() => {
|
||||
if (!isAdmin) return;
|
||||
let offClick: (() => void) | undefined;
|
||||
try {
|
||||
if (settingsButton.mount.isAvailable()) {
|
||||
settingsButton.mount();
|
||||
}
|
||||
if (settingsButton.show.isAvailable()) {
|
||||
settingsButton.show();
|
||||
}
|
||||
if (settingsButton.onClick.isAvailable()) {
|
||||
offClick = settingsButton.onClick(() => router.push("/admin"));
|
||||
}
|
||||
} catch {
|
||||
// Non-Telegram environment; SettingsButton not available.
|
||||
}
|
||||
return () => {
|
||||
try {
|
||||
if (typeof offClick === "function") offClick();
|
||||
if (settingsButton.hide.isAvailable()) {
|
||||
settingsButton.hide();
|
||||
}
|
||||
} catch {
|
||||
// Ignore cleanup errors in non-Telegram environment.
|
||||
}
|
||||
};
|
||||
}, [isAdmin, router]);
|
||||
|
||||
return (
|
||||
<div className="content-safe mx-auto flex min-h-[var(--tg-viewport-stable-height,100vh)] w-full max-w-[var(--max-width-app)] flex-col bg-background px-3 pb-6">
|
||||
<div
|
||||
@@ -149,16 +178,6 @@ export function CalendarPage({ isAllowed, initDataRaw }: CalendarPageProps) {
|
||||
disabled={navDisabled}
|
||||
onPrevMonth={handlePrevMonth}
|
||||
onNextMonth={handleNextMonth}
|
||||
trailingContent={
|
||||
isAdmin ? (
|
||||
<Link
|
||||
href="/admin"
|
||||
className="text-sm text-accent hover:underline focus-visible:outline-accent rounded"
|
||||
>
|
||||
{t("admin.link")}
|
||||
</Link>
|
||||
) : undefined
|
||||
}
|
||||
/>
|
||||
<CalendarGrid
|
||||
currentMonth={currentMonth}
|
||||
|
||||
Reference in New Issue
Block a user