feat: agregar metadatos y contenido a las páginas de categorías y reservas de turnos, y actualizar el sitemap con nuevas rutas de exploración

This commit is contained in:
2026-09-16 10:09:31 -03:00
parent 8c1089df41
commit 60eb940d3e
4 changed files with 124 additions and 43 deletions
@@ -1,9 +1,39 @@
import { Metadata } from "next";
import AnimatedContainer from "@components/AnimatedConainer/AnimatedContainer";
import CategoriesExplorer from "@core/app/components/Home/CategoriesExplorer/page";
import DefaultLoginAction from "@core/app/components/LoginAction/DefaultLoginAction";
import { ScrollToTop } from "@core/app/components/ScrollTop";
import style from "./style.module.css";
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "https://turnosxpress.com.ar";
export const metadata: Metadata = {
title: "Explorá categorías y encontrá tu próximo turno | TurnosXpress",
description:
"Categorías de servicios por rubro en TurnosXpress. Elegí el tipo de servicio que necesitás y filtrá por ubicación para encontrar opciones cercanas, rápidas y organizadas.",
alternates: {
canonical: `${baseUrl}/landing/categories`,
},
openGraph: {
type: "website",
title: "Explorá categorías y encontrá tu próximo turno | TurnosXpress",
description:
"Categorías de servicios por rubro en TurnosXpress. Elegí el tipo de servicio que necesitás y filtrá por ubicación.",
url: `${baseUrl}/landing/categories`,
siteName: "TurnosXpress",
locale: "es_AR",
},
twitter: {
card: "summary",
title: "Explorá categorías y encontrá tu próximo turno | TurnosXpress",
description: "Categorías de servicios por rubro en TurnosXpress.",
},
robots: {
index: true,
follow: true,
},
};
export default function CategoriesPage() {
return (
<AnimatedContainer
@@ -0,0 +1,44 @@
"use client";
import AnimatedContainer from "@components/AnimatedConainer/AnimatedContainer";
import ExploreCategories from "@core/app/components/ExploreCategories/ExploreCategories";
import HeaderConfProvider from "@core/app/components/HeaderConfProvider/HeaderConfProvider";
import useContainerHeight from "@core/app/hooks/ContainerHeight";
import { ScrollToTop } from "@core/app/components/ScrollTop";
import DefaultLoginAction from "@core/app/components/LoginAction/DefaultLoginAction";
export default function GetAppointmentsContent() {
const containerHeight = useContainerHeight();
return (
<AnimatedContainer
color="#aeaeae"
minSize={150}
maxSize={500}
items={10}
style={{
display: "flex",
flexDirection: "column",
justifyContent: "center",
alignItems: "center",
}}
>
<ScrollToTop />
<HeaderConfProvider />
<DefaultLoginAction />
<div className="homeCentered">
<h1 className="homeTitleHeader">Quiero reservar turno</h1>
<p className="homeResumeHeader">
Reservar un turno es muy fácil. Solo tenés que explorar nuestras categorías y
buscar el servicio más adecuado para vos. Una vez que ingreses al servicio,
podrás realizar la reserva. Tené en cuenta que, para poder reservar, debés estar
registrado en nuestro sitio web.
</p>
</div>
<div className="homeCentered">
<ExploreCategories containerHeight={containerHeight} />
<div style={{ height: "100px" }}>&nbsp;</div>
</div>
</AnimatedContainer>
);
}
@@ -1,44 +1,35 @@
"use client";
import AnimatedContainer from "@components/AnimatedConainer/AnimatedContainer";
import ExploreCategories from "@core/app/components/ExploreCategories/ExploreCategories";
import HeaderConfProvider from "@core/app/components/HeaderConfProvider/HeaderConfProvider";
import useContainerHeight from "@core/app/hooks/ContainerHeight";
import { ScrollToTop } from "@core/app/components/ScrollTop";
import DefaultLoginAction from "@core/app/components/LoginAction/DefaultLoginAction";
import { Metadata } from "next";
import GetAppointmentsContent from "./GetAppointmentsContent";
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "https://turnosxpress.com.ar";
export const metadata: Metadata = {
title: "Quiero reservar turno | TurnosXpress",
description:
"Reservá tu turno en TurnosXpress: explorá categorías y buscá el servicio más adecuado para vos. Registrate y reservá en minutos.",
alternates: {
canonical: `${baseUrl}/landing/get-appointments`,
},
openGraph: {
type: "website",
title: "Quiero reservar turno | TurnosXpress",
description:
"Explorá categorías, buscá el servicio más adecuado para vos y reservá tu turno en TurnosXpress.",
url: `${baseUrl}/landing/get-appointments`,
siteName: "TurnosXpress",
locale: "es_AR",
},
twitter: {
card: "summary",
title: "Quiero reservar turno | TurnosXpress",
description: "Explorá categorías y reservá tu turno en TurnosXpress.",
},
robots: {
index: true,
follow: true,
},
};
export default function GetAppointmentsPage() {
const containerHeight = useContainerHeight();
return (
<AnimatedContainer
color="#aeaeae"
minSize={150}
maxSize={500}
items={10}
style={{
display: "flex",
flexDirection: "column",
justifyContent: "center",
alignItems: "center",
}}
>
<ScrollToTop />
<HeaderConfProvider />
<DefaultLoginAction />
<div className="homeCentered">
<h1 className="homeTitleHeader">Quiero reservar turno</h1>
<p className="homeResumeHeader">
Reservar un turno es muy fácil. Solo tenés que explorar nuestras categorías y
buscar el servicio más adecuado para vos. Una vez que ingreses al servicio,
podrás realizar la reserva. Tené en cuenta que, para poder reservar, debés estar
registrado en nuestro sitio web.
</p>
</div>
<div className="homeCentered">
<ExploreCategories containerHeight={containerHeight} />
<div style={{ height: "100px" }}>&nbsp;</div>
</div>
</AnimatedContainer>
);
return <GetAppointmentsContent />;
}
+17 -1
View File
@@ -94,6 +94,22 @@ export async function GET() {
},
];
// Category exploration pages
// /landing/reviews is intentionally omitted: it renders rating lists driven by
// query params (?targetType=&targetId=) — parametric thin pages, not stable URLs.
const explorationRoutes: SitemapRoute[] = [
{
url: `${baseUrl}/landing/categories`,
changeFrequency: "weekly",
priority: 0.8,
},
{
url: `${baseUrl}/landing/get-appointments`,
changeFrequency: "weekly",
priority: 0.6,
},
];
// Legal pages (rarely change, low priority)
const legalRoutes: SitemapRoute[] = [
{
@@ -149,7 +165,7 @@ export async function GET() {
console.error("Error generating sitemap:", error);
}
const allRoutes = [...staticRoutes, ...videoRoutes, ...authRoutes, ...marketingRoutes, ...legalRoutes, ...serviceRoutes];
const allRoutes = [...staticRoutes, ...videoRoutes, ...authRoutes, ...marketingRoutes, ...explorationRoutes, ...legalRoutes, ...serviceRoutes];
const sitemapXml = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"