@@ -12,23 +12,49 @@ import { Formik } from "formik";
12
12
import PropTypes from "prop-types" ;
13
13
import React , { useState } from "react" ;
14
14
import { TextAreaField } from "react-invenio-forms" ;
15
- import { Button , Form , Modal } from "semantic-ui-react" ;
15
+ import { Button , Form , Grid , Message , Modal } from "semantic-ui-react" ;
16
+
17
+ import { CommunityMembershipRequestsApi } from "../../api/membershipRequests/api" ;
18
+ import { communityErrorSerializer } from "../../api/serializers" ;
19
+ import { RequestLinksExtractor } from "../../api/RequestLinksExtractor" ;
16
20
17
21
export function RequestMembershipModal ( props ) {
18
- const { isOpen, onClose } = props ;
22
+ const [ errorMsg , setErrorMsg ] = useState ( "" ) ;
23
+
24
+ const { community, isOpen, onClose } = props ;
19
25
20
26
const onSubmit = async ( values , { setSubmitting, setFieldError } ) => {
21
- // TODO: implement me
22
- console . log ( "RequestMembershipModal.onSubmit(args) called" ) ;
23
- console . log ( "TODO: implement me" , arguments ) ;
24
- } ;
27
+ /**Submit callback called from Formik. */
28
+ setSubmitting ( true ) ;
29
+
30
+ const client = new CommunityMembershipRequestsApi ( community ) ;
31
+
32
+ try {
33
+ const response = await client . requestMembership ( values ) ;
34
+ const linksExtractor = new RequestLinksExtractor ( response . data ) ;
35
+ window . location . href = linksExtractor . userDiscussionUrl ;
36
+ } catch ( error ) {
37
+ setSubmitting ( false ) ;
38
+
39
+ console . log ( "Error" ) ;
40
+ console . dir ( error ) ;
25
41
26
- let confirmed = true ;
42
+ const { errors, message } = communityErrorSerializer ( error ) ;
43
+
44
+ if ( message ) {
45
+ setErrorMsg ( message ) ;
46
+ }
47
+
48
+ if ( errors ) {
49
+ errors . forEach ( ( { field, messages } ) => setFieldError ( field , messages [ 0 ] ) ) ;
50
+ }
51
+ }
52
+ } ;
27
53
28
54
return (
29
55
< Formik
30
56
initialValues = { {
31
- requestMembershipComment : "" ,
57
+ message : "" ,
32
58
} }
33
59
onSubmit = { onSubmit }
34
60
>
@@ -42,9 +68,17 @@ export function RequestMembershipModal(props) {
42
68
>
43
69
< Modal . Header > { i18next . t ( "Request Membership" ) } </ Modal . Header >
44
70
< Modal . Content >
71
+ < Message hidden = { errorMsg === "" } negative className = "flashed" >
72
+ < Grid container >
73
+ < Grid . Column mobile = { 16 } tablet = { 12 } computer = { 8 } textAlign = "left" >
74
+ < strong > { errorMsg } </ strong >
75
+ </ Grid . Column >
76
+ </ Grid >
77
+ </ Message >
78
+
45
79
< Form >
46
80
< TextAreaField
47
- fieldPath = "requestMembershipComment "
81
+ fieldPath = "message "
48
82
label = { i18next . t ( "Message to managers (optional)" ) }
49
83
/>
50
84
</ Form >
@@ -54,12 +88,12 @@ export function RequestMembershipModal(props) {
54
88
{ i18next . t ( "Cancel" ) }
55
89
</ Button >
56
90
< Button
57
- onClick = { ( event ) => {
58
- // TODO: Implement me
59
- console . log ( "RequestMembershipModal button clicked." ) ;
60
- } }
61
- positive = { confirmed }
91
+ disabled = { isSubmitting }
92
+ loading = { isSubmitting }
93
+ onClick = { handleSubmit }
94
+ positive
62
95
primary
96
+ type = "button"
63
97
>
64
98
{ i18next . t ( "Request Membership" ) }
65
99
</ Button >
@@ -73,10 +107,12 @@ export function RequestMembershipModal(props) {
73
107
RequestMembershipModal . propTypes = {
74
108
isOpen : PropTypes . bool . isRequired ,
75
109
onClose : PropTypes . func . isRequired ,
110
+ community : PropTypes . object . isRequired ,
76
111
} ;
77
112
78
113
export function RequestMembershipButton ( props ) {
79
114
const [ isModalOpen , setModalOpen ] = useState ( false ) ;
115
+ const { community } = props ;
80
116
81
117
const handleClick = ( ) => {
82
118
setModalOpen ( true ) ;
@@ -97,8 +133,16 @@ export function RequestMembershipButton(props) {
97
133
content = { i18next . t ( "Request Membership" ) }
98
134
/>
99
135
{ isModalOpen && (
100
- < RequestMembershipModal isOpen = { isModalOpen } onClose = { handleClose } />
136
+ < RequestMembershipModal
137
+ isOpen = { isModalOpen }
138
+ onClose = { handleClose }
139
+ community = { community }
140
+ />
101
141
) }
102
142
</ >
103
143
) ;
104
144
}
145
+
146
+ RequestMembershipButton . propTypes = {
147
+ community : PropTypes . object . isRequired ,
148
+ } ;
0 commit comments