[web] open comments and changes via url (#36546)

* [web] open a comment from a URL

* [web] add "View comment" button to digest email

* [web] open a tracked change from a URL

* [web] add "View suggestion" button to digest email

* [web] open the review panel from an open=review-panel URL

* [web] drop the digest email CTA and collapse the deep links to t=review

* [web] add an Open project button to the section overflow row and plain-text view links

* [web] validate the comment and change deep-link ids as object ids

* [web] collapse the deep-link resolvers into a single DeepLink component

* fix: scrolling into view when below the fold

* fix: address claude review

* fix: style adjustments

* fix: updating types to accomodate accepted/rejected changes

---------

Co-authored-by: Jimmy Domagala-Tang <jimmy.domagala-tang@overleaf.com>
GitOrigin-RevId: dab535591a93e1c3849a6b2a0dcc3e3934354385
This commit is contained in:
Kristina
2026-09-17 12:07:22 +00:00
committed by Copybot
co-authored by Jimmy Domagala-Tang
parent 5dc8c2b0c3
commit 44910202f3
15 changed files with 977 additions and 91 deletions
@@ -0,0 +1,35 @@
import { GlobalToastGeneratorEntry } from '@/features/ide-react/components/global-toasts'
import { useTranslation } from 'react-i18next'
const COMMENT_NOT_FOUND_KEY = 'comment:not-found'
export const CommentNotFoundToast = () => {
const { t } = useTranslation()
return <span>{t('comment_not_found')}</span>
}
const generators: GlobalToastGeneratorEntry[] = [
{
key: COMMENT_NOT_FOUND_KEY,
generator: () => ({
content: <CommentNotFoundToast />,
type: 'warning',
autoHide: true,
delay: 4000,
isDismissible: true,
}),
},
]
export default generators
export const showCommentNotFoundToast = () => {
window.dispatchEvent(
new CustomEvent('ide:show-toast', {
detail: {
key: COMMENT_NOT_FOUND_KEY,
},
})
)
}
@@ -8,6 +8,7 @@ import { OLToastContainer } from '@/shared/components/ol/ol-toast-container'
import clipboardToastGenerators from '@/features/source-editor/components/clipboard-toasts'
import exportDocumentToastGenerators from '@/features/ide-react/components/toolbar/export-document-toasts'
import connectionRestoredToastGenerators from '@/features/ide-react/components/connection-restored-toast'
import deepLinkToastGenerators from '@/features/ide-react/components/deep-link-toasts'
const moduleGeneratorsImport = importOverleafModules('toastGenerators') as {
import: { default: GlobalToastGeneratorEntry[] }
@@ -31,6 +32,7 @@ const GENERATOR_LIST: GlobalToastGeneratorEntry[] = [
...clipboardToastGenerators,
...exportDocumentToastGenerators,
...connectionRestoredToastGenerators,
...deepLinkToastGenerators,
]
const GENERATOR_MAP: Map<string, GlobalToastGenerator> = new Map(
GENERATOR_LIST.map(({ key, generator }) => [key, generator])