diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index c6cda3e..e0808b1 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -1,4 +1,4 @@
-blank_issues_enabled: false
+blank_issues_enabled: true
contact_links:
- name: Feature Request 💡
url: https://github.com/nodefinity/react-native-music-library/discussions/new?category=ideas
diff --git a/example/ios/MusicLibraryExample.xcodeproj/project.pbxproj b/example/ios/MusicLibraryExample.xcodeproj/project.pbxproj
index 7698db3..300190c 100644
--- a/example/ios/MusicLibraryExample.xcodeproj/project.pbxproj
+++ b/example/ios/MusicLibraryExample.xcodeproj/project.pbxproj
@@ -384,7 +384,10 @@
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
);
- OTHER_LDFLAGS = "$(inherited) ";
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ " ",
+ );
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
@@ -454,7 +457,10 @@
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
);
- OTHER_LDFLAGS = "$(inherited) ";
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ " ",
+ );
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
diff --git a/example/src/pages/TrackListScreen.tsx b/example/src/pages/TrackListScreen.tsx
index d01f0d3..04f0f53 100644
--- a/example/src/pages/TrackListScreen.tsx
+++ b/example/src/pages/TrackListScreen.tsx
@@ -117,7 +117,7 @@ export default function TrackListScreen({ navigation }: Props) {
/>
diff --git a/ios/MusicLibrary.mm b/ios/MusicLibrary.mm
index 4614c44..92b31c8 100644
--- a/ios/MusicLibrary.mm
+++ b/ios/MusicLibrary.mm
@@ -15,99 +15,96 @@ - (instancetype) init {
- (std::shared_ptr)getTurboModule:
(const facebook::react::ObjCTurboModule::InitParams &)params
{
- return std::make_shared(params);
+ return std::make_shared(params);
}
- (void)getTracksAsync:(JS::NativeMusicLibrary::InternalTrackOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
- NSLog(@"🎵 [MusicLibrary.mm] getTracksAsync called from Objective-C");
-
- // Extract values from Objective-C types with proper casting
+ // Extract values and create TrackOptions object
int first = (int)options.first();
NSString *after = options.after();
NSString *directory = options.directory();
NSArray *sortBy = (NSArray *)options.sortBy();
-
- // Call Swift function directly
- NSDictionary *result = [musicLibrary getTracksAsyncWithFirst:first after:after sortBy:sortBy directory:directory];
-
- NSLog(@"🎵 [MusicLibrary.mm] getTracksAsync resolved with result: %@", result);
- resolve(result);
+
+ TrackOptions *trackOptions = [[TrackOptions alloc] initAfter:after first:first sortBy:sortBy directory:directory];
+
+ // Call Swift function with options object
+ [musicLibrary getTracksAsyncWithOptions:trackOptions resolve:resolve reject:reject];
}
-- (void)getTrackMetadataAsync:(nonnull NSString *)trackId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
+- (void)getTrackMetadataAsync:(nonnull NSString *)trackId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getTrackMetadataAsync called with trackId: %@", trackId);
-
+
NSDictionary *result = [musicLibrary getTrackMetadataAsync:trackId];
-
+
NSLog(@"🎵 [MusicLibrary.mm] getTrackMetadataAsync resolved with result: %@", result);
resolve(result);
}
-- (void)getTracksByAlbumAsync:(nonnull NSString *)albumId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
+- (void)getTracksByAlbumAsync:(nonnull NSString *)albumId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getTracksByAlbumAsync called with albumId: %@", albumId);
-
+
NSArray *result = [musicLibrary getTracksByAlbumAsync:albumId];
-
+
NSLog(@"🎵 [MusicLibrary.mm] getTracksByAlbumAsync resolved with result: %@", result);
resolve(result);
}
-- (void)getTracksByArtistAsync:(nonnull NSString *)artistId options:(JS::NativeMusicLibrary::InternalTrackOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
+- (void)getTracksByArtistAsync:(nonnull NSString *)artistId options:(JS::NativeMusicLibrary::InternalTrackOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getTracksByArtistAsync called with artistId: %@", artistId);
-
+
// Extract values from Objective-C types with proper casting
int first = (int)options.first();
NSString *after = options.after();
NSString *directory = options.directory();
NSArray *sortBy = (NSArray *)options.sortBy();
-
+
// Call Swift function directly
NSDictionary *result = [musicLibrary getTracksByArtistAsync:artistId first:first after:after sortBy:sortBy directory:directory];
-
+
NSLog(@"🎵 [MusicLibrary.mm] getTracksByArtistAsync resolved with result: %@", result);
resolve(result);
}
-- (void)getAlbumsAsync:(JS::NativeMusicLibrary::InternalAlbumOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
+- (void)getAlbumsAsync:(JS::NativeMusicLibrary::InternalAlbumOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getAlbumsAsync called from Objective-C");
-
+
// Extract values from Objective-C types with proper casting
int first = (int)options.first();
NSString *after = options.after();
NSArray *sortBy = (NSArray *)options.sortBy();
-
+
// Call Swift function directly
NSDictionary *result = [musicLibrary getAlbumsAsyncWithFirst:first after:after sortBy:sortBy];
-
+
NSLog(@"🎵 [MusicLibrary.mm] getAlbumsAsync resolved with result: %@", result);
resolve(result);
}
-- (void)getAlbumsByArtistAsync:(nonnull NSString *)artistId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
+- (void)getAlbumsByArtistAsync:(nonnull NSString *)artistId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getAlbumsByArtistAsync called with artistId: %@", artistId);
-
+
NSArray *result = [musicLibrary getAlbumsByArtistAsync:artistId];
-
+
NSLog(@"🎵 [MusicLibrary.mm] getAlbumsByArtistAsync resolved with result: %@", result);
resolve(result);
}
-- (void)getArtistsAsync:(JS::NativeMusicLibrary::InternalArtistOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
+- (void)getArtistsAsync:(JS::NativeMusicLibrary::InternalArtistOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getArtistsAsync called from Objective-C");
-
+
// Extract values from Objective-C types with proper casting
int first = (int)options.first();
NSString *after = options.after();
NSArray *sortBy = (NSArray *)options.sortBy();
-
+
// Call Swift function directly
NSDictionary *result = [musicLibrary getArtistsAsyncWithFirst:first after:after sortBy:sortBy];
-
+
NSLog(@"🎵 [MusicLibrary.mm] getArtistsAsync resolved with result: %@", result);
resolve(result);
}
-+ (NSString *)moduleName {
++ (NSString *)moduleName {
return @"MusicLibraryImpl";
}
diff --git a/ios/MusicLibraryImpl.swift b/ios/MusicLibraryImpl.swift
index 000c3dc..e43d96b 100644
--- a/ios/MusicLibraryImpl.swift
+++ b/ios/MusicLibraryImpl.swift
@@ -5,32 +5,31 @@
//
import Foundation
+import React
+
+@objc(MusicLibraryImpl)
+public class MusicLibraryImpl: NSObject {
+
+ @objc
+ public func getTracksAsync(options: TrackOptions, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+ NSLog("🎵 [MusicLibrary] getTracksAsync called with options: %@", options)
-@objc public class MusicLibraryImpl: NSObject {
-
- @objc public func getTracksAsync(first: Int, after: String?, sortBy: [String], directory: String?) -> [String: Any] {
- NSLog("🎵 [MusicLibrary] getTracksAsync called with first: %d, after: %@, sortBy: %@, directory: %@", first, after ?? "nil", sortBy, directory ?? "nil")
-
do {
- let trackOptions = TrackOptions(after: after, first: first, sortBy: sortBy, directory: directory)
- NSLog("🎵 [MusicLibrary] getTracksAsync trackOptions: %@", trackOptions)
- let result = GetTracksQuery.getTracks(options: trackOptions)
+ let getTracks = GetTracks(options: options)
+ let result = getTracks.execute()
let resultDict = result.toDictionary()
-
+
NSLog("🎵 [MusicLibrary] getTracksAsync returning: %@", resultDict)
- return resultDict
+ resolve(resultDict)
} catch {
NSLog("🎵 [MusicLibrary] getTracksAsync error: %@", error.localizedDescription)
- return DataConverter.createErrorDictionary(
- code: "QUERY_ERROR",
- message: "Failed to query tracks: \(error.localizedDescription)"
- )
+ reject("QUERY_ERROR", "Failed to query tracks: \(error.localizedDescription)", error)
}
}
-
+
@objc public func getTrackMetadataAsync(_ trackId: String) -> [String: Any] {
NSLog("🎵 [MusicLibrary] getTrackMetadataAsync called with trackId: %@", trackId)
-
+
if let metadata = GetTrackMetadataQuery.getTrackMetadata(trackId: trackId) {
let resultDict = metadata.toDictionary()
NSLog("🎵 [MusicLibrary] getTrackMetadataAsync returning: %@", resultDict)
@@ -38,7 +37,7 @@ import Foundation
} else {
NSLog("🎵 [MusicLibrary] getTrackMetadataAsync: track not found")
return DataConverter.createErrorDictionary(
- code: "TRACK_NOT_FOUND",
+ code: "TRACK_NOT_FOUND",
message: "Track with id \(trackId) not found"
)
}
@@ -46,49 +45,49 @@ import Foundation
@objc public func getTracksByAlbumAsync(_ albumId: String) -> [[String: Any]] {
NSLog("🎵 [MusicLibrary] getTracksByAlbumAsync called with albumId: %@", albumId)
-
+
let tracks = GetTracksByAlbumQuery.getTracksByAlbum(albumId: albumId)
let result = tracks.map { $0.toDictionary() }
-
+
NSLog("🎵 [MusicLibrary] getTracksByAlbumAsync returning: %@", result)
return result
}
-
+
@objc public func getTracksByArtistAsync(_ artistId: String, first: Int, after: String?, sortBy: [String], directory: String?) -> [String: Any] {
NSLog("🎵 [MusicLibrary] getTracksByArtistAsync called with artistId: %@, first: %d, after: %@, sortBy: %@, directory: %@", artistId, first, after ?? "nil", sortBy, directory ?? "nil")
-
+
let result = PaginatedResult