mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
chore: update emoji picker toggle logic (#244)
This commit is contained in:
@ -1,41 +1,38 @@
|
|||||||
import { forwardRef, useEffect } from "react";
|
|
||||||
import Picker, { IEmojiPickerProps } from "emoji-picker-react";
|
import Picker, { IEmojiPickerProps } from "emoji-picker-react";
|
||||||
|
import { useEffect } from "react";
|
||||||
type EmojiPickerElement = HTMLDivElement;
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
isShowEmojiPicker: boolean;
|
shouldShow: boolean;
|
||||||
onEmojiClick: IEmojiPickerProps["onEmojiClick"];
|
onEmojiClick: IEmojiPickerProps["onEmojiClick"];
|
||||||
handleChangeIsShowEmojiPicker: (status: boolean) => void;
|
onShouldShowEmojiPickerChange: (status: boolean) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const EmojiPicker = forwardRef<EmojiPickerElement, Props>((props: Props, ref) => {
|
export const EmojiPicker: React.FC<Props> = (props: Props) => {
|
||||||
const { isShowEmojiPicker, onEmojiClick, handleChangeIsShowEmojiPicker } = props;
|
const { shouldShow, onEmojiClick, onShouldShowEmojiPickerChange } = props;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isShowEmojiPicker) {
|
if (shouldShow) {
|
||||||
const handleClickOutside = (event: MouseEvent) => {
|
const handleClickOutside = (event: MouseEvent) => {
|
||||||
|
event.stopPropagation();
|
||||||
const emojiWrapper = document.querySelector(".emoji-picker-react");
|
const emojiWrapper = document.querySelector(".emoji-picker-react");
|
||||||
const isContains = emojiWrapper?.contains(event.target as Node);
|
const isContains = emojiWrapper?.contains(event.target as Node);
|
||||||
if (!isContains) {
|
if (!isContains) {
|
||||||
handleChangeIsShowEmojiPicker(false);
|
onShouldShowEmojiPickerChange(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.addEventListener("mousedown", handleClickOutside);
|
|
||||||
return () => {
|
window.addEventListener("click", handleClickOutside, {
|
||||||
// Unbind the event listener on clean up
|
capture: true,
|
||||||
document.removeEventListener("mousedown", handleClickOutside);
|
once: true,
|
||||||
};
|
});
|
||||||
}
|
}
|
||||||
}, [isShowEmojiPicker]);
|
}, [shouldShow]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="emoji-picker" ref={ref}>
|
<div className={`emoji-picker ${shouldShow ? "" : "hidden"}`}>
|
||||||
<Picker onEmojiClick={onEmojiClick} disableSearchBar />
|
<Picker onEmojiClick={onEmojiClick} disableSearchBar />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
});
|
};
|
||||||
|
|
||||||
EmojiPicker.displayName = "EmojiPicker";
|
|
||||||
|
|
||||||
export default EmojiPicker;
|
export default EmojiPicker;
|
||||||
|
@ -11,13 +11,23 @@ import Editor, { EditorRefActions } from "./Editor/Editor";
|
|||||||
import EmojiPicker from "./Editor/EmojiPicker";
|
import EmojiPicker from "./Editor/EmojiPicker";
|
||||||
import "../less/memo-editor.less";
|
import "../less/memo-editor.less";
|
||||||
|
|
||||||
|
const getEditorContentCache = (): string => {
|
||||||
|
return storage.get(["editorContentCache"]).editorContentCache ?? "";
|
||||||
|
};
|
||||||
|
|
||||||
|
const setEditorContentCache = (content: string) => {
|
||||||
|
storage.set({
|
||||||
|
editorContentCache: content,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
isShowEmojiPicker: boolean;
|
|
||||||
fullscreen: boolean;
|
fullscreen: boolean;
|
||||||
isUploadingResource: boolean;
|
isUploadingResource: boolean;
|
||||||
|
shouldShowEmojiPicker: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const MemoEditor = () => {
|
const MemoEditor: React.FC = () => {
|
||||||
const { t, i18n } = useTranslation();
|
const { t, i18n } = useTranslation();
|
||||||
const user = useAppSelector((state) => state.user.user);
|
const user = useAppSelector((state) => state.user.user);
|
||||||
const editorState = useAppSelector((state) => state.editor);
|
const editorState = useAppSelector((state) => state.editor);
|
||||||
@ -25,7 +35,7 @@ const MemoEditor = () => {
|
|||||||
const [state, setState] = useState<State>({
|
const [state, setState] = useState<State>({
|
||||||
isUploadingResource: false,
|
isUploadingResource: false,
|
||||||
fullscreen: false,
|
fullscreen: false,
|
||||||
isShowEmojiPicker: false,
|
shouldShowEmojiPicker: false,
|
||||||
});
|
});
|
||||||
const editorRef = useRef<EditorRefActions>(null);
|
const editorRef = useRef<EditorRefActions>(null);
|
||||||
const prevGlobalStateRef = useRef(editorState);
|
const prevGlobalStateRef = useRef(editorState);
|
||||||
@ -182,6 +192,10 @@ const MemoEditor = () => {
|
|||||||
setEditorContentCache(content);
|
setEditorContentCache(content);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const handleEmojiPickerBtnClick = () => {
|
||||||
|
handleChangeShouldShowEmojiPicker(!state.shouldShowEmojiPicker);
|
||||||
|
};
|
||||||
|
|
||||||
const handleCheckBoxBtnClick = () => {
|
const handleCheckBoxBtnClick = () => {
|
||||||
if (!editorRef.current) {
|
if (!editorRef.current) {
|
||||||
return;
|
return;
|
||||||
@ -249,10 +263,10 @@ const MemoEditor = () => {
|
|||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const handleChangeIsShowEmojiPicker = (status: boolean) => {
|
const handleChangeShouldShowEmojiPicker = (status: boolean) => {
|
||||||
setState({
|
setState({
|
||||||
...state,
|
...state,
|
||||||
isShowEmojiPicker: status,
|
shouldShowEmojiPicker: status,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -262,7 +276,7 @@ const MemoEditor = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
editorRef.current.insertText(`${emojiObject.emoji}`);
|
editorRef.current.insertText(`${emojiObject.emoji}`);
|
||||||
handleChangeIsShowEmojiPicker(false);
|
handleChangeShouldShowEmojiPicker(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
const isEditing = Boolean(editorState.editMemoId && editorState.editMemoId !== UNKNOWN_ID);
|
const isEditing = Boolean(editorState.editMemoId && editorState.editMemoId !== UNKNOWN_ID);
|
||||||
@ -311,15 +325,15 @@ const MemoEditor = () => {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<button className="action-btn">
|
||||||
|
<Icon.Smile className="icon-img" onClick={handleEmojiPickerBtnClick} />
|
||||||
|
</button>
|
||||||
<button className="action-btn">
|
<button className="action-btn">
|
||||||
<Icon.CheckSquare className="icon-img" onClick={handleCheckBoxBtnClick} />
|
<Icon.CheckSquare className="icon-img" onClick={handleCheckBoxBtnClick} />
|
||||||
</button>
|
</button>
|
||||||
<button className="action-btn">
|
<button className="action-btn">
|
||||||
<Icon.Code className="icon-img" onClick={handleCodeBlockBtnClick} />
|
<Icon.Code className="icon-img" onClick={handleCodeBlockBtnClick} />
|
||||||
</button>
|
</button>
|
||||||
<button className="action-btn">
|
|
||||||
<Icon.Smile className="icon-img" onClick={() => handleChangeIsShowEmojiPicker(!state.isShowEmojiPicker)} />
|
|
||||||
</button>
|
|
||||||
<button className="action-btn">
|
<button className="action-btn">
|
||||||
<Icon.Image className="icon-img" onClick={handleUploadFileBtnClick} />
|
<Icon.Image className="icon-img" onClick={handleUploadFileBtnClick} />
|
||||||
<span className={`tip-text ${state.isUploadingResource ? "!block" : ""}`}>Uploading</span>
|
<span className={`tip-text ${state.isUploadingResource ? "!block" : ""}`}>Uploading</span>
|
||||||
@ -330,25 +344,13 @@ const MemoEditor = () => {
|
|||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
{state.isShowEmojiPicker && (
|
|
||||||
<EmojiPicker
|
<EmojiPicker
|
||||||
|
shouldShow={state.shouldShowEmojiPicker}
|
||||||
onEmojiClick={handleEmojiClick}
|
onEmojiClick={handleEmojiClick}
|
||||||
isShowEmojiPicker={state.isShowEmojiPicker}
|
onShouldShowEmojiPickerChange={handleChangeShouldShowEmojiPicker}
|
||||||
handleChangeIsShowEmojiPicker={handleChangeIsShowEmojiPicker}
|
|
||||||
/>
|
/>
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
function getEditorContentCache(): string {
|
|
||||||
return storage.get(["editorContentCache"]).editorContentCache ?? "";
|
|
||||||
}
|
|
||||||
|
|
||||||
function setEditorContentCache(content: string) {
|
|
||||||
storage.set({
|
|
||||||
editorContentCache: content,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export default MemoEditor;
|
export default MemoEditor;
|
||||||
|
Reference in New Issue
Block a user