'React CodeMirror doesn't update when status changes

I am building a collaborative javascript editor. For this, I am using React CodeMirror with Socket.io and Express. The editor is a component called CodeMirror.jsx that uses the JedWatson/react-codemirror package.

I have a state called code, which maintains the editor code and i update every time a socket notification arrives. I send this code state as a value parameter of the component.

The socket broadcast works fine, the state is modified from the socket, but the code inside CodeMirror is not modified. If I show the code state in a textbox, it is updated, but not in the CodeMirror component.

This is the CodeMirror.jsx component:

import React, { useState, useEffect } from "react";
import {ButtonGroup, Button, Modal, Table } from 'react-bootstrap';
import Codemirror from 'react-codemirror';
import 'codemirror/lib/codemirror.css';
import 'codemirror/theme/monokai.css';
import 'codemirror/mode/javascript/javascript.js'
const io = require('socket.io-client')
const socket = io("http://localhost:8000")

const CodeMirror = ({...props}) => {
  const [code, setCode] = useState('');
  const link= "http://localhost:8000/canal/"+props.experiencia+"/"+props.canal

  const options = {
    lineNumbers: true,
    mode: 'javascript',
    theme: 'monokai',

    }

  useEffect(function() {
      console.log("conectando..."+props.canal)
      socket.emit('canalIn', {experiencia: props.experiencia._id, canal: props.canal});
      socket.on('codeoEmit', (payload) =>  {
        updateCodeFromSockets(payload)})
      return () => {
        socket.disconnect();
      }
  }, []);


  const updateCodeFromSockets = (payload) => {
    console.log("recibi update "+payload.newCode)
    //este set code no actualiza el componente
    setCode(payload.newCode)
  }
       

  const updateCodeInState = (newText) => {
    setCode(newText)
    console.log("conectando para actualizar..."+props.canal)
    socket.emit('canalIn', {experiencia: props.experiencia._id, canal: props.canal});
    //publicamos el evento
    socket.emit('codeoEvent', {
      canal: props.canal,
      newCode: newText
    })
    //socket.disconnect();
  }
        


    return (
      <div>

        <Codemirror
          value={code}
          autoFocus= {true}
          onChange={updateCodeInState}
          options={options} />
        <hr/>
          
      </div>
    )

}

export default CodeMirror

And this is the server code:

const server = app.listen(apiPort, () => console.log(`Server running on port ${apiPort}`))
const io = require('socket.io')(server);
//webSockets
io.on('connection', (socket) => {
  //console.log('a user connected');

  socket.on('disconnect', () => {
    console.log('user disconnected');
  });

  //este evento es el que captura el coding
  socket.on('canalIn', function(data) {
    socket.join(data.canal);
    console.log('canalIn: ' + data.canal);
  });

  socket.on('codeoEvent', function(data) {
    console.log('emitiendo al canal: ' + data.canal+ ' el code '  + data.newCode);
    socket.broadcast.to(data.canal).emit('codeoEmit', data);

  })
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source