Compare commits

...

2 Commits

Author SHA1 Message Date
arifal 12f13f2049 0.4.2 2026-05-07 18:12:08 +07:00
arifal 1e7259f38a fase 0 migration metadata 2026-05-07 18:11:59 +07:00
17 changed files with 53 additions and 57 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ import type { Metadata } from "next";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Buat Open Trip", title: "Buat Open Trip",
description: description:
"Buat open trip pendakian gunung di SeTrip. Atur itinerary, harga, dan ajak pendaki lain ikut serta.", "Buat open trip di SeTrip — hiking, camping, snorkeling, city trip, dan aktivitas bareng lainnya. Atur itinerary, harga, dan ajak orang lain ikut serta.",
alternates: { canonical: "/create-trip" }, alternates: { canonical: "/create-trip" },
robots: { index: false, follow: false }, robots: { index: false, follow: false },
}; };
+1 -1
View File
@@ -36,7 +36,7 @@ export default async function CreateTripPage() {
<div className="mb-4 sm:mb-6"> <div className="mb-4 sm:mb-6">
<h1 className="text-2xl font-bold text-neutral-800">Buat Trip Baru</h1> <h1 className="text-2xl font-bold text-neutral-800">Buat Trip Baru</h1>
<p className="mt-1 text-sm text-neutral-500"> <p className="mt-1 text-sm text-neutral-500">
Ajak teman baru naik gunung bareng! Ajak orang baru jalan bareng!
</p> </p>
</div> </div>
+3 -3
View File
@@ -18,7 +18,7 @@ const geistMono = Geist_Mono({
export const metadata: Metadata = { export const metadata: Metadata = {
metadataBase: new URL(siteUrl), metadataBase: new URL(siteUrl),
title: { title: {
default: `${siteConfig.name} — Cari Teman Pendakian, Pergi Bareng`, default: `${siteConfig.name} — Cari Teman Trip & Aktivitas, Pergi Bareng`,
template: `%s · ${siteConfig.name}`, template: `%s · ${siteConfig.name}`,
}, },
description: siteConfig.description, description: siteConfig.description,
@@ -33,7 +33,7 @@ export const metadata: Metadata = {
locale: "id_ID", locale: "id_ID",
url: "/", url: "/",
siteName: siteConfig.name, siteName: siteConfig.name,
title: `${siteConfig.name} — Cari Teman Pendakian, Pergi Bareng`, title: `${siteConfig.name} — Cari Teman Trip & Aktivitas, Pergi Bareng`,
description: siteConfig.description, description: siteConfig.description,
images: [ images: [
{ {
@@ -46,7 +46,7 @@ export const metadata: Metadata = {
}, },
twitter: { twitter: {
card: "summary_large_image", card: "summary_large_image",
title: `${siteConfig.name} — Cari Teman Pendakian, Pergi Bareng`, title: `${siteConfig.name} — Cari Teman Trip & Aktivitas, Pergi Bareng`,
description: siteConfig.description, description: siteConfig.description,
images: ["/images/SeTrip.png"], images: ["/images/SeTrip.png"],
}, },
+1 -1
View File
@@ -3,7 +3,7 @@ import type { Metadata } from "next";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Masuk", title: "Masuk",
description: description:
"Masuk ke akun SeTrip untuk gabung open trip pendakian dan kelola perjalananmu.", "Masuk ke akun SeTrip untuk gabung open trip & aktivitas bareng dan kelola perjalananmu.",
alternates: { canonical: "/login" }, alternates: { canonical: "/login" },
robots: { index: false, follow: true }, robots: { index: false, follow: true },
}; };
+1 -1
View File
@@ -73,7 +73,7 @@ function LoginForm() {
</span> </span>
</Link> </Link>
<p className="text-sm text-neutral-300"> <p className="text-sm text-neutral-300">
Login dan mulai petualangan ke gunung Login dan mulai petualanganmu bareng
</p> </p>
</div> </div>
+8 -12
View File
@@ -6,11 +6,11 @@ import { TripCard } from "@/features/trip/components/trip-card";
import { siteConfig, siteUrl, absoluteUrl } from "@/lib/site"; import { siteConfig, siteUrl, absoluteUrl } from "@/lib/site";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Cari Teman Pendakian — Pergi Bareng, Bukan Sendiri", title: "Cari Teman Trip & Aktivitas — Pergi Bareng, Bukan Sendiri",
description: `${siteConfig.slogan} ${siteConfig.description}`, description: `${siteConfig.slogan} ${siteConfig.description}`,
alternates: { canonical: "/" }, alternates: { canonical: "/" },
openGraph: { openGraph: {
title: `${siteConfig.name} — Cari Teman Pendakian, Gabung Trip Bareng`, title: `${siteConfig.name} — Cari Teman Trip & Aktivitas, Gabung Bareng`,
description: siteConfig.slogan, description: siteConfig.slogan,
url: "/", url: "/",
}, },
@@ -90,7 +90,7 @@ export default async function HomePage() {
<div className="mb-4 inline-flex items-center gap-1.5 rounded-full border border-primary-400/30 bg-primary-600/20 px-3 py-1 sm:mb-6 sm:gap-2 sm:px-4 sm:py-1.5"> <div className="mb-4 inline-flex items-center gap-1.5 rounded-full border border-primary-400/30 bg-primary-600/20 px-3 py-1 sm:mb-6 sm:gap-2 sm:px-4 sm:py-1.5">
<span className="text-xs sm:text-sm">🤝</span> <span className="text-xs sm:text-sm">🤝</span>
<span className="text-xs font-medium text-primary-300 sm:text-sm"> <span className="text-xs font-medium text-primary-300 sm:text-sm">
Cari teman pendakian Cari teman trip & aktivitas
</span> </span>
</div> </div>
@@ -100,12 +100,13 @@ export default async function HomePage() {
</h1> </h1>
<p className="mx-auto mb-2 max-w-sm text-base font-medium text-neutral-300 sm:mb-3 sm:max-w-lg sm:text-lg"> <p className="mx-auto mb-2 max-w-sm text-base font-medium text-neutral-300 sm:mb-3 sm:max-w-lg sm:text-lg">
Lagi pengen hiking tapi gak punya teman?{" "} Lagi pengen jalan tapi gak punya teman?{" "}
<span className="text-primary-400">SeTrip</span> tempatnya. <span className="text-primary-400">SeTrip</span> tempatnya.
</p> </p>
<p className="mx-auto mb-6 max-w-xs text-sm text-neutral-400 sm:mb-8 sm:max-w-md sm:text-base"> <p className="mx-auto mb-6 max-w-xs text-sm text-neutral-400 sm:mb-8 sm:max-w-md sm:text-base">
Gabung open trip pendakian, ketemu orang baru, dari stranger jadi Gabung open trip hiking, camping, snorkeling, sampai city trip.
travel buddies. Grup kecil, organizer terverifikasi. Ketemu orang baru, dari stranger jadi travel buddies. Grup kecil,
organizer terverifikasi.
</p> </p>
<Link <Link
@@ -124,11 +125,6 @@ export default async function HomePage() {
<p className="text-[11px] text-neutral-400 sm:text-xs">Trip Tersedia</p> <p className="text-[11px] text-neutral-400 sm:text-xs">Trip Tersedia</p>
</div> </div>
<div className="h-8 w-px bg-neutral-700 sm:h-10" /> <div className="h-8 w-px bg-neutral-700 sm:h-10" />
<div>
<p className="text-xl font-bold text-secondary-400 sm:text-2xl">8</p>
<p className="text-[11px] text-neutral-400 sm:text-xs">Gunung Jabar</p>
</div>
<div className="h-8 w-px bg-neutral-700 sm:h-10" />
<div> <div>
<p className="text-xl font-bold text-white sm:text-2xl">100%</p> <p className="text-xl font-bold text-white sm:text-2xl">100%</p>
<p className="text-[11px] text-neutral-400 sm:text-xs">Seru</p> <p className="text-[11px] text-neutral-400 sm:text-xs">Seru</p>
@@ -214,7 +210,7 @@ export default async function HomePage() {
Belum ada trip tersedia Belum ada trip tersedia
</p> </p>
<p className="mb-5 text-sm text-neutral-500 sm:mb-6"> <p className="mb-5 text-sm text-neutral-500 sm:mb-6">
Jadilah yang pertama buat open trip pendakian! Jadilah yang pertama buat open trip di sini!
</p> </p>
<Link <Link
href="/create-trip" href="/create-trip"
+1 -1
View File
@@ -3,7 +3,7 @@ import type { Metadata } from "next";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Daftar Akun", title: "Daftar Akun",
description: description:
"Buat akun SeTrip gratis. Cari open trip pendakian gunung, gabung bareng, dan mulai petualanganmu.", "Buat akun SeTrip gratis. Cari open trip & aktivitas bareng, gabung bareng, dan mulai petualanganmu.",
alternates: { canonical: "/register" }, alternates: { canonical: "/register" },
}; };
+1 -1
View File
@@ -72,7 +72,7 @@ export default function RegisterPage() {
</span> </span>
</Link> </Link>
<p className="text-sm text-neutral-300"> <p className="text-sm text-neutral-300">
Daftar dan mulai cari trip pendakian Daftar dan mulai cari teman trip & aktivitas
</p> </p>
</div> </div>
+3 -3
View File
@@ -4,7 +4,7 @@ import { formatRupiah } from "@/lib/utils";
import { formatTripCalendarDateRangeLong } from "@/lib/trip-dates"; import { formatTripCalendarDateRangeLong } from "@/lib/trip-dates";
import { siteConfig } from "@/lib/site"; import { siteConfig } from "@/lib/site";
export const alt = `${siteConfig.name} — Open Trip Pendakian`; export const alt = `${siteConfig.name} — Open Trip & Aktivitas Bareng`;
export const size = { width: 1200, height: 630 }; export const size = { width: 1200, height: 630 };
export const contentType = "image/png"; export const contentType = "image/png";
@@ -116,8 +116,8 @@ export default async function TripOgImage({
color: "#86efac", color: "#86efac",
}} }}
> >
<span style={{ fontSize: 28 }}>🏔</span> <span style={{ fontSize: 28 }}>🤝</span>
<span>Open Trip Pendakian</span> <span>Open Trip Bareng</span>
</div> </div>
</div> </div>
+6 -6
View File
@@ -15,11 +15,11 @@ export async function generateMetadata({
}: TripsPageProps): Promise<Metadata> { }: TripsPageProps): Promise<Metadata> {
const { q } = await searchParams; const { q } = await searchParams;
const title = q const title = q
? `Cari Teman Trip "${q}" — Pendakian Bareng` ? `Cari Teman Trip "${q}" — Gabung Bareng`
: "Cari Teman Pendakian — Daftar Open Trip Aktif"; : "Cari Teman Trip & Aktivitas — Daftar Open Trip Aktif";
const description = q const description = q
? `Hasil pencarian "${q}" di ${siteConfig.name}. Temukan teman pendakian, lihat trip & organizer terverifikasi, langsung gabung.` ? `Hasil pencarian "${q}" di ${siteConfig.name}. Temukan teman seperjalanan, lihat trip & organizer terverifikasi, langsung gabung.`
: `Daftar open trip pendakian aktif di ${siteConfig.name}. Pilih trip, kenal calon teman seperjalanan, dan gabung bareng — grup kecil & organizer terverifikasi.`; : `Daftar open trip aktif di ${siteConfig.name} — hiking, camping, snorkeling, city trip, dan aktivitas bareng lainnya. Pilih trip, kenal calon teman seperjalanan, dan gabung bareng — grup kecil & organizer terverifikasi.`;
return { return {
title, title,
description, description,
@@ -48,7 +48,7 @@ export default async function TripsPage({ searchParams }: TripsPageProps) {
<div className="mb-6 flex flex-col gap-3 sm:mb-8 sm:flex-row sm:items-center sm:justify-between"> <div className="mb-6 flex flex-col gap-3 sm:mb-8 sm:flex-row sm:items-center sm:justify-between">
<div> <div>
<h1 className="text-xl font-bold text-neutral-800 sm:text-2xl"> <h1 className="text-xl font-bold text-neutral-800 sm:text-2xl">
Cari Teman Pendakian Cari Teman Trip & Aktivitas
</h1> </h1>
<p className="mt-0.5 text-sm text-neutral-500"> <p className="mt-0.5 text-sm text-neutral-500">
{hasFilters {hasFilters
@@ -84,7 +84,7 @@ export default async function TripsPage({ searchParams }: TripsPageProps) {
<p className="mb-5 text-sm text-neutral-500 sm:mb-6"> <p className="mb-5 text-sm text-neutral-500 sm:mb-6">
{hasFilters {hasFilters
? "Coba ubah kata kunci atau rentang tanggal pencarian" ? "Coba ubah kata kunci atau rentang tanggal pencarian"
: "Jadilah yang pertama membuat open trip pendakian!"} : "Jadilah yang pertama membuat open trip di sini!"}
</p> </p>
{!hasFilters && ( {!hasFilters && (
<Link <Link
+1 -1
View File
@@ -23,7 +23,7 @@ export function SearchBar() {
type="text" type="text"
value={query} value={query}
onChange={(e) => setQuery(e.target.value)} onChange={(e) => setQuery(e.target.value)}
placeholder="Cari gunung, lokasi, atau trip..." placeholder="Cari destinasi, lokasi, atau trip..."
className="min-w-0 flex-1 border-none bg-transparent px-3.5 py-3 text-sm text-white outline-none placeholder:text-neutral-400 sm:px-5 sm:py-3.5" className="min-w-0 flex-1 border-none bg-transparent px-3.5 py-3 text-sm text-white outline-none placeholder:text-neutral-400 sm:px-5 sm:py-3.5"
/> />
<button <button
+1 -1
View File
@@ -82,7 +82,7 @@ export function TripFilter() {
type="text" type="text"
value={query} value={query}
onChange={(e) => setQuery(e.target.value)} onChange={(e) => setQuery(e.target.value)}
placeholder="Gunung, lokasi, atau nama trip..." placeholder="Destinasi, lokasi, atau nama trip..."
className="w-full rounded-xl border border-neutral-200 bg-neutral-50 py-2.5 pl-9 pr-3 text-sm text-neutral-800 placeholder:text-neutral-400 focus:border-primary-500 focus:bg-white" className="w-full rounded-xl border border-neutral-200 bg-neutral-50 py-2.5 pl-9 pr-3 text-sm text-neutral-800 placeholder:text-neutral-400 focus:border-primary-500 focus:bg-white"
/> />
</div> </div>
+2 -2
View File
@@ -42,10 +42,10 @@ export const createTripSchema = z
mountain: z mountain: z
.string() .string()
.trim() .trim()
.min(2, "Nama gunung harus diisi") .min(2, "Destinasi harus diisi")
.max( .max(
LIMITS.MAX_MOUNTAIN_LENGTH, LIMITS.MAX_MOUNTAIN_LENGTH,
`Nama gunung maksimal ${LIMITS.MAX_MOUNTAIN_LENGTH} karakter` `Destinasi maksimal ${LIMITS.MAX_MOUNTAIN_LENGTH} karakter`
), ),
location: z location: z
.string() .string()
+19 -19
View File
@@ -3,32 +3,32 @@ export const siteConfig = {
brand: "SeTrip", brand: "SeTrip",
slogan: "Pergi bareng, bukan sendiri.", slogan: "Pergi bareng, bukan sendiri.",
description: description:
"SeTrip adalah tempat menemukan teman pendakian — bukan sekadar daftar trip. Gabung open trip, kenal stranger, jadi circle baru. Grup kecil, organizer terverifikasi.", "SeTrip adalah tempat menemukan teman aktivitas & trip bareng — bukan sekadar daftar trip. Gabung open trip, kenal stranger, jadi circle baru. Grup kecil, organizer terverifikasi.",
keywords: [ keywords: [
"setrip", "setrip",
"se trip", "se trip",
"teman trip", "teman trip",
"teman pendakian", "cari teman trip",
"cari teman naik gunung", "teman aktivitas",
"cari teman jalan",
"open trip", "open trip",
"open trip gunung",
"open trip pendakian",
"open trip jawa barat",
"hiking bareng",
"mendaki bersama",
"naik gunung bareng",
"pendakian gunung",
"trip gunung",
"trip pendakian",
"gabung open trip", "gabung open trip",
"cari open trip", "cari open trip",
"papandayan", "trip bareng",
"ciremai", "social travel",
"gunung gede", "teman pendakian",
"gunung pangrango", "open trip pendakian",
"gunung guntur", "hiking bareng",
"gunung malabar", "naik gunung bareng",
"gunung tangkuban parahu", "open trip camping",
"open trip snorkeling",
"open trip diving",
"open trip island hopping",
"city trip bareng",
"kulineran bareng",
"konser bareng",
"workshop outdoor",
"retreat bareng",
], ],
} as const; } as const;
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "setrip", "name": "setrip",
"version": "0.4.1", "version": "0.4.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "setrip", "name": "setrip",
"version": "0.4.1", "version": "0.4.2",
"dependencies": { "dependencies": {
"@next-auth/prisma-adapter": "^1.0.7", "@next-auth/prisma-adapter": "^1.0.7",
"@prisma/adapter-pg": "^7.7.0", "@prisma/adapter-pg": "^7.7.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "setrip", "name": "setrip",
"version": "0.4.1", "version": "0.4.2",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
+1 -1
View File
@@ -30,7 +30,7 @@ export const reviewService = {
if (!isPastTripLastDayForReview(trip.date, trip.endDate)) { if (!isPastTripLastDayForReview(trip.date, trip.endDate)) {
throw new Error( throw new Error(
"Ulasan bisa diberikan setelah tanggal selesai trip (hari terakhir pendakian)" "Ulasan bisa diberikan setelah tanggal selesai trip (hari terakhir aktivitas)"
); );
} }