7.8 KiB
7.8 KiB
Magic Dashboard – iOS-Section Redesign
Ziel
Das Magic-Dashboard soll klar zwischen zwei eigenen Bausteinen trennen:
- Desktop-Schutz (Mac/Windows) – das Gerät, auf dem Magic läuft.
- iOS-Verwaltung (eigene iPhone/iPad-Geräte) – registrierte iOS-Geräte des Users mit Status, Sternen und passenden Aktionen.
„Andere Geräte“ bleiben als sekundäre Information erhalten, sollen aber nicht den Fokus stehlen. Magic ist kein offenes Verwaltungstool für fremde Geräte.
Annahmen (aus dem Abstimmungsgespräch)
- Backend-iOS-Geräte werden immer gelistet.
- Wenn ein iPhone/iPad per USB verbunden ist, werden Live-Daten (Supervision, Enrollment, Sideload, App) mit dem passenden Backend-Eintrag synchronisiert.
- Ein per USB verbundenes, aber im Backend unbekanntes iOS-Gerät wird als „Nicht erkennbar“ markiert. Der Hinweis verweist auf: ReBreak-App installieren → anmelden → Gerät registrieren. Erst danach ist es verwaltbar.
- Supervise / Enroll / Sideload / App-Install bleiben im bestehenden Wizard (
/detect,/supervise,/enroll,/sideload). Das Dashboard bietet nur den passenden Einstieg.
Seitenstruktur
status.vue
├── Header (Profil, Logout)
├── Section: Aktives Gerät (Desktop-Hero)
│ └── DeviceHeroCard für currentBackendDevice (mac/windows)
├── Section: Meine iOS-Geräte
│ ├── UnknownIosDeviceCard (falls USB-Device nicht im Backend)
│ └── IosDeviceCard[] für jedes Backend-iOS-Gerät
│ (Sterne + Status + Action-Button)
├── Section: Weitere Geräte
│ └── DeviceListItem[] für sonstige Backend-Geräte
└── DeviceDetailSheet (weiterhin für Details/Cooldown)
Neue Komponenten
IosDeviceSection.vue
- Props:
devices: ComputedDevice[]– alle Backend-iOS-Geräte des Usersiphone: IphoneDeviceState | null– aktuell per USB erkanntes Gerätloading: boolean
- Zeigt den Section-Header und rendert die Liste von
IosDeviceCards. - Wenn
iphoneverbunden, aber kein passendes Backend-Gerät gefunden wird, wirdUnknownIosDeviceCardangezeigt. - Wenn noch keine Backend-iOS-Geräte geladen wurden: Hinweis „Keine iOS-Geräte geladen“ + Aktualisieren-Button.
- Wenn geladen und leer: Hinweis „Keine iOS-Geräte registriert. ReBreak-App installieren und Gerät hinzufügen.“
IosDeviceCard.vue
- Props:
device: ComputedDeviceiphone: IphoneDeviceState | null– falls dieses Gerät per USB verbunden istisConnected: boolean
- Zeigt:
- Name/Modell
- Status-Badge (
active,pending,unprotectedetc.) - Letzte Sichtung
IosStarRating+ detaillierte Sternen-Liste, wennisConnected- Sonst Hinweis: „Zum Live-Status iPhone per USB verbinden“
- Action-Button (ableitet sich aus dem gemergten Zustand):
- Nicht supervised → „Supervisen" →
/supervise - Supervised, aber Enrollment fehlt → „Enrollen" →
/enroll - Enrollment vorhanden, aber Sideload-Profil fehlt → „Sideload installieren" →
/sideload - Sideload vorhanden, aber App fehlt → „App installieren" (MDM-Befehl oder Link)
- Alles okay → „Synchronisieren" (prüft Enrollment-, Sideload- und Supervision-Status; bei Abweichungen werden fehlende Profile/MDM-Kommandos gepusht; falls die lokale MDM-Version hinter der aktuellen ReBreak-MDM-Version zurückfällt, wird ein Update gepusht und der User informiert)
- Während der 3-Tage-Kündigungs-Grace-Period → „ReBreak entfernen" (löst Offboarding aus: MDM-Profile entfernen, Gerät unsupervised setzen, Eintrag bereinigen)
- Nicht supervised → „Supervisen" →
UnknownIosDeviceCard.vue
- Props:
iphone: IphoneDeviceState
- Zeigt:
- Warn-Icon + „Dieses iPhone ist nicht erkennbar"
- Modell, iOS-Version, UDID (nur zur Info)
- Hinweis: „Mit keinem ReBreak-Konto verbunden. Um es zu verwalten: ReBreak-App installieren, anmelden und Gerät registrieren."
- Keine Supervise-/Enroll-Aktionen.
Datenfluss
- User klickt in
status.vueauf Aktualisieren. protection.refresh()wird aufgerufen:detectIphoneState()lädt das per USB verbundene iOS-Gerät.getMagicDevices()lädt alle Backend-Geräte in den shareduseMagicDevices-State.
useDeviceStatusliefert weiterhin:currentBackendDevice(Desktop)otherDevices(alles außer current)
IosDeviceSectionerhält die Liste allerotherDevices, filtert intern aufplatform === 'ios'und versucht, das verbundeneiphoneper Modell + Name zuzuordnen.- Action-Buttons leiten den User basierend auf dem gemergten Live-Status in den passenden Wizard-Schritt weiter.
iOS-Matching
Da Backend-deviceId (Capacitor-UUID) nicht mit USB-UDID übereinstimmt, erfolgt das Matching über:
device.model(Backend) ↔iphone.productType(USB)device.name(Backend) ↔iphone.name(USB) als Fallback / Verfeinerung
Sind mehrere Geräte mit identischem Modell vorhanden, wird das erste passende (name match) als verbunden markiert; bei Unklarheit wird das iphone nicht zugeordnet und erscheint als UnknownIosDeviceCard.
Bestehende Komponenten – Anpassungen
DeviceHeroCard.vue
- Keine iOS-Sterne mehr anzeigen (
showIosStarsbleibt aber für zukünftige Flexibilität). - Aktionen bleiben auf Desktop-Schutz beschränkt.
DeviceListItem.vue
- Wird für „Weitere Geräte“ (andere Desktops) weiterverwendet.
- iOS-Geräte verschwinden aus dieser Liste und werden in der neuen iOS-Section angezeigt.
DeviceDetailSheet.vue
- iOS-Sterne-Anzeige gilt für jedes iOS-Gerät, das gerade per USB verbunden ist (nicht nur
isCurrent, da iOS-Geräte nie „current" sind). - Cooldown-Steuerung bleibt nur für
isCurrent-Desktop-Geräte.
useDeviceStatus.ts
- Entfernt den Debug-
watchEffect(bereits erledigt). - Fügt optional
iosDevicesunddesktopDevicesals getrennte Derived Lists hinzu, damitstatus.vueweniger Filter-Logik enthält.
On-Demand-Verhalten bleibt erhalten
- Kein automatisches Polling mehr.
- Sterne/Status werden nur beim manuellen Refresh aktualisiert.
- Das verhindert erneut Log-Spam durch wiederholte
detect_iphone_state-Aufrufe.
Fehlerbehandlung
- Wenn
detectIphoneStatefehlschlägt: Fehler nur inprotection.lastError; iOS-Section zeigt Backend-Liste weiterhin an. - Wenn
getMagicDevicesfehlschägt:error-Banner instatus.vue. - Wenn Matching mehrdeutig:
UnknownIosDeviceCardstatt falscher Zuordnung.
Kündigungs-Grace-Period & Offboarding
- Solange das Gerät enrolled ist und das Abo aktiv ist, wird nichts deinstalliert.
- Nach einer Kündigung bleibt das iOS-Gerät für 3 Tage in der Liste sichtbar.
- Der Button „ReBreak entfernen" ist unsichtbar oder disabled, solange die Grace-Period noch nicht begonnen hat.
- Sobald die Grace-Period läuft, erscheint der Button ohne zusätzliche Sicherheitsabfrage.
- Ein Klick darauf startet das Offboarding:
- MDM-Enrollment-Profil und Sideload-Profil vom Gerät entfernen.
- Gerät aus dem Supervised-Modus zurücksetzen.
- Backend-Eintrag für das iOS-Gerät bereinigen.
- Backend-Abhängigkeit: Es braucht ein Feld/Endpoint, der die Kündigung + verbleibende Grace-Period erkennbar macht (z. B.
subscriptionCancelledAtim Profil oder dedizierter/api/magic/subscription-status). Das Offboarding selbst braucht einen neuen API-Endpoint oder Tauri-Command, der MDM-Remove + Unsupervise orchestriert.
Offene Punkte / Nächste Schritte
- Existiert bereits ein Backend-Feld/Endpoint für Kündigung + Grace-Period, oder muss der gebaut werden?
- Wie wird die „aktuelle ReBreak-MDM-Version" bestimmt – ist sie im Profil hinterlegt, im Backend konfiguriert oder über eine Tauri-Funktion verfügbar?
- Soll die App-Installation via MDM direkt aus dem Dashboard auslösbar sein, oder reicht ein Verweis auf
/sideload?