- Replaced the previous webapp with a new Mini App built using Next.js, improving performance and maintainability. - Updated the `.gitignore` to exclude Next.js build artifacts and node modules. - Revised documentation in `AGENTS.md`, `README.md`, and `architecture.md` to reflect the new Mini App structure and technology stack. - Enhanced Dockerfile to support the new build process for the Next.js application. - Updated CI workflow to build and test the Next.js application. - Added new configuration options for the Mini App, including `MINI_APP_SHORT_NAME` for improved deep linking. - Refactored frontend testing setup to accommodate the new structure and testing framework. - Removed legacy webapp files and dependencies to streamline the project.
47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
/**
|
|
* Access denied state: message and optional server detail.
|
|
* Ported from webapp/js/ui.js showAccessDenied and states.css .access-denied.
|
|
*/
|
|
|
|
"use client";
|
|
|
|
import { useTranslation } from "@/i18n/use-translation";
|
|
import { cn } from "@/lib/utils";
|
|
|
|
export interface AccessDeniedProps {
|
|
/** Optional detail from API 403 response, shown below the main message. */
|
|
serverDetail?: string | null;
|
|
/** Optional class for the container. */
|
|
className?: string;
|
|
}
|
|
|
|
/**
|
|
* Displays access denied message; optional second paragraph for server detail.
|
|
*/
|
|
export function AccessDenied({ serverDetail, className }: AccessDeniedProps) {
|
|
const { t } = useTranslation();
|
|
const hasDetail = Boolean(serverDetail && String(serverDetail).trim());
|
|
|
|
return (
|
|
<div
|
|
className={cn(
|
|
"rounded-xl bg-surface py-6 px-4 my-3 text-center text-muted-foreground shadow-sm transition-opacity duration-200",
|
|
className
|
|
)}
|
|
role="alert"
|
|
>
|
|
<p className="m-0 mb-2 font-semibold text-error">
|
|
{t("access_denied")}
|
|
</p>
|
|
{hasDetail && (
|
|
<p className="mt-2 m-0 text-sm text-muted">
|
|
{serverDetail}
|
|
</p>
|
|
)}
|
|
<p className="mt-2 m-0 text-sm text-muted">
|
|
{t("access_denied.hint")}
|
|
</p>
|
|
</div>
|
|
);
|
|
}
|