0.8.2: Auto-Recovery für hängende 0.8.0-Installationen + UpdateNotifier vor Login
- Auto-Recovery in adapter.js: wenn Cloud-Modus gesetzt + lokale Daten vorhanden + keine Cloud-Session → Cloud-Konfiguration wird beim nächsten App-Start automatisch zurückgenommen. Marker rapport_080_recovery verhindert wiederholte Auslösung. - UpdateNotifier wird in allen Pre-Login-Screens gerendert (BackendChoice, Setup, MigrationScreen, CloudSetup, Login) — so kann ein hängender Wizard sich via Auto-Update selbst befreien. - Tauri-Builds ignorieren VITE_SUPABASE_URL aus dem Build. Desktop-User geben die Server-URL immer aktiv im Login ein, statt eine irrelevante Default-IP vorgesetzt zu bekommen. - Anon-Key bleibt aus dem Build (kein Geheimnis, pro Cloud-Instanz fix). - BackendChoice zeigt nur dann eine vorkonfigurierte URL, wenn nicht in Tauri. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+30
-12
@@ -297,8 +297,8 @@ export default function App() {
|
||||
const [modal, setModal] = useState(null);
|
||||
const [printContent, setPrintContent] = useState(null);
|
||||
const [darkMode, setDarkMode] = useState(() => localStorage.getItem("rapport_dark") === "1");
|
||||
const [showChangelog, setShowChangelog] = useState(() => localStorage.getItem("rapport_changelog_seen") !== "0.8.1");
|
||||
const [changelogVersion, setChangelogVersion] = useState("0.8.1");
|
||||
const [showChangelog, setShowChangelog] = useState(() => localStorage.getItem("rapport_changelog_seen") !== "0.8.2");
|
||||
const [changelogVersion, setChangelogVersion] = useState("0.8.2");
|
||||
const [showAbout, setShowAbout] = useState(false);
|
||||
const [navOpen, setNavOpen] = useState(false);
|
||||
const [expandedNav, setExpandedNav] = useState(new Set(["buchhaltung"]));
|
||||
@@ -456,19 +456,21 @@ export default function App() {
|
||||
// Erst-Screen einer frischen Installation: «Lokal oder Cloud?».
|
||||
// Sichtbar solange der User die Wahl noch nicht getroffen hat UND es keine
|
||||
// lokalen Daten gibt. Sobald er gewählt hat, übernimmt der jeweilige Wizard.
|
||||
// UpdateNotifier wird in allen Pre-Login-Screens mitgerendert, damit ein
|
||||
// hängender Setup-Wizard sich via Auto-Update selbst befreien kann.
|
||||
const hasChosenBackend = localStorage.getItem("rapport_backend_chosen") === "1";
|
||||
if (!hasChosenBackend && isNewInstall && !data.settings.setupCompleted && !currentUser) {
|
||||
return <BackendChoice />;
|
||||
return <><BackendChoice /><UpdateNotifier /></>;
|
||||
}
|
||||
|
||||
// Setup- und Migrations-Screens sind LocalStorage-Spezifika. Im Cloud-Modus
|
||||
// erfolgt Erst-Einrichtung über den Init-Dialog im Login.
|
||||
if (!isCloudBackend && isNewInstall && !data.settings.setupCompleted) {
|
||||
return <Setup onComplete={handleSetupComplete} />;
|
||||
return <><Setup onComplete={handleSetupComplete} /><UpdateNotifier /></>;
|
||||
}
|
||||
|
||||
if (!isCloudBackend && !localStorage.getItem("rapport_v0_5_migrated")) {
|
||||
return <MigrationScreen data={data} onComplete={handleSetupComplete} />;
|
||||
return <><MigrationScreen data={data} onComplete={handleSetupComplete} /><UpdateNotifier /></>;
|
||||
}
|
||||
|
||||
// Passwort-Reset hat höchste Priorität — User kommt von Mail-Link
|
||||
@@ -493,12 +495,21 @@ export default function App() {
|
||||
|
||||
// Cloud + Instanz ist leer (0 Studios) → mehrseitiger Setup-Wizard.
|
||||
// Cloud + Studios vorhanden → klassischer Login.
|
||||
// UpdateNotifier wird hier auch gerendert, damit der Auto-Update-Check auch
|
||||
// ohne Login läuft (sonst kommt man bei einem fehlerhaften Setup-Screen nie
|
||||
// an ein neueres Build, das den Bug fixt).
|
||||
if (!currentUser) {
|
||||
if (isCloudBackend && cloudStudios !== null && cloudStudios.length === 0) {
|
||||
const cloudUrl = localStorage.getItem("rapport_cloud_url") || "";
|
||||
return <CloudSetup cloudInit={cloudInit} cloudUrl={cloudUrl} />;
|
||||
return <>
|
||||
<CloudSetup cloudInit={cloudInit} cloudUrl={cloudUrl} />
|
||||
<UpdateNotifier />
|
||||
</>;
|
||||
}
|
||||
return <Login verifyLogin={verifyLogin} settings={data.settings} version="0.8.1" />;
|
||||
return <>
|
||||
<Login verifyLogin={verifyLogin} settings={data.settings} version="0.8.2" />
|
||||
<UpdateNotifier />
|
||||
</>;
|
||||
}
|
||||
|
||||
if (printContent) {
|
||||
@@ -771,8 +782,8 @@ export default function App() {
|
||||
<div style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
|
||||
<button onClick={() => setShowAbout(true)} style={{ background: "none", border: "none", padding: 0, color: "#555", fontSize: 10, letterSpacing: "0.08em", cursor: "pointer", fontFamily: "inherit", textAlign: "left" }}
|
||||
onMouseEnter={e => e.currentTarget.style.color = "#aaa"} onMouseLeave={e => e.currentTarget.style.color = "#555"}>ÜBER RAPPORT</button>
|
||||
<button onClick={() => { setChangelogVersion("0.8.1"); setShowChangelog(true); }} style={{ background: "none", border: "none", padding: 0, color: "#aaa", fontSize: 10, letterSpacing: "0.08em", cursor: "pointer", fontFamily: "inherit" }}
|
||||
onMouseEnter={e => e.currentTarget.style.color = "#f0ede8"} onMouseLeave={e => e.currentTarget.style.color = "#aaa"}>0.8.1</button>
|
||||
<button onClick={() => { setChangelogVersion("0.8.2"); setShowChangelog(true); }} style={{ background: "none", border: "none", padding: 0, color: "#aaa", fontSize: 10, letterSpacing: "0.08em", cursor: "pointer", fontFamily: "inherit" }}
|
||||
onMouseEnter={e => e.currentTarget.style.color = "#f0ede8"} onMouseLeave={e => e.currentTarget.style.color = "#aaa"}>0.8.2</button>
|
||||
</div>
|
||||
</div>}
|
||||
|
||||
@@ -837,6 +848,13 @@ export default function App() {
|
||||
|
||||
{showChangelog && (() => {
|
||||
const CHANGELOGS = {
|
||||
"0.8.2": {
|
||||
items: [
|
||||
["Selbstheilung für hängende 0.8.0-Installationen", "Wer von 0.7 auf 0.8 geupdated hat und in den Cloud-Setup-Wizard geschoben wurde, kommt mit 0.8.2 automatisch zurück in seinen Lokal-Modus. Der Auto-Recovery-Code erkennt: Cloud-Modus gesetzt + lokale Daten vorhanden + keine Cloud-Anmeldung → Cloud-Konfiguration wird zurückgenommen, alle Daten bleiben erhalten."],
|
||||
["Auto-Update auch ohne Login", "Bisher prüfte Rapport erst nach dem Login auf Updates — wer in einem fehlerhaften Setup-Bildschirm hing, kam nicht an den Bugfix. Jetzt läuft der Update-Check auch im «Lokal oder Cloud»-Wizard, im Login-Screen und im Cloud-Setup."],
|
||||
["Tauri ohne fest eingebaute Server-IP", "Die Desktop-App enthält keine vorkonfigurierte Cloud-Adresse mehr. Wer Cloud nutzen will, gibt die Server-Adresse beim Login aktiv ein — kein automatisches Vorausfüllen mit irrelevanten IPs."],
|
||||
],
|
||||
},
|
||||
"0.8.1": {
|
||||
items: [
|
||||
["Update-Fix", "Behebt einen Fehler beim Upgrade von 0.7 auf 0.8: Lokal-Installationen wurden ungewollt in den Cloud-Modus geschoben und der Cloud-Setup-Wizard angezeigt, obwohl bereits lokale Daten vorhanden waren. Die App prüft jetzt vor einem automatischen Modus-Wechsel, ob lokale Daten existieren — und in Tauri-Installationen wird der Modus nie implizit gesetzt."],
|
||||
@@ -919,7 +937,7 @@ export default function App() {
|
||||
},
|
||||
};
|
||||
const versions = Object.keys(CHANGELOGS);
|
||||
const current = CHANGELOGS[changelogVersion] || CHANGELOGS["0.8.1"];
|
||||
const current = CHANGELOGS[changelogVersion] || CHANGELOGS["0.8.2"];
|
||||
return (
|
||||
<div style={{ position: "fixed", inset: 0, background: "rgba(0,0,0,0.55)", zIndex: 200, display: "flex", alignItems: "center", justifyContent: "center", padding: 24 }}>
|
||||
<div style={{ background: "#fff", borderRadius: 10, width: "100%", maxWidth: 480, boxShadow: "0 8px 40px rgba(0,0,0,0.18)", overflow: "hidden" }}>
|
||||
@@ -948,7 +966,7 @@ export default function App() {
|
||||
))}
|
||||
</div>
|
||||
<div style={{ padding: "12px 32px 24px" }}>
|
||||
<button className="btn btn-primary" style={{ width: "100%", fontSize: 13 }} onClick={() => { setShowChangelog(false); localStorage.setItem("rapport_changelog_seen", "0.8.1"); }}>
|
||||
<button className="btn btn-primary" style={{ width: "100%", fontSize: 13 }} onClick={() => { setShowChangelog(false); localStorage.setItem("rapport_changelog_seen", "0.8.2"); }}>
|
||||
Schliessen
|
||||
</button>
|
||||
</div>
|
||||
@@ -963,7 +981,7 @@ export default function App() {
|
||||
<div style={{ background: "#1a1a18", padding: "28px 32px 24px" }}>
|
||||
<div style={{ fontSize: 10, letterSpacing: "0.18em", color: "#b07848", marginBottom: 8, fontWeight: 600 }}>ÜBER RAPPORT</div>
|
||||
<div style={{ fontFamily: "'Playfair Display', serif", fontSize: 28, color: "#f0ede8", fontWeight: 400, lineHeight: 1.1 }}>Rapport</div>
|
||||
<div style={{ fontSize: 11, color: "#888", marginTop: 6, letterSpacing: "0.04em" }}>Alpha 0.8.1 · Studio-Management für Architekturbüros</div>
|
||||
<div style={{ fontSize: 11, color: "#888", marginTop: 6, letterSpacing: "0.04em" }}>Alpha 0.8.2 · Studio-Management für Architekturbüros</div>
|
||||
</div>
|
||||
<div style={{ padding: "20px 32px 8px" }}>
|
||||
<div style={{ fontSize: 11, fontWeight: 600, color: "#888", letterSpacing: "0.1em", marginBottom: 12 }}>LIZENZ</div>
|
||||
|
||||
Reference in New Issue
Block a user