mirror of
https://github.com/FBukovina/Atoll.git
synced 2026-10-28 23:54:32 +00:00
different colors for providers
This commit is contained in:
parent
be546b48ff
commit
43f40e71ed
2 changed files with 71 additions and 51 deletions
|
|
@ -747,16 +747,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"%@ %@" : {
|
|
||||||
"localizations" : {
|
|
||||||
"en" : {
|
|
||||||
"stringUnit" : {
|
|
||||||
"state" : "new",
|
|
||||||
"value" : "%1$@ %2$@"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"%@ Models" : {
|
"%@ Models" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
"fr" : {
|
"fr" : {
|
||||||
|
|
|
||||||
|
|
@ -489,66 +489,96 @@ struct ReminderToggle: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Conference Provider
|
||||||
|
|
||||||
|
enum ConferenceProvider: CaseIterable {
|
||||||
|
case zoom, teams, meet, webex, facetime, gotomeeting, bluejeans, whereby, jitsi, discord, generic
|
||||||
|
|
||||||
|
var name: String {
|
||||||
|
switch self {
|
||||||
|
case .zoom: return "Zoom"
|
||||||
|
case .teams: return "Teams"
|
||||||
|
case .meet: return "Meet"
|
||||||
|
case .webex: return "Webex"
|
||||||
|
case .facetime: return "FaceTime"
|
||||||
|
case .gotomeeting: return "GoToMeeting"
|
||||||
|
case .bluejeans: return "BlueJeans"
|
||||||
|
case .whereby: return "Whereby"
|
||||||
|
case .jitsi: return "Jitsi"
|
||||||
|
case .discord: return "Discord"
|
||||||
|
case .generic: return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var color: Color {
|
||||||
|
switch self {
|
||||||
|
case .zoom: return Color(red: 0.16, green: 0.52, blue: 0.95)
|
||||||
|
case .teams: return Color(red: 0.36, green: 0.42, blue: 0.89)
|
||||||
|
case .meet: return Color(red: 0.0, green: 0.65, blue: 0.42)
|
||||||
|
case .webex: return Color(red: 0.0, green: 0.71, blue: 0.84)
|
||||||
|
case .facetime: return Color(red: 0.2, green: 0.78, blue: 0.35)
|
||||||
|
case .gotomeeting: return Color(red: 0.95, green: 0.5, blue: 0.13)
|
||||||
|
case .bluejeans: return Color(red: 0.0, green: 0.48, blue: 0.87)
|
||||||
|
case .whereby: return Color(red: 0.27, green: 0.51, blue: 0.96)
|
||||||
|
case .jitsi: return Color(red: 0.16, green: 0.68, blue: 0.95)
|
||||||
|
case .discord: return Color(red: 0.35, green: 0.39, blue: 0.98)
|
||||||
|
case .generic: return Color.accentColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private var hostIdentifiers: [String] {
|
||||||
|
switch self {
|
||||||
|
case .zoom: return ["zoom.us"]
|
||||||
|
case .teams: return ["teams.microsoft.com"]
|
||||||
|
case .meet: return ["meet.google.com"]
|
||||||
|
case .webex: return ["webex.com"]
|
||||||
|
case .facetime: return ["facetime.apple.com"]
|
||||||
|
case .gotomeeting: return ["gotomeeting.com"]
|
||||||
|
case .bluejeans: return ["bluejeans.com"]
|
||||||
|
case .whereby: return ["whereby.com"]
|
||||||
|
case .jitsi: return ["meet.jit.si", "jitsi"]
|
||||||
|
case .discord: return ["discord.gg", "discord.com"]
|
||||||
|
case .generic: return []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static func detect(from url: URL) -> ConferenceProvider {
|
||||||
|
let host = url.host?.lowercased() ?? ""
|
||||||
|
return allCases.first { provider in
|
||||||
|
provider.hostIdentifiers.contains { host.contains($0) }
|
||||||
|
} ?? .generic
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Conference Join Button
|
||||||
|
|
||||||
struct ConferenceJoinButton: View {
|
struct ConferenceJoinButton: View {
|
||||||
let url: URL
|
let url: URL
|
||||||
let event: EventModel
|
let event: EventModel
|
||||||
@Environment(\.openURL) private var openURL
|
@Environment(\.openURL) private var openURL
|
||||||
|
|
||||||
|
private var provider: ConferenceProvider { .detect(from: url) }
|
||||||
private var isJoinable: Bool {
|
private var isJoinable: Bool {
|
||||||
// Allow joining 15 minutes before the event starts
|
event.start.addingTimeInterval(-15 * 60) <= Date()
|
||||||
let joinableTime = event.start.addingTimeInterval(-15 * 60)
|
|
||||||
return Date() >= joinableTime
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private var buttonText: String {
|
private var buttonText: String {
|
||||||
if event.eventStatus == .inProgress {
|
event.eventStatus == .inProgress ? "Rejoin" : "Join"
|
||||||
return "Rejoin"
|
|
||||||
} else {
|
|
||||||
return "Join"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private var conferenceService: String? {
|
|
||||||
let host = url.host?.lowercased() ?? ""
|
|
||||||
if host.contains("zoom.us") {
|
|
||||||
return "Zoom"
|
|
||||||
} else if host.contains("teams.microsoft.com") {
|
|
||||||
return "Teams"
|
|
||||||
} else if host.contains("meet.google.com") {
|
|
||||||
return "Meet"
|
|
||||||
} else if host.contains("webex.com") {
|
|
||||||
return "Webex"
|
|
||||||
} else if host.contains("facetime.apple.com") {
|
|
||||||
return "FaceTime"
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Button(action: {
|
Button(action: { openURL(url) }) {
|
||||||
openURL(url)
|
|
||||||
}) {
|
|
||||||
HStack(spacing: 4) {
|
HStack(spacing: 4) {
|
||||||
Image(systemName: "video.fill")
|
Image(systemName: "video.fill")
|
||||||
.font(.system(size: 9))
|
.font(.system(size: 9))
|
||||||
if let service = conferenceService {
|
Text(provider.name.isEmpty ? buttonText : "\(buttonText) \(provider.name)")
|
||||||
Text("\(buttonText) \(service)")
|
|
||||||
.font(.caption2)
|
.font(.caption2)
|
||||||
.fontWeight(.medium)
|
.fontWeight(.medium)
|
||||||
} else {
|
|
||||||
Text(buttonText)
|
|
||||||
.font(.caption2)
|
|
||||||
.fontWeight(.medium)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.foregroundColor(isJoinable ? .white : Color(white: 0.5))
|
.foregroundColor(isJoinable ? .white : Color(white: 0.5))
|
||||||
.padding(.horizontal, 8)
|
.padding(.horizontal, 8)
|
||||||
.padding(.vertical, 4)
|
.padding(.vertical, 4)
|
||||||
.background(
|
.background(isJoinable ? provider.color.opacity(0.85) : Color.gray.opacity(0.3))
|
||||||
isJoinable
|
|
||||||
? Color.accentColor.opacity(0.8)
|
|
||||||
: Color.gray.opacity(0.3)
|
|
||||||
)
|
|
||||||
.cornerRadius(6)
|
.cornerRadius(6)
|
||||||
}
|
}
|
||||||
.buttonStyle(PlainButtonStyle())
|
.buttonStyle(PlainButtonStyle())
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue