@speckle/shared
Version:
Shared code between various Speckle JS packages
51 lines • 1.83 kB
JavaScript
import { isObjectLike } from '#lodash';
import { base64Decode, base64Encode } from '../../core/utils/base64.js';
import { isModelResource, isObjectResource, resourceBuilder } from '../../viewer/helpers/route.js';
/**
* Title used for the default 'Ungrouped Scenes' group in the saved views panel.
*/
export const ungroupedScenesGroupTitle = 'Ungrouped';
/**
* Converts a resourceId string into a more abstract format used by groups that disregards
* specific versions of models and objects.
*/
export const formatResourceIdsForGroup = (resources) => {
return resourceBuilder()
.addResources(resources)
.clearVersions()
.filter((r) => {
// filter out any resources that are not ViewerModelResource or ViewerObjectResource
return isModelResource(r) || isObjectResource(r);
})
.map((r) => r.toString());
};
export const buildDefaultGroupId = (params) => {
const payload = {
resourceIds: formatResourceIdsForGroup(params.resourceIds),
projectId: params.projectId,
name: 'Default Group'
};
const str = JSON.stringify(payload);
return 'default-' + base64Encode(str);
};
export const decodeDefaultGroupId = (id) => {
try {
if (!isUngroupedGroup(id))
return null;
const json = base64Decode(id.replace('default-', ''));
const obj = JSON.parse(json);
if (!isObjectLike(obj) ||
!obj.resourceIds ||
!obj.projectId ||
obj.name !== 'Default Group') {
throw new Error('Invalid saved view group ID format');
}
return obj;
}
catch {
// Suppress - not the default group ID
return null;
}
};
export const isUngroupedGroup = (groupId) => groupId.startsWith('default-');
//# sourceMappingURL=defaultGroup.js.map