diff --git a/src/components/CodeEmbed/index.jsx b/src/components/CodeEmbed/index.jsx index f2db3c0897..a6a2f63679 100644 --- a/src/components/CodeEmbed/index.jsx +++ b/src/components/CodeEmbed/index.jsx @@ -29,6 +29,7 @@ import { Icon } from "../Icon"; export const CodeEmbed = (props) => { const { ref: liveRegionRef, announce } = useLiveRegion(); const [rendered, setRendered] = useState(false); + const initialCode = props.initialValue ?? ""; // Source code from Google Docs sometimes uses a unicode non-breaking space // instead of a normal one, but these break the code frame, so we replace them here. @@ -54,6 +55,9 @@ export const CodeEmbed = (props) => { } const codeFrameRef = useRef(null); + const editorRef = useRef(null); + const isScrollable = props.scrollable ?? false; + const [hasScrollbar, setHasScrollbar] = useState(false); const updateOrReRun = () => { if (codeString === previewCodeString) { @@ -79,6 +83,18 @@ export const CodeEmbed = (props) => { } }, []); + // only observe scroll when scrollable + useEffect(() => { + if (!rendered || !isScrollable) return; + const scroller = editorRef.current?.querySelector(".cm-scroller"); + if (!scroller) return; + const observer = new ResizeObserver(() => { + setHasScrollbar(scroller.scrollHeight > scroller.clientHeight); + }); + observer.observe(scroller); + return () => observer.disconnect(); + }, [rendered, isScrollable]); + if (!rendered) return
; return ( @@ -125,11 +141,12 @@ export const CodeEmbed = (props) => { ) : null} -