fix(magic): match current device by session deviceId, remove confusing overall status card
This commit is contained in:
parent
4c46ac69c9
commit
b829f9ba3e
@ -37,11 +37,19 @@ export function useDeviceStatus(
|
|||||||
devices: Ref<MagicDeviceInfo[]>,
|
devices: Ref<MagicDeviceInfo[]>,
|
||||||
localHostname: Ref<string | null>,
|
localHostname: Ref<string | null>,
|
||||||
iphone: Ref<IphoneDeviceState | null>,
|
iphone: Ref<IphoneDeviceState | null>,
|
||||||
|
currentDeviceId?: Ref<string | null>,
|
||||||
) {
|
) {
|
||||||
const currentBackendDevice = computed<ComputedDevice | null>(() => {
|
function isCurrentDevice(d: MagicDeviceInfo): boolean {
|
||||||
if (!localHostname.value) return null;
|
if (currentDeviceId?.value) {
|
||||||
|
return d.deviceId === currentDeviceId.value;
|
||||||
|
}
|
||||||
|
if (!localHostname.value) return false;
|
||||||
const local = normalizeHostname(localHostname.value);
|
const local = normalizeHostname(localHostname.value);
|
||||||
const found = devices.value.find((d) => normalizeHostname(d.hostname) === local);
|
return normalizeHostname(d.hostname) === local;
|
||||||
|
}
|
||||||
|
|
||||||
|
const currentBackendDevice = computed<ComputedDevice | null>(() => {
|
||||||
|
const found = devices.value.find(isCurrentDevice);
|
||||||
if (!found) return null;
|
if (!found) return null;
|
||||||
return {
|
return {
|
||||||
deviceId: found.deviceId,
|
deviceId: found.deviceId,
|
||||||
|
|||||||
@ -33,41 +33,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="max-w-3xl mx-auto px-6 py-8 space-y-6">
|
<div class="max-w-3xl mx-auto px-6 py-8 space-y-6">
|
||||||
<!-- Overall status card -->
|
|
||||||
<UCard class="shadow-sm border-gray-100 overflow-hidden">
|
|
||||||
<div class="flex items-start gap-4">
|
|
||||||
<div
|
|
||||||
class="w-14 h-14 rounded-2xl bg-gradient-to-br flex items-center justify-center shrink-0"
|
|
||||||
:class="statusCardClass"
|
|
||||||
>
|
|
||||||
<UIcon
|
|
||||||
:name="protection.status.value.overall === 'protected'
|
|
||||||
? 'i-heroicons-shield-check'
|
|
||||||
: protection.status.value.overall === 'partial'
|
|
||||||
? 'i-heroicons-shield-exclamation'
|
|
||||||
: 'i-heroicons-shield-slash'"
|
|
||||||
class="w-7 h-7 text-white"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="flex-1 min-w-0">
|
|
||||||
<div class="flex items-center gap-2 flex-wrap">
|
|
||||||
<h2 class="text-lg font-bold text-gray-900">{{ protection.status.value.label }}</h2>
|
|
||||||
<UBadge
|
|
||||||
:color="badgeColorForOverall"
|
|
||||||
variant="subtle"
|
|
||||||
size="xs"
|
|
||||||
>
|
|
||||||
{{ overallBadgeLabel }}
|
|
||||||
</UBadge>
|
|
||||||
</div>
|
|
||||||
<p class="text-sm text-gray-500 mt-0.5">{{ protection.status.value.message }}</p>
|
|
||||||
</div>
|
|
||||||
<div v-if="protection.lastUpdated.value" class="hidden sm:block text-xs text-gray-400 text-right">
|
|
||||||
Aktualisiert<br>{{ formatTime(protection.lastUpdated.value) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</UCard>
|
|
||||||
|
|
||||||
<!-- Hero section -->
|
<!-- Hero section -->
|
||||||
<section>
|
<section>
|
||||||
<h2 class="text-sm font-bold text-gray-500 uppercase tracking-wider mb-3">Aktives Gerät</h2>
|
<h2 class="text-sm font-bold text-gray-500 uppercase tracking-wider mb-3">Aktives Gerät</h2>
|
||||||
@ -169,6 +134,8 @@ const devices = useMagicDevices();
|
|||||||
const iphone = useIphoneDevice();
|
const iphone = useIphoneDevice();
|
||||||
const protection = useProtectionStatus();
|
const protection = useProtectionStatus();
|
||||||
|
|
||||||
|
const currentDeviceId = computed(() => session.value?.deviceId ?? null);
|
||||||
|
|
||||||
const profile = ref<UserProfile | null>(null);
|
const profile = ref<UserProfile | null>(null);
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
const error = ref<string | null>(null);
|
const error = ref<string | null>(null);
|
||||||
@ -178,34 +145,7 @@ const platformInfo = ref<{ platform: string } | null>(null);
|
|||||||
|
|
||||||
// Share localHostname from protection composable with device status logic.
|
// Share localHostname from protection composable with device status logic.
|
||||||
const localHostname = protection.localHostname;
|
const localHostname = protection.localHostname;
|
||||||
const { currentBackendDevice, otherDevices, iosStars } = useDeviceStatus(devices, localHostname, iphone);
|
const { currentBackendDevice, otherDevices, iosStars } = useDeviceStatus(devices, localHostname, iphone, currentDeviceId);
|
||||||
|
|
||||||
const statusCardClass = computed(() => {
|
|
||||||
switch (protection.status.value.overall) {
|
|
||||||
case "protected": return "from-emerald-500 to-teal-500";
|
|
||||||
case "partial": return "from-amber-500 to-orange-500";
|
|
||||||
case "unprotected": return "from-slate-400 to-slate-500";
|
|
||||||
default: return "from-blue-500 to-indigo-500";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const badgeColorForOverall = computed(() => {
|
|
||||||
switch (protection.status.value.overall) {
|
|
||||||
case "protected": return "success";
|
|
||||||
case "partial": return "warning";
|
|
||||||
case "unprotected": return "neutral";
|
|
||||||
default: return "primary";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const overallBadgeLabel = computed(() => {
|
|
||||||
switch (protection.status.value.overall) {
|
|
||||||
case "protected": return "Aktiv";
|
|
||||||
case "partial": return "Teilweise";
|
|
||||||
case "unprotected": return "Inaktiv";
|
|
||||||
default: return "Unbekannt";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await loadProfile();
|
await loadProfile();
|
||||||
@ -239,10 +179,6 @@ async function refresh() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatTime(date: Date) {
|
|
||||||
return date.toLocaleTimeString("de-DE", { hour: "2-digit", minute: "2-digit", second: "2-digit" });
|
|
||||||
}
|
|
||||||
|
|
||||||
function openDevice(device: ComputedDevice) {
|
function openDevice(device: ComputedDevice) {
|
||||||
selectedDevice.value = device;
|
selectedDevice.value = device;
|
||||||
sheetOpen.value = true;
|
sheetOpen.value = true;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user