Skip to content

Commit 4d9c001

Browse files
authored
Add skip if already triggered before a certain date (#49)
* add skipIfAlreadyTriggeredSinceIntervalStarted * bump version * add skipIfAlreadyTriggeredBefore instead * Fix tests * bump version * add skipIfAlreadyTriggeredBetween * bump version * Follow coderabbit suggestion * bump version * Update tests
1 parent d535124 commit 4d9c001

8 files changed

Lines changed: 227 additions & 12 deletions

File tree

.vscode/launch.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"configurations": [
3+
{
4+
"type": "radon-ide",
5+
"request": "launch",
6+
"name": "Radon IDE panel",
7+
"ios": {
8+
"scheme": "reactnativedeviceactivityexample"
9+
},
10+
"android": {}
11+
}
12+
]
13+
}

example/ios/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,7 +1205,7 @@ PODS:
12051205
- React-logger (= 0.74.5)
12061206
- React-perflogger (= 0.74.5)
12071207
- React-utils (= 0.74.5)
1208-
- ReactNativeDeviceActivity (0.2.3):
1208+
- ReactNativeDeviceActivity (0.4.9):
12091209
- ExpoModulesCore
12101210
- RNVectorIcons (10.2.0):
12111211
- DoubleConversion
@@ -1507,7 +1507,7 @@ SPEC CHECKSUMS:
15071507
React-runtimescheduler: cfbe85c3510c541ec6dc815c7729b41304b67961
15081508
React-utils: f242eb7e7889419d979ca0e1c02ccc0ea6e43b29
15091509
ReactCommon: f7da14a8827b72704169a48c929bcde802698361
1510-
ReactNativeDeviceActivity: 1501d123b0b00911140107eac87bbec9d722f48e
1510+
ReactNativeDeviceActivity: b00c7803cc397e2f5fe73cf82a6cbaa38a5a359e
15111511
RNVectorIcons: 845eda5c7819bd29699cafd0fc98c9d4afe28c96
15121512
SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d
15131513
SwiftLint: 92196976e597b9afec5dbe374810103e6c1d9d7c

example/ios/Tests/SharedTests.swift

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ class SkipActionTests: XCTestCase {
9393
skipIfLargerEventRecordedWithinMS: nil,
9494
neverTriggerBefore: shouldNotTriggerTime,
9595
skipIfLargerEventRecordedSinceIntervalStarted: false,
96+
skipIfAlreadyTriggeredBefore: nil,
97+
skipIfAlreadyTriggeredBetweenFromDate: nil,
98+
skipIfAlreadyTriggeredBetweenToDate: nil,
9699
activityName: activityName,
97100
callbackName: callbackName,
98101
eventName: eventName
@@ -105,6 +108,9 @@ class SkipActionTests: XCTestCase {
105108
skipIfLargerEventRecordedWithinMS: nil,
106109
neverTriggerBefore: shouldTriggerTime,
107110
skipIfLargerEventRecordedSinceIntervalStarted: false,
111+
skipIfAlreadyTriggeredBefore: nil,
112+
skipIfAlreadyTriggeredBetweenFromDate: nil,
113+
skipIfAlreadyTriggeredBetweenToDate: nil,
108114
activityName: activityName,
109115
callbackName: callbackName,
110116
eventName: eventName
@@ -114,6 +120,117 @@ class SkipActionTests: XCTestCase {
114120
XCTAssertTrue(shouldExecute)
115121
}
116122

123+
func testSkipIfAlreadyTriggeredBefore() {
124+
let activityName = "myActivityWithSkipIfAlreadyTriggeredBefore"
125+
let callbackName = "eventDidReachThreshold"
126+
let eventName = "10"
127+
let key = userDefaultKeyForEvent(
128+
activityName: activityName,
129+
callbackName: callbackName,
130+
eventName: eventName
131+
)
132+
133+
userDefaults?.set(1000, forKey: key)
134+
135+
let shouldNotExecute = shouldExecuteAction(
136+
skipIfAlreadyTriggeredAfter: nil,
137+
skipIfLargerEventRecordedAfter: nil,
138+
skipIfAlreadyTriggeredWithinMS: nil,
139+
skipIfLargerEventRecordedWithinMS: nil,
140+
neverTriggerBefore: nil,
141+
skipIfLargerEventRecordedSinceIntervalStarted: false,
142+
skipIfAlreadyTriggeredBefore: 1001,
143+
skipIfAlreadyTriggeredBetweenFromDate: nil,
144+
skipIfAlreadyTriggeredBetweenToDate: nil,
145+
activityName: activityName,
146+
callbackName: callbackName,
147+
eventName: eventName
148+
)
149+
150+
let shouldExecute = shouldExecuteAction(
151+
skipIfAlreadyTriggeredAfter: nil,
152+
skipIfLargerEventRecordedAfter: nil,
153+
skipIfAlreadyTriggeredWithinMS: nil,
154+
skipIfLargerEventRecordedWithinMS: nil,
155+
neverTriggerBefore: nil,
156+
skipIfLargerEventRecordedSinceIntervalStarted: false,
157+
skipIfAlreadyTriggeredBefore: 1000,
158+
skipIfAlreadyTriggeredBetweenFromDate: nil,
159+
skipIfAlreadyTriggeredBetweenToDate: nil,
160+
activityName: activityName,
161+
callbackName: callbackName,
162+
eventName: eventName
163+
)
164+
165+
XCTAssertFalse(shouldNotExecute)
166+
XCTAssertTrue(shouldExecute)
167+
}
168+
169+
}
170+
171+
class MoreSkipActionTests: XCTestCase {
172+
func testShouldSkipIfAlreadyTriggeredBetween() {
173+
let activityName = "myActivityWithSkipIfAlreadyTriggeredBetween"
174+
let callbackName = "eventDidReachThreshold"
175+
let eventName = "10"
176+
let key = userDefaultKeyForEvent(
177+
activityName: activityName,
178+
callbackName: callbackName,
179+
eventName: eventName
180+
)
181+
182+
userDefaults?.set(1000, forKey: key)
183+
184+
let shouldNotExecute = shouldExecuteAction(
185+
skipIfAlreadyTriggeredAfter: nil,
186+
skipIfLargerEventRecordedAfter: nil,
187+
skipIfAlreadyTriggeredWithinMS: nil,
188+
skipIfLargerEventRecordedWithinMS: nil,
189+
neverTriggerBefore: nil,
190+
skipIfLargerEventRecordedSinceIntervalStarted: false,
191+
skipIfAlreadyTriggeredBefore: nil,
192+
skipIfAlreadyTriggeredBetweenFromDate: 500,
193+
skipIfAlreadyTriggeredBetweenToDate: 1500,
194+
activityName: activityName,
195+
callbackName: callbackName,
196+
eventName: eventName
197+
)
198+
199+
let shouldExecute = shouldExecuteAction(
200+
skipIfAlreadyTriggeredAfter: nil,
201+
skipIfLargerEventRecordedAfter: nil,
202+
skipIfAlreadyTriggeredWithinMS: nil,
203+
skipIfLargerEventRecordedWithinMS: nil,
204+
neverTriggerBefore: nil,
205+
skipIfLargerEventRecordedSinceIntervalStarted: false,
206+
skipIfAlreadyTriggeredBefore: nil,
207+
skipIfAlreadyTriggeredBetweenFromDate: 1001,
208+
skipIfAlreadyTriggeredBetweenToDate: 1500,
209+
activityName: activityName,
210+
callbackName: callbackName,
211+
eventName: eventName
212+
)
213+
214+
let shouldAlsoExecute = shouldExecuteAction(
215+
skipIfAlreadyTriggeredAfter: nil,
216+
skipIfLargerEventRecordedAfter: nil,
217+
skipIfAlreadyTriggeredWithinMS: nil,
218+
skipIfLargerEventRecordedWithinMS: nil,
219+
neverTriggerBefore: nil,
220+
skipIfLargerEventRecordedSinceIntervalStarted: false,
221+
skipIfAlreadyTriggeredBefore: nil,
222+
skipIfAlreadyTriggeredBetweenFromDate: 500,
223+
skipIfAlreadyTriggeredBetweenToDate: 999,
224+
activityName: activityName,
225+
callbackName: callbackName,
226+
eventName: eventName
227+
)
228+
229+
XCTAssertFalse(shouldNotExecute)
230+
XCTAssertTrue(shouldExecute)
231+
XCTAssertTrue(shouldAlsoExecute)
232+
}
233+
117234
func testShouldSkipIfAlreadyTriggeredAfter() {
118235
let activityName = "myActivityWithSkipIfAlreadyTriggeredAfter"
119236
let callbackName = "eventDidReachThreshold"
@@ -133,6 +250,9 @@ class SkipActionTests: XCTestCase {
133250
skipIfLargerEventRecordedWithinMS: nil,
134251
neverTriggerBefore: nil,
135252
skipIfLargerEventRecordedSinceIntervalStarted: false,
253+
skipIfAlreadyTriggeredBefore: nil,
254+
skipIfAlreadyTriggeredBetweenFromDate: nil,
255+
skipIfAlreadyTriggeredBetweenToDate: nil,
136256
activityName: activityName,
137257
callbackName: callbackName,
138258
eventName: eventName
@@ -145,6 +265,9 @@ class SkipActionTests: XCTestCase {
145265
skipIfLargerEventRecordedWithinMS: nil,
146266
neverTriggerBefore: nil,
147267
skipIfLargerEventRecordedSinceIntervalStarted: false,
268+
skipIfAlreadyTriggeredBefore: nil,
269+
skipIfAlreadyTriggeredBetweenFromDate: nil,
270+
skipIfAlreadyTriggeredBetweenToDate: nil,
148271
activityName: activityName,
149272
callbackName: callbackName,
150273
eventName: eventName
@@ -175,6 +298,9 @@ class SkipActionTests: XCTestCase {
175298
skipIfLargerEventRecordedWithinMS: nil,
176299
neverTriggerBefore: nil,
177300
skipIfLargerEventRecordedSinceIntervalStarted: false,
301+
skipIfAlreadyTriggeredBefore: nil,
302+
skipIfAlreadyTriggeredBetweenFromDate: nil,
303+
skipIfAlreadyTriggeredBetweenToDate: nil,
178304
activityName: activityName,
179305
callbackName: callbackName,
180306
eventName: eventName
@@ -187,6 +313,9 @@ class SkipActionTests: XCTestCase {
187313
skipIfLargerEventRecordedWithinMS: nil,
188314
neverTriggerBefore: nil,
189315
skipIfLargerEventRecordedSinceIntervalStarted: false,
316+
skipIfAlreadyTriggeredBefore: nil,
317+
skipIfAlreadyTriggeredBetweenFromDate: nil,
318+
skipIfAlreadyTriggeredBetweenToDate: nil,
190319
activityName: activityName,
191320
callbackName: callbackName,
192321
eventName: eventName
@@ -218,6 +347,9 @@ class SkipActionTests: XCTestCase {
218347
skipIfLargerEventRecordedWithinMS: nil,
219348
neverTriggerBefore: nil,
220349
skipIfLargerEventRecordedSinceIntervalStarted: false,
350+
skipIfAlreadyTriggeredBefore: nil,
351+
skipIfAlreadyTriggeredBetweenFromDate: nil,
352+
skipIfAlreadyTriggeredBetweenToDate: nil,
221353
activityName: activityName,
222354
callbackName: callbackName,
223355
eventName: eventName
@@ -230,6 +362,9 @@ class SkipActionTests: XCTestCase {
230362
skipIfLargerEventRecordedWithinMS: nil,
231363
neverTriggerBefore: nil,
232364
skipIfLargerEventRecordedSinceIntervalStarted: false,
365+
skipIfAlreadyTriggeredBefore: nil,
366+
skipIfAlreadyTriggeredBetweenFromDate: nil,
367+
skipIfAlreadyTriggeredBetweenToDate: nil,
233368
activityName: activityName,
234369
callbackName: callbackName,
235370
eventName: eventName
@@ -263,6 +398,9 @@ class SkipActionTests: XCTestCase {
263398
skipIfLargerEventRecordedWithinMS: 100,
264399
neverTriggerBefore: nil,
265400
skipIfLargerEventRecordedSinceIntervalStarted: false,
401+
skipIfAlreadyTriggeredBefore: nil,
402+
skipIfAlreadyTriggeredBetweenFromDate: nil,
403+
skipIfAlreadyTriggeredBetweenToDate: nil,
266404
activityName: activityName,
267405
callbackName: callbackName,
268406
eventName: eventName
@@ -275,6 +413,9 @@ class SkipActionTests: XCTestCase {
275413
skipIfLargerEventRecordedWithinMS: 10000,
276414
neverTriggerBefore: nil,
277415
skipIfLargerEventRecordedSinceIntervalStarted: false,
416+
skipIfAlreadyTriggeredBefore: nil,
417+
skipIfAlreadyTriggeredBetweenFromDate: nil,
418+
skipIfAlreadyTriggeredBetweenToDate: nil,
278419
activityName: activityName,
279420
callbackName: callbackName,
280421
eventName: eventName
@@ -315,6 +456,9 @@ class SkipActionTests: XCTestCase {
315456
skipIfLargerEventRecordedWithinMS: nil,
316457
neverTriggerBefore: nil,
317458
skipIfLargerEventRecordedSinceIntervalStarted: true,
459+
skipIfAlreadyTriggeredBefore: nil,
460+
skipIfAlreadyTriggeredBetweenFromDate: nil,
461+
skipIfAlreadyTriggeredBetweenToDate: nil,
318462
activityName: activityName,
319463
callbackName: callbackName,
320464
eventName: "15"
@@ -327,6 +471,9 @@ class SkipActionTests: XCTestCase {
327471
skipIfLargerEventRecordedWithinMS: nil,
328472
neverTriggerBefore: nil,
329473
skipIfLargerEventRecordedSinceIntervalStarted: true,
474+
skipIfAlreadyTriggeredBefore: nil,
475+
skipIfAlreadyTriggeredBetweenFromDate: nil,
476+
skipIfAlreadyTriggeredBetweenToDate: nil,
330477
activityName: activityName,
331478
callbackName: callbackName,
332479
eventName: "5"

ios/Shared.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,9 @@ func shouldExecuteAction(
662662
skipIfLargerEventRecordedWithinMS: Double?,
663663
neverTriggerBefore: Double?,
664664
skipIfLargerEventRecordedSinceIntervalStarted: Bool?,
665+
skipIfAlreadyTriggeredBefore: Double?,
666+
skipIfAlreadyTriggeredBetweenFromDate: Double?,
667+
skipIfAlreadyTriggeredBetweenToDate: Double?,
665668
activityName: String,
666669
callbackName: String,
667670
eventName: String?
@@ -688,6 +691,42 @@ func shouldExecuteAction(
688691
}
689692
}
690693

694+
if skipIfAlreadyTriggeredBetweenFromDate != nil || skipIfAlreadyTriggeredBetweenToDate != nil {
695+
let skipIfAlreadyTriggeredBetweenFromDate =
696+
skipIfAlreadyTriggeredBetweenFromDate ?? Date.distantPast.timeIntervalSince1970 * 1000
697+
let skipIfAlreadyTriggeredBetweenToDate =
698+
skipIfAlreadyTriggeredBetweenToDate ?? Date.distantFuture.timeIntervalSince1970 * 1000
699+
700+
if let lastTriggeredAt = getLastTriggeredTimeFromUserDefaults(
701+
activityName: activityName,
702+
callbackName: callbackName,
703+
eventName: eventName
704+
) {
705+
if lastTriggeredAt >= skipIfAlreadyTriggeredBetweenFromDate
706+
&& lastTriggeredAt <= skipIfAlreadyTriggeredBetweenToDate {
707+
logger.log(
708+
"skipping executing actions for \(callbackName)\(eventName ?? "") because the last triggered time is between \(skipIfAlreadyTriggeredBetweenFromDate) and \(skipIfAlreadyTriggeredBetweenToDate)"
709+
)
710+
return false
711+
}
712+
}
713+
}
714+
715+
if let skipIfAlreadyTriggeredBefore = skipIfAlreadyTriggeredBefore {
716+
if let lastTriggeredAt = getLastTriggeredTimeFromUserDefaults(
717+
activityName: activityName,
718+
callbackName: callbackName,
719+
eventName: eventName
720+
) {
721+
if lastTriggeredAt < skipIfAlreadyTriggeredBefore {
722+
logger.log(
723+
"skipping executing actions for \(callbackName)\(eventName ?? "") because the last triggered time is after \(skipIfAlreadyTriggeredBefore)"
724+
)
725+
return false
726+
}
727+
}
728+
}
729+
691730
if let skipIfLargerEventRecordedAfter = skipIfLargerEventRecordedAfter, let eventName = eventName {
692731
if hasHigherTriggeredEvent(
693732
activityName: activityName,

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-native-device-activity",
3-
"version": "0.4.7",
3+
"version": "0.4.11",
44
"description": "Provides access to Apples DeviceActivity API",
55
"main": "build/index.js",
66
"types": "build/index.d.ts",

src/ReactNativeDeviceActivity.types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,15 @@ export type NotificationPayload = {
172172
type CommonTypeParams = {
173173
sleepBefore?: number;
174174
sleepAfter?: number;
175+
skipIfAlreadyTriggeredBetween?: {
176+
fromDate?: Date;
177+
toDate?: Date;
178+
};
175179
skipIfAlreadyTriggeredAfter?: Date;
176180
skipIfLargerEventRecordedAfter?: Date;
177181
skipIfAlreadyTriggeredWithinMS?: number;
178182
skipIfLargerEventRecordedWithinMS?: number;
183+
skipIfAlreadyTriggeredBefore?: Date;
179184
skipIfLargerEventRecordedSinceIntervalStarted?: boolean;
180185
neverTriggerBefore?: Date;
181186
};

src/index.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,17 @@ export const configureActions = ({
156156
key,
157157
actions.map((action) => ({
158158
...action,
159-
skipIfLargerEventRecordedAfter: action.skipIfLargerEventRecordedAfter
160-
? action.skipIfLargerEventRecordedAfter.getTime()
161-
: undefined,
162-
skipIfAlreadyTriggeredAfter: action.skipIfAlreadyTriggeredAfter
163-
? action.skipIfAlreadyTriggeredAfter.getTime()
164-
: undefined,
165-
neverTriggerBefore: action.neverTriggerBefore
166-
? action.neverTriggerBefore.getTime()
167-
: undefined,
159+
skipIfLargerEventRecordedAfter:
160+
action.skipIfLargerEventRecordedAfter?.getTime(),
161+
skipIfAlreadyTriggeredAfter:
162+
action.skipIfAlreadyTriggeredAfter?.getTime(),
163+
neverTriggerBefore: action.neverTriggerBefore?.getTime(),
164+
skipIfAlreadyTriggeredBefore:
165+
action.skipIfAlreadyTriggeredBefore?.getTime(),
166+
skipIfAlreadyTriggeredBetweenFromDate:
167+
action.skipIfAlreadyTriggeredBetween?.fromDate?.getTime(),
168+
skipIfAlreadyTriggeredBetweenToDate:
169+
action.skipIfAlreadyTriggeredBetween?.toDate?.getTime(),
168170
})),
169171
);
170172
};

targets/ActivityMonitorExtension/DeviceActivityMonitorExtension.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ class DeviceActivityMonitorExtension: DeviceActivityMonitor {
8080
let skipIfLargerEventRecordedSinceIntervalStarted =
8181
action["skipIfLargerEventRecordedSinceIntervalStarted"] as? Bool
8282
let neverTriggerBefore = action["neverTriggerBefore"] as? Double
83+
let skipIfAlreadyTriggeredBefore = action["skipIfAlreadyTriggeredBefore"] as? Double
84+
85+
let skipIfAlreadyTriggeredBetweenFromDate =
86+
action["skipIfAlreadyTriggeredBetweenFromDate"] as? Double
87+
let skipIfAlreadyTriggeredBetweenToDate =
88+
action["skipIfAlreadyTriggeredBetweenToDate"] as? Double
8389

8490
if shouldExecuteAction(
8591
skipIfAlreadyTriggeredAfter: skipIfAlreadyTriggeredAfter,
@@ -89,6 +95,9 @@ class DeviceActivityMonitorExtension: DeviceActivityMonitor {
8995
neverTriggerBefore: neverTriggerBefore,
9096
skipIfLargerEventRecordedSinceIntervalStarted:
9197
skipIfLargerEventRecordedSinceIntervalStarted,
98+
skipIfAlreadyTriggeredBefore: skipIfAlreadyTriggeredBefore,
99+
skipIfAlreadyTriggeredBetweenFromDate: skipIfAlreadyTriggeredBetweenFromDate,
100+
skipIfAlreadyTriggeredBetweenToDate: skipIfAlreadyTriggeredBetweenToDate,
92101
activityName: activityName,
93102
callbackName: callbackName,
94103
eventName: eventName

0 commit comments

Comments
 (0)