* Adds section and subsection library pages. * Refactors routing to support them and fix routing from collections page to other pages. * Refactors library context to reliably set component, unit, and other container ids even when the url changes when user goes back in history rapidly.
69 lines
2.5 KiB
TypeScript
69 lines
2.5 KiB
TypeScript
/**
|
|
* Given a usage key like `lb:org:lib:html:id`, get the type (e.g. `html`)
|
|
* @param usageKey e.g. `lb:org:lib:html:id`
|
|
* @returns The block type as a string
|
|
*/
|
|
export function getBlockType(usageKey: string): string {
|
|
if (usageKey && (usageKey.startsWith('lb:') || usageKey.startsWith('lct:'))) {
|
|
const blockType = usageKey.split(':')[3];
|
|
if (blockType) {
|
|
return blockType;
|
|
}
|
|
}
|
|
throw new Error(`Invalid usageKey: ${usageKey}`);
|
|
}
|
|
|
|
/**
|
|
* Given a usage key like `lb:org:lib:html:id`, get the library key
|
|
* @param usageKey e.g. `lb:org:lib:html:id`
|
|
* @returns The library key, e.g. `lib:org:lib`
|
|
*/
|
|
export function getLibraryId(usageKey: string): string {
|
|
const [blockType, org, lib] = usageKey?.split(':') || [];
|
|
|
|
if (['lb', 'lib-collection', 'lct'].includes(blockType) && org && lib) {
|
|
return `lib:${org}:${lib}`;
|
|
}
|
|
throw new Error(`Invalid usageKey: ${usageKey}`);
|
|
}
|
|
|
|
/** Check if this is a V2 library key. */
|
|
export function isLibraryKey(learningContextKey: string | undefined | null): learningContextKey is string {
|
|
return typeof learningContextKey === 'string' && learningContextKey.startsWith('lib:');
|
|
}
|
|
|
|
/** Check if this is a V1 library key. */
|
|
export function isLibraryV1Key(learningContextKey: string | undefined | null): learningContextKey is string {
|
|
return typeof learningContextKey === 'string' && learningContextKey.startsWith('library-v1:');
|
|
}
|
|
|
|
/**
|
|
* Build a collection usage key from library V2 context key and collection Id.
|
|
* This Collection Usage Key is only used on tagging.
|
|
*/
|
|
export const buildCollectionUsageKey = (learningContextKey: string, collectionId: string) => {
|
|
if (!isLibraryKey(learningContextKey)) {
|
|
return '';
|
|
}
|
|
|
|
const orgLib = learningContextKey.replace('lib:', '');
|
|
return `lib-collection:${orgLib}:${collectionId}`;
|
|
};
|
|
|
|
export enum ContainerType {
|
|
Section = 'section',
|
|
Subsection = 'subsection',
|
|
Unit = 'unit',
|
|
/**
|
|
* Chapter, Sequential and Vertical are the old names for section, subsection and unit.
|
|
* Generally, **please avoid using this term entirely in any libraries code** or
|
|
* anything based on the new Learning Core "Containers" framework - just call it a unit, section or subsection. We
|
|
* do still need to use this in the modulestore-based courseware, and currently the /xblock/ API used to copy
|
|
* library containers into courses also requires specifying this, though that should change to a better API
|
|
* that does the unit->vertical conversion automatically in the future.
|
|
*/
|
|
Chapter = 'chapter',
|
|
Sequential = 'sequential',
|
|
Vertical = 'vertical',
|
|
}
|