Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.20.0

- Add survey response tracking support

## 0.19.3

- Fix issue on Android
Expand Down
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ android {
}

dependencies {
implementation 'app.nubrick:nubrick:0.13.5'
implementation 'app.nubrick:nubrick:0.15.1'
implementation 'androidx.activity:activity-compose:1.8.2'
testImplementation 'org.jetbrains.kotlin:kotlin-test'
testImplementation 'org.mockito:mockito-core:5.0.0'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import app.nubrick.nubrick.FlutterBridgeApi
import app.nubrick.nubrick.FlutterBridge
import app.nubrick.nubrick.NubrickSDK
import app.nubrick.nubrick.data.ExceptionRecord
import app.nubrick.nubrick.data.ExperimentContent
import app.nubrick.nubrick.data.NotFoundException
import app.nubrick.nubrick.data.StackFrame
import app.nubrick.nubrick.data.CrashSeverity
Expand Down Expand Up @@ -54,7 +55,7 @@ internal class NubrickFlutterManager(
private val binaryMessenger: BinaryMessenger,
private val scope: CoroutineScope
) {
private var embeddingMap: MutableMap<String, Any?> = mutableMapOf()
private var embeddingMap: MutableMap<String, ExperimentContent> = mutableMapOf()
private var embeddingArgumentStateMap: MutableMap<String, MutableState<Any?>> = mutableMapOf()
private var eventBridgeViewMap: MutableMap<String, UIBlockActionBridge> = mutableMapOf()
private var configMap: MutableMap<String, ConfigEntity> = mutableMapOf()
Expand All @@ -64,7 +65,7 @@ internal class NubrickFlutterManager(
projectId: String,
onEvent: (event: Event) -> Unit,
onDispatch: (event: NubrickEvent) -> Unit,
onTooltip: (data: String, experimentId: String) -> Unit
onTooltip: (data: String, experimentId: String, variantId: String?) -> Unit
) {
// Callbacks are passed at init to avoid missing events fired during initialization.
NubrickSDK.initialize(
Expand Down Expand Up @@ -97,11 +98,16 @@ internal class NubrickFlutterManager(
}

// embedding
fun connectEmbedding(channelId: String, experimentId: String, componentId: String? = null) {
fun connectEmbedding(
channelId: String,
experimentId: String,
componentId: String? = null,
variantId: String? = null,
) {
val methodChannel = MethodChannel(this.binaryMessenger, "Nubrick/Embedding/$channelId")
scope.launch {
val result = withContext(Dispatchers.IO) {
FlutterBridge.connectEmbedding(experimentId, componentId)
FlutterBridge.connectEmbedding(experimentId, componentId, variantId)
}
result.onSuccess {
embeddingMap[channelId] = it
Expand Down Expand Up @@ -153,7 +159,7 @@ internal class NubrickFlutterManager(
val methodChannel = remember(channelId) {
MethodChannel(this.binaryMessenger, "Nubrick/Embedding/$channelId")
}
val data = this.embeddingMap[channelId]
val data = this.embeddingMap[channelId] ?: return
val eventBridge = this.eventBridgeViewMap[channelId]
FlutterBridge.render(
modifier,
Expand Down Expand Up @@ -239,13 +245,29 @@ internal class NubrickFlutterManager(
val variant = config.variant ?: return
val componentId = variant.get(key) ?: return
val experimentId = config.experimentId ?: return
this.connectEmbedding(embeddingChannelId, experimentId, componentId)
this.connectEmbedding(
channelId = embeddingChannelId,
experimentId = experimentId,
componentId = componentId,
variantId = variant.id,
)
}

fun connectTooltipEmbedding(channelId: String, rootBlock: String) {
if (channelId.isEmpty()) return
embeddingMap[channelId] = rootBlock
fun connectTooltipEmbedding(
channelId: String,
experimentId: String,
variantId: String?,
rootJson: String,
): Result<Unit> {
if (channelId.isEmpty() || experimentId.isEmpty()) {
return Result.failure(IllegalArgumentException("Missing tooltip channel or experiment ID"))
}
val content = FlutterBridge.buildExperimentContent(experimentId, variantId, rootJson).getOrElse {
return Result.failure(it)
}
embeddingMap[channelId] = content
eventBridgeViewMap[channelId] = UIBlockActionBridge()
return Result.success(Unit)
}

suspend fun callTooltipEmbeddingDispatch(channelId: String, event: String) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,12 @@ class NubrickFlutterPlugin: FlutterPlugin, MethodCallHandler {
))
}
},
onTooltip = { data, experimentId ->
onTooltip = { data, experimentId, variantId ->
sdkScope.launch {
channel.invokeMethod("on-tooltip", mapOf(
"data" to data,
"experimentId" to experimentId,
"variantId" to variantId,
))
}
}
Expand Down Expand Up @@ -176,8 +177,10 @@ class NubrickFlutterPlugin: FlutterPlugin, MethodCallHandler {
// tooltip
"connectTooltipEmbedding" -> {
val channelId = call.argument<String>("channelId") as String
val rootBlock = call.argument<String>("json") as String
this.manager.connectTooltipEmbedding(channelId, rootBlock)
val experimentId = call.argument<String>("experimentId") as String
val variantId = call.argument<String>("variantId")
val rootJson = call.argument<String>("json") as String
this.manager.connectTooltipEmbedding(channelId, experimentId, variantId, rootJson)
result.success("ok")
}
"callTooltipEmbeddingDispatch" -> {
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion e2e/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ packages:
path: ".."
relative: true
source: path
version: "0.19.3"
version: "0.20.0"
path:
dependency: transitive
description:
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:nubrick_flutter/nubrick_flutter.dart';

void main() {
WidgetsFlutterBinding.ensureInitialized();
Nubrick.initialize("p_d357ola9io6g00f6evag");
Nubrick.initialize("cgv3p3223akg00fod19g");
// Global event listener
Nubrick.addEventListener((event) {
print("Global Event: ${event.name}");
Expand Down
2 changes: 1 addition & 1 deletion example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ packages:
path: ".."
relative: true
source: path
version: "0.19.3"
version: "0.20.0"
path:
dependency: transitive
description:
Expand Down
2 changes: 1 addition & 1 deletion ios/nubrick_flutter.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ A new Flutter plugin project.
s.source = { :path => '.' }
s.source_files = 'nubrick_flutter/Sources/nubrick_flutter/**/*.swift'
s.dependency 'Flutter'
s.dependency 'Nubrick', '0.18.5'
s.dependency 'Nubrick', '0.19.2'
s.ios.deployment_target = '15.0'
s.platform = :ios, '15.0'

Expand Down
4 changes: 2 additions & 2 deletions ios/nubrick_flutter/Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion ios/nubrick_flutter/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ let package = Package(
dependencies: [
.package(
url: "https://github.com/plaidev/nubrick-ios.git",
exact: "0.18.5"
exact: "0.19.2"
)
],
targets: [
Expand Down
12 changes: 10 additions & 2 deletions ios/nubrick_flutter/Sources/nubrick_flutter/Manager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ class NubrickFlutterManager {
projectId: String,
onEvent: (@Sendable (_ event: ComponentEvent) -> Void)? = nil,
onDispatch: ((_ event: NubrickEvent) -> Void)? = nil,
onTooltip: ((_ data: String, _ experimentId: String) -> Void)? = nil
onTooltip: ((_ data: String, _ experimentId: String, _ variantId: String?) -> Void)? = nil
) {
// Callbacks are passed at init to avoid missing events fired during initialization.
NubrickBridge.initialize(
Expand Down Expand Up @@ -284,10 +284,18 @@ class NubrickFlutterManager {
}

// tooltip
func connectTooltipEmbedding(channelId: String, rootBlock: String, messenger: FlutterBinaryMessenger) {
func connectTooltipEmbedding(
channelId: String,
experimentId: String,
variantId: String?,
rootBlock: String,
messenger: FlutterBinaryMessenger
) {
let channel = FlutterMethodChannel(name: "Nubrick/Embedding/\(channelId)", binaryMessenger: messenger)
let accessor = NubrickBridge.renderUIView(
json: rootBlock,
experimentId: experimentId,
variantId: variantId,
onEvent: { event in
channel.invokeMethod(ON_EVENT_METHOD, arguments: [
"name": event.name as Any?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,12 @@ public class NubrickFlutterPlugin: NSObject, FlutterPlugin {
])
}
},
onTooltip: { [weak self] data, experimentId in
onTooltip: { [weak self] data, experimentId, variantId in
Task { @MainActor in
self?.channel.invokeMethod("on-tooltip", arguments: [
"data": data,
"experimentId": experimentId,
"variantId": variantId,
])
}
}
Expand Down Expand Up @@ -157,8 +158,16 @@ public class NubrickFlutterPlugin: NSObject, FlutterPlugin {
case "connectTooltipEmbedding":
let args = call.arguments as! [String:Any]
let channelId = args["channelId"] as! String
let experimentId = args["experimentId"] as! String
let variantId = args["variantId"] as? String
let rootBlock = args["json"] as! String
self.manager.connectTooltipEmbedding(channelId: channelId, rootBlock: rootBlock, messenger: self.messenger)
self.manager.connectTooltipEmbedding(
channelId: channelId,
experimentId: experimentId,
variantId: variantId,
rootBlock: rootBlock,
messenger: self.messenger
)
result("ok")

case "callTooltipEmbeddingDispatch":
Expand Down
6 changes: 4 additions & 2 deletions lib/channel/nubrick_flutter_method_channel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,15 @@ class MethodChannelNubrickFlutter extends NubrickFlutterPlatform {
}

@override
Future<String?> connectTooltipEmbedding(
String channelId, UIRootBlock rootBlock) async {
Future<String?> connectTooltipEmbedding(String channelId, String experimentId,
String? variantId, UIRootBlock rootBlock) async {
var json = jsonEncode(rootBlock.encode());
final result = await methodChannel.invokeMethod<String>(
'connectTooltipEmbedding',
<String, dynamic>{
'channelId': channelId,
'experimentId': experimentId,
'variantId': variantId,
'json': json,
},
);
Expand Down
4 changes: 2 additions & 2 deletions lib/channel/nubrick_flutter_platform_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ abstract class NubrickFlutterPlatform extends PlatformInterface {
'connectEmbeddingInRemoteConfigValue() has not been implemented.');
}

Future<String?> connectTooltipEmbedding(
String channelId, UIRootBlock rootBlock) {
Future<String?> connectTooltipEmbedding(String channelId, String experimentId,
String? variantId, UIRootBlock rootBlock) {
throw UnimplementedError(
'connectTooltipEmbedding() has not been implemented.');
}
Expand Down
4 changes: 4 additions & 0 deletions lib/schema/generated.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading