@@ -14,16 +14,45 @@ import type { Track } from '../../src/NativeMusicLibrary';
14
14
15
15
export default function TrackList ( ) {
16
16
const [ tracks , setTracks ] = useState < Track [ ] > ( [ ] ) ;
17
+ const [ loading , setLoading ] = useState ( false ) ;
17
18
18
19
const getAllTracks = async ( ) => {
19
20
try {
20
- const results = await getTracksAsync ( ) ;
21
- setTracks ( results . items ) ;
22
- Alert . alert ( 'Success' , `Found ${ results . totalCount } tracks` ) ;
21
+ setLoading ( true ) ;
22
+ const startTime = Date . now ( ) ;
23
+ const results = await loadAllTracks ( ) ;
24
+ const endTime = Date . now ( ) ;
25
+
26
+ setTracks ( results ) ;
27
+ Alert . alert (
28
+ 'Success' ,
29
+ `Found ${ results . length } tracks in ${ endTime - startTime } ms`
30
+ ) ;
23
31
} catch ( e ) {
24
32
console . error ( e , 'error' ) ;
25
33
Alert . alert ( 'Error' , 'Failed to fetch tracks' ) ;
34
+ } finally {
35
+ setLoading ( false ) ;
36
+ }
37
+ } ;
38
+
39
+ const loadAllTracks = async ( ) => {
40
+ let allTracks : Track [ ] = [ ] ;
41
+ let hasMore = true ;
42
+ let cursor ;
43
+
44
+ while ( hasMore ) {
45
+ const result = await getTracksAsync ( {
46
+ first : 100 ,
47
+ after : cursor ,
48
+ } ) ;
49
+
50
+ allTracks = [ ...allTracks , ...result . items ] ;
51
+ hasMore = result . hasNextPage ;
52
+ cursor = result . endCursor ;
26
53
}
54
+
55
+ return allTracks ;
27
56
} ;
28
57
29
58
const formatDuration = ( totalSeconds : number ) => {
@@ -51,7 +80,11 @@ export default function TrackList() {
51
80
< >
52
81
< View style = { globalStyles . buttonContainer } >
53
82
< View style = { globalStyles . buttonSpacer } />
54
- < Button title = "get the first 20 tracks" onPress = { getAllTracks } />
83
+ < Button
84
+ title = { `${ loading ? 'loading...' : '' } get all tracks` }
85
+ onPress = { getAllTracks }
86
+ disabled = { loading }
87
+ />
55
88
</ View >
56
89
57
90
{ tracks . length && (
0 commit comments