Skip to content

Commit 085cd1d

Browse files
committed
warn user must be logged in first for track event
1 parent 17508b2 commit 085cd1d

6 files changed

Lines changed: 25 additions & 38 deletions

File tree

src/onesignal/OneSignal.test.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,9 @@ describe('OneSignal', () => {
972972
test('can send a custom event', async () => {
973973
setSendCustomEventResponse();
974974

975+
OneSignal.coreDirector
976+
.getIdentityModel()
977+
.setProperty('external_id', 'some-id', ModelChangeTags.NO_PROPOGATE);
975978
window.OneSignal.User.trackEvent(name, properties);
976979

977980
await vi.waitUntil(() => sendCustomEventFn.mock.calls.length === 1);
@@ -980,6 +983,7 @@ describe('OneSignal', () => {
980983
events: [
981984
{
982985
name,
986+
external_id: 'some-id',
983987
onesignal_id: DUMMY_ONESIGNAL_ID,
984988
payload: {
985989
os_sdk: OS_SDK,
@@ -991,7 +995,7 @@ describe('OneSignal', () => {
991995
});
992996
});
993997

994-
test('custom event should wait for login to complete for a fresh user', async () => {
998+
test('can send a custom event after login', async () => {
995999
setCreateUserResponse({});
9961000
setGetUserResponse({
9971001
onesignalId: DUMMY_ONESIGNAL_ID,
@@ -1000,21 +1004,19 @@ describe('OneSignal', () => {
10001004
setSendCustomEventResponse();
10011005

10021006
const identityModel = window.OneSignal.coreDirector.getIdentityModel();
1003-
const startingOnesignalId = IDManager.createLocalId();
10041007
identityModel.setProperty(
1005-
'onesignal_id',
1006-
startingOnesignalId,
1008+
'external_id',
1009+
'some-id',
10071010
ModelChangeTags.NO_PROPOGATE,
10081011
);
10091012

1013+
window.OneSignal.login('some-id-2');
10101014
window.OneSignal.User.trackEvent(name, properties);
1011-
window.OneSignal.login('some-id');
10121015

10131016
const queue = await getQueue(2);
10141017

10151018
// login and custom event should have matching id (via UserDirector reset user models)
10161019
const newLocalId = queue[0].operation.onesignalId;
1017-
expect(newLocalId).not.toBe(startingOnesignalId);
10181020
expect(queue[1].operation.onesignalId).toBe(newLocalId);
10191021

10201022
// should translate ids for the custom event
@@ -1027,6 +1029,7 @@ describe('OneSignal', () => {
10271029
expect(sendCustomEventFn).toHaveBeenCalledWith({
10281030
events: [
10291031
{
1032+
external_id: 'some-id-2',
10301033
name,
10311034
onesignal_id: DUMMY_ONESIGNAL_ID,
10321035
payload: {

src/onesignal/User.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ export default class User {
161161
const hasOneSignalId =
162162
!!OneSignal.coreDirector.getIdentityModel().onesignalId;
163163
if (!hasOneSignalId) {
164-
Log.error('Call login before adding an email/sms subscription');
164+
Log.error('User must be logged in first.');
165165
}
166166
return hasOneSignalId;
167167
}
@@ -283,6 +283,7 @@ export default class User {
283283
}
284284

285285
public trackEvent(name: string, properties: Record<string, unknown> = {}) {
286+
if (!this.validateUserExists()) return;
286287
if (!isObjectSerializable(properties)) {
287288
return Log.error(
288289
'Custom event properties must be a JSON-serializable object',

src/onesignal/UserDirector.ts

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { IdentityModel } from 'src/core/models/IdentityModel';
22
import { PropertiesModel } from 'src/core/models/PropertiesModel';
33
import { CreateSubscriptionOperation } from 'src/core/operations/CreateSubscriptionOperation';
44
import { LoginUserOperation } from 'src/core/operations/LoginUserOperation';
5-
import { ModelChangeTags } from 'src/core/types/models';
65
import Log from 'src/shared/libraries/Log';
76
import { IDManager } from 'src/shared/managers/IDManager';
87
import MainHelper from '../shared/helpers/MainHelper';
@@ -56,9 +55,6 @@ export default class UserDirector {
5655
// Resets models similar to Android SDK
5756
// https://github.com/OneSignal/OneSignal-Android-SDK/blob/ed2e87618ea3af81b75f97b0a4cbb8f658c7fc80/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/internal/OneSignalImp.kt#L448
5857
static resetUserModels() {
59-
const prevOnesignalId =
60-
OneSignal.coreDirector.getIdentityModel().onesignalId;
61-
6258
// replace models
6359
const newIdentityModel = new IdentityModel();
6460
const newPropertiesModel = new PropertiesModel();
@@ -67,17 +63,6 @@ export default class UserDirector {
6763
newIdentityModel.onesignalId = sdkId;
6864
newPropertiesModel.onesignalId = sdkId;
6965

70-
// update onesignalId for all operations in the queue
71-
const opList = OneSignal.coreDirector.operationRepo.queue;
72-
opList.forEach((op) => {
73-
if (
74-
IDManager.isLocalId(op.operation.onesignalId) &&
75-
op.operation.onesignalId === prevOnesignalId
76-
) {
77-
op.operation.setProperty('onesignalId', sdkId, ModelChangeTags.HYDRATE);
78-
}
79-
});
80-
8166
OneSignal.coreDirector.identityModelStore.replace(newIdentityModel);
8267
OneSignal.coreDirector.propertiesModelStore.replace(newPropertiesModel);
8368
}

src/onesignal/UserNamespace.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
DUMMY_ONESIGNAL_ID,
33
DUMMY_PUSH_TOKEN,
44
} from '__test__/support/constants';
5+
import { ModelChangeTags } from 'src/core/types/models';
56
import Log from 'src/shared/libraries/Log';
67
import { IDManager } from 'src/shared/managers/IDManager';
78
import { TestEnvironment } from '../../__test__/support/environment/TestEnvironment';
@@ -438,6 +439,18 @@ describe('UserNamespace', () => {
438439
test_property: 'test_value',
439440
};
440441

442+
userNamespace.trackEvent(name, {});
443+
expect(errorSpy).toHaveBeenCalledWith('User must be logged in first.');
444+
errorSpy.mockClear();
445+
446+
const identityModel = OneSignal.coreDirector.getIdentityModel();
447+
identityModel.setProperty(
448+
'onesignal_id',
449+
DUMMY_ONESIGNAL_ID,
450+
ModelChangeTags.NO_PROPOGATE,
451+
);
452+
453+
console.log('zzz');
441454
// should validate properties
442455
// @ts-expect-error - mock invalid argument
443456
userNamespace.trackEvent(name, 123);

src/onesignal/UserNamespace.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { ModelChangeTags } from 'src/core/types/models';
2-
import { IDManager } from 'src/shared/managers/IDManager';
31
import type { UserChangeEvent } from '../page/models/UserChangeEvent';
42
import { EventListenerBase } from '../page/userModel/EventListenerBase';
53
import Emitter from '../shared/libraries/Emitter';
@@ -21,16 +19,6 @@ export default class UserNamespace extends EventListenerBase {
2119
) {
2220
super();
2321
if (initialize) {
24-
// operation model store expect operations to have a onesignalId even if it's a local id
25-
const identityModel = OneSignal.coreDirector.getIdentityModel();
26-
if (!identityModel.onesignalId) {
27-
identityModel.setProperty(
28-
'onesignal_id',
29-
IDManager.createLocalId(),
30-
ModelChangeTags.HYDRATE,
31-
);
32-
}
33-
3422
this._currentUser = User.createOrGetInstance();
3523
this.PushSubscription = new PushSubscriptionNamespace(
3624
true,

src/page/managers/LoginManager.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { LoginUserOperation } from 'src/core/operations/LoginUserOperation';
22
import { TransferSubscriptionOperation } from 'src/core/operations/TransferSubscriptionOperation';
33
import { ModelChangeTags } from 'src/core/types/models';
44
import MainHelper from 'src/shared/helpers/MainHelper';
5-
import { IDManager } from 'src/shared/managers/IDManager';
65
import OneSignal from '../../onesignal/OneSignal';
76
import UserDirector from '../../onesignal/UserDirector';
87
import Log from '../../shared/libraries/Log';
@@ -25,9 +24,7 @@ export default class LoginManager {
2524
}
2625

2726
let identityModel = OneSignal.coreDirector.getIdentityModel();
28-
const currentOneSignalId = IDManager.isLocalId(identityModel.onesignalId)
29-
? undefined
30-
: identityModel.onesignalId;
27+
const currentOneSignalId = identityModel.onesignalId;
3128
const currentExternalId = identityModel.externalId;
3229

3330
// if the current externalId is the same as the one we're trying to set, do nothing

0 commit comments

Comments
 (0)