Skip to content

Commit

Permalink
Merge pull request #3 from talknagish/jsi-complex-types
Browse files Browse the repository at this point in the history
JSI complex types
  • Loading branch information
Alon E authored Apr 16, 2022
2 parents 1370e39 + fd11222 commit e3acd21
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,51 @@ class TurboStarterModule(reactContext: ReactApplicationContext?) :
return String.format("Hello, %s!", name)
}

override fun getTurboArray(values: ReadableArray): WritableArray {
val array = values.toArrayList()
array.reverse()
val reversed = WritableNativeArray()

for (item in array) {
if (item !is String) {
continue
}

reversed.pushString(item)
}
return reversed
}

override fun getTurboObject(options: ReadableMap): WritableMap {
val obj = WritableNativeMap()
obj.putString("helloString", "Hello, World!")
obj.putInt("magicNumber", 42)
obj.putString("response", "res")
return obj
}

override fun getTurboObjectGeneric(options: ReadableMap): WritableMap {
val obj = WritableNativeMap()
val input = options.getInt("magicNumber")

obj.putInt("magicNumber", input * 6)
return obj
}

override fun getTurboPromise(magicNumber: Double, promise: Promise) {
when (magicNumber) {
42.0 -> {
promise.resolve(true)
}
7.0 -> {
promise.reject("1", "You stepped on a mine")
}
else -> {
promise.resolve(false)
}
}
}

override fun getName(): String {
return NAME
}
Expand Down
23 changes: 22 additions & 1 deletion example/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ import {
ReloadInstructions,
} from 'react-native/Libraries/NewAppScreen';
import {
getGreeting
getGreeting,
getTurboObject,
getTurboObjectGeneric,
getTurboPromise,
} from 'react-native-turbo-starter';

const Section: React.FC<{
Expand Down Expand Up @@ -66,6 +69,24 @@ const App = () => {

React.useEffect(() => {
setResult(getGreeting('Yotam'));

const obj = getTurboObject({
title: 'Hello, world!',
});
console.log('object', obj, obj?.response);

const gobj = getTurboObjectGeneric({
magicNumber: 7,
});
console.log('gobject', gobj);

getTurboPromise(42).then((res) => console.log('t1', res));

getTurboPromise(7).catch((error: Error) =>
console.log('t2', error.message)
);

getTurboPromise(1).then((res) => console.log('t3', res));
}, []);

const backgroundStyle = {
Expand Down
53 changes: 51 additions & 2 deletions ios/TurboStarter.mm
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,60 @@ @implementation TurboStarter

- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params
{
return std::make_shared<facebook::react::NativeTurboStarterSpecJSI>(params);
return std::make_shared<facebook::react::NativeTurboStarterSpecJSI>(params);
}

- (NSString *)getGreeting:(NSString *)name {
return [NSString stringWithFormat: @"Hello, %@!", name];
return [NSString stringWithFormat: @"Hello, %@!", name];
}

- (NSArray<NSString *> *)getTurboArray:(NSArray *)values {
NSArray* reversedArray = [[values reverseObjectEnumerator] allObjects];
return reversedArray;
}

- (NSDictionary *)getTurboObject:(JS::NativeTurboStarter::SpecGetTurboObjectOptions &)options {

NSLog(@"getTurboObject options (title): %@", options.title());

id keys[] = { @"helloString", @"magicNumber", @"response" };
id objects[] = { @"Hello, World!", @42, @"res" };
NSUInteger count = sizeof(objects) / sizeof(id);

NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects
forKeys:keys
count:count];

return dictionary;
}
- (NSDictionary *)getTurboObjectGeneric:(NSDictionary *)options {
id num = @([[options valueForKey:@"magicNumber"] integerValue] * 6);

id keys[] = { @"magicNumber" };
id objects[] = { num };
NSUInteger count = sizeof(objects) / sizeof(id);

NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects
forKeys:keys
count:count];

return dictionary;
}

- (void)getTurboPromise:(double)magicNumber
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject
{
if (magicNumber == 42) {
resolve(@YES);
return;
} else if (magicNumber == 7) {
NSError *error = [NSError errorWithDomain:@"com.example.reactnativeturbostarter" code:3456 userInfo:@{NSLocalizedDescriptionKey:@"Invalid user name."}];
reject(@"1", @"You stepped on a mine", error);
return;
}

resolve(@NO);
}

+ (NSString *)moduleName {
Expand Down
16 changes: 15 additions & 1 deletion src/NativeTurboStarter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,22 @@ import { TurboModuleRegistry } from 'react-native';

export interface Spec extends TurboModule {
getConstants: () => {};

//
// Regular JSI
//
getGreeting(name: string): string;

//
// Complex types JSI
//
getTurboArray(values: Array<string>): Array<string>;
// On iOS, codegen generates a typed NSObject, but on Android it's just a generic dictionary.
// So for now, it can't be completely type-safe
getTurboObject(options: { title: string }): { response: string };
getTurboObjectGeneric(options: Object): Object;
getTurboPromise(magicNumber: number): Promise<boolean>;
}

// We know the module is going to be load so we export with the "!" so it doesn't add undefined to every function return value
export default TurboModuleRegistry.get<Spec>('TurboStarter')!;
export default TurboModuleRegistry.get<Spec>('TurboStarter')!;
18 changes: 17 additions & 1 deletion src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,20 @@ import NativeTurboStarter from './NativeTurboStarter';

export function getGreeting(name: string) {
return NativeTurboStarter.getGreeting(name);
}
}

export function getTurboArray(values: string[]) {
return NativeTurboStarter.getTurboArray(values);
}

export function getTurboObject(options: { title: string }) {
return NativeTurboStarter.getTurboObject(options);
}

export function getTurboObjectGeneric(options: Object) {
return NativeTurboStarter.getTurboObjectGeneric(options);
}

export async function getTurboPromise(magicNumber: number) {
return NativeTurboStarter.getTurboPromise(magicNumber);
}

0 comments on commit e3acd21

Please sign in to comment.