{"version":3,"file":"components/base/CodeViewer/index.mjs","sources":["../../../../src/components/base/CodeViewer/index.tsx"],"sourcesContent":["import { Editor, Monaco, OnMount } from '@monaco-editor/react';\nimport clsx from 'clsx';\nimport { editor } from 'monaco-editor';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { CodeViewerProps } from './interface';\nimport {\n  defineMonacoOptions,\n  editorShowRange,\n  getFileName,\n  getFilePathFormat,\n} from './utils';\n\nimport { Checkbox } from 'antd';\nimport styles from './index.module.scss';\nimport { Lodash } from '@rsdoctor/utils/common';\nimport { useTheme } from 'src/utils';\n\nexport function CodeViewer({\n  className,\n  style,\n  code = '',\n  lang,\n  filePath = '',\n  defaultLine,\n  ranges,\n  isEmbed = false,\n  headerVisible = true,\n  isLightTheme: isLightThemeProp,\n  formatOnMount = false,\n}: CodeViewerProps) {\n  const { isLight: isLightMode } = useTheme();\n  const isLightTheme: boolean = isLightThemeProp ?? isLightMode;\n  const editor = useRef<editor.IStandaloneCodeEditor>(undefined);\n  const monaco = useRef<Monaco>(undefined);\n  const language = useMemo(\n    () => lang || getFilePathFormat(filePath) || 'plaintext',\n    [lang, filePath],\n  );\n  const [isWordWrap, setIsWordWrap] = useState(true);\n  const options = useMemo(\n    () => defineMonacoOptions({ wordWrap: isWordWrap ? 'on' : 'off' }),\n    [isWordWrap],\n  );\n  const onEditorMount = useCallback<OnMount>(\n    (editorInstance, monacoVal) => {\n      editor.current = editorInstance;\n      monaco.current = monacoVal;\n\n      editorShowRange(editorInstance, monacoVal, ranges);\n      if (Lodash.isNumber(defaultLine)) {\n        setTimeout(() => {\n          editorInstance.revealLine(defaultLine);\n        });\n      }\n\n      if (formatOnMount) {\n        // Use Monaco's built-in formatter to format the whole document\n        setTimeout(() => {\n          editorInstance.getAction('editor.action.formatDocument')?.run();\n        }, 0);\n      }\n    },\n    [ranges, defaultLine, formatOnMount],\n  );\n\n  useEffect(\n    () => () => {\n      editor.current?.setModel(null);\n    },\n    [],\n  );\n\n  return (\n    <div\n      className={clsx(\n        'monaco-component',\n        'code-viewer',\n        styles['code-viewer'],\n        isEmbed && styles['embed'],\n        className,\n      )}\n      style={style}\n    >\n      {headerVisible && Boolean(filePath) && (\n        <div className={styles['header']}>\n          <div>{getFileName(filePath)}</div>\n          <div style={{ flex: 1 }} />\n          <div>\n            <Checkbox\n              className={styles['text']}\n              title=\"side-by-side\"\n              checked={isWordWrap}\n              onChange={(evt) => {\n                setIsWordWrap(evt.target.checked);\n              }}\n            >\n              word-wrap\n            </Checkbox>\n          </div>\n        </div>\n      )}\n      <div className={clsx(styles['content'], 'editor-wrap')}>\n        <Editor\n          theme={isLightTheme ? 'vs-light' : 'vs-dark'}\n          language={language}\n          value={code}\n          options={options}\n          onMount={onEditorMount}\n        />\n      </div>\n    </div>\n  );\n}\n\nexport type { CodeViewerProps } from './interface';\nexport { useCodeDrawer } from './useCodeDrawer';\nexport { defineMonacoOptions } from './utils';\n"],"names":["CodeViewer","className","style","code","lang","filePath","defaultLine","ranges","isEmbed","headerVisible","isLightThemeProp","formatOnMount","isLightMode","useTheme","isLightTheme","editor","useRef","undefined","monaco","language","useMemo","getFilePathFormat","isWordWrap","setIsWordWrap","useState","options","defineMonacoOptions","onEditorMount","useCallback","editorInstance","monacoVal","editorShowRange","Lodash","setTimeout","useEffect","clsx","styles","Boolean","getFileName","Checkbox","evt","Editor"],"mappings":";;;;;;;;;AAiBO,SAASA,WAAW,EACzBC,SAAS,EACTC,KAAK,EACLC,OAAO,EAAE,EACTC,IAAI,EACJC,WAAW,EAAE,EACbC,WAAW,EACXC,MAAM,EACNC,UAAU,KAAK,EACfC,gBAAgB,IAAI,EACpB,cAAcC,gBAAgB,EAC9BC,gBAAgB,KAAK,EACL;IAChB,MAAM,EAAE,SAASC,WAAW,EAAE,GAAGC;IACjC,MAAMC,eAAwBJ,oBAAoBE;IAClD,MAAMG,SAASC,OAAqCC;IACpD,MAAMC,SAASF,OAAeC;IAC9B,MAAME,WAAWC,QACf,IAAMhB,QAAQiB,kBAAkBhB,aAAa,aAC7C;QAACD;QAAMC;KAAS;IAElB,MAAM,CAACiB,YAAYC,cAAc,GAAGC,SAAS;IAC7C,MAAMC,UAAUL,QACd,IAAMM,oBAAoB;YAAE,UAAUJ,aAAa,OAAO;QAAM,IAChE;QAACA;KAAW;IAEd,MAAMK,gBAAgBC,YACpB,CAACC,gBAAgBC;QACff,OAAO,OAAO,GAAGc;QACjBX,OAAO,OAAO,GAAGY;QAEjBC,gBAAgBF,gBAAgBC,WAAWvB;QAC3C,IAAIyB,OAAO,QAAQ,CAAC1B,cAClB2B,WAAW;YACTJ,eAAe,UAAU,CAACvB;QAC5B;QAGF,IAAIK,eAEFsB,WAAW;YACTJ,eAAe,SAAS,CAAC,iCAAiC;QAC5D,GAAG;IAEP,GACA;QAACtB;QAAQD;QAAaK;KAAc;IAGtCuB,UACE,IAAM;YACJnB,OAAO,OAAO,EAAE,SAAS;QAC3B,GACA,EAAE;IAGJ,OAAO,WAAP,GACE,KAAC;QACC,WAAWoB,KACT,oBACA,eACAC,YAAAA,CAAAA,cAAqB,EACrB5B,WAAW4B,aAAAA,KAAe,EAC1BnC;QAEF,OAAOC;;YAENO,iBAAiB4B,QAAQhC,aAAa,WAAbA,GACxB,KAAC;gBAAI,WAAW+B,aAAAA,MAAgB;;kCAC9B,IAAC;kCAAKE,YAAYjC;;kCAClB,IAAC;wBAAI,OAAO;4BAAE,MAAM;wBAAE;;kCACtB,IAAC;kCACC,kBAACkC,UAAQA;4BACP,WAAWH,aAAAA,IAAc;4BACzB,OAAM;4BACN,SAASd;4BACT,UAAU,CAACkB;gCACTjB,cAAciB,IAAI,MAAM,CAAC,OAAO;4BAClC;sCACD;;;;;0BAMP,IAAC;gBAAI,WAAWL,KAAKC,aAAAA,OAAiB,EAAE;0BACtC,kBAACK,QAAMA;oBACL,OAAO3B,eAAe,aAAa;oBACnC,UAAUK;oBACV,OAAOhB;oBACP,SAASsB;oBACT,SAASE;;;;;AAKnB"}