From e3e132967da13dacaea753882478dc9aa7393714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Ctan-nhu=E2=80=9D?= <“tan@harness.io”> Date: Mon, 1 May 2023 15:26:37 -0700 Subject: [PATCH 1/2] feat: Implement Editor dirty check when moving away from pages --- .../ReviewDecisionButton.tsx | 241 +++++++++--------- web/src/components/CommentBox/CommentBox.tsx | 23 +- web/src/components/DiffViewer/DiffViewer.tsx | 4 + .../MarkdownEditorWithPreview.tsx | 10 + .../NavigationCheck.module.scss | 7 + .../NavigationCheck.module.scss.d.ts | 6 + .../NavigationCheck/NavigationCheck.tsx | 56 ++++ .../MonacoSourceCodeEditor.tsx | 2 +- web/src/framework/strings/stringTypes.ts | 4 + web/src/i18n/strings.en.yaml | 5 + .../PullRequest/Conversation/Conversation.tsx | 6 + .../Conversation/DescriptionBox.tsx | 5 +- .../FileEditor/FileEditor.tsx | 8 +- 13 files changed, 254 insertions(+), 123 deletions(-) create mode 100644 web/src/components/NavigationCheck/NavigationCheck.module.scss create mode 100644 web/src/components/NavigationCheck/NavigationCheck.module.scss.d.ts create mode 100644 web/src/components/NavigationCheck/NavigationCheck.tsx diff --git a/web/src/components/Changes/ReviewDecisionButton/ReviewDecisionButton.tsx b/web/src/components/Changes/ReviewDecisionButton/ReviewDecisionButton.tsx index 1c1160b23..b6f9dd3e8 100644 --- a/web/src/components/Changes/ReviewDecisionButton/ReviewDecisionButton.tsx +++ b/web/src/components/Changes/ReviewDecisionButton/ReviewDecisionButton.tsx @@ -1,124 +1,127 @@ -import React, { useCallback, useEffect, useState } from 'react' -import { Radio, RadioGroup, ButtonVariation, Button, Container, Layout, ButtonSize, useToaster } from '@harness/uicore' -import { Render } from 'react-jsx-match' -import { useMutate } from 'restful-react' -import cx from 'classnames' -import { useStrings } from 'framework/strings' -import type { GitInfoProps } from 'utils/GitUtils' -import type { TypesPullReq } from 'services/code' -import { getErrorMessage } from 'utils/Utils' -import { MarkdownEditorWithPreview } from 'components/MarkdownEditorWithPreview/MarkdownEditorWithPreview' -import css from './ReviewDecisionButton.module.scss' +// import React, { useCallback, useEffect, useState } from 'react' +// import { Radio, RadioGroup, ButtonVariation, Button, Container, Layout, ButtonSize, useToaster } from '@harness/uicore' +// import { Render } from 'react-jsx-match' +// import { useMutate } from 'restful-react' +// import cx from 'classnames' +// import { useStrings } from 'framework/strings' +// import type { GitInfoProps } from 'utils/GitUtils' +// import type { TypesPullReq } from 'services/code' +// import { getErrorMessage } from 'utils/Utils' +// import { MarkdownEditorWithPreview } from 'components/MarkdownEditorWithPreview/MarkdownEditorWithPreview' +// import css from './ReviewDecisionButton.module.scss' -enum PullReqReviewDecision { - REVIEWED = 'reviewed', - APPROVED = 'approved', - CHANGEREQ = 'changereq' -} +// enum PullReqReviewDecision { +// REVIEWED = 'reviewed', +// APPROVED = 'approved', +// CHANGEREQ = 'changereq' +// } -interface ReviewDecisionButtonProps extends Pick { - shouldHide: boolean - pullRequestMetadata?: TypesPullReq -} +// interface ReviewDecisionButtonProps extends Pick { +// shouldHide: boolean +// pullRequestMetadata?: TypesPullReq +// } -export const ReviewDecisionButton: React.FC = ({ - repoMetadata, - pullRequestMetadata, - shouldHide -}) => { - const { getString } = useStrings() - const { showError, showSuccess } = useToaster() - const [comment, setComment] = useState('') - const [reset, setReset] = useState(false) - const [decision, setDecision] = useState(PullReqReviewDecision.REVIEWED) - const { mutate, loading } = useMutate({ - verb: 'POST', - path: `/api/v1/repos/${repoMetadata.path}/+/pullreq/${pullRequestMetadata?.number}/reviews` - }) - const submitReview = useCallback(() => { - mutate({ decision, message: comment }) - .then(() => { - setReset(true) - showSuccess(getString('pr.reviewSubmitted')) - }) - .catch(exception => showError(getErrorMessage(exception))) - }, [comment, decision, mutate, showError, showSuccess, getString]) +// /** +// * @deprecated +// */ +// export const ReviewDecisionButton: React.FC = ({ +// repoMetadata, +// pullRequestMetadata, +// shouldHide +// }) => { +// const { getString } = useStrings() +// const { showError, showSuccess } = useToaster() +// const [comment, setComment] = useState('') +// const [reset, setReset] = useState(false) +// const [decision, setDecision] = useState(PullReqReviewDecision.REVIEWED) +// const { mutate, loading } = useMutate({ +// verb: 'POST', +// path: `/api/v1/repos/${repoMetadata.path}/+/pullreq/${pullRequestMetadata?.number}/reviews` +// }) +// const submitReview = useCallback(() => { +// mutate({ decision, message: comment }) +// .then(() => { +// setReset(true) +// showSuccess(getString('pr.reviewSubmitted')) +// }) +// .catch(exception => showError(getErrorMessage(exception))) +// }, [comment, decision, mutate, showError, showSuccess, getString]) - useEffect(() => { - let timeoutId = 0 - if (reset) { - timeoutId = window.setTimeout(() => setReset(false)) - } - return () => window.clearTimeout(timeoutId) - }, [reset]) +// useEffect(() => { +// let timeoutId = 0 +// if (reset) { +// timeoutId = window.setTimeout(() => setReset(false)) +// } +// return () => window.clearTimeout(timeoutId) +// }, [reset]) - return ( -