UNPKG

analytica-frontend-lib

Version:

Repositório público dos componentes utilizados nas plataformas da Analytica Ensino

1 lines 7.59 kB
{"version":3,"sources":["../src/components/RichEditor/RichEditor.tsx"],"sourcesContent":["import { lazy, Suspense, Component, ReactNode } from 'react';\n\n// Lazy load the editor core to catch missing dependencies\nconst RichEditorCore = lazy(() =>\n import('./RichEditorCore').then((module) => ({\n default: module.RichEditor,\n }))\n);\n\ninterface RichEditorProps {\n readonly content?: string;\n readonly onChange?: (data: { json: object; html: string }) => void;\n readonly placeholder?: string;\n /**\n * Optional callback to generate LaTeX using AI\n * If provided, the AI generation feature will be enabled in the formula dialog\n * @param description - Natural language description of the formula\n * @returns Promise resolving to the LaTeX string\n */\n readonly onGenerateLatexWithAI?: (description: string) => Promise<string>;\n /**\n * Optional callback to upload an image file and get back its public URL.\n * If provided, the file upload tab is enabled in the image dialog; otherwise\n * images can still be inserted by URL.\n * @param file - The image file selected by the user\n * @returns Promise resolving to the public URL of the uploaded image\n */\n readonly onUploadImage?: (file: File) => Promise<string>;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback: (error: Error) => ReactNode;\n}\n\nclass RichEditorErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n render() {\n if (this.state.hasError && this.state.error) {\n return this.props.fallback(this.state.error);\n }\n return this.props.children;\n }\n}\n\nconst TIPTAP_DEPENDENCIES = [\n '@tiptap/react',\n '@tiptap/core',\n '@tiptap/starter-kit',\n '@tiptap/extension-underline',\n '@tiptap/extension-text-align',\n '@tiptap/extension-color',\n '@tiptap/extension-text-style',\n '@tiptap/extension-highlight',\n '@tiptap/extension-subscript',\n '@tiptap/extension-superscript',\n '@tiptap/extension-link',\n '@tiptap/extension-placeholder',\n '@tiptap/extension-image',\n];\n\nfunction MissingDependenciesError({ error }: { readonly error: Error }) {\n const isTiptapError =\n error.message.includes('@tiptap') ||\n error.message.includes(\"Cannot find module '@tiptap\");\n\n const installCommand = `yarn add ${TIPTAP_DEPENDENCIES.join(' ')}`;\n const npmCommand = `npm install ${TIPTAP_DEPENDENCIES.join(' ')}`;\n\n return (\n <div className=\"border border-red-200 rounded-xl overflow-hidden bg-red-50 p-6\">\n <div className=\"flex items-start gap-3\">\n <div className=\"shrink-0 w-10 h-10 bg-red-100 rounded-full flex items-center justify-center\">\n <svg\n className=\"w-5 h-5 text-red-600\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n </div>\n <div className=\"flex-1\">\n <h3 className=\"text-lg font-semibold text-red-800 mb-2\">\n {isTiptapError\n ? 'Dependências do TipTap não encontradas'\n : 'Erro ao carregar o RichEditor'}\n </h3>\n <p className=\"text-red-700 text-sm mb-4\">\n {isTiptapError\n ? 'O componente RichEditor requer as dependências do TipTap para funcionar. Instale-as executando um dos comandos abaixo:'\n : error.message}\n </p>\n {isTiptapError && (\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-xs text-red-600 font-medium mb-1\">\n Usando Yarn:\n </p>\n <code className=\"block bg-red-100 text-red-800 px-3 py-2 rounded text-xs font-mono overflow-x-auto\">\n {installCommand}\n </code>\n </div>\n <div>\n <p className=\"text-xs text-red-600 font-medium mb-1\">\n Usando NPM:\n </p>\n <code className=\"block bg-red-100 text-red-800 px-3 py-2 rounded text-xs font-mono overflow-x-auto\">\n {npmCommand}\n </code>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction LoadingFallback() {\n return (\n <div className=\"border border-border-200 rounded-xl overflow-hidden bg-background-0 animate-pulse\">\n <div className=\"h-10 bg-background-100 border-b border-border-200\" />\n <div className=\"h-32 bg-background-50\" />\n <div className=\"h-8 bg-background-100 border-t border-border-200\" />\n </div>\n );\n}\n\nexport function RichEditor(props: RichEditorProps) {\n return (\n <RichEditorErrorBoundary fallback={MissingDependenciesErrorFallback}>\n <Suspense fallback={<LoadingFallback />}>\n <RichEditorCore {...props} />\n </Suspense>\n </RichEditorErrorBoundary>\n );\n}\n\nfunction MissingDependenciesErrorFallback(error: Readonly<Error>) {\n return <MissingDependenciesError error={error} />;\n}\n"],"mappings":";AAAA,SAAS,MAAM,UAAU,iBAA4B;AA+FzC,cAqBE,YArBF;AA5FZ,IAAM,iBAAiB;AAAA,EAAK,MAC1B,OAAO,+BAAkB,EAAE,KAAK,CAAC,YAAY;AAAA,IAC3C,SAAS,OAAO;AAAA,EAClB,EAAE;AACJ;AAiCA,IAAM,0BAAN,cAAsC,UAGpC;AAAA,EACA,YAAY,OAA2B;AACrC,UAAM,KAAK;AACX,SAAK,QAAQ,EAAE,UAAU,OAAO,OAAO,KAAK;AAAA,EAC9C;AAAA,EAEA,OAAO,yBAAyB,OAAkC;AAChE,WAAO,EAAE,UAAU,MAAM,MAAM;AAAA,EACjC;AAAA,EAEA,SAAS;AACP,QAAI,KAAK,MAAM,YAAY,KAAK,MAAM,OAAO;AAC3C,aAAO,KAAK,MAAM,SAAS,KAAK,MAAM,KAAK;AAAA,IAC7C;AACA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;AAEA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,yBAAyB,EAAE,MAAM,GAA8B;AACtE,QAAM,gBACJ,MAAM,QAAQ,SAAS,SAAS,KAChC,MAAM,QAAQ,SAAS,6BAA6B;AAEtD,QAAM,iBAAiB,YAAY,oBAAoB,KAAK,GAAG,CAAC;AAChE,QAAM,aAAa,eAAe,oBAAoB,KAAK,GAAG,CAAC;AAE/D,SACE,oBAAC,SAAI,WAAU,kEACb,+BAAC,SAAI,WAAU,0BACb;AAAA,wBAAC,SAAI,WAAU,+EACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,QAAO;AAAA,QAEP;AAAA,UAAC;AAAA;AAAA,YACC,eAAc;AAAA,YACd,gBAAe;AAAA,YACf,aAAa;AAAA,YACb,GAAE;AAAA;AAAA,QACJ;AAAA;AAAA,IACF,GACF;AAAA,IACA,qBAAC,SAAI,WAAU,UACb;AAAA,0BAAC,QAAG,WAAU,2CACX,0BACG,iDACA,iCACN;AAAA,MACA,oBAAC,OAAE,WAAU,6BACV,0BACG,8HACA,MAAM,SACZ;AAAA,MACC,iBACC,qBAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SACC;AAAA,8BAAC,OAAE,WAAU,yCAAwC,0BAErD;AAAA,UACA,oBAAC,UAAK,WAAU,qFACb,0BACH;AAAA,WACF;AAAA,QACA,qBAAC,SACC;AAAA,8BAAC,OAAE,WAAU,yCAAwC,yBAErD;AAAA,UACA,oBAAC,UAAK,WAAU,qFACb,sBACH;AAAA,WACF;AAAA,SACF;AAAA,OAEJ;AAAA,KACF,GACF;AAEJ;AAEA,SAAS,kBAAkB;AACzB,SACE,qBAAC,SAAI,WAAU,qFACb;AAAA,wBAAC,SAAI,WAAU,qDAAoD;AAAA,IACnE,oBAAC,SAAI,WAAU,yBAAwB;AAAA,IACvC,oBAAC,SAAI,WAAU,oDAAmD;AAAA,KACpE;AAEJ;AAEO,SAAS,WAAW,OAAwB;AACjD,SACE,oBAAC,2BAAwB,UAAU,kCACjC,8BAAC,YAAS,UAAU,oBAAC,mBAAgB,GACnC,8BAAC,kBAAgB,GAAG,OAAO,GAC7B,GACF;AAEJ;AAEA,SAAS,iCAAiC,OAAwB;AAChE,SAAO,oBAAC,4BAAyB,OAAc;AACjD;","names":[]}