Skip to content

Commit c841970

Browse files
committed
demo app: add jwt buttons to login, updatetoken
* Don't hang login now that it can fail with JWT
1 parent 95de934 commit c841970

5 files changed

Lines changed: 54 additions & 12 deletions

File tree

iOS_SDK/OneSignalSwiftUIExample/OneSignalSwiftUIExample/Models/AppModels.swift

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ enum AddItemType {
7979
case tag
8080
case trigger
8181
case externalUserId
82+
case updateUserJwt
8283
case customNotification
8384
case trackEvent
8485

@@ -90,15 +91,25 @@ enum AddItemType {
9091
case .tag: return "Add Tag"
9192
case .trigger: return "Add Trigger"
9293
case .externalUserId: return "Login User"
94+
case .updateUserJwt: return "Update User JWT"
9395
case .customNotification: return "Custom Notification"
9496
case .trackEvent: return "Track Event"
9597
}
9698
}
9799

98100
var requiresKeyValue: Bool {
99101
switch self {
100-
case .alias, .tag, .trigger, .customNotification: return true
101-
case .email, .sms, .externalUserId, .trackEvent: return false
102+
case .alias, .tag, .trigger, .customNotification, .externalUserId, .updateUserJwt: return true
103+
case .email, .sms, .trackEvent: return false
104+
}
105+
}
106+
107+
/// When true, the second (value) field may be left empty and validation still passes.
108+
/// Used for `.externalUserId` where the JWT token is optional.
109+
var valueIsOptional: Bool {
110+
switch self {
111+
case .externalUserId: return true
112+
default: return false
102113
}
103114
}
104115

@@ -108,6 +119,7 @@ enum AddItemType {
108119
case .tag: return "Key"
109120
case .trigger: return "Key"
110121
case .customNotification: return "Title"
122+
case .externalUserId, .updateUserJwt: return "External User Id"
111123
default: return "Key"
112124
}
113125
}
@@ -119,7 +131,8 @@ enum AddItemType {
119131
case .sms: return "SMS"
120132
case .tag: return "Value"
121133
case .trigger: return "Value"
122-
case .externalUserId: return "External User Id"
134+
case .externalUserId: return "JWT Token (Optional)"
135+
case .updateUserJwt: return "JWT Token"
123136
case .customNotification: return "Body"
124137
case .trackEvent: return "Event Name"
125138
}

iOS_SDK/OneSignalSwiftUIExample/OneSignalSwiftUIExample/Services/OneSignalService.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,12 @@ final class OneSignalService {
8787

8888
// MARK: - User Management
8989

90-
func login(externalId: String) {
91-
OneSignal.login(externalId)
90+
func login(externalId: String, token: String?) {
91+
OneSignal.login(externalId: externalId, token: token)
92+
}
93+
94+
func updateUserJwt(externalId: String, token: String) {
95+
OneSignal.updateUserJwt(externalId: externalId, token: token)
9296
}
9397

9498
func logout() {

iOS_SDK/OneSignalSwiftUIExample/OneSignalSwiftUIExample/ViewModels/OneSignalViewModel.swift

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,13 @@ final class OneSignalViewModel: ObservableObject {
188188

189189
// MARK: - User Management
190190

191-
func login(externalId: String) {
192-
isLoading = true
193-
service.login(externalId: externalId)
191+
func login(externalId: String, token: String? = nil) {
192+
service.login(externalId: externalId, token: token)
194193
externalUserId = externalId
195194

196195
// Clear old data; will be repopulated by fetchUserDataFromApi when user state changes
196+
// (or stay empty if login fails — e.g. invalid JWT triggers a 401 and the observer
197+
// never fires; that's fine, the UI just shows empty state instead of hanging).
197198
aliases.removeAll()
198199
emails.removeAll()
199200
smsNumbers.removeAll()
@@ -202,6 +203,11 @@ final class OneSignalViewModel: ObservableObject {
202203
showToast("Logged in as \(externalId)")
203204
}
204205

206+
func updateUserJwt(externalId: String, token: String) {
207+
service.updateUserJwt(externalId: externalId, token: token)
208+
showToast("Updated JWT for \(externalId)")
209+
}
210+
205211
func logout() {
206212
isLoading = true
207213
service.logout()
@@ -550,7 +556,10 @@ extension OneSignalViewModel {
550556
case .trigger:
551557
addTrigger(key: key, value: value)
552558
case .externalUserId:
553-
login(externalId: value)
559+
let trimmedToken = value.trimmingCharacters(in: .whitespaces)
560+
login(externalId: key, token: trimmedToken.isEmpty ? nil : trimmedToken)
561+
case .updateUserJwt:
562+
updateUserJwt(externalId: key, token: value)
554563
case .customNotification:
555564
sendCustomNotification(title: key, body: value)
556565
case .trackEvent:

iOS_SDK/OneSignalSwiftUIExample/OneSignalSwiftUIExample/Views/Components/AddItemSheet.swift

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ struct AddItemSheet: View {
9999
}
100100
.foregroundColor(.accentColor)
101101

102-
Button(itemType == .externalUserId ? "LOGIN" : "ADD") {
102+
Button(actionButtonTitle) {
103103
onAdd(keyText, valueText)
104104
}
105105
.foregroundColor(isValid ? .accentColor : .gray)
@@ -127,12 +127,22 @@ struct AddItemSheet: View {
127127

128128
private var isValid: Bool {
129129
if itemType.requiresKeyValue {
130-
return !keyText.trimmingCharacters(in: .whitespaces).isEmpty &&
131-
!valueText.trimmingCharacters(in: .whitespaces).isEmpty
130+
let keyOk = !keyText.trimmingCharacters(in: .whitespaces).isEmpty
131+
let valueOk = itemType.valueIsOptional
132+
|| !valueText.trimmingCharacters(in: .whitespaces).isEmpty
133+
return keyOk && valueOk
132134
} else {
133135
return !valueText.trimmingCharacters(in: .whitespaces).isEmpty
134136
}
135137
}
138+
139+
private var actionButtonTitle: String {
140+
switch itemType {
141+
case .externalUserId: return "LOGIN"
142+
case .updateUserJwt: return "UPDATE"
143+
default: return "ADD"
144+
}
145+
}
136146
}
137147

138148
/// A text field style with an underline instead of a border

iOS_SDK/OneSignalSwiftUIExample/OneSignalSwiftUIExample/Views/Sections/UserSection.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ struct UserSection: View {
7474
}
7575
.padding(.top, 12)
7676

77+
// Update User JWT button
78+
ActionButton(title: "Update User JWT") {
79+
viewModel.showAddSheet(for: .updateUserJwt)
80+
}
81+
.padding(.top, 8)
82+
7783
// Logout button (outlined, only when logged in)
7884
if viewModel.isLoggedIn {
7985
OutlineActionButton(title: "Logout User") {

0 commit comments

Comments
 (0)