@@ -116,7 +145,7 @@ class InteractionModal extends React.PureComponent {
diff --git a/app/javascript/mastodon/features/ui/components/modal_root.js b/app/javascript/mastodon/features/ui/components/modal_root.js
index 2224a8207..484ebbd8b 100644
--- a/app/javascript/mastodon/features/ui/components/modal_root.js
+++ b/app/javascript/mastodon/features/ui/components/modal_root.js
@@ -23,6 +23,7 @@ import {
FilterModal,
InteractionModal,
SubscribedLanguagesModal,
+ ClosedRegistrationsModal,
} from 'mastodon/features/ui/util/async-components';
import { Helmet } from 'react-helmet';
@@ -44,6 +45,7 @@ const MODAL_COMPONENTS = {
'FILTER': FilterModal,
'SUBSCRIBED_LANGUAGES': SubscribedLanguagesModal,
'INTERACTION': InteractionModal,
+ 'CLOSED_REGISTRATIONS': ClosedRegistrationsModal,
};
export default class ModalRoot extends React.PureComponent {
diff --git a/app/javascript/mastodon/features/ui/components/sign_in_banner.js b/app/javascript/mastodon/features/ui/components/sign_in_banner.js
index 5ff4ee2a8..8bd32edf9 100644
--- a/app/javascript/mastodon/features/ui/components/sign_in_banner.js
+++ b/app/javascript/mastodon/features/ui/components/sign_in_banner.js
@@ -1,13 +1,40 @@
-import React from 'react';
+import React, { useCallback } from 'react';
import { FormattedMessage } from 'react-intl';
+import { useDispatch } from 'react-redux';
import { registrationsOpen } from 'mastodon/initial_state';
+import { openModal } from 'mastodon/actions/modal';
-const SignInBanner = () => (
-
-);
+const SignInBanner = () => {
+ const dispatch = useDispatch();
+
+ const openClosedRegistrationsModal = useCallback(
+ () => dispatch(openModal('CLOSED_REGISTRATIONS')),
+ [dispatch],
+ );
+
+ let signupButton;
+
+ if (registrationsOpen) {
+ signupButton = (
+
+
+
+ );
+ } else {
+ signupButton = (
+
+ );
+ }
+
+ return (
+
+ );
+};
export default SignInBanner;
diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js
index 7686a69ea..6046578de 100644
--- a/app/javascript/mastodon/features/ui/util/async-components.js
+++ b/app/javascript/mastodon/features/ui/util/async-components.js
@@ -174,6 +174,10 @@ export function SubscribedLanguagesModal () {
return import(/*webpackChunkName: "modals/subscribed_languages_modal" */'../../subscribed_languages_modal');
}
+export function ClosedRegistrationsModal () {
+ return import(/*webpackChunkName: "modals/closed_registrations_modal" */'../../closed_registrations_modal');
+}
+
export function About () {
return import(/*webpackChunkName: "features/about" */'../../about');
}
diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb
index 606e7d831..2a4da8c3b 100644
--- a/app/serializers/rest/instance_serializer.rb
+++ b/app/serializers/rest/instance_serializer.rb
@@ -81,8 +81,15 @@ class REST::InstanceSerializer < ActiveModel::Serializer
def registrations
{
- enabled: Setting.registrations_mode != 'none' && !Rails.configuration.x.single_user_mode,
+ enabled: registrations_enabled?,
approval_required: Setting.registrations_mode == 'approved',
+ closed_registrations_message: registrations_enabled? ? nil : Setting.closed_registrations_message,
}
end
+
+ private
+
+ def registrations_enabled?
+ Setting.registrations_mode != 'none' && !Rails.configuration.x.single_user_mode
+ end
end