react-native-stallion 1.1.2 → 2.0.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/Stallion.java +94 -10
- package/android/src/main/java/com/stallion/StallionApiUtil.java +58 -0
- package/android/src/main/java/com/stallion/StallionCommonUtil.java +25 -0
- package/android/src/main/java/com/stallion/StallionConstants.java +51 -15
- package/android/src/main/java/com/stallion/StallionDownloadCallback.java +7 -0
- package/android/src/main/java/com/stallion/StallionDownloadManager.java +121 -0
- package/android/src/main/java/com/stallion/StallionErrorBoundary.java +28 -4
- package/android/src/main/java/com/stallion/StallionEventEmitter.java +144 -0
- package/android/src/main/java/com/stallion/StallionFileUtil.java +129 -0
- package/android/src/main/java/com/stallion/StallionModule.java +100 -154
- package/android/src/main/java/com/stallion/StallionRollbackManager.java +82 -0
- package/android/src/main/java/com/stallion/StallionStorage.java +16 -6
- package/android/src/main/java/com/stallion/StallionSynManager.java +142 -0
- package/ios/main/Stallion-Bridging-Header.h +4 -0
- package/ios/main/Stallion.m +7 -5
- package/ios/main/Stallion.swift +80 -39
- package/ios/main/StallionConstants.swift +52 -10
- package/ios/main/StallionDownloader.swift +39 -52
- package/ios/main/StallionErrorBoundary.h +1 -1
- package/ios/main/StallionErrorBoundary.m +45 -28
- package/ios/main/StallionEventEmitter.swift +20 -0
- package/ios/main/StallionEventManager.h +21 -0
- package/ios/main/StallionEventManager.m +57 -0
- package/ios/main/StallionModule.m +107 -23
- package/ios/main/StallionObjConstants.h +46 -0
- package/ios/main/StallionObjConstants.m +124 -0
- package/ios/main/StallionObjUtil.h +14 -0
- package/ios/main/StallionObjUtil.m +22 -0
- package/ios/main/StallionRollbackHandler.h +22 -0
- package/ios/main/StallionRollbackHandler.m +128 -0
- package/ios/main/StallionSyncManager.swift +149 -0
- package/ios/main/StallionUtil.swift +2 -12
- package/package.json +6 -2
- package/src/index.js +5 -15
- package/src/index.js.map +1 -1
- package/src/main/components/common/ButtonFullWidth/styles.js +2 -2
- package/src/main/components/common/ButtonFullWidth/styles.js.map +1 -1
- package/src/main/components/common/Footer/index.js +24 -31
- package/src/main/components/common/Footer/index.js.map +1 -1
- package/src/main/components/common/Footer/styles.js +34 -33
- package/src/main/components/common/Footer/styles.js.map +1 -1
- package/src/main/components/common/Header/index.js +12 -8
- package/src/main/components/common/Header/index.js.map +1 -1
- package/src/main/components/common/Header/styles.js +10 -5
- package/src/main/components/common/Header/styles.js.map +1 -1
- package/src/main/components/common/ProfileOverlay/index.js +18 -7
- package/src/main/components/common/ProfileOverlay/index.js.map +1 -1
- package/src/main/components/common/ProfileOverlay/styles.js +41 -8
- package/src/main/components/common/ProfileOverlay/styles.js.map +1 -1
- package/src/main/components/common/Spinner/index.js +3 -1
- package/src/main/components/common/Spinner/index.js.map +1 -1
- package/src/main/components/modules/listing/components/BucketCard.js +3 -3
- package/src/main/components/modules/listing/components/BucketCard.js.map +1 -1
- package/src/main/components/modules/listing/components/BundleCard.js +9 -5
- package/src/main/components/modules/listing/components/BundleCard.js.map +1 -1
- package/src/main/components/modules/listing/components/BundleCardInfoSection.js +20 -12
- package/src/main/components/modules/listing/components/BundleCardInfoSection.js.map +1 -1
- package/src/main/components/modules/listing/components/CardDescriptionContent.js +3 -2
- package/src/main/components/modules/listing/components/CardDescriptionContent.js.map +1 -1
- package/src/main/components/modules/listing/components/MetaCard.js +38 -0
- package/src/main/components/modules/listing/components/MetaCard.js.map +1 -0
- package/src/main/components/modules/listing/components/SlotView.js +82 -0
- package/src/main/components/modules/listing/components/SlotView.js.map +1 -0
- package/src/main/components/modules/listing/components/styles/index.js +28 -9
- package/src/main/components/modules/listing/components/styles/index.js.map +1 -1
- package/src/main/components/modules/listing/hooks/useListing.js +9 -2
- package/src/main/components/modules/listing/hooks/useListing.js.map +1 -1
- package/src/main/components/modules/listing/index.js +12 -4
- package/src/main/components/modules/listing/index.js.map +1 -1
- package/src/main/components/modules/login/components/styles/index.js +4 -4
- package/src/main/components/modules/login/components/styles/index.js.map +1 -1
- package/src/main/components/modules/login/index.js +1 -1
- package/src/main/components/modules/login/index.js.map +1 -1
- package/src/main/components/modules/login/styles/index.js +7 -6
- package/src/main/components/modules/login/styles/index.js.map +1 -1
- package/src/main/components/modules/modal/StallionModal.js +13 -11
- package/src/main/components/modules/modal/StallionModal.js.map +1 -1
- package/src/main/components/modules/modal/hooks/useStallionModal.js +87 -24
- package/src/main/components/modules/modal/hooks/useStallionModal.js.map +1 -1
- package/src/main/components/modules/prod/index.js +3 -0
- package/src/main/components/modules/prod/index.js.map +1 -0
- package/src/main/components/modules/prod/prod.js +35 -0
- package/src/main/components/modules/prod/prod.js.map +1 -0
- package/src/main/components/modules/prod/styles/index.js +20 -0
- package/src/main/components/modules/prod/styles/index.js.map +1 -0
- package/src/main/constants/apiConstants.js +3 -1
- package/src/main/constants/apiConstants.js.map +1 -1
- package/src/main/constants/appConstants.js +40 -4
- package/src/main/constants/appConstants.js.map +1 -1
- package/src/main/constants/colors.js +8 -6
- package/src/main/constants/colors.js.map +1 -1
- package/src/main/state/actionCreators/useDownloadActions.js +17 -37
- package/src/main/state/actionCreators/useDownloadActions.js.map +1 -1
- package/src/main/state/actionCreators/useMetaActions.js +4 -5
- package/src/main/state/actionCreators/useMetaActions.js.map +1 -1
- package/src/main/state/actionCreators/useUpdateMetaActions.js +100 -0
- package/src/main/state/actionCreators/useUpdateMetaActions.js.map +1 -0
- package/src/main/state/actionCreators/useUserActions.js +4 -4
- package/src/main/state/actionCreators/useUserActions.js.map +1 -1
- package/src/main/state/index.js +15 -2
- package/src/main/state/index.js.map +1 -1
- package/src/main/state/reducers/updateMetaReducer.js +36 -0
- package/src/main/state/reducers/updateMetaReducer.js.map +1 -0
- package/src/main/utils/ErrorBoundary.js +15 -14
- package/src/main/utils/ErrorBoundary.js.map +1 -1
- package/src/main/utils/EventUtil.js +28 -0
- package/src/main/utils/EventUtil.js.map +1 -0
- package/src/main/utils/SharedDataManager.js +15 -12
- package/src/main/utils/SharedDataManager.js.map +1 -1
- package/src/main/utils/StallionEventEmitter.js +20 -0
- package/src/main/utils/StallionEventEmitter.js.map +1 -0
- package/src/main/utils/StallionNativeUtils.js +60 -0
- package/src/main/utils/StallionNativeUtils.js.map +1 -0
- package/src/main/utils/apiUtils.js +8 -0
- package/src/main/utils/apiUtils.js.map +1 -1
- package/src/main/utils/useStallionModal.js +4 -3
- package/src/main/utils/useStallionModal.js.map +1 -1
- package/src/main/utils/useStallionUpdate.js +13 -0
- package/src/main/utils/useStallionUpdate.js.map +1 -0
- package/src/main/utils/withStallion.js +1 -4
- package/src/main/utils/withStallion.js.map +1 -1
- package/src/types/meta.types.js +13 -0
- package/src/types/meta.types.js.map +1 -1
- package/src/types/updateMeta.types.js +7 -0
- package/src/types/updateMeta.types.js.map +1 -0
- package/types/index.d.ts +3 -0
- package/types/index.d.ts.map +1 -1
- package/types/main/components/common/Footer/index.d.ts +1 -4
- package/types/main/components/common/Footer/index.d.ts.map +1 -1
- package/types/main/components/common/Footer/styles.d.ts +30 -29
- package/types/main/components/common/Footer/styles.d.ts.map +1 -1
- package/types/main/components/common/Header/index.d.ts.map +1 -1
- package/types/main/components/common/Header/styles.d.ts +6 -1
- package/types/main/components/common/Header/styles.d.ts.map +1 -1
- package/types/main/components/common/ProfileOverlay/index.d.ts.map +1 -1
- package/types/main/components/common/ProfileOverlay/styles.d.ts +38 -5
- package/types/main/components/common/ProfileOverlay/styles.d.ts.map +1 -1
- package/types/main/components/common/Spinner/index.d.ts.map +1 -1
- package/types/main/components/modules/listing/components/BucketCard.d.ts.map +1 -1
- package/types/main/components/modules/listing/components/BundleCard.d.ts.map +1 -1
- package/types/main/components/modules/listing/components/BundleCardInfoSection.d.ts +2 -0
- package/types/main/components/modules/listing/components/BundleCardInfoSection.d.ts.map +1 -1
- package/types/main/components/modules/listing/components/CardDescriptionContent.d.ts.map +1 -1
- package/types/main/components/modules/listing/components/MetaCard.d.ts +8 -0
- package/types/main/components/modules/listing/components/MetaCard.d.ts.map +1 -0
- package/types/main/components/modules/listing/components/SlotView.d.ts +5 -0
- package/types/main/components/modules/listing/components/SlotView.d.ts.map +1 -0
- package/types/main/components/modules/listing/components/styles/index.d.ts +24 -5
- package/types/main/components/modules/listing/components/styles/index.d.ts.map +1 -1
- package/types/main/components/modules/listing/hooks/useListing.d.ts +2 -0
- package/types/main/components/modules/listing/hooks/useListing.d.ts.map +1 -1
- package/types/main/components/modules/listing/index.d.ts.map +1 -1
- package/types/main/components/modules/login/components/styles/index.d.ts +1 -1
- package/types/main/components/modules/login/styles/index.d.ts +4 -3
- package/types/main/components/modules/login/styles/index.d.ts.map +1 -1
- package/types/main/components/modules/modal/StallionModal.d.ts.map +1 -1
- package/types/main/components/modules/modal/hooks/useStallionModal.d.ts +2 -5
- package/types/main/components/modules/modal/hooks/useStallionModal.d.ts.map +1 -1
- package/types/main/components/modules/prod/index.d.ts +3 -0
- package/types/main/components/modules/prod/index.d.ts.map +1 -0
- package/types/main/components/modules/prod/prod.d.ts +4 -0
- package/types/main/components/modules/prod/prod.d.ts.map +1 -0
- package/types/main/components/modules/prod/styles/index.d.ts +16 -0
- package/types/main/components/modules/prod/styles/index.d.ts.map +1 -0
- package/types/main/constants/apiConstants.d.ts +4 -2
- package/types/main/constants/apiConstants.d.ts.map +1 -1
- package/types/main/constants/appConstants.d.ts +37 -4
- package/types/main/constants/appConstants.d.ts.map +1 -1
- package/types/main/constants/colors.d.ts +2 -0
- package/types/main/constants/colors.d.ts.map +1 -1
- package/types/main/index.d.ts +1 -1
- package/types/main/state/actionCreators/useDownloadActions.d.ts +3 -1
- package/types/main/state/actionCreators/useDownloadActions.d.ts.map +1 -1
- package/types/main/state/actionCreators/useMetaActions.d.ts +1 -1
- package/types/main/state/actionCreators/useMetaActions.d.ts.map +1 -1
- package/types/main/state/actionCreators/useUpdateMetaActions.d.ts +7 -0
- package/types/main/state/actionCreators/useUpdateMetaActions.d.ts.map +1 -0
- package/types/main/state/index.d.ts.map +1 -1
- package/types/main/state/reducers/updateMetaReducer.d.ts +9 -0
- package/types/main/state/reducers/updateMetaReducer.d.ts.map +1 -0
- package/types/main/utils/ErrorBoundary.d.ts +1 -1
- package/types/main/utils/ErrorBoundary.d.ts.map +1 -1
- package/types/main/utils/EventUtil.d.ts +9 -0
- package/types/main/utils/EventUtil.d.ts.map +1 -0
- package/types/main/utils/SharedDataManager.d.ts +8 -6
- package/types/main/utils/SharedDataManager.d.ts.map +1 -1
- package/types/main/utils/StallionEventEmitter.d.ts +14 -0
- package/types/main/utils/StallionEventEmitter.d.ts.map +1 -0
- package/types/main/utils/StallionNativeUtils.d.ts +15 -0
- package/types/main/utils/StallionNativeUtils.d.ts.map +1 -0
- package/types/main/utils/apiUtils.d.ts +5 -0
- package/types/main/utils/apiUtils.d.ts.map +1 -1
- package/types/main/utils/useStallionUpdate.d.ts +3 -0
- package/types/main/utils/useStallionUpdate.d.ts.map +1 -0
- package/types/main/utils/withStallion.d.ts +1 -2
- package/types/main/utils/withStallion.d.ts.map +1 -1
- package/types/types/globalProvider.types.d.ts +5 -1
- package/types/types/globalProvider.types.d.ts.map +1 -1
- package/types/types/meta.types.d.ts +19 -3
- package/types/types/meta.types.d.ts.map +1 -1
- package/types/types/updateMeta.types.d.ts +35 -0
- package/types/types/updateMeta.types.d.ts.map +1 -0
- package/types/types/utils.types.d.ts +9 -7
- package/types/types/utils.types.d.ts.map +1 -1
- package/android/src/main/java/com/stallion/StallionZip.java +0 -127
- package/src/main/utils/StallionNaitveUtils.js +0 -7
- package/src/main/utils/StallionNaitveUtils.js.map +0 -1
- package/types/main/utils/StallionNaitveUtils.d.ts +0 -7
- package/types/main/utils/StallionNaitveUtils.d.ts.map +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StallionEventEmitter.swift
|
|
3
|
+
// Pods
|
|
4
|
+
//
|
|
5
|
+
// Created by Thor963 on 26/09/24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import ZIPFoundation
|
|
10
|
+
|
|
11
|
+
@objc class StallionEventEmitter: NSObject {
|
|
12
|
+
internal class func sendEvent(eventType: String, data: Dictionary<String, Any>) {
|
|
13
|
+
var eventData = data
|
|
14
|
+
eventData[StallionConstants.APP_VERION_EVENT_KEY] = StallionSyncManager.getAppVersion()
|
|
15
|
+
Stallion.shared?.sendEvent(withName: StallionConstants.STALLION_NATIVE_EVENT_NAME, body: [
|
|
16
|
+
"type": eventType,
|
|
17
|
+
"payload": eventData
|
|
18
|
+
])
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
//
|
|
3
|
+
// StallionEventManager.m
|
|
4
|
+
// react-native-stallion
|
|
5
|
+
//
|
|
6
|
+
// Created by Thor963 on 26/09/24.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@interface StallionEventManager : NSObject
|
|
11
|
+
|
|
12
|
+
// Singleton instance method
|
|
13
|
+
+ (instancetype)sharedInstance;
|
|
14
|
+
|
|
15
|
+
// Method to queue an event
|
|
16
|
+
- (void)queueRNEvent:(NSString *)eventType withData:(NSDictionary *)value;
|
|
17
|
+
|
|
18
|
+
// Method to flush all events
|
|
19
|
+
- (NSArray *)flushAllEvents;
|
|
20
|
+
|
|
21
|
+
@end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StallionEventManager.m
|
|
3
|
+
// react-native-stallion
|
|
4
|
+
//
|
|
5
|
+
// Created by Thor963 on 26/09/24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import "StallionEventManager.h"
|
|
9
|
+
#import "StallionObjConstants.h"
|
|
10
|
+
|
|
11
|
+
@implementation StallionEventManager
|
|
12
|
+
|
|
13
|
+
#define kStallionEventListKey @"StallionEventListKey"
|
|
14
|
+
|
|
15
|
+
// Singleton instance method implementation
|
|
16
|
+
+ (instancetype)sharedInstance {
|
|
17
|
+
static StallionEventManager *sharedInstance = nil;
|
|
18
|
+
static dispatch_once_t onceToken;
|
|
19
|
+
dispatch_once(&onceToken, ^{
|
|
20
|
+
sharedInstance = [[self alloc] init];
|
|
21
|
+
});
|
|
22
|
+
return sharedInstance;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Helper method to retrieve events from NSUserDefaults
|
|
26
|
+
- (NSMutableArray *)getStoredEvents {
|
|
27
|
+
NSArray *storedEvents = [[NSUserDefaults standardUserDefaults] objectForKey:kStallionEventListKey];
|
|
28
|
+
if (storedEvents) {
|
|
29
|
+
return [storedEvents mutableCopy];
|
|
30
|
+
}
|
|
31
|
+
return [[NSMutableArray alloc] init];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Helper method to save events to NSUserDefaults
|
|
35
|
+
- (void)saveEvents:(NSArray *)events {
|
|
36
|
+
[[NSUserDefaults standardUserDefaults] setObject:events forKey:kStallionEventListKey];
|
|
37
|
+
[[NSUserDefaults standardUserDefaults] synchronize];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Method to queue an event and store it in NSUserDefaults
|
|
41
|
+
- (void)queueRNEvent:(NSString *)eventType withData:(NSDictionary *)value {
|
|
42
|
+
if (eventType && value) {
|
|
43
|
+
NSMutableArray *eventList = [self getStoredEvents];
|
|
44
|
+
NSDictionary *event = @{@"type": eventType, @"payload": value};
|
|
45
|
+
[eventList addObject:event];
|
|
46
|
+
[self saveEvents:eventList];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Method to flush all events from NSUserDefaults
|
|
51
|
+
- (NSArray *)flushAllEvents {
|
|
52
|
+
NSMutableArray *eventList = [self getStoredEvents];
|
|
53
|
+
[self saveEvents:@[]]; // Clear the event list in NSUserDefaults
|
|
54
|
+
return [eventList copy];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@end
|
|
@@ -7,33 +7,117 @@
|
|
|
7
7
|
|
|
8
8
|
#import "StallionModule.h"
|
|
9
9
|
#import "StallionErrorBoundary.h"
|
|
10
|
+
#import "StallionEventManager.h"
|
|
11
|
+
#import "StallionObjConstants.h"
|
|
12
|
+
#import "StallionRollbackHandler.h"
|
|
10
13
|
|
|
11
14
|
@implementation StallionModule
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
|
|
16
|
+
+ (NSURL *)getBundleURL {
|
|
17
|
+
return [self getBundleURL:nil];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
+ (NSURL *)getDefaultURL:(NSURL *)defaultBundleURL {
|
|
16
21
|
NSURL *defaultRNBundlePath = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
22
|
+
if(defaultBundleURL != nil) {
|
|
23
|
+
return defaultBundleURL;
|
|
24
|
+
} else return defaultRNBundlePath;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
+ (void)initExceptionHandling {
|
|
28
|
+
[StallionErrorBoundary initErrorBoundary];
|
|
29
|
+
[StallionErrorBoundary toggleExceptionHandler:TRUE];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
+ (NSURL *)getBundlePathFromDirectory:(NSString *)directoryPath {
|
|
33
|
+
NSString *bundlePath = [NSString stringWithFormat:@"%@/%@/%@", directoryPath, [StallionObjConstants build_folder_name], [StallionObjConstants bundle_file_name]];
|
|
34
|
+
return [NSURL fileURLWithPath:bundlePath];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
+ (NSURL *)getBundleURL:(NSURL *)defaultBundleURL {
|
|
38
|
+
NSString *switchState = [[NSUserDefaults standardUserDefaults] stringForKey:StallionObjConstants.switch_state_identifier] ?: @"";
|
|
39
|
+
NSString *cachedAppVersion = [[NSUserDefaults standardUserDefaults] stringForKey:StallionObjConstants.app_version_cache_key] ?: @"";
|
|
40
|
+
NSString *currentAppVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:StallionObjConstants.app_version_identifier];
|
|
41
|
+
if (currentAppVersion != cachedAppVersion) {
|
|
42
|
+
[[NSUserDefaults standardUserDefaults] setObject:currentAppVersion forKey:StallionObjConstants.app_version_cache_key];
|
|
43
|
+
[StallionRollbackHandler fallbackProd];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
NSFileManager *fileManager = [NSFileManager defaultManager];
|
|
47
|
+
NSError *error = nil;
|
|
48
|
+
NSString *documentDirectoryPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
|
|
49
|
+
|
|
50
|
+
NSString *tempDirectoryPath = [NSString stringWithFormat:@"%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants temp_folder_slot]];
|
|
51
|
+
NSString *newDirectoryPath = [NSString stringWithFormat:@"%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants new_folder_slot]];
|
|
52
|
+
NSString *stableDirectoryPath = [NSString stringWithFormat:@"%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants stable_folder_slot]];
|
|
53
|
+
|
|
54
|
+
NSString *tempDirectoryProd = [documentDirectoryPath stringByAppendingPathComponent:tempDirectoryPath];
|
|
55
|
+
NSString *newDirectoryProd = [documentDirectoryPath stringByAppendingPathComponent:newDirectoryPath];
|
|
56
|
+
NSString *stableDirectoryProd = [documentDirectoryPath stringByAppendingPathComponent:stableDirectoryPath];
|
|
57
|
+
|
|
58
|
+
NSString *tempDirectoryPathStage = [NSString stringWithFormat:@"%@/%@", [StallionObjConstants stage_directory], [StallionObjConstants temp_folder_slot]];
|
|
59
|
+
NSString *newDirectoryPathStage = [NSString stringWithFormat:@"%@/%@", [StallionObjConstants stage_directory], [StallionObjConstants new_folder_slot]];
|
|
60
|
+
|
|
61
|
+
NSString *tempDirectoryStage = [documentDirectoryPath stringByAppendingPathComponent:tempDirectoryPathStage];
|
|
62
|
+
NSString *newDirectoryStage = [documentDirectoryPath stringByAppendingPathComponent:newDirectoryPathStage];
|
|
63
|
+
|
|
64
|
+
// possible slots
|
|
65
|
+
NSString *newFolderSlot = [NSString stringWithFormat:@"/%@", [StallionObjConstants new_folder_slot]];
|
|
66
|
+
NSString *stableFolderSlot = [NSString stringWithFormat:@"/%@", [StallionObjConstants stable_folder_slot]];
|
|
67
|
+
NSString *tempFolderSlot = [NSString stringWithFormat:@"/%@", [StallionObjConstants temp_folder_slot]];
|
|
68
|
+
|
|
69
|
+
if (switchState == nil || [switchState isEqual:@""]) {
|
|
70
|
+
[[NSUserDefaults standardUserDefaults] setObject:StallionObjConstants.switch_state_prod forKey:StallionObjConstants.switch_state_identifier];
|
|
71
|
+
switchState = StallionObjConstants.switch_state_prod;
|
|
72
|
+
}
|
|
73
|
+
if([switchState isEqual:StallionObjConstants.switch_state_prod]) {
|
|
74
|
+
NSString *currentProdSlot = [[NSUserDefaults standardUserDefaults] stringForKey:StallionObjConstants.current_prod_slot_key] ?: @"";
|
|
75
|
+
|
|
76
|
+
if([currentProdSlot isEqual:tempFolderSlot]) {
|
|
77
|
+
NSString *newHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants new_folder_slot]];
|
|
78
|
+
NSString *newReleaseHash = [[NSUserDefaults standardUserDefaults] stringForKey:newHashPath] ?: @"";
|
|
79
|
+
|
|
80
|
+
if(![newReleaseHash isEqual:@""]) {
|
|
81
|
+
[StallionRollbackHandler stabilizeRelease];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
NSString *tempHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants temp_folder_slot]];
|
|
85
|
+
NSString *tempReleaseHash = [[NSUserDefaults standardUserDefaults] stringForKey:tempHashPath] ?: @"";
|
|
86
|
+
[fileManager removeItemAtPath:newDirectoryProd error:&error];
|
|
87
|
+
[fileManager moveItemAtPath:tempDirectoryProd toPath:newDirectoryProd error:&error];
|
|
88
|
+
[fileManager removeItemAtPath:tempDirectoryProd error:&error];
|
|
89
|
+
[StallionRollbackHandler promoteTempProd];
|
|
90
|
+
[[StallionEventManager sharedInstance] queueRNEvent: StallionObjConstants.installed_prod_event withData:@{StallionObjConstants.release_hash_key:tempReleaseHash}];
|
|
91
|
+
[self initExceptionHandling];
|
|
92
|
+
return [self getBundlePathFromDirectory:newDirectoryProd];
|
|
93
|
+
}
|
|
94
|
+
if([currentProdSlot isEqual:newFolderSlot]) {
|
|
95
|
+
[self initExceptionHandling];
|
|
96
|
+
return [self getBundlePathFromDirectory:newDirectoryProd];
|
|
35
97
|
}
|
|
98
|
+
if([currentProdSlot isEqual:stableFolderSlot]) {
|
|
99
|
+
[self initExceptionHandling];
|
|
100
|
+
return [self getBundlePathFromDirectory:stableDirectoryProd];
|
|
101
|
+
}
|
|
102
|
+
return [self getDefaultURL:defaultBundleURL];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if([switchState isEqual:StallionObjConstants.switch_state_stage]) {
|
|
106
|
+
NSString *currentStageSlot = [[NSUserDefaults standardUserDefaults] stringForKey:StallionObjConstants.current_stage_slot_key] ?: @"";
|
|
107
|
+
if([currentStageSlot isEqual:tempFolderSlot]) {
|
|
108
|
+
[fileManager removeItemAtPath:newDirectoryStage error:&error];
|
|
109
|
+
[fileManager moveItemAtPath:tempDirectoryStage toPath:newDirectoryStage error:&error];
|
|
110
|
+
[StallionRollbackHandler promoteTempStage];
|
|
111
|
+
[self initExceptionHandling];
|
|
112
|
+
return [self getBundlePathFromDirectory:newDirectoryStage];
|
|
113
|
+
}
|
|
114
|
+
if([currentStageSlot isEqual:newFolderSlot]) {
|
|
115
|
+
[self initExceptionHandling];
|
|
116
|
+
return [self getBundlePathFromDirectory:newDirectoryStage];
|
|
117
|
+
}
|
|
118
|
+
return [self getDefaultURL:defaultBundleURL];
|
|
36
119
|
}
|
|
37
|
-
|
|
120
|
+
return [self getDefaultURL:defaultBundleURL];
|
|
121
|
+
}
|
|
38
122
|
|
|
39
123
|
@end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StallionCommonConstants.h
|
|
3
|
+
// react-native-stallion
|
|
4
|
+
//
|
|
5
|
+
// Created by Thor963 on 27/09/24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import <Foundation/Foundation.h>
|
|
9
|
+
|
|
10
|
+
@interface StallionObjConstants : NSObject
|
|
11
|
+
|
|
12
|
+
@property (class, nonatomic, readonly) NSString *prod_directory;
|
|
13
|
+
@property (class, nonatomic, readonly) NSString *stage_directory;
|
|
14
|
+
@property (class, nonatomic, readonly) NSString *temp_folder_slot;
|
|
15
|
+
@property (class, nonatomic, readonly) NSString *new_folder_slot;
|
|
16
|
+
@property (class, nonatomic, readonly) NSString *stable_folder_slot;
|
|
17
|
+
@property (class, nonatomic, readonly) NSString *default_folder_slot;
|
|
18
|
+
|
|
19
|
+
@property (class, nonatomic, readonly) NSString *current_prod_slot_key;
|
|
20
|
+
@property (class, nonatomic, readonly) NSString *current_stage_slot_key;
|
|
21
|
+
@property (class, nonatomic, readonly) NSString *stallion_project_id_identifier;
|
|
22
|
+
@property (class, nonatomic, readonly) NSString *stallion_app_token_identifier;
|
|
23
|
+
@property (class, nonatomic, readonly) NSString *app_version_identifier;
|
|
24
|
+
@property (class, nonatomic, readonly) NSString *stallion_app_token_key;
|
|
25
|
+
@property (class, nonatomic, readonly) NSString *stallion_sdk_token_key;
|
|
26
|
+
@property (class, nonatomic, readonly) NSString *switch_state_identifier;
|
|
27
|
+
@property (class, nonatomic, readonly) NSString *switch_state_prod;
|
|
28
|
+
@property (class, nonatomic, readonly) NSString *switch_state_stage;
|
|
29
|
+
|
|
30
|
+
@property (class, nonatomic, readonly) NSString *rolled_back_prod_event;
|
|
31
|
+
@property (class, nonatomic, readonly) NSString *installed_prod_event;
|
|
32
|
+
@property (class, nonatomic, readonly) NSString *exception_prod_event;
|
|
33
|
+
@property (class, nonatomic, readonly) NSString *stabilized_prod_event;
|
|
34
|
+
|
|
35
|
+
@property (class, nonatomic, readonly) NSString *release_hash_key;
|
|
36
|
+
|
|
37
|
+
@property (class, nonatomic, readonly) NSString *app_version_cache_key;
|
|
38
|
+
|
|
39
|
+
@property (class, nonatomic, readonly) NSString *build_folder_name;
|
|
40
|
+
@property (class, nonatomic, readonly) NSString *bundle_file_name;
|
|
41
|
+
@property (class, nonatomic, readonly) NSString *stallion_native_event;
|
|
42
|
+
@property (class, nonatomic, readonly) NSString *last_rolled_back_release_hash_key;
|
|
43
|
+
@property (class, nonatomic, readonly) NSString *auto_rolled_back_prod_event;
|
|
44
|
+
@property (class, nonatomic, readonly) NSString *is_auto_rollback_key;
|
|
45
|
+
|
|
46
|
+
@end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StallionObjConstants.m
|
|
3
|
+
// react-native-stallion
|
|
4
|
+
//
|
|
5
|
+
// Created by Thor963 on 27/09/24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import "StallionObjConstants.h"
|
|
9
|
+
|
|
10
|
+
@implementation StallionObjConstants
|
|
11
|
+
|
|
12
|
+
+ (NSString *)prod_directory {
|
|
13
|
+
return @"StallionProd";
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
+ (NSString *)stage_directory {
|
|
17
|
+
return @"StallionStage";
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
+ (NSString *)temp_folder_slot {
|
|
21
|
+
return @"temp";
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
+ (NSString *)new_folder_slot {
|
|
25
|
+
return @"StallionNew";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
+ (NSString *)stable_folder_slot {
|
|
29
|
+
return @"StallionStable";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
+ (NSString *)default_folder_slot {
|
|
33
|
+
return @"Default";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
+ (NSString *)current_prod_slot_key {
|
|
37
|
+
return @"stallionProdCurrentSlot";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
+ (NSString *)current_stage_slot_key {
|
|
41
|
+
return @"stallionStageCurrentSlot";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
+ (NSString *)stallion_project_id_identifier {
|
|
45
|
+
return @"StallionProjectId";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
+ (NSString *)stallion_app_token_identifier {
|
|
49
|
+
return @"StallionAppToken";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
+ (NSString *)app_version_identifier {
|
|
53
|
+
return @"CFBundleShortVersionString";
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
+ (NSString *)stallion_app_token_key {
|
|
57
|
+
return @"x-app-token";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
+ (NSString *)stallion_sdk_token_key {
|
|
61
|
+
return @"x-sdk-access-token";
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
+ (NSString *)switch_state_prod {
|
|
65
|
+
return @"PROD";
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
+ (NSString *)switch_state_stage {
|
|
69
|
+
return @"STAGE";
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
+ (NSString *)switch_state_identifier {
|
|
73
|
+
return @"switchState";
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
+ (NSString *)rolled_back_prod_event {
|
|
77
|
+
return @"ROLLED_BACK_PROD";
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
+ (NSString *)auto_rolled_back_prod_event {
|
|
81
|
+
return @"AUTO_ROLLED_BACK_PROD";
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
+ (NSString *)installed_prod_event {
|
|
85
|
+
return @"INSTALLED_PROD";
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
+ (NSString *)exception_prod_event {
|
|
89
|
+
return @"EXCEPTION_PROD";
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
+ (NSString *)stabilized_prod_event {
|
|
93
|
+
return @"STABILIZED_PROD";
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
+ (NSString *)release_hash_key {
|
|
97
|
+
return @"releaseHash";
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
+ (NSString *)is_auto_rollback_key {
|
|
101
|
+
return @"isAutoRollback";
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
+ (NSString *)app_version_cache_key {
|
|
105
|
+
return @"cachedAppVersion";
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
+ (NSString *)build_folder_name {
|
|
109
|
+
return @"build";
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
+ (NSString *)bundle_file_name {
|
|
113
|
+
return @"main.jsbundle";
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
+ (NSString *)stallion_native_event {
|
|
117
|
+
return @"STALLION_NATIVE_EVENT";
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
+ (NSString *)last_rolled_back_release_hash_key {
|
|
121
|
+
return @"LAST_ROLLED_BACK_RELEASE_HASH";
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
@end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StallionObjUtil.m
|
|
3
|
+
// react-native-stallion
|
|
4
|
+
//
|
|
5
|
+
// Created by Thor963 on 27/09/24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import "StallionObjUtil.h"
|
|
9
|
+
|
|
10
|
+
@implementation StallionObjUtil
|
|
11
|
+
|
|
12
|
+
static BOOL _isMounted = false;
|
|
13
|
+
|
|
14
|
+
+ (BOOL)isMounted {
|
|
15
|
+
return _isMounted;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
+ (void)setIsMounted:(BOOL)isMounted {
|
|
19
|
+
_isMounted = isMounted;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StallionRollbackHandler.h
|
|
3
|
+
// react-native-stallion
|
|
4
|
+
//
|
|
5
|
+
// Created by Thor963 on 27/09/24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import <Foundation/Foundation.h>
|
|
9
|
+
|
|
10
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
11
|
+
|
|
12
|
+
@interface StallionRollbackHandler : NSObject
|
|
13
|
+
+ (void)rollbackProd:(BOOL)isAutoRollback;
|
|
14
|
+
+ (void)sendRollbackEvent:(BOOL)isAutoRollback releaseHash:(NSString *)releaseHash;
|
|
15
|
+
+ (void)rollbackStage;
|
|
16
|
+
+ (void)fallbackProd;
|
|
17
|
+
+ (void)promoteTempProd;
|
|
18
|
+
+ (void)promoteTempStage;
|
|
19
|
+
+ (void)stabilizeRelease;
|
|
20
|
+
@end
|
|
21
|
+
|
|
22
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StallionRollbackHandler.m
|
|
3
|
+
// react-native-stallion
|
|
4
|
+
//
|
|
5
|
+
// Created by Thor963 on 27/09/24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import "StallionRollbackHandler.h"
|
|
9
|
+
#import "StallionObjConstants.h"
|
|
10
|
+
#import "StallionEventManager.h"
|
|
11
|
+
|
|
12
|
+
@implementation StallionRollbackHandler
|
|
13
|
+
|
|
14
|
+
+ (void)sendRollbackEvent:(BOOL)isAutoRollback releaseHash:(NSString *)releaseHash {
|
|
15
|
+
[[StallionEventManager sharedInstance] queueRNEvent: isAutoRollback ? StallionObjConstants.auto_rolled_back_prod_event : StallionObjConstants.rolled_back_prod_event withData:@{StallionObjConstants.release_hash_key : releaseHash}];
|
|
16
|
+
if(isAutoRollback) {
|
|
17
|
+
[[NSUserDefaults standardUserDefaults] setObject: releaseHash forKey:StallionObjConstants.last_rolled_back_release_hash_key];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
+ (void)rollbackProd:(BOOL)isAutoRollback {
|
|
22
|
+
NSString *currentProdSlot = [[NSUserDefaults standardUserDefaults] stringForKey:StallionObjConstants.current_prod_slot_key] ?: @"";
|
|
23
|
+
|
|
24
|
+
// possible hashes
|
|
25
|
+
NSString *stableHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants stable_folder_slot]];
|
|
26
|
+
NSString *stableReleaseHash = [[NSUserDefaults standardUserDefaults] stringForKey:stableHashPath] ?: @"";
|
|
27
|
+
NSString *newHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants new_folder_slot]] ?: @"";
|
|
28
|
+
NSString *newReleaseHash = [[NSUserDefaults standardUserDefaults] stringForKey:newHashPath];
|
|
29
|
+
|
|
30
|
+
// possible slots
|
|
31
|
+
NSString *tempFolderSlot = [NSString stringWithFormat:@"/%@", [StallionObjConstants temp_folder_slot]];
|
|
32
|
+
NSString *newFolderSlot = [NSString stringWithFormat:@"/%@", [StallionObjConstants new_folder_slot]];
|
|
33
|
+
NSString *stableFolderSlot = [NSString stringWithFormat:@"/%@", [StallionObjConstants stable_folder_slot]];
|
|
34
|
+
NSString *defaultFolderSlot = [NSString stringWithFormat:@"/%@", [StallionObjConstants default_folder_slot]];
|
|
35
|
+
|
|
36
|
+
if([currentProdSlot isEqual:newFolderSlot]) {
|
|
37
|
+
// empty new hash
|
|
38
|
+
[[NSUserDefaults standardUserDefaults] setObject: @"" forKey:newHashPath];
|
|
39
|
+
if([stableReleaseHash isEqual:@""]) {
|
|
40
|
+
[[NSUserDefaults standardUserDefaults] setObject: defaultFolderSlot forKey:StallionObjConstants.current_prod_slot_key];
|
|
41
|
+
} else {
|
|
42
|
+
[[NSUserDefaults standardUserDefaults] setObject: stableFolderSlot forKey:StallionObjConstants.current_prod_slot_key];
|
|
43
|
+
}
|
|
44
|
+
[self sendRollbackEvent:isAutoRollback releaseHash:newReleaseHash];
|
|
45
|
+
} else if([currentProdSlot isEqual:stableFolderSlot]) {
|
|
46
|
+
[[NSUserDefaults standardUserDefaults] setObject: defaultFolderSlot forKey:StallionObjConstants.current_prod_slot_key];
|
|
47
|
+
[[NSUserDefaults standardUserDefaults] setObject: @"" forKey:stableHashPath];
|
|
48
|
+
[self sendRollbackEvent:isAutoRollback releaseHash:stableReleaseHash];
|
|
49
|
+
}
|
|
50
|
+
[[NSUserDefaults standardUserDefaults] synchronize];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
+ (void)fallbackProd {
|
|
54
|
+
NSString *stableHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants stable_folder_slot]];
|
|
55
|
+
NSString *newHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants new_folder_slot]];
|
|
56
|
+
NSString *tempHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants temp_folder_slot]];
|
|
57
|
+
NSString *defaultFolderSlot = [NSString stringWithFormat:@"/%@", [StallionObjConstants default_folder_slot]];
|
|
58
|
+
|
|
59
|
+
[[NSUserDefaults standardUserDefaults] setObject: defaultFolderSlot forKey:StallionObjConstants.current_prod_slot_key];
|
|
60
|
+
[[NSUserDefaults standardUserDefaults] setObject: @"" forKey:newHashPath];
|
|
61
|
+
[[NSUserDefaults standardUserDefaults] setObject: @"" forKey:stableHashPath];
|
|
62
|
+
[[NSUserDefaults standardUserDefaults] setObject: @"" forKey:tempHashPath];
|
|
63
|
+
[[NSUserDefaults standardUserDefaults] synchronize];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
+ (void)rollbackStage {
|
|
67
|
+
NSString *defaultFolderSlot = [NSString stringWithFormat:@"/%@", [StallionObjConstants default_folder_slot]];
|
|
68
|
+
NSString *newHashPathStage = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants stage_directory], [StallionObjConstants new_folder_slot]];
|
|
69
|
+
[[NSUserDefaults standardUserDefaults] setObject:defaultFolderSlot forKey:StallionObjConstants.current_stage_slot_key];
|
|
70
|
+
[[NSUserDefaults standardUserDefaults] setObject: @"" forKey:newHashPathStage];
|
|
71
|
+
[[NSUserDefaults standardUserDefaults] synchronize];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
+ (void)promoteTempProd {
|
|
75
|
+
NSString *tempHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants temp_folder_slot]];
|
|
76
|
+
NSString *tempReleaseHash = [[NSUserDefaults standardUserDefaults] stringForKey:tempHashPath];
|
|
77
|
+
|
|
78
|
+
NSString *newHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants new_folder_slot]];
|
|
79
|
+
|
|
80
|
+
NSString *newFolderSlot = [NSString stringWithFormat:@"/%@", [StallionObjConstants new_folder_slot]];
|
|
81
|
+
|
|
82
|
+
[[NSUserDefaults standardUserDefaults] setObject: tempReleaseHash forKey:newHashPath];
|
|
83
|
+
[[NSUserDefaults standardUserDefaults] setObject: newFolderSlot forKey:StallionObjConstants.current_prod_slot_key];
|
|
84
|
+
[[NSUserDefaults standardUserDefaults] setObject: @"" forKey:tempHashPath];
|
|
85
|
+
[[NSUserDefaults standardUserDefaults] synchronize];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
+ (void)promoteTempStage {
|
|
89
|
+
NSString *tempHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants stage_directory], [StallionObjConstants temp_folder_slot]];
|
|
90
|
+
NSString *tempReleaseHash = [[NSUserDefaults standardUserDefaults] stringForKey:tempHashPath] ?: @"";
|
|
91
|
+
|
|
92
|
+
NSString *newHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants stage_directory], [StallionObjConstants new_folder_slot]];
|
|
93
|
+
|
|
94
|
+
NSString *newFolderSlot = [NSString stringWithFormat:@"/%@", [StallionObjConstants new_folder_slot]];
|
|
95
|
+
|
|
96
|
+
[[NSUserDefaults standardUserDefaults] setObject: tempReleaseHash forKey:newHashPath];
|
|
97
|
+
[[NSUserDefaults standardUserDefaults] setObject: newFolderSlot forKey:StallionObjConstants.current_stage_slot_key];
|
|
98
|
+
[[NSUserDefaults standardUserDefaults] setObject: @"" forKey:tempHashPath];
|
|
99
|
+
[[NSUserDefaults standardUserDefaults] synchronize];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
+ (void)stabilizeRelease {
|
|
103
|
+
NSString *newHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants new_folder_slot]];
|
|
104
|
+
NSString *newReleaseHash = [[NSUserDefaults standardUserDefaults] stringForKey:newHashPath] ?: @"";
|
|
105
|
+
|
|
106
|
+
if(![newReleaseHash isEqual:@""]) {
|
|
107
|
+
NSString *stableHashPath = [NSString stringWithFormat:@"/%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants stable_folder_slot]];
|
|
108
|
+
|
|
109
|
+
NSFileManager *fileManager = [NSFileManager defaultManager];
|
|
110
|
+
NSError *error = nil;
|
|
111
|
+
NSString *newDirectoryPath = [NSString stringWithFormat:@"%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants new_folder_slot]];
|
|
112
|
+
NSString *stableDirectoryPath = [NSString stringWithFormat:@"%@/%@", [StallionObjConstants prod_directory], [StallionObjConstants stable_folder_slot]];
|
|
113
|
+
NSString *documentDirectoryPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
|
|
114
|
+
NSString *newDirectoryProd = [documentDirectoryPath stringByAppendingPathComponent:newDirectoryPath];
|
|
115
|
+
NSString *stableDirectoryProd = [documentDirectoryPath stringByAppendingPathComponent:stableDirectoryPath];
|
|
116
|
+
|
|
117
|
+
[fileManager removeItemAtPath:stableDirectoryProd error:&error];
|
|
118
|
+
[fileManager moveItemAtPath:newDirectoryProd toPath:stableDirectoryProd error:&error];
|
|
119
|
+
[fileManager removeItemAtPath:newDirectoryProd error:&error];
|
|
120
|
+
|
|
121
|
+
[[NSUserDefaults standardUserDefaults] setObject: newReleaseHash forKey:stableHashPath];
|
|
122
|
+
[[NSUserDefaults standardUserDefaults] setObject: @"" forKey:newHashPath];
|
|
123
|
+
|
|
124
|
+
[[StallionEventManager sharedInstance] queueRNEvent: StallionObjConstants.stabilized_prod_event withData:@{StallionObjConstants.release_hash_key : newReleaseHash}];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@end
|