1
+ import React from 'react' ;
2
+ import { Button , Card , Space , Typography , Row , Col } from 'antd' ;
3
+ import {
4
+ CustomerServiceOutlined ,
5
+ EditOutlined ,
6
+ ArrowLeftOutlined ,
7
+ CloseCircleOutlined ,
8
+ ExclamationCircleOutlined ,
9
+ WarningOutlined
10
+ } from '@ant-design/icons' ;
11
+ import { Environment } from '../types/environment.types' ;
12
+ import history from "@lowcoder-ee/util/history" ;
13
+
14
+ const { Title, Text} = Typography ;
15
+
16
+ interface UnlicensedEnvironmentViewProps {
17
+ environment :Environment ;
18
+ onEditClick :( ) => void ;
19
+ }
20
+
21
+ /**
22
+ * Modern UI for unlicensed environments
23
+ */
24
+ const UnlicensedEnvironmentView :React . FC < UnlicensedEnvironmentViewProps > = ( {
25
+ environment,
26
+ onEditClick
27
+ } ) => {
28
+ const getLicenseIcon = ( ) => {
29
+ switch ( environment . licenseStatus ) {
30
+ case 'unlicensed' :
31
+ return < CloseCircleOutlined style = { { fontSize :'48px' , color :'#ff4d4f' } } /> ;
32
+ case 'error' :
33
+ return < ExclamationCircleOutlined style = { { fontSize :'48px' , color :'#faad14' } } /> ;
34
+ default :
35
+ return < WarningOutlined style = { { fontSize :'48px' , color :'#ff4d4f' } } /> ;
36
+ }
37
+ } ;
38
+
39
+ const getLicenseTitle = ( ) => {
40
+ switch ( environment . licenseStatus ) {
41
+ case 'unlicensed' :
42
+ return 'Environment Not Licensed' ;
43
+ case 'error' :
44
+ return 'License Configuration Error' ;
45
+ default :
46
+ return 'License Issue' ;
47
+ }
48
+ } ;
49
+
50
+ const getLicenseDescription = ( ) => {
51
+ if ( environment . licenseError ) {
52
+ return environment . licenseError ;
53
+ }
54
+
55
+ switch ( environment . licenseStatus ) {
56
+ case 'unlicensed' :
57
+ return 'This environment requires a valid license to access its features and functionality.' ;
58
+ case 'error' :
59
+ return 'There was an error validating the license for this environment. Please check the configuration.' ;
60
+ default :
61
+ return 'This environment has license-related issues that need to be resolved.' ;
62
+ }
63
+ } ;
64
+
65
+ return (
66
+ < div style = { {
67
+ padding :"24px" ,
68
+ flex :1 ,
69
+ minHeight :'100vh' ,
70
+ background :'linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%)'
71
+ } } >
72
+ < Row justify = "center" style = { { minHeight :'80vh' } } >
73
+ < Col xs = { 24 } sm = { 20 } md = { 16 } lg = { 14 } xl = { 12 } >
74
+ < div style = { {
75
+ display :'flex' ,
76
+ flexDirection :'column' ,
77
+ justifyContent :'center' ,
78
+ alignItems :'center' ,
79
+ minHeight :'70vh' ,
80
+ textAlign :'center'
81
+ } } >
82
+ { /* Main Status Card */ }
83
+ < Card
84
+ style = { {
85
+ width :'100%' ,
86
+ borderRadius :'16px' ,
87
+ boxShadow :'0 20px 40px rgba(0,0,0,0.1)' ,
88
+ border :'none' ,
89
+ background :'white' ,
90
+ overflow :'hidden'
91
+ } }
92
+ bodyStyle = { { padding :'48px 32px' } }
93
+ >
94
+ { /* Status Icon */ }
95
+ < div style = { { marginBottom :'24px' } } >
96
+ { getLicenseIcon ( ) }
97
+ </ div >
98
+
99
+ { /* Environment Info */ }
100
+ < div style = { { marginBottom :'32px' } } >
101
+ < Title level = { 2 } style = { { marginBottom :'8px' , color :'#262626' } } >
102
+ { getLicenseTitle ( ) }
103
+ </ Title >
104
+ < Text style = { {
105
+ fontSize :'16px' ,
106
+ color :'#595959' ,
107
+ display :'block' ,
108
+ marginBottom :'16px' ,
109
+ lineHeight :'1.6'
110
+ } } >
111
+ { getLicenseDescription ( ) }
112
+ </ Text >
113
+
114
+ { /* Environment Details */ }
115
+ < div style = { {
116
+ background :'#fafafa' ,
117
+ padding :'16px' ,
118
+ borderRadius :'8px' ,
119
+ marginTop :'24px' ,
120
+ border :'1px solid #f0f0f0'
121
+ } } >
122
+ < Text strong style = { { color :'#8c8c8c' , fontSize :'14px' } } > Environment:</ Text >
123
+ < Text style = { {
124
+ display :'block' ,
125
+ fontSize :'16px' ,
126
+ color :'#262626' ,
127
+ marginTop :'4px'
128
+ } } >
129
+ { environment . environmentName || 'Unnamed Environment' }
130
+ </ Text >
131
+ < Text style = { {
132
+ fontSize :'13px' ,
133
+ color :'#8c8c8c' ,
134
+ fontFamily :'monospace'
135
+ } } >
136
+ ID:{ environment . environmentId }
137
+ </ Text >
138
+ </ div >
139
+ </ div >
140
+
141
+ { /* Action Buttons */ }
142
+ < Space size = "large" direction = "vertical" style = { { width :'100%' } } >
143
+ < Button
144
+ type = "primary"
145
+ size = "large"
146
+ icon = { < CustomerServiceOutlined /> }
147
+ style = { {
148
+ width :'100%' ,
149
+ height :'48px' ,
150
+ borderRadius :'8px' ,
151
+ fontSize :'16px' ,
152
+ fontWeight :500 ,
153
+ background :'linear-gradient(135deg, #1890ff 0%, #0050b3 100%)' ,
154
+ border :'none' ,
155
+ boxShadow :'0 4px 12px rgba(24, 144, 255, 0.3)'
156
+ } }
157
+ // onClick will be handled later when modal is ready
158
+ >
159
+ Contact Lowcoder Team
160
+ </ Button >
161
+
162
+ < Button
163
+ size = "large"
164
+ icon = { < EditOutlined /> }
165
+ onClick = { onEditClick }
166
+ style = { {
167
+ width :'100%' ,
168
+ height :'48px' ,
169
+ borderRadius :'8px' ,
170
+ fontSize :'16px' ,
171
+ fontWeight :500 ,
172
+ borderColor :'#d9d9d9' ,
173
+ color :'#595959'
174
+ } }
175
+ >
176
+ Edit Environment
177
+ </ Button >
178
+
179
+ < Button
180
+ size = "large"
181
+ icon = { < ArrowLeftOutlined /> }
182
+ onClick = { ( ) => history . push ( "/setting/environments" ) }
183
+ style = { {
184
+ width :'100%' ,
185
+ height :'48px' ,
186
+ borderRadius :'8px' ,
187
+ fontSize :'16px' ,
188
+ fontWeight :500 ,
189
+ borderColor :'#d9d9d9' ,
190
+ color :'#8c8c8c'
191
+ } }
192
+ >
193
+ Back to Environments
194
+ </ Button >
195
+ </ Space >
196
+ </ Card >
197
+
198
+ { /* Footer Help Text */ }
199
+ < Text style = { {
200
+ marginTop :'24px' ,
201
+ color :'#8c8c8c' ,
202
+ fontSize :'14px' ,
203
+ maxWidth :'400px' ,
204
+ lineHeight :'1.5'
205
+ } } >
206
+ Need assistance? Contact our team for licensing support or edit the environment configuration to resolve this issue.
207
+ </ Text >
208
+ </ div >
209
+ </ Col >
210
+ </ Row >
211
+ </ div >
212
+ ) ;
213
+ } ;
214
+
215
+ export default UnlicensedEnvironmentView ;