11/* eslint-disable react/prop-types */
22import { useIntl } from '@edx/frontend-platform/i18n' ;
3- import { Button , Icon } from '@openedx/paragon' ;
3+ import {
4+ Button , Icon , OverlayTrigger , Tooltip ,
5+ } from '@openedx/paragon' ;
46import {
57 CallSplit , LinkOff , Newsstand , Sync ,
68} from '@openedx/paragon/icons' ;
79
10+ import { BoldText } from '@src/utils' ;
11+ import { ReactNode } from 'react' ;
812import messages from './messages' ;
913
1014export interface UpstreamInfoIconProps {
1115 upstreamInfo ?: {
1216 errorMessage ?: string | null ;
1317 upstreamRef ?: string | null ;
18+ upstreamName : string ;
1419 readyToSync : boolean ;
1520 downstreamCustomized : string [ ] ;
1621 } ;
@@ -23,54 +28,81 @@ const UpstreamInfoIconContent = ({
2328} : UpstreamInfoIconProps ) => {
2429 const intl = useIntl ( ) ;
2530
31+ if ( ! upstreamInfo ) {
32+ return null ;
33+ }
34+
2635 let hasTwoIcons = false ;
27- const hasCourseOverrides = ( upstreamInfo ?. downstreamCustomized . length || 0 ) > 0 ;
28- if ( upstreamInfo ?. errorMessage || upstreamInfo ?. readyToSync || hasCourseOverrides ) {
36+ let secondIconProps = { } ;
37+ let tooltipMessage : string | ReactNode = intl . formatMessage (
38+ messages . upstreamLinkTooltip ,
39+ {
40+ upstreamName : upstreamInfo . upstreamName ,
41+ b : BoldText ,
42+ } ,
43+ ) ;
44+
45+ if ( upstreamInfo . errorMessage ) {
46+ hasTwoIcons = true ;
47+ tooltipMessage = intl . formatMessage ( messages . upstreamLinkError ) ;
48+ secondIconProps = {
49+ title : intl . formatMessage ( messages . upstreamLinkError ) ,
50+ ariaLabel : intl . formatMessage ( messages . upstreamLinkError ) ,
51+ src : LinkOff ,
52+ } ;
53+ } else if ( upstreamInfo . readyToSync ) {
2954 hasTwoIcons = true ;
55+ tooltipMessage = intl . formatMessage (
56+ messages . upstreamLinkReadyToSyncTooltip ,
57+ {
58+ upstreamName : upstreamInfo . upstreamName ,
59+ b : BoldText ,
60+ } ,
61+ ) ;
62+ secondIconProps = {
63+ title : intl . formatMessage ( messages . upstreamLinkReadyToSyncAriaLabel ) ,
64+ ariaLabel : intl . formatMessage ( messages . upstreamLinkReadyToSyncAriaLabel ) ,
65+ src : Sync ,
66+ } ;
67+ } else if ( ( upstreamInfo . downstreamCustomized . length || 0 ) > 0 ) {
68+ hasTwoIcons = true ;
69+ tooltipMessage = intl . formatMessage ( messages . upstreamLinkOverridesAriaLabel ) ;
70+ secondIconProps = {
71+ title : intl . formatMessage ( messages . upstreamLinkOverridesAriaLabel ) ,
72+ ariaLabel : intl . formatMessage ( messages . upstreamLinkOverridesAriaLabel ) ,
73+ src : CallSplit ,
74+ } ;
3075 }
3176
32- const getSecondIconProps = ( ) => {
33- if ( upstreamInfo ?. errorMessage ) {
34- return {
35- title : intl . formatMessage ( messages . upstreamLinkError ) ,
36- ariaLabel : intl . formatMessage ( messages . upstreamLinkError ) ,
37- src : LinkOff ,
38- } ;
39- } if ( upstreamInfo ?. readyToSync ) {
40- return {
41- title : intl . formatMessage ( messages . upstreamLinkReadyToSyncAriaLabel ) ,
42- ariaLabel : intl . formatMessage ( messages . upstreamLinkReadyToSyncAriaLabel ) ,
43- src : Sync ,
44- } ;
45- } if ( hasCourseOverrides ) {
46- return {
47- title : intl . formatMessage ( messages . upstreamLinkOverridesAriaLabel ) ,
48- ariaLabel : intl . formatMessage ( messages . upstreamLinkOverridesAriaLabel ) ,
49- src : CallSplit ,
50- } ;
51- }
52- return { } ;
53- } ;
54-
5577 return (
56- < div
57- className = {
58- `upstream-info-icon size-${ hasTwoIcons ? 'two' : 'one' } -${ size } box-shadow-centered-1 d-flex justify-content-center`
59- }
78+ < OverlayTrigger
79+ key = { `upstream-icon-${ upstreamInfo . upstreamRef } ` }
80+ placement = "top"
81+ overlay = { (
82+ < Tooltip id = { `upstream-icon-tooltip-${ upstreamInfo . upstreamRef } ` } >
83+ { tooltipMessage }
84+ </ Tooltip >
85+ ) }
6086 >
61- < Icon
62- title = { intl . formatMessage ( messages . upstreamLinkOk ) }
63- aria-label = { intl . formatMessage ( messages . upstreamLinkOk ) }
64- src = { Newsstand }
65- size = { size }
66- />
67- { hasTwoIcons && (
87+ < div
88+ className = {
89+ `upstream-info-icon size-${ hasTwoIcons ? 'two' : 'one' } -${ size } box-shadow-centered-1 d-flex justify-content-center`
90+ }
91+ >
6892 < Icon
93+ title = { intl . formatMessage ( messages . upstreamLinkOk ) }
94+ aria-label = { intl . formatMessage ( messages . upstreamLinkOk ) }
95+ src = { Newsstand }
6996 size = { size }
70- { ...getSecondIconProps ( ) }
7197 />
72- ) }
73- </ div >
98+ { hasTwoIcons && (
99+ < Icon
100+ size = { size }
101+ { ...secondIconProps }
102+ />
103+ ) }
104+ </ div >
105+ </ OverlayTrigger >
74106 ) ;
75107} ;
76108
0 commit comments