diff --git a/assets/js/src/experimental_features/experimental_features.jsx b/assets/js/src/experimental_features/experimental_features.jsx new file mode 100644 index 0000000000..d67b479e58 --- /dev/null +++ b/assets/js/src/experimental_features/experimental_features.jsx @@ -0,0 +1,92 @@ +import React, { useState, useEffect } from 'react'; +import ReactDOM from 'react-dom'; +import MailPoet from 'mailpoet'; + +const ExperimentalFeatures = () => { + const [flags, setFlags] = useState(null); + + useEffect(() => { + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'featureFlags', + action: 'getAll', + }).done((response) => { + const flagsMap = response.data.reduce((obj, item) => ({ ...obj, [item.name]: item }), {}); + setFlags(flagsMap); + }).fail((response) => { + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(error => error.message), + { scroll: true } + ); + } + }); + }, []); + + function handleChange(event) { + const name = event.target.name; + const value = event.target.checked; + + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'featureFlags', + action: 'set', + data: { + [name]: value ? 1 : 0, + }, + }).done(() => { + const flag = flags[name]; + flag.value = value; + setFlags({ ...flags, [name]: flag }); + MailPoet.Notice.success(`Feature '${name}' was ${value ? 'enabled' : 'disabled'}.`); + }).fail((response) => { + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(error => error.message), + { scroll: true } + ); + } + }); + } + + if (flags === null) { + return
Loading experimental features...
; + } + + if (Object.values(flags).length === 0) { + returnThere are no experimental features at the moment.
; + } + + return ( + <> + { + Object.values(flags).map((flag) => { + const id = `experimental-feature-${flag.name}`; + return ( ++ These features are not finished, they are not meant to be used yet. +
++ If you enable them anything can happen: your website may go down, + all your data can be deleted. +
++ We are not liable. +
+