@@ -12,6 +12,7 @@ import LoadingIndicator from 'lib/components/core/LoadingIndicator';
1212import toast from 'lib/hooks/toast' ;
1313
1414import MarketplaceAllowlistRuleForm from '../components/forms/MarketplaceAllowlistRuleForm' ;
15+ import MarketplaceAllowlistModeBanner from '../components/MarketplaceAllowlistModeBanner' ;
1516import MarketplaceAllowlistTable from '../components/tables/MarketplaceAllowlistTable' ;
1617
1718type Props = WrappedComponentProps ;
@@ -45,21 +46,43 @@ const translations = defineMessages({
4546 id : 'system.admin.admin.MarketplaceAllowlistIndex.deleteFailure' ,
4647 defaultMessage : 'Failed to remove access rule.' ,
4748 } ,
49+ openSuccess : {
50+ id : 'system.admin.admin.MarketplaceAllowlistIndex.openSuccess' ,
51+ defaultMessage : 'Marketplace opened to all course managers.' ,
52+ } ,
53+ openFailure : {
54+ id : 'system.admin.admin.MarketplaceAllowlistIndex.openFailure' ,
55+ defaultMessage : 'Failed to open the marketplace to everyone.' ,
56+ } ,
57+ restrictSuccess : {
58+ id : 'system.admin.admin.MarketplaceAllowlistIndex.restrictSuccess' ,
59+ defaultMessage : 'Marketplace restricted to the scoped rules.' ,
60+ } ,
61+ restrictFailure : {
62+ id : 'system.admin.admin.MarketplaceAllowlistIndex.restrictFailure' ,
63+ defaultMessage : 'Failed to restrict the marketplace.' ,
64+ } ,
4865} ) ;
4966
5067const MarketplaceAllowlistIndex : FC < Props > = ( { intl } ) => {
5168 const [ isLoading , setIsLoading ] = useState ( true ) ;
5269 const [ isFormOpen , setIsFormOpen ] = useState ( false ) ;
5370 const [ rules , setRules ] = useState < AllowlistRuleData [ ] > ( [ ] ) ;
71+ const [ everyoneRuleId , setEveryoneRuleId ] = useState < number | null > ( null ) ;
5472
5573 useEffect ( ( ) => {
5674 SystemAPI . admin
5775 . indexMarketplaceAllowlistRules ( )
58- . then ( ( response ) => setRules ( response . data . rules ) )
76+ . then ( ( response ) => {
77+ setRules ( response . data . rules ) ;
78+ setEveryoneRuleId ( response . data . everyoneRuleId ?? null ) ;
79+ } )
5980 . catch ( ( ) => toast . error ( intl . formatMessage ( translations . fetchFailure ) ) )
6081 . finally ( ( ) => setIsLoading ( false ) ) ;
6182 } , [ ] ) ;
6283
84+ const openToEveryone = everyoneRuleId !== null ;
85+
6386 const handleCreate = async ( data : AllowlistRuleFormData ) : Promise < void > => {
6487 try {
6588 const response =
@@ -82,20 +105,52 @@ const MarketplaceAllowlistIndex: FC<Props> = ({ intl }) => {
82105 }
83106 } ;
84107
108+ const handleOpenToEveryone = async ( ) : Promise < void > => {
109+ try {
110+ const response = await SystemAPI . admin . openMarketplaceToEveryone ( ) ;
111+ setEveryoneRuleId ( response . data . id ) ;
112+ toast . success ( intl . formatMessage ( translations . openSuccess ) ) ;
113+ } catch {
114+ toast . error ( intl . formatMessage ( translations . openFailure ) ) ;
115+ }
116+ } ;
117+
118+ const handleRestrict = async ( ) : Promise < void > => {
119+ if ( everyoneRuleId === null ) return ;
120+ try {
121+ await SystemAPI . admin . deleteMarketplaceAllowlistRule ( everyoneRuleId ) ;
122+ setEveryoneRuleId ( null ) ;
123+ toast . success ( intl . formatMessage ( translations . restrictSuccess ) ) ;
124+ } catch {
125+ toast . error ( intl . formatMessage ( translations . restrictFailure ) ) ;
126+ }
127+ } ;
128+
85129 if ( isLoading ) return < LoadingIndicator /> ;
86130
87131 return (
88132 < Page title = { intl . formatMessage ( translations . header ) } >
89133 < AddButton
90134 className = "float-right"
135+ disabled = { openToEveryone }
91136 fixed
92137 id = "add-allowlist-rule-button"
93138 onClick = { ( ) : void => setIsFormOpen ( true ) }
94139 >
95140 { intl . formatMessage ( translations . addRule ) }
96141 </ AddButton >
97142
98- < MarketplaceAllowlistTable onDelete = { handleDelete } rules = { rules } />
143+ < MarketplaceAllowlistModeBanner
144+ onOpenToEveryone = { handleOpenToEveryone }
145+ onRestrict = { handleRestrict }
146+ openToEveryone = { openToEveryone }
147+ />
148+
149+ < MarketplaceAllowlistTable
150+ disabled = { openToEveryone }
151+ onDelete = { handleDelete }
152+ rules = { rules }
153+ />
99154
100155 < MarketplaceAllowlistRuleForm
101156 onClose = { ( ) : void => setIsFormOpen ( false ) }
0 commit comments