0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2024-12-16 20:26:19 -05:00

feat(console): display topbar shadow while scrolling (#1340)

This commit is contained in:
Xiao Yijun 2022-07-01 15:27:11 +08:00 committed by GitHub
parent 67a87bb651
commit b3774cd43a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 6 deletions

View file

@ -31,6 +31,7 @@
"pnpm",
"silverhand",
"slonik",
"stylelint"
"stylelint",
"topbar"
]
}

View file

@ -1,3 +1,4 @@
import classNames from 'classnames';
import React from 'react';
import { useTranslation } from 'react-i18next';
@ -8,11 +9,15 @@ import GetStartedProgress from '@/pages/GetStarted/components/GetStartedProgress
import UserInfo from '../UserInfo';
import * as styles from './index.module.scss';
const Topbar = () => {
type Props = {
className?: string;
};
const Topbar = ({ className }: Props) => {
const { t } = useTranslation();
return (
<div className={styles.topbar}>
<div className={classNames(styles.topbar, className)}>
<Logo className={styles.logo} />
<div className={styles.line} />
<div className={styles.text}>{t('admin_console.title')}</div>

View file

@ -8,6 +8,10 @@
flex-direction: column;
}
.topbarShadow {
box-shadow: var(--shadow-2);
}
.content {
flex-grow: 1;
display: flex;

View file

@ -1,10 +1,12 @@
import { LogtoClientError, useLogto } from '@logto/react';
import React, { useEffect } from 'react';
import { conditional } from '@silverhand/essentials';
import React, { useEffect, useRef } from 'react';
import { Outlet, useHref, useLocation, useNavigate } from 'react-router-dom';
import AppError from '@/components/AppError';
import AppLoading from '@/components/AppLoading';
import SessionExpired from '@/components/SessionExpired';
import useScroll from '@/hooks/use-scroll';
import useSettings from '@/hooks/use-settings';
import useUserPreferences from '@/hooks/use-user-preferences';
@ -23,6 +25,8 @@ const AppContent = () => {
const location = useLocation();
const navigate = useNavigate();
const { firstItem } = useSidebarMenuItems();
const mainRef = useRef<HTMLDivElement>(null);
const { scrollTop } = useScroll(mainRef.current);
useEffect(() => {
if (!isAuthenticated) {
@ -51,10 +55,10 @@ const AppContent = () => {
return (
<div className={styles.app}>
<Topbar />
<Topbar className={conditional(scrollTop && styles.topbarShadow)} />
<div className={styles.content}>
<Sidebar />
<div className={styles.main}>
<div ref={mainRef} className={styles.main}>
<Outlet />
</div>
</div>

View file

@ -0,0 +1,35 @@
import { Nullable } from '@silverhand/essentials';
import { useState, useEffect, useCallback } from 'react';
const useScroll = (contentRef: Nullable<HTMLDivElement>) => {
const [scrollTop, setScrollTop] = useState(0);
const [scrollLeft, setScrollLeft] = useState(0);
const handleScroll = useCallback(() => {
if (!contentRef) {
return;
}
const { scrollTop, scrollLeft } = contentRef;
setScrollTop(scrollTop);
setScrollLeft(scrollLeft);
}, [contentRef]);
useEffect(() => {
if (!contentRef) {
return;
}
contentRef.addEventListener('scroll', handleScroll);
return () => {
contentRef.removeEventListener('scroll', handleScroll);
};
}, [handleScroll, contentRef]);
return {
scrollTop,
scrollLeft,
};
};
export default useScroll;