Skip to content

Commit 7699bbd

Browse files
committed
demo app: add jwt buttons to login, updatetoken
1 parent 3789979 commit 7699bbd

5 files changed

Lines changed: 62 additions & 16 deletions

File tree

examples/demo/App/Models/AppModels.swift

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ enum AddItemType {
8080
case tag
8181
case trigger
8282
case externalUserId
83+
case updateJwt
8384

8485
var title: String {
8586
switch self {
@@ -89,20 +90,31 @@ enum AddItemType {
8990
case .tag: return "Add Tag"
9091
case .trigger: return "Add Trigger"
9192
case .externalUserId: return "Login User"
93+
case .updateJwt: return "Update JWT"
9294
}
9395
}
9496

9597
var requiresKeyValue: Bool {
9698
switch self {
97-
case .alias, .tag, .trigger: return true
98-
case .email, .sms, .externalUserId: return false
99+
case .alias, .tag, .trigger, .externalUserId, .updateJwt: return true
100+
case .email, .sms: return false
101+
}
102+
}
103+
104+
/// When true the second field may be left blank (confirm stays enabled).
105+
/// Used by Login, where the JWT token is optional.
106+
var optionalValue: Bool {
107+
switch self {
108+
case .externalUserId: return true
109+
default: return false
99110
}
100111
}
101112

102113
var keyPlaceholder: String {
103114
switch self {
104115
case .alias: return "Label"
105116
case .tag, .trigger: return "Key"
117+
case .externalUserId, .updateJwt: return "External User Id"
106118
default: return "Key"
107119
}
108120
}
@@ -113,7 +125,8 @@ enum AddItemType {
113125
case .email: return "Email Address"
114126
case .sms: return "Phone Number"
115127
case .tag, .trigger: return "Value"
116-
case .externalUserId: return "External User Id"
128+
case .externalUserId: return "JWT Token (optional)"
129+
case .updateJwt: return "JWT Token"
117130
}
118131
}
119132

@@ -128,6 +141,7 @@ enum AddItemType {
128141
var confirmLabel: String {
129142
switch self {
130143
case .externalUserId: return "Login"
144+
case .updateJwt: return "Update"
131145
default: return "Add"
132146
}
133147
}
@@ -141,6 +155,7 @@ enum AddItemType {
141155
case .tag: return "tag"
142156
case .trigger: return "trigger"
143157
case .externalUserId: return "login_user_id"
158+
case .updateJwt: return "update_jwt"
144159
}
145160
}
146161

@@ -152,6 +167,8 @@ enum AddItemType {
152167
case .alias: return "alias_label_input"
153168
case .tag: return "tag_key_input"
154169
case .trigger: return "trigger_key_input"
170+
case .externalUserId: return "login_user_id_input"
171+
case .updateJwt: return "update_jwt_external_id_input"
155172
default: return "\(accessibilityKey)_key_input"
156173
}
157174
}
@@ -165,6 +182,8 @@ enum AddItemType {
165182
case .alias: return "alias_id_input"
166183
case .tag: return "tag_value_input"
167184
case .trigger: return "trigger_value_input"
185+
case .externalUserId: return "login_user_jwt_input"
186+
case .updateJwt: return "update_jwt_token_input"
168187
default: return "\(accessibilityKey)_input"
169188
}
170189
}

examples/demo/App/Services/OneSignalService.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,13 @@ final class OneSignalService {
9696

9797
// MARK: - User
9898

99-
func login(externalId: String) {
99+
func login(externalId: String, token: String? = nil) {
100100
prefs.setExternalUserId(externalId)
101-
OneSignal.login(externalId)
101+
OneSignal.login(externalId: externalId, token: token)
102+
}
103+
104+
func updateUserJwt(externalId: String, token: String) {
105+
OneSignal.updateUserJwt(externalId: externalId, token: token)
102106
}
103107

104108
func logout() {

examples/demo/App/ViewModels/OneSignalViewModel.swift

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ final class OneSignalViewModel: ObservableObject {
6767

6868
// MARK: - UI State
6969

70-
@Published var isLoading: Bool = false
71-
7270
@Published var activeTooltip: TooltipData?
7371

7472
// MARK: - Computed
@@ -129,7 +127,6 @@ final class OneSignalViewModel: ObservableObject {
129127
guard let onesignalId = service.onesignalId else { return }
130128
requestSequence &+= 1
131129
let captured = requestSequence
132-
isLoading = true
133130

134131
let userData = await UserFetchService.shared.fetchUser(appId: appId, onesignalId: onesignalId)
135132

@@ -145,7 +142,6 @@ final class OneSignalViewModel: ObservableObject {
145142
externalUserId = extId
146143
}
147144
}
148-
isLoading = false
149145
}
150146

151147
// MARK: - Consent
@@ -166,15 +162,22 @@ final class OneSignalViewModel: ObservableObject {
166162

167163
// MARK: - User
168164

169-
func login(externalId: String) {
165+
func login(externalId: String, token: String? = nil) {
170166
let trimmed = externalId.trimmingCharacters(in: .whitespacesAndNewlines)
171167
guard !trimmed.isEmpty else { return }
172-
isLoading = true
173-
service.login(externalId: trimmed)
168+
let trimmedToken = token?.trimmingCharacters(in: .whitespacesAndNewlines)
169+
service.login(externalId: trimmed, token: (trimmedToken?.isEmpty ?? true) ? nil : trimmedToken)
174170
externalUserId = trimmed
175171
clearUserData()
176172
}
177173

174+
func updateUserJwt(externalId: String, token: String) {
175+
let trimmedId = externalId.trimmingCharacters(in: .whitespacesAndNewlines)
176+
let trimmedToken = token.trimmingCharacters(in: .whitespacesAndNewlines)
177+
guard !trimmedId.isEmpty, !trimmedToken.isEmpty else { return }
178+
service.updateUserJwt(externalId: trimmedId, token: trimmedToken)
179+
}
180+
178181
func logout() {
179182
service.logout()
180183
externalUserId = nil

examples/demo/App/Views/Components/AddItemDialog.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,9 @@ struct AddItemDialog: View {
8080

8181
private var isValid: Bool {
8282
if itemType.requiresKeyValue {
83-
return !keyText.trimmingCharacters(in: .whitespaces).isEmpty &&
84-
!valueText.trimmingCharacters(in: .whitespaces).isEmpty
83+
let keyOK = !keyText.trimmingCharacters(in: .whitespaces).isEmpty
84+
if itemType.optionalValue { return keyOK }
85+
return keyOK && !valueText.trimmingCharacters(in: .whitespaces).isEmpty
8586
}
8687
return !valueText.trimmingCharacters(in: .whitespaces).isEmpty
8788
}

examples/demo/App/Views/Sections/UserSection.swift

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import SwiftUI
3131
struct UserSection: View {
3232
@EnvironmentObject var viewModel: OneSignalViewModel
3333
@State private var loginOpen = false
34+
@State private var updateJwtOpen = false
3435

3536
var body: some View {
3637
SectionCard(title: "USER", sectionKey: "user") {
@@ -55,6 +56,14 @@ struct UserSection: View {
5556
loginOpen = true
5657
}
5758

59+
ActionButton(
60+
"UPDATE JWT",
61+
style: .outline,
62+
accessibilityID: "update_jwt_button"
63+
) {
64+
updateJwtOpen = true
65+
}
66+
5867
if viewModel.isLoggedIn {
5968
ActionButton(
6069
"LOGOUT USER",
@@ -68,12 +77,22 @@ struct UserSection: View {
6877
.osCenteredDialog(isPresented: $loginOpen) {
6978
AddItemDialog(
7079
itemType: .externalUserId,
71-
onAdd: { _, value in
72-
viewModel.login(externalId: value)
80+
onAdd: { externalId, token in
81+
viewModel.login(externalId: externalId, token: token.isEmpty ? nil : token)
7382
loginOpen = false
7483
},
7584
onCancel: { loginOpen = false }
7685
)
7786
}
87+
.osCenteredDialog(isPresented: $updateJwtOpen) {
88+
AddItemDialog(
89+
itemType: .updateJwt,
90+
onAdd: { externalId, token in
91+
viewModel.updateUserJwt(externalId: externalId, token: token)
92+
updateJwtOpen = false
93+
},
94+
onCancel: { updateJwtOpen = false }
95+
)
96+
}
7897
}
7998
}

0 commit comments

Comments
 (0)