diff --git a/client/src/__locales/en.json b/client/src/__locales/en.json index 243ed012..fac7ceaa 100644 --- a/client/src/__locales/en.json +++ b/client/src/__locales/en.json @@ -1,5 +1,5 @@ { - "refresh_status": "Refresh status", + "check_dhcp_servers": "Check for DHCP servers", "save_config": "Save config", "enabled_dhcp": "DHCP server enabled", "disabled_dhcp": "DHCP server disabled", diff --git a/client/src/actions/index.js b/client/src/actions/index.js index 20ef3766..949e3a5d 100644 --- a/client/src/actions/index.js +++ b/client/src/actions/index.js @@ -553,31 +553,14 @@ export const getDhcpInterfaces = () => async (dispatch) => { } }; -export const setDhcpConfigRequest = createAction('SET_DHCP_CONFIG_REQUEST'); -export const setDhcpConfigSuccess = createAction('SET_DHCP_CONFIG_SUCCESS'); -export const setDhcpConfigFailure = createAction('SET_DHCP_CONFIG_FAILURE'); - -export const setDhcpConfig = config => async (dispatch) => { - dispatch(setDhcpConfigRequest()); - try { - await apiClient.setDhcpConfig(config); - dispatch(getDhcpStatus()); - dispatch(addSuccessToast('dhcp_config_saved')); - dispatch(setDhcpConfigSuccess()); - } catch (error) { - dispatch(addErrorToast({ error })); - dispatch(setDhcpConfigFailure()); - } -}; - export const findActiveDhcpRequest = createAction('FIND_ACTIVE_DHCP_REQUEST'); export const findActiveDhcpSuccess = createAction('FIND_ACTIVE_DHCP_SUCCESS'); export const findActiveDhcpFailure = createAction('FIND_ACTIVE_DHCP_FAILURE'); -export const findActiveDhcp = () => async (dispatch) => { +export const findActiveDhcp = name => async (dispatch) => { dispatch(findActiveDhcpRequest()); try { - const activeDhcp = await apiClient.findActiveDhcp(); + const activeDhcp = await apiClient.findActiveDhcp(name); dispatch(findActiveDhcpSuccess(activeDhcp)); } catch (error) { dispatch(addErrorToast({ error })); @@ -585,27 +568,84 @@ export const findActiveDhcp = () => async (dispatch) => { } }; +export const setDhcpConfigRequest = createAction('SET_DHCP_CONFIG_REQUEST'); +export const setDhcpConfigSuccess = createAction('SET_DHCP_CONFIG_SUCCESS'); +export const setDhcpConfigFailure = createAction('SET_DHCP_CONFIG_FAILURE'); + +// TODO rewrite findActiveDhcp part +export const setDhcpConfig = config => async (dispatch) => { + dispatch(setDhcpConfigRequest()); + try { + if (config.interface_name) { + dispatch(findActiveDhcpRequest()); + try { + const activeDhcp = await apiClient.findActiveDhcp(config.interface_name); + dispatch(findActiveDhcpSuccess(activeDhcp)); + + if (!activeDhcp.found) { + await apiClient.setDhcpConfig(config); + dispatch(addSuccessToast('dhcp_config_saved')); + dispatch(setDhcpConfigSuccess()); + dispatch(getDhcpStatus()); + } else { + dispatch(addErrorToast({ error: 'dhcp_found' })); + } + } catch (error) { + dispatch(addErrorToast({ error })); + dispatch(findActiveDhcpFailure()); + } + } else { + await apiClient.setDhcpConfig(config); + dispatch(addSuccessToast('dhcp_config_saved')); + dispatch(setDhcpConfigSuccess()); + dispatch(getDhcpStatus()); + } + } catch (error) { + dispatch(addErrorToast({ error })); + dispatch(setDhcpConfigFailure()); + } +}; + export const toggleDhcpRequest = createAction('TOGGLE_DHCP_REQUEST'); export const toggleDhcpFailure = createAction('TOGGLE_DHCP_FAILURE'); export const toggleDhcpSuccess = createAction('TOGGLE_DHCP_SUCCESS'); +// TODO rewrite findActiveDhcp part export const toggleDhcp = config => async (dispatch) => { dispatch(toggleDhcpRequest()); - let successMessage = ''; - try { - if (config.enabled) { - successMessage = 'disabled_dhcp'; + if (config.enabled) { + dispatch(addSuccessToast('disabled_dhcp')); + try { await apiClient.setDhcpConfig({ ...config, enabled: false }); - } else { - successMessage = 'enabled_dhcp'; - await apiClient.setDhcpConfig({ ...config, enabled: true }); + dispatch(toggleDhcpSuccess()); + dispatch(getDhcpStatus()); + } catch (error) { + dispatch(addErrorToast({ error })); + dispatch(toggleDhcpFailure()); } + } else { + dispatch(findActiveDhcpRequest()); + try { + const activeDhcp = await apiClient.findActiveDhcp(config.interface_name); + dispatch(findActiveDhcpSuccess(activeDhcp)); - dispatch(addSuccessToast(successMessage)); - dispatch(toggleDhcpSuccess()); - } catch (error) { - dispatch(addErrorToast({ error })); - dispatch(toggleDhcpFailure()); + if (!activeDhcp.found) { + try { + await apiClient.setDhcpConfig({ ...config, enabled: true }); + dispatch(toggleDhcpSuccess()); + dispatch(getDhcpStatus()); + } catch (error) { + dispatch(addErrorToast({ error })); + dispatch(toggleDhcpFailure()); + } + dispatch(addSuccessToast('enabled_dhcp')); + } else { + dispatch(addErrorToast({ error: 'dhcp_found' })); + } + } catch (error) { + dispatch(addErrorToast({ error })); + dispatch(findActiveDhcpFailure()); + } } }; diff --git a/client/src/api/Api.js b/client/src/api/Api.js index 2bb0277a..4592fae7 100644 --- a/client/src/api/Api.js +++ b/client/src/api/Api.js @@ -328,8 +328,12 @@ export default class Api { return this.makeRequest(path, method, parameters); } - findActiveDhcp() { + findActiveDhcp(name) { const { path, method } = this.DHCP_FIND_ACTIVE; - return this.makeRequest(path, method); + const parameters = { + data: name, + headers: { 'Content-Type': 'text/plain' }, + }; + return this.makeRequest(path, method, parameters); } } diff --git a/client/src/components/Settings/Dhcp/Form.js b/client/src/components/Settings/Dhcp/Form.js index 14455b1b..9fc497d2 100644 --- a/client/src/components/Settings/Dhcp/Form.js +++ b/client/src/components/Settings/Dhcp/Form.js @@ -1,7 +1,6 @@ import React, { Fragment } from 'react'; -import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import { Field, reduxForm, formValueSelector } from 'redux-form'; +import { Field, reduxForm } from 'redux-form'; import { withNamespaces, Trans } from 'react-i18next'; import flow from 'lodash/flow'; @@ -45,88 +44,17 @@ const renderField = ({ ); -const renderInterfaces = (interfaces => ( - Object.keys(interfaces).map((item) => { - const option = interfaces[item]; - const { name } = option; - const onlyIPv6 = option.ip_addresses.every(ip => ip.includes(':')); - let interfaceIP = option.ip_addresses[0]; - - if (!onlyIPv6) { - option.ip_addresses.forEach((ip) => { - if (!ip.includes(':')) { - interfaceIP = ip; - } - }); - } - - return ( - - ); - }) -)); - -const renderInterfaceValues = (interfaceValues => ( -