Почему некорректно работает возврат действий?

Есть рисовалка и в ней нужно реализовать функцию возврата к предыдущему дейстию. Также есть толщина карандаша и его цвет. Если при одном действии выбрать одну толщину/цвет (действием считается непрерывная лиия), а при другом действии другую, то почему то ко всем линиям применится цвет и толщина карандаща предпоследнего действия.

введите сюда описание изображения введите сюда описание изображения

JS

window.onload = () => {
    let config = {
        lineWidth: 5,
        color: 'rgba(0, 0, 0, 1)',
        colorJSON: '{"r":0,"g":0,"b":0,"a":1}'
    }

    let pencilSizeInput = document.querySelector('.pencilSize');
    let pencilOpacityInput = document.querySelector('.pencilOpacity');
    let undoActionBtn = document.querySelector('.undoAction');
    let clearBtn = document.querySelector('.clear');

    const canvas = document.querySelector('canvas');
    const ctx = canvas.getContext('2d');

    colorPicker.on('color:change', function(color) {
            config.color = color.rgbaString;
            // config.colorJSON = JSON.stringify(color.rgba);
            //console.log(JSON.stringify(color.rgba));
    });

    function changePencilSize (event) {
        config.lineWidth = pencilSizeInput.value;
    }

    function changePencilOpacity (event) {
        // let rgbaColor;
        // rgbaColor = config.colorJSON;
        // rgbaColor = JSON.parse(rgbaColor);
        // let rgbaColorString;
        // rgbaColorString = `rgba(${rgbaColor.r}, ${rgbaColor.g}, ${rgbaColor.b}, ${pencilOpacityInput.value})`;
        //
        // config.color = rgbaColorString;
        // console.log(rgbaColorString);
        ctx.globalAlpha = pencilOpacityInput.value;
        //console.log(ctx.globalAlpha);
    }

    pencilSizeInput.addEventListener('change', changePencilSize);
    pencilOpacityInput.addEventListener('change', changePencilOpacity);

    canvas.setAttribute('width', 1000);
    canvas.setAttribute('height', 800);

    let pencilLog = {
        currentAction: 0,
        actions: [],
        pencilProperties: {
            lineWidth: [],
            color: []
        }
    }

    canvas.addEventListener("mousedown", function (event) {
        document.querySelector("body").style.overflow = 'hidden';
        ctx.lineWidth = config.lineWidth;
        ctx.lineJoin = 'round';
        ctx.lineCap = 'round';
        ctx.strokeStyle = config.color;
        ctx.fillStyle = config.color;
        ctx.beginPath();

        pencilLog.actions.push([]);
        pencilLog.pencilProperties.color.push(config.color);
        pencilLog.pencilProperties.lineWidth.push(config.lineWidth);
        canvas.onmousemove = (event) => recordMousePos(event);
    });

    canvas.addEventListener("mouseup", stopDrawing);

    function recordMousePos(event) {
        //console.log(event.clientX + '-' + event.clientY)
        pencilLog.actions[pencilLog.currentAction].push([event.clientX, event.clientY]);
        drawLine(event.clientX + window.pageXOffset, event.clientY + window.pageYOffset);
    }

    function drawLine(x, y) {
        ctx.lineTo(x, y);
        ctx.stroke();
    }

    function stopDrawing() {
        document.querySelector("body").style.overflow = 'visible';
        canvas.onmousemove = null;
        pencilLog.currentAction++;

    }

    function undoAction () {
        if (pencilLog.currentAction !== 0) {
            pencilLog.actions.pop();
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            pencilLog.currentAction--;
            ctx.beginPath();

            pencilLog.actions.forEach(function(item, i) {
                console.log(pencilLog.pencilProperties.color[i]);
                ctx.strokeStyle = pencilLog.pencilProperties.color[i];
                ctx.fillStyle = pencilLog.pencilProperties.color[i];
                console.log(ctx.fillStyle);
                ctx.lineWidth = pencilLog.pencilProperties.lineWidth[i];

                item.forEach(function (pos, i) {
                    if (i === 0) {
                        //console.log(pos[0] +'-' + pos[1]);
                        ctx.moveTo(pos[0], pos[1]);
                    }
                    drawLine(pos[0] + window.pageXOffset, pos[1] + window.pageYOffset);
                })
            })
        }
    }

    //Сделать чтобы при открытой консоли разработчика контуры рисовались нормально


    function clear () {
        pencilLog.actions = [];
        pencilLog.currentAction = 0;
        ctx.clearRect(0, 0, canvas.width, canvas.height);
    }

    clearBtn.addEventListener('click', clear);
    undoActionBtn.addEventListener('click', undoAction);

}

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Drawing</title>
    <link rel="icon" type="image/x-icon" href="../../../img/favicon.png">
    <link rel="stylesheet" href="style.css">
    <script src="main.js"></script>
    <script defer src="../../../ColorPicker/iroLibrary.js"></script>
    <script defer src="../../../ColorPicker/colorPicker.js"></script>
</head>
<body>
    <canvas draggable="false"></canvas>
    <div class="undoAction">Обратно</div>
    <div class="clear">Очистить</div>
    <div class="wrapper">
        <div class="colorPicker" id="colorPicker"></div>
    </div>
    <input type="range" name="" id="" class="pencilSize" value="5">
    <input type="range" name="" class="pencilOpacity" value="1" max="1" step="0.01">
</body>
</html>

CSS

* {
    margin: 0;
    padding: 0;
}

canvas {
    display: block;
    border: 3px solid black
}

.undoAction, .clear {
    user-select: none;
    background: blue;
    width: 200px;
    height: 50px;
    border: 3px solid red;
}


.wrapper {
    width: 340px;
    height: 314px;
    background: black;
    border-radius: 15px;

    display: grid;
    align-items: center;
    justify-items: center;
}

Ответы (0 шт):