From f6e30562ab0af72ad7455eaea8e897d704c52b7a Mon Sep 17 00:00:00 2001 From: Hikmet Date: Sat, 22 Aug 2026 22:24:43 +0300 Subject: [PATCH] chore: hide data provider branding from UI --- src/app/dashboard/admin/data/page.tsx | 2 +- src/app/dashboard/admin/logs/page.tsx | 4 ++-- src/app/dashboard/tiktok-shop/page.tsx | 2 +- src/components/admin/apify-ingest-form.tsx | 7 +++---- src/components/ads/apify-empty-search.tsx | 10 +++++----- src/components/tiktok-shop-import.tsx | 2 +- 6 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/app/dashboard/admin/data/page.tsx b/src/app/dashboard/admin/data/page.tsx index 4f70755..74736f1 100644 --- a/src/app/dashboard/admin/data/page.tsx +++ b/src/app/dashboard/admin/data/page.tsx @@ -7,5 +7,5 @@ import { ApifyIngestForm } from "@/components/admin/apify-ingest-form"; export default async function AdminDataPage() { await requireAdmin(); const [ads, stores, users, jobs] = await Promise.all([prisma.ad.count(), prisma.store.count(), prisma.user.count(), prisma.ingestJob.findMany({ orderBy: { createdAt: "desc" }, take: 10 })]); - return

Veri İşleri

Reklam, mağaza ve ingest operasyonları.

{ads}
Ads
{stores}
Stores
{users}
Users

Apify · Meta Ads Library

Anahtar kelimeyle gerçek Meta reklamlarını çekin. Her çalışmada maliyet üst sınırı uygulanır ve tekrar eden reklamlar güncellenir.

Ingest Jobs

{jobs.map((j) =>
{j.source} · {j.type}
{j.status} · {j.recordsImported} başarılı · {j.recordsFailed} hatalı
{j.errorMessage &&
{j.errorMessage}
}
)}{!jobs.length &&

Henüz ingest işi yok.

}
; + return

Veri İşleri

Reklam, mağaza ve ingest operasyonları.

{ads}
Ads
{stores}
Stores
{users}
Users

Meta Ads Library

Anahtar kelimeyle gerçek Meta reklamlarını çekin. Her çalışmada maliyet üst sınırı uygulanır ve tekrar eden reklamlar güncellenir.

Ingest Jobs

{jobs.map((j) =>
{j.source === "apify" ? "Meta veri kaynağı" : j.source} · {j.type}
{j.status} · {j.recordsImported} başarılı · {j.recordsFailed} hatalı
{j.errorMessage &&
{j.errorMessage.replace(/APIFY/g, "VERI_KAYNAGI")}
}
)}{!jobs.length &&

Henüz ingest işi yok.

}
; } diff --git a/src/app/dashboard/admin/logs/page.tsx b/src/app/dashboard/admin/logs/page.tsx index 4b2fdc9..75e19b5 100644 --- a/src/app/dashboard/admin/logs/page.tsx +++ b/src/app/dashboard/admin/logs/page.tsx @@ -17,9 +17,9 @@ export default async function AdminLogsPage() {

Log Merkezi

Admin audit, kredi hareketleri, veri işleri ve oturum kayıtları.

-

Admin audit logları

{audits.map((log) =>
{log.action}{log.createdAt.toLocaleString("tr-TR")}

{log.summary}

{log.actorEmail} · {log.ipAddress || "IP yok"}
)}{!audits.length &&

Audit kaydı yok.

}
+

Admin audit logları

{audits.map((log) =>
{log.action.replace(/APIFY/g, "META_DATA")}{log.createdAt.toLocaleString("tr-TR")}

{log.summary.replace(/Apify/gi, "veri kaynağı")}

{log.actorEmail} · {log.ipAddress || "IP yok"}
)}{!audits.length &&

Audit kaydı yok.

}

Kredi hareketleri

{credits.map((tx) => )}
KullanıcıTürMiktarBakiyeNedenTarih
{tx.user.email}{tx.type}= 0 ? "font-bold text-emerald-600" : "font-bold text-rose-600"}>{tx.amount > 0 ? "+" : ""}{tx.amount}{tx.balanceAfter}{tx.reason}{tx.createdAt.toLocaleString("tr-TR")}
-

Ingest işleri

{ingestJobs.map((job) =>
{job.source} · {job.type}
{job.status} · {job.recordsImported} başarılı · {job.recordsFailed} hatalı
{job.errorMessage &&
{job.errorMessage}
}
)}

Export işleri

{exportJobs.map((job) =>
{job.user.email} · {job.module}
{job.status} · {job.createdAt.toLocaleString("tr-TR")}
{job.errorMessage &&
{job.errorMessage}
}
)}
+

Ingest işleri

{ingestJobs.map((job) =>
{job.source === "apify" ? "Meta veri kaynağı" : job.source} · {job.type}
{job.status} · {job.recordsImported} başarılı · {job.recordsFailed} hatalı
{job.errorMessage &&
{job.errorMessage.replace(/APIFY/g, "VERI_KAYNAGI")}
}
)}

Export işleri

{exportJobs.map((job) =>
{job.user.email} · {job.module}
{job.status} · {job.createdAt.toLocaleString("tr-TR")}
{job.errorMessage &&
{job.errorMessage}
}
)}

Son oturumlar

{sessions.map((session) =>
{session.user.email}
Açılış: {session.createdAt.toLocaleString("tr-TR")} · Bitiş: {session.expiresAt.toLocaleString("tr-TR")}
)}
diff --git a/src/app/dashboard/tiktok-shop/page.tsx b/src/app/dashboard/tiktok-shop/page.tsx index d3d7829..ac5711a 100644 --- a/src/app/dashboard/tiktok-shop/page.tsx +++ b/src/app/dashboard/tiktok-shop/page.tsx @@ -28,7 +28,7 @@ export default async function TikTokShopPage({ searchParams }: { searchParams: P const ranked = products.map((product) => ({ ...product, score: opportunityScore(product) })).sort((a, b) => b.score - a.score); const regions = [...new Set(products.map((product) => product.region).filter(Boolean))] as string[]; return
-

TikTok Shop

Apify üzerinden canlı ürün, satış, fiyat, mağaza ve değerlendirme sinyalleri.

+

TikTok Shop

Canlı ürün, satış, fiyat, mağaza ve değerlendirme sinyalleri.

diff --git a/src/components/admin/apify-ingest-form.tsx b/src/components/admin/apify-ingest-form.tsx index 64caca0..e4fb281 100644 --- a/src/components/admin/apify-ingest-form.tsx +++ b/src/components/admin/apify-ingest-form.tsx @@ -15,7 +15,7 @@ export function ApifyIngestForm({ configured }: { configured: boolean }) { const searchTerms = String(form.get("searchTerms") || "").split(",").map((term) => term.trim()).filter(Boolean); const maxResults = Number(form.get("maxResults")); const maxCostUsd = Number(form.get("maxCostUsd")); - if (!window.confirm(`${searchTerms.join(", ")} için en fazla ${maxResults} reklam çekilsin mi? Apify harcama üst sınırı $${maxCostUsd.toFixed(2)}.`)) return; + if (!window.confirm(`${searchTerms.join(", ")} için en fazla ${maxResults} reklam çekilsin mi? Harcama üst sınırı $${maxCostUsd.toFixed(2)}.`)) return; setBusy(true); setMessage(""); try { const response = await fetch("/api/admin/ingest/apify", { @@ -23,7 +23,7 @@ export function ApifyIngestForm({ configured }: { configured: boolean }) { body: JSON.stringify({ searchTerms, country: form.get("country"), adActiveStatus: form.get("adActiveStatus"), mediaType: form.get("mediaType"), maxResults, maxCostUsd, scrapeAdDetails: form.get("scrapeAdDetails") === "on", includeAboutPage: form.get("includeAboutPage") === "on" }) }); const data = await response.json().catch(() => ({})); - if (!response.ok) throw new Error(data.error || "APIFY_INGEST_FAILED"); + if (!response.ok) throw new Error("Canlı reklam taraması başarısız oldu."); setError(false); setMessage(`${data.imported} reklam işlendi, ${data.failed} kayıt atlandı.`); router.refresh(); } catch (caught) { setError(true); setMessage(caught instanceof Error ? caught.message : "İşlem başarısız"); @@ -44,9 +44,8 @@ export function ApifyIngestForm({ configured }: { configured: boolean }) { - + {message &&

{message}

}
); } - diff --git a/src/components/ads/apify-empty-search.tsx b/src/components/ads/apify-empty-search.tsx index 45e92f5..8877e33 100644 --- a/src/components/ads/apify-empty-search.tsx +++ b/src/components/ads/apify-empty-search.tsx @@ -30,14 +30,14 @@ export function ApifyEmptySearch({ query, country, mediaType, matchMode, status, }) }); const data = await response.json().catch(() => ({})); - if (!response.ok) throw new Error(data.error || "APIFY_INGEST_FAILED"); + if (!response.ok) throw new Error("Canlı reklam taraması başarısız oldu."); setError(false); setMessage(`${data.received} aday tarandı, ${data.relevant} ilgili reklam bulundu. Sonuçlar yenileniyor…`); router.refresh(); } catch (caught) { setError(true); - setMessage(caught instanceof Error ? caught.message : "Apify içe aktarması başarısız oldu."); + setMessage(caught instanceof Error ? caught.message : "Canlı reklam taraması başarısız oldu."); } finally { setBusy(false); } @@ -48,8 +48,8 @@ export function ApifyEmptySearch({ query, country, mediaType, matchMode, status,

{existingCount > 0 ? `Daha fazla “${query}” reklamı getir` : `“${query}” için kayıtlı reklam bulunamadı`}

{existingCount > 0 - ? `Şu anda ${existingCount} ilgili reklam gösteriliyor. Yeni Meta reklamlarını aynı detaylı filtrelerle Apify üzerinden tarayabilirsiniz.` - : "Bu arama önce AdSeeQ veritabanını kontrol eder. Yeni Meta reklamlarını seçtiğiniz ülke ve medya türüyle Apify üzerinden getirip aynı aramaya ekleyebilirsiniz."} + ? `Şu anda ${existingCount} ilgili reklam gösteriliyor. Yeni Meta reklamlarını aynı detaylı filtrelerle canlı olarak tarayabilirsiniz.` + : "Bu arama önce AdSeeQ veritabanını kontrol eder. Yeni Meta reklamlarını seçtiğiniz ülke ve medya türüyle canlı olarak getirip aynı aramaya ekleyebilirsiniz."}

@@ -71,7 +71,7 @@ export function ApifyEmptySearch({ query, country, mediaType, matchMode, status, {busy ? "Getiriliyor…" : planLimit === 0 ? "Planı yükselt" : existingCount > 0 ? "Daha fazla getir" : "Getir"}
-

Apify · {country === "ALL" ? "Tüm dünya" : country} · {mediaType === "ALL" ? "Tüm medya" : mediaType} · {matchMode === "EXACT_PHRASE" ? "Tam ifade" : "Tüm kelimeler"} · Plan limiti: {planLimit || "erişim yok"} reklam

+

Canlı Meta verisi · {country === "ALL" ? "Tüm dünya" : country} · {mediaType === "ALL" ? "Tüm medya" : mediaType} · {matchMode === "EXACT_PHRASE" ? "Tam ifade" : "Tüm kelimeler"} · Plan limiti: {planLimit || "erişim yok"} reklam

{message &&

{message}

}
); diff --git a/src/components/tiktok-shop-import.tsx b/src/components/tiktok-shop-import.tsx index 7058c14..e628501 100644 --- a/src/components/tiktok-shop-import.tsx +++ b/src/components/tiktok-shop-import.tsx @@ -23,7 +23,7 @@ export function TikTokShopImport({ planLimit }: { planLimit: number }) { setQuery(e.target.value)} placeholder="TikTok Shop ürününü canlı ara" className="rounded-2xl border border-slate-200 px-4 py-3" /> - + {message &&

{message}

} ; }