Phase 1: technical SEO foundations
- Per-page titles, descriptions, canonicals, Open Graph/Twitter tags via a shared pageMetadata() helper; metadataBase on the root layout - Sitemap generated from a route list on the canonical non-www host; robots.txt points to it; /services removed - One H1 per page; decorative images get empty alt text - JSON-LD: site-wide ComputerRepairService, FAQPage on the homepage, Service on each service page - FAQ answers are now server-rendered (forceMount) so the schema matches the HTML; fixed the nested payment FAQ item - Drop web design (page, nav link, homepage card and FAQs); 301 the old URL - Remove GA, Facebook Pixel and Vercel Analytics/Speed Insights - Fix tel: links (+640211... -> +64211...) - Add og-image.png and logo.png Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
0478ab65e5
commit
c085e2b031
23 files changed
+368
-379
No files matched your search
@@ -4,6 +4,23 @@ const nextConfig = {
|
|||||||
images: {
|
images: {
|
||||||
qualities: [75, 100],
|
qualities: [75, 100],
|
||||||
},
|
},
|
||||||
|
async redirects() {
|
||||||
|
return [
|
||||||
|
// Cloudflare already does this; kept here as a fallback.
|
||||||
|
{
|
||||||
|
source: "/:path*",
|
||||||
|
has: [{ type: "host", value: "www.teatatucomputers.com" }],
|
||||||
|
destination: "https://teatatucomputers.com/:path*",
|
||||||
|
permanent: true,
|
||||||
|
},
|
||||||
|
// Web design is no longer offered.
|
||||||
|
{
|
||||||
|
source: "/services/web-design",
|
||||||
|
destination: "/",
|
||||||
|
permanent: true,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
Generated
-75
@@ -11,8 +11,6 @@
|
|||||||
"@next/env": "^16.2.10",
|
"@next/env": "^16.2.10",
|
||||||
"@next/third-parties": "^16.2.10",
|
"@next/third-parties": "^16.2.10",
|
||||||
"@radix-ui/react-accordion": "^1.2.3",
|
"@radix-ui/react-accordion": "^1.2.3",
|
||||||
"@vercel/analytics": "^1.4.1",
|
|
||||||
"@vercel/speed-insights": "^1.1.0",
|
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"lucide-react": "^0.487.0",
|
"lucide-react": "^0.487.0",
|
||||||
@@ -2652,79 +2650,6 @@
|
|||||||
"win32"
|
"win32"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@vercel/analytics": {
|
|
||||||
"version": "1.5.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.5.0.tgz",
|
|
||||||
"integrity": "sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==",
|
|
||||||
"license": "MPL-2.0",
|
|
||||||
"peerDependencies": {
|
|
||||||
"@remix-run/react": "^2",
|
|
||||||
"@sveltejs/kit": "^1 || ^2",
|
|
||||||
"next": ">= 13",
|
|
||||||
"react": "^18 || ^19 || ^19.0.0-rc",
|
|
||||||
"svelte": ">= 4",
|
|
||||||
"vue": "^3",
|
|
||||||
"vue-router": "^4"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"@remix-run/react": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"@sveltejs/kit": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"next": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"react": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"svelte": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"vue": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"vue-router": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@vercel/speed-insights": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.2.0.tgz",
|
|
||||||
"integrity": "sha512-y9GVzrUJ2xmgtQlzFP2KhVRoCglwfRQgjyfY607aU0hh0Un6d0OUyrJkjuAlsV18qR4zfoFPs/BiIj9YDS6Wzw==",
|
|
||||||
"hasInstallScript": true,
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"peerDependencies": {
|
|
||||||
"@sveltejs/kit": "^1 || ^2",
|
|
||||||
"next": ">= 13",
|
|
||||||
"react": "^18 || ^19 || ^19.0.0-rc",
|
|
||||||
"svelte": ">= 4",
|
|
||||||
"vue": "^3",
|
|
||||||
"vue-router": "^4"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"@sveltejs/kit": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"next": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"react": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"svelte": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"vue": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"vue-router": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/acorn": {
|
"node_modules/acorn": {
|
||||||
"version": "8.17.0",
|
"version": "8.17.0",
|
||||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
|
||||||
|
|||||||
@@ -12,8 +12,6 @@
|
|||||||
"@next/env": "^16.2.10",
|
"@next/env": "^16.2.10",
|
||||||
"@next/third-parties": "^16.2.10",
|
"@next/third-parties": "^16.2.10",
|
||||||
"@radix-ui/react-accordion": "^1.2.3",
|
"@radix-ui/react-accordion": "^1.2.3",
|
||||||
"@vercel/analytics": "^1.4.1",
|
|
||||||
"@vercel/speed-insights": "^1.1.0",
|
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"lucide-react": "^0.487.0",
|
"lucide-react": "^0.487.0",
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
@@ -18,7 +18,7 @@ export default function ContactForm() {
|
|||||||
clipRule="evenodd"
|
clipRule="evenodd"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
<a href="tel:+640211077483">021 107 7483</a>
|
<a href="tel:+64211077483">021 107 7483</a>
|
||||||
</h3>
|
</h3>
|
||||||
<h3 className="text-lg font-bold hover:underline">
|
<h3 className="text-lg font-bold hover:underline">
|
||||||
<svg
|
<svg
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ export default function Footer() {
|
|||||||
clipRule="evenodd"
|
clipRule="evenodd"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
<a href="tel:+640211077483">
|
<a href="tel:+64211077483">
|
||||||
021 107 7483
|
021 107 7483
|
||||||
</a>
|
</a>
|
||||||
</h3>
|
</h3>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export default function HeaderSm({ text }) {
|
|||||||
<div className={styles.header}>
|
<div className={styles.header}>
|
||||||
<Image
|
<Image
|
||||||
src={bgimage}
|
src={bgimage}
|
||||||
alt="Header Background"
|
alt=""
|
||||||
placeholder="blur"
|
placeholder="blur"
|
||||||
quality={100}
|
quality={100}
|
||||||
fill
|
fill
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
export default function JsonLd({ data }) {
|
||||||
|
return (
|
||||||
|
<script
|
||||||
|
type="application/ld+json"
|
||||||
|
// Escape "<" so the JSON can't close the script tag early.
|
||||||
|
dangerouslySetInnerHTML={{
|
||||||
|
__html: JSON.stringify(data).replace(/</g, "\\u003c"),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -49,7 +49,7 @@ export default function Navbar() {
|
|||||||
<div className={styles.header}>
|
<div className={styles.header}>
|
||||||
<div>
|
<div>
|
||||||
<Link href="/" className={styles.logo}>
|
<Link href="/" className={styles.logo}>
|
||||||
<Image src={logo} width="32" height="32" alt="Logo" />
|
<Image src={logo} width="32" height="32" alt="" />
|
||||||
<p>Te Atatu Computers</p>
|
<p>Te Atatu Computers</p>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
@@ -62,7 +62,7 @@ export default function Navbar() {
|
|||||||
src={isActive ? menu : close}
|
src={isActive ? menu : close}
|
||||||
width="32"
|
width="32"
|
||||||
height="32"
|
height="32"
|
||||||
alt="Menu"
|
alt=""
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -131,16 +131,6 @@ export default function Navbar() {
|
|||||||
IT Support
|
IT Support
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<Link
|
|
||||||
href="/services/web-design"
|
|
||||||
className={`link ${
|
|
||||||
pathname === "/services/web-design" ? styles.active : ""
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
Web Design
|
|
||||||
</Link>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<Link
|
<Link
|
||||||
href="/services/virus-removal"
|
href="/services/virus-removal"
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
import HeaderSm from "../components/HeaderSm";
|
import HeaderSm from "../components/HeaderSm";
|
||||||
import ContactForm from "../components/ContactForm";
|
import ContactForm from "../components/ContactForm";
|
||||||
|
import { pageMetadata } from "@/lib/site";
|
||||||
|
|
||||||
|
export const metadata = pageMetadata({
|
||||||
|
title: "Contact & Book a Repair | Te Atatu Computers",
|
||||||
|
description:
|
||||||
|
"Call or text 021 107 7483, or send your device and problem details. Based on Te Atatū Peninsula, serving Henderson and West Auckland.",
|
||||||
|
path: "/contact",
|
||||||
|
});
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
return (
|
return (
|
||||||
|
|||||||
+7
-27
@@ -3,12 +3,8 @@ import "./globals.css";
|
|||||||
import Navbar from "./components/Navbar";
|
import Navbar from "./components/Navbar";
|
||||||
import Footer from "./components/Footer";
|
import Footer from "./components/Footer";
|
||||||
import ChatwootWidget from "./components/ChatwootWidget";
|
import ChatwootWidget from "./components/ChatwootWidget";
|
||||||
|
import JsonLd from "./components/JsonLd";
|
||||||
// Add spyware
|
import { SITE_URL, business, localBusinessSchema } from "@/lib/site";
|
||||||
import { Analytics } from "@vercel/analytics/react";
|
|
||||||
import { GoogleAnalytics } from "@next/third-parties/google";
|
|
||||||
import { SpeedInsights } from "@vercel/speed-insights/next";
|
|
||||||
import Script from "next/script";
|
|
||||||
|
|
||||||
const geistSans = localFont({
|
const geistSans = localFont({
|
||||||
src: "./fonts/GeistVF.woff",
|
src: "./fonts/GeistVF.woff",
|
||||||
@@ -21,37 +17,21 @@ const geistMono = localFont({
|
|||||||
weight: "100 900",
|
weight: "100 900",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Pages set their own title, description and canonical via pageMetadata().
|
||||||
export const metadata = {
|
export const metadata = {
|
||||||
title: "Te Atatu Computer Repair & Web Design",
|
metadataBase: new URL(SITE_URL),
|
||||||
description:
|
title: business.name,
|
||||||
"Your Local Experts for PCs, Laptops, Web Design, IT Support & More.",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function RootLayout({ children }) {
|
export default function RootLayout({ children }) {
|
||||||
return (
|
return (
|
||||||
<html lang="en">
|
<html lang="en-NZ">
|
||||||
<body className={`${geistSans.variable} ${geistMono.variable}`}>
|
<body className={`${geistSans.variable} ${geistMono.variable}`}>
|
||||||
|
<JsonLd data={localBusinessSchema()} />
|
||||||
<ChatwootWidget />
|
<ChatwootWidget />
|
||||||
<Navbar />
|
<Navbar />
|
||||||
{children}
|
{children}
|
||||||
<Footer />
|
<Footer />
|
||||||
<Analytics />
|
|
||||||
<SpeedInsights />
|
|
||||||
<GoogleAnalytics gaId="G-TN7ZL1Y4CC" />
|
|
||||||
<Script id="facebook-pixel">
|
|
||||||
{`
|
|
||||||
!function(f,b,e,v,n,t,s)
|
|
||||||
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
|
|
||||||
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
|
|
||||||
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
|
|
||||||
n.queue=[];t=b.createElement(e);t.async=!0;
|
|
||||||
t.src=v;s=b.getElementsByTagName(e)[0];
|
|
||||||
s.parentNode.insertBefore(t,s)}(window, document,'script',
|
|
||||||
'https://connect.facebook.net/en_US/fbevents.js');
|
|
||||||
fbq('init', '1370044511045020');
|
|
||||||
fbq('track', 'PageView');
|
|
||||||
`}
|
|
||||||
</Script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
);
|
);
|
||||||
|
|||||||
+32
-197
@@ -5,6 +5,9 @@ import Button from "./components/Button";
|
|||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { GoogleMapsEmbed } from "@next/third-parties/google";
|
import { GoogleMapsEmbed } from "@next/third-parties/google";
|
||||||
import ContactForm from "./components/ContactForm";
|
import ContactForm from "./components/ContactForm";
|
||||||
|
import JsonLd from "./components/JsonLd";
|
||||||
|
import { pageMetadata, faqSchema } from "@/lib/site";
|
||||||
|
import { homeFaqs } from "@/lib/faqs";
|
||||||
import {
|
import {
|
||||||
Accordion,
|
Accordion,
|
||||||
AccordionContent,
|
AccordionContent,
|
||||||
@@ -12,6 +15,13 @@ import {
|
|||||||
AccordionTrigger,
|
AccordionTrigger,
|
||||||
} from "@/components/ui/accordion";
|
} from "@/components/ui/accordion";
|
||||||
|
|
||||||
|
export const metadata = pageMetadata({
|
||||||
|
title: "Computer & Laptop Repair Te Atatū | Te Atatu Computers",
|
||||||
|
description:
|
||||||
|
"Local laptop & PC repairs, upgrades and virus removal in Te Atatū and West Auckland. $35 diagnosis, no fix no fee. Call or text 021 107 7483.",
|
||||||
|
path: "/",
|
||||||
|
});
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
return (
|
return (
|
||||||
<div className={styles.page}>
|
<div className={styles.page}>
|
||||||
@@ -20,7 +30,7 @@ export default function Home() {
|
|||||||
<div className={styles.header}>
|
<div className={styles.header}>
|
||||||
<Image
|
<Image
|
||||||
src={bgimage}
|
src={bgimage}
|
||||||
alt="Header Background"
|
alt=""
|
||||||
placeholder="blur"
|
placeholder="blur"
|
||||||
quality={100}
|
quality={100}
|
||||||
fill
|
fill
|
||||||
@@ -38,8 +48,8 @@ export default function Home() {
|
|||||||
</h1>
|
</h1>
|
||||||
<p className={styles.p}>
|
<p className={styles.p}>
|
||||||
<strong>
|
<strong>
|
||||||
Your Local Experts for PCs, Laptops, Web Design, IT
|
Your Local Experts for PCs, Laptops, IT Support &
|
||||||
Support & More.
|
More.
|
||||||
</strong>
|
</strong>
|
||||||
<br />
|
<br />
|
||||||
From hardware fixes to software solutions, we're here
|
From hardware fixes to software solutions, we're here
|
||||||
@@ -69,9 +79,9 @@ export default function Home() {
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="container mx-auto mb-32">
|
<section className="container mx-auto mb-32">
|
||||||
<h1 className="text-center text-3xl font-bold mb-4">
|
<h2 className="text-center text-3xl font-bold mb-4">
|
||||||
Services we Offer
|
Services we Offer
|
||||||
</h1>
|
</h2>
|
||||||
<div className="text-center mb-4 flex flex-row flex-wrap justify-center">
|
<div className="text-center mb-4 flex flex-row flex-wrap justify-center">
|
||||||
<div className="max-w-xs p-4 text-center justify-center">
|
<div className="max-w-xs p-4 text-center justify-center">
|
||||||
<svg
|
<svg
|
||||||
@@ -89,9 +99,9 @@ export default function Home() {
|
|||||||
d="M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25"
|
d="M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
<h2 className="text-xl font-bold mb-2">
|
<h3 className="text-xl font-bold mb-2">
|
||||||
Computer Repair/Upgrades
|
Computer Repair/Upgrades
|
||||||
</h2>
|
</h3>
|
||||||
<p>
|
<p>
|
||||||
We can fix anything from a broken screen to a software issue, or
|
We can fix anything from a broken screen to a software issue, or
|
||||||
upgrade your computer's parts and optimise Windows to get
|
upgrade your computer's parts and optimise Windows to get
|
||||||
@@ -115,7 +125,7 @@ export default function Home() {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
||||||
<h2 className="text-xl font-bold mb-2">Desktop PC Building</h2>
|
<h3 className="text-xl font-bold mb-2">Desktop PC Building</h3>
|
||||||
<p>
|
<p>
|
||||||
We'll help you pick the parts and build a custom gaming or
|
We'll help you pick the parts and build a custom gaming or
|
||||||
workstation PC for you.
|
workstation PC for you.
|
||||||
@@ -138,36 +148,13 @@ export default function Home() {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
||||||
<h2 className="text-xl font-bold mb-2">Remote Access Support</h2>
|
<h3 className="text-xl font-bold mb-2">Remote Access Support</h3>
|
||||||
<p>
|
<p>
|
||||||
We can remotely connect to your computer and fix
|
We can remotely connect to your computer and fix
|
||||||
software/operating system related issues from the comfort of
|
software/operating system related issues from the comfort of
|
||||||
your own home.
|
your own home.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="max-w-xs p-4 text-center justify-center">
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
strokeWidth={1.5}
|
|
||||||
stroke="currentColor"
|
|
||||||
width="6rem"
|
|
||||||
className="mx-auto mb-4"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
d="M12 21a9.004 9.004 0 0 0 8.716-6.747M12 21a9.004 9.004 0 0 1-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 0 1 7.843 4.582M12 3a8.997 8.997 0 0 0-7.843 4.582m15.686 0A11.953 11.953 0 0 1 12 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0 1 21 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0 1 12 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 0 1 3 12c0-1.605.42-3.113 1.157-4.418"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
|
|
||||||
<h2 className="text-xl font-bold mb-2">Web Development</h2>
|
|
||||||
<p>
|
|
||||||
We can develop a fast, modern and secure website for your
|
|
||||||
business using Wordpress or custom React/NextJS code.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section className="container mx-auto flex flex-col gap-8 lg:flex-row mb-32">
|
<section className="container mx-auto flex flex-col gap-8 lg:flex-row mb-32">
|
||||||
@@ -183,178 +170,26 @@ export default function Home() {
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section className="container mx-auto mb-16 max-w-3xl mb-32 scroll-mt-20" id="faq">
|
<section className="container mx-auto mb-16 max-w-3xl mb-32 scroll-mt-20" id="faq">
|
||||||
<h1 className="text-center text-3xl font-bold mb-8">
|
<JsonLd data={faqSchema(homeFaqs)} />
|
||||||
|
<h2 className="text-center text-3xl font-bold mb-8">
|
||||||
Frequently Asked Questions
|
Frequently Asked Questions
|
||||||
</h1>
|
</h2>
|
||||||
<h3 className="text-lg font-bold text-slate-900">
|
|
||||||
Computer Repair and IT Support
|
|
||||||
</h3>
|
|
||||||
<Accordion className="mb-8">
|
<Accordion className="mb-8">
|
||||||
<AccordionItem value="item-1">
|
{homeFaqs.map(({ question, answer, list }, i) => (
|
||||||
<AccordionTrigger>
|
<AccordionItem key={question} value={`item-${i + 1}`}>
|
||||||
What types of devices do you repair?
|
<AccordionTrigger>{question}</AccordionTrigger>
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
<AccordionContent>
|
||||||
We repair desktops, laptops, chromebooks and PCs. We also handle
|
{answer}
|
||||||
custom-built systems and some tablets, depending on the issue.
|
{list && (
|
||||||
Currently we do not repair Apple devices.
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
<AccordionItem value="item-2">
|
|
||||||
<AccordionTrigger>
|
|
||||||
What kinds of issues can you fix?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
We handle a wide range of problems, including (but not limited
|
|
||||||
to):
|
|
||||||
<ul className="list-disc pl-6 my-2">
|
<ul className="list-disc pl-6 my-2">
|
||||||
<li>
|
{list.map((item) => (
|
||||||
Software issues (e.g. Windows errors, slow performance)
|
<li key={item}>{item}</li>
|
||||||
</li>
|
))}
|
||||||
<li>Virus removal and protection</li>
|
|
||||||
<li>Data recovery and backup solutions</li>
|
|
||||||
<li>Network setup and troubleshooting</li>
|
|
||||||
<li>Hardware upgrades (e.g. RAM, SSD, graphics card)</li>
|
|
||||||
<li>Custom PC builds</li>
|
|
||||||
<li>Web development and design</li>
|
|
||||||
<li>Remote support for software issues</li>
|
|
||||||
<li>General IT support and consulting</li>
|
|
||||||
<li>Printer setup and troubleshooting</li>
|
|
||||||
<li>Software installation and configuration</li>
|
|
||||||
<li>Operating system installation and upgrades</li>
|
|
||||||
<li>Data migration from old devices to new ones</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
)}
|
||||||
</AccordionContent>
|
</AccordionContent>
|
||||||
</AccordionItem>
|
</AccordionItem>
|
||||||
<AccordionItem value="item-3">
|
))}
|
||||||
<AccordionTrigger>
|
|
||||||
Do I need an appointment, or can I just walk in?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
Currently we are operating by appointment only. Please contact
|
|
||||||
us to schedule a time that works for you. We can also arrange
|
|
||||||
remote support for certain issues.
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
<AccordionItem value="item-4">
|
|
||||||
<AccordionTrigger>
|
|
||||||
How long will the repair take?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
Most basic repairs are completed within 24-48 hours. Some issues
|
|
||||||
may take longer, depending on parts availability and complexity.
|
|
||||||
We’ll give you an estimated turnaround time when we diagnose the
|
|
||||||
problem. Most parts take about a week to arrive.
|
|
||||||
</AccordionContent>
|
|
||||||
<AccordionItem value="item-5">
|
|
||||||
<AccordionTrigger>
|
|
||||||
What payment methods do you accept?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
We accept cash, card (contactless ONLY), bank transfer and Bitcoin. Currently we do not accept Eftpos payments, only contactless payment methods such as Visa, Mastercard, American Express, Apple Pay, Google Pay and Samsung Pay.
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
</AccordionItem>
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<h3 className="text-lg font-bold text-slate-900">
|
|
||||||
Web Design and Development
|
|
||||||
</h3>
|
|
||||||
<Accordion>
|
|
||||||
<AccordionItem value="item-1">
|
|
||||||
<AccordionTrigger>
|
|
||||||
What platforms do you build websites with?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
We specialize in modern web development using WordPress for
|
|
||||||
content-driven sites and React/Next.js for high-performance,
|
|
||||||
custom web applications. We also offer support for almost any
|
|
||||||
website builder, whether it's Wix, Oddo, Squarespace, or
|
|
||||||
anything else. Whether you need a blog, business site,
|
|
||||||
portfolio, or a fully custom web app—we've got you covered.
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
|
|
||||||
<AccordionItem value="item-2">
|
|
||||||
<AccordionTrigger>
|
|
||||||
How do I choose between WordPress and React/Next.js?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
It depends on your needs:
|
|
||||||
<ul className="list-disc pl-6 my-2">
|
|
||||||
<li>
|
|
||||||
<strong>WordPress</strong> is best for content-heavy
|
|
||||||
websites like blogs, portfolios, and marketing sites.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<strong>React/Next.js</strong> is ideal for fast, scalable,
|
|
||||||
custom web applications or interactive user interfaces.
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
We’ll help you decide what works best based on your goals and
|
|
||||||
budget.
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
<AccordionItem value="item-3">
|
|
||||||
<AccordionTrigger>
|
|
||||||
Do you design the website too, or just build it?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
We do both! We offer full-service web design and development.
|
|
||||||
This includes UX/UI design, branding, responsive layouts, and
|
|
||||||
mobile-first design—all tailored to your needs.
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
<AccordionItem value="item-4">
|
|
||||||
<AccordionTrigger>
|
|
||||||
Can you redesign or improve my existing site?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
Absolutely. We can modernize your design, improve performance,
|
|
||||||
migrate platforms, or fully rebuild your site with a better
|
|
||||||
structure and codebase.
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
<AccordionItem value="item-5">
|
|
||||||
<AccordionTrigger>
|
|
||||||
Do you offer SEO and performance optimization?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
Yes! All our builds include basic SEO best practices and speed
|
|
||||||
optimization. We also offer advanced technical SEO, Core Web
|
|
||||||
Vitals tuning, and image/code optimization.
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
<AccordionItem value="item-6">
|
|
||||||
<AccordionTrigger>
|
|
||||||
Do you provide ongoing maintenance and support?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
Yes, we offer monthly maintenance plans for updates, backups,
|
|
||||||
security checks, and minor edits. We can also provide on-demand
|
|
||||||
support when needed.
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
<AccordionItem value="item-7">
|
|
||||||
<AccordionTrigger>
|
|
||||||
Will my site work on mobile devices?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
Definitely. Every site we build is fully responsive and tested
|
|
||||||
on a variety of devices to ensure it looks great and works well
|
|
||||||
on phones, tablets, and desktops.
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
<AccordionItem value="item-8">
|
|
||||||
<AccordionTrigger>
|
|
||||||
What do you need from me to get started?
|
|
||||||
</AccordionTrigger>
|
|
||||||
<AccordionContent>
|
|
||||||
We’ll need some info about your goals, brand, content (text,
|
|
||||||
images, logo), and examples of sites you like. Don’t worry—we’ll
|
|
||||||
guide you through the process!
|
|
||||||
</AccordionContent>
|
|
||||||
</AccordionItem>
|
|
||||||
</Accordion>
|
</Accordion>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
+3
-2
@@ -1,10 +1,11 @@
|
|||||||
|
import { SITE_URL } from "@/lib/site";
|
||||||
|
|
||||||
export default function robots() {
|
export default function robots() {
|
||||||
return {
|
return {
|
||||||
rules: {
|
rules: {
|
||||||
userAgent: "*",
|
userAgent: "*",
|
||||||
allow: "/",
|
allow: "/",
|
||||||
disallow: "/private/",
|
|
||||||
},
|
},
|
||||||
sitemap: "https://www.teatatucomputers.com/sitemap.xml",
|
sitemap: `${SITE_URL}/sitemap.xml`,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,29 @@
|
|||||||
import HeaderSm from "../../components/HeaderSm";
|
import HeaderSm from "../../components/HeaderSm";
|
||||||
|
import JsonLd from "../../components/JsonLd";
|
||||||
|
import { pageMetadata, serviceSchema } from "@/lib/site";
|
||||||
|
|
||||||
|
const page = {
|
||||||
|
title: "Laptop & PC Repair Te Atatū & West Auckland",
|
||||||
|
description:
|
||||||
|
"Cracked screens, dead laptops, PCs that won't boot and Windows faults. Upfront pricing and honest advice from your local tech in Te Atatū.",
|
||||||
|
path: "/services/computer-repair",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const metadata = pageMetadata(page);
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
return (
|
return (
|
||||||
<div style={{ marginBottom: "30em" }}>
|
<div style={{ marginBottom: "30em" }}>
|
||||||
|
<JsonLd
|
||||||
|
data={serviceSchema({
|
||||||
|
name: "Computer & Laptop Repair",
|
||||||
|
description: page.description,
|
||||||
|
path: page.path,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
<HeaderSm text="Computer & Laptop Repairs" />
|
<HeaderSm text="Computer & Laptop Repairs" />
|
||||||
<section className="container mx-auto mb">
|
<section className="container mx-auto mb">
|
||||||
<h1 className="text-2xl mb-4">Profesional Computer Repairs</h1>
|
<h2 className="text-2xl mb-4">Professional Computer Repairs</h2>
|
||||||
<p>
|
<p>
|
||||||
Te Atatu Computers is your trusted destination for expert laptop repairs
|
Te Atatu Computers is your trusted destination for expert laptop repairs
|
||||||
in Auckland. We specialize in providing top-quality repair services,
|
in Auckland. We specialize in providing top-quality repair services,
|
||||||
|
|||||||
@@ -1,11 +1,29 @@
|
|||||||
import HeaderSm from "../../components/HeaderSm";
|
import HeaderSm from "../../components/HeaderSm";
|
||||||
|
import JsonLd from "../../components/JsonLd";
|
||||||
|
import { pageMetadata, serviceSchema } from "@/lib/site";
|
||||||
|
|
||||||
|
const page = {
|
||||||
|
title: "SSD Upgrades & PC Speed-Up | Te Atatu Computers",
|
||||||
|
description:
|
||||||
|
"Slow computer? An SSD and RAM upgrade can make it feel new for a fraction of the cost of a new PC. Local upgrades in Te Atatū, West Auckland.",
|
||||||
|
path: "/services/computer-upgrades",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const metadata = pageMetadata(page);
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
return (
|
return (
|
||||||
<div style={{ marginBottom: "30em" }}>
|
<div style={{ marginBottom: "30em" }}>
|
||||||
|
<JsonLd
|
||||||
|
data={serviceSchema({
|
||||||
|
name: "Computer Upgrades & Speed-Up",
|
||||||
|
description: page.description,
|
||||||
|
path: page.path,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
<HeaderSm text="Computer & Laptop Upgrades/Speedup" />
|
<HeaderSm text="Computer & Laptop Upgrades/Speedup" />
|
||||||
<section className="container mx-auto mb">
|
<section className="container mx-auto mb">
|
||||||
<h1 className="text-2xl mb-4">Computer & Laptop Upgrades/Speedup</h1>
|
<h2 className="text-2xl mb-4">Computer & Laptop Upgrades/Speedup</h2>
|
||||||
<p>
|
<p>
|
||||||
Upgrading a slow computer can significantly improve its performance or
|
Upgrading a slow computer can significantly improve its performance or
|
||||||
storage capacity and extend its lifespan. At Te Atatu Computers, we do
|
storage capacity and extend its lifespan. At Te Atatu Computers, we do
|
||||||
|
|||||||
@@ -1,11 +1,29 @@
|
|||||||
import HeaderSm from "../../components/HeaderSm";
|
import HeaderSm from "../../components/HeaderSm";
|
||||||
|
import JsonLd from "../../components/JsonLd";
|
||||||
|
import { pageMetadata, serviceSchema } from "@/lib/site";
|
||||||
|
|
||||||
|
const page = {
|
||||||
|
title: "Home & Small Business IT Support West Auckland",
|
||||||
|
description:
|
||||||
|
"Onsite and remote IT support for homes and small businesses: Wi-Fi, email, backups, security and new-PC setup.",
|
||||||
|
path: "/services/it-support",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const metadata = pageMetadata(page);
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
return (
|
return (
|
||||||
<div style={{ marginBottom: "30em" }}>
|
<div style={{ marginBottom: "30em" }}>
|
||||||
|
<JsonLd
|
||||||
|
data={serviceSchema({
|
||||||
|
name: "IT Support",
|
||||||
|
description: page.description,
|
||||||
|
path: page.path,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
<HeaderSm text="IT Support" />
|
<HeaderSm text="IT Support" />
|
||||||
<section className="container mx-auto mb">
|
<section className="container mx-auto mb">
|
||||||
<h1 className="text-2xl mb-4">IT Support</h1>
|
<h2 className="text-2xl mb-4">IT Support</h2>
|
||||||
<p>
|
<p>
|
||||||
At Te Atatu Computers, we specialize in providing personalized IT
|
At Te Atatu Computers, we specialize in providing personalized IT
|
||||||
support tailored to the needs of individuals and small businesses.
|
support tailored to the needs of individuals and small businesses.
|
||||||
|
|||||||
@@ -1,11 +1,29 @@
|
|||||||
import HeaderSm from "../../components/HeaderSm";
|
import HeaderSm from "../../components/HeaderSm";
|
||||||
|
import JsonLd from "../../components/JsonLd";
|
||||||
|
import { pageMetadata, serviceSchema } from "@/lib/site";
|
||||||
|
|
||||||
|
const page = {
|
||||||
|
title: "Virus & Malware Removal West Auckland",
|
||||||
|
description:
|
||||||
|
"Pop-ups, scams, slow or hacked PC? I'll clean it up, keep your files safe and help stop it happening again. Based in Te Atatū.",
|
||||||
|
path: "/services/virus-removal",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const metadata = pageMetadata(page);
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
return (
|
return (
|
||||||
<div style={{ marginBottom: "30em" }}>
|
<div style={{ marginBottom: "30em" }}>
|
||||||
|
<JsonLd
|
||||||
|
data={serviceSchema({
|
||||||
|
name: "Virus & Malware Removal",
|
||||||
|
description: page.description,
|
||||||
|
path: page.path,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
<HeaderSm text="Virus Removal" />
|
<HeaderSm text="Virus Removal" />
|
||||||
<section className="container mx-auto mb">
|
<section className="container mx-auto mb">
|
||||||
<h1 className="text-2xl mb-4">Virus & Malware Removal</h1>
|
<h2 className="text-2xl mb-4">Virus & Malware Removal</h2>
|
||||||
<p>
|
<p>
|
||||||
Te Atatu Computers specializes in efficient and thorough virus removal
|
Te Atatu Computers specializes in efficient and thorough virus removal
|
||||||
services for Windows devices, ensuring your computer is free from
|
services for Windows devices, ensuring your computer is free from
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
import HeaderSm from "../../components/HeaderSm";
|
|
||||||
|
|
||||||
export default function Home() {
|
|
||||||
return (
|
|
||||||
<div style={{ marginBottom: "30em" }}>
|
|
||||||
<HeaderSm text="Web Design" />
|
|
||||||
<section className="container mx-auto mb">
|
|
||||||
<h1 className="text-2xl mb-4">Profesional Web Design</h1>
|
|
||||||
<p>
|
|
||||||
Te Atatu Computers offers comprehensive web design and development
|
|
||||||
services tailored to meet the unique needs of individuals and
|
|
||||||
businesses. Whether you're creating a brand-new website or need expert
|
|
||||||
assistance maintaining an existing one, we are here to help. Our team
|
|
||||||
works with popular platforms like WordPress, Wix, and Odoo to build
|
|
||||||
visually appealing and user-friendly websites. These platforms offer a
|
|
||||||
flexible and robust foundation for creating sites that are easy to
|
|
||||||
manage and designed to showcase your brand effectively. We ensure your
|
|
||||||
website is responsive, functional, and optimized for both desktop and
|
|
||||||
mobile users, giving you the edge in today's competitive online
|
|
||||||
landscape. <br /><br />
|
|
||||||
|
|
||||||
For those who require custom solutions, Te Atatu Computers
|
|
||||||
specializes in advanced web development using modern frameworks such
|
|
||||||
as React, NextJS, and Vue. We also leverage tools like Tailwind CSS
|
|
||||||
and standard coding languages like HTML, CSS, and JavaScript to create
|
|
||||||
fully customized, high-performance websites tailored to your specific
|
|
||||||
requirements. Whether you need e-commerce functionality, seamless
|
|
||||||
integrations, or custom features, we can deliver. Additionally, we
|
|
||||||
provide ongoing maintenance services to ensure your website remains
|
|
||||||
secure, up-to-date, and operating at peak performance. With Te Atatu
|
|
||||||
Computers, you gain a reliable partner dedicated to bringing your
|
|
||||||
online vision to life.
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
+7
-19
@@ -1,22 +1,10 @@
|
|||||||
|
import { SITE_URL, routes } from "@/lib/site";
|
||||||
|
|
||||||
export default function sitemap() {
|
export default function sitemap() {
|
||||||
return [
|
return routes.map(({ path, priority }) => ({
|
||||||
{
|
url: `${SITE_URL}${path}`,
|
||||||
url: 'https://www.teatatucomputers.com/',
|
|
||||||
lastModified: new Date(),
|
lastModified: new Date(),
|
||||||
changeFrequency: 'monthly',
|
changeFrequency: "monthly",
|
||||||
priority: 1,
|
priority,
|
||||||
},
|
}));
|
||||||
{
|
|
||||||
url: 'https://www.teatatucomputers.com/services',
|
|
||||||
lastModified: new Date(),
|
|
||||||
changeFrequency: 'monthly',
|
|
||||||
priority: 0.5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
url: 'https://www.teatatucomputers.com/contact',
|
|
||||||
lastModified: new Date(),
|
|
||||||
changeFrequency: 'monthly',
|
|
||||||
priority: 0.5,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
@@ -52,9 +52,12 @@ function AccordionContent({
|
|||||||
...props
|
...props
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
|
// forceMount keeps closed answers in the server-rendered HTML (needed for
|
||||||
|
// FAQPage schema); data-[state=closed]:hidden keeps them visually collapsed.
|
||||||
<AccordionPrimitive.Content
|
<AccordionPrimitive.Content
|
||||||
data-slot="accordion-content"
|
data-slot="accordion-content"
|
||||||
className="data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm"
|
forceMount
|
||||||
|
className="data-[state=closed]:hidden data-[state=open]:animate-accordion-down overflow-hidden text-sm"
|
||||||
{...props}>
|
{...props}>
|
||||||
<div className={cn("pt-0 pb-4", className)}>{children}</div>
|
<div className={cn("pt-0 pb-4", className)}>{children}</div>
|
||||||
</AccordionPrimitive.Content>
|
</AccordionPrimitive.Content>
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
// Homepage FAQs. Rendered in the accordion and in FAQPage JSON-LD, so keep
|
||||||
|
// answers as plain text (plus an optional bullet list).
|
||||||
|
|
||||||
|
export const homeFaqs = [
|
||||||
|
{
|
||||||
|
question: "What types of devices do you repair?",
|
||||||
|
answer:
|
||||||
|
"We repair desktops, laptops, chromebooks and PCs. We also handle custom-built systems and some tablets, depending on the issue. We do not repair Apple devices.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
question: "What kinds of issues can you fix?",
|
||||||
|
answer:
|
||||||
|
"We handle a wide range of problems, including (but not limited to):",
|
||||||
|
list: [
|
||||||
|
"Software issues (e.g. Windows errors, slow performance)",
|
||||||
|
"Virus removal and protection",
|
||||||
|
"Data recovery and backup solutions",
|
||||||
|
"Network setup and troubleshooting",
|
||||||
|
"Hardware upgrades (e.g. RAM, SSD, graphics card)",
|
||||||
|
"Custom PC builds",
|
||||||
|
"Remote support for software issues",
|
||||||
|
"General IT support and consulting",
|
||||||
|
"Printer setup and troubleshooting",
|
||||||
|
"Software installation and configuration",
|
||||||
|
"Operating system installation and upgrades",
|
||||||
|
"Data migration from old devices to new ones",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
question: "Do I need an appointment, or can I just walk in?",
|
||||||
|
answer:
|
||||||
|
"Currently we are operating by appointment only. Please contact us to schedule a time that works for you. We can also arrange remote support for certain issues.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
question: "How long will the repair take?",
|
||||||
|
answer:
|
||||||
|
"Most basic repairs are completed within 24–48 hours, although this isn't guaranteed. Some issues may take longer, depending on parts availability and complexity. We'll give you an estimated turnaround time when we diagnose the problem. Most parts take about a week to arrive.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
question: "What payment methods do you accept?",
|
||||||
|
answer:
|
||||||
|
"We accept cash, NZ bank transfer and Bitcoin, plus contactless card payments: Visa, Mastercard, American Express, Apple Pay, Google Pay and Samsung Pay. We don't accept EFTPOS.",
|
||||||
|
},
|
||||||
|
];
|
||||||
+154
@@ -0,0 +1,154 @@
|
|||||||
|
// Single source of truth for business facts (from the owner inputs in PLAN.md).
|
||||||
|
// Update values here rather than hard-coding them in pages.
|
||||||
|
|
||||||
|
export const SITE_URL = "https://teatatucomputers.com";
|
||||||
|
|
||||||
|
export const business = {
|
||||||
|
name: "Te Atatu Computers",
|
||||||
|
ownerName: "John",
|
||||||
|
phone: "021 107 7483",
|
||||||
|
phoneE164: "+64211077483",
|
||||||
|
email: "[email protected]",
|
||||||
|
address: {
|
||||||
|
street: "34 Graham Avenue",
|
||||||
|
suburb: "Te Atatū Peninsula",
|
||||||
|
city: "Auckland",
|
||||||
|
postcode: "0610",
|
||||||
|
country: "NZ",
|
||||||
|
},
|
||||||
|
hours: "Mon–Fri 9am–6pm. Weekends by appointment.",
|
||||||
|
serviceArea: [
|
||||||
|
"Te Atatū Peninsula",
|
||||||
|
"Te Atatū South",
|
||||||
|
"Henderson",
|
||||||
|
"Massey",
|
||||||
|
"Lincoln",
|
||||||
|
"Glendene",
|
||||||
|
"Westgate",
|
||||||
|
"Auckland CBD",
|
||||||
|
],
|
||||||
|
paymentMethods: [
|
||||||
|
"Cash",
|
||||||
|
"NZ bank transfer",
|
||||||
|
"Contactless Visa, Mastercard and American Express",
|
||||||
|
"Apple Pay, Google Pay and Samsung Pay",
|
||||||
|
"Bitcoin",
|
||||||
|
],
|
||||||
|
googleBusinessProfileUrl: "https://share.google/APzXLRzyrqAUldl4Y",
|
||||||
|
googleReviewUrl: "https://g.page/r/CYkJobPXq4IpEAE/review",
|
||||||
|
facebookUrl: "https://www.facebook.com/profile.php?id=61571509018351",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const BUSINESS_ID = `${SITE_URL}/#business`;
|
||||||
|
|
||||||
|
// Every public route. Used by the sitemap; add new pages here.
|
||||||
|
export const routes = [
|
||||||
|
{ path: "/", priority: 1 },
|
||||||
|
{ path: "/services/computer-repair", priority: 0.8 },
|
||||||
|
{ path: "/services/computer-upgrades", priority: 0.8 },
|
||||||
|
{ path: "/services/virus-removal", priority: 0.8 },
|
||||||
|
{ path: "/services/it-support", priority: 0.8 },
|
||||||
|
{ path: "/contact", priority: 0.6 },
|
||||||
|
];
|
||||||
|
|
||||||
|
// Builds per-page metadata: title, description, canonical, Open Graph and Twitter.
|
||||||
|
export function pageMetadata({ title, description, path }) {
|
||||||
|
return {
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
alternates: { canonical: path },
|
||||||
|
openGraph: {
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
url: path,
|
||||||
|
siteName: business.name,
|
||||||
|
locale: "en_NZ",
|
||||||
|
type: "website",
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: "/og-image.png",
|
||||||
|
width: 1200,
|
||||||
|
height: 630,
|
||||||
|
alt: business.name,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
twitter: {
|
||||||
|
card: "summary_large_image",
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
images: ["/og-image.png"],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function localBusinessSchema() {
|
||||||
|
const { address } = business;
|
||||||
|
return {
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "ComputerRepairService",
|
||||||
|
"@id": BUSINESS_ID,
|
||||||
|
name: business.name,
|
||||||
|
url: `${SITE_URL}/`,
|
||||||
|
telephone: business.phoneE164,
|
||||||
|
email: business.email,
|
||||||
|
logo: `${SITE_URL}/logo.png`,
|
||||||
|
image: `${SITE_URL}/og-image.png`,
|
||||||
|
address: {
|
||||||
|
"@type": "PostalAddress",
|
||||||
|
streetAddress: address.street,
|
||||||
|
addressLocality: address.suburb,
|
||||||
|
addressRegion: address.city,
|
||||||
|
postalCode: address.postcode,
|
||||||
|
addressCountry: address.country,
|
||||||
|
},
|
||||||
|
areaServed: business.serviceArea.map((name) => ({
|
||||||
|
"@type": "Place",
|
||||||
|
name: `${name}, Auckland`,
|
||||||
|
})),
|
||||||
|
openingHoursSpecification: [
|
||||||
|
{
|
||||||
|
"@type": "OpeningHoursSpecification",
|
||||||
|
dayOfWeek: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
|
||||||
|
opens: "09:00",
|
||||||
|
closes: "18:00",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
priceRange: "$",
|
||||||
|
currenciesAccepted: "NZD",
|
||||||
|
paymentAccepted: business.paymentMethods.join(", "),
|
||||||
|
hasMap: business.googleBusinessProfileUrl,
|
||||||
|
sameAs: [business.googleBusinessProfileUrl, business.facebookUrl],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function serviceSchema({ name, description, path }) {
|
||||||
|
return {
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "Service",
|
||||||
|
name,
|
||||||
|
serviceType: name,
|
||||||
|
description,
|
||||||
|
url: `${SITE_URL}${path}`,
|
||||||
|
provider: { "@id": BUSINESS_ID },
|
||||||
|
areaServed: business.serviceArea.map((area) => ({
|
||||||
|
"@type": "Place",
|
||||||
|
name: `${area}, Auckland`,
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function faqSchema(faqs) {
|
||||||
|
return {
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "FAQPage",
|
||||||
|
mainEntity: faqs.map(({ question, answer, list }) => ({
|
||||||
|
"@type": "Question",
|
||||||
|
name: question,
|
||||||
|
acceptedAnswer: {
|
||||||
|
"@type": "Answer",
|
||||||
|
text: list ? `${answer} ${list.join("; ")}.` : answer,
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in new issue
Block a user