Skip to content

Instantly share code, notes, and snippets.

@bever1337
Created June 30, 2022 18:08
Show Gist options
  • Save bever1337/200dc329ff51e27047b5b1a82d4d829a to your computer and use it in GitHub Desktop.
Save bever1337/200dc329ff51e27047b5b1a82d4d829a to your computer and use it in GitHub Desktop.
Netlify CMS text widget where user may toggle between 'string' and 'text' widget controls.
import CMS from "netlify-cms-app";
import { createElement, useState } from "react";
const widget = {
control: BetterTextWidgetControl,
name: "betterTextWidget",
preview: BetterTextWidgetPreview,
};
export default widget;
const newlineRegExp = /\n/;
function BetterTextWidgetControl(props) {
const { classNameWrapper, value } = props;
const [multilineEnabled, setMultilineEnabled] = useState(
newlineRegExp.test(value)
);
const controlWidget = CMS.getWidget(
multilineEnabled === true ? "text" : "string"
);
return (
<form
className={classNameWrapper}
onSubmit={(event) => {
event.preventDefault();
}}
>
<label>
Multi-line Enabled
<input
checked={multilineEnabled}
onChange={(event) => {
setMultilineEnabled((toggle) => !toggle);
}}
name="multilineEnabled"
type="checkbox"
/>
</label>
{createElement(controlWidget.control, props)}
</form>
);
}
function BetterTextWidgetPreview({ value }) {
return value;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment