From d8fc9803cf1b58defb871bb5fe1240b1e3ad149b Mon Sep 17 00:00:00 2001 From: sinta Date: Mon, 12 Jan 2026 09:30:29 +0700 Subject: [PATCH 1/4] Add: Add call-to-action button for the case study detail page --- .../(hyperjump)/case-studies/[slug]/page.tsx | 33 +++++++++++++++++++ data.json | 3 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx b/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx index d782b373..5c9a59fd 100644 --- a/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx +++ b/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx @@ -57,11 +57,28 @@ export async function generateStaticParams(): Promise { export default async function CaseStudy({ params }: CaseStudyProps) { const { lang, slug } = await params; + const { email } = data; const caseStudy = caseStudyBy(slug, lang); if (!caseStudy) { notFound(); } + const isMedia = slug === "erp-fisheries"; + + const cta = isMedia + ? { + heading: + "Ready to build your future? Let's discuss your transformation", + href: `mailto:${email}?subject=Media Transformation`, + label: "Get In Touch" + } + : { + heading: + "Ready to transform your tech team? Let's talk about CTO-as-a-Service", + href: `mailto:${email}?subject=CTO as a Service`, + label: "Get In Touch" + }; + return (
@@ -69,6 +86,22 @@ export default async function CaseStudy({ params }: CaseStudyProps) {
+ +
+

+ {cta.heading} +

+ + +
diff --git a/data.json b/data.json index d0507124..6187505f 100644 --- a/data.json +++ b/data.json @@ -50,5 +50,6 @@ } ], "title": "Hyperjump Technology", - "url": "https://hyperjump.tech" + "url": "https://hyperjump.tech", + "email": "solution@hyperjump.tech" } From 785bb4709bca12e14150183978a6560b3f043be8 Mon Sep 17 00:00:00 2001 From: sinta Date: Wed, 14 Jan 2026 15:46:09 +0700 Subject: [PATCH 2/4] fix codee --- .../[slug]/components/button-get-in-touch.tsx | 47 +++++++++++++++++++ .../(hyperjump)/case-studies/[slug]/page.tsx | 30 +++--------- app/[lang]/(hyperjump)/case-studies/data.ts | 14 ++++++ 3 files changed, 67 insertions(+), 24 deletions(-) create mode 100644 app/[lang]/(hyperjump)/case-studies/[slug]/components/button-get-in-touch.tsx diff --git a/app/[lang]/(hyperjump)/case-studies/[slug]/components/button-get-in-touch.tsx b/app/[lang]/(hyperjump)/case-studies/[slug]/components/button-get-in-touch.tsx new file mode 100644 index 00000000..b29d4f3f --- /dev/null +++ b/app/[lang]/(hyperjump)/case-studies/[slug]/components/button-get-in-touch.tsx @@ -0,0 +1,47 @@ +"use client"; + +import { Button } from "@/components/ui/button"; +import { ArrowRightIcon } from "lucide-react"; + +export default function ButtonGetInTouch({ + index, + buttonChatbotMessage, + children +}: { + index: string; + children: React.ReactNode; + buttonChatbotMessage: string; +}) { + return ( + + ); +} diff --git a/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx b/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx index 5c9a59fd..431aa335 100644 --- a/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx +++ b/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx @@ -12,9 +12,10 @@ import { } from "@/locales/.generated/types"; import type { CaseStudy } from "../../data"; -import { caseStudyBy, getCaseStudies } from "../data"; +import { caseStudyBy, caseStudyCta, getCaseStudies } from "../data"; import { Content } from "./components/content"; import { dynamicOpengraph } from "@/lib/default-metadata"; +import ButtonGetInTouch from "./components/button-get-in-touch"; type Params = { lang: SupportedLanguage; slug: string }; @@ -57,7 +58,6 @@ export async function generateStaticParams(): Promise { export default async function CaseStudy({ params }: CaseStudyProps) { const { lang, slug } = await params; - const { email } = data; const caseStudy = caseStudyBy(slug, lang); if (!caseStudy) { notFound(); @@ -65,19 +65,7 @@ export default async function CaseStudy({ params }: CaseStudyProps) { const isMedia = slug === "erp-fisheries"; - const cta = isMedia - ? { - heading: - "Ready to build your future? Let's discuss your transformation", - href: `mailto:${email}?subject=Media Transformation`, - label: "Get In Touch" - } - : { - heading: - "Ready to transform your tech team? Let's talk about CTO-as-a-Service", - href: `mailto:${email}?subject=CTO as a Service`, - label: "Get In Touch" - }; + const cta = isMedia ? caseStudyCta.media : caseStudyCta.default; return (
@@ -92,15 +80,9 @@ export default async function CaseStudy({ params }: CaseStudyProps) { {cta.heading} - + + {cta.label} +
diff --git a/app/[lang]/(hyperjump)/case-studies/data.ts b/app/[lang]/(hyperjump)/case-studies/data.ts index cc56141f..4a339071 100644 --- a/app/[lang]/(hyperjump)/case-studies/data.ts +++ b/app/[lang]/(hyperjump)/case-studies/data.ts @@ -25,6 +25,20 @@ export const getCaseStudies = (lang: SupportedLanguage) => { ]; }; +export const caseStudyCta = { + media: { + heading: "Ready to build your future? Let's discuss your transformation", + subject: "Media Transformation", + label: "Get In Touch" + }, + default: { + heading: + "Ready to transform your tech team? Let's talk about CTO-as-a-Service", + subject: "CTO as a Service", + label: "Get In Touch" + } +} as const; + export function caseStudyBy(slug: string, lang: SupportedLanguage) { return getCaseStudies(lang).find((cs) => cs.slug === slug); } From 84a3e19b8679ddc1b6adab37b1d0ee6f39dc6b39 Mon Sep 17 00:00:00 2001 From: sinta Date: Wed, 14 Jan 2026 18:05:03 +0700 Subject: [PATCH 3/4] add locales id --- .../(hyperjump)/case-studies/[slug]/page.tsx | 10 ++---- app/[lang]/(hyperjump)/case-studies/data.ts | 36 ++++++++++--------- locales/en/case-study.json | 14 ++++++-- locales/id/case-study.json | 14 ++++++-- 4 files changed, 46 insertions(+), 28 deletions(-) diff --git a/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx b/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx index 431aa335..e5465112 100644 --- a/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx +++ b/app/[lang]/(hyperjump)/case-studies/[slug]/page.tsx @@ -12,7 +12,7 @@ import { } from "@/locales/.generated/types"; import type { CaseStudy } from "../../data"; -import { caseStudyBy, caseStudyCta, getCaseStudies } from "../data"; +import { caseStudyBy, getCaseStudies } from "../data"; import { Content } from "./components/content"; import { dynamicOpengraph } from "@/lib/default-metadata"; import ButtonGetInTouch from "./components/button-get-in-touch"; @@ -63,9 +63,7 @@ export default async function CaseStudy({ params }: CaseStudyProps) { notFound(); } - const isMedia = slug === "erp-fisheries"; - - const cta = isMedia ? caseStudyCta.media : caseStudyCta.default; + const cta = caseStudy.cta; return (
@@ -88,9 +86,7 @@ export default async function CaseStudy({ params }: CaseStudyProps) {
caseStudy.slug !== slug - )} + caseStudies={getCaseStudies(lang).filter((cs) => cs.slug !== slug)} lang={lang} />
diff --git a/app/[lang]/(hyperjump)/case-studies/data.ts b/app/[lang]/(hyperjump)/case-studies/data.ts index 4a339071..764d6574 100644 --- a/app/[lang]/(hyperjump)/case-studies/data.ts +++ b/app/[lang]/(hyperjump)/case-studies/data.ts @@ -4,7 +4,13 @@ import { caseStudyCtoaasMediaTitle, caseStudyErpFisheriesCategory, caseStudyErpFisheriesDesc, - caseStudyErpFisheriesTitle + caseStudyErpFisheriesTitle, + caseStudyCtoaasMediaCtaHeading, + caseStudyCtoaasMediaCtaLabel, + caseStudyCtoaasMediaCtaSubject, + caseStudyErpFisheriesCtaHeading, + caseStudyErpFisheriesCtaLabel, + caseStudyErpFisheriesCtaSubject } from "@/locales/.generated/server"; import type { SupportedLanguage } from "@/locales/.generated/types"; @@ -14,31 +20,27 @@ export const getCaseStudies = (lang: SupportedLanguage) => { slug: "erp-fisheries", title: caseStudyErpFisheriesTitle(lang), description: caseStudyErpFisheriesDesc(lang), - category: caseStudyErpFisheriesCategory(lang) + category: caseStudyErpFisheriesCategory(lang), + cta: { + heading: caseStudyErpFisheriesCtaHeading(lang), + subject: caseStudyErpFisheriesCtaSubject(lang), + label: caseStudyErpFisheriesCtaLabel(lang) + } }, { slug: "ctoaas-media", title: caseStudyCtoaasMediaTitle(lang), description: caseStudyCtoaasMediaDesc(lang), - category: caseStudyCtoaasMediaCategory(lang) + category: caseStudyCtoaasMediaCategory(lang), + cta: { + heading: caseStudyCtoaasMediaCtaHeading(lang), + subject: caseStudyCtoaasMediaCtaSubject(lang), + label: caseStudyCtoaasMediaCtaLabel(lang) + } } ]; }; -export const caseStudyCta = { - media: { - heading: "Ready to build your future? Let's discuss your transformation", - subject: "Media Transformation", - label: "Get In Touch" - }, - default: { - heading: - "Ready to transform your tech team? Let's talk about CTO-as-a-Service", - subject: "CTO as a Service", - label: "Get In Touch" - } -} as const; - export function caseStudyBy(slug: string, lang: SupportedLanguage) { return getCaseStudies(lang).find((cs) => cs.slug === slug); } diff --git a/locales/en/case-study.json b/locales/en/case-study.json index c6a7a373..62cad2db 100644 --- a/locales/en/case-study.json +++ b/locales/en/case-study.json @@ -15,11 +15,21 @@ "erp_fisheries": { "title": "Transforming a fisheries tech team into a scalable product engine", "desc": "A junior but passionate tech team. Zero products in production. High impact at stake. We embedded deeply with their team to introduce structure, build confidence, and ship a functional MVP within 3 months. Through rigorous agile practices and full-system rollouts, we helped evolve a fragile tech org into a reliable product engine.", - "category": "CTO as a Service" + "category": "CTO as a Service", + "cta": { + "heading": "Ready to build your future? Let's discuss your transformation", + "subject": "Media Transformation", + "label": "Get In Touch" + } }, "ctoaas_media": { "title": "Elevating a media-tech engineering team from feature factory to innovation powerhouse", "desc": "When rapid growth outpaced engineering maturity, this team needed more than features, they needed transformation. We restructured their agile practices, automated DevOps, established measurable KPIs, and helped them move from task execution to true product ownership and experimentation.", - "category": "CTO as a Service" + "category": "CTO as a Service", + "cta": { + "heading": "Ready to transform your tech team? Let's talk about CTO-as-a-Service", + "subject": "CTO as a Service", + "label": "Get In Touch" + } } } diff --git a/locales/id/case-study.json b/locales/id/case-study.json index 57a3386c..0371eae0 100644 --- a/locales/id/case-study.json +++ b/locales/id/case-study.json @@ -15,11 +15,21 @@ "erp_fisheries": { "title": "Mengubah tim teknologi perikanan menjadi mesin produk yang skalabel", "desc": "Tim teknologi yang masih junior namun penuh semangat. Tidak ada produk yang berjalan. Taruhan dampak besar. Kami terjun langsung mendampingi tim mereka untuk membangun struktur, meningkatkan kepercayaan diri, dan meluncurkan MVP yang fungsional dalam 3 bulan. Lewat praktik agile yang ketat dan peluncuran sistem penuh, kami bantu mengubah organisasi teknologi yang rapuh menjadi mesin produk yang andal.", - "category": "CTO as a Service" + "category": "CTO as a Service", + "cta": { + "heading": "Siap membangun masa depan Anda? Mari diskusikan transformasi Anda", + "subject": "Transformasi Media", + "label": "Hubungi Kami" + } }, "ctoaas_media": { "title": "Meningkatkan tim engineering media dari pabrik fitur menjadi pusat inovasi", "desc": "Ketika pertumbuhan cepat melampaui kematangan engineering, tim ini butuh lebih dari sekadar fitur, mereka butuh transformasi. Kami restrukturisasi praktik agile mereka, otomatisasi DevOps, tetapkan KPI terukur, dan bantu mereka beralih dari eksekutor tugas ke pemilik produk sejati yang inovatif.", - "category": "CTO as a Service" + "category": "CTO as a Service", + "cta": { + "heading": "Siap mentransformasi tim teknologi Anda? Mari berdiskusi tentang CTO-as-a-Service", + "subject": "CTO sebagai Layanan", + "label": "Hubungi Kami" + } } } From 711e2ac19f17489a73bee3499e1062e4f3fdb037 Mon Sep 17 00:00:00 2001 From: sinta Date: Thu, 15 Jan 2026 17:38:22 +0700 Subject: [PATCH 4/4] fix code --- .../[slug]/components/button-get-in-touch.tsx | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/app/[lang]/(hyperjump)/case-studies/[slug]/components/button-get-in-touch.tsx b/app/[lang]/(hyperjump)/case-studies/[slug]/components/button-get-in-touch.tsx index b29d4f3f..75bd9f4e 100644 --- a/app/[lang]/(hyperjump)/case-studies/[slug]/components/button-get-in-touch.tsx +++ b/app/[lang]/(hyperjump)/case-studies/[slug]/components/button-get-in-touch.tsx @@ -1,42 +1,39 @@ "use client"; import { Button } from "@/components/ui/button"; -import { ArrowRightIcon } from "lucide-react"; + +type GetInTouchButtonProps = { + index: string; + buttonChatbotMessage: string; + children: React.ReactNode; +}; + +function getTopic(index: string): string { + switch (index) { + case "erp-fisheries": + return "Transforming a fisheries tech team into a scalable product engine"; + case "ctoaas-media": + return "Elevating a media-tech engineering team from feature factory to innovation powerhouse"; + default: + return ""; + } +} export default function ButtonGetInTouch({ index, buttonChatbotMessage, children -}: { - index: string; - children: React.ReactNode; - buttonChatbotMessage: string; -}) { +}: GetInTouchButtonProps) { return (