/** * @prettier */ import React, { useCallback, useEffect } from "react" import { OrderedMap } from "immutable" import PropTypes from "prop-types" import ImPropTypes from "react-immutable-proptypes" const Servers = ({ servers, currentServer, setSelectedServer, setServerVariableValue, getServerVariable, getEffectiveServerValue, }) => { const currentServerDefinition = servers.find((s) => s.get("url") === currentServer) || OrderedMap() const currentServerVariableDefs = currentServerDefinition.get("variables") || OrderedMap() const shouldShowVariableUI = currentServerVariableDefs.size !== 0 useEffect(() => { if (currentServer) return // fire 'change' event to set default 'value' of select setSelectedServer(servers.first()?.get("url")) }, []) useEffect(() => { // server has changed, we may need to set default values const currentServerDefinition = servers.find( (server) => server.get("url") === currentServer ) if (!currentServerDefinition) { setSelectedServer(servers.first().get("url")) return } const currentServerVariableDefs = currentServerDefinition.get("variables") || OrderedMap() currentServerVariableDefs.map((val, key) => { setServerVariableValue({ server: currentServer, key, val: val.get("default") || "", }) }) }, [currentServer, servers]) const handleServerChange = useCallback( (e) => { setSelectedServer(e.target.value) }, [setSelectedServer] ) const handleServerVariableChange = useCallback( (e) => { const variableName = e.target.getAttribute("data-variable") const newVariableValue = e.target.value setServerVariableValue({ server: currentServer, key: variableName, val: newVariableValue, }) }, [setServerVariableValue, currentServer] ) return (
{shouldShowVariableUI && (
Computed URL: {getEffectiveServerValue(currentServer)}

Server variables

{currentServerVariableDefs.entrySeq().map(([name, val]) => { return ( ) })}
{name} {val.get("enum") ? ( ) : ( )}
)}
) } Servers.propTypes = { servers: ImPropTypes.list.isRequired, currentServer: PropTypes.string.isRequired, setSelectedServer: PropTypes.func.isRequired, setServerVariableValue: PropTypes.func.isRequired, getServerVariable: PropTypes.func.isRequired, getEffectiveServerValue: PropTypes.func.isRequired, } export default Servers