mirror of
https://github.com/harness/drone.git
synced 2025-05-10 01:13:36 +08:00
90 lines
3.3 KiB
TypeScript
90 lines
3.3 KiB
TypeScript
import React, { useState } from 'react'
|
|
import { Container, useToaster } from '@harness/uicore'
|
|
import cx from 'classnames'
|
|
import { useMutate } from 'restful-react'
|
|
import { MarkdownViewer } from 'components/MarkdownViewer/MarkdownViewer'
|
|
import { useStrings } from 'framework/strings'
|
|
import type { OpenapiUpdatePullReqRequest } from 'services/code'
|
|
import { OptionsMenuButton } from 'components/OptionsMenuButton/OptionsMenuButton'
|
|
import { MarkdownEditorWithPreview } from 'components/MarkdownEditorWithPreview/MarkdownEditorWithPreview'
|
|
import { getErrorMessage } from 'utils/Utils'
|
|
import type { ConversationProps } from './Conversation'
|
|
import css from './Conversation.module.scss'
|
|
|
|
export const DescriptionBox: React.FC<ConversationProps> = ({
|
|
repoMetadata,
|
|
pullRequestMetadata,
|
|
onCommentUpdate: refreshPullRequestMetadata
|
|
}) => {
|
|
const [edit, setEdit] = useState(false)
|
|
// const [updated, setUpdated] = useState(pullRequestMetadata.edited as number)
|
|
const [originalContent, setOriginalContent] = useState(pullRequestMetadata.description as string)
|
|
const [content, setContent] = useState(originalContent)
|
|
const { getString } = useStrings()
|
|
const { showError } = useToaster()
|
|
const { mutate } = useMutate({
|
|
verb: 'PATCH',
|
|
path: `/api/v1/repos/${repoMetadata.path}/+/pullreq/${pullRequestMetadata.number}`
|
|
})
|
|
|
|
return (
|
|
<Container className={cx({ [css.box]: !edit, [css.desc]: !edit })}>
|
|
<Container padding={!edit ? { left: 'small', bottom: 'small' } : undefined}>
|
|
{(edit && (
|
|
<MarkdownEditorWithPreview
|
|
value={content}
|
|
onSave={value => {
|
|
const payload: OpenapiUpdatePullReqRequest = {
|
|
title: pullRequestMetadata.title,
|
|
description: value
|
|
}
|
|
mutate(payload)
|
|
.then(() => {
|
|
setContent(value)
|
|
setOriginalContent(value)
|
|
setEdit(false)
|
|
// setUpdated(Date.now())
|
|
refreshPullRequestMetadata()
|
|
})
|
|
.catch(exception => showError(getErrorMessage(exception), 0, getString('pr.failedToUpdate')))
|
|
}}
|
|
onCancel={() => {
|
|
setContent(originalContent)
|
|
setEdit(false)
|
|
}}
|
|
i18n={{
|
|
placeHolder: getString('pr.enterDesc'),
|
|
tabEdit: getString('write'),
|
|
tabPreview: getString('preview'),
|
|
save: getString('save'),
|
|
cancel: getString('cancel')
|
|
}}
|
|
editorHeight="400px"
|
|
/>
|
|
)) || (
|
|
<Container className={css.mdWrapper}>
|
|
<MarkdownViewer source={content} getString={getString} />
|
|
<Container className={css.menuWrapper}>
|
|
<OptionsMenuButton
|
|
isDark={true}
|
|
icon="Options"
|
|
iconProps={{ size: 14 }}
|
|
style={{ padding: '5px' }}
|
|
items={[
|
|
{
|
|
text: getString('edit'),
|
|
className: css.optionMenuIcon,
|
|
hasIcon: true,
|
|
iconName: 'Edit',
|
|
onClick: () => setEdit(true)
|
|
}
|
|
]}
|
|
/>
|
|
</Container>
|
|
</Container>
|
|
)}
|
|
</Container>
|
|
</Container>
|
|
)
|
|
}
|