export const adminAppPermissionsStorageKey = 'studio-admin-app-permissions'; export type CurrentAdminLike = { id?: string; email?: string; name?: string; role?: string; }; type PermissionMap = Record; export function readCurrentAdmin(): CurrentAdminLike | null { try { const raw = window.localStorage.getItem('studio-admin'); if (!raw) return null; const admin = JSON.parse(raw) as CurrentAdminLike; return admin?.id || admin?.email ? admin : null; } catch { return null; } } export function getAdminPermissionKey(admin: CurrentAdminLike) { return admin.id || admin.email || ''; } export function isOwnerAdmin(admin?: CurrentAdminLike | null) { return admin?.role === 'OWNER'; } export function getAdminAppPermissionMap(): PermissionMap { try { const raw = window.localStorage.getItem(adminAppPermissionsStorageKey); if (!raw) return {}; const parsed = JSON.parse(raw) as PermissionMap; return parsed && typeof parsed === 'object' ? parsed : {}; } catch { return {}; } } export function getAdminAppPermissions(admin: CurrentAdminLike) { const key = getAdminPermissionKey(admin); const map = getAdminAppPermissionMap(); if (key && map[key]) return map[key]; if (admin.id && map[admin.id]) return map[admin.id]; if (admin.email && map[admin.email]) return map[admin.email]; return []; } export function setAdminAppPermissions(admin: CurrentAdminLike, appIds: string[]) { const key = getAdminPermissionKey(admin); if (!key) return; const nextMap = getAdminAppPermissionMap(); const nextAppIds = [...new Set(appIds.filter(Boolean))]; nextMap[key] = nextAppIds; if (admin.id) nextMap[admin.id] = nextAppIds; if (admin.email) nextMap[admin.email] = nextAppIds; window.localStorage.setItem(adminAppPermissionsStorageKey, JSON.stringify(nextMap)); window.dispatchEvent(new CustomEvent('studio-admin-app-permissions-change')); } export function grantAppPermissionToCurrentAdmin(appId: string) { const admin = readCurrentAdmin(); if (!admin || isOwnerAdmin(admin)) return; setAdminAppPermissions(admin, [...getAdminAppPermissions(admin), appId]); } export function filterAppsByCurrentAdmin(apps: T[]) { const admin = readCurrentAdmin(); if (!admin || isOwnerAdmin(admin)) return apps; const allowedAppIds = new Set(getAdminAppPermissions(admin)); return apps.filter((app) => allowedAppIds.has(app.id)); }