@@ -16,17 +16,52 @@ export const Backlog = () => {
16
16
// logger.info('Backlog render');
17
17
const { playSeEnter, playSeClick } = useSoundEffect ( ) ;
18
18
const GUIStore = useSelector ( ( state : RootState ) => state . GUI ) ;
19
+ const isBacklogOpen = GUIStore . showBacklog ;
19
20
const dispatch = useDispatch ( ) ;
20
21
const iconSize = '0.8em' ;
21
22
const [ indexHide , setIndexHide ] = useState ( false ) ;
22
23
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
+
23
56
let timeRef = useRef < ReturnType < typeof setTimeout > > ( ) ;
24
57
// 缓存一下vdom
25
58
const backlogList = useMemo < any > ( ( ) => {
26
59
let backlogs = [ ] ;
60
+ const current_backlog_len = WebGAL . backlogManager . getBacklog ( ) . length ;
27
61
// 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 ] ;
30
65
const showTextArray = compileSentence ( backlogItem . currentStageState . showText , 3 , true , false ) ;
31
66
const showTextArray2 = showTextArray . map ( ( line ) => {
32
67
return line . map ( ( c ) => {
@@ -70,15 +105,16 @@ export const Backlog = () => {
70
105
const singleBacklogView = (
71
106
< div
72
107
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` } }
74
110
key = { 'backlogItem' + backlogItem . currentStageState . showText + backlogItem . saveScene . currentSentenceId }
75
111
>
76
112
< div className = { styles . backlog_func_area } >
77
113
< div className = { styles . backlog_item_button_list } >
78
114
< div
79
115
onClick = { ( e ) => {
80
116
playSeClick ( ) ;
81
- jumpFromBacklog ( i ) ;
117
+ jumpFromBacklog ( indexOfBacklog ) ;
82
118
e . preventDefault ( ) ;
83
119
e . stopPropagation ( ) ;
84
120
} }
@@ -92,7 +128,9 @@ export const Backlog = () => {
92
128
onClick = { ( ) => {
93
129
playSeClick ( ) ;
94
130
// 获取到播放 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
+ ) ;
96
134
if ( backlog_audio_element ) {
97
135
backlog_audio_element . currentTime = 0 ;
98
136
const userDataStore = webgalStore . getState ( ) . userData ;
@@ -113,15 +151,16 @@ export const Backlog = () => {
113
151
< div className = { styles . backlog_item_content } >
114
152
< span className = { styles . backlog_item_content_text } > { showTextElementList } </ span >
115
153
</ 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 } />
117
155
</ div >
118
156
) ;
119
- backlogs . unshift ( singleBacklogView ) ;
157
+ backlogs . push ( singleBacklogView ) ;
120
158
}
121
159
return backlogs ;
122
160
} , [
123
161
WebGAL . backlogManager . getBacklog ( ) [ WebGAL . backlogManager . getBacklog ( ) . length - 1 ] ?. saveScene ?. currentSentenceId ??
124
162
0 ,
163
+ limit ,
125
164
] ) ;
126
165
useEffect ( ( ) => {
127
166
/* 切换为展示历史记录时触发 */
0 commit comments