Skip to content

Commit 45273e5

Browse files
authored
chore(docs): cleanup SlackClone example (#559)
* chore(docs): cleanup SlackClone example fix(realtime): allow to nullify access token fix(realtime): deprecate `updateAuth` from channel
1 parent bfb6620 commit 45273e5

14 files changed

+95
-148
lines changed

Examples/SlackClone/AppView.swift

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Created by Guilherme Souza on 27/12/23.
66
//
77

8+
import OSLog
89
import Supabase
910
import SwiftUI
1011

@@ -17,58 +18,42 @@ final class AppViewModel {
1718
var realtimeConnectionStatus: RealtimeClientV2.Status?
1819

1920
init() {
20-
Task { [weak self] in
21-
for await (event, session) in await supabase.auth.authStateChanges {
22-
guard [.signedIn, .signedOut, .initialSession].contains(event) else { return }
23-
self?.session = session
21+
Task {
22+
for await (event, session) in supabase.auth.authStateChanges {
23+
Logger.main.debug("AuthStateChange: \(event.rawValue)")
24+
guard [.signedIn, .signedOut, .initialSession, .tokenRefreshed].contains(event) else { return }
25+
self.session = session
2426

2527
if session == nil {
26-
for subscription in await supabase.realtimeV2.subscriptions.values {
28+
for subscription in supabase.channels {
2729
await subscription.unsubscribe()
2830
}
2931
}
3032
}
3133
}
3234

3335
Task {
34-
for await status in await supabase.realtimeV2.statusChange {
36+
for await status in supabase.realtimeV2.statusChange {
3537
realtimeConnectionStatus = status
3638
}
3739
}
3840
}
3941
}
4042

41-
@MainActor
4243
struct AppView: View {
4344
@Bindable var model: AppViewModel
44-
let log = LogStore.shared
45-
4645
@State var logPresented = false
4746

4847
@ViewBuilder
4948
var body: some View {
5049
if model.session != nil {
5150
NavigationSplitView {
5251
ChannelListView(channel: $model.selectedChannel)
53-
.toolbar {
54-
ToolbarItem {
55-
Button("Log") {
56-
logPresented = true
57-
}
58-
}
59-
}
6052
} detail: {
6153
if let channel = model.selectedChannel {
6254
MessagesView(channel: channel).id(channel.id)
6355
}
6456
}
65-
.sheet(isPresented: $logPresented) {
66-
List {
67-
ForEach(0 ..< log.messages.count, id: \.self) { i in
68-
Text(log.messages[i].description)
69-
}
70-
}
71-
}
7257
} else {
7358
AuthView()
7459
}

Examples/SlackClone/AuthView.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ final class AuthViewModel {
3131
}
3232
}
3333

34-
@MainActor
3534
struct AuthView: View {
3635
@Bindable var model = AuthViewModel()
3736

Examples/SlackClone/ChannelListView.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import SwiftUI
99

10-
@MainActor
1110
struct ChannelListView: View {
1211
@Bindable var store = Dependencies.shared.channel
1312
@Binding var channel: Channel?

Examples/SlackClone/ChannelStore.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ final class ChannelStore {
2222
Task {
2323
channels = await fetchChannels()
2424

25-
let channel = await supabase.realtimeV2.channel("public:channels")
25+
let channel = supabase.channel("public:channels")
2626

27-
let insertions = await channel.postgresChange(InsertAction.self, table: "channels")
28-
let deletions = await channel.postgresChange(DeleteAction.self, table: "channels")
27+
let insertions = channel.postgresChange(InsertAction.self, table: "channels")
28+
let deletions = channel.postgresChange(DeleteAction.self, table: "channels")
2929

3030
await channel.subscribe()
3131

@@ -47,7 +47,7 @@ final class ChannelStore {
4747
do {
4848
let userId = try await supabase.auth.session.user.id
4949
let channel = AddChannel(slug: name, createdBy: userId)
50-
try await supabase.database
50+
try await supabase
5151
.from("channels")
5252
.insert(channel)
5353
.execute()
@@ -62,7 +62,7 @@ final class ChannelStore {
6262
return channel
6363
}
6464

65-
let channel: Channel = try await supabase.database
65+
let channel: Channel = try await supabase
6666
.from("channels")
6767
.select()
6868
.eq("id", value: id)
@@ -90,7 +90,7 @@ final class ChannelStore {
9090

9191
private func fetchChannels() async -> [Channel] {
9292
do {
93-
return try await supabase.database.from("channels").select().execute().value
93+
return try await supabase.from("channels").select().execute().value
9494
} catch {
9595
dump(error)
9696
toast = .init(status: .error, title: "Error", description: error.localizedDescription)

Examples/SlackClone/Dependencies.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import Foundation
99
import Supabase
1010

11+
@MainActor
1112
class Dependencies {
1213
static let shared = Dependencies()
1314

Examples/SlackClone/Logger.swift

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,45 +10,19 @@ import OSLog
1010
import Supabase
1111

1212
extension Logger {
13-
static let main = Self(subsystem: "com.supabase.SlackClone", category: "app")
13+
static let main = Self(subsystem: "com.supabase.slack-clone", category: "app")
14+
static let supabase = Self(subsystem: "com.supabase.slack-clone", category: "supabase")
1415
}
1516

16-
@Observable
17-
final class LogStore: SupabaseLogger {
18-
private let lock = NSLock()
19-
private var loggers: [String: Logger] = [:]
20-
21-
static let shared = LogStore()
22-
23-
@MainActor
24-
var messages: [SupabaseLogMessage] = []
25-
17+
struct SupaLogger: SupabaseLogger {
2618
func log(message: SupabaseLogMessage) {
27-
Task {
28-
await add(message: message)
29-
}
19+
let logger = Logger.supabase
3020

31-
lock.withLock {
32-
if loggers[message.system] == nil {
33-
loggers[message.system] = Logger(
34-
subsystem: "com.supabase.SlackClone.supabase-swift",
35-
category: message.system
36-
)
37-
}
38-
39-
let logger = loggers[message.system]!
40-
41-
switch message.level {
42-
case .debug: logger.debug("\(message, privacy: .public)")
43-
case .error: logger.error("\(message, privacy: .public)")
44-
case .verbose: logger.info("\(message, privacy: .public)")
45-
case .warning: logger.notice("\(message, privacy: .public)")
46-
}
21+
switch message.level {
22+
case .debug: logger.debug("\(message, privacy: .public)")
23+
case .error: logger.error("\(message, privacy: .public)")
24+
case .verbose: logger.info("\(message, privacy: .public)")
25+
case .warning: logger.notice("\(message, privacy: .public)")
4726
}
4827
}
49-
50-
@MainActor
51-
private func add(message: SupabaseLogMessage) {
52-
messages.insert(message, at: 0)
53-
}
5428
}

Examples/SlackClone/MessageStore.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,11 @@ final class MessageStore {
103103

104104
private init() {
105105
Task {
106-
let channel = await supabase.realtimeV2.channel("public:messages")
106+
let channel = supabase.channel("public:messages")
107107

108-
let insertions = await channel.postgresChange(InsertAction.self, table: "messages")
109-
let updates = await channel.postgresChange(UpdateAction.self, table: "messages")
110-
let deletions = await channel.postgresChange(DeleteAction.self, table: "messages")
108+
let insertions = channel.postgresChange(InsertAction.self, table: "messages")
109+
let updates = channel.postgresChange(UpdateAction.self, table: "messages")
110+
let deletions = channel.postgresChange(DeleteAction.self, table: "messages")
111111

112112
await channel.subscribe()
113113

@@ -176,7 +176,7 @@ final class MessageStore {
176176

177177
/// Fetch all messages and their authors.
178178
private func fetchMessages(_ channelId: Channel.ID) async throws -> [Message] {
179-
try await supabase.database
179+
try await supabase
180180
.from("messages")
181181
.select("*,user:user_id(*),channel:channel_id(*)")
182182
.eq("channel_id", value: channelId)

Examples/SlackClone/MessagesView.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import Realtime
99
import Supabase
1010
import SwiftUI
1111

12-
@MainActor
1312
struct MessagesView: View {
1413
let store = Dependencies.shared.messages
1514
let userStore = Dependencies.shared.users
@@ -74,7 +73,7 @@ struct MessagesView: View {
7473
channelId: channel.id
7574
)
7675

77-
try await supabase.database.from("messages").insert(message).execute()
76+
try await supabase.from("messages").insert(message).execute()
7877
newMessage = ""
7978
} catch {
8079
dump(error)

Examples/SlackClone/Supabase.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ let supabase = SupabaseClient(
2525
supabaseKey: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0",
2626
options: SupabaseClientOptions(
2727
db: .init(encoder: encoder, decoder: decoder),
28-
auth: .init(redirectToURL: URL(string: "com.supabase.slack-clone://")),
29-
global: SupabaseClientOptions.GlobalOptions(logger: LogStore.shared)
28+
auth: .init(redirectToURL: URL(string: "com.supabase.slack-clone://login-callback")),
29+
global: SupabaseClientOptions.GlobalOptions(logger: SupaLogger())
3030
)
3131
)

Examples/SlackClone/UserStore.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ final class UserStore {
1919

2020
private init() {
2121
Task {
22-
let channel = await supabase.realtimeV2.channel("public:users")
23-
let changes = await channel.postgresChange(AnyAction.self, table: "users")
22+
let channel = supabase.channel("public:users")
23+
let changes = channel.postgresChange(AnyAction.self, table: "users")
2424

25-
let presences = await channel.presenceChange()
25+
let presences = channel.presenceChange()
2626

2727
await channel.subscribe()
2828

2929
Task {
30-
let statusChange = await channel.statusChange
30+
let statusChange = channel.statusChange
3131
for await _ in statusChange.filter({ $0 == .subscribed }) {
3232
let userId = try await supabase.auth.session.user.id
3333
try await channel.track(UserPresence(userId: userId, onlineAt: Date()))
@@ -45,15 +45,15 @@ final class UserStore {
4545
let joins = try presence.decodeJoins(as: UserPresence.self)
4646
let leaves = try presence.decodeLeaves(as: UserPresence.self)
4747

48-
for join in joins {
49-
self.presences[join.userId] = join
50-
Logger.main.debug("User \(join.userId) joined")
51-
}
52-
5348
for leave in leaves {
5449
self.presences[leave.userId] = nil
5550
Logger.main.debug("User \(leave.userId) leaved")
5651
}
52+
53+
for join in joins {
54+
self.presences[join.userId] = join
55+
Logger.main.debug("User \(join.userId) joined")
56+
}
5757
}
5858
}
5959
}
@@ -64,7 +64,7 @@ final class UserStore {
6464
return user
6565
}
6666

67-
let user: User = try await supabase.database
67+
let user: User = try await supabase
6868
.from("users")
6969
.select()
7070
.eq("id", value: id)

0 commit comments

Comments
 (0)