Skip to content

Commit 23519b4

Browse files
authoredFeb 27, 2025··
Merge pull request #640 from OpenWebGAL/optimize-backlog
feat: implement infinite scrolling for backlog items
2 parents 8fc984a + 4a266aa commit 23519b4

File tree

1 file changed

+46
-7
lines changed

1 file changed

+46
-7
lines changed
 

‎packages/webgal/src/UI/Backlog/Backlog.tsx

+46-7
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,52 @@ export const Backlog = () => {
1616
// logger.info('Backlog render');
1717
const { playSeEnter, playSeClick } = useSoundEffect();
1818
const GUIStore = useSelector((state: RootState) => state.GUI);
19+
const isBacklogOpen = GUIStore.showBacklog;
1920
const dispatch = useDispatch();
2021
const iconSize = '0.8em';
2122
const [indexHide, setIndexHide] = useState(false);
2223
const [isDisableScroll, setIsDisableScroll] = useState(false);
24+
const [limit, setLimit] = useState(20);
25+
useEffect(() => {
26+
if (!isBacklogOpen) {
27+
return;
28+
}
29+
let options = {
30+
root: null,
31+
rootMargin: '0px',
32+
threshold: [1.0],
33+
};
34+
35+
let observer = new IntersectionObserver((entries) => {
36+
if ((entries?.[0]?.intersectionRatio ?? 0) <= 0) return;
37+
setLimit(limit + 20);
38+
}, options);
39+
40+
const observeTarget = document.querySelector(`#backlog_item_${limit - 5}`);
41+
if (observeTarget) {
42+
observer.observe(observeTarget);
43+
}
44+
45+
return () => {
46+
observer.disconnect();
47+
};
48+
}, [limit, isBacklogOpen]);
49+
50+
useEffect(() => {
51+
if (!isBacklogOpen) {
52+
setLimit(20);
53+
}
54+
}, [isBacklogOpen]);
55+
2356
let timeRef = useRef<ReturnType<typeof setTimeout>>();
2457
// 缓存一下vdom
2558
const backlogList = useMemo<any>(() => {
2659
let backlogs = [];
60+
const current_backlog_len = WebGAL.backlogManager.getBacklog().length;
2761
// logger.info('backlogList render');
28-
for (let i = 0; i < WebGAL.backlogManager.getBacklog().length; i++) {
29-
const backlogItem = WebGAL.backlogManager.getBacklog()[i];
62+
for (let i = 0; i < Math.min(current_backlog_len, limit); i++) {
63+
const indexOfBacklog = current_backlog_len - i - 1;
64+
const backlogItem = WebGAL.backlogManager.getBacklog()[indexOfBacklog];
3065
const showTextArray = compileSentence(backlogItem.currentStageState.showText, 3, true, false);
3166
const showTextArray2 = showTextArray.map((line) => {
3267
return line.map((c) => {
@@ -70,15 +105,16 @@ export const Backlog = () => {
70105
const singleBacklogView = (
71106
<div
72107
className={styles.backlog_item}
73-
style={{ animationDelay: `${20 * (WebGAL.backlogManager.getBacklog().length - i)}ms` }}
108+
id={`backlog_item_${i}`}
109+
style={{ animationDelay: `${20 * ((i - 1) % 20)}ms` }}
74110
key={'backlogItem' + backlogItem.currentStageState.showText + backlogItem.saveScene.currentSentenceId}
75111
>
76112
<div className={styles.backlog_func_area}>
77113
<div className={styles.backlog_item_button_list}>
78114
<div
79115
onClick={(e) => {
80116
playSeClick();
81-
jumpFromBacklog(i);
117+
jumpFromBacklog(indexOfBacklog);
82118
e.preventDefault();
83119
e.stopPropagation();
84120
}}
@@ -92,7 +128,9 @@ export const Backlog = () => {
92128
onClick={() => {
93129
playSeClick();
94130
// 获取到播放 backlog 语音的元素
95-
const backlog_audio_element: any = document.getElementById('backlog_audio_play_element_' + i);
131+
const backlog_audio_element: any = document.getElementById(
132+
'backlog_audio_play_element_' + indexOfBacklog,
133+
);
96134
if (backlog_audio_element) {
97135
backlog_audio_element.currentTime = 0;
98136
const userDataStore = webgalStore.getState().userData;
@@ -113,15 +151,16 @@ export const Backlog = () => {
113151
<div className={styles.backlog_item_content}>
114152
<span className={styles.backlog_item_content_text}>{showTextElementList}</span>
115153
</div>
116-
<audio id={'backlog_audio_play_element_' + i} src={backlogItem.currentStageState.vocal} />
154+
<audio id={'backlog_audio_play_element_' + indexOfBacklog} src={backlogItem.currentStageState.vocal} />
117155
</div>
118156
);
119-
backlogs.unshift(singleBacklogView);
157+
backlogs.push(singleBacklogView);
120158
}
121159
return backlogs;
122160
}, [
123161
WebGAL.backlogManager.getBacklog()[WebGAL.backlogManager.getBacklog().length - 1]?.saveScene?.currentSentenceId ??
124162
0,
163+
limit,
125164
]);
126165
useEffect(() => {
127166
/* 切换为展示历史记录时触发 */

0 commit comments

Comments
 (0)