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:
@@ -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" }}> </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" }}> </div>
|
||||
</div>
|
||||
</AnimatedContainer>
|
||||
);
|
||||
}
|
||||
return <GetAppointmentsContent />;
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user