1
- import React , { useEffect } from 'react' ;
2
- import { Modal , Card , Row , Col , Typography , Divider } from 'antd' ;
3
- import { CustomerServiceOutlined , CloudServerOutlined } from '@ant-design/icons' ;
4
- import { useSelector , useDispatch } from 'react-redux' ;
5
- import { getDeploymentId } from 'redux/selectors/configSelectors' ;
6
- import { fetchDeploymentIdAction } from 'redux/reduxActions/configActions' ;
7
- import { Environment } from '../types/environment.types' ;
8
-
9
- const { Title, Text } = Typography ;
10
-
11
- interface ContactLowcoderModalProps {
12
- visible : boolean ;
13
- onClose : ( ) => void ;
14
- environment : Environment ;
15
- }
16
-
17
- /**
18
- * Professional modal for contacting Lowcoder team with HubSpot form integration
19
- */
20
- const ContactLowcoderModal : React . FC < ContactLowcoderModalProps > = ( {
21
- visible,
22
- onClose,
23
- environment
24
- } ) => {
25
- // Get deploymentId from Redux config provider
26
- const deploymentId = useSelector ( getDeploymentId ) ;
27
- const dispatch = useDispatch ( ) ;
28
-
29
- // Fetch deployment ID when modal opens if not already available
30
- useEffect ( ( ) => {
31
- if ( visible && ! deploymentId ) {
32
- dispatch ( fetchDeploymentIdAction ( ) ) ;
33
- }
34
- } , [ visible , deploymentId , dispatch ] ) ;
35
-
36
- return (
37
- < Modal
38
- title = {
39
- < div style = { { display : 'flex' , alignItems : 'center' , gap : '12px' } } >
40
- < CustomerServiceOutlined style = { { fontSize : '20px' , color : '#1890ff' } } />
41
- < span style = { { fontSize : '18px' , fontWeight : 600 } } > Contact Lowcoder Team</ span >
42
- </ div >
43
- }
44
- open = { visible }
45
- onCancel = { onClose }
46
- footer = { null }
47
- width = { 800 }
48
- centered
49
- style = { { top : 20 } }
50
- bodyStyle = { { padding : '24px' } }
51
- >
52
- { /* Environment Context Section */ }
53
- < Card
54
- style = { {
55
- marginBottom : '24px' ,
56
- borderRadius : '8px' ,
57
- background : '#fafafa' ,
58
- border : '1px solid #f0f0f0'
59
- } }
60
- bodyStyle = { { padding : '16px' } }
61
- >
62
- < Row gutter = { [ 16 , 8 ] } align = "middle" >
63
- < Col >
64
- < CloudServerOutlined style = { { fontSize : '24px' , color : '#1890ff' } } />
65
- </ Col >
66
- < Col flex = { 1 } >
67
- < div >
68
- < Text strong style = { { fontSize : '16px' , color : '#262626' } } >
69
- Environment: { environment . environmentName || 'Unnamed Environment' }
70
- </ Text >
71
- < br />
72
- < Text style = { { fontSize : '14px' , color : '#8c8c8c' , fontFamily : 'monospace' } } >
73
- Environment ID: { environment . environmentId }
74
- </ Text >
75
- < br />
76
- < Text style = { { fontSize : '14px' , color : '#8c8c8c' , fontFamily : 'monospace' } } >
77
- Deployment ID: { deploymentId || 'Loading...' }
78
- </ Text >
79
- </ div >
80
- </ Col >
81
- </ Row >
82
- </ Card >
83
-
84
- < Divider style = { { margin : '16px 0' } } />
85
-
86
- { /* HubSpot Form Integration Section */ }
87
- < div style = { { minHeight : '400px' , padding : '20px 0' } } >
88
- < Title level = { 4 } style = { { textAlign : 'center' , marginBottom : '24px' , color : '#262626' } } >
89
- Get in Touch
90
- </ Title >
91
-
92
- < Text style = { {
93
- textAlign : 'center' ,
94
- display : 'block' ,
95
- marginBottom : '32px' ,
96
- fontSize : '16px' ,
97
- color : '#595959' ,
98
- lineHeight : '1.6'
99
- } } >
100
- Our team is here to help you resolve licensing issues and get your environment up and running.
101
- </ Text >
102
-
103
- { /* HubSpot Form Container */ }
104
- < div style = { {
105
- minHeight : '300px' ,
106
- display : 'flex' ,
107
- alignItems : 'center' ,
108
- justifyContent : 'center' ,
109
- background : '#fdfdfd' ,
110
- borderRadius : '8px' ,
111
- border : '1px solid #f0f0f0'
112
- } } >
113
- { /* HubSpot form will be integrated here */ }
114
- < div style = { {
115
- textAlign : 'center' ,
116
- color : '#8c8c8c' ,
117
- fontSize : '14px'
118
- } } >
119
- < CustomerServiceOutlined style = { { fontSize : '48px' , marginBottom : '16px' , color : '#d9d9d9' } } />
120
- < div > Contact form will be integrated here</ div >
121
- </ div >
122
- </ div >
123
-
124
- { /* Environment data is available for form pre-filling */ }
125
- { /* Data available: environment.environmentName, environment.environmentId, deploymentId,
126
- environment.licenseStatus, environment.environmentType, environment.licenseError */ }
127
- </ div >
128
- </ Modal >
129
- ) ;
130
- } ;
131
-
1
+ import React , { useState , useEffect } from 'react' ;
2
+ import { Modal , Card , Row , Col , Typography , Divider , Spin , Alert } from 'antd' ;
3
+ import { CustomerServiceOutlined , CloudServerOutlined } from '@ant-design/icons' ;
4
+ import { Environment } from '../types/environment.types' ;
5
+ import { getEnvironmentDeploymentId } from '../services/environments.service' ;
6
+ import { HubspotModal } from '../../hubspotModal' ;
7
+
8
+ const { Title, Text } = Typography ;
9
+
10
+ interface ContactLowcoderModalProps {
11
+ visible : boolean ;
12
+ onClose : ( ) => void ;
13
+ environment : Environment ;
14
+ }
15
+
16
+ /**
17
+ * Professional modal for contacting Lowcoder team with HubSpot form integration
18
+ */
19
+ const ContactLowcoderModal : React . FC < ContactLowcoderModalProps > = ( {
20
+ visible,
21
+ onClose,
22
+ environment
23
+ } ) => {
24
+ const [ deploymentId , setDeploymentId ] = useState < string | null > ( null ) ;
25
+ const [ isLoading , setIsLoading ] = useState ( false ) ;
26
+ const [ error , setError ] = useState < string | null > ( null ) ;
27
+ const [ showHubspotModal , setShowHubspotModal ] = useState ( false ) ;
28
+
29
+ // Fetch deployment ID when modal opens
30
+ useEffect ( ( ) => {
31
+ if ( visible && environment . environmentApiServiceUrl && environment . environmentApikey ) {
32
+ setIsLoading ( true ) ;
33
+ setError ( null ) ;
34
+
35
+ getEnvironmentDeploymentId (
36
+ environment . environmentApiServiceUrl ,
37
+ environment . environmentApikey
38
+ )
39
+ . then ( ( id ) => {
40
+ setDeploymentId ( id ) ;
41
+ setShowHubspotModal ( true ) ;
42
+ } )
43
+ . catch ( ( err ) => {
44
+ console . error ( 'Failed to fetch deployment ID:' , err ) ;
45
+ setError ( err instanceof Error ? err . message : 'Failed to fetch deployment ID' ) ;
46
+ } )
47
+ . finally ( ( ) => {
48
+ setIsLoading ( false ) ;
49
+ } ) ;
50
+ } else if ( visible ) {
51
+ setError ( 'Environment API service URL or API key not configured' ) ;
52
+ }
53
+ } , [ visible , environment . environmentApiServiceUrl , environment . environmentApikey ] ) ;
54
+
55
+ // Handle HubSpot modal close
56
+ const handleHubspotClose = ( ) => {
57
+ setShowHubspotModal ( false ) ;
58
+ onClose ( ) ;
59
+ } ;
60
+
61
+ // Handle main modal close
62
+ const handleClose = ( ) => {
63
+ setShowHubspotModal ( false ) ;
64
+ setDeploymentId ( null ) ;
65
+ setError ( null ) ;
66
+ onClose ( ) ;
67
+ } ;
68
+
69
+ // Show HubSpot modal if we have deployment ID
70
+ if ( showHubspotModal && deploymentId ) {
71
+ return (
72
+ < HubspotModal
73
+ open = { showHubspotModal }
74
+ onClose = { handleHubspotClose }
75
+ orgId = { environment . environmentId }
76
+ deploymentIds = { [ deploymentId ] }
77
+ />
78
+ ) ;
79
+ }
80
+
81
+ return (
82
+ < Modal
83
+ title = {
84
+ < div style = { { display : 'flex' , alignItems : 'center' , gap : '12px' } } >
85
+ < CustomerServiceOutlined style = { { fontSize : '20px' , color : '#1890ff' } } />
86
+ < span style = { { fontSize : '18px' , fontWeight : 600 } } > Contact Lowcoder Team</ span >
87
+ </ div >
88
+ }
89
+ open = { visible }
90
+ onCancel = { handleClose }
91
+ footer = { null }
92
+ width = { 800 }
93
+ centered
94
+ style = { { top : 20 } }
95
+ bodyStyle = { { padding : '24px' } }
96
+ >
97
+ { /* Environment Context Section */ }
98
+ < Card
99
+ style = { {
100
+ marginBottom : '24px' ,
101
+ borderRadius : '8px' ,
102
+ background : '#fafafa' ,
103
+ border : '1px solid #f0f0f0'
104
+ } }
105
+ bodyStyle = { { padding : '16px' } }
106
+ >
107
+ < Row gutter = { [ 16 , 8 ] } align = "middle" >
108
+ < Col >
109
+ < CloudServerOutlined style = { { fontSize : '24px' , color : '#1890ff' } } />
110
+ </ Col >
111
+ < Col flex = { 1 } >
112
+ < div >
113
+ < Text strong style = { { fontSize : '16px' , color : '#262626' } } >
114
+ Environment: { environment . environmentName || 'Unnamed Environment' }
115
+ </ Text >
116
+ < br />
117
+ < Text style = { { fontSize : '14px' , color : '#8c8c8c' , fontFamily : 'monospace' } } >
118
+ Environment ID: { environment . environmentId }
119
+ </ Text >
120
+ < br />
121
+ < Text style = { { fontSize : '14px' , color : '#8c8c8c' , fontFamily : 'monospace' } } >
122
+ Deployment ID: { isLoading ? 'Loading...' : deploymentId || 'Not available' }
123
+ </ Text >
124
+ </ div >
125
+ </ Col >
126
+ </ Row >
127
+ </ Card >
128
+
129
+ < Divider style = { { margin : '16px 0' } } />
130
+
131
+ { /* Loading, Error, or Success State */ }
132
+ < div style = { { minHeight : '200px' , padding : '20px 0' } } >
133
+ { isLoading && (
134
+ < div style = { {
135
+ display : 'flex' ,
136
+ flexDirection : 'column' ,
137
+ alignItems : 'center' ,
138
+ justifyContent : 'center' ,
139
+ minHeight : '200px'
140
+ } } >
141
+ < Spin size = "large" />
142
+ < Text style = { { marginTop : '16px' , color : '#8c8c8c' } } >
143
+ Fetching deployment information...
144
+ </ Text >
145
+ </ div >
146
+ ) }
147
+
148
+ { error && (
149
+ < Alert
150
+ message = "Unable to Load Contact Form"
151
+ description = { error }
152
+ type = "error"
153
+ showIcon
154
+ style = { { marginBottom : '16px' } }
155
+ />
156
+ ) }
157
+
158
+ { ! isLoading && ! error && ! deploymentId && (
159
+ < div style = { {
160
+ textAlign : 'center' ,
161
+ color : '#8c8c8c' ,
162
+ fontSize : '14px'
163
+ } } >
164
+ < CustomerServiceOutlined style = { { fontSize : '48px' , marginBottom : '16px' , color : '#d9d9d9' } } />
165
+ < div > Please ensure the environment is properly configured to contact support.</ div >
166
+ </ div >
167
+ ) }
168
+ </ div >
169
+ </ Modal >
170
+ ) ;
171
+ } ;
172
+
132
173
export default ContactLowcoderModal ;
0 commit comments