TScroller 추가, TBody 수정

This commit is contained in:
hyunwoo93.cha
2024-01-30 17:11:02 +09:00
parent 39fe396d60
commit 5297c96608
4 changed files with 140 additions and 1 deletions

View File

@@ -3,6 +3,7 @@ import React from "react";
import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator";
import css from "./TBody.module.less"; import css from "./TBody.module.less";
import { SpotlightIds } from "../../utils/SpotlightIds"; import { SpotlightIds } from "../../utils/SpotlightIds";
import TScroller from "../TScroller/TScroller";
const Container = SpotlightContainerDecorator( const Container = SpotlightContainerDecorator(
{ enterTo: "last-focused", preserveId: true }, { enterTo: "last-focused", preserveId: true },
@@ -13,6 +14,7 @@ export default function TBody({
children, children,
className, className,
spotlightId = SpotlightIds.TBODY, spotlightId = SpotlightIds.TBODY,
scrollable = true,
...rest ...rest
}) { }) {
return ( return (
@@ -21,7 +23,11 @@ export default function TBody({
{...rest} {...rest}
className={classNames(css.tBody, className)} className={classNames(css.tBody, className)}
> >
{children} {scrollable ? (
<TScroller className={css.tScroller}>{children}</TScroller>
) : (
{ children }
)}
</Container> </Container>
); );
} }

View File

@@ -0,0 +1,3 @@
.tScroller {
height: 100%;
}

View File

@@ -0,0 +1,114 @@
import classNames from "classnames";
import React, { useCallback, useEffect, useRef, useState } from "react";
import Scroller from "@enact/sandstone/Scroller";
import { Job } from "@enact/core/util";
import { on, off } from "@enact/core/dispatcher";
import css from "./TScroller.module.less";
export default function TScroller({
className,
children,
verticalScrollbar = "hidden",
focusableScrollbar = false,
direction = "vertical",
horizontalScrollbar = "hidden",
scrollMode,
onScrollStart,
onScrollStop,
...rest
}) {
const isScrolling = useRef(false);
const scrollPosition = useRef("top");
const [onMoveScrollBarEffect, setOnMovevScrollBarEffect] = useState(false);
const [isMounted, setIsMounted] = useState(false);
const offMoveScrollBarEffect = new Job((func) => func(), 1000);
useEffect(() => {
setIsMounted(true);
return () => setIsMounted(false);
}, []);
const handleWheel = useCallback(() => {
if (!onMoveScrollBarEffect) {
setOnMovevScrollBarEffect(true);
offMoveScrollBarEffect.current.start(setOnMovevScrollBarEffect);
} else {
return;
}
}, [offMoveScrollBarEffect, onMoveScrollBarEffect]);
useEffect(() => {
on("wheel", handleWheel, document.getElementById("TScroller"));
return () => {
off("wheel", handleWheel, document.getElementById("TScroller"));
};
}, [handleWheel]);
const _onScrollStart = useCallback(
(e) => {
if (onScrollStart) {
onScrollStart(e);
}
isScrolling.current = true;
},
[onScrollStart]
);
const _onScrollStop = useCallback(
(e) => {
if (onScrollStop) {
onScrollStop(e);
}
isScrolling.current = false;
if (e.reachedEdgeInfo) {
if (e.reachedEdgeInfo.top) {
scrollPosition.current = "top";
} else if (e.reachedEdgeInfo.bottom) {
scrollPosition.current = "bottom";
} else {
scrollPosition.current = "middle";
}
} else {
scrollPosition.current = "middle";
}
},
[onScrollStop]
);
return (
<Scroller
{...rest}
onScrollStart={_onScrollStart}
onScrollStop={_onScrollStop}
id="TScroller"
scrollMode={scrollMode || "translate"}
focusableScrollbar={focusableScrollbar}
className={classNames(
className,
isMounted && css.tScroller,
onMoveScrollBarEffect ? css.onMove : ""
)}
direction={direction}
horizontalScrollbar={horizontalScrollbar}
verticalScrollbar={verticalScrollbar}
overscrollEffectOn={{
arrowKey: false,
drag: false,
pageKey: false,
track: false,
wheel: false,
}}
>
{children}
</Scroller>
);
}

View File

@@ -0,0 +1,16 @@
@import "../../style/CommonStyle.module.less";
@import "../../style/utils.module.less";
@scrollBar: 0.625rem;
@scrollCircle: 1.6667rem;
@barColor: transparent;
@focusedBarColor: #transparent;
@verTrackColor: #f1efec;
.tScroller {
> div:nth-child(2) > div:nth-child(1) {
background-color: #fff;
width: 8px;
border-radius: 40px;
}
}