Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions MeetingBar/Core/EventStores/GCEventStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,15 @@ final class GCEventStore: NSObject,
}
}

var meetingNotesDocLink: URL?
if let attachments = item["attachments"] as? [[String: Any]],
let docAttachment = attachments.first(where: {
($0["mimeType"] as? String) == "application/vnd.google-apps.document"
}),
let fileUrl = docAttachment["fileUrl"] as? String {
meetingNotesDocLink = URL(string: fileUrl)
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

let organizerRaw = item["organizer"] as? [String: String]
let organizer = MBEventOrganizer(email: organizerRaw?["email"], name: organizerRaw?["name"])

Expand Down Expand Up @@ -463,6 +472,7 @@ final class GCEventStore: NSObject,
notes: notes,
location: location,
url: url,
meetingNotesDocLink: meetingNotesDocLink,
organizer: organizer,
attendees: attendees,
startDate: startDate,
Expand Down
8 changes: 8 additions & 0 deletions MeetingBar/Core/Models/MBEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public struct MBEvent: Identifiable, Hashable, Sendable {
public var status: MBEventStatus
public var participationStatus: MBEventAttendeeStatus = .unknown
public var meetingLink: MeetingLink?
public var meetingNotesDocLink: URL?
public var organizer: MBEventOrganizer?
public let url: URL?
public let notes: String?
Expand All @@ -79,6 +80,7 @@ public struct MBEvent: Identifiable, Hashable, Sendable {
notes: String?,
location: String?,
url: URL?,
meetingNotesDocLink: URL? = nil,
organizer: MBEventOrganizer?,
attendees: [MBEventAttendee] = [],
startDate: Date,
Expand All @@ -105,6 +107,7 @@ public struct MBEvent: Identifiable, Hashable, Sendable {
self.notes = notes
self.location = location
self.url = url
self.meetingNotesDocLink = meetingNotesDocLink

self.organizer = organizer
self.attendees = attendees
Expand Down Expand Up @@ -162,6 +165,11 @@ public struct MBEvent: Identifiable, Hashable, Sendable {
}
}
openMeetingURL(meetingLink.service, meetingLink.url, nil)
if Defaults[.openGoogleMeetingNotesOnJoin],
meetingLink.service == .meet,
let notesURL = meetingNotesDocLink {
notesURL.openInDefaultBrowser()
}
} else if let eventUrl = url {
eventUrl.openInDefaultBrowser()
} else {
Expand Down
1 change: 1 addition & 0 deletions MeetingBar/Extensions/DefaultsKeys.swift
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ extension Defaults.Keys {
static let createMeetingServiceUrl = Key<String>("createMeetingServiceUrl", default: "")

static let meetBrowser = Key<Browser>("meetBrowser", default: systemDefaultBrowser)
static let openGoogleMeetingNotesOnJoin = Key<Bool>("openGoogleMeetingNotesOnJoin", default: false)
static let zoomBrowser = Key<Browser>("zoomBrowser", default: systemDefaultBrowser)
static let teamsBrowser = Key<Browser>("teamsBrowser", default: systemDefaultBrowser)
static let jitsiBrowser = Key<Browser>("jitsiBrowser", default: systemDefaultBrowser)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@

"preferences_services_link_meeting_title" = "Open all meeting links in";
"preferences_services_link_service_title" = "Open %@ links in";
"preferences_services_meet_open_notes_on_join" = "Open attached Google Doc notes when joining";
"preferences_services_meet_open_notes_on_join_help" = "Requires the Google Calendar API provider (Preferences > Calendars).";
"preferences_services_link_default_browser_value" = "Default web browser";
"preferences_services_supported_links_list" = "Supported links for services:\n%@";
"preferences_services_supported_links_mailback" = "If the service you use isn't supported, you can send an e-mail to the developers";
Expand Down
10 changes: 10 additions & 0 deletions MeetingBar/UI/Views/Preferences/LinksTab.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import SwiftUI

struct LinksTab: View {
@Default(.meetBrowser) var meetBrowser
@Default(.openGoogleMeetingNotesOnJoin) var openGoogleMeetingNotesOnJoin
@Default(.eventStoreProvider) var eventStoreProvider
@Default(.browserForCreateMeeting) var browserForCreateMeeting
@Default(.defaultBrowser) var defaultBrowser
@Default(.zoomBrowser) var zoomBrowser
Expand Down Expand Up @@ -56,6 +58,14 @@ struct LinksTab: View {
}
}

Toggle("preferences_services_meet_open_notes_on_join".loco(), isOn: Binding(
get: { eventStoreProvider == .googleCalendar && openGoogleMeetingNotesOnJoin },
set: { openGoogleMeetingNotesOnJoin = $0 }
))
.frame(maxWidth: .infinity, alignment: .leading)
.disabled(eventStoreProvider != .googleCalendar)
.help("preferences_services_meet_open_notes_on_join_help".loco())

Picker(
selection: $zoomBrowser,
label: Text("preferences_services_link_service_title".loco("Zoom")).frame(
Expand Down
59 changes: 59 additions & 0 deletions MeetingBarTests/GCEventStoreTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
//
// GCEventStoreTests.swift
// MeetingBarTests
//

import XCTest

@testable import MeetingBar

final class GCEventStoreTests: XCTestCase {
private let calendar = MBCalendar(title: "Test", id: "test", source: nil, email: nil, color: .black)

private func baseItem() -> [String: Any] {
[
"id": "evt1",
"start": ["dateTime": "2025-01-01T10:00:00Z"],
"end": ["dateTime": "2025-01-01T11:00:00Z"]
]
}

func testParsesGoogleDocAttachmentAsMeetingNotes() {
var item = baseItem()
item["attachments"] = [
[
"fileUrl": "https://docs.google.com/document/d/abc123/edit",
"title": "Standup - Notes",
"mimeType": "application/vnd.google-apps.document",
"fileId": "abc123"
]
]

let event = GCEventStore.GCParser.event(from: item, calendar: calendar)

XCTAssertEqual(event?.meetingNotesDocLink?.absoluteString,
"https://docs.google.com/document/d/abc123/edit")
}

func testIgnoresNonDocumentAttachment() throws {
var item = baseItem()
item["attachments"] = [
[
"fileUrl": "https://drive.google.com/file/d/xyz/view",
"title": "Slides.pdf",
"mimeType": "application/pdf",
"fileId": "xyz"
]
]

let event = try XCTUnwrap(GCEventStore.GCParser.event(from: item, calendar: calendar))

XCTAssertNil(event.meetingNotesDocLink)
}

func testNoAttachmentsLeavesMeetingNotesNil() throws {
let event = try XCTUnwrap(GCEventStore.GCParser.event(from: baseItem(), calendar: calendar))

XCTAssertNil(event.meetingNotesDocLink)
}
}
2 changes: 1 addition & 1 deletion MeetingBarTests/TimelineLogicTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import XCTest
@testable import MeetingBar
import SwiftUICore
import SwiftUI

final class TimelineLogicTests: XCTestCase {

Expand Down
Loading