Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 30 additions & 32 deletions packages/block-editor/src/hooks/border-width.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
__experimentalUnitControl as UnitControl,
__experimentalUseCustomUnits as useCustomUnits,
} from '@wordpress/components';
import { useEffect, useState } from '@wordpress/element';
import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';

/**
Expand All @@ -32,25 +32,12 @@ export const BorderWidthEdit = ( props ) => {

const { width, color: customBorderColor, style: borderStyle } =
style?.border || {};

// Used to temporarily track previous border color & style selections to be
// able to restore them when border width changes from zero value.
const [ styleSelection, setStyleSelection ] = useState();
const [ colorSelection, setColorSelection ] = useState();

// Temporarily track previous border color & style selections to be able to
// restore them when border width changes from zero value.
useEffect( () => {
if ( borderStyle !== 'none' ) {
setStyleSelection( borderStyle );
}
}, [ borderStyle ] );

useEffect( () => {
if ( borderColor || customBorderColor ) {
setColorSelection( {
name: !! borderColor ? borderColor : undefined,
color: !! customBorderColor ? customBorderColor : undefined,
} );
}
}, [ borderColor, customBorderColor ] );
const [ customColorSelection, setCustomColorSelection ] = useState();

const onChange = ( newWidth ) => {
let newStyle = {
Expand All @@ -65,28 +52,39 @@ export const BorderWidthEdit = ( props ) => {
let borderPaletteColor = borderColor;

const hasZeroWidth = parseFloat( newWidth ) === 0;
const hadPreviousZeroWidth = parseFloat( width ) === 0;

// Setting the border width explicitly to zero will also set the
// border style to `none` and clear border color attributes.
if ( hasZeroWidth ) {
if ( hasZeroWidth && ! hadPreviousZeroWidth ) {
// Before clearing color and style selections, keep track of
// the current selections so they can be restored when the width
// changes to a non-zero value.
setColorSelection( borderColor );
setCustomColorSelection( customBorderColor );
setStyleSelection( borderStyle );

// Clear style and color attributes.
borderPaletteColor = undefined;
newStyle.border.color = undefined;
newStyle.border.style = 'none';
}

// Restore previous border style selection if width is now not zero and
// border style was 'none'. This is to support changes to the UI which
// change the border style UI to a segmented control without a "none"
// option.
if ( ! hasZeroWidth && borderStyle === 'none' ) {
newStyle.border.style = styleSelection;
}

// Restore previous border color selection if width is no longer zero
// and current border color is undefined.
if ( ! hasZeroWidth && borderColor === undefined ) {
borderPaletteColor = colorSelection?.name;
newStyle.border.color = colorSelection?.color;
if ( ! hasZeroWidth && hadPreviousZeroWidth ) {
// Restore previous border style selection if width is now not zero and
// border style was 'none'. This is to support changes to the UI which
// change the border style UI to a segmented control without a "none"
// option.
if ( borderStyle === 'none' ) {
newStyle.border.style = styleSelection;
}

// Restore previous border color selection if width is no longer zero
// and current border color is undefined.
if ( borderColor === undefined ) {
borderPaletteColor = colorSelection;
newStyle.border.color = customColorSelection;
}
}

// If width was reset, clean out undefined styles.
Expand Down