diff --git a/app/javascript/mastodon/components/column.tsx b/app/javascript/mastodon/components/column.tsx deleted file mode 100644 index 2abe3425e4c..00000000000 --- a/app/javascript/mastodon/components/column.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { forwardRef, useRef, useImperativeHandle } from 'react'; -import type { Ref } from 'react'; - -import classNames from 'classnames'; - -import { scrollTop } from 'mastodon/scroll'; - -export interface ColumnRef { - scrollTop: () => void; - node: HTMLDivElement | null; -} - -interface ColumnProps { - children?: React.ReactNode; - label?: string; - bindToDocument?: boolean; - className?: string; -} - -export const Column = forwardRef( - ({ children, label, bindToDocument, className }, ref: Ref) => { - const nodeRef = useRef(null); - - useImperativeHandle(ref, () => ({ - node: nodeRef.current, - - scrollTop() { - let scrollable = null; - - if (bindToDocument) { - scrollable = document.scrollingElement; - } else { - scrollable = nodeRef.current?.querySelector('.scrollable'); - } - - if (!scrollable) { - return; - } - - scrollTop(scrollable); - }, - })); - - return ( -
- {children} -
- ); - }, -); - -Column.displayName = 'Column'; - -// eslint-disable-next-line import/no-default-export -export default Column; diff --git a/app/javascript/mastodon/components/column_back_button.tsx b/app/javascript/mastodon/components/column/back_button.tsx similarity index 91% rename from app/javascript/mastodon/components/column_back_button.tsx rename to app/javascript/mastodon/components/column/back_button.tsx index bb6939e24c6..72fc0443b5f 100644 --- a/app/javascript/mastodon/components/column_back_button.tsx +++ b/app/javascript/mastodon/components/column/back_button.tsx @@ -7,9 +7,9 @@ import { Icon } from 'mastodon/components/icon'; import { getColumnSkipLinkId } from 'mastodon/features/ui/components/skip_links'; import { ButtonInTabsBar } from 'mastodon/features/ui/util/columns_context'; -import { useColumnIndexContext } from '../features/ui/components/columns_area'; +import { useAppHistory } from '../router'; -import { useAppHistory } from './router'; +import { useColumnIndexContext } from './context'; type OnClickCallback = () => void; diff --git a/app/javascript/mastodon/components/column/context.ts b/app/javascript/mastodon/components/column/context.ts new file mode 100644 index 00000000000..79ab231847c --- /dev/null +++ b/app/javascript/mastodon/components/column/context.ts @@ -0,0 +1,12 @@ +import { createContext, useContext } from 'react'; + +export const ColumnIndexContext = createContext(1); +export const useColumnIndexContext = () => useContext(ColumnIndexContext); + +export const ColumnContext = createContext({ + scrollTop: () => { + // Implemented in index.tsx + }, +}); + +export const useColumn = () => useContext(ColumnContext); diff --git a/app/javascript/mastodon/components/column_header.tsx b/app/javascript/mastodon/components/column/header.tsx similarity index 93% rename from app/javascript/mastodon/components/column_header.tsx rename to app/javascript/mastodon/components/column/header.tsx index 77cba09fbe7..dd8d8fca36a 100644 --- a/app/javascript/mastodon/components/column_header.tsx +++ b/app/javascript/mastodon/components/column/header.tsx @@ -16,11 +16,11 @@ import { Icon } from 'mastodon/components/icon'; import { ButtonInTabsBar } from 'mastodon/features/ui/util/columns_context'; import { useIdentity } from 'mastodon/identity_context'; -import { useColumnIndexContext } from '../features/ui/components/columns_area'; -import { getColumnSkipLinkId } from '../features/ui/components/skip_links'; +import { getColumnSkipLinkId } from '../../features/ui/components/skip_links'; +import { NavigationFocusTarget } from '../navigation_focus_target'; +import { useAppHistory } from '../router'; -import { NavigationFocusTarget } from './navigation_focus_target'; -import { useAppHistory } from './router'; +import { useColumn, useColumnIndexContext } from './context'; export const messages = defineMessages({ show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' }, @@ -73,7 +73,7 @@ const BackButton: React.FC<{ ); }; -export interface Props { +export interface ColumnHeaderProps { title?: React.ReactNode; icon?: string; iconComponent?: IconProp; @@ -87,12 +87,13 @@ export interface Props { placeholder?: boolean; appendContent?: React.ReactNode; collapseIssues?: boolean; + scrollTopOnClick?: boolean; onClick?: () => void; onMove?: (arg0: number) => void; onPin?: () => void; } -export const ColumnHeader: React.FC = ({ +export const ColumnHeader: React.FC = ({ title, icon, iconComponent, @@ -106,6 +107,7 @@ export const ColumnHeader: React.FC = ({ placeholder, appendContent, collapseIssues, + scrollTopOnClick, onClick, onMove, onPin, @@ -125,9 +127,13 @@ export const ColumnHeader: React.FC = ({ [setCollapsed, setAnimating], ); + const { scrollTop } = useColumn(); const handleTitleClick = useCallback(() => { onClick?.(); - }, [onClick]); + if (scrollTopOnClick) { + scrollTop(); + } + }, [onClick, scrollTop, scrollTopOnClick]); const handleMoveLeft = useCallback(() => { onMove?.(-1); @@ -290,7 +296,7 @@ export const ColumnHeader: React.FC = ({ as='h1' className='column-header__title-wrapper' > - {onClick ? ( + {onClick || scrollTopOnClick ? (