Skip to content

Commit 5a572fc

Browse files
added login view with test accounts
1 parent e83c544 commit 5a572fc

File tree

9 files changed

+303
-119
lines changed

9 files changed

+303
-119
lines changed

DemoAppSwiftUI/AppDelegate.swift

Lines changed: 13 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -22,43 +22,6 @@ class AppDelegate: NSObject, UIApplicationDelegate {
2222

2323
func application(_ application: UIApplication,
2424
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
25-
connectUser(withCredentials: UserCredentials.mock)
26-
return true
27-
}
28-
29-
func application(_ application: UIApplication,
30-
configurationForConnecting connectingSceneSession: UISceneSession,
31-
options: UIScene.ConnectionOptions) -> UISceneConfiguration {
32-
let sceneConfig = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
33-
sceneConfig.delegateClass = SceneDelegate.self
34-
return sceneConfig
35-
}
36-
37-
func application(
38-
_ application: UIApplication,
39-
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
40-
) {
41-
guard let currentUserId = chatClient.currentUserId else {
42-
log.warning("cannot add the device without connecting as user first, did you call connectUser")
43-
return
44-
}
45-
46-
chatClient.currentUserController().addDevice(token: deviceToken) { error in
47-
if let error = error {
48-
log.error("adding a device failed with an error \(error)")
49-
return
50-
}
51-
UserDefaults(suiteName: applicationGroupIdentifier)?.set(
52-
currentUserId,
53-
forKey: currentUserIdRegisteredForPush
54-
)
55-
}
56-
}
57-
58-
private func connectUser(withCredentials credentials: UserCredentials) {
59-
let token = try! Token(rawValue: credentials.token)
60-
LogConfig.level = .warning
61-
6225
/*
6326
//Customizations, uncomment to customize.
6427
var colors = ColorPalette()
@@ -89,16 +52,20 @@ class AppDelegate: NSObject, UIApplicationDelegate {
8952
*/
9053

9154
streamChat = StreamChat(chatClient: chatClient)
92-
93-
chatClient.connectUser(
94-
userInfo: .init(id: credentials.id, name: credentials.name, imageURL: credentials.avatarURL),
95-
token: token
96-
) { error in
97-
if let error = error {
98-
log.error("connecting the user failed \(error)")
99-
return
100-
}
55+
56+
DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) {
57+
AppState.shared.userState = .notLoggedIn
10158
}
59+
60+
return true
61+
}
62+
63+
func application(_ application: UIApplication,
64+
configurationForConnecting connectingSceneSession: UISceneSession,
65+
options: UIScene.ConnectionOptions) -> UISceneConfiguration {
66+
let sceneConfig = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
67+
sceneConfig.delegateClass = SceneDelegate.self
68+
return sceneConfig
10269
}
10370

10471
}

DemoAppSwiftUI/ContentView.swift

Lines changed: 0 additions & 21 deletions
This file was deleted.

DemoAppSwiftUI/DemoAppSwiftUIApp.swift

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,43 +8,39 @@ import StreamChatSwiftUI
88

99
@main
1010
struct DemoAppSwiftUIApp: App {
11-
12-
// @StateObject var launchAnimationState = LaunchAnimationState()
13-
11+
1412
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
1513
@Injected(\.chatClient) public var chatClient: ChatClient
1614

15+
@ObservedObject var appState = AppState.shared
16+
1717
var body: some Scene {
1818
WindowGroup {
19-
// if launchAnimationState.showAnimation {
20-
// StreamLogoLaunch()
21-
// } else {
22-
// ChatChannelListView()
23-
// }
24-
ChatChannelListView(viewFactory: DemoAppFactory.shared)
25-
/*
26-
//Example of custom query filters.
27-
ChatChannelListView(
28-
viewFactory: CustomFactory.shared,
29-
channelListController: customChannelListController
30-
)
31-
*/
32-
/*
33-
// Example for the channel list screen.
34-
ChatChannelListScreen()
35-
*/
36-
19+
switch appState.userState {
20+
case .launchAnimation:
21+
StreamLogoLaunch()
22+
case .notLoggedIn:
23+
LoginView()
24+
case .loggedIn:
25+
ChatChannelListView(viewFactory: DemoAppFactory.shared)
26+
}
3727
}
3828
}
29+
30+
}
31+
32+
class AppState: ObservableObject {
33+
34+
@Published var userState: UserState = .launchAnimation
3935

40-
private var customChannelListController: ChatChannelListController {
41-
let controller = chatClient.channelListController(
42-
query: .init(
43-
filter: .and([.equal(.type, to: .messaging), .containMembers(userIds: [chatClient.currentUserId!])]),
44-
sort: [.init(key: .lastMessageAt, isAscending: true)],
45-
pageSize: 10
46-
)
47-
)
48-
return controller
49-
}
36+
static let shared = AppState()
37+
38+
private init() {}
39+
40+
}
41+
42+
enum UserState {
43+
case launchAnimation
44+
case notLoggedIn
45+
case loggedIn
5046
}

DemoAppSwiftUI/DemoUser.swift

Lines changed: 127 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,134 @@ public let applicationGroupIdentifier = "group.io.getstream.iOS.ChatDemoAppSwift
99
public let currentUserIdRegisteredForPush = "currentUserIdRegisteredForPush"
1010

1111
public struct UserCredentials {
12-
let id: String
13-
let name: String
14-
let avatarURL: URL
15-
let token: String
16-
let birthLand: String
12+
public let id: String
13+
public let name: String
14+
public let avatarURL: URL
15+
public let token: String
16+
public let birthLand: String
1717
}
1818

19-
extension UserCredentials {
20-
21-
static let mock: UserCredentials = UserCredentials(id: "luke_skywalker",
22-
name: "Luke Skywalker",
23-
avatarURL: URL(string: "https://vignette.wikia.nocookie.net/starwars/images/2/20/LukeTLJ.jpg")!,
24-
token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibHVrZV9za3l3YWxrZXIifQ.kFSLHRB5X62t0Zlc7nwczWUfsQMwfkpylC6jCUZ6Mc0",
25-
birthLand: "Tatooine")
19+
extension UserCredentials: Identifiable {
2620

21+
static func builtInUsersByID(id: String) -> UserCredentials? {
22+
builtInUsers.filter { $0.id == id }.first
23+
}
24+
25+
static let builtInUsers: [UserCredentials] = [
26+
(
27+
"luke_skywalker",
28+
"Luke Skywalker",
29+
"https://vignette.wikia.nocookie.net/starwars/images/2/20/LukeTLJ.jpg",
30+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibHVrZV9za3l3YWxrZXIifQ.kFSLHRB5X62t0Zlc7nwczWUfsQMwfkpylC6jCUZ6Mc0",
31+
"Tatooine"
32+
),
33+
(
34+
"leia_organa",
35+
"Leia Organa",
36+
"https://vignette.wikia.nocookie.net/starwars/images/f/fc/Leia_Organa_TLJ.png",
37+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibGVpYV9vcmdhbmEifQ.IzwBuaYwX5dRvnDDnJN2AyW3wwfYwgQm3w-1RD4BLPU",
38+
"Polis Massa"
39+
),
40+
(
41+
"han_solo",
42+
"Han Solo",
43+
"https://vignette.wikia.nocookie.net/starwars/images/e/e2/TFAHanSolo.png",
44+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiaGFuX3NvbG8ifQ.R6PkQeGPcusALmhvaST50lwroL_JkZnI3Q7hQ1Hvj3k",
45+
"Corellia"
46+
),
47+
(
48+
"lando_calrissian",
49+
"Lando Calrissian",
50+
"https://vignette.wikia.nocookie.net/starwars/images/8/8f/Lando_ROTJ.png",
51+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibGFuZG9fY2Fscmlzc2lhbiJ9.n_K7d-FroQzBUxETNcEQYqiW_U9CPjRHZHT1hyAjlAQ",
52+
"Socorro"
53+
),
54+
(
55+
"chewbacca",
56+
"Chewbacca",
57+
"https://vignette.wikia.nocookie.net/starwars/images/4/48/Chewbacca_TLJ.png",
58+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiY2hld2JhY2NhIn0.4nNFfO0dehvdLxDUGaMQPpMliSTGjHqh1C2Zo8wyaeM",
59+
"Kashyyyk"
60+
),
61+
(
62+
"c-3po",
63+
"C-3PO",
64+
"https://vignette.wikia.nocookie.net/starwars/images/3/3f/C-3PO_TLJ_Card_Trader_Award_Card.png",
65+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiYy0zcG8ifQ.J4Xzu8rKP1XWQvSNV6wzWKW403qKd5N3FalpWXTDauw",
66+
"Affa"
67+
),
68+
(
69+
"r2-d2",
70+
"R2-D2",
71+
"https://vignette.wikia.nocookie.net/starwars/images/e/eb/ArtooTFA2-Fathead.png",
72+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicjItZDIifQ.UpSEW8jA2tYsUTPKbdFGMtHHnu9_AnEQqTK6TdT8L1g",
73+
"Naboo"
74+
),
75+
(
76+
"anakin_skywalker",
77+
"Anakin Skywalker",
78+
"https://vignette.wikia.nocookie.net/starwars/images/6/6f/Anakin_Skywalker_RotS.png",
79+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiYW5ha2luX3NreXdhbGtlciJ9.oJkwakjdqw6gCA3-kaUaKqSVEcWO5ob5DJuyJCtnT6U",
80+
"Tatooine"
81+
),
82+
(
83+
"obi-wan_kenobi",
84+
"Obi-Wan Kenobi",
85+
"https://vignette.wikia.nocookie.net/starwars/images/4/4e/ObiWanHS-SWE.jpg",
86+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoib2JpLXdhbl9rZW5vYmkifQ.AVOtnXtMq9crXFwl68BrBRob335phYpYfPPq5i2agUM",
87+
"Stewjon"
88+
),
89+
(
90+
"padme_amidala",
91+
"Padmé Amidala",
92+
"https://vignette.wikia.nocookie.net/starwars/images/b/b2/Padmegreenscrshot.jpg",
93+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicGFkbWVfYW1pZGFsYSJ9.X8CwsnrWKvdrS6XchcUMZDLh_W0X4Gpx-oNyjGAdenI",
94+
"Naboo"
95+
),
96+
(
97+
"qui-gon_jinn",
98+
"Qui-Gon Jinn",
99+
"https://vignette.wikia.nocookie.net/starwars/images/f/f6/Qui-Gon_Jinn_Headshot_TPM.jpg",
100+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicXVpLWdvbl9qaW5uIn0.EDuyuTkyzG1OA3ROwa3sK8-K_U2MGREsY4Ic7flXvzw",
101+
"Coruscant"
102+
),
103+
(
104+
"mace_windu",
105+
"Mace Windu",
106+
"https://vignette.wikia.nocookie.net/starwars/images/5/58/Mace_ROTS.png",
107+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibWFjZV93aW5kdSJ9.x8xFcOQFr0XUDeA3BH0ISsR2VSmWSxmMgbnz8lprV58",
108+
"Haruun Kal"
109+
),
110+
(
111+
"jar_jar_binks",
112+
"Jar Jar Binks",
113+
"https://vignette.wikia.nocookie.net/starwars/images/d/d2/Jar_Jar_aotc.jpg",
114+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiamFyX2phcl9iaW5rcyJ9.5-GhGE8sqlxKNUMyBGovrkoaxgkEQAUMJ3CZfcxyrZg",
115+
"Naboo"
116+
),
117+
(
118+
"darth_maul",
119+
"Darth Maul",
120+
"https://vignette.wikia.nocookie.net/starwars/images/5/50/Darth_Maul_profile.png",
121+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiZGFydGhfbWF1bCJ9._cbBA2ThWpXcyxwvBV6gvqAwnw0lvzfHAlZ4stGqf2o",
122+
"Dathomir"
123+
),
124+
(
125+
"count_dooku",
126+
"Count Dooku",
127+
"https://vignette.wikia.nocookie.net/starwars/images/b/b8/Dooku_Headshot.jpg",
128+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiY291bnRfZG9va3UifQ.0sN_cPTKrXsxC23WUSIBUQK5IUZsdGijmqY50HJERQw",
129+
"Serenno"
130+
),
131+
(
132+
"general_grievous",
133+
"General Grievous",
134+
"https://vignette.wikia.nocookie.net/starwars/images/d/de/Grievoushead.jpg",
135+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiZ2VuZXJhbF9ncmlldm91cyJ9.FPRvRoeZdALErBA1bDybch4xY-c5CEinuc9qqEPzX4E",
136+
"Qymaen jai Sheelal"
137+
)
138+
139+
].map {
140+
UserCredentials(id: $0.0, name: $0.1, avatarURL: URL(string: $0.2)!, token: $0.3, birthLand: $0.4)
141+
}
27142
}

DemoAppSwiftUI/LoginView.swift

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
//
2+
// Copyright © 2021 Stream.io Inc. All rights reserved.
3+
//
4+
5+
import SwiftUI
6+
import StreamChatSwiftUI
7+
import NukeUI
8+
9+
struct LoginView: View {
10+
11+
@StateObject var viewModel = LoginViewModel()
12+
13+
var body: some View {
14+
VStack {
15+
16+
Image("STREAMMARK")
17+
.resizable()
18+
.aspectRatio(contentMode: .fit)
19+
.frame(height: 40)
20+
.padding(.all, 24)
21+
22+
Text("Welcome to Stream Chat")
23+
.font(.title)
24+
.padding(.all, 8)
25+
26+
Text("Select a user to try the iOS SDK:")
27+
.font(.body)
28+
.padding(.all, 8)
29+
.padding(.bottom, 16)
30+
31+
List(viewModel.demoUsers) { user in
32+
Button {
33+
viewModel.demoUserTapped(user)
34+
} label: {
35+
DemoUserView(user: user)
36+
}
37+
.padding(.vertical, 4)
38+
}
39+
.listStyle(.plain)
40+
41+
Spacer()
42+
}
43+
}
44+
45+
}
46+
47+
struct DemoUserView: View {
48+
49+
@Injected(\.fonts) var fonts
50+
@Injected(\.colors) var colors
51+
52+
var user: UserCredentials
53+
54+
private let imageSize: CGFloat = 44
55+
56+
var body: some View {
57+
HStack {
58+
LazyImage(source: user.avatarURL)
59+
.onDisappear(.reset)
60+
.clipShape(Circle())
61+
.frame(
62+
width: imageSize,
63+
height: imageSize
64+
)
65+
66+
VStack(alignment: .leading, spacing: 4) {
67+
Text(user.name)
68+
.font(fonts.bodyBold)
69+
Text("Stream test account")
70+
.font(fonts.footnote)
71+
.foregroundColor(Color(colors.textLowEmphasis))
72+
}
73+
74+
Spacer()
75+
76+
Image(systemName: "arrow.forward")
77+
.renderingMode(.template)
78+
.foregroundColor(colors.tintColor)
79+
}
80+
81+
}
82+
83+
}

0 commit comments

Comments
 (0)