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 AnimatedContainer from "@components/AnimatedConainer/AnimatedContainer";
|
||||||
import CategoriesExplorer from "@core/app/components/Home/CategoriesExplorer/page";
|
import CategoriesExplorer from "@core/app/components/Home/CategoriesExplorer/page";
|
||||||
import DefaultLoginAction from "@core/app/components/LoginAction/DefaultLoginAction";
|
import DefaultLoginAction from "@core/app/components/LoginAction/DefaultLoginAction";
|
||||||
import { ScrollToTop } from "@core/app/components/ScrollTop";
|
import { ScrollToTop } from "@core/app/components/ScrollTop";
|
||||||
import style from "./style.module.css";
|
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() {
|
export default function CategoriesPage() {
|
||||||
return (
|
return (
|
||||||
<AnimatedContainer
|
<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 { Metadata } from "next";
|
||||||
import AnimatedContainer from "@components/AnimatedConainer/AnimatedContainer";
|
import GetAppointmentsContent from "./GetAppointmentsContent";
|
||||||
import ExploreCategories from "@core/app/components/ExploreCategories/ExploreCategories";
|
|
||||||
import HeaderConfProvider from "@core/app/components/HeaderConfProvider/HeaderConfProvider";
|
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "https://turnosxpress.com.ar";
|
||||||
import useContainerHeight from "@core/app/hooks/ContainerHeight";
|
|
||||||
import { ScrollToTop } from "@core/app/components/ScrollTop";
|
export const metadata: Metadata = {
|
||||||
import DefaultLoginAction from "@core/app/components/LoginAction/DefaultLoginAction";
|
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() {
|
export default function GetAppointmentsPage() {
|
||||||
const containerHeight = useContainerHeight();
|
return <GetAppointmentsContent />;
|
||||||
|
}
|
||||||
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>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -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)
|
// Legal pages (rarely change, low priority)
|
||||||
const legalRoutes: SitemapRoute[] = [
|
const legalRoutes: SitemapRoute[] = [
|
||||||
{
|
{
|
||||||
@@ -149,7 +165,7 @@ export async function GET() {
|
|||||||
console.error("Error generating sitemap:", error);
|
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"?>
|
const sitemapXml = `<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||||
|
|||||||
Reference in New Issue
Block a user