diff --git a/.github/pull-request-template.md b/.github/pull-request-template.md index f06d895e..d8703300 100644 --- a/.github/pull-request-template.md +++ b/.github/pull-request-template.md @@ -8,7 +8,7 @@ A few sentences describing the overall goals of the pull request's commits. ## Checklist - [ ] Localized - [ ] Added to changelog: - - [ ] [Changelog View](https://github.com/leits/MeetingBar/blob/master/MeetingBar/Views/Changelog/Changelog.swift) + - [ ] [Changelog View](https://github.com/leits/MeetingBar/blob/master/MeetingBar/UI/Views/Changelog/Changelog.swift) - [ ] [CHANGELOG.md](https://github.com/leits/MeetingBar/blob/master/CHANGELOG.md) ### Steps to Test or Reproduce diff --git a/CHANGELOG.md b/CHANGELOG.md index 992421a4..7c22f00e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ For next releases info look here: ## Unreleased * Fix typo in language list (#839) +* Fix multiple typos in the repo (#875) +* Fix URL in PR template (#875) +* Add Riverside meeting service (#875) ## Version 4.11.0 @@ -97,7 +100,7 @@ and small bug fixes * Quick Actions ⚡ * Show/hide meeting title in status bar * Open meeting from clipboard -* Customizable appereance for events without meeting links +* Customizable appearance for events without meeting links * Localization (Ukrainian and Russian) * Create meetings in Jam * Open event in Fantastical from event submenu @@ -144,7 +147,7 @@ Fixed: > (released 11th Feb 2021) * Add Around integration -* Hide show time under title option for Big Sure +* Hide show time under title option for Big Sur * Fix issues with service icons * Fix URLs for Firefox and Microsoft Edge @@ -161,7 +164,7 @@ Fixed: * Full control of the **app appearance**: * Customize icon, title, and time in the status bar * Show event end time and icon in the menu - * Limitate event title length in the menu + * Limit event title length in the menu * Wider settings for **displaying events**. Configure pending events, all-day events, and events without guests. * **Custom link** for ad hoc meeting * Global shortcut to open the app diff --git a/MeetingBar/Assets.xcassets/vendor-icons/riverside_icon.imageset/Contents.json b/MeetingBar/Assets.xcassets/vendor-icons/riverside_icon.imageset/Contents.json new file mode 100644 index 00000000..9f909500 --- /dev/null +++ b/MeetingBar/Assets.xcassets/vendor-icons/riverside_icon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "riverside_icon.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MeetingBar/Assets.xcassets/vendor-icons/riverside_icon.imageset/riverside_icon.svg b/MeetingBar/Assets.xcassets/vendor-icons/riverside_icon.imageset/riverside_icon.svg new file mode 100644 index 00000000..cbdc790a --- /dev/null +++ b/MeetingBar/Assets.xcassets/vendor-icons/riverside_icon.imageset/riverside_icon.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/MeetingBar/Extensions/DefaultsKeys.swift b/MeetingBar/Extensions/DefaultsKeys.swift index f8bb88b9..ed04ed56 100644 --- a/MeetingBar/Extensions/DefaultsKeys.swift +++ b/MeetingBar/Extensions/DefaultsKeys.swift @@ -99,6 +99,7 @@ extension Defaults.Keys { static let teamsBrowser = Key("teamsBrowser", default: systemDefaultBrowser) static let jitsiBrowser = Key("jitsiBrowser", default: systemDefaultBrowser) static let slackBrowser = Key("slackBrowser", default: systemDefaultBrowser) + static let riversideBrowser = Key("riversideBrowser", default: systemDefaultBrowser) /** * browser used for creating a new meeting diff --git a/MeetingBar/Services/MeetingServices.swift b/MeetingBar/Services/MeetingServices.swift index 71fdd3ee..741df2bb 100644 --- a/MeetingBar/Services/MeetingServices.swift +++ b/MeetingBar/Services/MeetingServices.swift @@ -81,6 +81,7 @@ enum MeetingServices: String, Codable, CaseIterable { case livekit = "LiveKit Meet" case meetecho = "Meetecho" case streamyard = "StreamYard" + case riverside = "Riverside" case other = "Other" var localizedValue: String { @@ -256,6 +257,28 @@ func openMeetingURL(_ service: MeetingServices?, _ url: URL, _ browser: Browser? NSWorkspace.shared.open(URL(string: "facetime-audio://" + url.absoluteString)!) case .phone: NSWorkspace.shared.open(URL(string: "tel://" + url.absoluteString)!) + case .riverside: + let browser = browser ?? Defaults[.riversideBrowser] + if browser == riversideAppBrowser { + // Try riversidefm:// scheme first + var riversideAppURL = URLComponents(url: url, resolvingAgainstBaseURL: false)! + riversideAppURL.scheme = "riversidefm" + var result = riversideAppURL.url!.openInDefaultBrowser() + + // If that fails, try riverside.fm:// scheme + if !result { + riversideAppURL.scheme = "riverside.fm" + result = riversideAppURL.url!.openInDefaultBrowser() + } + + // If both app schemes fail, fall back to browser + if !result { + sendNotification("status_bar_error_app_link_title".loco("Riverside"), "status_bar_error_app_link_message".loco("Riverside")) + url.openInDefaultBrowser() + } + } else { + url.openIn(browser: browser) + } default: url.openIn(browser: browser ?? Defaults[.defaultBrowser]) } @@ -328,7 +351,8 @@ private let meetingLinkRegexes: [MeetingServices: NSRegularExpression] = [ .zmPage: try! NSRegularExpression(pattern: #"https?://([a-zA-Z0-9.]+)\.zm\.page"#), .livekit: try! NSRegularExpression(pattern: #"https?://meet[a-zA-Z0-9.]*\.livekit\.io/rooms/[a-zA-Z0-9-#]+"#), .meetecho: try! NSRegularExpression(pattern: #"https?://meetings\.conf\.meetecho\.com/.+"#), - .streamyard: try! NSRegularExpression(pattern: #"https://(?:www\.)?streamyard\.com/(?:guest/)?([a-z0-9]{8,13})(?:/|\?[^ \n]*)?"#) + .streamyard: try! NSRegularExpression(pattern: #"https://(?:www\.)?streamyard\.com/(?:guest/)?([a-z0-9]{8,13})(?:/|\?[^ \n]*)?"#), + .riverside: try! NSRegularExpression(pattern: #"https?://riverside\.(com|fm)/studio/[^\s]*"#) ] func regex(for service: MeetingServices) -> NSRegularExpression? { @@ -628,6 +652,10 @@ func getIconForMeetingService(_ meetingService: MeetingServices?) -> NSImage { image = NSImage(named: "streamyard_icon")! image.size = NSSize(width: 16, height: 16) + case .some(.riverside): + image = NSImage(named: "riverside_icon")! + image.size = NSSize(width: 16, height: 16) + // tested and verified case .none: image = NSImage(named: "no_online_session")! diff --git a/MeetingBar/UI/Views/Changelog/Changelog.swift b/MeetingBar/UI/Views/Changelog/Changelog.swift index 008ddf75..a6bae25f 100644 --- a/MeetingBar/UI/Views/Changelog/Changelog.swift +++ b/MeetingBar/UI/Views/Changelog/Changelog.swift @@ -33,7 +33,7 @@ struct ChangelogView: View { Text("⚡ Quick Actions: ") Text(" - Show/hide meeting title in status bar") Text(" - Open meeting from clipboard") - Text("• Customizable appereance for events without meeting links") + Text("• Customizable appearance for events without meeting links") Text("• Localization") Text("• Create meetings in Jam") Text("• Open event in Fantastical from event submenu") diff --git a/MeetingBar/UI/Views/Preferences/LinksTab.swift b/MeetingBar/UI/Views/Preferences/LinksTab.swift index 6b41107e..2d8d858b 100644 --- a/MeetingBar/UI/Views/Preferences/LinksTab.swift +++ b/MeetingBar/UI/Views/Preferences/LinksTab.swift @@ -17,6 +17,7 @@ struct LinksTab: View { @Default(.teamsBrowser) var teamsBrowser @Default(.slackBrowser) var slackBrowser @Default(.jitsiBrowser) var jitsiBrowser + @Default(.riversideBrowser) var riversideBrowser @Default(.createMeetingServiceUrl) var createMeetingServiceUrl @Default(.createMeetingService) var createMeetingService @Default(.browsers) var allBrowser @@ -99,6 +100,17 @@ struct LinksTab: View { Text(browser.name).tag(browser) } } + Picker( + selection: $riversideBrowser, + label: Text("preferences_services_link_service_title".loco("Riverside")).frame( + width: 200, alignment: .leading) + ) { + Text(systemDefaultBrowser.name).tag(systemDefaultBrowser) + Text(riversideAppBrowser.name).tag(riversideAppBrowser) + ForEach(allBrowser, id: \.self) { (browser: Browser) in + Text(browser.name).tag(browser) + } + } } GroupBox(label: Label("Create", systemImage: "plus.circle")) { diff --git a/MeetingBar/Utilities/Constants.swift b/MeetingBar/Utilities/Constants.swift index e79d6775..92e9e972 100644 --- a/MeetingBar/Utilities/Constants.swift +++ b/MeetingBar/Utilities/Constants.swift @@ -15,6 +15,7 @@ let zoomAppBrowser = Browser(name: "Zoom", path: "") let teamsAppBrowser = Browser(name: "Teams", path: "") let jitsiAppBrowser = Browser(name: "Jitsi", path: "") let slackAppBrowser = Browser(name: "Slack", path: "") +let riversideAppBrowser = Browser(name: "Riverside", path: "") enum statusbarEventTitleLengthLimits { static let min = 5