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.
Files changed (209) hide show
  1. package/android/src/main/java/com/stallion/Stallion.java +94 -10
  2. package/android/src/main/java/com/stallion/StallionApiUtil.java +58 -0
  3. package/android/src/main/java/com/stallion/StallionCommonUtil.java +25 -0
  4. package/android/src/main/java/com/stallion/StallionConstants.java +51 -15
  5. package/android/src/main/java/com/stallion/StallionDownloadCallback.java +7 -0
  6. package/android/src/main/java/com/stallion/StallionDownloadManager.java +121 -0
  7. package/android/src/main/java/com/stallion/StallionErrorBoundary.java +28 -4
  8. package/android/src/main/java/com/stallion/StallionEventEmitter.java +144 -0
  9. package/android/src/main/java/com/stallion/StallionFileUtil.java +129 -0
  10. package/android/src/main/java/com/stallion/StallionModule.java +100 -154
  11. package/android/src/main/java/com/stallion/StallionRollbackManager.java +82 -0
  12. package/android/src/main/java/com/stallion/StallionStorage.java +16 -6
  13. package/android/src/main/java/com/stallion/StallionSynManager.java +142 -0
  14. package/ios/main/Stallion-Bridging-Header.h +4 -0
  15. package/ios/main/Stallion.m +7 -5
  16. package/ios/main/Stallion.swift +80 -39
  17. package/ios/main/StallionConstants.swift +52 -10
  18. package/ios/main/StallionDownloader.swift +39 -52
  19. package/ios/main/StallionErrorBoundary.h +1 -1
  20. package/ios/main/StallionErrorBoundary.m +45 -28
  21. package/ios/main/StallionEventEmitter.swift +20 -0
  22. package/ios/main/StallionEventManager.h +21 -0
  23. package/ios/main/StallionEventManager.m +57 -0
  24. package/ios/main/StallionModule.m +107 -23
  25. package/ios/main/StallionObjConstants.h +46 -0
  26. package/ios/main/StallionObjConstants.m +124 -0
  27. package/ios/main/StallionObjUtil.h +14 -0
  28. package/ios/main/StallionObjUtil.m +22 -0
  29. package/ios/main/StallionRollbackHandler.h +22 -0
  30. package/ios/main/StallionRollbackHandler.m +128 -0
  31. package/ios/main/StallionSyncManager.swift +149 -0
  32. package/ios/main/StallionUtil.swift +2 -12
  33. package/package.json +6 -2
  34. package/src/index.js +5 -15
  35. package/src/index.js.map +1 -1
  36. package/src/main/components/common/ButtonFullWidth/styles.js +2 -2
  37. package/src/main/components/common/ButtonFullWidth/styles.js.map +1 -1
  38. package/src/main/components/common/Footer/index.js +24 -31
  39. package/src/main/components/common/Footer/index.js.map +1 -1
  40. package/src/main/components/common/Footer/styles.js +34 -33
  41. package/src/main/components/common/Footer/styles.js.map +1 -1
  42. package/src/main/components/common/Header/index.js +12 -8
  43. package/src/main/components/common/Header/index.js.map +1 -1
  44. package/src/main/components/common/Header/styles.js +10 -5
  45. package/src/main/components/common/Header/styles.js.map +1 -1
  46. package/src/main/components/common/ProfileOverlay/index.js +18 -7
  47. package/src/main/components/common/ProfileOverlay/index.js.map +1 -1
  48. package/src/main/components/common/ProfileOverlay/styles.js +41 -8
  49. package/src/main/components/common/ProfileOverlay/styles.js.map +1 -1
  50. package/src/main/components/common/Spinner/index.js +3 -1
  51. package/src/main/components/common/Spinner/index.js.map +1 -1
  52. package/src/main/components/modules/listing/components/BucketCard.js +3 -3
  53. package/src/main/components/modules/listing/components/BucketCard.js.map +1 -1
  54. package/src/main/components/modules/listing/components/BundleCard.js +9 -5
  55. package/src/main/components/modules/listing/components/BundleCard.js.map +1 -1
  56. package/src/main/components/modules/listing/components/BundleCardInfoSection.js +20 -12
  57. package/src/main/components/modules/listing/components/BundleCardInfoSection.js.map +1 -1
  58. package/src/main/components/modules/listing/components/CardDescriptionContent.js +3 -2
  59. package/src/main/components/modules/listing/components/CardDescriptionContent.js.map +1 -1
  60. package/src/main/components/modules/listing/components/MetaCard.js +38 -0
  61. package/src/main/components/modules/listing/components/MetaCard.js.map +1 -0
  62. package/src/main/components/modules/listing/components/SlotView.js +82 -0
  63. package/src/main/components/modules/listing/components/SlotView.js.map +1 -0
  64. package/src/main/components/modules/listing/components/styles/index.js +28 -9
  65. package/src/main/components/modules/listing/components/styles/index.js.map +1 -1
  66. package/src/main/components/modules/listing/hooks/useListing.js +9 -2
  67. package/src/main/components/modules/listing/hooks/useListing.js.map +1 -1
  68. package/src/main/components/modules/listing/index.js +12 -4
  69. package/src/main/components/modules/listing/index.js.map +1 -1
  70. package/src/main/components/modules/login/components/styles/index.js +4 -4
  71. package/src/main/components/modules/login/components/styles/index.js.map +1 -1
  72. package/src/main/components/modules/login/index.js +1 -1
  73. package/src/main/components/modules/login/index.js.map +1 -1
  74. package/src/main/components/modules/login/styles/index.js +7 -6
  75. package/src/main/components/modules/login/styles/index.js.map +1 -1
  76. package/src/main/components/modules/modal/StallionModal.js +13 -11
  77. package/src/main/components/modules/modal/StallionModal.js.map +1 -1
  78. package/src/main/components/modules/modal/hooks/useStallionModal.js +87 -24
  79. package/src/main/components/modules/modal/hooks/useStallionModal.js.map +1 -1
  80. package/src/main/components/modules/prod/index.js +3 -0
  81. package/src/main/components/modules/prod/index.js.map +1 -0
  82. package/src/main/components/modules/prod/prod.js +35 -0
  83. package/src/main/components/modules/prod/prod.js.map +1 -0
  84. package/src/main/components/modules/prod/styles/index.js +20 -0
  85. package/src/main/components/modules/prod/styles/index.js.map +1 -0
  86. package/src/main/constants/apiConstants.js +3 -1
  87. package/src/main/constants/apiConstants.js.map +1 -1
  88. package/src/main/constants/appConstants.js +40 -4
  89. package/src/main/constants/appConstants.js.map +1 -1
  90. package/src/main/constants/colors.js +8 -6
  91. package/src/main/constants/colors.js.map +1 -1
  92. package/src/main/state/actionCreators/useDownloadActions.js +17 -37
  93. package/src/main/state/actionCreators/useDownloadActions.js.map +1 -1
  94. package/src/main/state/actionCreators/useMetaActions.js +4 -5
  95. package/src/main/state/actionCreators/useMetaActions.js.map +1 -1
  96. package/src/main/state/actionCreators/useUpdateMetaActions.js +100 -0
  97. package/src/main/state/actionCreators/useUpdateMetaActions.js.map +1 -0
  98. package/src/main/state/actionCreators/useUserActions.js +4 -4
  99. package/src/main/state/actionCreators/useUserActions.js.map +1 -1
  100. package/src/main/state/index.js +15 -2
  101. package/src/main/state/index.js.map +1 -1
  102. package/src/main/state/reducers/updateMetaReducer.js +36 -0
  103. package/src/main/state/reducers/updateMetaReducer.js.map +1 -0
  104. package/src/main/utils/ErrorBoundary.js +15 -14
  105. package/src/main/utils/ErrorBoundary.js.map +1 -1
  106. package/src/main/utils/EventUtil.js +28 -0
  107. package/src/main/utils/EventUtil.js.map +1 -0
  108. package/src/main/utils/SharedDataManager.js +15 -12
  109. package/src/main/utils/SharedDataManager.js.map +1 -1
  110. package/src/main/utils/StallionEventEmitter.js +20 -0
  111. package/src/main/utils/StallionEventEmitter.js.map +1 -0
  112. package/src/main/utils/StallionNativeUtils.js +60 -0
  113. package/src/main/utils/StallionNativeUtils.js.map +1 -0
  114. package/src/main/utils/apiUtils.js +8 -0
  115. package/src/main/utils/apiUtils.js.map +1 -1
  116. package/src/main/utils/useStallionModal.js +4 -3
  117. package/src/main/utils/useStallionModal.js.map +1 -1
  118. package/src/main/utils/useStallionUpdate.js +13 -0
  119. package/src/main/utils/useStallionUpdate.js.map +1 -0
  120. package/src/main/utils/withStallion.js +1 -4
  121. package/src/main/utils/withStallion.js.map +1 -1
  122. package/src/types/meta.types.js +13 -0
  123. package/src/types/meta.types.js.map +1 -1
  124. package/src/types/updateMeta.types.js +7 -0
  125. package/src/types/updateMeta.types.js.map +1 -0
  126. package/types/index.d.ts +3 -0
  127. package/types/index.d.ts.map +1 -1
  128. package/types/main/components/common/Footer/index.d.ts +1 -4
  129. package/types/main/components/common/Footer/index.d.ts.map +1 -1
  130. package/types/main/components/common/Footer/styles.d.ts +30 -29
  131. package/types/main/components/common/Footer/styles.d.ts.map +1 -1
  132. package/types/main/components/common/Header/index.d.ts.map +1 -1
  133. package/types/main/components/common/Header/styles.d.ts +6 -1
  134. package/types/main/components/common/Header/styles.d.ts.map +1 -1
  135. package/types/main/components/common/ProfileOverlay/index.d.ts.map +1 -1
  136. package/types/main/components/common/ProfileOverlay/styles.d.ts +38 -5
  137. package/types/main/components/common/ProfileOverlay/styles.d.ts.map +1 -1
  138. package/types/main/components/common/Spinner/index.d.ts.map +1 -1
  139. package/types/main/components/modules/listing/components/BucketCard.d.ts.map +1 -1
  140. package/types/main/components/modules/listing/components/BundleCard.d.ts.map +1 -1
  141. package/types/main/components/modules/listing/components/BundleCardInfoSection.d.ts +2 -0
  142. package/types/main/components/modules/listing/components/BundleCardInfoSection.d.ts.map +1 -1
  143. package/types/main/components/modules/listing/components/CardDescriptionContent.d.ts.map +1 -1
  144. package/types/main/components/modules/listing/components/MetaCard.d.ts +8 -0
  145. package/types/main/components/modules/listing/components/MetaCard.d.ts.map +1 -0
  146. package/types/main/components/modules/listing/components/SlotView.d.ts +5 -0
  147. package/types/main/components/modules/listing/components/SlotView.d.ts.map +1 -0
  148. package/types/main/components/modules/listing/components/styles/index.d.ts +24 -5
  149. package/types/main/components/modules/listing/components/styles/index.d.ts.map +1 -1
  150. package/types/main/components/modules/listing/hooks/useListing.d.ts +2 -0
  151. package/types/main/components/modules/listing/hooks/useListing.d.ts.map +1 -1
  152. package/types/main/components/modules/listing/index.d.ts.map +1 -1
  153. package/types/main/components/modules/login/components/styles/index.d.ts +1 -1
  154. package/types/main/components/modules/login/styles/index.d.ts +4 -3
  155. package/types/main/components/modules/login/styles/index.d.ts.map +1 -1
  156. package/types/main/components/modules/modal/StallionModal.d.ts.map +1 -1
  157. package/types/main/components/modules/modal/hooks/useStallionModal.d.ts +2 -5
  158. package/types/main/components/modules/modal/hooks/useStallionModal.d.ts.map +1 -1
  159. package/types/main/components/modules/prod/index.d.ts +3 -0
  160. package/types/main/components/modules/prod/index.d.ts.map +1 -0
  161. package/types/main/components/modules/prod/prod.d.ts +4 -0
  162. package/types/main/components/modules/prod/prod.d.ts.map +1 -0
  163. package/types/main/components/modules/prod/styles/index.d.ts +16 -0
  164. package/types/main/components/modules/prod/styles/index.d.ts.map +1 -0
  165. package/types/main/constants/apiConstants.d.ts +4 -2
  166. package/types/main/constants/apiConstants.d.ts.map +1 -1
  167. package/types/main/constants/appConstants.d.ts +37 -4
  168. package/types/main/constants/appConstants.d.ts.map +1 -1
  169. package/types/main/constants/colors.d.ts +2 -0
  170. package/types/main/constants/colors.d.ts.map +1 -1
  171. package/types/main/index.d.ts +1 -1
  172. package/types/main/state/actionCreators/useDownloadActions.d.ts +3 -1
  173. package/types/main/state/actionCreators/useDownloadActions.d.ts.map +1 -1
  174. package/types/main/state/actionCreators/useMetaActions.d.ts +1 -1
  175. package/types/main/state/actionCreators/useMetaActions.d.ts.map +1 -1
  176. package/types/main/state/actionCreators/useUpdateMetaActions.d.ts +7 -0
  177. package/types/main/state/actionCreators/useUpdateMetaActions.d.ts.map +1 -0
  178. package/types/main/state/index.d.ts.map +1 -1
  179. package/types/main/state/reducers/updateMetaReducer.d.ts +9 -0
  180. package/types/main/state/reducers/updateMetaReducer.d.ts.map +1 -0
  181. package/types/main/utils/ErrorBoundary.d.ts +1 -1
  182. package/types/main/utils/ErrorBoundary.d.ts.map +1 -1
  183. package/types/main/utils/EventUtil.d.ts +9 -0
  184. package/types/main/utils/EventUtil.d.ts.map +1 -0
  185. package/types/main/utils/SharedDataManager.d.ts +8 -6
  186. package/types/main/utils/SharedDataManager.d.ts.map +1 -1
  187. package/types/main/utils/StallionEventEmitter.d.ts +14 -0
  188. package/types/main/utils/StallionEventEmitter.d.ts.map +1 -0
  189. package/types/main/utils/StallionNativeUtils.d.ts +15 -0
  190. package/types/main/utils/StallionNativeUtils.d.ts.map +1 -0
  191. package/types/main/utils/apiUtils.d.ts +5 -0
  192. package/types/main/utils/apiUtils.d.ts.map +1 -1
  193. package/types/main/utils/useStallionUpdate.d.ts +3 -0
  194. package/types/main/utils/useStallionUpdate.d.ts.map +1 -0
  195. package/types/main/utils/withStallion.d.ts +1 -2
  196. package/types/main/utils/withStallion.d.ts.map +1 -1
  197. package/types/types/globalProvider.types.d.ts +5 -1
  198. package/types/types/globalProvider.types.d.ts.map +1 -1
  199. package/types/types/meta.types.d.ts +19 -3
  200. package/types/types/meta.types.d.ts.map +1 -1
  201. package/types/types/updateMeta.types.d.ts +35 -0
  202. package/types/types/updateMeta.types.d.ts.map +1 -0
  203. package/types/types/utils.types.d.ts +9 -7
  204. package/types/types/utils.types.d.ts.map +1 -1
  205. package/android/src/main/java/com/stallion/StallionZip.java +0 -127
  206. package/src/main/utils/StallionNaitveUtils.js +0 -7
  207. package/src/main/utils/StallionNaitveUtils.js.map +0 -1
  208. package/types/main/utils/StallionNaitveUtils.d.ts +0 -7
  209. 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
- + (NSURL *)getBundleURL {
13
- return [self getBundleURL:nil];
14
- }
15
- + (NSURL *)getBundleURL:(NSURL *)defaultBundleURL {
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
- NSString *documentDirectoryPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
18
- NSString *bundleFilePath = [documentDirectoryPath stringByAppendingPathComponent:@"StallionPackage/build/main.jsbundle"];
19
- NSURL *targetBundleUrl = [NSURL URLWithString:bundleFilePath];
20
-
21
- NSFileManager *fileManager = [NSFileManager defaultManager];
22
- if (![fileManager fileExistsAtPath:[targetBundleUrl path]]) {
23
- if(defaultBundleURL != nil) return defaultBundleURL;
24
- return defaultRNBundlePath;
25
- } else {
26
- NSString *switchState = [[NSUserDefaults standardUserDefaults]
27
- stringForKey:@"switchState"];
28
- if([switchState isEqual:@"STALLION_ON"]) {
29
- [StallionErrorBoundary initErrorBoundary];
30
- [StallionErrorBoundary toggleExceptionHandler:TRUE];
31
- return targetBundleUrl;
32
- } else {
33
- if(defaultBundleURL != nil) return defaultBundleURL;
34
- return defaultRNBundlePath;
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,14 @@
1
+ //
2
+ // StallionObjUtil.h
3
+ // react-native-stallion
4
+ //
5
+ // Created by Thor963 on 27/09/24.
6
+ //
7
+
8
+ #import <Foundation/Foundation.h>
9
+
10
+ @interface StallionObjUtil : NSObject
11
+
12
+ @property (class, nonatomic, assign) BOOL isMounted;
13
+
14
+ @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