Add a full-viewport /admin/studio workspace that unifies the import and catalog systems into a single automated flow: - Furni library browser against official Habbo furnidata with search, type/status filters, live previews and pagination - Catalog structure rail showing where imported furniture lands - Detail drawer with automatic placement preview (category + price via classifyFurni/autoPriceFurni) and one-click import that downloads assets, converts SWF to nitro, writes items_base, updates FurnitureData.json and creates an auto-priced catalog entry - Batch auto-import with SSE progress and RCON cache refresh - Nitro editor integration and imported-item deletion Extract pure auto-catalog helpers (CATEGORY_PAGE, CLASSNAME_RULES, classifyFurni, autoPriceFurni) into a client-safe module shared by the server pipeline and the Studio UI so the preview always matches what the emulator import applies.
28 lines
852 B
TypeScript
28 lines
852 B
TypeScript
import { redirect } from "next/navigation";
|
|
import { StudioClient } from "@/components/admin/studio/studio-client";
|
|
import { buildFurniImportSource } from "@/lib/habbo-gamedata-hotel";
|
|
import { canAccess, getAdminContext, PERMS } from "@/lib/permissions";
|
|
import { getTreeFlat } from "@/lib/services/catalog-tree";
|
|
import { getHabboGamedataHotel } from "@/lib/services/habbo-gamedata-hotel";
|
|
|
|
export default async function StudioPage(_props: {
|
|
params: Promise<{ locale: string }>;
|
|
}) {
|
|
const { session, permissions } = await getAdminContext();
|
|
if (!canAccess(permissions, PERMS.ASSETS_IMPORT, session.user.rank)) {
|
|
redirect("/admin");
|
|
}
|
|
|
|
const [hotel, catalogTree] = await Promise.all([
|
|
getHabboGamedataHotel(),
|
|
getTreeFlat(),
|
|
]);
|
|
|
|
return (
|
|
<StudioClient
|
|
source={buildFurniImportSource(hotel)}
|
|
initialTree={catalogTree}
|
|
/>
|
|
);
|
|
}
|