banatie-service/apps/landing/src/app/(main)/admin/master/page.tsx

139 lines
4.4 KiB
TypeScript

'use client';
import { useState, useEffect } from 'react';
import { bootstrapMasterKey } from '@/lib/actions/apiKeyActions';
import KeyDisplay from '@/components/admin/KeyDisplay';
import AdminFormInput from '@/components/admin/AdminFormInput';
import AdminButton from '@/components/admin/AdminButton';
import { NarrowSection } from '@/components/shared/NarrowSection';
const STORAGE_KEY = 'banatie_master_key';
export default function MasterKeyPage() {
const [masterKey, setMasterKey] = useState('');
const [manualKey, setManualKey] = useState('');
const [loading, setLoading] = useState(false);
const [error, setError] = useState('');
const [success, setSuccess] = useState('');
// Load saved key from localStorage on mount
useEffect(() => {
const saved = localStorage.getItem(STORAGE_KEY);
if (saved) {
setMasterKey(saved);
}
}, []);
const handleBootstrap = async () => {
setLoading(true);
setError('');
setSuccess('');
const result = await bootstrapMasterKey();
if (result.success && result.apiKey) {
setMasterKey(result.apiKey);
setSuccess('Master key generated successfully!');
} else {
setError(result.error || 'Failed to bootstrap master key');
}
setLoading(false);
};
const handleSave = () => {
if (masterKey) {
localStorage.setItem(STORAGE_KEY, masterKey);
setSuccess('Master key saved to localStorage!');
setTimeout(() => setSuccess(''), 3000);
}
};
const handleManualSave = () => {
if (manualKey) {
localStorage.setItem(STORAGE_KEY, manualKey);
setMasterKey(manualKey);
setManualKey('');
setSuccess('Master key saved to localStorage!');
setTimeout(() => setSuccess(''), 3000);
}
};
const handleClear = () => {
localStorage.removeItem(STORAGE_KEY);
setMasterKey('');
setSuccess('Master key cleared from localStorage');
setTimeout(() => setSuccess(''), 3000);
};
return (
<NarrowSection>
{/* Page Header */}
<div className="mb-8">
<h1 className="text-4xl font-bold text-white mb-2">Master Key Management</h1>
<p className="text-slate-400">
Bootstrap your master key or manually configure it. This key is required to generate
project API keys.
</p>
</div>
{/* Messages */}
{error && (
<div className="mb-6 p-4 bg-red-900/30 border border-red-700 rounded-lg text-red-300">
{error}
</div>
)}
{success && (
<div className="mb-6 p-4 bg-green-900/30 border border-green-700 rounded-lg text-green-300">
{success}
</div>
)}
{/* Bootstrap Section */}
<div className="mb-8 p-6 bg-slate-800/50 backdrop-blur-sm border border-slate-700 rounded-2xl">
<h2 className="text-2xl font-semibold text-white mb-4">Bootstrap Master Key</h2>
<p className="text-slate-400 mb-6">
Generate the first master key for your system. This only works if no keys exist yet.
</p>
<AdminButton onClick={handleBootstrap} disabled={loading}>
{loading ? 'Generating...' : 'Generate Master Key'}
</AdminButton>
</div>
{/* Current Key Display */}
{masterKey && (
<div className="mb-8 p-6 bg-slate-800/50 backdrop-blur-sm border border-slate-700 rounded-2xl">
<h2 className="text-2xl font-semibold text-white mb-4">Current Master Key</h2>
<KeyDisplay apiKey={masterKey} />
<div className="mt-4 flex gap-3">
<AdminButton onClick={handleSave} variant="primary">
Save to LocalStorage
</AdminButton>
<AdminButton onClick={handleClear} variant="danger">
Clear from LocalStorage
</AdminButton>
</div>
</div>
)}
{/* Manual Entry Section */}
<div className="p-6 bg-slate-800/50 backdrop-blur-sm border border-slate-700 rounded-2xl">
<h2 className="text-2xl font-semibold text-white mb-4">Manual Key Entry</h2>
<p className="text-slate-400 mb-6">
Already have a master key? Enter it here to save it to localStorage.
</p>
<AdminFormInput
label="Master Key"
value={manualKey}
onChange={setManualKey}
placeholder="bnt_..."
className="mb-4"
/>
<AdminButton onClick={handleManualSave} disabled={!manualKey}>
Save Manual Key
</AdminButton>
</div>
</NarrowSection>
);
}