feat(nextcloud-files): Nextcloud-Kennung auf der Anmeldeseite, Anleitungen und Changelog
- Anmeldebildschirm zeigt Name, Logo und Themenfarbe der Nextcloud (GET server, server/logo) - Kennung wird 10 Minuten zwischengespeichert, Adresswechsel leert sie, Logo nur nach Bytes erkannt und mit CSP-Sandbox ausgeliefert - Anmeldekarte neu gestaltet (Kennungskopf, Hinweis zum Passwort am Fuss), Kontoleiste mit kleiner Kachel - Fokusfang in leeren Ordnern, damit die Rücktaste dort funktioniert - Changelog, Anwender-, Administrations- und Betriebshandbuch (Brute-Force-Ausnahme, Proxy-Grenzen) - e2e-Skripte wiederholbar gemacht Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,12 @@ import { useCallback, useEffect, useState } from 'react';
|
||||
import { TabBar } from '@/components/accounting/tab-bar';
|
||||
import { SettingsSection } from '@/components/control-center/settings-section';
|
||||
import { PageHeader } from '@/components/layout/page-header';
|
||||
import { getNextcloudFilesStatus, type NextcloudFilesStatus } from '@/lib/nextcloud-files-api';
|
||||
import {
|
||||
getNextcloudFilesStatus,
|
||||
getServerInfo,
|
||||
type NextcloudFilesStatus,
|
||||
type NextcloudServerInfo,
|
||||
} from '@/lib/nextcloud-files-api';
|
||||
import { useCanManageModule } from '@/lib/use-module-capability';
|
||||
import { AccountBar } from './components/AccountBar';
|
||||
import { ConnectPanel } from './components/ConnectPanel';
|
||||
@@ -31,6 +36,7 @@ export default function NextcloudFilesPage() {
|
||||
const [status, setStatus] = useState<NextcloudFilesStatus | null>(null);
|
||||
const [statusError, setStatusError] = useState(false);
|
||||
const [tab, setTab] = useState<TabId>('files');
|
||||
const [serverInfo, setServerInfo] = useState<NextcloudServerInfo | null>(null);
|
||||
|
||||
const reloadStatus = useCallback(async () => {
|
||||
try {
|
||||
@@ -45,6 +51,29 @@ export default function NextcloudFilesPage() {
|
||||
void reloadStatus();
|
||||
}, [reloadStatus]);
|
||||
|
||||
// Name, Farbe und Logo der Nextcloud fuer Anmeldebildschirm und Kontoleiste. Ein Fehler ist
|
||||
// harmlos: ohne Kennung steht der Rechnername da.
|
||||
const configured = status?.configured === true;
|
||||
const serverUrl = status?.serverUrl ?? null;
|
||||
// biome-ignore lint/correctness/useExhaustiveDependencies: eine neue Adresse laedt die Kennung neu
|
||||
useEffect(() => {
|
||||
if (!configured) {
|
||||
setServerInfo(null);
|
||||
return;
|
||||
}
|
||||
let cancelled = false;
|
||||
getServerInfo()
|
||||
.then((info) => {
|
||||
if (!cancelled) setServerInfo(info);
|
||||
})
|
||||
.catch(() => {
|
||||
if (!cancelled) setServerInfo(null);
|
||||
});
|
||||
return () => {
|
||||
cancelled = true;
|
||||
};
|
||||
}, [configured, serverUrl]);
|
||||
|
||||
const account = status?.account ?? null;
|
||||
const connected = account?.connected === true;
|
||||
|
||||
@@ -60,7 +89,12 @@ export default function NextcloudFilesPage() {
|
||||
description={t('description')}
|
||||
actions={
|
||||
activeTab === 'files' && status?.configured && account && connected ? (
|
||||
<AccountBar account={account} host={status.host} onDisconnected={reloadStatus} />
|
||||
<AccountBar
|
||||
account={account}
|
||||
host={status.host}
|
||||
info={serverInfo}
|
||||
onDisconnected={reloadStatus}
|
||||
/>
|
||||
) : undefined
|
||||
}
|
||||
/>
|
||||
@@ -95,6 +129,7 @@ export default function NextcloudFilesPage() {
|
||||
) : (
|
||||
<ConnectPanel
|
||||
host={status.host}
|
||||
info={serverInfo}
|
||||
expired={account?.expired === true}
|
||||
onConnected={reloadStatus}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user