react-native-stallion 2.4.0 → 2.5.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/stallion/StallionModule.java +15 -5
- package/android/src/main/java/com/stallion/networkmanager/StallionApiConstants.java +22 -1
- package/android/src/main/java/com/stallion/networkmanager/StallionSyncHandler.java +1 -1
- package/android/src/main/java/com/stallion/storage/StallionConfig.java +24 -1
- package/android/src/main/java/com/stallion/storage/StallionConfigConstants.java +1 -0
- package/android/src/main/java/com/stallion/utils/StallionApiBaseUrl.java +59 -0
- package/android/src/main/java/com/stallion/utils/StallionTokenRegion.java +51 -0
- package/ios/main/Stallion.swift +14 -1
- package/ios/main/StallionApiBaseUrl.swift +51 -0
- package/ios/main/StallionConfig.h +2 -0
- package/ios/main/StallionConfig.m +15 -1
- package/ios/main/StallionConfigConstants.h +1 -0
- package/ios/main/StallionConfigConstants.m +1 -0
- package/ios/main/StallionConstants.swift +10 -1
- package/ios/main/StallionObjConstants.h +1 -0
- package/ios/main/StallionObjConstants.m +4 -0
- package/ios/main/StallionTokenRegion.swift +44 -0
- package/package.json +1 -1
- package/src/main/components/modules/listing/components/SlotView.js.map +1 -1
- package/src/main/constants/apiConstants.js +5 -1
- package/src/main/constants/apiConstants.js.map +1 -1
- package/src/main/state/actionCreators/useConfigActions.js +3 -0
- package/src/main/state/actionCreators/useConfigActions.js.map +1 -1
- package/src/main/state/useStallionEvents.js +2 -0
- package/src/main/state/useStallionEvents.js.map +1 -1
- package/src/main/utils/getApiBaseUrl.js +46 -0
- package/src/main/utils/getApiBaseUrl.js.map +1 -0
- package/src/main/utils/parseTokenRegion.js +40 -0
- package/src/main/utils/parseTokenRegion.js.map +1 -0
- package/src/main/utils/useApiClient.js +10 -4
- package/src/main/utils/useApiClient.js.map +1 -1
- package/src/types/config.types.js.map +1 -1
- package/types/__tests__/parseTokenRegion.test.d.ts +2 -0
- package/types/__tests__/parseTokenRegion.test.d.ts.map +1 -0
- package/types/main/constants/apiConstants.d.ts +2 -1
- package/types/main/constants/apiConstants.d.ts.map +1 -1
- package/types/main/state/actionCreators/useConfigActions.d.ts.map +1 -1
- package/types/main/state/useStallionEvents.d.ts.map +1 -1
- package/types/main/utils/getApiBaseUrl.d.ts +18 -0
- package/types/main/utils/getApiBaseUrl.d.ts.map +1 -0
- package/types/main/utils/parseTokenRegion.d.ts +11 -0
- package/types/main/utils/parseTokenRegion.d.ts.map +1 -0
- package/types/main/utils/useApiClient.d.ts.map +1 -1
- package/types/types/config.types.d.ts +1 -0
- package/types/types/config.types.d.ts.map +1 -1
- package/types/types/utils.types.d.ts +1 -0
- package/types/types/utils.types.d.ts.map +1 -1
|
@@ -61,11 +61,21 @@ public class StallionModule extends ReactContextBaseJavaModule implements Lifecy
|
|
|
61
61
|
|
|
62
62
|
@ReactMethod
|
|
63
63
|
public void onLaunch(String launchData) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
64
|
+
try {
|
|
65
|
+
String customBaseUrl = null;
|
|
66
|
+
if (launchData != null && !launchData.isEmpty()) {
|
|
67
|
+
JSONObject launchDataJson = new JSONObject(launchData);
|
|
68
|
+
if (launchDataJson.has("baseUrl") && !launchDataJson.isNull("baseUrl")) {
|
|
69
|
+
String baseUrl = launchDataJson.optString("baseUrl", "");
|
|
70
|
+
if (!baseUrl.isEmpty()) {
|
|
71
|
+
customBaseUrl = baseUrl;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
com.stallion.utils.StallionApiBaseUrl.set(customBaseUrl);
|
|
76
|
+
} catch (Exception e) {
|
|
77
|
+
e.printStackTrace();
|
|
78
|
+
}
|
|
69
79
|
stallionStateManager.setIsMounted(true);
|
|
70
80
|
DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitter = getReactApplicationContext().getJSModule(
|
|
71
81
|
DeviceEventManagerModule.RCTDeviceEventEmitter.class
|
|
@@ -22,7 +22,28 @@ public class StallionApiConstants {
|
|
|
22
22
|
public static final String STALLION_SDK_TOKEN_KEY = "x-sdk-pin-access-token";
|
|
23
23
|
public static final String STALLION_DEVICE_ID_KEY = "uid";
|
|
24
24
|
|
|
25
|
+
/** Legacy global API host; used only to detect implicit defaults in prefs. */
|
|
26
|
+
public static final String LEGACY_DEFAULT_STALLION_API_BASE = "https://api.stalliontech.io";
|
|
25
27
|
|
|
26
|
-
public static final String
|
|
28
|
+
public static final String REGIONAL_API_BASE_AP = "https://api-ap.stalliontech.io";
|
|
29
|
+
public static final String REGIONAL_API_BASE_US = "https://api-us.stalliontech.io";
|
|
30
|
+
|
|
31
|
+
/** @deprecated Use LEGACY_DEFAULT_STALLION_API_BASE or getStallionApiBase() */
|
|
32
|
+
@Deprecated
|
|
33
|
+
public static final String DEFAULT_STALLION_API_BASE = LEGACY_DEFAULT_STALLION_API_BASE;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Gets the API base URL from config or returns default
|
|
37
|
+
* @return String - The base URL to use
|
|
38
|
+
*/
|
|
39
|
+
public static String getStallionApiBase() {
|
|
40
|
+
return com.stallion.utils.StallionApiBaseUrl.get();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Keep old constant for backward compatibility, but mark as deprecated
|
|
44
|
+
/** @deprecated Use getStallionApiBase() instead */
|
|
45
|
+
@Deprecated
|
|
46
|
+
public static final String STALLION_API_BASE = DEFAULT_STALLION_API_BASE;
|
|
47
|
+
|
|
27
48
|
public static final String STALLION_INFO_API_PATH = "/api/v1/promoted/get-update-meta";
|
|
28
49
|
}
|
|
@@ -50,7 +50,7 @@ public class StallionSyncHandler {
|
|
|
50
50
|
|
|
51
51
|
// Make API call using StallionApiManager
|
|
52
52
|
JSONObject releaseMeta = StallionApiManager.post(
|
|
53
|
-
StallionApiConstants.
|
|
53
|
+
StallionApiConstants.getStallionApiBase() + StallionApiConstants.STALLION_INFO_API_PATH,
|
|
54
54
|
requestPayload.toString()
|
|
55
55
|
);
|
|
56
56
|
|
|
@@ -11,6 +11,9 @@ import org.json.JSONObject;
|
|
|
11
11
|
|
|
12
12
|
import java.util.UUID;
|
|
13
13
|
|
|
14
|
+
import com.stallion.storage.StallionConfigConstants;
|
|
15
|
+
import com.stallion.utils.StallionApiBaseUrl;
|
|
16
|
+
|
|
14
17
|
public class StallionConfig {
|
|
15
18
|
private String uid;
|
|
16
19
|
private final String projectId;
|
|
@@ -22,7 +25,7 @@ public class StallionConfig {
|
|
|
22
25
|
private String lastDownloadingUrl;
|
|
23
26
|
private String lastUnverifiedHash;
|
|
24
27
|
private final String publicSigningKey;
|
|
25
|
-
|
|
28
|
+
private String baseUrl;
|
|
26
29
|
|
|
27
30
|
public StallionConfig(Context context, SharedPreferences sharedPreferences) {
|
|
28
31
|
this.sharedPreferences = sharedPreferences;
|
|
@@ -77,6 +80,8 @@ public class StallionConfig {
|
|
|
77
80
|
this.filesDirectory = context.getFilesDir().getAbsolutePath();
|
|
78
81
|
this.lastDownloadingUrl = sharedPreferences.getString(StallionConfigConstants.LAST_DOWNLOADING_URL_IDENTIFIER, "");
|
|
79
82
|
this.lastUnverifiedHash = sharedPreferences.getString(StallionConfigConstants.LAST_UNVERIFIED_HASH, "");
|
|
83
|
+
String storedBaseUrl = sharedPreferences.getString(StallionConfigConstants.BASE_URL_IDENTIFIER, "");
|
|
84
|
+
this.baseUrl = storedBaseUrl != null ? storedBaseUrl : "";
|
|
80
85
|
}
|
|
81
86
|
|
|
82
87
|
public String getLastDownloadingUrl() {
|
|
@@ -143,6 +148,23 @@ public class StallionConfig {
|
|
|
143
148
|
return this.publicSigningKey;
|
|
144
149
|
}
|
|
145
150
|
|
|
151
|
+
public String getBaseUrl() {
|
|
152
|
+
return this.baseUrl;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
public void setBaseUrl(String baseUrl) {
|
|
156
|
+
if (baseUrl == null || baseUrl.isEmpty()) {
|
|
157
|
+
this.baseUrl = "";
|
|
158
|
+
sharedPreferences.edit().remove(StallionConfigConstants.BASE_URL_IDENTIFIER).apply();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
this.baseUrl = baseUrl;
|
|
162
|
+
sharedPreferences
|
|
163
|
+
.edit()
|
|
164
|
+
.putString(StallionConfigConstants.BASE_URL_IDENTIFIER, this.baseUrl)
|
|
165
|
+
.apply();
|
|
166
|
+
}
|
|
167
|
+
|
|
146
168
|
public JSONObject toJSON() {
|
|
147
169
|
JSONObject configJson = new JSONObject();
|
|
148
170
|
try {
|
|
@@ -151,6 +173,7 @@ public class StallionConfig {
|
|
|
151
173
|
configJson.put("appToken", this.appToken);
|
|
152
174
|
configJson.put("sdkToken", this.sdkToken);
|
|
153
175
|
configJson.put("appVersion", this.appVersion);
|
|
176
|
+
configJson.put("baseUrl", StallionApiBaseUrl.get());
|
|
154
177
|
return configJson;
|
|
155
178
|
} catch (JSONException ignored) {
|
|
156
179
|
return new JSONObject();
|
|
@@ -12,6 +12,7 @@ public class StallionConfigConstants {
|
|
|
12
12
|
public static final String API_KEY_IDENTIFIER = "x-sdk-access-token";
|
|
13
13
|
public static final String LAST_DOWNLOADING_URL_IDENTIFIER = "StallionLastDownloadingUrl";
|
|
14
14
|
public static final String LAST_UNVERIFIED_HASH = "LastUnverifiedHash";
|
|
15
|
+
public static final String BASE_URL_IDENTIFIER = "StallionBaseUrl";
|
|
15
16
|
|
|
16
17
|
public static final String PROD_DIRECTORY = "/StallionProd";
|
|
17
18
|
public static final String STAGE_DIRECTORY = "/StallionStage";
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
package com.stallion.utils;
|
|
2
|
+
|
|
3
|
+
import com.stallion.storage.StallionConfig;
|
|
4
|
+
import com.stallion.storage.StallionStateManager;
|
|
5
|
+
import com.stallion.networkmanager.StallionApiConstants;
|
|
6
|
+
|
|
7
|
+
public class StallionApiBaseUrl {
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Gets the API base URL: custom baseUrl if set, else regional URL from app token.
|
|
11
|
+
* @return String - The base URL to use
|
|
12
|
+
*/
|
|
13
|
+
public static String get() {
|
|
14
|
+
try {
|
|
15
|
+
StallionStateManager stateManager = StallionStateManager.getInstance();
|
|
16
|
+
if (stateManager != null && stateManager.getStallionConfig() != null) {
|
|
17
|
+
return resolve(stateManager.getStallionConfig());
|
|
18
|
+
}
|
|
19
|
+
} catch (Exception e) {
|
|
20
|
+
// Fallback to regional default on any error
|
|
21
|
+
}
|
|
22
|
+
return StallionApiConstants.REGIONAL_API_BASE_AP;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
static String resolve(StallionConfig config) {
|
|
26
|
+
String stored = config.getBaseUrl();
|
|
27
|
+
if (stored != null && !stored.isEmpty()) {
|
|
28
|
+
return stored;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
String region = StallionTokenRegion.parseTokenRegion(config.getAppToken());
|
|
32
|
+
if (region == null) {
|
|
33
|
+
region = StallionTokenRegion.defaultRegion();
|
|
34
|
+
}
|
|
35
|
+
return regionalBaseUrl(region);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static String regionalBaseUrl(String region) {
|
|
39
|
+
if ("us".equals(region)) {
|
|
40
|
+
return StallionApiConstants.REGIONAL_API_BASE_US;
|
|
41
|
+
}
|
|
42
|
+
return StallionApiConstants.REGIONAL_API_BASE_AP;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Sets a custom base URL, or clears it when null/empty.
|
|
47
|
+
* @param baseUrl - The custom base URL to set, or null/empty to clear
|
|
48
|
+
*/
|
|
49
|
+
public static void set(String baseUrl) {
|
|
50
|
+
try {
|
|
51
|
+
StallionStateManager stateManager = StallionStateManager.getInstance();
|
|
52
|
+
if (stateManager != null && stateManager.getStallionConfig() != null) {
|
|
53
|
+
stateManager.getStallionConfig().setBaseUrl(baseUrl);
|
|
54
|
+
}
|
|
55
|
+
} catch (Exception e) {
|
|
56
|
+
// Silently fail
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
package com.stallion.utils;
|
|
2
|
+
|
|
3
|
+
import java.util.Arrays;
|
|
4
|
+
import java.util.HashSet;
|
|
5
|
+
import java.util.Locale;
|
|
6
|
+
import java.util.Set;
|
|
7
|
+
|
|
8
|
+
public final class StallionTokenRegion {
|
|
9
|
+
|
|
10
|
+
private static final Set<String> VALID_REGIONS = new HashSet<>(Arrays.asList("ap", "us"));
|
|
11
|
+
|
|
12
|
+
private StallionTokenRegion() {}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Parses the region prefix from a Stallion token.
|
|
16
|
+
* Returns "ap", "us", or null. Null means legacy unprefixed token; caller should default to "ap".
|
|
17
|
+
*/
|
|
18
|
+
public static String parseTokenRegion(String token) {
|
|
19
|
+
if (token == null) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
token = token.trim();
|
|
23
|
+
if (token.isEmpty()) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// App token: spb_<region>_<44-char nanoid> → 49 chars
|
|
28
|
+
if (token.startsWith("spb_") && token.length() == 49 && token.charAt(6) == '_') {
|
|
29
|
+
return extractRegion(token);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// CI token: stl_<region>_<36-char nanoid> → 43 chars
|
|
33
|
+
if (token.startsWith("stl_") && token.length() == 43 && token.charAt(6) == '_') {
|
|
34
|
+
return extractRegion(token);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public static String defaultRegion() {
|
|
41
|
+
return "ap";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private static String extractRegion(String token) {
|
|
45
|
+
String code = token.substring(4, 6).toLowerCase(Locale.ROOT);
|
|
46
|
+
if (!code.matches("[a-z]{2}")) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return VALID_REGIONS.contains(code) ? code : null;
|
|
50
|
+
}
|
|
51
|
+
}
|
package/ios/main/Stallion.swift
CHANGED
|
@@ -28,6 +28,17 @@ class Stallion: RCTEventEmitter {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
@objc func onLaunch(_ launchData: String) {
|
|
31
|
+
var customBaseUrl = ""
|
|
32
|
+
if !launchData.isEmpty,
|
|
33
|
+
let data = launchData.data(using: .utf8),
|
|
34
|
+
let params = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],
|
|
35
|
+
params.keys.contains("baseUrl"),
|
|
36
|
+
let baseUrl = params["baseUrl"] as? String,
|
|
37
|
+
!baseUrl.isEmpty {
|
|
38
|
+
customBaseUrl = baseUrl
|
|
39
|
+
}
|
|
40
|
+
StallionApiBaseUrl.set(customBaseUrl)
|
|
41
|
+
|
|
31
42
|
stallionStateManager.isMounted = true
|
|
32
43
|
checkPendingDownloads()
|
|
33
44
|
let currentReleaseHash = stallionStateManager.stallionMeta.getHashAtCurrentProdSlot()
|
|
@@ -61,7 +72,9 @@ class Stallion: RCTEventEmitter {
|
|
|
61
72
|
@objc func getStallionConfig(_ promise: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) {
|
|
62
73
|
do {
|
|
63
74
|
if let config = stallionStateManager.stallionConfig {
|
|
64
|
-
|
|
75
|
+
var configDict = config.toDictionary() as? [String: Any] ?? [:]
|
|
76
|
+
configDict["baseUrl"] = StallionApiBaseUrl.get()
|
|
77
|
+
let configJsonData = try JSONSerialization.data(withJSONObject: configDict, options: [])
|
|
65
78
|
if let configJsonString = String(data: configJsonData, encoding: .utf8) {
|
|
66
79
|
promise(configJsonString)
|
|
67
80
|
} else {
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StallionApiBaseUrl.swift
|
|
3
|
+
// react-native-stallion
|
|
4
|
+
//
|
|
5
|
+
// Created for centralized base URL management
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
class StallionApiBaseUrl {
|
|
11
|
+
/**
|
|
12
|
+
* Gets the API base URL: custom baseUrl if set, else regional URL from app token.
|
|
13
|
+
*/
|
|
14
|
+
static func get() -> String {
|
|
15
|
+
guard let stateManager = StallionStateManager.sharedInstance() else {
|
|
16
|
+
return StallionConstants.REGIONAL_API_BASE_AP
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return resolve(config: stateManager.stallionConfig)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static func resolve(config: StallionConfig) -> String {
|
|
23
|
+
let stored = config.baseUrl ?? ""
|
|
24
|
+
if !stored.isEmpty {
|
|
25
|
+
return stored
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
var region = StallionTokenRegion.parseTokenRegion(config.appToken)
|
|
29
|
+
if region == nil {
|
|
30
|
+
region = StallionTokenRegion.defaultRegion()
|
|
31
|
+
}
|
|
32
|
+
return regionalBaseUrl(region!)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static func regionalBaseUrl(_ region: String) -> String {
|
|
36
|
+
if region == "us" {
|
|
37
|
+
return StallionConstants.REGIONAL_API_BASE_US
|
|
38
|
+
}
|
|
39
|
+
return StallionConstants.REGIONAL_API_BASE_AP
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Sets a custom base URL, or clears it when empty.
|
|
44
|
+
*/
|
|
45
|
+
static func set(_ baseUrl: String) {
|
|
46
|
+
guard let stateManager = StallionStateManager.sharedInstance() else {
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
stateManager.stallionConfig.updateBaseUrl(baseUrl)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -17,11 +17,13 @@
|
|
|
17
17
|
@property (nonatomic, copy, readonly) NSString *filesDirectory;
|
|
18
18
|
@property (nonatomic, copy, readonly) NSString *publicSigningKey;
|
|
19
19
|
@property (nonatomic, copy) NSString *lastUnverifiedHash;
|
|
20
|
+
@property (nonatomic, copy) NSString *baseUrl;
|
|
20
21
|
|
|
21
22
|
- (instancetype)initWithDefaults:(NSUserDefaults *)defaults;
|
|
22
23
|
|
|
23
24
|
- (void)updateSdkToken:(NSString *)newSdkToken;
|
|
24
25
|
- (void)updateLastUnverifiedHash:(NSString *)newUnverifiedHash;
|
|
26
|
+
- (void)updateBaseUrl:(NSString *)newBaseUrl;
|
|
25
27
|
- (NSDictionary *)toDictionary;
|
|
26
28
|
|
|
27
29
|
@end
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
#import "StallionConfig.h"
|
|
9
9
|
#import "StallionConfigConstants.h"
|
|
10
|
+
#import "StallionObjConstants.h"
|
|
10
11
|
|
|
11
12
|
@implementation StallionConfig
|
|
12
13
|
|
|
@@ -20,6 +21,7 @@
|
|
|
20
21
|
_filesDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject ?: @"";
|
|
21
22
|
_publicSigningKey = [[NSBundle mainBundle] objectForInfoDictionaryKey:STALLION_PUBLIC_SIGNING_KEY_IDENTIFIER] ?: @"";
|
|
22
23
|
_lastUnverifiedHash = [defaults stringForKey:LAST_UNVERIFIED_KEY_IDENTIFIER] ?: @"";
|
|
24
|
+
_baseUrl = [defaults stringForKey:BASE_URL_IDENTIFIER] ?: @"";
|
|
23
25
|
|
|
24
26
|
NSString *cachedUid = [defaults stringForKey:UNIQUE_ID_IDENTIFIER];
|
|
25
27
|
if (cachedUid && ![cachedUid isEqualToString:@""]) {
|
|
@@ -51,6 +53,17 @@
|
|
|
51
53
|
[[NSUserDefaults standardUserDefaults] synchronize];
|
|
52
54
|
}
|
|
53
55
|
|
|
56
|
+
- (void)updateBaseUrl:(NSString *)newBaseUrl {
|
|
57
|
+
if (newBaseUrl == nil || [newBaseUrl length] == 0) {
|
|
58
|
+
_baseUrl = @"";
|
|
59
|
+
[[NSUserDefaults standardUserDefaults] removeObjectForKey:BASE_URL_IDENTIFIER];
|
|
60
|
+
} else {
|
|
61
|
+
_baseUrl = newBaseUrl;
|
|
62
|
+
[[NSUserDefaults standardUserDefaults] setObject:_baseUrl forKey:BASE_URL_IDENTIFIER];
|
|
63
|
+
}
|
|
64
|
+
[[NSUserDefaults standardUserDefaults] synchronize];
|
|
65
|
+
}
|
|
66
|
+
|
|
54
67
|
- (NSDictionary *)toDictionary {
|
|
55
68
|
@try {
|
|
56
69
|
return @{
|
|
@@ -58,7 +71,8 @@
|
|
|
58
71
|
@"projectId": self.projectId ?: @"",
|
|
59
72
|
@"appToken": self.appToken ?: @"",
|
|
60
73
|
@"sdkToken": self.sdkToken ?: @"",
|
|
61
|
-
@"appVersion": self.appVersion ?: @""
|
|
74
|
+
@"appVersion": self.appVersion ?: @"",
|
|
75
|
+
@"baseUrl": self.baseUrl ?: @""
|
|
62
76
|
};
|
|
63
77
|
} @catch (NSException *exception) {
|
|
64
78
|
NSLog(@"Error in toDictionary: %@", exception.reason);
|
|
@@ -32,5 +32,6 @@ NSString *const UNZIP_FOLDER_NAME = @"/build";
|
|
|
32
32
|
NSString *const STALLION_PUBLIC_SIGNING_KEY_IDENTIFIER = @"StallionPublicSigningKey";
|
|
33
33
|
|
|
34
34
|
NSString *const LAST_UNVERIFIED_KEY_IDENTIFIER = @"LastUnverifiedHash";
|
|
35
|
+
NSString *const BASE_URL_IDENTIFIER = @"StallionBaseUrl";
|
|
35
36
|
|
|
36
37
|
@end
|
|
@@ -45,7 +45,16 @@ class StallionConstants {
|
|
|
45
45
|
|
|
46
46
|
static let CURRENT_PROD_SLOT_KEY = "stallionProdCurrentSlot"
|
|
47
47
|
static let CURRENT_STAGE_SLOT_KEY = "stallionStageCurrentSlot"
|
|
48
|
-
|
|
48
|
+
// Use utility for base URL (returns custom or default)
|
|
49
|
+
static var STALLION_API_BASE: String {
|
|
50
|
+
return StallionApiBaseUrl.get()
|
|
51
|
+
}
|
|
52
|
+
/// Legacy global API host; used only to detect implicit defaults in prefs.
|
|
53
|
+
static let LEGACY_DEFAULT_STALLION_API_BASE = "https://api.stalliontech.io"
|
|
54
|
+
static let REGIONAL_API_BASE_AP = "https://api-ap.stalliontech.io"
|
|
55
|
+
static let REGIONAL_API_BASE_US = "https://api-us.stalliontech.io"
|
|
56
|
+
/// @deprecated Use LEGACY_DEFAULT_STALLION_API_BASE or StallionApiBaseUrl.get()
|
|
57
|
+
static let DEFAULT_STALLION_API_BASE = LEGACY_DEFAULT_STALLION_API_BASE
|
|
49
58
|
static let STALLION_INFO_API_PATH = "/api/v1/promoted/get-update-meta"
|
|
50
59
|
static let STALLION_PROJECT_ID_IDENTIFIER = "StallionProjectId"
|
|
51
60
|
static let STALLION_APP_TOKEN_IDENTIFIER = "StallionAppToken"
|
|
@@ -45,5 +45,6 @@
|
|
|
45
45
|
@property (class, nonatomic, readonly) NSString *last_rolled_back_release_hash_key;
|
|
46
46
|
@property (class, nonatomic, readonly) NSString *auto_rolled_back_prod_event;
|
|
47
47
|
@property (class, nonatomic, readonly) NSString *is_auto_rollback_key;
|
|
48
|
+
@property (class, nonatomic, readonly) NSString *default_stallion_api_base;
|
|
48
49
|
|
|
49
50
|
@end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StallionTokenRegion.swift
|
|
3
|
+
// react-native-stallion
|
|
4
|
+
//
|
|
5
|
+
|
|
6
|
+
import Foundation
|
|
7
|
+
|
|
8
|
+
enum StallionTokenRegion {
|
|
9
|
+
private static let validRegions: Set<String> = ["ap", "us"]
|
|
10
|
+
|
|
11
|
+
/// Parses the region prefix from a Stallion token.
|
|
12
|
+
/// Returns "ap", "us", or nil. Nil means legacy unprefixed token; caller should default to "ap".
|
|
13
|
+
static func parseTokenRegion(_ token: String?) -> String? {
|
|
14
|
+
guard let token = token?.trimmingCharacters(in: .whitespacesAndNewlines), !token.isEmpty else {
|
|
15
|
+
return nil
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// App token: spb_<region>_<44-char nanoid> → 49 chars
|
|
19
|
+
if token.hasPrefix("spb_"), token.count == 49, token[token.index(token.startIndex, offsetBy: 6)] == "_" {
|
|
20
|
+
return extractRegion(from: token)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// CI token: stl_<region>_<36-char nanoid> → 43 chars
|
|
24
|
+
if token.hasPrefix("stl_"), token.count == 43, token[token.index(token.startIndex, offsetBy: 6)] == "_" {
|
|
25
|
+
return extractRegion(from: token)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return nil
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
static func defaultRegion() -> String {
|
|
32
|
+
return "ap"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private static func extractRegion(from token: String) -> String? {
|
|
36
|
+
let start = token.index(token.startIndex, offsetBy: 4)
|
|
37
|
+
let end = token.index(token.startIndex, offsetBy: 6)
|
|
38
|
+
let code = String(token[start..<end]).lowercased()
|
|
39
|
+
guard code.range(of: "^[a-z]{2}$", options: .regularExpression) != nil else {
|
|
40
|
+
return nil
|
|
41
|
+
}
|
|
42
|
+
return validRegions.contains(code) ? code : nil
|
|
43
|
+
}
|
|
44
|
+
}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["StyleSheet","View","React","SLOT_STATES","NATIVE_CONSTANTS","STD_MARGIN","COLORS","getSlotColor","slot","DEFAULT_FOLDER_SLOT","STABLE_FOLDER_SLOT","NEW_FOLDER_SLOT","indigo","TEMP_FOLDER_SLOT","green","StallionSlot","_ref","isActive","createElement","style","styles","slotItem","backgroundColor","borderWidth","SlotView","props","currentSlot","tempHash","stableHash","newHash","activeSlot","parentContainer","rowContainer","hash","DEFAULT","STABLE","NEW","create","justifyContent","alignItems","flexDirection","width","paddingRight","paddingVertical","white","flex","height","marginLeft","borderRadius"],"sourceRoot":"../../../../../../../src","sources":["main/components/modules/listing/components/SlotView.tsx"],"mappings":"AAAA,SAASA,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,OAAOC,KAAK,MAAM,OAAO;AACzB,SAEEC,WAAW,QACN,iCAAiC;AACxC,SACEC,gBAAgB,EAChBC,UAAU,QACL,oCAAoC;AAC3C,SAASC,MAAM,QAAQ,8BAA8B;AAcrD,SAASC,YAAYA,CAACC,IAAc,EAAU;EAC5C,QAAQA,IAAI;IACV,KAAKJ,gBAAgB,CAACK,mBAAmB;MACvC,OAAO,SAAS;IAClB,KAAKL,gBAAgB,CAACM,kBAAkB;MACtC,OAAO,SAAS;IAClB,KAAKN,gBAAgB,CAACO,eAAe;MACnC,OAAOL,MAAM,CAACM,MAAM;IACtB,KAAKR,gBAAgB,CAACS,gBAAgB;MACpC,OAAOP,MAAM,CAACQ,KAAK;EACvB;AACF;AAEA,MAAMC,YAAqC,GAAGC,IAAA,IAAwB;EAAA,IAAvB;IAAER,IAAI;IAAES;EAAS,CAAC,GAAAD,IAAA;EAC/D,oBACEd,KAAA,CAAAgB,aAAA,CAACjB,IAAI;IACHkB,KAAK,EAAE,CACLC,MAAM,CAACC,QAAQ,EACf;MACEC,eAAe,EAAEf,YAAY,CAACC,IAAI,CAAC;MACnCe,WAAW,EAAEN,QAAQ,GAAG,CAAC,GAAG;IAC9B,CAAC;EACD,
|
|
1
|
+
{"version":3,"names":["StyleSheet","View","React","SLOT_STATES","NATIVE_CONSTANTS","STD_MARGIN","COLORS","getSlotColor","slot","DEFAULT_FOLDER_SLOT","STABLE_FOLDER_SLOT","NEW_FOLDER_SLOT","indigo","TEMP_FOLDER_SLOT","green","StallionSlot","_ref","isActive","createElement","style","styles","slotItem","backgroundColor","borderWidth","SlotView","props","currentSlot","tempHash","stableHash","newHash","activeSlot","parentContainer","rowContainer","hash","DEFAULT","STABLE","NEW","create","justifyContent","alignItems","flexDirection","width","paddingRight","paddingVertical","white","flex","height","marginLeft","borderRadius"],"sourceRoot":"../../../../../../../src","sources":["main/components/modules/listing/components/SlotView.tsx"],"mappings":"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"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { DEFAULT_API_BASE_URL } from '../utils/getApiBaseUrl';
|
|
2
|
+
|
|
3
|
+
// Keep for backward compatibility, but mark as deprecated
|
|
4
|
+
/** @deprecated Use getApiBaseUrl() instead */
|
|
5
|
+
export const API_BASE_URL = DEFAULT_API_BASE_URL;
|
|
2
6
|
export let API_PATHS = /*#__PURE__*/function (API_PATHS) {
|
|
3
7
|
API_PATHS["LOGIN"] = "/api/v1/sdk/auth/verify-pin";
|
|
4
8
|
API_PATHS["VERIFY_OTP"] = "/api/v1/auth/verify-otp";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["API_BASE_URL","API_PATHS","BUNDLE_API_PAGE_SIZE"],"sourceRoot":"../../../../src","sources":["main/constants/apiConstants.ts"],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"names":["DEFAULT_API_BASE_URL","API_BASE_URL","API_PATHS","BUNDLE_API_PAGE_SIZE"],"sourceRoot":"../../../../src","sources":["main/constants/apiConstants.ts"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,wBAAwB;;AAE7D;AACA;AACA,OAAO,MAAMC,YAAY,GAAGD,oBAAoB;AAEhD,WAAYE,SAAS,0BAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAAA,OAATA,SAAS;AAAA;AAUrB,OAAO,MAAMC,oBAAoB,GAAG,EAAE"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { useCallback, useEffect } from 'react';
|
|
2
2
|
import { getStallionConfigNative } from '../../utils/StallionNativeUtils';
|
|
3
|
+
import { clearApiBaseUrlCache } from '../../utils/getApiBaseUrl';
|
|
3
4
|
import { setConfig } from '../actions/configActions';
|
|
4
5
|
const useConfigActions = dispatch => {
|
|
5
6
|
const refreshConfig = useCallback(async () => {
|
|
6
7
|
try {
|
|
7
8
|
const stallionConfig = await getStallionConfigNative();
|
|
8
9
|
dispatch(setConfig(stallionConfig));
|
|
10
|
+
// Clear base URL cache when config is refreshed to pick up any baseUrl changes
|
|
11
|
+
clearApiBaseUrlCache();
|
|
9
12
|
} catch (_) {}
|
|
10
13
|
}, [dispatch]);
|
|
11
14
|
useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useEffect","getStallionConfigNative","setConfig","useConfigActions","dispatch","refreshConfig","stallionConfig","_"],"sourceRoot":"../../../../../src","sources":["main/state/actionCreators/useConfigActions.ts"],"mappings":"AAAA,SAAgBA,WAAW,EAAEC,SAAS,QAAQ,OAAO;AAErD,SAASC,uBAAuB,QAAQ,iCAAiC;
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","getStallionConfigNative","clearApiBaseUrlCache","setConfig","useConfigActions","dispatch","refreshConfig","stallionConfig","_"],"sourceRoot":"../../../../../src","sources":["main/state/actionCreators/useConfigActions.ts"],"mappings":"AAAA,SAAgBA,WAAW,EAAEC,SAAS,QAAQ,OAAO;AAErD,SAASC,uBAAuB,QAAQ,iCAAiC;AACzE,SAASC,oBAAoB,QAAQ,2BAA2B;AAGhE,SAASC,SAAS,QAAQ,0BAA0B;AAEpD,MAAMC,gBAAgB,GAAIC,QAAuC,IAAK;EACpE,MAAMC,aAAa,GAAGP,WAAW,CAAC,YAAY;IAC5C,IAAI;MACF,MAAMQ,cAAc,GAAG,MAAMN,uBAAuB,CAAC,CAAC;MACtDI,QAAQ,CAACF,SAAS,CAACI,cAAc,CAAC,CAAC;MACnC;MACAL,oBAAoB,CAAC,CAAC;IACxB,CAAC,CAAC,OAAOM,CAAC,EAAE,CAAC;EACf,CAAC,EAAE,CAACH,QAAQ,CAAC,CAAC;EAEdL,SAAS,CAAC,MAAM;IACdM,aAAa,CAAC,CAAC;IACf;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IACLA;EACF,CAAC;AACH,CAAC;AAED,eAAeF,gBAAgB"}
|
|
@@ -8,6 +8,7 @@ import StallionNativeModule from '../../StallionNativeModule';
|
|
|
8
8
|
import { useApiClient } from '../utils/useApiClient';
|
|
9
9
|
import { API_PATHS } from '../constants/apiConstants';
|
|
10
10
|
import debounce from '../utils/debounce';
|
|
11
|
+
import { clearApiBaseUrlCache } from '../utils/getApiBaseUrl';
|
|
11
12
|
import { UpdateMetaActionKind } from '../../types/updateMeta.types';
|
|
12
13
|
const REFRESH_META_EVENTS = {
|
|
13
14
|
[NativeEventTypesProd.DOWNLOAD_COMPLETE_PROD]: true,
|
|
@@ -109,6 +110,7 @@ export const useStallionEvents = (refreshMeta, setProgress, configState, updateM
|
|
|
109
110
|
console.warn('React Native Stallion: Skipping onLaunchNative due to JS crash');
|
|
110
111
|
return;
|
|
111
112
|
}
|
|
113
|
+
clearApiBaseUrlCache();
|
|
112
114
|
if (stallionInitParams) {
|
|
113
115
|
try {
|
|
114
116
|
onLaunchNative(JSON.stringify(stallionInitParams));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useCallback","useMemo","NativeEventEmitter","NativeEventTypesProd","STALLION_NATIVE_EVENT","NativeEventTypesStage","DEFAULT_STALLION_PARAMS","stallionEventEmitter","acknowledgeEventsNative","onLaunchNative","popEventsNative","hasCrashOccurredCheck","StallionNativeModule","useApiClient","API_PATHS","debounce","UpdateMetaActionKind","REFRESH_META_EVENTS","DOWNLOAD_COMPLETE_PROD","ROLLED_BACK_PROD","AUTO_ROLLED_BACK_PROD","STABILIZED_PROD","DOWNLOAD_COMPLETE_STAGE","DOWNLOAD_ERROR_STAGE","INSTALLED_STAGE","STALLION_EVENT_DEBOUNCE_INTERVAL","processStallionEvent","eventString","JSON","parse","_","useStallionEvents","refreshMeta","setProgress","configState","updateMetaDispatch","stallionInitParams","getData","syncStallionEvents","stallionEvents","projectId","LOG_EVENTS","eventData","then","res","success","eventIds","map","event","eventId","eventIdString","stringify","popEvents","eventsString","eventsArr","length","requestAnimationFrame","popEventsDebounced","eventEmitter","addListener","nativeEventString","eventType","type","DOWNLOAD_STARTED_PROD","SET_PENDING_RELEASE_HASH","payload","releaseHash","emit","DOWNLOAD_PROGRESS_PROD","DOWNLOAD_ERROR_PROD","INSTALLED_PROD","SYNC_ERROR_PROD","EXCEPTION_PROD","DOWNLOAD_PROGRESS_STAGE","progress","Number","removeAllListeners","setTimeout","console","warn","Error"],"sourceRoot":"../../../../src","sources":["main/state/useStallionEvents.ts"],"mappings":"AAAA,SAASA,SAAS,EAAEC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AACvD,SAASC,kBAAkB,QAAQ,cAAc;AACjD,SACEC,oBAAoB,EACpBC,qBAAqB,EACrBC,qBAAqB,EACrBC,uBAAuB,QAClB,2BAA2B;AAClC,SAASC,oBAAoB,QAAQ,+BAA+B;AACpE,SACEC,uBAAuB,EACvBC,cAAc,EACdC,eAAe,QACV,8BAA8B;AACrC,SAASC,qBAAqB,QAAQ,qBAAqB;AAC3D,OAAOC,oBAAoB,MAAM,4BAA4B;AAE7D,SAASC,YAAY,QAAQ,uBAAuB;AACpD,SAASC,SAAS,QAAQ,2BAA2B;AACrD,OAAOC,QAAQ,MAAM,mBAAmB;AAExC,SAEEC,oBAAoB,QACf,8BAA8B;AAErC,MAAMC,mBAEL,GAAG;EACF,
|
|
1
|
+
{"version":3,"names":["useEffect","useCallback","useMemo","NativeEventEmitter","NativeEventTypesProd","STALLION_NATIVE_EVENT","NativeEventTypesStage","DEFAULT_STALLION_PARAMS","stallionEventEmitter","acknowledgeEventsNative","onLaunchNative","popEventsNative","hasCrashOccurredCheck","StallionNativeModule","useApiClient","API_PATHS","debounce","clearApiBaseUrlCache","UpdateMetaActionKind","REFRESH_META_EVENTS","DOWNLOAD_COMPLETE_PROD","ROLLED_BACK_PROD","AUTO_ROLLED_BACK_PROD","STABILIZED_PROD","DOWNLOAD_COMPLETE_STAGE","DOWNLOAD_ERROR_STAGE","INSTALLED_STAGE","STALLION_EVENT_DEBOUNCE_INTERVAL","processStallionEvent","eventString","JSON","parse","_","useStallionEvents","refreshMeta","setProgress","configState","updateMetaDispatch","stallionInitParams","getData","syncStallionEvents","stallionEvents","projectId","LOG_EVENTS","eventData","then","res","success","eventIds","map","event","eventId","eventIdString","stringify","popEvents","eventsString","eventsArr","length","requestAnimationFrame","popEventsDebounced","eventEmitter","addListener","nativeEventString","eventType","type","DOWNLOAD_STARTED_PROD","SET_PENDING_RELEASE_HASH","payload","releaseHash","emit","DOWNLOAD_PROGRESS_PROD","DOWNLOAD_ERROR_PROD","INSTALLED_PROD","SYNC_ERROR_PROD","EXCEPTION_PROD","DOWNLOAD_PROGRESS_STAGE","progress","Number","removeAllListeners","setTimeout","console","warn","Error"],"sourceRoot":"../../../../src","sources":["main/state/useStallionEvents.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { getStallionConfigNative } from './StallionNativeUtils';
|
|
2
|
+
import { AP_ORIGIN, parseTokenRegion, regionalApiBaseUrl } from './parseTokenRegion';
|
|
3
|
+
export const DEFAULT_API_BASE_URL = AP_ORIGIN;
|
|
4
|
+
export const LEGACY_API_BASE_URL = 'https://api.stalliontech.io';
|
|
5
|
+
|
|
6
|
+
// Cache for base URL
|
|
7
|
+
let cachedBaseUrl = null;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Gets the API base URL from native config or returns regional default
|
|
11
|
+
* @returns Promise<string> - The base URL to use
|
|
12
|
+
*/
|
|
13
|
+
export const getApiBaseUrl = async () => {
|
|
14
|
+
if (cachedBaseUrl) {
|
|
15
|
+
return cachedBaseUrl;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const config = await getStallionConfigNative();
|
|
19
|
+
if (config.baseUrl) {
|
|
20
|
+
cachedBaseUrl = config.baseUrl;
|
|
21
|
+
return cachedBaseUrl;
|
|
22
|
+
}
|
|
23
|
+
const region = parseTokenRegion(config.appToken);
|
|
24
|
+
cachedBaseUrl = regionalApiBaseUrl(region);
|
|
25
|
+
return cachedBaseUrl;
|
|
26
|
+
} catch {
|
|
27
|
+
return DEFAULT_API_BASE_URL;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Gets the API base URL synchronously (returns default if not cached)
|
|
33
|
+
* Use this when you need immediate access and can't await
|
|
34
|
+
* @returns string - The base URL (default if not loaded yet)
|
|
35
|
+
*/
|
|
36
|
+
export const getApiBaseUrlSync = () => {
|
|
37
|
+
return cachedBaseUrl || DEFAULT_API_BASE_URL;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Clears the cached base URL (useful for testing or config changes)
|
|
42
|
+
*/
|
|
43
|
+
export const clearApiBaseUrlCache = () => {
|
|
44
|
+
cachedBaseUrl = null;
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=getApiBaseUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getStallionConfigNative","AP_ORIGIN","parseTokenRegion","regionalApiBaseUrl","DEFAULT_API_BASE_URL","LEGACY_API_BASE_URL","cachedBaseUrl","getApiBaseUrl","config","baseUrl","region","appToken","getApiBaseUrlSync","clearApiBaseUrlCache"],"sourceRoot":"../../../../src","sources":["main/utils/getApiBaseUrl.ts"],"mappings":"AAAA,SAASA,uBAAuB,QAAQ,uBAAuB;AAC/D,SACEC,SAAS,EACTC,gBAAgB,EAChBC,kBAAkB,QACb,oBAAoB;AAE3B,OAAO,MAAMC,oBAAoB,GAAGH,SAAS;AAC7C,OAAO,MAAMI,mBAAmB,GAAG,6BAA6B;;AAEhE;AACA,IAAIC,aAA4B,GAAG,IAAI;;AAEvC;AACA;AACA;AACA;AACA,OAAO,MAAMC,aAAa,GAAG,MAAAA,CAAA,KAA6B;EACxD,IAAID,aAAa,EAAE;IACjB,OAAOA,aAAa;EACtB;EAEA,IAAI;IACF,MAAME,MAAM,GAAG,MAAMR,uBAAuB,CAAC,CAAC;IAC9C,IAAIQ,MAAM,CAACC,OAAO,EAAE;MAClBH,aAAa,GAAGE,MAAM,CAACC,OAAO;MAC9B,OAAOH,aAAa;IACtB;IACA,MAAMI,MAAM,GAAGR,gBAAgB,CAACM,MAAM,CAACG,QAAQ,CAAC;IAChDL,aAAa,GAAGH,kBAAkB,CAACO,MAAM,CAAC;IAC1C,OAAOJ,aAAa;EACtB,CAAC,CAAC,MAAM;IACN,OAAOF,oBAAoB;EAC7B;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMQ,iBAAiB,GAAGA,CAAA,KAAc;EAC7C,OAAON,aAAa,IAAIF,oBAAoB;AAC9C,CAAC;;AAED;AACA;AACA;AACA,OAAO,MAAMS,oBAAoB,GAAGA,CAAA,KAAY;EAC9CP,aAAa,GAAG,IAAI;AACtB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const AP_ORIGIN = 'https://api-ap.stalliontech.io';
|
|
2
|
+
const US_ORIGIN = 'https://api-us.stalliontech.io';
|
|
3
|
+
const VALID_REGIONS = new Set(['ap', 'us']);
|
|
4
|
+
export { AP_ORIGIN, US_ORIGIN, VALID_REGIONS };
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Parse the region prefix from a Stallion token.
|
|
8
|
+
* Returns 'ap' | 'us' | null. Null means legacy unprefixed token; default to 'ap'.
|
|
9
|
+
*/
|
|
10
|
+
export function parseTokenRegion(token) {
|
|
11
|
+
if (typeof token !== 'string') {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const trimmed = token.trim();
|
|
15
|
+
if (!trimmed) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// App token: spb_<region>_<44-char nanoid> → 49 chars
|
|
20
|
+
if (trimmed.startsWith('spb_') && trimmed.length === 49 && trimmed.charAt(6) === '_') {
|
|
21
|
+
return extractRegion(trimmed);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// CI token: stl_<region>_<36-char nanoid> → 43 chars
|
|
25
|
+
if (trimmed.startsWith('stl_') && trimmed.length === 43 && trimmed.charAt(6) === '_') {
|
|
26
|
+
return extractRegion(trimmed);
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
function extractRegion(token) {
|
|
31
|
+
const code = token.substring(4, 6).toLowerCase();
|
|
32
|
+
if (!/^[a-z]{2}$/.test(code)) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return VALID_REGIONS.has(code) ? code : null;
|
|
36
|
+
}
|
|
37
|
+
export function regionalApiBaseUrl(region) {
|
|
38
|
+
return region === 'us' ? US_ORIGIN : AP_ORIGIN;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=parseTokenRegion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AP_ORIGIN","US_ORIGIN","VALID_REGIONS","Set","parseTokenRegion","token","trimmed","trim","startsWith","length","charAt","extractRegion","code","substring","toLowerCase","test","has","regionalApiBaseUrl","region"],"sourceRoot":"../../../../src","sources":["main/utils/parseTokenRegion.ts"],"mappings":"AAAA,MAAMA,SAAS,GAAG,gCAAgC;AAClD,MAAMC,SAAS,GAAG,gCAAgC;AAElD,MAAMC,aAAa,GAAG,IAAIC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAE3C,SAASH,SAAS,EAAEC,SAAS,EAAEC,aAAa;;AAE5C;AACA;AACA;AACA;AACA,OAAO,SAASE,gBAAgBA,CAACC,KAAc,EAAsB;EACnE,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IAC7B,OAAO,IAAI;EACb;EAEA,MAAMC,OAAO,GAAGD,KAAK,CAACE,IAAI,CAAC,CAAC;EAC5B,IAAI,CAACD,OAAO,EAAE;IACZ,OAAO,IAAI;EACb;;EAEA;EACA,IACEA,OAAO,CAACE,UAAU,CAAC,MAAM,CAAC,IAC1BF,OAAO,CAACG,MAAM,KAAK,EAAE,IACrBH,OAAO,CAACI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EACzB;IACA,OAAOC,aAAa,CAACL,OAAO,CAAC;EAC/B;;EAEA;EACA,IACEA,OAAO,CAACE,UAAU,CAAC,MAAM,CAAC,IAC1BF,OAAO,CAACG,MAAM,KAAK,EAAE,IACrBH,OAAO,CAACI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EACzB;IACA,OAAOC,aAAa,CAACL,OAAO,CAAC;EAC/B;EAEA,OAAO,IAAI;AACb;AAEA,SAASK,aAAaA,CAACN,KAAa,EAAsB;EACxD,MAAMO,IAAI,GAAGP,KAAK,CAACQ,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;EAChD,IAAI,CAAC,YAAY,CAACC,IAAI,CAACH,IAAI,CAAC,EAAE;IAC5B,OAAO,IAAI;EACb;EACA,OAAOV,aAAa,CAACc,GAAG,CAACJ,IAAI,CAAC,GAAIA,IAAI,GAAmB,IAAI;AAC/D;AAEA,OAAO,SAASK,kBAAkBA,CAACC,MAAqB,EAAU;EAChE,OAAOA,MAAM,KAAK,IAAI,GAAGjB,SAAS,GAAGD,SAAS;AAChD"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import { useCallback } from 'react';
|
|
2
|
-
import {
|
|
1
|
+
import { useCallback, useState, useEffect } from 'react';
|
|
2
|
+
import { getApiBaseUrl, DEFAULT_API_BASE_URL } from './getApiBaseUrl';
|
|
3
3
|
export const useApiClient = (configState, authHandler) => {
|
|
4
|
+
const [baseUrl, setBaseUrl] = useState(DEFAULT_API_BASE_URL);
|
|
5
|
+
|
|
6
|
+
// Load base URL on mount
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
getApiBaseUrl().then(setBaseUrl);
|
|
9
|
+
}, []);
|
|
4
10
|
const getData = useCallback((apiPath, apiBody) => {
|
|
5
|
-
const dataRequest = fetch(
|
|
11
|
+
const dataRequest = fetch(baseUrl + apiPath, {
|
|
6
12
|
method: 'POST',
|
|
7
13
|
body: JSON.stringify(apiBody),
|
|
8
14
|
headers: {
|
|
@@ -20,7 +26,7 @@ export const useApiClient = (configState, authHandler) => {
|
|
|
20
26
|
return res.json();
|
|
21
27
|
});
|
|
22
28
|
} else return dataRequest.then(res => res.json());
|
|
23
|
-
}, [configState, authHandler]);
|
|
29
|
+
}, [baseUrl, configState, authHandler]);
|
|
24
30
|
return {
|
|
25
31
|
getData
|
|
26
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","
|
|
1
|
+
{"version":3,"names":["useCallback","useState","useEffect","getApiBaseUrl","DEFAULT_API_BASE_URL","useApiClient","configState","authHandler","baseUrl","setBaseUrl","then","getData","apiPath","apiBody","dataRequest","fetch","method","body","JSON","stringify","headers","appToken","sdkToken","res","status","json"],"sourceRoot":"../../../../src","sources":["main/utils/useApiClient.ts"],"mappings":"AAAA,SAASA,WAAW,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,OAAO;AACxD,SAASC,aAAa,EAAEC,oBAAoB,QAAQ,iBAAiB;AAMrE,OAAO,MAAMC,YAAY,GAAGA,CAC1BC,WAAgC,EAChCC,WAA0B,KACvB;EACH,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGR,QAAQ,CAASG,oBAAoB,CAAC;;EAEpE;EACAF,SAAS,CAAC,MAAM;IACdC,aAAa,CAAC,CAAC,CAACO,IAAI,CAACD,UAAU,CAAC;EAClC,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,OAAO,GAAGX,WAAW,CACzB,CAACY,OAAkB,EAAEC,OAAe,KAAmB;IACrD,MAAMC,WAAW,GAAGC,KAAK,CAACP,OAAO,GAAGI,OAAO,EAAE;MAC3CI,MAAM,EAAE,MAAM;MACdC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACN,OAAO,CAAC;MAC7BO,OAAO,EAAE;QACP,QAAQ,EAAE,kBAAkB;QAC5B,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAEd,WAAW,CAACe,QAAQ,IAAI,EAAE;QACzC,wBAAwB,EAAEf,WAAW,CAACgB,QAAQ,IAAI;MACpD;IACF,CAAC,CAAC;IACF,IAAIf,WAAW,EAAE;MACf,OAAOO,WAAW,CAACJ,IAAI,CAAEa,GAAG,IAAK;QAC/B,IAAIA,GAAG,CAACC,MAAM,KAAK,GAAG,EAAE;UACtBjB,WAAW,CAAC,IAAI,CAAC;QACnB;QACA,OAAOgB,GAAG,CAACE,IAAI,CAAC,CAAC;MACnB,CAAC,CAAC;IACJ,CAAC,MAAM,OAAOX,WAAW,CAACJ,IAAI,CAAEa,GAAG,IAAKA,GAAG,CAACE,IAAI,CAAC,CAAC,CAAC;EACrD,CAAC,EACD,CAACjB,OAAO,EAAEF,WAAW,EAAEC,WAAW,CACpC,CAAC;EACD,OAAO;IACLI;EACF,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ConfigActionKind"],"sourceRoot":"../../../src","sources":["types/config.types.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["ConfigActionKind"],"sourceRoot":"../../../src","sources":["types/config.types.ts"],"mappings":"AASA,WAAYA,gBAAgB,0BAAhBA,gBAAgB;EAAhBA,gBAAgB;EAAA,OAAhBA,gBAAgB;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseTokenRegion.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/parseTokenRegion.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
/** @deprecated Use getApiBaseUrl() instead */
|
|
2
|
+
export declare const API_BASE_URL = "https://api-ap.stalliontech.io";
|
|
2
3
|
export declare enum API_PATHS {
|
|
3
4
|
LOGIN = "/api/v1/sdk/auth/verify-pin",
|
|
4
5
|
VERIFY_OTP = "/api/v1/auth/verify-otp",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiConstants.d.ts","sourceRoot":"","sources":["../../../../src/main/constants/apiConstants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apiConstants.d.ts","sourceRoot":"","sources":["../../../../src/main/constants/apiConstants.ts"],"names":[],"mappings":"AAGA,8CAA8C;AAC9C,eAAO,MAAM,YAAY,mCAAuB,CAAC;AAEjD,oBAAY,SAAS;IACnB,KAAK,gCAAgC;IACrC,UAAU,4BAA4B;IACtC,aAAa,6BAA6B;IAC1C,aAAa,wBAAwB;IACrC,sBAAsB,6BAA6B;IACnD,YAAY,6BAA6B;IACzC,UAAU,sCAAsC;IAChD,kBAAkB,mCAAmC;CACtD;AACD,eAAO,MAAM,oBAAoB,KAAK,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConfigActions.d.ts","sourceRoot":"","sources":["../../../../../src/main/state/actionCreators/useConfigActions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAiC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useConfigActions.d.ts","sourceRoot":"","sources":["../../../../../src/main/state/actionCreators/useConfigActions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAiC,MAAM,OAAO,CAAC;AAKtD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,QAAA,MAAM,gBAAgB,aAAc,MAAM,QAAQ,CAAC,aAAa,CAAC;;CAkBhE,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStallionEvents.d.ts","sourceRoot":"","sources":["../../../../src/main/state/useStallionEvents.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EAEpB,qBAAqB,EAEtB,MAAM,2BAA2B,CAAC;AASnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"useStallionEvents.d.ts","sourceRoot":"","sources":["../../../../src/main/state/useStallionEvents.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EAEpB,qBAAqB,EAEtB,MAAM,2BAA2B,CAAC;AASnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EACL,iBAAiB,EAElB,MAAM,8BAA8B,CAAC;AActC,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,oBAAoB,GAAG,qBAAqB,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,eAAO,MAAM,iBAAiB,gBACf,MAAM,QAAQ,IAAI,CAAC,6BACL,MAAM,KAAK,IAAI,eAC7B,mBAAmB,sBACZ,MAAM,QAAQ,CAAC,iBAAiB,CAAC,uBAChC,mBAAmB,SAmHzC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const DEFAULT_API_BASE_URL = "https://api-ap.stalliontech.io";
|
|
2
|
+
export declare const LEGACY_API_BASE_URL = "https://api.stalliontech.io";
|
|
3
|
+
/**
|
|
4
|
+
* Gets the API base URL from native config or returns regional default
|
|
5
|
+
* @returns Promise<string> - The base URL to use
|
|
6
|
+
*/
|
|
7
|
+
export declare const getApiBaseUrl: () => Promise<string>;
|
|
8
|
+
/**
|
|
9
|
+
* Gets the API base URL synchronously (returns default if not cached)
|
|
10
|
+
* Use this when you need immediate access and can't await
|
|
11
|
+
* @returns string - The base URL (default if not loaded yet)
|
|
12
|
+
*/
|
|
13
|
+
export declare const getApiBaseUrlSync: () => string;
|
|
14
|
+
/**
|
|
15
|
+
* Clears the cached base URL (useful for testing or config changes)
|
|
16
|
+
*/
|
|
17
|
+
export declare const clearApiBaseUrlCache: () => void;
|
|
18
|
+
//# sourceMappingURL=getApiBaseUrl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getApiBaseUrl.d.ts","sourceRoot":"","sources":["../../../../src/main/utils/getApiBaseUrl.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,oBAAoB,mCAAY,CAAC;AAC9C,eAAO,MAAM,mBAAmB,gCAAgC,CAAC;AAKjE;;;GAGG;AACH,eAAO,MAAM,aAAa,QAAa,QAAQ,MAAM,CAiBpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAAO,MAEpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,QAAO,IAEvC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const AP_ORIGIN = "https://api-ap.stalliontech.io";
|
|
2
|
+
declare const US_ORIGIN = "https://api-us.stalliontech.io";
|
|
3
|
+
declare const VALID_REGIONS: Set<string>;
|
|
4
|
+
export { AP_ORIGIN, US_ORIGIN, VALID_REGIONS };
|
|
5
|
+
/**
|
|
6
|
+
* Parse the region prefix from a Stallion token.
|
|
7
|
+
* Returns 'ap' | 'us' | null. Null means legacy unprefixed token; default to 'ap'.
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseTokenRegion(token: unknown): 'ap' | 'us' | null;
|
|
10
|
+
export declare function regionalApiBaseUrl(region: string | null): string;
|
|
11
|
+
//# sourceMappingURL=parseTokenRegion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseTokenRegion.d.ts","sourceRoot":"","sources":["../../../../src/main/utils/parseTokenRegion.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,SAAS,mCAAmC,CAAC;AACnD,QAAA,MAAM,SAAS,mCAAmC,CAAC;AAEnD,QAAA,MAAM,aAAa,aAAwB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CA6BnE;AAUD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useApiClient.d.ts","sourceRoot":"","sources":["../../../../src/main/utils/useApiClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useApiClient.d.ts","sourceRoot":"","sources":["../../../../src/main/utils/useApiClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,KAAK,YAAY,GAAG,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;AAErD,eAAO,MAAM,YAAY,gBACV,mBAAmB,gBAClB,YAAY;uBAUd,SAAS,WAAW,MAAM,KAAG,QAAQ,GAAG,CAAC;CAyBtD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oBAAY,gBAAgB;IAC1B,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,gBAAgB,CAAC,UAAU,CAAC;IAClC,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC"}
|
|
@@ -8,6 +8,7 @@ interface IBundleInfo {
|
|
|
8
8
|
hash: string;
|
|
9
9
|
}
|
|
10
10
|
export interface IStallionInitParams {
|
|
11
|
+
baseUrl?: string;
|
|
11
12
|
}
|
|
12
13
|
export type IWithStallion = (BaseComponent: React.ComponentType, initPrams?: IStallionInitParams) => React.ComponentType;
|
|
13
14
|
export interface IStallionConfig {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.types.d.ts","sourceRoot":"","sources":["../../../src/types/utils.types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;
|
|
1
|
+
{"version":3,"file":"utils.types.d.ts","sourceRoot":"","sources":["../../../src/types/utils.types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,SAAS,CAAC,EAAE,mBAAmB,KAC5B,KAAK,CAAC,aAAa,CAAC;AAEzB,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAC7B,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEvE,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;AAElE,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE1E,MAAM,MAAM,2BAA2B,GAAG,CACxC,WAAW,EAAE,aAAa,KACvB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,qBAAqB,GAAG,CAClC,UAAU,EAAE,WAAW,KACpB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,qBAAqB,GAAG,CAAC,kBAAkB,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzE,MAAM,MAAM,2BAA2B,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sBAAsB,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC"}
|