Skip to content

Commit

Permalink
Show recurrence indicator in event list
Browse files Browse the repository at this point in the history
  • Loading branch information
pakerwreah committed Oct 13, 2024
1 parent 480f1bb commit 83869ff
Show file tree
Hide file tree
Showing 35 changed files with 254 additions and 71 deletions.
20 changes: 14 additions & 6 deletions Calendr.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,9 @@
34ABB9F029A166220021F3CF /* ContextMenuFactoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ABB9EF29A166220021F3CF /* ContextMenuFactoryTests.swift */; };
34ABB9F229A2AFA30021F3CF /* CursorButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ABB9F129A2AFA30021F3CF /* CursorButton.swift */; };
34AC60C626925FA5005312B6 /* PreviewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34AC60C526925FA5005312B6 /* PreviewExtensions.swift */; };
34B1B3BB2CBC3730002AC38E /* MockEventSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B1B3BA2CBC3730002AC38E /* MockEventSettings.swift */; };
34B1B3BE2CBC3762002AC38E /* MockEventSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B1B3BD2CBC3762002AC38E /* MockEventSettings.swift */; };
34B1B3BF2CBC3762002AC38E /* MockAppearanceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B1B3BC2CBC3762002AC38E /* MockAppearanceSettings.swift */; };
34B1C7C525EDA01F00E5CA80 /* EventIntervalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B1C7C425EDA01F00E5CA80 /* EventIntervalView.swift */; };
34B2C59E279FFF0600B52BF3 /* NSGestureRecognizer+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B2C59D279FFF0600B52BF3 /* NSGestureRecognizer+Rx.swift */; };
34B5A09325B0CE6F00F7F7ED /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B5A09225B0CE6F00F7F7ED /* SettingsViewController.swift */; };
Expand All @@ -147,7 +150,6 @@
34C459BC25DF114300561C29 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C459BB25DF114300561C29 /* AboutViewController.swift */; };
34C72F7E25E844E500FD20FA /* NextEventViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C72F7D25E844E500FD20FA /* NextEventViewModelTests.swift */; };
34C72F8425E88B6600FD20FA /* MockStatusItemSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C72F8325E88B6600FD20FA /* MockStatusItemSettings.swift */; };
34C72F8825E88C0300FD20FA /* MockPopoverSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C72F8725E88C0300FD20FA /* MockPopoverSettings.swift */; };
34C72F8C25E88DA100FD20FA /* MockCalendarSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C72F8B25E88DA100FD20FA /* MockCalendarSettings.swift */; };
34C72F9625E8A05700FD20FA /* MockNextEventSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C72F9525E8A05700FD20FA /* MockNextEventSettings.swift */; };
34C72F9C25E9847300FD20FA /* EventListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C72F9B25E9847300FD20FA /* EventListViewModel.swift */; };
Expand Down Expand Up @@ -341,6 +343,9 @@
34ABB9EF29A166220021F3CF /* ContextMenuFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuFactoryTests.swift; sourceTree = "<group>"; };
34ABB9F129A2AFA30021F3CF /* CursorButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CursorButton.swift; sourceTree = "<group>"; };
34AC60C526925FA5005312B6 /* PreviewExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewExtensions.swift; sourceTree = "<group>"; };
34B1B3BA2CBC3730002AC38E /* MockEventSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockEventSettings.swift; sourceTree = "<group>"; };
34B1B3BC2CBC3762002AC38E /* MockAppearanceSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAppearanceSettings.swift; sourceTree = "<group>"; };
34B1B3BD2CBC3762002AC38E /* MockEventSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockEventSettings.swift; sourceTree = "<group>"; };
34B1C7C425EDA01F00E5CA80 /* EventIntervalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventIntervalView.swift; sourceTree = "<group>"; };
34B2C59D279FFF0600B52BF3 /* NSGestureRecognizer+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSGestureRecognizer+Rx.swift"; sourceTree = "<group>"; };
34B5A09225B0CE6F00F7F7ED /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = "<group>"; };
Expand All @@ -355,7 +360,6 @@
34C459BB25DF114300561C29 /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = "<group>"; };
34C72F7D25E844E500FD20FA /* NextEventViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextEventViewModelTests.swift; sourceTree = "<group>"; };
34C72F8325E88B6600FD20FA /* MockStatusItemSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockStatusItemSettings.swift; sourceTree = "<group>"; };
34C72F8725E88C0300FD20FA /* MockPopoverSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockPopoverSettings.swift; sourceTree = "<group>"; };
34C72F8B25E88DA100FD20FA /* MockCalendarSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockCalendarSettings.swift; sourceTree = "<group>"; };
34C72F9525E8A05700FD20FA /* MockNextEventSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockNextEventSettings.swift; sourceTree = "<group>"; };
34C72F9B25E9847300FD20FA /* EventListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventListViewModel.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -431,11 +435,13 @@
isa = PBXGroup;
children = (
3421DA192693F12400056837 /* Factories */,
34B1B3BC2CBC3762002AC38E /* MockAppearanceSettings.swift */,
3421DA132693E75A00056837 /* MockCalendarServiceProvider.swift */,
3421DA152693EDEB00056837 /* MockCalendarSettings.swift */,
3421DA172693EEBD00056837 /* MockDateProvider.swift */,
3421DA112693E70E00056837 /* MockEventDetailsSettings.swift */,
34F201322693F562006CE2FF /* MockEventListSettings.swift */,
34B1B3BD2CBC3762002AC38E /* MockEventSettings.swift */,
345CC36D2C8CE13100B0DD1A /* MockGeocodeServiceProvider.swift */,
34299F742C72507100A0269B /* MockLocalNotificationProvider.swift */,
34299F722C724FA000A0269B /* MockNetworkServiceProvider.swift */,
Expand Down Expand Up @@ -715,8 +721,8 @@
34C72F8B25E88DA100FD20FA /* MockCalendarSettings.swift */,
348E703B25C617F100B3B160 /* MockDateProvider.swift */,
3477F3D925FD44C1008EA888 /* MockEventListSettings.swift */,
34B1B3BA2CBC3730002AC38E /* MockEventSettings.swift */,
34C72F9525E8A05700FD20FA /* MockNextEventSettings.swift */,
34C72F8725E88C0300FD20FA /* MockPopoverSettings.swift */,
346E70CA2802289F00A785FF /* MockScreenProvider.swift */,
34C72F8325E88B6600FD20FA /* MockStatusItemSettings.swift */,
34651F7925E325EA00518C5A /* MockWorkspaceServiceProvider.swift */,
Expand Down Expand Up @@ -1152,6 +1158,8 @@
34F7E03A28427AC00028FF25 /* EventDetailsPreview.swift in Sources */,
34F4C47D2A6C56AA00397C80 /* MockScreenProvider.swift in Sources */,
346CB088295E209600E018EF /* AutoLauncher.swift in Sources */,
34B1B3BE2CBC3762002AC38E /* MockEventSettings.swift in Sources */,
34B1B3BF2CBC3762002AC38E /* MockAppearanceSettings.swift in Sources */,
3421DA1E2693F12400056837 /* Date+Factory.swift in Sources */,
3487A43825E706F800FCC7D7 /* NextEventViewModel.swift in Sources */,
34A6434D25F42375000A0F08 /* EventViewPreview.swift in Sources */,
Expand Down Expand Up @@ -1228,8 +1236,8 @@
349E4CEF25CF48ED00A6FC18 /* VirtualTimeScheduler.swift in Sources */,
34924CE4259FCB36009C3450 /* DateSelectorTests.swift in Sources */,
34C72F8C25E88DA100FD20FA /* MockCalendarSettings.swift in Sources */,
34C72F8825E88C0300FD20FA /* MockPopoverSettings.swift in Sources */,
34C2CF9125C2070400FC2CFF /* EventViewModelTests.swift in Sources */,
34B1B3BB2CBC3730002AC38E /* MockEventSettings.swift in Sources */,
345CC36A2C8CCB1C00B0DD1A /* CacheTests.swift in Sources */,
3477F3DA25FD44C1008EA888 /* MockEventListSettings.swift in Sources */,
346E70CB2802289F00A785FF /* MockScreenProvider.swift in Sources */,
Expand Down Expand Up @@ -1467,7 +1475,7 @@
"$(inherited)",
"@executable_path/../Frameworks",
);
MARKETING_VERSION = 1.13.4;
MARKETING_VERSION = 1.14.0;
PRODUCT_BUNDLE_IDENTIFIER = br.paker.Calendr;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Calendr/Config/Calendr-Bridging-Header.h";
Expand Down Expand Up @@ -1495,7 +1503,7 @@
"$(inherited)",
"@executable_path/../Frameworks",
);
MARKETING_VERSION = 1.13.4;
MARKETING_VERSION = 1.14.0;
PRODUCT_BUNDLE_IDENTIFIER = br.paker.Calendr;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Calendr/Config/Calendr-Bridging-Header.h";
Expand Down
1 change: 1 addition & 0 deletions Calendr/Assets/Icons.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ enum Icons {
static let video = NSImage(systemName: "video")
static let video_fill = NSImage(systemName: "video.fill")
static let skip = NSImage(systemName: "forward")
static let recurrence = NSImage(systemName: "repeat")
}

enum Reminder {
Expand Down
2 changes: 2 additions & 0 deletions Calendr/Assets/Strings.generated.swift
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,8 @@ internal enum Strings {
internal static let showMap = Strings.tr("Localizable", "settings.events.show_map", fallback: "Show map and weather")
/// Show overdue reminders
internal static let showOverdueReminders = Strings.tr("Localizable", "settings.events.show_overdue_reminders", fallback: "Show overdue reminders")
/// Show recurrence indicator
internal static let showRecurrenceIndicator = Strings.tr("Localizable", "settings.events.show_recurrence_indicator", fallback: "Show recurrence indicator")
}
internal enum Keyboard {
internal enum GlobalShortcuts {
Expand Down
1 change: 1 addition & 0 deletions Calendr/Assets/cs.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
//"settings.events.show_map" = "Show map and weather";
//"settings.events.show_overdue_reminders" = "Show overdue reminders";
//"settings.events.show_finished_events" = "Show finished events";
//"settings.events.show_recurrence_indicator" = "Show recurrence indicator";

"settings.appearance.transparency" = "Průhlednost";
//"settings.appearance.accessibility" = "Accessibility";
Expand Down
1 change: 1 addition & 0 deletions Calendr/Assets/de.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"settings.events.show_map" = "Karte und Wetter anzeigen";
//"settings.events.show_overdue_reminders" = "Show overdue reminders";
//"settings.events.show_finished_events" = "Show finished events";
//"settings.events.show_recurrence_indicator" = "Show recurrence indicator";

"settings.appearance.transparency" = "Transparent";
"settings.appearance.accessibility" = "Zugänglichkeit";
Expand Down
1 change: 1 addition & 0 deletions Calendr/Assets/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"settings.events.show_map" = "Show map and weather";
"settings.events.show_overdue_reminders" = "Show overdue reminders";
"settings.events.show_finished_events" = "Show finished events";
"settings.events.show_recurrence_indicator" = "Show recurrence indicator";

"settings.appearance.transparency" = "Transparency";
"settings.appearance.accessibility" = "Accessibility";
Expand Down
1 change: 1 addition & 0 deletions Calendr/Assets/es.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"settings.events.show_map" = "Mostrar mapa y clima";
"settings.events.show_overdue_reminders" = "Mostrar recordatorios atrasados";
"settings.events.show_finished_events" = "Mostrar eventos finalizados";
"settings.events.show_recurrence_indicator" = "Mostrar indicador de recurrencia";

"settings.appearance.transparency" = "Transparencia";
"settings.appearance.accessibility" = "Accesibilidad";
Expand Down
1 change: 1 addition & 0 deletions Calendr/Assets/fr.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"settings.events.show_map" = "Afficher la carte et la météo";
"settings.events.show_overdue_reminders" = "Afficher les rappels en retard";
"settings.events.show_finished_events" = "Afficher les événements terminés";
"settings.events.show_recurrence_indicator" = "Afficher l'indicateur de récurrence";

"settings.appearance.transparency" = "Transparence";
"settings.appearance.accessibility" = "Accessibilité";
Expand Down
1 change: 1 addition & 0 deletions Calendr/Assets/it.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"settings.events.show_map" = "Mostra mappa e meteo";
//"settings.events.show_overdue_reminders" = "Show overdue reminders";
//"settings.events.show_finished_events" = "Show finished events";
//"settings.events.show_recurrence_indicator" = "Show recurrence indicator";

"settings.appearance.transparency" = "Trasparenza";
"settings.appearance.accessibility" = "Accessibilità";
Expand Down
1 change: 1 addition & 0 deletions Calendr/Assets/pt.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"settings.events.show_map" = "Mostrar mapa e clima";
"settings.events.show_overdue_reminders" = "Mostrar lembretes atrasados";
"settings.events.show_finished_events" = "Mostrar eventos terminados";
"settings.events.show_recurrence_indicator" = "Mostrar indicador de recorrência";

"settings.appearance.transparency" = "Transparência";
"settings.appearance.accessibility" = "Acessibilidade";
Expand Down
1 change: 1 addition & 0 deletions Calendr/Assets/sk.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"settings.events.show_map" = "Zobraziť mapu a počasie";
//"settings.events.show_overdue_reminders" = "Show overdue reminders";
//"settings.events.show_finished_events" = "Show finished events";
//"settings.events.show_recurrence_indicator" = "Show recurrence indicator";

"settings.appearance.transparency" = "Priehľadnosť";
"settings.appearance.accessibility" = "Prístupnosť";
Expand Down
1 change: 1 addition & 0 deletions Calendr/Assets/sv.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
//"settings.events.show_map" = "Show map and weather";
//"settings.events.show_overdue_reminders" = "Show overdue reminders";
//"settings.events.show_finished_events" = "Show finished events";
//"settings.events.show_recurrence_indicator" = "Show recurrence indicator";

"settings.appearance.transparency" = "Transparens";
//"settings.appearance.accessibility" = "Accessibility";
Expand Down
1 change: 1 addition & 0 deletions Calendr/Assets/zh-Hans.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
//"settings.events.show_map" = "Show map and weather";
//"settings.events.show_overdue_reminders" = "Show overdue reminders";
//"settings.events.show_finished_events" = "Show finished events";
//"settings.events.show_recurrence_indicator" = "Show recurrence indicator";

"settings.appearance.transparency" = "透明度";
//"settings.appearance.accessibility" = "Accessibility";
Expand Down
2 changes: 2 additions & 0 deletions Calendr/Events/EventList/EventListView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ class EventListView: NSView {

addSubview(contentStackView)

contentStackView.setHuggingPriority(.required, for: .horizontal)

contentStackView.edges(equalTo: self)
}

Expand Down
65 changes: 44 additions & 21 deletions Calendr/Events/EventList/EventView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ class EventView: NSView {

private let viewModel: EventViewModel

private let icon = NSImageView()
private let birthdayIcon = NSImageView()
private let recurrenceIcon = NSImageView()
private let title = Label()
private let subtitle = Label()
private let subtitleLink = Label()
Expand All @@ -40,9 +41,9 @@ class EventView: NSView {

configureLayout()

setUpBindings()

setData()

setUpBindings()
}

private func setUpAccessibility() {
Expand All @@ -63,15 +64,10 @@ class EventView: NSView {
setUpContextMenu(contextMenuViewModel)
}

icon.isHidden = true
completeBtn.isHidden = true

switch viewModel.type {

case .birthday:
icon.image = Icons.Event.birthday.with(scale: .small)
icon.contentTintColor = .systemRed
icon.isHidden = false
birthdayIcon.isHidden = false

case .reminder:
completeBtn.contentTintColor = viewModel.color
Expand Down Expand Up @@ -109,8 +105,6 @@ class EventView: NSView {
duration.stringValue = viewModel.duration
duration.isHidden = duration.isEmpty

relativeDuration.isHidden = true

linkBtn.isHidden = viewModel.link == nil
linkBtn.toolTip = viewModel.link?.url.absoluteString
}
Expand All @@ -126,11 +120,16 @@ class EventView: NSView {
hoverLayer.backgroundColor = NSColor.gray.cgColor.copy(alpha: 0.2)
layer?.addSublayer(hoverLayer)

[icon, completeBtn, relativeDuration].forEach {
[birthdayIcon, recurrenceIcon, completeBtn, relativeDuration].forEach {
$0.setContentHuggingPriority(.required, for: .horizontal)
$0.setContentCompressionResistancePriority(.required, for: .horizontal)
}

completeBtn.isHidden = true

birthdayIcon.isHidden = true
birthdayIcon.contentTintColor = .systemRed

title.forceVibrancy = false
title.lineBreakMode = .byWordWrapping
title.textColor = .headerTextColor
Expand All @@ -140,8 +139,9 @@ class EventView: NSView {
duration.textColor = .secondaryLabelColor
duration.font = .systemFont(ofSize: 11)

relativeDuration.isHidden = true
relativeDuration.textColor = .secondaryLabelColor
relativeDuration.font = .systemFont(ofSize: 11)
relativeDuration.font = .systemFont(ofSize: 10)

subtitle.lineBreakMode = .byWordWrapping
subtitle.maximumNumberOfLines = 2
Expand All @@ -157,25 +157,30 @@ class EventView: NSView {
colorBar.layer?.cornerRadius = 2
colorBar.width(equalTo: 4)

linkBtn.width(equalTo: 22)

let titleStackView = NSStackView(views: [icon, completeBtn, title]).with(spacing: 4).with(alignment: .firstBaseline)
let titleStackView = NSStackView(views: [birthdayIcon, completeBtn, title, recurrenceIcon])
.with(spacing: 4)
.with(alignment: .firstBaseline)

let linkStackView = NSStackView(views: [subtitleLink, linkBtn]).with(spacing: 0)

let durationStackView = NSStackView(views: [duration, relativeDuration]).with(insets: .init(right: 4))
durationStackView.setHuggingPriority(.fittingSizeCompression, for: .horizontal)
let durationStackView = NSStackView(views: [duration, relativeDuration])
duration.setContentHuggingPriority(.fittingSizeCompression, for: .horizontal)
durationStackView.setHuggingPriority(.defaultHigh, for: .horizontal)

linkStackView.rx.isContentHidden
.bind(to: linkStackView.rx.isHidden)
.disposed(by: disposeBag)

durationStackView.rx.isContentHidden
.bind(to: durationStackView.rx.isHidden)
.disposed(by: disposeBag)

let eventStackView = NSStackView(views: [titleStackView, subtitle, linkStackView, durationStackView])
.with(orientation: .vertical)
.with(spacing: 3)
.with(insets: .init(vertical: 2))

let contentStackView = NSStackView(views: [colorBar, eventStackView])
let contentStackView = NSStackView(views: [colorBar, .dummy, eventStackView, .dummy]).with(spacing: 4)
addSubview(contentStackView)
contentStackView.edges(equalTo: self)

Expand Down Expand Up @@ -215,12 +220,30 @@ class EventView: NSView {
.disposed(by: disposeBag)
}

if !viewModel.type.isBirthday {
if viewModel.type.isBirthday {

Scaling.observable
.map { Icons.Event.birthday.with(pointSize: 10 * $0) }
.bind(to: birthdayIcon.rx.image)
.disposed(by: disposeBag)

} else {

viewModel.isFaded
.map { $0 ? 0.5 : 1 }
.bind(to: rx.alpha)
.disposed(by: disposeBag)

Observable.combineLatest(viewModel.showRecurrenceIndicator, Scaling.observable)
.filter(\.0)
.map { Icons.Event.recurrence.with(pointSize: 10 * $1) }
.bind(to: recurrenceIcon.rx.image)
.disposed(by: disposeBag)

viewModel.showRecurrenceIndicator
.map(!)
.bind(to: recurrenceIcon.rx.isHidden)
.disposed(by: disposeBag)
}

if viewModel.type.isEvent {
Expand Down Expand Up @@ -254,7 +277,7 @@ class EventView: NSView {
.bind(to: relativeDuration.rx.stringValue)
.disposed(by: disposeBag)

viewModel.relativeDuration.map(false)
viewModel.relativeDuration.map(\.isEmpty)
.bind(to: relativeDuration.rx.isHidden)
.disposed(by: disposeBag)

Expand Down
Loading

0 comments on commit 83869ff

Please sign in to comment.