fix: lang select in code block is insanity

This commit is contained in:
QiShaoXuan
2022-09-16 15:28:04 +08:00
parent 3ab0564272
commit b7b79b5494
2 changed files with 38 additions and 9 deletions

View File

@@ -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}

View File

@@ -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}