-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e98ce32
commit 77d32f4
Showing
124 changed files
with
6,880 additions
and
118 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
39 changes: 39 additions & 0 deletions
39
ios/RocketChat Watch App/ActionHandler/ErrorActionHandler.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
import Foundation | ||
|
||
protocol ErrorActionHandling { | ||
func handle(error: RocketChatError) | ||
} | ||
|
||
final class ErrorActionHandler { | ||
@Dependency private var database: Database | ||
@Dependency private var serversDB: ServersDatabase | ||
@Dependency private var router: AppRouting | ||
|
||
private let server: Server | ||
|
||
init(server: Server) { | ||
self.server = server | ||
} | ||
|
||
private func handleOnMain(error: RocketChatError) { | ||
switch error { | ||
case .server(let response): | ||
router.present(error: response) | ||
case .unauthorized: | ||
router.route(to: [.loading, .serverList]) { | ||
self.database.remove() | ||
self.serversDB.remove(self.server) | ||
} | ||
case .unknown: | ||
print("Unexpected error on Client.") | ||
} | ||
} | ||
} | ||
|
||
extension ErrorActionHandler: ErrorActionHandling { | ||
func handle(error: RocketChatError) { | ||
DispatchQueue.main.async { | ||
self.handleOnMain(error: error) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
import Foundation | ||
|
||
protocol AppRouting { | ||
func route(to route: Route) | ||
func present(error: ErrorResponse) | ||
func route(to routes: [Route], completion: (() -> Void)?) | ||
} | ||
|
||
final class AppRouter: ObservableObject { | ||
@Published var error: ErrorResponse? | ||
|
||
@Published var server: Server? { | ||
didSet { | ||
if server != oldValue, let server { | ||
registerDependencies(in: server) | ||
} | ||
} | ||
} | ||
|
||
@Published var room: Room? | ||
|
||
@Storage(.currentServer) private var currentURL: URL? | ||
|
||
private func registerDependencies(in server: Server) { | ||
Store.register(Database.self, factory: server.database) | ||
Store.register(RocketChatClientProtocol.self, factory: RocketChatClient(server: server)) | ||
Store.register(MessageSending.self, factory: MessageSender(server: server)) | ||
Store.register(ErrorActionHandling.self, factory: ErrorActionHandler(server: server)) | ||
Store.register(MessagesLoading.self, factory: MessagesLoader()) | ||
Store.register(RoomsLoader.self, factory: RoomsLoader(server: server)) | ||
} | ||
} | ||
|
||
extension AppRouter: AppRouting { | ||
func route(to route: Route) { | ||
switch route { | ||
case .roomList(let selectedServer): | ||
currentURL = selectedServer.url | ||
room = nil | ||
server = selectedServer | ||
case .room(let selectedServer, let selectedRoom): | ||
currentURL = selectedServer.url | ||
server = selectedServer | ||
room = selectedRoom | ||
case .serverList: | ||
currentURL = nil | ||
room = nil | ||
server = nil | ||
case .loading: | ||
room = nil | ||
server = nil | ||
} | ||
} | ||
|
||
func present(error: ErrorResponse) { | ||
guard self.error == nil else { | ||
return | ||
} | ||
|
||
self.error = error | ||
} | ||
} | ||
|
||
extension AppRouter { | ||
func route(to routes: [Route], completion: (() -> Void)? = nil) { | ||
guard let routeTo = routes.first else { | ||
completion?() | ||
return | ||
} | ||
|
||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { | ||
self.route(to: routeTo) | ||
self.route(to: Array(routes[1..<routes.count]), completion: completion) | ||
} | ||
} | ||
} | ||
|
||
enum Route: Equatable { | ||
case loading | ||
case serverList | ||
case roomList(Server) | ||
case room(Server, Room) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
import SwiftUI | ||
|
||
struct AppView: View { | ||
@Storage(.currentServer) private var currentURL: URL? | ||
|
||
@Dependency private var database: ServersDatabase | ||
|
||
@StateObject private var router: AppRouter | ||
|
||
init(router: AppRouter) { | ||
_router = StateObject(wrappedValue: router) | ||
} | ||
|
||
var body: some View { | ||
NavigationView { | ||
ServerListView() | ||
.environmentObject(router) | ||
.environment(\.managedObjectContext, database.viewContext) | ||
} | ||
.onAppear { | ||
loadRoute() | ||
} | ||
.sheet(item: $router.error) { error in | ||
Text(error.error) | ||
.multilineTextAlignment(.center) | ||
.padding() | ||
} | ||
} | ||
|
||
private func loadRoute() { | ||
if let currentURL, let server = database.server(url: currentURL) { | ||
router.route(to: .roomList(server)) | ||
} else if database.servers().count == 1, let server = database.servers().first { | ||
router.route(to: .roomList(server)) | ||
} else { | ||
router.route(to: .serverList) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
{ | ||
"info" : { | ||
"author" : "xcode", | ||
"version" : 1 | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
ios/RocketChat Watch App/Assets.xcassets/channel-private.imageset/Contents.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{ | ||
"images" : [ | ||
{ | ||
"filename" : "channel-private.png", | ||
"idiom" : "universal" | ||
} | ||
], | ||
"info" : { | ||
"author" : "xcode", | ||
"version" : 1 | ||
} | ||
} |
Binary file added
BIN
+371 Bytes
...cketChat Watch App/Assets.xcassets/channel-private.imageset/channel-private.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions
12
ios/RocketChat Watch App/Assets.xcassets/channel-public.imageset/Contents.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{ | ||
"images" : [ | ||
{ | ||
"filename" : "channel-public.png", | ||
"idiom" : "universal" | ||
} | ||
], | ||
"info" : { | ||
"author" : "xcode", | ||
"version" : 1 | ||
} | ||
} |
Binary file added
BIN
+259 Bytes
...RocketChat Watch App/Assets.xcassets/channel-public.imageset/channel-public.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions
12
ios/RocketChat Watch App/Assets.xcassets/discussions.imageset/Contents.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{ | ||
"images" : [ | ||
{ | ||
"filename" : "discussions.png", | ||
"idiom" : "universal" | ||
} | ||
], | ||
"info" : { | ||
"author" : "xcode", | ||
"version" : 1 | ||
} | ||
} |
Binary file added
BIN
+517 Bytes
ios/RocketChat Watch App/Assets.xcassets/discussions.imageset/discussions.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions
12
ios/RocketChat Watch App/Assets.xcassets/message.imageset/Contents.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{ | ||
"images" : [ | ||
{ | ||
"filename" : "message.png", | ||
"idiom" : "universal" | ||
} | ||
], | ||
"info" : { | ||
"author" : "xcode", | ||
"version" : 1 | ||
} | ||
} |
Binary file added
BIN
+479 Bytes
ios/RocketChat Watch App/Assets.xcassets/message.imageset/message.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions
12
ios/RocketChat Watch App/Assets.xcassets/teams-private.imageset/Contents.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{ | ||
"images" : [ | ||
{ | ||
"filename" : "teams-private.png", | ||
"idiom" : "universal" | ||
} | ||
], | ||
"info" : { | ||
"author" : "xcode", | ||
"version" : 1 | ||
} | ||
} |
Binary file added
BIN
+509 Bytes
ios/RocketChat Watch App/Assets.xcassets/teams-private.imageset/teams-private.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions
12
ios/RocketChat Watch App/Assets.xcassets/teams.imageset/Contents.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{ | ||
"images" : [ | ||
{ | ||
"filename" : "teams.png", | ||
"idiom" : "universal" | ||
} | ||
], | ||
"info" : { | ||
"author" : "xcode", | ||
"version" : 1 | ||
} | ||
} |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions
10
ios/RocketChat Watch App/Client/Adapters/JSONAdapter.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
import Foundation | ||
|
||
struct JSONAdapter: RequestAdapter { | ||
func adapt(_ urlRequest: URLRequest) -> URLRequest { | ||
var request = urlRequest | ||
request.addValue("application/json", forHTTPHeaderField: "Content-Type") | ||
request.addValue("application/json", forHTTPHeaderField: "Accept") | ||
return request | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
ios/RocketChat Watch App/Client/Adapters/RequestAdapter.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
import Foundation | ||
|
||
protocol RequestAdapter { | ||
func adapt(_ urlRequest: URLRequest) -> URLRequest | ||
func adapt(_ url: URL) -> URL | ||
} | ||
|
||
extension RequestAdapter { | ||
func adapt(_ url: URL) -> URL { | ||
url | ||
} | ||
} |
25 changes: 25 additions & 0 deletions
25
ios/RocketChat Watch App/Client/Adapters/TokenAdapter.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
import Foundation | ||
|
||
struct TokenAdapter: RequestAdapter { | ||
private let server: Server | ||
|
||
init(server: Server) { | ||
self.server = server | ||
} | ||
|
||
func adapt(_ url: URL) -> URL { | ||
url.appending( | ||
queryItems: [ | ||
URLQueryItem(name: "rc_token", value: server.loggedUser.token), | ||
URLQueryItem(name: "rc_uid", value: server.loggedUser.id) | ||
] | ||
) | ||
} | ||
|
||
func adapt(_ urlRequest: URLRequest) -> URLRequest { | ||
var request = urlRequest | ||
request.addValue(server.loggedUser.id, forHTTPHeaderField: "x-user-id") | ||
request.addValue(server.loggedUser.token, forHTTPHeaderField: "x-auth-token") | ||
return request | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
// https://stackoverflow.com/a/28016692 | ||
|
||
import Foundation | ||
|
||
extension Date.ISO8601FormatStyle { | ||
static let iso8601withFractionalSeconds: Self = .init(includingFractionalSeconds: true) | ||
} | ||
|
||
extension ParseStrategy where Self == Date.ISO8601FormatStyle { | ||
static var iso8601withFractionalSeconds: Date.ISO8601FormatStyle { .iso8601withFractionalSeconds } | ||
} | ||
|
||
extension FormatStyle where Self == Date.ISO8601FormatStyle { | ||
static var iso8601withFractionalSeconds: Date.ISO8601FormatStyle { .iso8601withFractionalSeconds } | ||
} | ||
|
||
extension Date { | ||
init(iso8601withFractionalSeconds parseInput: ParseStrategy.ParseInput) throws { | ||
try self.init(parseInput, strategy: .iso8601withFractionalSeconds) | ||
} | ||
|
||
var iso8601withFractionalSeconds: String { | ||
formatted(.iso8601withFractionalSeconds) | ||
} | ||
} | ||
|
||
extension String { | ||
func iso8601withFractionalSeconds() throws -> Date { | ||
try .init(iso8601withFractionalSeconds: self) | ||
} | ||
} | ||
|
||
extension JSONDecoder.DateDecodingStrategy { | ||
static let iso8601withFractionalSeconds = custom { | ||
try .init(iso8601withFractionalSeconds: $0.singleValueContainer().decode(String.self)) | ||
} | ||
} | ||
|
||
extension JSONEncoder.DateEncodingStrategy { | ||
static let iso8601withFractionalSeconds = custom { | ||
var container = $1.singleValueContainer() | ||
try container.encode($0.iso8601withFractionalSeconds) | ||
} | ||
} |
Oops, something went wrong.