import React, { useState, useEffect } from 'react'; import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; import Popover from 'react-bootstrap/Popover'; import Slider from 'rc-slider'; import { Color } from './Color'; export const BoxShadow = ({ value, onChange, cyLabel }) => { const defaultValue = { X: 0, Y: 0, Blur: 0, Spread: 0, Color: '#00000040' }; const [showPicker, setShowPicker] = useState(false); const popoverLabelstyle = { display: 'flex', zIndex: 4, fontSize: '87.7%', minWidth: '3.5rem', }; const popoverInputstyle = { paddingLeft: '3.5rem', paddingRight: '1.5rem', }; const input = ['X', 'Y', 'Blur', 'Spread']; const [boxShadow, setBoxShadow] = useState(defaultValue); const [debouncedShadow, setDebouncedShadow] = useState(defaultValue); const darkMode = localStorage.getItem('darkMode') === 'true'; const colorPickerStyle = { position: 'absolute', bottom: '260px', }; useEffect(() => { if (value) { const valueArr = value.split('px '); const newValue = { X: valueArr[0], Y: valueArr[1], Blur: valueArr[2], Spread: valueArr[3], Color: valueArr[4], }; setBoxShadow(newValue); setDebouncedShadow(newValue); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { if (boxShadow !== debouncedShadow) { onChange(Object.values(debouncedShadow).join('px ')); setBoxShadow(debouncedShadow); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [debouncedShadow]); const setBoxShadowValue = (item, value, debounced = false) => { const newValue = { ...boxShadow }; if (item === 'Blur' && value < 0) { newValue[item] = 0; debounced ? setDebouncedShadow(newValue) : setBoxShadow(newValue); } else { newValue[item] = value; debounced ? setDebouncedShadow(newValue) : setBoxShadow(newValue); } }; const clearBoxShadow = () => setDebouncedShadow(defaultValue); const renderSlider = (item, value) => { return (
{ setBoxShadowValue(item, updatedValue)} onAfterChange={(updatedValue) => setBoxShadowValue(item, updatedValue, true)} trackStyle={{ backgroundColor: '#4D72FA' }} railStyle={{ backgroundColor: '#E9E9E9' }} handleStyle={{ backgroundColor: '#4D72FA', borderColor: '#4D72FA', }} /> }
); }; const eventPopover = () => { return ( <> {input.map((item) => (
{item} setBoxShadowValue(item, e.target.value, true)} /> px
{renderSlider(item, boxShadow[item])}
))} setBoxShadowValue('Color', hexCode, true)} value={boxShadow.Color} hideFx pickerStyle={colorPickerStyle} cyLabel={'box-shadow-color'} asBoxShadowPopover={false} />
); }; const _value = `#${value.split('#')[1]}`; const outerStyles = { width: '142px', height: '32px', borderRadius: ' 6px', display: 'flex', paddingLeft: '4px', alignItems: 'center', gap: '4px', background: showPicker && 'var(--indigo2)', outline: showPicker && '1px solid var(--indigo9)', boxShadow: showPicker && '0px 0px 0px 1px #C6D4F9', }; return (
{ setShowPicker(showPicker); }} show={showPicker} trigger="click" placement={'left'} rootClose={true} overlay={eventPopover()} >
{_value}
); };