diff --git a/.gitignore b/.gitignore index 0db3c80f..f5d79e09 100755 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,6 @@ *.py[cod] __pycache__ -# C extensions -*.so - # Packages *.egg *.egg-info diff --git a/frontend/src/models/Slot.model.ts b/frontend/src/models/Slot.model.ts index b043dd7b..1a564a7f 100644 --- a/frontend/src/models/Slot.model.ts +++ b/frontend/src/models/Slot.model.ts @@ -1,14 +1,17 @@ import { sha256 } from 'js-sha256'; import { Robot, type Order } from '.'; // import { robohash } from '../components/RobotAvatar/RobohashGenerator'; -// import { generate_roboname } from 'robo-identities-wasm'; +import { roboidentitiesClient } from '../services/Roboidentities'; class Slot { constructor(token: string, shortAliases: string[], robotAttributes: Record) { this.token = token; this.hashId = sha256(sha256(this.token)); - this.nickname = 'No Nick Display (WIP)'; + this.nickname = ''; + roboidentitiesClient.generateRoboname(this.hashId).then((nickname) => { + this.nickname = nickname; + }); // trigger RoboHash avatar generation in webworker and store in RoboHash class cache. // void robohash.generate(this.hashId, 'small'); // void robohash.generate(this.hashId, 'large'); diff --git a/frontend/src/services/Native/index.d.ts b/frontend/src/services/Native/index.d.ts index e7dc6f68..680c8427 100644 --- a/frontend/src/services/Native/index.d.ts +++ b/frontend/src/services/Native/index.d.ts @@ -30,7 +30,19 @@ export interface NativeWebViewMessageSystem { detail?: string; } -export declare type NativeWebViewMessage = NativeWebViewMessageHttp | NativeWebViewMessageSystem; +export interface NativeWebViewMessageRoboidentities { + id?: number; + category: 'roboidentities'; + type: 'roboname' | 'robohash'; + string?: string; + size?: string; +} + +export declare type NativeWebViewMessage = + | NativeWebViewMessageHttp + | NativeWebViewMessageSystem + | NativeWebViewMessageRoboidentities + | NA; export interface NativeRobosatsPromise { resolve: (value: object | PromiseLike) => void; diff --git a/frontend/src/services/Roboidentities/RoboidentitiesNativeClient/index.ts b/frontend/src/services/Roboidentities/RoboidentitiesNativeClient/index.ts new file mode 100644 index 00000000..73f1f31f --- /dev/null +++ b/frontend/src/services/Roboidentities/RoboidentitiesNativeClient/index.ts @@ -0,0 +1,21 @@ +import { type RoboidentitiesClient } from '..'; +import NativeRobosats from '../../Native'; + +class RoboidentitiesNativeClient implements RoboidentitiesClient { + constructor() { + window.NativeRobosats = new NativeRobosats(); + } + + public loading = true; + + public generateRoboname: (initialString: string) => Promise = async (initialString) => { + const response = await window.NativeRobosats?.postMessage({ + category: 'roboIdentities', + type: 'roboname', + detail: initialString, + }); + return response ? Object.values(response)[0] : ''; + }; +} + +export default RoboidentitiesNativeClient; diff --git a/frontend/src/services/Roboidentities/RoboidentitiesWebClient/index.ts b/frontend/src/services/Roboidentities/RoboidentitiesWebClient/index.ts new file mode 100644 index 00000000..2d8b9112 --- /dev/null +++ b/frontend/src/services/Roboidentities/RoboidentitiesWebClient/index.ts @@ -0,0 +1,12 @@ +import { type RoboidentitiesClient } from '..'; +// import { generate_roboname } from 'robo-identities-wasm'; + +class RoboidentitiesClientWebClient implements RoboidentitiesClient { + public generateRoboname: (initialString: string) => Promise = async (initialString) => { + return new Promise(async (resolve, _reject) => { + // resolve(generate_roboname(initialString)) + }); + }; +} + +export default RoboidentitiesClientWebClient; diff --git a/frontend/src/services/Roboidentities/index.ts b/frontend/src/services/Roboidentities/index.ts new file mode 100644 index 00000000..4901b072 --- /dev/null +++ b/frontend/src/services/Roboidentities/index.ts @@ -0,0 +1,13 @@ +import RoboidentitiesClientNativeClient from './RoboidentitiesNativeClient'; +import RoboidentitiesClientWebClient from './RoboidentitiesWebClient'; + +export interface RoboidentitiesClient { + generateRoboname: (initialString: string) => Promise; +} + +export const roboidentitiesClient: RoboidentitiesClient = + // If userAgent has "RoboSats", we assume the app is running inside of the + // react-native-web view of the RoboSats Android app. + window.navigator.userAgent.includes('robosats') + ? new RoboidentitiesClientNativeClient() + : new RoboidentitiesClientWebClient(); diff --git a/mobile/App.tsx b/mobile/App.tsx index e2bb3905..d7367861 100644 --- a/mobile/App.tsx +++ b/mobile/App.tsx @@ -6,6 +6,7 @@ import Clipboard from '@react-native-clipboard/clipboard'; import EncryptedStorage from 'react-native-encrypted-storage'; import { name as app_name, version as app_version } from './package.json'; import TorModule from './native/TorModule'; +import RoboIdentitiesModule from './native/RoboIdentitiesModule'; const backgroundColors = { light: 'white', @@ -129,6 +130,11 @@ const App = () => { } else if (data.type === 'deleteCookie') { EncryptedStorage.removeItem(data.key); } + } else if (data.category === 'roboidentities') { + if (data.type === 'roboname') { + const roboname = RoboIdentitiesModule.generateRoboname(data.detail); + injectMessageResolve(data.id, roboname); + } } }; diff --git a/mobile/android/app/src/main/java/com/robosats/RoboIdentities.java b/mobile/android/app/src/main/java/com/robosats/RoboIdentities.java new file mode 100644 index 00000000..afeee6d9 --- /dev/null +++ b/mobile/android/app/src/main/java/com/robosats/RoboIdentities.java @@ -0,0 +1,14 @@ +package com.robosats; + +public class RoboIdentities { + static { + System.loadLibrary("robonames"); + } + + public String generateRoboname(String initial_string) { + return nativeGenerateRoboname(initial_string); + } + + // Native functions implemented in Rust. + private static native String nativeGenerateRoboname(String initial_string); +} diff --git a/mobile/android/app/src/main/java/com/robosats/RobosatsPackage.java b/mobile/android/app/src/main/java/com/robosats/RobosatsPackage.java index a421fab8..2eca0080 100644 --- a/mobile/android/app/src/main/java/com/robosats/RobosatsPackage.java +++ b/mobile/android/app/src/main/java/com/robosats/RobosatsPackage.java @@ -4,6 +4,7 @@ import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; +import com.robosats.modules.RoboIdentitiesModule; import com.robosats.modules.TorModule; import java.util.ArrayList; @@ -22,6 +23,7 @@ public class RobosatsPackage implements ReactPackage { List modules = new ArrayList<>(); modules.add(new TorModule(reactContext)); + modules.add(new RoboIdentitiesModule(reactContext)); return modules; } diff --git a/mobile/android/app/src/main/java/com/robosats/modules/RoboIdentitiesModule.java b/mobile/android/app/src/main/java/com/robosats/modules/RoboIdentitiesModule.java new file mode 100644 index 00000000..a8caef81 --- /dev/null +++ b/mobile/android/app/src/main/java/com/robosats/modules/RoboIdentitiesModule.java @@ -0,0 +1,26 @@ +package com.robosats.modules; + +import android.util.Log; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.robosats.RoboIdentities; + +public class RoboIdentitiesModule extends ReactContextBaseJavaModule { + private ReactApplicationContext context; + + public RoboIdentitiesModule(ReactApplicationContext reactContext) { + context = reactContext; + } + + @Override + public String getName() { + return "RoboIdentitiesModule"; + } + + @ReactMethod + public String generateRoboname(String initial_string) { + return new RoboIdentities().generateRoboname(initial_string); + } +} diff --git a/mobile/android/app/src/main/jniLibs/arm64-v8a/librobonames.so b/mobile/android/app/src/main/jniLibs/arm64-v8a/librobonames.so new file mode 100755 index 00000000..3e13c6d8 Binary files /dev/null and b/mobile/android/app/src/main/jniLibs/arm64-v8a/librobonames.so differ diff --git a/mobile/android/app/src/main/jniLibs/armeabi-v7a/librobonames.so b/mobile/android/app/src/main/jniLibs/armeabi-v7a/librobonames.so new file mode 100755 index 00000000..2cf9568e Binary files /dev/null and b/mobile/android/app/src/main/jniLibs/armeabi-v7a/librobonames.so differ diff --git a/mobile/native/RoboIdentitiesModule.ts b/mobile/native/RoboIdentitiesModule.ts new file mode 100644 index 00000000..78ac08a1 --- /dev/null +++ b/mobile/native/RoboIdentitiesModule.ts @@ -0,0 +1,8 @@ +import { NativeModules } from 'react-native'; +const { RoboIdentitiesModule } = NativeModules; + +interface RoboIdentitiesModuleInterface { + generateRoboname: (initialString: String) => String; +} + +export default RoboIdentitiesModule as RoboIdentitiesModuleInterface;