101 lines
5.9 KiB
TypeScript
101 lines
5.9 KiB
TypeScript
import { getAppById, updateApp } from "../../actions";
|
||
import { ArrowLeft, Save, Smartphone, Globe } from "lucide-react";
|
||
import Link from "next/link";
|
||
import { notFound } from "next/navigation";
|
||
|
||
export default async function EditAppPage({ params }: { params: Promise<{ id: string }> }) {
|
||
const { id } = await params;
|
||
const appId = parseInt(id);
|
||
|
||
if (isNaN(appId)) {
|
||
notFound();
|
||
}
|
||
|
||
const app = await getAppById(appId);
|
||
|
||
if (!app) {
|
||
notFound();
|
||
}
|
||
|
||
const updateAppWithId = updateApp.bind(null, app.id);
|
||
|
||
return (
|
||
<div className="flex h-screen bg-slate-50 dark:bg-black font-sans text-slate-900 dark:text-slate-100">
|
||
<aside className="w-64 bg-white dark:bg-zinc-950 border-r border-slate-200 dark:border-zinc-900 flex flex-col shrink-0 shadow-sm">
|
||
<div className="p-6 border-b border-slate-100 dark:border-zinc-900 flex items-center gap-3">
|
||
<Link href="/" className="w-7 h-7 bg-slate-900 dark:bg-white rounded-md flex items-center justify-center">
|
||
<span className="text-white dark:text-black font-bold text-sm">A</span>
|
||
</Link>
|
||
<span className="font-bold text-lg tracking-tight uppercase tracking-wider text-slate-900 dark:text-white">AppAdmin</span>
|
||
</div>
|
||
<nav className="flex-1 p-4 space-y-1">
|
||
<Link href="/" className="flex items-center gap-2.5 px-3 py-2 text-slate-600 dark:text-zinc-400 hover:bg-slate-50 dark:hover:bg-zinc-900 rounded-lg text-sm font-medium">
|
||
<Globe size={18} /> Dashboard
|
||
</Link>
|
||
<Link href="/apps" className="flex items-center gap-2.5 px-3 py-2 bg-slate-900 dark:bg-white text-white dark:text-black rounded-lg text-sm font-semibold">
|
||
<Smartphone size={18} /> Uygulamalar
|
||
</Link>
|
||
</nav>
|
||
</aside>
|
||
|
||
<main className="flex-1 overflow-y-auto p-8">
|
||
<div className="max-w-2xl mx-auto space-y-8">
|
||
<div className="flex items-center justify-between">
|
||
<div className="flex items-center gap-4">
|
||
<Link href="/apps" className="p-2 bg-white dark:bg-zinc-950 border border-slate-200 dark:border-zinc-800 rounded-lg text-slate-500 hover:text-slate-900 transition-colors">
|
||
<ArrowLeft size={20} />
|
||
</Link>
|
||
<div>
|
||
<h1 className="text-2xl font-bold text-slate-900 dark:text-white">Uygulamayı Düzenle</h1>
|
||
<p className="text-sm text-slate-500 font-mono opacity-70">{app.name} / {app.bundleId}</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div className="bg-white dark:bg-zinc-950 p-8 rounded-xl border border-slate-200 dark:border-zinc-900 shadow-sm">
|
||
<form action={updateAppWithId} className="space-y-6">
|
||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||
<div className="space-y-1.5">
|
||
<label className="text-xs font-bold uppercase text-slate-400 tracking-wider">Uygulama Adı</label>
|
||
<input name="name" defaultValue={app.name} required className="w-full px-4 py-2 bg-slate-50 dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-lg text-sm outline-none focus:ring-1 focus:ring-slate-900 text-slate-900 dark:text-white" />
|
||
</div>
|
||
<div className="space-y-1.5">
|
||
<label className="text-xs font-bold uppercase text-slate-400 tracking-wider">Bundle ID</label>
|
||
<input name="bundleId" defaultValue={app.bundleId} required className="w-full px-4 py-2 bg-slate-50 dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-lg text-sm font-mono outline-none focus:ring-1 focus:ring-slate-900 text-slate-900 dark:text-white" />
|
||
</div>
|
||
<div className="space-y-1.5">
|
||
<label className="text-xs font-bold uppercase text-slate-400 tracking-wider">Platform</label>
|
||
<select name="platform" defaultValue={app.platform} className="w-full px-4 py-2 bg-slate-50 dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-lg text-sm outline-none focus:ring-1 focus:ring-slate-900 text-slate-900 dark:text-white">
|
||
<option value="ios">iOS</option>
|
||
<option value="android">Android</option>
|
||
<option value="dual">Dual</option>
|
||
</select>
|
||
</div>
|
||
<div className="space-y-1.5">
|
||
<label className="text-xs font-bold uppercase text-slate-400 tracking-wider">Durum</label>
|
||
<select name="status" defaultValue={app.status} className="w-full px-4 py-2 bg-slate-50 dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-lg text-sm outline-none focus:ring-1 focus:ring-slate-900 text-slate-900 dark:text-white">
|
||
<option value="active">Aktif</option>
|
||
<option value="inactive">Pasif</option>
|
||
<option value="archived">Arşivlendi</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
|
||
<div className="space-y-1.5">
|
||
<label className="text-xs font-bold uppercase text-slate-400 tracking-wider">Apple App ID (Opsiyonel)</label>
|
||
<input name="appleId" defaultValue={app.appleId || ''} className="w-full px-4 py-2 bg-slate-50 dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-lg text-sm outline-none focus:ring-1 focus:ring-slate-900 text-slate-900 dark:text-white" placeholder="Örn: 123456789" />
|
||
</div>
|
||
|
||
<div className="pt-4 flex items-center gap-4">
|
||
<button type="submit" className="flex-1 flex items-center justify-center gap-2 bg-slate-900 dark:bg-white text-white dark:text-black py-2.5 rounded-lg text-sm font-bold hover:opacity-90 transition-all shadow-md">
|
||
<Save size={18} /> Güncellemeleri Kaydet
|
||
</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
</div>
|
||
);
|
||
}
|