+ Kitesurf + konaklama veya yoga + SUP gibi özel aktivite paketleri için bizimle iletişime geçin.
+
+
+ İletişime Geç
+
+
+
+
+ );
+}
diff --git a/app/[lang]/cerez/page.tsx b/app/[lang]/cerez/page.tsx
new file mode 100644
index 0000000..0dda809
--- /dev/null
+++ b/app/[lang]/cerez/page.tsx
@@ -0,0 +1,61 @@
+export default async function CookiesPage({ params }: { params: Promise<{ lang: string }> }) {
+ const { lang } = await params;
+
+ const content = {
+ tr: {
+ title: "Çerez Politikası",
+ subtitle: "Web sitemizdeki çerez kullanımı hakkında bilgiler.",
+ text: `Kite Beach Akyaka olarak, web sitemizden en verimli şekilde faydalanabilmeniz ve kullanıcı deneyiminizi geliştirebilmek amacıyla Çerezler (Cookies) kullanmaktayız. Çerez kullanılmasını tercih etmezseniz tarayıcınızın ayarlarından çerezleri silebilir ya da engelleyebilirsiniz.
+
+1. Çerez Nedir?
+Çerezler, bir web sitesini ziyaret ettiğinizde bilgisayarınıza veya mobil cihazınıza kaydedilen küçük metin dosyalarıdır. Bu dosyalar, web sitesinin daha verimli çalışmasını sağlamak ve ziyaretçilere kişiselleştirilmiş bir deneyim sunmak için kullanılır.
+
+2. Hangi Çerezleri Kullanıyoruz?
+- **Zorunlu Çerezler:** Sitemizin temel işlevlerini yerine getirebilmesi için kesinlikle gerekli olan çerezlerdir. (Örn: Oturum yönetimi, dil tercihi)
+- **Performans ve Analitik Çerezleri:** Sitemizin ziyaretçiler tarafından nasıl kullanıldığını analiz etmek, en çok ziyaret edilen sayfaları belirlemek ve sitemizin performansını artırmak için kullanılır. (Örn: Google Analytics çerezleri)
+- **İşlevsellik Çerezleri:** Ziyaretleriniz sırasındaki tercihlerinizi (seçtiğiniz dil veya bölge vb.) hatırlamamızı sağlayan çerezlerdir.
+
+3. Çerezlerin Yönetimi
+Tarayıcınızın ayarlarını değiştirerek çerezlere ilişkin tercihlerinizi kişiselleştirme imkanına sahipsiniz. Çoğu tarayıcı, çerezleri otomatik olarak kabul eder ancak çerezleri reddetmek veya çerez gönderildiğinde uyarı almak için ayarlarınızı değiştirebilirsiniz.
+
+Çerez ayarlarınızı nasıl yöneteceğinizi öğrenmek için tarayıcınızın (Chrome, Safari, Firefox, Edge vb.) "Yardım" veya "Ayarlar" menüsünü kullanabilirsiniz.
+`,
+ },
+ en: {
+ title: "Cookie Policy",
+ subtitle: "Information about the use of cookies on our website.",
+ text: `As Kite Beach Akyaka, we use Cookies in order for you to benefit from our website in the most efficient way and to improve your user experience. If you prefer not to use cookies, you can delete or block cookies from your browser settings.
+
+1. What is a Cookie?
+Cookies are small text files that are saved on your computer or mobile device when you visit a website. These files are used to make the website work more efficiently and to offer a personalized experience to visitors.
+
+2. Which Cookies Do We Use?
+- **Strictly Necessary Cookies:** These are cookies that are absolutely necessary for our site to fulfill its basic functions. (E.g. Session management, language preference)
+- **Performance and Analytical Cookies:** Used to analyze how our site is used by visitors, identify the most visited pages, and improve the performance of our site. (E.g. Google Analytics cookies)
+- **Functionality Cookies:** These are cookies that allow us to remember your preferences (language or region you have chosen, etc.) during your visits.
+
+3. Management of Cookies
+You have the opportunity to personalize your preferences regarding cookies by changing your browser settings. Most browsers automatically accept cookies, but you can change your settings to reject cookies or to receive a warning when a cookie is sent.
+
+You can use the "Help" or "Settings" menu of your browser (Chrome, Safari, Firefox, Edge, etc.) to learn how to manage your cookie settings.`
+ }
+ };
+
+ const t = content[lang as keyof typeof content] || content.tr;
+
+ return (
+
@@ -100,20 +66,17 @@ export default function EventsPage() {
fill
className="object-cover"
/>
- {event.featured && (
+ {event.badge && (
- Öne Çıkan
+ {event.badge}
)}
{/* Content Container */}
-
- {event.category}
-
-
+
{event.title}
@@ -137,21 +100,20 @@ export default function EventsPage() {
- {event.price}
- Bilet / Bilgi
+ Bize Ulaşın
- ))}
+ )) : (
+
Henüz etkinlik eklenmedi.
+ )}
diff --git a/app/galeri/page.tsx b/app/[lang]/galeri/page.tsx
similarity index 92%
rename from app/galeri/page.tsx
rename to app/[lang]/galeri/page.tsx
index 001e0f8..f1a84ca 100644
--- a/app/galeri/page.tsx
+++ b/app/[lang]/galeri/page.tsx
@@ -8,13 +8,13 @@ type Filter = (typeof filters)[number];
const gallery: { src: string; alt: string; category: Exclude }[] = [
{ src: "https://images.unsplash.com/photo-1582719478250-c89404bb8a0e?q=80&w=2940&auto=format&fit=crop", alt: "Standart Oda", category: "Odalar" },
- { src: "https://images.unsplash.com/photo-1533000756353-909d73d2a3c7?q=80&w=2940&auto=format&fit=crop", alt: "Kitesurf", category: "Aktiviteler" },
+ { src: "https://images.unsplash.com/photo-1526367790999-0150786686a2?q=80&w=2940&auto=format&fit=crop", alt: "Kitesurf", category: "Aktiviteler" },
{ src: "https://images.unsplash.com/photo-1544551763-46a013bb70d5?q=80&w=2940&auto=format&fit=crop", alt: "Nehir Doğa", category: "Doğa" },
{ src: "https://images.unsplash.com/photo-1566665797739-1674de7a421a?q=80&w=2874&auto=format&fit=crop", alt: "Nehir Manzaralı Oda",category: "Odalar" },
{ src: "https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?q=80&w=2940&auto=format&fit=crop", alt: "Restoran", category: "Restoran" },
- { src: "https://images.unsplash.com/photo-1599901860904-17e08627c271?q=80&w=2940&auto=format&fit=crop", alt: "Yoga", category: "Aktiviteler" },
+ { src: "https://images.unsplash.com/photo-1544367567-0f2fcb009e0b?q=80&w=2940&auto=format&fit=crop", alt: "Yoga", category: "Aktiviteler" },
{ src: "https://images.unsplash.com/photo-1499955085172-a104c9463ece?q=80&w=2940&auto=format&fit=crop", alt: "Bungalow", category: "Odalar" },
- { src: "https://images.unsplash.com/photo-1544606771-46abcf9dbb83?q=80&w=2924&auto=format&fit=crop", alt: "SUP", category: "Aktiviteler" },
+ { src: "https://images.unsplash.com/photo-1522883392419-7d8cb2435728?q=80&w=2924&auto=format&fit=crop", alt: "SUP", category: "Aktiviteler" },
{ src: "https://images.unsplash.com/photo-1551504734-5ee1c4a1479b?q=80&w=2940&auto=format&fit=crop", alt: "Kahvaltı", category: "Restoran" },
{ src: "https://images.unsplash.com/photo-1511994298241-608e28f14fde?q=80&w=2940&auto=format&fit=crop", alt: "Bisiklet", category: "Aktiviteler" },
{ src: "https://images.unsplash.com/photo-1544148103-0773bf10d330?q=80&w=2940&auto=format&fit=crop", alt: "Restoran Ambiyans", category: "Restoran" },
diff --git a/app/[lang]/gizlilik/page.tsx b/app/[lang]/gizlilik/page.tsx
new file mode 100644
index 0000000..a123fef
--- /dev/null
+++ b/app/[lang]/gizlilik/page.tsx
@@ -0,0 +1,75 @@
+export default async function PrivacyPage({ params }: { params: Promise<{ lang: string }> }) {
+ const { lang } = await params;
+
+ const content = {
+ tr: {
+ title: "Gizlilik Politikası",
+ subtitle: "Verilerinizin güvenliği bizim için önemlidir.",
+ text: `Kite Beach Akyaka (“Biz”, “Şirketimiz” veya “Otel”) olarak, web sitemizi ziyaret eden ve hizmetlerimizden faydalanan misafirlerimizin ("Kullanıcı" veya "Misafir") gizliliğini korumayı taahhüt ediyoruz. Bu Gizlilik Politikası, web sitemiz (www.kitebeachakyaka.com.tr) üzerinden toplanan bilgilerin nasıl kullanıldığını ve korunduğunu açıklar.
+
+1. Hangi Bilgileri Topluyoruz?
+Size daha iyi hizmet verebilmek amacıyla adınız, soyadınız, e-posta adresiniz, telefon numaranız ve rezervasyon detaylarınız gibi bilgileri doğrudan sizden talep etmekteyiz. Ayrıca web sitemizi ziyaret ettiğinizde otomatik olarak IP adresi, tarayıcı türü, ziyaret süresi gibi standart log bilgileri de toplanabilmektedir.
+
+2. Bilgilerinizi Nasıl Kullanıyoruz?
+Topladığımız bilgiler aşağıdaki amaçlar için kullanılmaktadır:
+- Rezervasyon işlemlerinizi gerçekleştirmek ve onaylamak,
+- Sizinle iletişim kurmak ve taleplerinize yanıt vermek,
+- Otel ve kitesurf okulu hizmetlerimizi geliştirmek,
+- Pazarlama ve tanıtım bildirimleri göndermek (Yalnızca açık rızanız olması halinde),
+- Yasal yükümlülüklerimizi yerine getirmek.
+
+3. Bilgi Güvenliği
+Kişisel bilgilerinizin yetkisiz erişime, değişime, ifşaya veya imhaya karşı korunması için gerekli teknik ve idari güvenlik önlemlerini almaktayız. Web sitemizdeki tüm veri akışları şifrelenmiş bağlantılar (SSL) üzerinden yapılmaktadır.
+
+4. Üçüncü Taraflarla Paylaşım
+Bilgilerinizi izniniz olmadan üçüncü taraflarla satmıyor, kiralamıyor veya paylaşmıyoruz. Sadece hizmet sağlamak için işbirliği yaptığımız ödeme sağlayıcıları gibi güvenilir partnerlerle, gizlilik sözleşmeleri çerçevesinde veri paylaşımı yapılabilmektedir.
+
+5. Değişiklikler
+Bu Gizlilik Politikası, zaman zaman güncellenebilir. Herhangi bir değişiklik durumunda yeni politika sitemizde yayınlanarak yürürlüğe girecektir.
+`,
+ },
+ en: {
+ title: "Privacy Policy",
+ subtitle: "The security of your data is important to us.",
+ text: `As Kite Beach Akyaka ("We", "Our Company" or "Hotel"), we are committed to protecting the privacy of our guests ("User" or "Guest") who visit our website and benefit from our services. This Privacy Policy explains how the information collected through our website is used and protected.
+
+1. What Information Do We Collect?
+In order to serve you better, we request information such as your name, surname, email address, phone number, and reservation details directly from you. In addition, standard log information such as IP address, browser type, and visit duration may be automatically collected when you visit our website.
+
+2. How Do We Use Your Information?
+The information we collect is used for the following purposes:
+- Processing and confirming your reservations,
+- Communicating with you and responding to your requests,
+- Improving our hotel and kitesurf school services,
+- Sending marketing and promotional notifications (Only with your explicit consent),
+- Fulfilling our legal obligations.
+
+3. Information Security
+We take the necessary technical and administrative security measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction. All data flows on our website are carried out over encrypted connections (SSL).
+
+4. Sharing with Third Parties
+We do not sell, rent, or share your information with third parties without your permission. Data sharing can only be done with reliable partners, such as payment providers with whom we cooperate to provide services, within the framework of confidentiality agreements.
+
+5. Changes
+This Privacy Policy may be updated from time to time. In case of any changes, the new policy will come into effect by being published on our site.`
+ }
+ };
+
+ const t = content[lang as keyof typeof content] || content.tr;
+
+ return (
+
+ );
+}
diff --git a/app/hakkimizda/page.tsx b/app/[lang]/hakkimizda/page.tsx
similarity index 98%
rename from app/hakkimizda/page.tsx
rename to app/[lang]/hakkimizda/page.tsx
index 4a9d3a4..1e3d253 100644
--- a/app/hakkimizda/page.tsx
+++ b/app/[lang]/hakkimizda/page.tsx
@@ -84,7 +84,7 @@ export default function HakkimizdaPage() {
}) {
+ const { lang } = await params;
+
+ const content = {
+ tr: {
+ title: "Kişisel Verilerin Korunması",
+ subtitle: "Kişisel Verilerin Korunması Kanunu (KVKK) Aydınlatma Metni",
+ text: `Kite Beach Akyaka olarak, kişisel verilerinizin güvenliğine büyük önem veriyoruz. 6698 sayılı Kişisel Verilerin Korunması Kanunu (“Kanun”) uyarınca, elde edilen kişisel verileriniz veri sorumlusu sıfatıyla Kite Beach Akyaka tarafından aşağıda açıklanan kapsamda işlenebilecektir.
+
+1. Kişisel Verilerin İşlenme Amacı
+Kişisel verileriniz;
+- Otelimizde konaklama ve kitesurf okulumuzdaki faaliyetlerin gerçekleştirilebilmesi,
+- Sizlere sunulan ürün ve hizmetlerin beğeni, kullanım alışkanlıkları ve ihtiyaçlarınıza göre özelleştirilerek önerilmesi,
+- Rezervasyon, iletişim ve müşteri memnuniyeti süreçlerinin yürütülmesi,
+- İlgili mevzuat gereği yasal yükümlülüklerin yerine getirilmesi amacıyla işlenmektedir.
+
+2. İşlenen Kişisel Verilerin Kimlere ve Hangi Amaçla Aktarılabileceği
+Toplanan kişisel verileriniz; yasal yükümlülüklerimizin yerine getirilmesi, hizmetlerimizin sağlanabilmesi ve müşteri memnuniyeti süreçleri dahilinde; iş ortaklarımıza, tedarikçilerimize, kanunen yetkili kamu kurumlarına ve özel kişilere Kanun’un 8. ve 9. maddelerinde belirtilen şartlar dahilinde aktarılabilecektir.
+
+3. Kişisel Veri Toplamanın Yöntemi ve Hukuki Sebebi
+Kişisel verileriniz, web sitemiz, rezervasyon formları, e-posta iletişimleri ve otel resepsiyonu gibi kanallar aracılığıyla fiziksel veya elektronik ortamda toplanmaktadır.
+
+4. Veri Sahibinin Hakları
+KVKK’nın 11. maddesi uyarınca;
+- Kişisel veri işlenip işlenmediğini öğrenme,
+- Kişisel veriler işlenmişse buna ilişkin bilgi talep etme,
+- Amacına uygun kullanılıp kullanılmadığını öğrenme,
+- Yurt içinde veya yurt dışında aktarıldığı üçüncü kişileri bilme,
+- Eksik veya yanlış işlenmişse düzeltilmesini isteme haklarına sahipsiniz.
+
+Detaylı bilgi ve talepleriniz için info@kitebeachakyaka.com.tr adresi üzerinden bizimle iletişime geçebilirsiniz.`,
+ },
+ en: {
+ title: "Personal Data Protection",
+ subtitle: "Information Text on the Protection of Personal Data",
+ text: `As Kite Beach Akyaka, we attach great importance to the security of your personal data. In accordance with the Personal Data Protection Law No. 6698 ("Law"), your personal data may be processed by Kite Beach Akyaka as the data controller within the scope described below.
+
+1. Purpose of Processing Personal Data
+Your personal data is processed to;
+- Carry out accommodation in our hotel and activities in our kitesurf school,
+- Customize and recommend the products and services offered to you according to your tastes, usage habits, and needs,
+- Manage reservation, communication, and customer satisfaction processes,
+- Fulfill legal obligations in accordance with the relevant legislation.
+
+2. To Whom and for What Purpose the Processed Personal Data Can Be Transferred
+Your collected personal data may be transferred to our business partners, suppliers, legally authorized public institutions, and private persons within the conditions specified in Articles 8 and 9 of the Law in order to fulfill our legal obligations, provide our services, and within customer satisfaction processes.
+
+3. Method and Legal Reason for Collecting Personal Data
+Your personal data is collected in physical or electronic environment through channels such as our website, reservation forms, email communications, and hotel reception.
+
+4. Rights of the Data Subject
+In accordance with Article 11 of the KVKK, you have the right to;
+- Learn whether personal data is processed,
+- Request information if personal data has been processed,
+- Learn the purpose of processing personal data and whether they are used appropriately,
+- Know the third parties to whom personal data is transferred domestically or abroad,
+- Request the correction of personal data if it is incomplete or improperly processed.
+
+For detailed information and requests, you can contact us at info@kitebeachakyaka.com.tr.`
+ }
+ };
+
+ const t = content[lang as keyof typeof content] || content.tr;
+
+ return (
+
- 10+
- Yıl Deneyim
+ {aboutData.statsYearCount}
+ {aboutData.statsYearLabel}
{/* IKO badge */}
- IKO
- Sertifikalı
+ {aboutData.badgeIkoTitle}
+ {aboutData.badgeIkoLabel}
- Hikayemiz
+ {aboutData.badge}
- Doğanın Kalbinde
- Özel Bir Kaçış
+ {aboutData.titleLine1} {aboutData.titleLine2}
+ {aboutData.titleHighlight}
- Gökova Körfezi'nin kristal sularına dökülen Azmak Nehri'nin hemen kıyısında,
- rüzgarın hiç eksik olmadığı eşsiz bir konumda yer alıyoruz.
+ {aboutData.description1}
- Kite Beach Akyaka; kitesurf tutkusunu doğayla, konforla ve yerel lezzetlerle
- bütünleştiren benzersiz bir yaşam alanı sunar.
+ {aboutData.description2}
- {/* Row 1 */}
-
-
-
-
-
- IKO Sertifikalı
-
Kitesurf
-
- Başlangıçtan ileri seviyeye. Akyaka'nın ünlü termik rüzgarında uçun.
-
- Dünyaca ünlü DJ Mahmut Orhan, unutulmaz bir gün batımı performansı için Kite Beach Akyaka'da! Ege'nin muhteşem manzarasına karşı elektronik müziğin ritmini hissedeceğiniz bu özel geceyi kaçırmayın.
-
-
-
- 15 Ağustos 2026
-
-
- 18:00
-
-
- Beach Club
-
-
-
- Detayları İncele
-
-
-
+ ))
+ ) : (
+
Henüz etkinlik eklenmedi.
+ )}
diff --git a/app/restoran/page.tsx b/app/[lang]/restoran/page.tsx
similarity index 100%
rename from app/restoran/page.tsx
rename to app/[lang]/restoran/page.tsx
diff --git a/app/actions/about.ts b/app/actions/about.ts
new file mode 100644
index 0000000..e8350b1
--- /dev/null
+++ b/app/actions/about.ts
@@ -0,0 +1,65 @@
+"use server";
+import prisma from "@/lib/prisma";
+import { revalidatePath } from "next/cache";
+
+export async function updateAboutSection(prevState: any, formData: FormData) {
+ try {
+ const lang = formData.get("lang") as string;
+ const badge = formData.get("badge") as string;
+ const titleLine1 = formData.get("titleLine1") as string;
+ const titleLine2 = formData.get("titleLine2") as string;
+ const titleHighlight = formData.get("titleHighlight") as string;
+ const description1 = formData.get("description1") as string;
+ const description2 = formData.get("description2") as string;
+ const image = formData.get("image") as string;
+ const statsGuestCount = formData.get("statsGuestCount") as string;
+ const statsGuestLabel = formData.get("statsGuestLabel") as string;
+ const statsYearCount = formData.get("statsYearCount") as string;
+ const statsYearLabel = formData.get("statsYearLabel") as string;
+ const badgeIkoTitle = formData.get("badgeIkoTitle") as string;
+ const badgeIkoLabel = formData.get("badgeIkoLabel") as string;
+
+ await prisma.aboutSection.upsert({
+ where: { lang },
+ update: {
+ badge,
+ titleLine1,
+ titleLine2,
+ titleHighlight,
+ description1,
+ description2,
+ image,
+ statsGuestCount,
+ statsGuestLabel,
+ statsYearCount,
+ statsYearLabel,
+ badgeIkoTitle,
+ badgeIkoLabel
+ },
+ create: {
+ lang,
+ badge,
+ titleLine1,
+ titleLine2,
+ titleHighlight,
+ description1,
+ description2,
+ image,
+ statsGuestCount,
+ statsGuestLabel,
+ statsYearCount,
+ statsYearLabel,
+ badgeIkoTitle,
+ badgeIkoLabel
+ }
+ });
+
+ revalidatePath('/admin/about');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+
+ return { success: true, message: "Hakkımızda bölümü başarıyla güncellendi." };
+ } catch (error) {
+ return { error: "Güncellenirken bir hata oluştu." };
+ }
+}
diff --git a/app/actions/activities.ts b/app/actions/activities.ts
new file mode 100644
index 0000000..531a305
--- /dev/null
+++ b/app/actions/activities.ts
@@ -0,0 +1,152 @@
+"use server";
+import prisma from "@/lib/prisma";
+import { revalidatePath } from "next/cache";
+
+export async function loadMockActivities() {
+ await prisma.activity.deleteMany({});
+
+ const mockActivities = [
+ {
+ lang: "tr",
+ title: "Kitesurf",
+ description: "Başlangıçtan ileri seviyeye. Akyaka'nın ünlü termik rüzgarında uçun.",
+ price: "₺2.000/Saat",
+ image: "https://images.unsplash.com/photo-1526367790999-0150786686a2?q=80&w=2940&auto=format&fit=crop",
+ badge: "IKO Sertifikalı",
+ order: 1
+ },
+ {
+ lang: "en",
+ title: "Kitesurf",
+ description: "From beginner to advanced. Fly in Akyaka's famous thermal wind.",
+ price: "₺2.000/Hour",
+ image: "https://images.unsplash.com/photo-1526367790999-0150786686a2?q=80&w=2940&auto=format&fit=crop",
+ badge: "IKO Certified",
+ order: 1
+ },
+ {
+ lang: "tr",
+ title: "Yoga",
+ description: "Güne nehir kenarında huzur dolu bir yoga seansıyla başlayın.",
+ price: "₺400/Seans",
+ image: "https://images.unsplash.com/photo-1544367567-0f2fcb009e0b?q=80&w=2940&auto=format&fit=crop",
+ badge: null,
+ order: 2
+ },
+ {
+ lang: "en",
+ title: "Yoga",
+ description: "Start the day with a peaceful yoga session by the river.",
+ price: "₺400/Session",
+ image: "https://images.unsplash.com/photo-1544367567-0f2fcb009e0b?q=80&w=2940&auto=format&fit=crop",
+ badge: null,
+ order: 2
+ },
+ {
+ lang: "tr",
+ title: "Stand-Up Paddle",
+ description: "Azmak nehrinin berrak sularında eşsiz bir keşif.",
+ price: "₺300/Saat",
+ image: "https://images.unsplash.com/photo-1522883392419-7d8cb2435728?q=80&w=2924&auto=format&fit=crop",
+ badge: null,
+ order: 3
+ },
+ {
+ lang: "en",
+ title: "Stand-Up Paddle",
+ description: "A unique discovery in the crystal clear waters of Azmak River.",
+ price: "₺300/Hour",
+ image: "https://images.unsplash.com/photo-1522883392419-7d8cb2435728?q=80&w=2924&auto=format&fit=crop",
+ badge: null,
+ order: 3
+ },
+ {
+ lang: "tr",
+ title: "Bisiklet Kiralama",
+ description: "Akyaka Köy Turu ile doğanın tadını çıkarın.",
+ price: "₺250/Gün",
+ image: "https://images.unsplash.com/photo-1511994298241-608e28f14fde?q=80&w=2940&auto=format&fit=crop",
+ badge: null,
+ order: 4
+ },
+ {
+ lang: "en",
+ title: "Bicycle Rental",
+ description: "Enjoy nature with an Akyaka Village Tour.",
+ price: "₺250/Day",
+ image: "https://images.unsplash.com/photo-1511994298241-608e28f14fde?q=80&w=2940&auto=format&fit=crop",
+ badge: null,
+ order: 4
+ }
+ ];
+
+ await prisma.activity.createMany({ data: mockActivities });
+
+ revalidatePath('/admin/activities');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+}
+
+export async function addActivity(prevState: any, formData: FormData) {
+ try {
+ const data = {
+ lang: formData.get("lang") as string,
+ title: formData.get("title") as string,
+ description: formData.get("description") as string,
+ price: formData.get("price") as string,
+ image: formData.get("image") as string,
+ badge: formData.get("badge") as string || null,
+ order: parseInt(formData.get("order") as string || "0", 10),
+ };
+
+ await prisma.activity.create({ data });
+
+ revalidatePath('/admin/activities');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+
+ return { success: true, message: "Aktivite başarıyla eklendi." };
+ } catch (error) {
+ return { error: "Aktivite eklenirken bir hata oluştu." };
+ }
+}
+
+export async function updateActivity(prevState: any, formData: FormData) {
+ try {
+ const id = parseInt(formData.get("id") as string, 10);
+ const data = {
+ lang: formData.get("lang") as string,
+ title: formData.get("title") as string,
+ description: formData.get("description") as string,
+ price: formData.get("price") as string,
+ image: formData.get("image") as string,
+ badge: formData.get("badge") as string || null,
+ order: parseInt(formData.get("order") as string || "0", 10),
+ };
+
+ await prisma.activity.update({
+ where: { id },
+ data
+ });
+
+ revalidatePath('/admin/activities');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+
+ return { success: true, message: "Aktivite başarıyla güncellendi." };
+ } catch (error) {
+ return { error: "Aktivite güncellenirken bir hata oluştu." };
+ }
+}
+
+export async function deleteActivity(id: number) {
+ try {
+ await prisma.activity.delete({ where: { id } });
+ revalidatePath('/admin/activities');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+ return { success: true, message: "Aktivite silindi." };
+ } catch (error) {
+ return { error: "Silme işlemi başarısız." };
+ }
+}
diff --git a/app/actions/auth.ts b/app/actions/auth.ts
new file mode 100644
index 0000000..a1b3fd1
--- /dev/null
+++ b/app/actions/auth.ts
@@ -0,0 +1,34 @@
+"use server";
+
+import { cookies } from "next/headers";
+import { redirect } from "next/navigation";
+
+export type ActionState = { error: string } | null;
+
+export async function login(prevState: ActionState, formData: FormData): Promise {
+ const username = formData.get("username");
+ const password = formData.get("password");
+
+ if (
+ username === process.env.ADMIN_USERNAME &&
+ password === process.env.ADMIN_PASSWORD
+ ) {
+ const cookieStore = await cookies();
+ cookieStore.set("admin_session", "true", {
+ httpOnly: true,
+ secure: process.env.NODE_ENV === "production",
+ maxAge: 60 * 60 * 24 * 7, // 1 week
+ path: "/",
+ });
+ } else {
+ return { error: "Geçersiz kullanıcı adı veya şifre" };
+ }
+
+ redirect("/admin");
+}
+
+export async function logout() {
+ const cookieStore = await cookies();
+ cookieStore.delete("admin_session");
+ redirect("/admin/login");
+}
diff --git a/app/actions/events.ts b/app/actions/events.ts
new file mode 100644
index 0000000..c89240f
--- /dev/null
+++ b/app/actions/events.ts
@@ -0,0 +1,102 @@
+"use server";
+import prisma from "@/lib/prisma";
+import { revalidatePath } from "next/cache";
+
+export async function loadMockEvents() {
+ await prisma.event.deleteMany({});
+
+ const mockEvents = [
+ {
+ lang: "tr",
+ title: "Mahmut Orhan - Sunset Session",
+ description: "Dünyaca ünlü DJ Mahmut Orhan, unutulmaz bir gün batımı performansı için Kite Beach Akyaka'da! Ege'nin muhteşem manzarasına karşı elektronik müziğin ritmini hissedeceğiniz bu özel geceyi kaçırmayın.",
+ date: "15 Ağustos 2026",
+ time: "18:00",
+ location: "Beach Club",
+ image: "https://images.unsplash.com/photo-1516450360452-9312f5e86fc7?q=80&w=2832&auto=format&fit=crop",
+ badge: "Yaklaşan Etkinlik"
+ },
+ {
+ lang: "en",
+ title: "Mahmut Orhan - Sunset Session",
+ description: "World famous DJ Mahmut Orhan is at Kite Beach Akyaka for an unforgettable sunset performance! Do not miss this special night where you will feel the rhythm of electronic music against the magnificent view of the Aegean.",
+ date: "15 August 2026",
+ time: "18:00",
+ location: "Beach Club",
+ image: "https://images.unsplash.com/photo-1516450360452-9312f5e86fc7?q=80&w=2832&auto=format&fit=crop",
+ badge: "Upcoming Event"
+ }
+ ];
+
+ await prisma.event.createMany({ data: mockEvents });
+
+ revalidatePath('/admin/events');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+}
+
+export async function addEvent(prevState: any, formData: FormData) {
+ try {
+ const data = {
+ lang: formData.get("lang") as string,
+ title: formData.get("title") as string,
+ description: formData.get("description") as string,
+ date: formData.get("date") as string,
+ time: formData.get("time") as string,
+ location: formData.get("location") as string,
+ image: formData.get("image") as string,
+ badge: formData.get("badge") as string || null,
+ };
+
+ await prisma.event.create({ data });
+
+ revalidatePath('/admin/events');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+
+ return { success: true, message: "Etkinlik başarıyla eklendi." };
+ } catch (error) {
+ return { error: "Etkinlik eklenirken bir hata oluştu." };
+ }
+}
+
+export async function updateEvent(prevState: any, formData: FormData) {
+ try {
+ const id = parseInt(formData.get("id") as string, 10);
+ const data = {
+ lang: formData.get("lang") as string,
+ title: formData.get("title") as string,
+ description: formData.get("description") as string,
+ date: formData.get("date") as string,
+ time: formData.get("time") as string,
+ location: formData.get("location") as string,
+ image: formData.get("image") as string,
+ badge: formData.get("badge") as string || null,
+ };
+
+ await prisma.event.update({
+ where: { id },
+ data
+ });
+
+ revalidatePath('/admin/events');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+
+ return { success: true, message: "Etkinlik başarıyla güncellendi." };
+ } catch (error) {
+ return { error: "Etkinlik güncellenirken bir hata oluştu." };
+ }
+}
+
+export async function deleteEvent(id: number) {
+ try {
+ await prisma.event.delete({ where: { id } });
+ revalidatePath('/admin/events');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+ return { success: true, message: "Etkinlik silindi." };
+ } catch (error) {
+ return { error: "Silme işlemi başarısız." };
+ }
+}
diff --git a/app/actions/features.ts b/app/actions/features.ts
new file mode 100644
index 0000000..72d9465
--- /dev/null
+++ b/app/actions/features.ts
@@ -0,0 +1,86 @@
+"use server";
+import prisma from "@/lib/prisma";
+import { revalidatePath } from "next/cache";
+
+export async function loadMockFeatures() {
+ await prisma.feature.deleteMany({});
+
+ const mockFeatures = [
+ { lang: "tr", icon: "Wind", label: "Kitesurf Okulu", sub: "IKO Sertifikalı", order: 1 },
+ { lang: "en", icon: "Wind", label: "Kitesurf School", sub: "IKO Certified", order: 1 },
+ { lang: "tr", icon: "Anchor", label: "Yoga Platformu", sub: "Nehir Kenarı", order: 2 },
+ { lang: "en", icon: "Anchor", label: "Yoga Platform", sub: "Riverside", order: 2 },
+ { lang: "tr", icon: "Utensils", label: "Restoran & Bar", sub: "Ege Mutfağı", order: 3 },
+ { lang: "en", icon: "Utensils", label: "Restaurant & Bar", sub: "Aegean Cuisine", order: 3 },
+ { lang: "tr", icon: "BedDouble", label: "Butik Odalar", sub: "3 Tip Konaklama", order: 4 },
+ { lang: "en", icon: "BedDouble", label: "Boutique Rooms", sub: "3 Types of Stay", order: 4 },
+ { lang: "tr", icon: "Sun", label: "Gün Batımı Terası", sub: "Gökova Manzarası", order: 5 },
+ { lang: "en", icon: "Sun", label: "Sunset Terrace", sub: "Gokova View", order: 5 },
+ ];
+
+ await prisma.feature.createMany({ data: mockFeatures });
+
+ revalidatePath('/admin/features');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+}
+
+export async function addFeature(prevState: any, formData: FormData) {
+ try {
+ const data = {
+ lang: formData.get("lang") as string,
+ icon: formData.get("icon") as string,
+ label: formData.get("label") as string,
+ sub: formData.get("sub") as string,
+ order: parseInt(formData.get("order") as string || "0", 10),
+ };
+
+ await prisma.feature.create({ data });
+
+ revalidatePath('/admin/features');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+
+ return { success: true, message: "Özellik başarıyla eklendi." };
+ } catch (error) {
+ return { error: "Özellik eklenirken bir hata oluştu." };
+ }
+}
+
+export async function updateFeature(prevState: any, formData: FormData) {
+ try {
+ const id = parseInt(formData.get("id") as string, 10);
+ const data = {
+ lang: formData.get("lang") as string,
+ icon: formData.get("icon") as string,
+ label: formData.get("label") as string,
+ sub: formData.get("sub") as string,
+ order: parseInt(formData.get("order") as string || "0", 10),
+ };
+
+ await prisma.feature.update({
+ where: { id },
+ data
+ });
+
+ revalidatePath('/admin/features');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+
+ return { success: true, message: "Özellik başarıyla güncellendi." };
+ } catch (error) {
+ return { error: "Özellik güncellenirken bir hata oluştu." };
+ }
+}
+
+export async function deleteFeature(id: number) {
+ try {
+ await prisma.feature.delete({ where: { id } });
+ revalidatePath('/admin/features');
+ revalidatePath('/tr');
+ revalidatePath('/en');
+ return { success: true, message: "Özellik silindi." };
+ } catch (error) {
+ return { error: "Silme işlemi başarısız." };
+ }
+}
diff --git a/app/actions/hero.ts b/app/actions/hero.ts
new file mode 100644
index 0000000..df2a0ea
--- /dev/null
+++ b/app/actions/hero.ts
@@ -0,0 +1,48 @@
+"use server";
+
+import { revalidatePath } from "next/cache";
+import prisma from "@/lib/prisma";
+
+export type HeroActionState = {
+ success?: boolean;
+ message?: string;
+} | null;
+
+export async function updateHero(prevState: HeroActionState, formData: FormData): Promise {
+ const lang = formData.get("lang") as string;
+ const location = formData.get("location") as string;
+ const welcome = formData.get("welcome") as string;
+ const title = formData.get("title") as string;
+ const subtitle = formData.get("subtitle") as string;
+ const bookNow = formData.get("bookNow") as string;
+ const exploreActivities = formData.get("exploreActivities") as string;
+ const scroll = formData.get("scroll") as string;
+
+ if (!lang) {
+ return { success: false, message: "Dil seçimi eksik." };
+ }
+
+ await prisma.heroSection.upsert({
+ where: { lang },
+ update: { location, welcome, title, subtitle, bookNow, exploreActivities, scroll },
+ create: {
+ lang,
+ location,
+ welcome,
+ title,
+ subtitle,
+ bookNow,
+ exploreActivities,
+ scroll
+ }
+ });
+
+ revalidatePath('/admin/hero');
+ revalidatePath(`/${lang}`);
+ revalidatePath('/');
+
+ return {
+ success: true,
+ message: `${lang.toUpperCase()} Hero ayarları başarıyla kaydedildi!`
+ };
+}
diff --git a/app/actions/settings.ts b/app/actions/settings.ts
new file mode 100644
index 0000000..88cb05d
--- /dev/null
+++ b/app/actions/settings.ts
@@ -0,0 +1,38 @@
+"use server";
+
+import { revalidatePath } from "next/cache";
+import prisma from "@/lib/prisma";
+
+export type SettingsActionState = {
+ success?: boolean;
+ message?: string;
+} | null;
+
+export async function updateSettings(prevState: SettingsActionState, formData: FormData): Promise {
+ const title = formData.get("title") as string;
+ const email = formData.get("email") as string;
+ const phone = formData.get("phone") as string;
+ const address = formData.get("address") as string;
+ const instagram = formData.get("instagram") as string;
+
+ await prisma.siteSettings.upsert({
+ where: { id: 1 },
+ update: { title, email, phone, address, instagram },
+ create: {
+ id: 1,
+ title,
+ email,
+ phone,
+ address,
+ instagram
+ }
+ });
+
+ revalidatePath('/admin/settings');
+ revalidatePath('/');
+
+ return {
+ success: true,
+ message: "Ayarlar başarıyla veritabanına kaydedildi!"
+ };
+}
diff --git a/app/admin/about/AboutForm.tsx b/app/admin/about/AboutForm.tsx
new file mode 100644
index 0000000..73d1ae1
--- /dev/null
+++ b/app/admin/about/AboutForm.tsx
@@ -0,0 +1,219 @@
+"use client";
+
+import { useState, useTransition } from "react";
+import { AboutSection } from "@prisma/client";
+import { Save } from "lucide-react";
+import { updateAboutSection } from "@/app/actions/about";
+
+export default function AboutForm({ trData, enData }: { trData: AboutSection | null, enData: AboutSection | null }) {
+ const [activeTab, setActiveTab] = useState<"tr" | "en">("tr");
+ const [isPending, startTransition] = useTransition();
+ const [message, setMessage] = useState<{ type: 'success' | 'error', text: string } | null>(null);
+
+ const handleSubmit = async (formData: FormData) => {
+ setMessage(null);
+ formData.append("lang", activeTab);
+
+ startTransition(async () => {
+ const result = await updateAboutSection(null, formData);
+ if (result?.error) {
+ setMessage({ type: 'error', text: result.error });
+ } else if (result?.success) {
+ setMessage({ type: 'success', text: result.message });
+ }
+ });
+ };
+
+ const activeData = activeTab === "tr" ? trData : enData;
+
+ return (
+
+ );
+}
diff --git a/app/admin/page.tsx b/app/admin/page.tsx
new file mode 100644
index 0000000..4a46873
--- /dev/null
+++ b/app/admin/page.tsx
@@ -0,0 +1,16 @@
+export default function AdminDashboard() {
+ return (
+
+
Hoş Geldiniz
+
+
Sistem Durumu
+
+ Burası Kite Beach Akyaka yönetim panelidir.
+
+
+ İlerleyen aşamalarda içerik yönetimi, rezervasyon takibi veya etkinlik ekleme gibi modüller buraya eklenecektir. Şu an için altyapı ve güvenli giriş sistemi başarıyla kurulmuştur.
+