@@ -2,6 +2,17 @@ import React, { useEffect } from "react";
2
2
import { useState } from "react" ;
3
3
import { TextField , Typography , MenuItem , Select , Drawer , IconButton , Grid , Button , Stack } from "@mui/material"
4
4
import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos' ;
5
+ import {
6
+ ApolloClient ,
7
+ InMemoryCache ,
8
+ ApolloProvider ,
9
+ gql ,
10
+ } from "@apollo/client" ;
11
+
12
+ const client = new ApolloClient ( {
13
+ uri : "http://localhost:5001/graphql" ,
14
+ cache : new InMemoryCache ( ) ,
15
+ } ) ;
5
16
6
17
export const SettingsSidebar = ( { showSettings, setShowSettings, metricsState, setMetricsState } ) => {
7
18
const [ localMetricsState , setLocalMetricsState ] = useState ( {
@@ -10,6 +21,8 @@ export const SettingsSidebar = ({ showSettings, setShowSettings, metricsState, s
10
21
duration : metricsState . duration ,
11
22
refreshRate : metricsState . refreshRate
12
23
} ) ;
24
+ const [ invalidPrometheusMessage , setInvalidPrometheusMessage ] = useState ( null ) ;
25
+ const [ showSubmissionConfirmation , setShowSubmissionConfirmation ] = useState ( false ) ;
13
26
14
27
const handleLocalMetrics = ( event ) => {
15
28
switch ( event . target . name ) {
@@ -63,32 +76,38 @@ export const SettingsSidebar = ({ showSettings, setShowSettings, metricsState, s
63
76
}
64
77
}
65
78
66
- const handleSubmit = ( event ) => {
79
+ const handleSubmit = async ( event ) => {
67
80
event . preventDefault ( ) ;
68
81
69
- // ToDo:
70
- // 1. verify prometheus URL
71
- // 2. verify ksqlDB url
72
- // 3. verify metrics exist for duration requested
73
-
74
- // update state
75
- setMetricsState ( {
76
- prometheusURL : localMetricsState . prometheusURL ,
77
- ksqlDBURL : localMetricsState . ksqlDBURL ,
78
- duration : {
79
- days : localMetricsState . duration . days ,
80
- hours : localMetricsState . duration . hours ,
81
- minutes : localMetricsState . duration . minutes
82
- } ,
83
- refreshRate : localMetricsState . refreshRate
84
- } ) ;
82
+ // Verify Prometheus URL
83
+ client . query ( {
84
+ query : gql `
85
+ query validatePrometheusURL{
86
+ isValidPrometheusURL(prometheusURL: "${ event . target [ 1 ] . value } ")
87
+ }
88
+ `
89
+ } )
90
+ . then ( res => {
91
+ // update state
92
+ setMetricsState ( {
93
+ prometheusURL : localMetricsState . prometheusURL ,
94
+ ksqlDBURL : localMetricsState . ksqlDBURL ,
95
+ duration : {
96
+ days : localMetricsState . duration . days ,
97
+ hours : localMetricsState . duration . hours ,
98
+ minutes : localMetricsState . duration . minutes
99
+ } ,
100
+ refreshRate : localMetricsState . refreshRate
101
+ } ) ;
102
+ setInvalidPrometheusMessage ( null ) ;
103
+ setShowSubmissionConfirmation ( true ) ;
104
+ setTimeout ( ( ) => setShowSubmissionConfirmation ( false ) , 3000 ) ;
105
+ } )
106
+ . catch ( error => {
107
+ setInvalidPrometheusMessage ( error . message ) ;
108
+ } ) ;
85
109
}
86
110
87
- // useEffect(() => {
88
- // console.log('this is the metrics state: ', metricsState);
89
- // }, [metricsState]);
90
-
91
-
92
111
return (
93
112
< Drawer variant = "temporary" anchor = "right" open = { showSettings } PaperProps = { { sx : { paddingTop : "3.5em" , width : "35%" } } } >
94
113
< div className = "flex-1 w-full header-viewport p-4" >
@@ -98,15 +117,30 @@ export const SettingsSidebar = ({ showSettings, setShowSettings, metricsState, s
98
117
< ArrowForwardIosIcon sx = { { color : "#333" } } />
99
118
</ IconButton >
100
119
< Typography variant = "h6" sx = { { color : "#333" } } > Prometheus Connection</ Typography >
101
- < hr className = "w-full mb-3 mt-1" > </ hr >
102
- < TextField
103
- fullWidth
104
- variant = "outlined"
105
- label = "URL"
106
- name = "prometheus-url"
107
- onChange = { handleLocalMetrics }
108
- value = { localMetricsState . prometheusURL }
109
- />
120
+ < hr className = "w-full mb-3 mt-1" > </ hr >
121
+ { invalidPrometheusMessage ? (
122
+ < >
123
+ < TextField
124
+ error
125
+ fullWidth
126
+ variant = "outlined"
127
+ label = "URL"
128
+ name = "prometheus-url"
129
+ onChange = { handleLocalMetrics }
130
+ value = { localMetricsState . prometheusURL }
131
+ />
132
+ < Typography variant = "h8" sx = { { color : "red" } } > { invalidPrometheusMessage } </ Typography >
133
+ </ >
134
+ ) : (
135
+ < TextField
136
+ fullWidth
137
+ variant = "outlined"
138
+ label = "URL"
139
+ name = "prometheus-url"
140
+ onChange = { handleLocalMetrics }
141
+ value = { localMetricsState . prometheusURL }
142
+ />
143
+ ) }
110
144
< hr className = "w-full invisible mb-2 mt-2" > </ hr >
111
145
< Typography variant = "h6" sx = { { color : "#333" } } > ksqlDB Connection</ Typography >
112
146
< hr className = "w-full mb-3 mt-1" > </ hr >
@@ -172,6 +206,7 @@ export const SettingsSidebar = ({ showSettings, setShowSettings, metricsState, s
172
206
< Button variant = "contained" type = "submit" > Submit</ Button >
173
207
< Button color = 'secondary' variant = "contained" onClick = { ( ) => setShowSettings ( ! showSettings ) } > Cancel</ Button >
174
208
</ Stack >
209
+ { showSubmissionConfirmation && < Typography variant = "h8" sx = { { color : "forestgreen" , mt : "1em" } } > Settings Saved!</ Typography > }
175
210
</ Grid >
176
211
</ form >
177
212
</ div >
0 commit comments