diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json index c8d7e350fb..6797120695 100644 --- a/services/web/frontend/extracted-translations.json +++ b/services/web/frontend/extracted-translations.json @@ -20,6 +20,7 @@ "accept": "", "accept_all": "", "accept_and_continue": "", + "accept_change": "", "accept_invitation": "", "accept_or_reject_each_changes_individually": "", "accept_terms_and_conditions": "", @@ -281,6 +282,10 @@ "delete_authentication_token": "", "delete_authentication_token_info": "", "delete_certificate": "", + "delete_comment": "", + "delete_comment_message": "", + "delete_comment_thread": "", + "delete_comment_thread_message": "", "delete_figure": "", "delete_projects": "", "delete_row_or_column": "", @@ -822,6 +827,7 @@ "more": "", "more_actions": "", "more_info": "", + "more_options": "", "more_options_for_border_settings_coming_soon": "", "my_library": "", "n_items": "", @@ -1080,6 +1086,7 @@ "regards": "", "reject": "", "reject_all": "", + "reject_change": "", "relink_your_account": "", "reload_editor": "", "remind_before_trial_ends": "", @@ -1118,6 +1125,7 @@ "resending_confirmation_email": "", "resize": "", "resolve": "", + "resolve_comment": "", "resolved_comments": "", "restore": "", "restore_file": "", @@ -1242,6 +1250,7 @@ "show_in_pdf": "", "show_less": "", "show_local_file_contents": "", + "show_more": "", "show_outline": "", "show_x_more_projects": "", "showing_1_result": "", @@ -1479,6 +1488,7 @@ "track_any_change_in_real_time": "", "track_changes": "", "track_changes_for_everyone": "", + "track_changes_for_guests": "", "track_changes_for_x": "", "track_changes_is_off": "", "track_changes_is_on": "", diff --git a/services/web/frontend/js/features/chat/components/chat-pane.tsx b/services/web/frontend/js/features/chat/components/chat-pane.tsx index 6f812b1c77..d9cb21f8f5 100644 --- a/services/web/frontend/js/features/chat/components/chat-pane.tsx +++ b/services/web/frontend/js/features/chat/components/chat-pane.tsx @@ -67,7 +67,7 @@ const ChatPane = React.memo(function ChatPane() { throw error } - if (!user) { + if (!user?.id) { return null } if (!chatOpenedOnce) { diff --git a/services/web/frontend/js/features/history/components/change-list/all-history-list.tsx b/services/web/frontend/js/features/history/components/change-list/all-history-list.tsx index a2ded4fcc6..6cc979685b 100644 --- a/services/web/frontend/js/features/history/components/change-list/all-history-list.tsx +++ b/services/web/frontend/js/features/history/components/change-list/all-history-list.tsx @@ -225,7 +225,7 @@ function AllHistoryList() { showDivider={showDivider} setSelection={setSelection} selectionState={selectionState} - currentUserId={currentUserId} + currentUserId={currentUserId!} selectable={selectable} projectId={projectId} setActiveDropdownItem={setActiveDropdownItem} diff --git a/services/web/frontend/js/features/history/components/change-list/labels-list.tsx b/services/web/frontend/js/features/history/components/change-list/labels-list.tsx index 17935beef0..90793690eb 100644 --- a/services/web/frontend/js/features/history/components/change-list/labels-list.tsx +++ b/services/web/frontend/js/features/history/components/change-list/labels-list.tsx @@ -33,7 +33,7 @@ function LabelsList() { key={version} labels={labels} version={version} - currentUserId={currentUserId} + currentUserId={currentUserId!} projectId={projectId} selectionState={selectionState} selectable={selectionState !== 'selected'} diff --git a/services/web/frontend/js/features/ide-react/context/review-panel/hooks/use-review-panel-state.ts b/services/web/frontend/js/features/ide-react/context/review-panel/hooks/use-review-panel-state.ts index 3c066d8d21..c21bc5a08c 100644 --- a/services/web/frontend/js/features/ide-react/context/review-panel/hooks/use-review-panel-state.ts +++ b/services/web/frontend/js/features/ide-react/context/review-panel/hooks/use-review-panel-state.ts @@ -282,7 +282,7 @@ function useReviewPanelState(): ReviewPanel.ReviewPanelState { const tempUsers = {} as ReviewPanel.Value<'users'> // Always include ourself, since if we submit an op, we might need to display info // about it locally before it has been flushed through the server - if (user) { + if (user?.id) { tempUsers[user.id] = formatUser(user) } @@ -724,7 +724,7 @@ function useReviewPanelState(): ReviewPanel.ReviewPanelState { ) const applyTrackChangesStateToClient = useCallback( - (state: boolean | ReviewPanel.Value<'trackChangesState'>) => { + (state: boolean | Record) => { if (typeof state === 'boolean') { setEveryoneTCState(state) setGuestsTCState(state) @@ -1189,8 +1189,8 @@ function useReviewPanelState(): ReviewPanel.ReviewPanelState { // listen for events from the CodeMirror 6 track changes extension useEffect(() => { const toggleTrackChangesFromKbdShortcut = () => { - if (trackChangesVisible && trackChanges) { - const userId: UserId = user.id + const userId = user.id + if (trackChangesVisible && trackChanges && userId) { const state = trackChangesState[userId] if (state) { toggleTrackChangesForUser(!state.value, userId) diff --git a/services/web/frontend/js/features/ide-react/context/review-panel/review-panel-provider.tsx b/services/web/frontend/js/features/ide-react/context/review-panel/review-panel-provider.tsx deleted file mode 100644 index 611ed0cb35..0000000000 --- a/services/web/frontend/js/features/ide-react/context/review-panel/review-panel-provider.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import useReviewPanelState from '@/features/ide-react/context/review-panel/hooks/use-review-panel-state' -import { - ReviewPanelUpdaterFnsContext, - ReviewPanelValueContext, -} from '@/features/source-editor/context/review-panel/review-panel-context' - -const ReviewPanelReactIdeProvider: React.FC = ({ children }) => { - const { values, updaterFns } = useReviewPanelState() - - return ( - - - {children} - - - ) -} - -export default ReviewPanelReactIdeProvider diff --git a/services/web/frontend/js/features/review-panel-new/components/review-panel-add-comment.tsx b/services/web/frontend/js/features/review-panel-new/components/review-panel-add-comment.tsx new file mode 100644 index 0000000000..583c545f27 --- /dev/null +++ b/services/web/frontend/js/features/review-panel-new/components/review-panel-add-comment.tsx @@ -0,0 +1,61 @@ +import { FC, FormEventHandler, useCallback, useState } from 'react' +import { + useCodeMirrorStateContext, + useCodeMirrorViewContext, +} from '@/features/source-editor/components/codemirror-editor' +import { EditorSelection } from '@codemirror/state' +import { PANEL_WIDTH } from './review-panel' +import { useTranslation } from 'react-i18next' +import { useThreadsActionsContext } from '../context/threads-context' + +export const ReviewPanelAddComment: FC = () => { + const { t } = useTranslation() + const view = useCodeMirrorViewContext() + // eslint-disable-next-line no-unused-vars + const _state = useCodeMirrorStateContext() + const { addComment } = useThreadsActionsContext() + const [error, setError] = useState() + const [showForm, setShowForm] = useState(false) + + const handleSubmit = useCallback( + event => { + event.preventDefault() + + const { from, to } = view.state.selection.main + const content = view.state.sliceDoc(from, to) + + const formData = new FormData(event.target as HTMLFormElement) + const message = formData.get('message') as string + + addComment(from, content, message).catch(setError) + + view.dispatch({ + selection: EditorSelection.cursor(view.state.selection.main.anchor), + }) + }, + [addComment, view] + ) + + const handleElement = useCallback((element: HTMLElement | null) => { + if (element) { + element.dispatchEvent(new Event('review-panel:position')) + } + }, []) + + if (!showForm) { + return + } + + return ( +
+ {/* eslint-disable-next-line jsx-a11y/no-autofocus */} +