-
Notifications
You must be signed in to change notification settings - Fork 1
Enterprise theming changes #6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
61573be
c7f3b09
47d5ba4
f8aecd1
ca9381f
525490d
540f0de
b263afe
f596838
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -1,38 +1,88 @@ | ||||||
| import React from 'react'; | ||||||
| import { useSelector } from 'react-redux'; | ||||||
|
|
||||||
| import { getConfig } from '@edx/frontend-platform'; | ||||||
| import { useIntl } from '@edx/frontend-platform/i18n'; | ||||||
| import { Hyperlink, Image } from '@openedx/paragon'; | ||||||
| import PropTypes from 'prop-types'; | ||||||
| import classNames from 'classnames'; | ||||||
|
|
||||||
| import messages from './messages'; | ||||||
|
|
||||||
| const LargeLayout = ({ fullName }) => { | ||||||
| const LargeLayout = () => { | ||||||
| const { formatMessage } = useIntl(); | ||||||
|
|
||||||
| const enterpriseBranding = useSelector( | ||||||
| state => state.commonComponents?.thirdPartyAuthContext?.enterpriseBranding, | ||||||
| ); | ||||||
|
|
||||||
| const enterpriseLogoUrl = enterpriseBranding?.enterpriseLogoUrl || null; | ||||||
| const enterpriseName = enterpriseBranding?.enterpriseName || null; | ||||||
|
|
||||||
| const enterpriseWelcomeHtml = enterpriseBranding?.enterpriseBrandedWelcomeString | ||||||
| || enterpriseBranding?.platformWelcomeString | ||||||
| || ''; | ||||||
|
|
||||||
| const siteName = getConfig().SITE_NAME; | ||||||
| const baseLogoSrc = getConfig().LOGO_WHITE_URL || getConfig().LOGO_URL; | ||||||
|
|
||||||
| return ( | ||||||
| <div className="w-50 d-flex"> | ||||||
| <div className="col-md-10 bg-light-200 p-0"> | ||||||
| <div className="col-md-10 bg-primary-400 auth-hero-left position-relative"> | ||||||
| {/* base edX logo at very top-left */} | ||||||
| <Hyperlink destination={getConfig().MARKETING_SITE_BASE_URL}> | ||||||
| <Image className="logo position-absolute" alt={getConfig().SITE_NAME} src={getConfig().LOGO_URL} /> | ||||||
| <Image | ||||||
| className="logo auth-hero-base-logo" | ||||||
| alt={siteName} | ||||||
| src={baseLogoSrc} | ||||||
| /> | ||||||
| </Hyperlink> | ||||||
| <div className="min-vh-100 d-flex align-items-center"> | ||||||
| <div className="large-screen-left-container mr-n4.5 large-yellow-line mt-5" /> | ||||||
| <div> | ||||||
| <h1 className="welcome-to-platform data-hj-suppress"> | ||||||
| {formatMessage(messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, fullName })} | ||||||
| </h1> | ||||||
| <h2 className="complete-your-profile"> | ||||||
| {formatMessage(messages['complete.your.profile.1'])} | ||||||
| <div className="text-accent-a"> | ||||||
| {formatMessage(messages['complete.your.profile.2'])} | ||||||
|
|
||||||
| {/* main hero content block, aligned like Figma */} | ||||||
| <div className="auth-hero-content d-flex flex-column"> | ||||||
| {/* row: [enterprise logo] [yellow slash] [Start learning with edX] */} | ||||||
| <div className="d-flex align-items-center"> | ||||||
| {enterpriseLogoUrl && ( | ||||||
| <div className="auth-hero-enterprise-logo-wrapper mr-4"> | ||||||
| <Image | ||||||
| alt={enterpriseName || 'Enterprise'} | ||||||
| src={enterpriseLogoUrl} | ||||||
| className="auth-hero-enterprise-logo" | ||||||
| /> | ||||||
| </div> | ||||||
| )} | ||||||
|
|
||||||
| <div className="auth-hero-slash mr-4" aria-hidden="true" /> | ||||||
|
|
||||||
| <div className="auth-hero-heading"> | ||||||
| <div | ||||||
| className={classNames( | ||||||
| 'auth-hero-heading-line text-white', | ||||||
| )} | ||||||
| > | ||||||
| {formatMessage(messages['start.learning'])} | ||||||
| </div> | ||||||
| </h2> | ||||||
| <div className="auth-hero-heading-line text-accent-a"> | ||||||
| {formatMessage(messages['with.edx'])} | ||||||
|
||||||
| {formatMessage(messages['with.edx'])} | |
| {formatMessage(messages['with.site.name'], { siteName })} |
Copilot
AI
Feb 20, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The hero heading is rendered using <div>s instead of semantic headings. Please consider restoring <h1>/<h2> (or adding proper heading roles) so assistive tech can interpret the page structure correctly.
Copilot
AI
Feb 20, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The use of dangerouslySetInnerHTML with enterpriseWelcomeHtml from backend data creates a Cross-Site Scripting (XSS) vulnerability. If the backend data is compromised or contains malicious content, it could execute arbitrary JavaScript in users' browsers. Consider using a sanitization library like DOMPurify to sanitize the HTML before rendering, or better yet, use a safer rendering approach that doesn't require raw HTML insertion.
Copilot
AI
Feb 19, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Security: Using dangerouslySetInnerHTML with enterpriseWelcomeHtml without sanitization can expose the application to XSS vulnerabilities. The HTML content comes from enterpriseBranding?.enterpriseBrandedWelcomeString or enterpriseBranding?.platformWelcomeString which appears to come from backend data. Ensure this content is properly sanitized on the backend, or use a sanitization library like DOMPurify on the frontend before rendering.
Copilot
AI
Feb 20, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using dangerouslySetInnerHTML without sanitization is a security risk. The enterpriseWelcomeHtml contains HTML from enterpriseBrandedWelcomeString or platformWelcomeString which could potentially include malicious scripts. Consider sanitizing the HTML content using a library like DOMPurify before rendering it.
Copilot
AI
Feb 20, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The column width has changed from col-md-2 to col-md-3, which alters the layout proportions. The left column is still col-md-10, so the total is now 13 columns instead of 12, which exceeds Bootstrap's 12-column grid system. This will cause layout issues. Either change the left column to col-md-9 or change the right column back to col-md-2 to maintain a valid 12-column grid.
| <div className="col-md-3 bg-white p-0"> | |
| <div className="col-md-2 bg-white p-0"> |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -1,40 +1,78 @@ | ||||||
| import React from 'react'; | ||||||
| import { useSelector } from 'react-redux'; | ||||||
|
|
||||||
| import { getConfig } from '@edx/frontend-platform'; | ||||||
| import { useIntl } from '@edx/frontend-platform/i18n'; | ||||||
| import { Hyperlink, Image } from '@openedx/paragon'; | ||||||
| import PropTypes from 'prop-types'; | ||||||
|
|
||||||
| import messages from './messages'; | ||||||
|
|
||||||
| const MediumLayout = ({ fullName }) => { | ||||||
| const MediumLayout = () => { | ||||||
|
||||||
| const { formatMessage } = useIntl(); | ||||||
|
|
||||||
| const enterpriseBranding = useSelector( | ||||||
| state => state.commonComponents?.thirdPartyAuthContext?.enterpriseBranding, | ||||||
| ); | ||||||
|
|
||||||
| const enterpriseLogoUrl = enterpriseBranding?.enterpriseLogoUrl || null; | ||||||
| const enterpriseName = enterpriseBranding?.enterpriseName || null; | ||||||
| const enterpriseWelcomeHtml = enterpriseBranding?.enterpriseBrandedWelcomeString | ||||||
| || enterpriseBranding?.platformWelcomeString | ||||||
| || ''; | ||||||
|
|
||||||
| const siteName = getConfig().SITE_NAME; | ||||||
| const baseLogoSrc = getConfig().LOGO_WHITE_URL || getConfig().LOGO_URL; | ||||||
|
|
||||||
| return ( | ||||||
| <> | ||||||
| <div className="w-100 medium-screen-top-stripe" /> | ||||||
| <div className="w-100 p-0 mb-3 d-flex"> | ||||||
| <div className="col-md-10 bg-light-200"> | ||||||
| <div className="col-md-10 bg-primary-400 auth-hero-left"> | ||||||
| <Hyperlink destination={getConfig().MARKETING_SITE_BASE_URL}> | ||||||
| <Image className="logo" alt={getConfig().SITE_NAME} src={getConfig().LOGO_URL} /> | ||||||
| <Image className="logo auth-hero-base-logo" alt={siteName} src={baseLogoSrc} /> | ||||||
| </Hyperlink> | ||||||
| <div className="d-flex align-items-center justify-content-center mb-4 ml-5"> | ||||||
| <div className="medium-yellow-line mt-5 mr-n2" /> | ||||||
| <div> | ||||||
| <h1 className="h3 data-hj-suppress mw-320"> | ||||||
| {formatMessage(messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, fullName })} | ||||||
| </h1> | ||||||
| <h2 className="display-1"> | ||||||
| {formatMessage(messages['complete.your.profile.1'])} | ||||||
| <div className="text-accent-a"> | ||||||
| {formatMessage(messages['complete.your.profile.2'])} | ||||||
|
|
||||||
| <div className="auth-hero-content d-flex flex-column"> | ||||||
| <div className="d-flex align-items-center"> | ||||||
| {enterpriseLogoUrl && ( | ||||||
| <div className="auth-hero-enterprise-logo-wrapper mr-4"> | ||||||
| <Image | ||||||
| alt={enterpriseName || 'Enterprise'} | ||||||
| src={enterpriseLogoUrl} | ||||||
| className="auth-hero-enterprise-logo" | ||||||
| /> | ||||||
| </div> | ||||||
| )} | ||||||
|
|
||||||
| <div className="auth-hero-slash" aria-hidden="true"> | ||||||
| <svg xmlns="http://www.w3.org/2000/svg" width="191" height="250" viewBox="0 0 191 250" fill="none" style={{ width: '100%', height: '100%' }}> | ||||||
|
||||||
| <svg xmlns="http://www.w3.org/2000/svg" width="191" height="250" viewBox="0 0 191 250" fill="none" style={{ width: '100%', height: '100%' }}> | |
| <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 191 250" fill="none"> |
Copilot
AI
Feb 20, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This hero heading uses <div> elements rather than semantic headings. For accessibility and SEO, consider using <h1>/<h2> (or role="heading" with aria-level) so screen readers can correctly navigate the page structure.
Copilot
AI
Feb 19, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Security: Using dangerouslySetInnerHTML with enterpriseWelcomeHtml without sanitization can expose the application to XSS vulnerabilities. The HTML content comes from enterpriseBranding?.enterpriseBrandedWelcomeString or enterpriseBranding?.platformWelcomeString which appears to come from backend data. Ensure this content is properly sanitized on the backend, or use a sanitization library like DOMPurify on the frontend before rendering.
Copilot
AI
Feb 20, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using dangerouslySetInnerHTML without sanitization is a security risk. The enterpriseWelcomeHtml contains HTML from enterpriseBrandedWelcomeString or platformWelcomeString which could potentially include malicious scripts. Consider sanitizing the HTML content using a library like DOMPurify before rendering it.
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,41 +1,76 @@ | ||||||||||||||||||||
| import React from 'react'; | ||||||||||||||||||||
| import { useSelector } from 'react-redux'; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| import { getConfig } from '@edx/frontend-platform'; | ||||||||||||||||||||
| import { useIntl } from '@edx/frontend-platform/i18n'; | ||||||||||||||||||||
| import { Hyperlink, Image } from '@openedx/paragon'; | ||||||||||||||||||||
| import PropTypes from 'prop-types'; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| import messages from './messages'; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| const SmallLayout = ({ fullName }) => { | ||||||||||||||||||||
| const SmallLayout = () => { | ||||||||||||||||||||
|
||||||||||||||||||||
| const { formatMessage } = useIntl(); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| const enterpriseBranding = useSelector( | ||||||||||||||||||||
| state => state.commonComponents?.thirdPartyAuthContext?.enterpriseBranding, | ||||||||||||||||||||
| ); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| const enterpriseLogoUrl = enterpriseBranding?.enterpriseLogoUrl || null; | ||||||||||||||||||||
| const enterpriseName = enterpriseBranding?.enterpriseName || null; | ||||||||||||||||||||
| const enterpriseWelcomeHtml = enterpriseBranding?.enterpriseBrandedWelcomeString | ||||||||||||||||||||
| || enterpriseBranding?.platformWelcomeString | ||||||||||||||||||||
| || ''; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| const siteName = getConfig().SITE_NAME; | ||||||||||||||||||||
| const baseLogoSrc = getConfig().LOGO_WHITE_URL || getConfig().LOGO_URL; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| return ( | ||||||||||||||||||||
| <div className="min-vw-100 bg-light-200"> | ||||||||||||||||||||
| <div className="min-vw-100 bg-primary-400 auth-hero-left"> | ||||||||||||||||||||
| <div className="col-md-12 small-screen-top-stripe" /> | ||||||||||||||||||||
| <Hyperlink destination={getConfig().MARKETING_SITE_BASE_URL}> | ||||||||||||||||||||
| <Image className="logo-small" alt={getConfig().SITE_NAME} src={getConfig().LOGO_URL} /> | ||||||||||||||||||||
| <Image className="logo-small auth-hero-base-logo" alt={siteName} src={baseLogoSrc} /> | ||||||||||||||||||||
| </Hyperlink> | ||||||||||||||||||||
| <div className="d-flex align-items-center m-3.5"> | ||||||||||||||||||||
| <div className="small-yellow-line mt-4.5" /> | ||||||||||||||||||||
| <div> | ||||||||||||||||||||
| <h1 className="h5 data-hj-suppress"> | ||||||||||||||||||||
| {formatMessage(messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, fullName })} | ||||||||||||||||||||
| </h1> | ||||||||||||||||||||
| <h2 className="h1"> | ||||||||||||||||||||
| {formatMessage(messages['complete.your.profile.1'])} | ||||||||||||||||||||
| <div className="text-accent-a"> | ||||||||||||||||||||
| {formatMessage(messages['complete.your.profile.2'])} | ||||||||||||||||||||
|
|
||||||||||||||||||||
| <div className="auth-hero-content d-flex flex-column"> | ||||||||||||||||||||
| <div className="d-flex align-items-center"> | ||||||||||||||||||||
| {enterpriseLogoUrl && ( | ||||||||||||||||||||
| <div className="auth-hero-enterprise-logo-wrapper mr-3"> | ||||||||||||||||||||
| <Image | ||||||||||||||||||||
| alt={enterpriseName || 'Enterprise'} | ||||||||||||||||||||
| src={enterpriseLogoUrl} | ||||||||||||||||||||
| className="auth-hero-enterprise-logo" | ||||||||||||||||||||
| /> | ||||||||||||||||||||
| </div> | ||||||||||||||||||||
| )} | ||||||||||||||||||||
|
|
||||||||||||||||||||
| <div className="auth-hero-slash" aria-hidden="true"> | ||||||||||||||||||||
| <svg xmlns="http://www.w3.org/2000/svg" width="191" height="250" viewBox="0 0 191 250" fill="none" style={{ width: '100%', height: '100%' }}> | ||||||||||||||||||||
|
||||||||||||||||||||
| <svg xmlns="http://www.w3.org/2000/svg" width="191" height="250" viewBox="0 0 191 250" fill="none" style={{ width: '100%', height: '100%' }}> | |
| <svg | |
| xmlns="http://www.w3.org/2000/svg" | |
| width="191" | |
| height="250" | |
| viewBox="0 0 191 250" | |
| fill="none" | |
| className="w-100 h-100" | |
| > |
Copilot
AI
Feb 20, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The auth-hero-slash div has specific styling (width: 0, height: 110px, border-left: 6px) but contains an inline SVG with viewBox and percentage-based dimensions that override the container. This creates confusion about which approach is being used. Either use the border-based approach (removing the SVG) or use the SVG approach (removing the border/width/height styles). The current implementation mixes both approaches inconsistently.
| <div className="auth-hero-slash" aria-hidden="true"> | |
| <svg xmlns="http://www.w3.org/2000/svg" width="191" height="250" viewBox="0 0 191 250" fill="none" style={{ width: '100%', height: '100%' }}> | |
| <line x1="69.8107" y1="33.833" x2="32.9503" y2="206.952" stroke="#F0CC00" strokeWidth="8" /> | |
| </svg> | |
| </div> | |
| <div className="auth-hero-slash" aria-hidden="true" /> |
Copilot
AI
Feb 20, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The hero heading is now built with <div> elements instead of semantic heading tags (<h1>, <h2>, etc.). This reduces document structure information for screen readers; consider using appropriate heading elements (and styling them) to preserve accessibility semantics.
Copilot
AI
Feb 19, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Security: Using dangerouslySetInnerHTML with enterpriseWelcomeHtml without sanitization can expose the application to XSS vulnerabilities. The HTML content comes from enterpriseBranding?.enterpriseBrandedWelcomeString or enterpriseBranding?.platformWelcomeString which appears to come from backend data. Ensure this content is properly sanitized on the backend, or use a sanitization library like DOMPurify on the frontend before rendering.
Copilot
AI
Feb 20, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using dangerouslySetInnerHTML without sanitization is a security risk. The enterpriseWelcomeHtml contains HTML from enterpriseBrandedWelcomeString or platformWelcomeString which could potentially include malicious scripts. Consider sanitizing the HTML content using a library like DOMPurify before rendering it.
Copilot
AI
Feb 20, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The SmallLayout, MediumLayout, and LargeLayout components no longer accept the fullName prop, but the BaseContainer still passes it (lines 22, 25, 28, 31, 45, 48, 51 of base-container/index.jsx). While React will ignore extra props, this creates confusion and technical debt. Update the BaseContainer to stop passing the fullName prop to these layout components since they no longer use it.
| Original file line number | Diff line number | Diff line change | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -6,6 +6,20 @@ const messages = defineMessages({ | |||||||||||
| defaultMessage: 'Welcome to {siteName}, {fullName}!', | ||||||||||||
| description: 'Welcome message that appears on progressive profile page', | ||||||||||||
| }, | ||||||||||||
| 'start.learning': { | ||||||||||||
| id: 'start.learning', | ||||||||||||
| defaultMessage: 'Start learning', | ||||||||||||
| description: 'Header text for logistration MFE pages', | ||||||||||||
| }, | ||||||||||||
| 'with.site.name': { | ||||||||||||
| id: 'with.site.name', | ||||||||||||
| defaultMessage: 'with {siteName}', | ||||||||||||
| description: 'Header text with site name for logistration MFE pages', | ||||||||||||
| }, | ||||||||||||
| 'with.edx': { | ||||||||||||
| id: 'with.edx', | ||||||||||||
| defaultMessage: ' with edX', | ||||||||||||
|
||||||||||||
| defaultMessage: ' with edX', | |
| defaultMessage: ' with edX', | |
| description: 'Second line of header text with edX branding for logistration MFE pages', |
Copilot
AI
Feb 20, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
defaultMessage for with.edx includes a leading space (' with edX'). Since this string is rendered on its own line in LargeLayout, the leading space will be visible and may affect alignment; consider removing the leading space.
| defaultMessage: ' with edX', | |
| defaultMessage: 'with edX', |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -18,6 +18,7 @@ export const defaultState = { | |
| pipelineUserDetails: null, | ||
| errorMessage: null, | ||
| welcomePageRedirectUrl: null, | ||
| enterpriseBranding: null, | ||
| }, | ||
| }; | ||
|
|
||
|
|
@@ -28,16 +29,18 @@ const reducer = (state = defaultState, action = {}) => { | |
| ...state, | ||
| thirdPartyAuthApiStatus: PENDING_STATE, | ||
| }; | ||
| case THIRD_PARTY_AUTH_CONTEXT.SUCCESS: { | ||
| case THIRD_PARTY_AUTH_CONTEXT.SUCCESS: | ||
| return { | ||
| ...state, | ||
| fieldDescriptions: action.payload.fieldDescriptions?.fields, | ||
| optionalFields: action.payload.optionalFields, | ||
| thirdPartyAuthContext: action.payload.thirdPartyAuthContext, | ||
| thirdPartyAuthContext: { | ||
|
Comment on lines
33
to
+37
|
||
| ...action.payload.thirdPartyAuthContext, | ||
| enterpriseBranding: action.payload.thirdPartyAuthContext.enterpriseBranding || null, | ||
| }, | ||
| thirdPartyAuthApiStatus: COMPLETE_STATE, | ||
| countriesCodesList: action.payload.countriesCodesList, | ||
| }; | ||
| } | ||
|
|
||
| case THIRD_PARTY_AUTH_CONTEXT.FAILURE: | ||
| return { | ||
| ...state, | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -9,6 +9,7 @@ export const RECOMMENDATIONS = '/recommendations'; | |||||
| export const PASSWORD_RESET_CONFIRM = '/password_reset_confirm/:token/'; | ||||||
| export const PAGE_NOT_FOUND = '/notfound'; | ||||||
| export const ENTERPRISE_LOGIN_URL = '/enterprise/login'; | ||||||
| export const APP_NAME = 'authn'; | ||||||
|
||||||
| export const APP_NAME = 'authn'; | |
| export const APP_NAME = 'authn_mfe'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The BaseContainer component passes a
fullNameprop to the layout components, but this component has been refactored to no longer accept this prop. This will generate React PropTypes warnings in development and the fullName is never used. Either update BaseContainer to not pass fullName to these components, or add PropTypes validation to handle it gracefully.