Skip to content

Commit 91f3ce5

Browse files
feat: slot masqueradeBar
1 parent 3abf232 commit 91f3ce5

6 files changed

Lines changed: 56 additions & 0 deletions

File tree

shell/header/Header.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export default function Header() {
1414
<Slot id="org.openedx.frontend.slot.header.mobile.v1" />
1515
</nav>
1616
</header>
17+
<Slot id="org.openedx.frontend.slot.header.masqueradeBar.v1" />
1718
<Slot id="org.openedx.frontend.slot.header.courseNavigationBar.v1" />
1819
</>
1920
);

shell/header/app.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import MobileNavLinks from './mobile/MobileNavLinks';
1313

1414
import messages from '../Shell.messages';
1515
import CourseTabsNavigation from './course-navigation-bar/CourseTabsNavigation';
16+
import MasqueradeBar from './masquerade-bar/MasqueradeBar';
1617
import { isCourseNavigationRoute } from './course-navigation-bar/utils';
18+
import { isMasqueradeBarRoute } from './masquerade-bar/utils';
1719
import { appId } from './constants';
1820
import './app.scss';
1921

@@ -147,6 +149,15 @@ const config: App = {
147149
condition: {
148150
callback: () => isCourseNavigationRoute(),
149151
}
152+
},
153+
{
154+
slotId: 'org.openedx.frontend.slot.header.masqueradeBar.v1',
155+
id: 'org.openedx.frontend.widget.header.masqueradeBar.v1',
156+
op: WidgetOperationTypes.APPEND,
157+
component: MasqueradeBar,
158+
condition: {
159+
callback: () => isMasqueradeBarRoute(),
160+
}
150161
}
151162
]
152163
};

shell/header/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export const appId = 'org.openedx.frontend.app.header';
22
export const providesCourseNavigationRolesId = 'org.openedx.frontend.provides.courseNavigationRoles.v1';
3+
export const providesMasqueradeBarRolesId = 'org.openedx.frontend.provides.masqueradeBarRoles.v1';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const MasqueradeBar = () => <div></div>;
2+
3+
export default MasqueradeBar;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { defineMessages } from '../../../runtime';
2+
3+
const messages = defineMessages({
4+
titleViewCourseIn: {
5+
id: 'masqueradeBar.viewCourse',
6+
defaultMessage: 'View course in:',
7+
description: 'Button to view the course in the studio',
8+
},
9+
titleStudio: {
10+
id: 'masqueradeBar.studio',
11+
defaultMessage: 'Studio',
12+
description: 'Button to view in studio',
13+
},
14+
titleInsights: {
15+
id: 'masqueradeBar.insights',
16+
defaultMessage: 'Insights',
17+
description: 'Button Insights',
18+
},
19+
});
20+
21+
export default messages;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { getActiveRoles, getProvidesAsStrings } from '../../../runtime';
2+
import { providesMasqueradeBarRolesId } from '../constants';
3+
4+
/*
5+
* Collects route role strings from all apps that opted into the course
6+
* navigation bar feature. Each app declares its roles as a string array:
7+
*
8+
* provides: {
9+
* [providesMasqueradeBarRolesId]: ['org.openedx.frontend.role.learning'],
10+
* }
11+
*/
12+
function getMasqueradeBarRoles(): string[] {
13+
return getProvidesAsStrings(providesMasqueradeBarRolesId);
14+
}
15+
16+
export function isMasqueradeBarRoute(): boolean {
17+
const activeRoles = getActiveRoles();
18+
return getMasqueradeBarRoles().some(role => activeRoles.includes(role));
19+
}

0 commit comments

Comments
 (0)