|
|
@@ -2624,7 +2624,7 @@ private extension ViewController {
|
|
2624
|
2624
|
titleLabel.alignment = .left
|
|
2625
|
2625
|
contentStack.addArrangedSubview(titleLabel)
|
|
2626
|
2626
|
|
|
2627
|
|
- let subtitle = textLabel("Ended meetings with local recordings", font: typography.fieldLabel, color: palette.textSecondary)
|
|
|
2627
|
+ let subtitle = textLabel("Get notes from your previous meetings", font: typography.fieldLabel, color: palette.textSecondary)
|
|
2628
|
2628
|
subtitle.alignment = .left
|
|
2629
|
2629
|
contentStack.addArrangedSubview(subtitle)
|
|
2630
|
2630
|
contentStack.setCustomSpacing(14, after: subtitle)
|
|
|
@@ -2640,7 +2640,7 @@ private extension ViewController {
|
|
2640
|
2640
|
|
|
2641
|
2641
|
if aiCompanionLocalRecordings.isEmpty {
|
|
2642
|
2642
|
let emptyLabel = textLabel(
|
|
2643
|
|
- "No saved recordings yet. Start a meeting from this app and allow consent to store local audio here.",
|
|
|
2643
|
+ "No previous meetings yet. End a meeting to save it here and generate notes.",
|
|
2644
|
2644
|
font: typography.fieldLabel,
|
|
2645
|
2645
|
color: palette.textMuted
|
|
2646
|
2646
|
)
|
|
|
@@ -2650,6 +2650,12 @@ private extension ViewController {
|
|
2650
|
2650
|
contentStack.addArrangedSubview(emptyLabel)
|
|
2651
|
2651
|
emptyLabel.widthAnchor.constraint(equalTo: contentStack.widthAnchor).isActive = true
|
|
2652
|
2652
|
} else {
|
|
|
2653
|
+ let previousMeetingsLabel = textLabel("Previous meetings", font: NSFont.systemFont(ofSize: 14, weight: .semibold), color: palette.textPrimary)
|
|
|
2654
|
+ previousMeetingsLabel.alignment = .left
|
|
|
2655
|
+ contentStack.addArrangedSubview(previousMeetingsLabel)
|
|
|
2656
|
+ previousMeetingsLabel.widthAnchor.constraint(equalTo: contentStack.widthAnchor).isActive = true
|
|
|
2657
|
+ contentStack.setCustomSpacing(10, after: previousMeetingsLabel)
|
|
|
2658
|
+
|
|
2653
|
2659
|
for recording in aiCompanionLocalRecordings {
|
|
2654
|
2660
|
let card = aiCompanionMeetingCard(recording)
|
|
2655
|
2661
|
contentStack.addArrangedSubview(card)
|
|
|
@@ -2735,56 +2741,13 @@ private extension ViewController {
|
|
2735
|
2741
|
title.maximumNumberOfLines = 2
|
|
2736
|
2742
|
title.lineBreakMode = .byTruncatingTail
|
|
2737
|
2743
|
|
|
2738
|
|
- let dateText = DateFormatter.localizedString(from: recording.endedAt, dateStyle: .medium, timeStyle: .short)
|
|
2739
|
|
- let dateLabel = textLabel("Saved: \(dateText)", font: typography.fieldLabel, color: palette.textSecondary)
|
|
|
2744
|
+ let dateText = DateFormatter.localizedString(from: recording.endedAt, dateStyle: .medium, timeStyle: .none)
|
|
|
2745
|
+ let dateLabel = textLabel("Date: \(dateText)", font: typography.fieldLabel, color: palette.textSecondary)
|
|
2740
|
2746
|
dateLabel.alignment = .left
|
|
2741
|
2747
|
|
|
2742
|
|
- let audioURL = URL(fileURLWithPath: recording.audioFilePath)
|
|
2743
|
|
- let audioLink = audioURL.lastPathComponent
|
|
2744
|
|
- let audioButton = NSButton(title: "Play Audio", target: self, action: #selector(aiCompanionAudioTapped(_:)))
|
|
2745
|
|
- audioButton.translatesAutoresizingMaskIntoConstraints = false
|
|
2746
|
|
- audioButton.isBordered = false
|
|
2747
|
|
- audioButton.bezelStyle = .inline
|
|
2748
|
|
- audioButton.font = NSFont.systemFont(ofSize: 13, weight: .semibold)
|
|
2749
|
|
- audioButton.contentTintColor = palette.primaryBlue
|
|
2750
|
|
- audioButton.alignment = .left
|
|
2751
|
|
- audioButton.setButtonType(.momentaryPushIn)
|
|
2752
|
|
- aiCompanionAudioURLByView[ObjectIdentifier(audioButton)] = audioURL
|
|
2753
|
|
- let trimmedSubtitle: String? = nil
|
|
2754
|
|
- let speechText = {
|
|
2755
|
|
- let base = "Ended meeting: \(recording.title)."
|
|
2756
|
|
- guard let trimmedSubtitle, trimmedSubtitle.isEmpty == false else { return base }
|
|
2757
|
|
- return "\(base) \(trimmedSubtitle)."
|
|
2758
|
|
- }()
|
|
2759
|
|
- aiCompanionSpeechTextByView[ObjectIdentifier(audioButton)] = speechText
|
|
2760
|
|
-
|
|
2761
|
|
- let audioURLLabel = textLabel(audioLink, font: typography.fieldLabel, color: palette.textMuted)
|
|
2762
|
|
- audioURLLabel.alignment = .left
|
|
2763
|
|
- audioURLLabel.maximumNumberOfLines = 2
|
|
2764
|
|
- audioURLLabel.lineBreakMode = .byTruncatingTail
|
|
2765
|
|
-
|
|
2766
|
|
- let audioStatusLabel = textLabel("Not playing", font: typography.fieldLabel, color: palette.textMuted)
|
|
2767
|
|
- audioStatusLabel.alignment = .left
|
|
2768
|
|
- audioStatusLabel.maximumNumberOfLines = 1
|
|
2769
|
|
- audioStatusLabel.lineBreakMode = .byTruncatingTail
|
|
2770
|
|
- aiCompanionAudioStatusLabelByView[ObjectIdentifier(audioButton)] = audioStatusLabel
|
|
2771
|
|
-
|
|
2772
|
|
- let transcriptButton = NSButton(title: "View transcript", target: self, action: #selector(aiCompanionTranscriptTapped(_:)))
|
|
2773
|
|
- transcriptButton.translatesAutoresizingMaskIntoConstraints = false
|
|
2774
|
|
- transcriptButton.isBordered = false
|
|
2775
|
|
- transcriptButton.bezelStyle = .inline
|
|
2776
|
|
- transcriptButton.font = NSFont.systemFont(ofSize: 13, weight: .semibold)
|
|
2777
|
|
- transcriptButton.contentTintColor = palette.primaryBlue
|
|
2778
|
|
- transcriptButton.alignment = .left
|
|
2779
|
|
- transcriptButton.setButtonType(.momentaryPushIn)
|
|
2780
|
|
-
|
|
2781
|
|
- aiCompanionTranscriptMeetingIdByView[ObjectIdentifier(transcriptButton)] = recording.id
|
|
2782
|
|
-
|
|
2783
|
|
- let transcriptStatusLabel = textLabel(aiCompanionTranscriptStatusText(for: recording), font: typography.fieldLabel, color: palette.textMuted)
|
|
2784
|
|
- transcriptStatusLabel.alignment = .left
|
|
2785
|
|
- transcriptStatusLabel.maximumNumberOfLines = 2
|
|
2786
|
|
- transcriptStatusLabel.lineBreakMode = .byTruncatingTail
|
|
2787
|
|
- aiCompanionTranscriptStatusLabelByView[ObjectIdentifier(transcriptButton)] = transcriptStatusLabel
|
|
|
2748
|
+ let savedTimeText = DateFormatter.localizedString(from: recording.endedAt, dateStyle: .none, timeStyle: .short)
|
|
|
2749
|
+ let savedTimeLabel = textLabel("Saved time: \(savedTimeText)", font: typography.fieldLabel, color: palette.textMuted)
|
|
|
2750
|
+ savedTimeLabel.alignment = .left
|
|
2788
|
2751
|
|
|
2789
|
2752
|
let notesButton = NSButton(title: "Get notes", target: self, action: #selector(aiCompanionNotesTapped(_:)))
|
|
2790
|
2753
|
notesButton.translatesAutoresizingMaskIntoConstraints = false
|
|
|
@@ -2804,11 +2767,7 @@ private extension ViewController {
|
|
2804
|
2767
|
|
|
2805
|
2768
|
stack.addArrangedSubview(title)
|
|
2806
|
2769
|
stack.addArrangedSubview(dateLabel)
|
|
2807
|
|
- stack.addArrangedSubview(audioButton)
|
|
2808
|
|
- stack.addArrangedSubview(audioURLLabel)
|
|
2809
|
|
- stack.addArrangedSubview(audioStatusLabel)
|
|
2810
|
|
- stack.addArrangedSubview(transcriptButton)
|
|
2811
|
|
- stack.addArrangedSubview(transcriptStatusLabel)
|
|
|
2770
|
+ stack.addArrangedSubview(savedTimeLabel)
|
|
2812
|
2771
|
stack.addArrangedSubview(notesButton)
|
|
2813
|
2772
|
stack.addArrangedSubview(notesStatusLabel)
|
|
2814
|
2773
|
|