1- import { Box , Button , HStack , Input , Text , VStack } from '@chakra-ui/react' ;
2- import { MDXEditor } from '@mdxeditor/editor' ;
3- import { ALL_PLUGINS } from './AllPlugins' ;
1+ import {
2+ Box ,
3+ Button ,
4+ Divider ,
5+ HStack ,
6+ Input ,
7+ Radio ,
8+ RadioGroup ,
9+ Text ,
10+ Textarea ,
11+ VStack ,
12+ } from '@chakra-ui/react' ;
413import '@mdxeditor/editor/style.css' ;
5- import { ArticleCard , useCursor } from '@components' ;
14+ import { ArticleCard , MdPreview , useCursor } from '@components' ;
615import { useCallback , useLayoutEffect , useState } from 'react' ;
716import { ARTICLE_DEFAULT } from './constants' ;
817import { ArticleWithContent } from './types' ;
918import { getRequestObject , isValidArticle } from './utils' ;
10- import { useAddArticle , useGetEditorArticleData } from '@services' ;
11- import ArticlePreviewDrawer from './ArticlePreviewDrawar' ;
19+ import {
20+ useAddArticle ,
21+ useGetEditorArticleData ,
22+ useUpdateArticle ,
23+ } from '@services' ;
1224
1325const ArticleEditor = ( ) => {
1426 const { setCursorType } = useCursor ( ) ;
1527 const [ articleKey , setArticleKey ] = useState < string > ( '' ) ;
28+ const [ articleType , setArticleType ] = useState < 'New' | 'Update' > ( 'New' ) ;
1629 const [ queryArticleKey , setQueryArticleKey ] = useState < string > ( '' ) ;
1730 const [ state , setState ] = useState < ArticleWithContent > ( ARTICLE_DEFAULT ) ;
1831 const { data, isPending } = useGetEditorArticleData ( queryArticleKey ) ;
19- const { mutate } = useAddArticle ( ) ;
32+ const { mutate : addArticleMutation } = useAddArticle ( ) ;
33+ const { mutate : updateArticleMutation } = useUpdateArticle ( ) ;
2034
2135 useLayoutEffect ( ( ) => {
2236 setCursorType ( 'none' ) ;
2337 } , [ setCursorType ] ) ;
2438
2539 const onSubmit = useCallback ( ( ) => {
26- mutate ( getRequestObject ( state ) ) ;
27- console . log ( 'Submitting article' , state ) ;
28- } , [ mutate , state ] ) ;
40+ console . log ( 'State' , articleType ) ;
41+
42+ if ( articleType === 'New' ) {
43+ addArticleMutation ( getRequestObject ( state ) ) ;
44+ return ;
45+ }
46+
47+ updateArticleMutation ( getRequestObject ( state ) ) ;
48+ } , [ addArticleMutation , articleType , state , updateArticleMutation ] ) ;
2949
3050 useLayoutEffect ( ( ) => {
3151 if ( data ) {
32- console . log ( 'Data' , ( data as any ) ?. data . rows [ 0 ] ) ;
33- console . log ( 'state' , state ) ;
34- setState ( ( data as any ) ?. data . rows [ 0 ] ) ;
52+ const dataFromReq = ( data as any ) ?. data . rows [ 0 ] ;
53+ setState ( { ... dataFromReq , author : JSON . parse ( dataFromReq . author ) . name } ) ;
54+ setQueryArticleKey ( '' ) ;
3555 }
3656 } , [ data , state ] ) ;
3757
@@ -55,6 +75,15 @@ const ArticleEditor = () => {
5575 >
5676 Article editor
5777 </ Text >
78+ < RadioGroup
79+ value = { articleType }
80+ onChange = { ( value ) => {
81+ setArticleType ( value as 'New' | 'Update' ) ;
82+ } }
83+ >
84+ < Radio value = "New" > New Article</ Radio >
85+ < Radio value = "Update" > Update Article</ Radio >
86+ </ RadioGroup >
5887 < Button
5988 onClick = { ( ) => {
6089 setState ( ARTICLE_DEFAULT ) ;
@@ -144,7 +173,7 @@ const ArticleEditor = () => {
144173 onClick = { onSubmit }
145174 isDisabled = { ! isValidArticle ( state ) }
146175 >
147- Submit Article
176+ { articleType === 'New' ? ' Submit' : 'Update' } Article
148177 </ Button >
149178 </ VStack >
150179 < VStack borderLeft = { '1px solid gray' } p = { 1 } >
@@ -165,29 +194,38 @@ const ArticleEditor = () => {
165194 < ArticleCard { ...state } />
166195 </ VStack >
167196 </ HStack >
168- < Box w = { '100%' } h = { '100%' } borderRadius = { 'md' } >
169- < ArticlePreviewDrawer mdString = { state . md_data } />
170- </ Box >
197+ < Divider />
198+ < Text fontSize = { 'xl' } fontWeight = { 'bold' } color = { 'white' } >
199+ Article Content
200+ </ Text >
171201 < HStack
172202 width = { '100%' }
203+ height = { '100%' }
173204 border = { '1px solid white' }
174205 borderRadius = { 'md' }
175206 p = { 2 }
176207 className = " min-h-[100vh]"
177208 align = { 'start' }
178209 >
179- < MDXEditor
180- className = "bg-white"
181- markdown = { state . md_data }
182- plugins = { ALL_PLUGINS }
183- spellCheck = { true }
184- contentEditableClassName = "min-h-[100vh] px-6 py-6 prose"
185- onChange = { ( md ) => {
210+ < Box
211+ w = { '50%' }
212+ height = { '100%' }
213+ minH = { '100vh' }
214+ borderRight = { '1px solid white' }
215+ >
216+ < MdPreview mdString = { state . md_data } />
217+ </ Box >
218+ < Textarea
219+ w = { '50%' }
220+ h = { '100%' }
221+ minH = { '100vh' }
222+ value = { state . md_data }
223+ onChange = { ( e ) =>
186224 setState ( ( prev ) => ( {
187225 ...prev ,
188- md_data : md ,
189- } ) ) ;
190- } }
226+ md_data : e . target . value ,
227+ } ) )
228+ }
191229 />
192230 </ HStack >
193231 </ VStack >
0 commit comments