// Partner admin's "acting as a customer admin" state. When a partner clicks // into a customer org, the sidebar reshapes to that customer's admin nav and // a persistent banner indicates the partner context. // // In real use, every action while in this mode is logged with the partner's // identity (not the customer's) — the design spec is explicit about this for // trust. We hold the active customer's tenant _id (the same key the customers // page passes to enter()); consumers resolve it against the real tenant list. const activeCustomerId = ref(null) export const usePartnerMode = () => { // Partner mode is only ever meaningful for partner staff. The active-customer // id lives in sessionStorage, which is shared across whoever signs in on this // device — so an admin or end-user could otherwise inherit a partner's leftover // state and see partner-view chrome. We gate every read on isPartnerStaff so // that can never happen, regardless of what's stored. const { isPartnerStaff } = useMe() function enter(customerId: string) { activeCustomerId.value = customerId if (import.meta.client) { sessionStorage.setItem('dezky-partner-active-customer', customerId) } } function exit() { activeCustomerId.value = null if (import.meta.client) { sessionStorage.removeItem('dezky-partner-active-customer') } } function hydrate() { if (!import.meta.client) return // Non-partner accounts must never be in partner mode. Purge any stale // entry left by a previous partner session on this same device. if (!isPartnerStaff.value) { sessionStorage.removeItem('dezky-partner-active-customer') activeCustomerId.value = null return } if (activeCustomerId.value) return const stored = sessionStorage.getItem('dezky-partner-active-customer') if (stored) activeCustomerId.value = stored } return { activeCustomerId, isActive: computed( () => isPartnerStaff.value && activeCustomerId.value !== null, ), enter, exit, hydrate, } }