JSFiddle - React, Tailwind, and code Playground

HTML

<div id="buttons">
   <button type="button" id="undo_btn">Undo</button>
   <button type="button" id="redo_btn">Redo</button>
</div>
<br/><br/>
<div id="content">
   <label>
      Input1:
      <input type="text" value="" />
   </label>
   <br/><br/>
   <label>
      Input2:
      <input type="text" value="" />
   </label>
   <br/><br/>
   <label>
      Input3:
      <input type="text" value="" />
   </label>
   <br/><br/>
   <label>
      Input4:
      <input type="text" value="" />
   </label>
   <br/><br/>
</div>

JavaScript

var StateUndoRedo = function() {
   var init = function(opts) {
      var self = this;
      self.opts = opts;
      if(typeof(self.opts['undo_disabled']) == 'undefined') {
         self.opts['undo_disabled'] = function() {};
      }
      if(typeof(self.opts['undo_enabled']) == 'undefined') {
         self.opts['undo_enabled'] = function() {};
      }
      if(typeof(self.opts['redo_disabled']) == 'undefined') {
         self.opts['redo_disabled'] = function() {};
      }
      if(typeof(self.opts['redo_enabled']) == 'undefined') {
         self.opts['redo_enabled'] = function() {};
      }
      if(typeof(self.opts['restore']) == 'undefined') {
         self.opts['restore'] = function() {};
      }
      self.opts['undo_disabled']();
      self.opts['redo_disabled']();
   }
   
   var add = function(state) {
      var self = this;
      if(typeof(self.states) == 'undefined') {
         self.states = [];
      }
      if(typeof(self.state_index) == 'undefined') {
         self.state_index = -1;
      }
      self.state_index++;
      self.states[self.state_index] = state;
      self.states.length = self.state_index + 1;
      if(self.state_index > 0) {
         self.opts['undo_enabled']();
      }
      self.opts['redo_disabled']();
   }
   
   var undo = function() {
      var self = this;
      if(self.state_index > 0) {
         self.state_index--;
         if(self.state_index == 0) {
            self.opts['undo_disabled']();
         } else {
            self.opts['undo_enabled']();
         }
         self.opts['redo_enabled']();
         
         self.opts['restore'](self.states[self.state_index]);
	   }
   }
   
   var redo = function() {
      var self = this;
      if(self.state_index < self.states.length) {
         self.state_index++;
         if(self.state_index == self.states.length - 1) {
            self.opts['redo_disabled']();
         } else {
            self.opts['redo_enabled']();
         }
         self.opts['undo_enabled']();
         
 ...