Dateien nach "frontend/src" hochladen

This commit is contained in:
2026-05-27 19:31:46 +02:00
parent eb9c91aff8
commit 84a3622d69

View File

@@ -6,7 +6,24 @@ import { DateiSettings } from './tools/dateien.jsx';
import { useConfirm } from './confirm.jsx';
import { HomeIcon, AppsIcon, AdminIcon, MoreIcon, UserIcon, LogOutIcon, ChevronIcon, UpdateIcon, TrashIcon, MessageIcon } from './icons.jsx';
const ICONS = ['🔗','🌐','📊','📁','🛠','📧','🗓','💾','🖥','📡','🔒','📖','🎯','⚡','🏠','🔧','📱','🎮','🚀','💡'];
const CONST_ICONS = ['🔗','🌐','📊','📁','🛠','📧','🗓','💾','🖥','📡','🔒','📖','🎯','⚡','🏠','🔧','📱','🎮','🚀','💡'];
// Schlüsselpaar beim Login generieren und public key registrieren (fire & forget)
async function initNachrichtenKeys() {
const LS_KEY = 'dd_msg_keypair';
let pubJwk;
const stored = localStorage.getItem(LS_KEY);
if (stored) {
try { pubJwk = JSON.parse(stored).pub; } catch { localStorage.removeItem(LS_KEY); }
}
if (!pubJwk) {
const kp = await crypto.subtle.generateKey({ name:'ECDH', namedCurve:'P-256' }, true, ['deriveKey']);
pubJwk = await crypto.subtle.exportKey('jwk', kp.publicKey);
const priv = await crypto.subtle.exportKey('jwk', kp.privateKey);
localStorage.setItem(LS_KEY, JSON.stringify({ pub: pubJwk, priv }));
}
try { await api('/tools/nachrichten/keys', { body: { public_key: JSON.stringify(pubJwk) } }); } catch {}
}
// ── Responsive Hook ───────────────────────────────────────────────────────────
function useIsMobile() {
@@ -93,7 +110,7 @@ function Login({ onLogin }) {
const [err,setErr]=useState(''); const [busy,setBusy]=useState(false);
const go = async () => {
setErr(''); setBusy(true);
try { const d=await api('/auth/login',{body:{username:u,password:p}}); localStorage.setItem('sk_token',d.token); onLogin(d.user); }
try { const d=await api('/auth/login',{body:{username:u,password:p}}); localStorage.setItem('sk_token',d.token); initNachrichtenKeys(); onLogin(d.user); }
catch(e) { setErr(e.message); } finally { setBusy(false); }
};
return (
@@ -496,7 +513,7 @@ function QuickLinks({ toast, mobile }) {
<div style={{ marginBottom:10 }}>
<div style={{ ...S.head, marginBottom:6 }}>ICON</div>
<div style={{ display:'flex', flexWrap:'wrap', gap:5 }}>
{ICONS.map(ic => (
{CONST_ICONS.map(ic => (
<button key={ic} onClick={() => setF(f => ({...f, icon:ic}))} style={{
width:36, height:36, borderRadius:7, fontSize:18, cursor:'pointer',
border:`1px solid ${form.icon===ic ? '#4ecdc4' : 'rgba(255,255,255,0.1)'}`,
@@ -1298,7 +1315,7 @@ export default function App() {
const token=localStorage.getItem('sk_token');
if(token){
try{const p=JSON.parse(atob(token.split('.')[1]));
if(p.exp*1000>Date.now())setUser({id:p.id,username:p.username,role:p.role});
if(p.exp*1000>Date.now()){setUser({id:p.id,username:p.username,role:p.role});initNachrichtenKeys();}
else localStorage.removeItem('sk_token');
}catch{localStorage.removeItem('sk_token');}
}