fix: lang select in code block is insanity
This commit is contained in:
@@ -116,7 +116,7 @@ const CodeBlock = styled('div')(({ theme }) => ({
|
|||||||
flexWrap: 'wrap',
|
flexWrap: 'wrap',
|
||||||
justifyContent: 'space-between',
|
justifyContent: 'space-between',
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
transition: 'opacity 1.5s',
|
transition: 'opacity .15s',
|
||||||
},
|
},
|
||||||
'.copy-block': {
|
'.copy-block': {
|
||||||
padding: '0px 10px',
|
padding: '0px 10px',
|
||||||
@@ -139,10 +139,21 @@ const CodeBlock = styled('div')(({ theme }) => ({
|
|||||||
outline: 'none !important',
|
outline: 'none !important',
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
const StyledOperationalPanel = styled('div')<{ show: boolean }>(({ show }) => {
|
||||||
|
return {
|
||||||
|
display: 'flex',
|
||||||
|
flexWrap: 'wrap',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
opacity: show ? 1 : 0,
|
||||||
|
transition: 'opacity .15s',
|
||||||
|
};
|
||||||
|
});
|
||||||
export const CodeView = ({ block, editor }: CreateCodeView) => {
|
export const CodeView = ({ block, editor }: CreateCodeView) => {
|
||||||
const initValue: string = block.getProperty('text')?.value?.[0]?.text;
|
const initValue: string = block.getProperty('text')?.value?.[0]?.text;
|
||||||
const langType: string = block.getProperty('lang');
|
const langType: string = block.getProperty('lang');
|
||||||
const [extensions, setExtensions] = useState<Extension[]>();
|
const [extensions, setExtensions] = useState<Extension[]>();
|
||||||
|
const [showOperationPanel, setShowOperationPanel] = useState(false);
|
||||||
|
const isSelecting = useRef(false);
|
||||||
const codeMirror = useRef<ReactCodeMirrorRef>();
|
const codeMirror = useRef<ReactCodeMirrorRef>();
|
||||||
const focusCode = () => {
|
const focusCode = () => {
|
||||||
if (codeMirror.current) {
|
if (codeMirror.current) {
|
||||||
@@ -181,8 +192,15 @@ export const CodeView = ({ block, editor }: CreateCodeView) => {
|
|||||||
onKeyDown={e => {
|
onKeyDown={e => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
}}
|
}}
|
||||||
|
onMouseEnter={() => {
|
||||||
|
isSelecting.current = false;
|
||||||
|
setShowOperationPanel(true);
|
||||||
|
}}
|
||||||
|
onMouseLeave={() => {
|
||||||
|
!isSelecting.current && setShowOperationPanel(false);
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<div className="operation">
|
<StyledOperationalPanel show={showOperationPanel}>
|
||||||
<div className="select">
|
<div className="select">
|
||||||
<Select
|
<Select
|
||||||
width={128}
|
width={128}
|
||||||
@@ -192,6 +210,9 @@ export const CodeView = ({ block, editor }: CreateCodeView) => {
|
|||||||
onChange={(selectedValue: string) => {
|
onChange={(selectedValue: string) => {
|
||||||
handleLangChange(selectedValue);
|
handleLangChange(selectedValue);
|
||||||
}}
|
}}
|
||||||
|
onListboxOpenChange={() => {
|
||||||
|
isSelecting.current = true;
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
{Object.keys(langs).map(item => {
|
{Object.keys(langs).map(item => {
|
||||||
return (
|
return (
|
||||||
@@ -208,7 +229,7 @@ export const CodeView = ({ block, editor }: CreateCodeView) => {
|
|||||||
Copy
|
Copy
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</StyledOperationalPanel>
|
||||||
|
|
||||||
<CodeMirror
|
<CodeMirror
|
||||||
ref={codeMirror}
|
ref={codeMirror}
|
||||||
|
|||||||
@@ -41,7 +41,14 @@ export const Select = forwardRef(function CustomSelect<TValue>(
|
|||||||
ref: ForwardedRef<HTMLUListElement>
|
ref: ForwardedRef<HTMLUListElement>
|
||||||
) {
|
) {
|
||||||
const [isOpen, setIsOpen] = useState(false);
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
const { width = '100%', style, listboxStyle, placeholder } = props;
|
const {
|
||||||
|
width = '100%',
|
||||||
|
style,
|
||||||
|
listboxStyle,
|
||||||
|
placeholder,
|
||||||
|
onListboxOpenChange,
|
||||||
|
onChange,
|
||||||
|
} = props;
|
||||||
const components: SelectUnstyledProps<TValue>['components'] = {
|
const components: SelectUnstyledProps<TValue>['components'] = {
|
||||||
// Root: generateStyledRoot({ width, ...style }),
|
// Root: generateStyledRoot({ width, ...style }),
|
||||||
Root: forwardRef((rootProps, rootRef) => {
|
Root: forwardRef((rootProps, rootRef) => {
|
||||||
@@ -80,14 +87,15 @@ export const Select = forwardRef(function CustomSelect<TValue>(
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<SelectUnstyled
|
<SelectUnstyled
|
||||||
listboxOpen={isOpen}
|
|
||||||
onListboxOpenChange={() => {
|
|
||||||
setIsOpen(true);
|
|
||||||
}}
|
|
||||||
{...props}
|
{...props}
|
||||||
|
listboxOpen={isOpen}
|
||||||
|
onListboxOpenChange={open => {
|
||||||
|
setIsOpen(open);
|
||||||
|
onListboxOpenChange?.(open);
|
||||||
|
}}
|
||||||
onChange={v => {
|
onChange={v => {
|
||||||
setIsOpen(false);
|
setIsOpen(false);
|
||||||
props.onChange && props.onChange(v);
|
onChange?.(v);
|
||||||
}}
|
}}
|
||||||
ref={ref}
|
ref={ref}
|
||||||
components={components}
|
components={components}
|
||||||
|
|||||||
Reference in New Issue
Block a user