init studio admin frontend
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
export const adminAppPermissionsStorageKey = 'studio-admin-app-permissions';
|
||||
|
||||
export type CurrentAdminLike = {
|
||||
id?: string;
|
||||
email?: string;
|
||||
name?: string;
|
||||
role?: string;
|
||||
};
|
||||
|
||||
type PermissionMap = Record<string, string[]>;
|
||||
|
||||
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<T extends { id: string }>(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));
|
||||
}
|
||||
Reference in New Issue
Block a user