mirror of
https://github.com/outline/outline.git
synced 2025-04-11 15:59:08 +00:00
Wait to scroll comments until sidebar animation is complete
Cleanup some unused code
This commit is contained in:
@ -8,6 +8,7 @@ import Flex from "~/components/Flex";
|
||||
import ResizeBorder from "~/components/Sidebar/components/ResizeBorder";
|
||||
import useMobile from "~/hooks/useMobile";
|
||||
import useStores from "~/hooks/useStores";
|
||||
import { sidebarAppearDuration } from "~/styles/animations";
|
||||
|
||||
type Props = React.HTMLAttributes<HTMLDivElement> & {
|
||||
children: React.ReactNode;
|
||||
@ -82,7 +83,7 @@ function Right({ children, border, className }: Props) {
|
||||
: {
|
||||
type: "spring",
|
||||
bounce: 0.2,
|
||||
duration: 0.6,
|
||||
duration: sidebarAppearDuration / 1000,
|
||||
},
|
||||
width: ui.sidebarRightWidth,
|
||||
}}
|
||||
|
@ -16,6 +16,7 @@ import { WebsocketContext } from "~/components/WebsocketProvider";
|
||||
import useCurrentUser from "~/hooks/useCurrentUser";
|
||||
import useOnClickOutside from "~/hooks/useOnClickOutside";
|
||||
import useStores from "~/hooks/useStores";
|
||||
import { sidebarAppearDuration } from "~/styles/animations";
|
||||
import CommentForm from "./CommentForm";
|
||||
import CommentThreadItem from "./CommentThreadItem";
|
||||
|
||||
@ -95,16 +96,29 @@ function CommentThread({
|
||||
}, [focused, autoFocus]);
|
||||
|
||||
React.useEffect(() => {
|
||||
if (focused && topRef.current) {
|
||||
scrollIntoView(topRef.current, {
|
||||
scrollMode: "if-needed",
|
||||
behavior: "smooth",
|
||||
block: "start",
|
||||
boundary: (parent) => {
|
||||
// Prevents body and other parent elements from being scrolled
|
||||
return parent.id !== "comments";
|
||||
if (focused) {
|
||||
// If the thread is already visible, scroll it into view immediately,
|
||||
// otherwise wait for the sidebar to appear.
|
||||
const isVisible =
|
||||
(topRef.current?.getBoundingClientRect().left ?? 0) < window.innerWidth;
|
||||
|
||||
setTimeout(
|
||||
() => {
|
||||
if (!topRef.current) {
|
||||
return;
|
||||
}
|
||||
scrollIntoView(topRef.current, {
|
||||
scrollMode: "if-needed",
|
||||
behavior: "smooth",
|
||||
block: "start",
|
||||
boundary: (parent) => {
|
||||
// Prevents body and other parent elements from being scrolled
|
||||
return parent.id !== "comments";
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
isVisible ? 0 : sidebarAppearDuration
|
||||
);
|
||||
|
||||
setTimeout(() => {
|
||||
const commentMarkElement = window.document?.getElementById(
|
||||
|
@ -40,7 +40,12 @@ function Comments() {
|
||||
onClose={() => ui.collapseComments(document?.id)}
|
||||
scrollable={false}
|
||||
>
|
||||
<Scrollable bottomShadow={!focusedComment} hiddenScrollbars topShadow>
|
||||
<Scrollable
|
||||
bottomShadow={!focusedComment}
|
||||
id="comments"
|
||||
hiddenScrollbars
|
||||
topShadow
|
||||
>
|
||||
<Wrapper $hasComments={hasComments}>
|
||||
{hasComments ? (
|
||||
threads.map((thread) => (
|
||||
|
@ -115,3 +115,8 @@ export const pulse = keyframes`
|
||||
50% { transform: scale(1.1); }
|
||||
100% { transform: scale(1); }
|
||||
`;
|
||||
|
||||
/**
|
||||
* The duration of the sidebar appearing animation in ms
|
||||
*/
|
||||
export const sidebarAppearDuration = 600;
|
||||
|
1
app/typings/styled-components.d.ts
vendored
1
app/typings/styled-components.d.ts
vendored
@ -138,7 +138,6 @@ declare module "styled-components" {
|
||||
textDiffDeletedBackground: string;
|
||||
placeholder: string;
|
||||
commentBackground: string;
|
||||
commentActiveBackground: string;
|
||||
sidebarBackground: string;
|
||||
sidebarActiveBackground: string;
|
||||
sidebarControlHoverBackground: string;
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { subMilliseconds } from "date-fns";
|
||||
import { FindOrCreateOptions, Op } from "sequelize";
|
||||
import {
|
||||
BelongsTo,
|
||||
@ -9,7 +8,6 @@ import {
|
||||
DataType,
|
||||
Scopes,
|
||||
} from "sequelize-typescript";
|
||||
import { USER_PRESENCE_INTERVAL } from "@shared/constants";
|
||||
import Document from "./Document";
|
||||
import User from "./User";
|
||||
import IdModel from "./base/IdModel";
|
||||
@ -94,18 +92,6 @@ class View extends IdModel {
|
||||
});
|
||||
}
|
||||
|
||||
static async findRecentlyEditingByDocument(documentId: string) {
|
||||
return this.findAll({
|
||||
where: {
|
||||
documentId,
|
||||
lastEditingAt: {
|
||||
[Op.gt]: subMilliseconds(new Date(), USER_PRESENCE_INTERVAL * 2),
|
||||
},
|
||||
},
|
||||
order: [["lastEditingAt", "DESC"]],
|
||||
});
|
||||
}
|
||||
|
||||
static async touch(documentId: string, userId: string, isEditing: boolean) {
|
||||
const values: Partial<View> = {
|
||||
updatedAt: new Date(),
|
||||
|
@ -126,7 +126,6 @@ export const buildLightTheme = (input: Partial<Colors>): DefaultTheme => {
|
||||
shadow: "rgba(0, 0, 0, 0.2)",
|
||||
|
||||
commentBackground: colors.warmGrey,
|
||||
commentActiveBackground: "#d7e0ea",
|
||||
|
||||
modalBackdrop: colors.black10,
|
||||
modalBackground: colors.white,
|
||||
@ -194,8 +193,7 @@ export const buildDarkTheme = (input: Partial<Colors>): DefaultTheme => {
|
||||
backdrop: "rgba(0, 0, 0, 0.5)",
|
||||
shadow: "rgba(0, 0, 0, 0.6)",
|
||||
|
||||
commentBackground: colors.veryDarkBlue,
|
||||
commentActiveBackground: colors.black,
|
||||
commentBackground: "#1f232e",
|
||||
|
||||
modalBackdrop: colors.black50,
|
||||
modalBackground: "#1f2128",
|
||||
|
Reference in New Issue
Block a user