* Initial scaffolding for comments CRUD APIs * add actions * add assets * state management for existing comments and creating new * add ui components * add overlay comments wrapper to baseWidget * add toggle comment mode button at editor header * trigger tests * Disallow commenting as someone else * Add applicationId for comments * lint * Add overlay blacklist to prevent component interaction while adding comments * Comment thread style updates * Placeholder comment context menu * Controlled comment thread visibility for making new comments visible by default * Update comment type description * Reset input on save * Resolve comment thread button ui * fix close on esc key, dont create new comment on outside click * Submit on enter * add emoji picker * Attempt at adding a websocket server in Java * CRUD APIs for comment threads * Add API for getting all threads in application * Move types to a separate file * Initial commit for real time server (RTS) * Add script to start RTS * Fix position property * Use create comment thread API * Use add comment to thread API * Add custom cursor * Dispatch logout init on 401 errors * Allow CORS for real time connection * Add more logs to RTS * Fix construction of MongoClient * WIP: Real time comments * Enable comments * Minor updates * Read backend API base URL from environment * Escape to reset comments mode * Set popover position as auto and boundary as scroll parent * Disable warning * Added permissions for comment threads * Add resolved API for comment threads * Migration to set commenting permission on existing apps * Fix updates bringing the RTS down * Show view latest button, scroll to bottom on creating a new comment * Cleanup comment reducer * Move to typescript for RTS * Add missing server.ts and tsconfig files * Resolve / unresolve comment * Scaffold app comments * Minor fixes: comment on top of all widgets, add toggle button at viewer header * Reconnect socket on creating a new app, set connected status in store * Retry socket connection flow * Integration tests for comments with api mocks using msw * Fix circular depependency * rm file * Minor cleanup and comments * Minor refactors: move isScrolledToBottom to common hooks, decouple prevent interactions overlay from comments wrapper * Use policies when pushing updates in RTS * ENV var to set if comments are enabled * Fix: check if editor/viewer is initialised before waiting for init action * Add tests for comments reducer * Revert "ENV var to set if comments are enabled" This reverts commit 988efeaa69d378d943a387e1e73510334958adc5. * Enable comments for users with appsmith email * lint * fix * Try running a socket.io server inside backend * Update comment reducer tests * Init mentions within comments * Fix comment thread updates with email rooms * Minor fixes * Refactors / review suggestions * lint * increase cache limit for builds * Comment out tests for feature that's under development * Add Dockerfile for RTS * Fix policies missing for first comment in threads * Use draftJS for comments input with mentions support * fix fixtures * Use thread's policies when querying for threads * Update socket.io to v4 * Add support for richer body with mentions * Update comment body type to RawDraftContentState * fix stale method * Fix mentions search * Minor cleanups * Comment context menu and thread UI updates * revert: Scaffold app comments * Yarn dependencies * Delete comment using id api added * Init app comments * Add test for creating thread * Api for delete comment with id * Test comment creation response and policies * Copy comment links * Fix reset editor state * Delete valid comment testcase added * Delete comment TC : code refactor * Don't allow creating comments with an empty body * Pin comments WIP[] * Ignore dependency-reduced-pom.xml files from VCS * Cleanup of some dev-only files, for review * Delete comment * Update socket.io to v4 in RTS * Pin and resolve comment thread object added in commentThread * Pin and resolve comment thread object added in commentThread * Update comment thread API * Added creationTime and updationTime in comment thread response * Added creationTime and updationTime in comment thread response * Added human readable id to comment threads, fallback to username for null name in user document * Refactor * lint * fix test, rm duplicate selector * comment out saga used for dev * CommentThread viewed status, username fallback for getName=null, username field added in pin & resolve status * lint * trigger tests Co-authored-by: Shrikant Sharat Kandula <shrikant@appsmith.com> Co-authored-by: Abhijeet <abhi.nagarnaik@gmail.com>
95 lines
2.5 KiB
TypeScript
95 lines
2.5 KiB
TypeScript
import React, { useCallback, useMemo, useRef, useState } from "react";
|
|
import { DraftHandleValue, EditorState } from "draft-js";
|
|
import Editor from "@draft-js-plugins/editor";
|
|
import createMentionPlugin, { MentionData } from "@draft-js-plugins/mention";
|
|
import styled from "styled-components";
|
|
|
|
import "@draft-js-plugins/mention/lib/plugin.css";
|
|
import "draft-js/dist/Draft.css";
|
|
|
|
const StyledContainer = styled.div`
|
|
max-height: 60px;
|
|
overflow: auto;
|
|
flex: 1;
|
|
`;
|
|
|
|
type Props = {
|
|
suggestions: Array<MentionData>;
|
|
onSubmit: (editorState: EditorState) => void;
|
|
editorState: EditorState;
|
|
setEditorState: (editorState: EditorState) => void;
|
|
readOnly?: boolean;
|
|
onSearchSuggestions: ({ value }: { value: string }) => void;
|
|
autoFocus: boolean;
|
|
placeholder?: string;
|
|
};
|
|
|
|
function MentionsInput({
|
|
onSubmit,
|
|
suggestions,
|
|
onSearchSuggestions,
|
|
editorState,
|
|
setEditorState,
|
|
autoFocus,
|
|
placeholder,
|
|
}: Props) {
|
|
const ref = useRef<Editor | null>(null);
|
|
const [open, setOpen] = useState(false);
|
|
const { MentionSuggestions, plugins } = useMemo(() => {
|
|
const mentionPlugin = createMentionPlugin({ mentionTrigger: "@" });
|
|
const { MentionSuggestions } = mentionPlugin;
|
|
return { plugins: [mentionPlugin], MentionSuggestions };
|
|
}, []);
|
|
|
|
const onOpenChange = useCallback((_open: boolean) => {
|
|
setOpen(_open);
|
|
}, []);
|
|
|
|
const handleReturn = useCallback(
|
|
(e: React.KeyboardEvent, editorState: EditorState): DraftHandleValue => {
|
|
if (!e.nativeEvent.shiftKey && !open) {
|
|
onSubmit(editorState);
|
|
return "handled";
|
|
}
|
|
return "not-handled";
|
|
},
|
|
[open],
|
|
);
|
|
|
|
const focusInput = useCallback(() => {
|
|
// Forcing focus breaks plugins
|
|
// Ref: https://github.com/draft-js-plugins/draft-js-plugins/issues/800
|
|
setTimeout(() => ref.current?.focus());
|
|
}, []);
|
|
|
|
const setRef = useCallback((editorRef) => {
|
|
ref.current = editorRef;
|
|
if (autoFocus) focusInput();
|
|
}, []);
|
|
|
|
return (
|
|
<StyledContainer onClick={focusInput}>
|
|
<Editor
|
|
editorKey={"editor"}
|
|
editorState={editorState}
|
|
handleReturn={handleReturn}
|
|
onChange={setEditorState}
|
|
placeholder={placeholder}
|
|
plugins={plugins}
|
|
ref={setRef}
|
|
/>
|
|
<MentionSuggestions
|
|
onOpenChange={onOpenChange}
|
|
onSearchChange={onSearchSuggestions}
|
|
open={open}
|
|
suggestions={suggestions}
|
|
// onAddMention={() => {
|
|
// // get the mention object selected
|
|
// }}
|
|
/>
|
|
</StyledContainer>
|
|
);
|
|
}
|
|
|
|
export default MentionsInput;
|