From dd4676cec7d73fe0f9fa209517a622abd36f307e Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 7 Feb 2026 15:32:11 +0000 Subject: [PATCH 1/8] Add calendar/contacts toggle to the right sidebar panel Replace the separate SidebarParticipantPicker and SidebarPluginContainer registrations with a unified SidebarViewSwitcher that provides a segmented control at the top of the right panel. Users can switch between "Contacts" (the existing participant profile view) and "Calendar" (a compact agenda- style day view showing today's events with day-by-day navigation). New components: - SidebarViewToggle: segmented control for switching views - SidebarCalendarDayView: compact event list using CalendarDataSource - SidebarViewSwitcher: orchestrates toggle + both views https://claude.ai/code/session_016hcccJaZPjExmSfK8Bff8V --- .../message-list/lib/main.tsx | 13 +- .../lib/sidebar-calendar-day-view.tsx | 159 ++++++++++++++++++ .../lib/sidebar-view-switcher.tsx | 109 ++++++++++++ .../message-list/lib/sidebar-view-toggle.tsx | 33 ++++ .../message-list/styles/message-list.less | 157 +++++++++++++++++ 5 files changed, 462 insertions(+), 9 deletions(-) create mode 100644 app/internal_packages/message-list/lib/sidebar-calendar-day-view.tsx create mode 100644 app/internal_packages/message-list/lib/sidebar-view-switcher.tsx create mode 100644 app/internal_packages/message-list/lib/sidebar-view-toggle.tsx diff --git a/app/internal_packages/message-list/lib/main.tsx b/app/internal_packages/message-list/lib/main.tsx index 534c1678d7..5ad748995c 100644 --- a/app/internal_packages/message-list/lib/main.tsx +++ b/app/internal_packages/message-list/lib/main.tsx @@ -9,8 +9,7 @@ import { import { MessageListHiddenMessagesToggle } from './message-list-hidden-messages-toggle'; import MessageList from './message-list'; -import { SidebarPluginContainer } from './sidebar-plugin-container'; -import { SidebarParticipantPicker } from './sidebar-participant-picker'; +import { SidebarViewSwitcher } from './sidebar-view-switcher'; export function activate() { if (AppEnv.isMainWindow()) { @@ -18,10 +17,7 @@ export function activate() { ComponentRegistry.register(MessageList, { location: WorkspaceStore.Location.MessageList, }); - ComponentRegistry.register(SidebarParticipantPicker, { - location: WorkspaceStore.Location.MessageListSidebar, - }); - ComponentRegistry.register(SidebarPluginContainer, { + ComponentRegistry.register(SidebarViewSwitcher, { location: WorkspaceStore.Location.MessageListSidebar, }); ComponentRegistry.register(MessageListHiddenMessagesToggle, { @@ -33,7 +29,7 @@ export function activate() { ComponentRegistry.register(MessageList, { location: WorkspaceStore.Location.Center }); // We need to locate the thread and focus it so that the MessageList displays it - DatabaseStore.find(Thread, threadId).then(thread => + DatabaseStore.find(Thread, threadId).then((thread) => Actions.setFocus({ collection: 'thread', item: thread }) ); @@ -48,6 +44,5 @@ export function activate() { export function deactivate() { ComponentRegistry.unregister(MessageList); - ComponentRegistry.unregister(SidebarPluginContainer); - ComponentRegistry.unregister(SidebarParticipantPicker); + ComponentRegistry.unregister(SidebarViewSwitcher); } diff --git a/app/internal_packages/message-list/lib/sidebar-calendar-day-view.tsx b/app/internal_packages/message-list/lib/sidebar-calendar-day-view.tsx new file mode 100644 index 0000000000..50d3412770 --- /dev/null +++ b/app/internal_packages/message-list/lib/sidebar-calendar-day-view.tsx @@ -0,0 +1,159 @@ +import moment, { Moment } from 'moment'; +import React from 'react'; +import { + Rx, + DatabaseStore, + AccountStore, + Calendar, + Event, + Actions, + localized, +} from 'mailspring-exports'; +import { RetinaImg, ScrollRegion } from 'mailspring-component-kit'; +import { + CalendarDataSource, + EventOccurrence, +} from '../../main-calendar/lib/core/calendar-data-source'; +import { Disposable } from 'rx-core'; + +const DISABLED_CALENDARS = 'mailspring.disabledCalendars'; + +interface SidebarCalendarDayViewState { + focusedMoment: Moment; + events: EventOccurrence[]; + disabledCalendars: string[]; +} + +export class SidebarCalendarDayView extends React.Component<{}, SidebarCalendarDayViewState> { + static displayName = 'SidebarCalendarDayView'; + + _dataSource = new CalendarDataSource(); + _configDisposable?: Disposable; + _eventDisposable?: Disposable; + + constructor(props: {}) { + super(props); + this.state = { + focusedMoment: moment(), + events: [], + disabledCalendars: AppEnv.config.get(DISABLED_CALENDARS) || [], + }; + } + + componentDidMount() { + this._configDisposable = Rx.Observable.fromConfig( + DISABLED_CALENDARS + ).subscribe((disabledCalendars) => { + this.setState({ disabledCalendars: disabledCalendars || [] }, () => { + this._subscribeToEvents(); + }); + }); + this._subscribeToEvents(); + } + + componentWillUnmount() { + this._configDisposable?.dispose(); + this._eventDisposable?.dispose(); + } + + _subscribeToEvents() { + this._eventDisposable?.dispose(); + + const { focusedMoment, disabledCalendars } = this.state; + const startOfDay = focusedMoment.clone().startOf('day'); + const endOfDay = focusedMoment.clone().endOf('day'); + + this._eventDisposable = this._dataSource + .buildObservable({ + disabledCalendars, + startUnix: startOfDay.unix(), + endUnix: endOfDay.unix(), + }) + .subscribe(({ events }) => { + const sorted = events + .filter((e) => !e.isCancelled) + .sort((a, b) => { + if (a.isAllDay && !b.isAllDay) return -1; + if (!a.isAllDay && b.isAllDay) return 1; + return a.start - b.start; + }); + this.setState({ events: sorted }); + }); + } + + _onClickToday = () => { + this.setState({ focusedMoment: moment() }, () => this._subscribeToEvents()); + }; + + _onClickPrevDay = () => { + this.setState({ focusedMoment: this.state.focusedMoment.clone().subtract(1, 'day') }, () => + this._subscribeToEvents() + ); + }; + + _onClickNextDay = () => { + this.setState({ focusedMoment: this.state.focusedMoment.clone().add(1, 'day') }, () => + this._subscribeToEvents() + ); + }; + + _onClickEvent = (event: EventOccurrence) => { + Actions.focusCalendarEvent({ id: event.id, start: event.start }); + }; + + _formatEventTime(event: EventOccurrence) { + if (event.isAllDay) { + return localized('All Day'); + } + const start = moment.unix(event.start).format('LT'); + const end = moment.unix(event.end).format('LT'); + return `${start} - ${end}`; + } + + _isToday() { + return this.state.focusedMoment.isSame(moment(), 'day'); + } + + render() { + const { focusedMoment, events } = this.state; + const isToday = this._isToday(); + const dateLabel = isToday ? localized('Today') : focusedMoment.format('ddd, MMM D'); + + return ( +
+
+ + + {dateLabel} + + +
+ + {events.length === 0 ? ( +
{localized('No events')}
+ ) : ( + events.map((event) => ( +
this._onClickEvent(event)} + > +
{this._formatEventTime(event)}
+
{event.title || localized('(No title)')}
+ {event.location ?
{event.location}
: null} +
+ )) + )} +
+
+ ); + } +} diff --git a/app/internal_packages/message-list/lib/sidebar-view-switcher.tsx b/app/internal_packages/message-list/lib/sidebar-view-switcher.tsx new file mode 100644 index 0000000000..216d62eb67 --- /dev/null +++ b/app/internal_packages/message-list/lib/sidebar-view-switcher.tsx @@ -0,0 +1,109 @@ +import React from 'react'; +import { PropTypes, FocusedContactsStore, Contact } from 'mailspring-exports'; +import { InjectedComponentSet } from 'mailspring-component-kit'; +import { SidebarViewToggle, SidebarView } from './sidebar-view-toggle'; +import { SidebarParticipantPicker } from './sidebar-participant-picker'; +import { SidebarCalendarDayView } from './sidebar-calendar-day-view'; + +class FocusedContactStorePropsContainer extends React.Component< + { children: React.ReactElement }, + { sortedContacts: Contact[]; focusedContact: Contact } +> { + static displayName = 'FocusedContactStorePropsContainer'; + + unsubscribe: () => void; + + constructor(props) { + super(props); + this.state = this._getStateFromStores(); + } + + componentDidMount() { + this.unsubscribe = FocusedContactsStore.listen(this._onChange); + } + + componentWillUnmount() { + this.unsubscribe(); + } + + _onChange = () => { + this.setState(this._getStateFromStores()); + }; + + _getStateFromStores() { + return { + sortedContacts: FocusedContactsStore.sortedContacts(), + focusedContact: FocusedContactsStore.focusedContact(), + }; + } + + render() { + let classname = 'sidebar-section'; + let inner = null; + if (this.state.focusedContact) { + classname += ' visible'; + inner = React.cloneElement(this.props.children, this.state); + } + return
{inner}
; + } +} + +const SidebarPluginContainerInner = (props) => { + return ( + + ); +}; + +SidebarPluginContainerInner.propTypes = { + focusedContact: PropTypes.object, +}; + +export class SidebarViewSwitcher extends React.Component<{}, { selectedView: SidebarView }> { + static displayName = 'SidebarViewSwitcher'; + + static containerStyles = { + order: 0, + flexShrink: 0, + minWidth: 150, + maxWidth: 300, + }; + + constructor(props: {}) { + super(props); + this.state = { + selectedView: 'contacts', + }; + } + + _onSelectView = (view: SidebarView) => { + this.setState({ selectedView: view }); + }; + + render() { + const { selectedView } = this.state; + + return ( +
+ + {selectedView === 'contacts' ? ( +
+ + + + +
+ ) : ( + + )} +
+ ); + } +} diff --git a/app/internal_packages/message-list/lib/sidebar-view-toggle.tsx b/app/internal_packages/message-list/lib/sidebar-view-toggle.tsx new file mode 100644 index 0000000000..c194f88ae9 --- /dev/null +++ b/app/internal_packages/message-list/lib/sidebar-view-toggle.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { localized } from 'mailspring-exports'; + +export type SidebarView = 'contacts' | 'calendar'; + +interface SidebarViewToggleProps { + selectedView: SidebarView; + onSelectView: (view: SidebarView) => void; +} + +export class SidebarViewToggle extends React.Component { + static displayName = 'SidebarViewToggle'; + + render() { + const { selectedView, onSelectView } = this.props; + return ( +
+ + +
+ ); + } +} diff --git a/app/internal_packages/message-list/styles/message-list.less b/app/internal_packages/message-list/styles/message-list.less index 33ad158d5b..e5ca30c85a 100644 --- a/app/internal_packages/message-list/styles/message-list.less +++ b/app/internal_packages/message-list/styles/message-list.less @@ -814,3 +814,160 @@ body.platform-win32 { width: 1px; } } + +/////////////////////////// +// sidebar-view-switcher // +/////////////////////////// +.sidebar-view-switcher { + display: flex; + flex-direction: column; + height: 100%; +} + +.sidebar-view-toggle { + display: flex; + padding: 8px 8px 4px 8px; + gap: 0; + flex-shrink: 0; + + .toggle-btn { + flex: 1; + padding: 4px 8px; + font-size: 11px; + font-weight: @font-weight-semi-bold; + text-align: center; + border: 1px solid @border-color-primary; + background: transparent; + color: @text-color-subtle; + cursor: pointer; + transition: background 0.1s ease, color 0.1s ease; + + &:first-child { + border-radius: @border-radius-base 0 0 @border-radius-base; + border-right: none; + } + &:last-child { + border-radius: 0 @border-radius-base @border-radius-base 0; + } + &.active { + background: @background-primary; + color: @text-color; + border-color: @border-color-primary; + } + &:hover:not(.active) { + background: fade(@background-primary, 50%); + } + &:focus { + outline: none; + } + } +} + +.sidebar-contacts-view { + flex: 1; + overflow: auto; +} + +/////////////////////////////// +// sidebar-calendar-day-view // +/////////////////////////////// +.sidebar-calendar-day-view { + display: flex; + flex-direction: column; + flex: 1; + overflow: hidden; +} + +.sidebar-calendar-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px; + flex-shrink: 0; + + .btn-nav { + padding: 2px 6px; + background: transparent; + border: 1px solid @border-color-primary; + border-radius: @border-radius-base; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + + img { + width: 10px; + height: 10px; + } + + &:hover { + background: fade(@background-primary, 50%); + } + } + + .sidebar-calendar-date { + font-size: 12px; + font-weight: @font-weight-semi-bold; + color: @text-color; + cursor: pointer; + + &:hover { + text-decoration: underline; + } + } +} + +.sidebar-calendar-events { + flex: 1; + overflow: auto; +} + +.sidebar-calendar-empty { + padding: 20px 15px; + text-align: center; + color: @text-color-very-subtle; + font-size: 12px; +} + +.sidebar-calendar-event { + padding: 8px 10px; + margin: 0 5px 4px 5px; + border-radius: @border-radius-base; + border: 1px solid @border-color-primary; + background: @background-primary; + cursor: pointer; + transition: background 0.1s ease; + + &:hover { + background: darken(@background-primary, 3%); + } + + &.pending { + opacity: 0.7; + border-style: dashed; + } + + .event-time { + font-size: 10px; + font-weight: @font-weight-semi-bold; + color: @text-color-subtle; + margin-bottom: 2px; + } + + .event-title { + font-size: 12px; + color: @text-color; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .event-location { + font-size: 10px; + color: @text-color-very-subtle; + margin-top: 2px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} From 123f2c154586784b8c93b98779bdb0d45d011151 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 7 Feb 2026 20:06:48 +0000 Subject: [PATCH 2/8] Use AgendaView in sidebar and rename Contacts tab to Participants Replace the custom SidebarCalendarDayView with SidebarAgendaView that wraps the new AgendaView from main-calendar. The AgendaView provides a multi-day vertical scrolling event list that fits the sidebar well. Sidebar-specific LESS overrides compact the header, event cards, and day headers for the narrow panel width (150-300px). Also rename the "Contacts" tab to "Participants" to better match the existing participant profile terminology. https://claude.ai/code/session_016hcccJaZPjExmSfK8Bff8V --- .../message-list/lib/sidebar-agenda-view.tsx | 125 ++++++++++++++ .../lib/sidebar-calendar-day-view.tsx | 159 ------------------ .../lib/sidebar-view-switcher.tsx | 10 +- .../message-list/lib/sidebar-view-toggle.tsx | 8 +- .../message-list/styles/message-list.less | 126 +++++--------- 5 files changed, 175 insertions(+), 253 deletions(-) create mode 100644 app/internal_packages/message-list/lib/sidebar-agenda-view.tsx delete mode 100644 app/internal_packages/message-list/lib/sidebar-calendar-day-view.tsx diff --git a/app/internal_packages/message-list/lib/sidebar-agenda-view.tsx b/app/internal_packages/message-list/lib/sidebar-agenda-view.tsx new file mode 100644 index 0000000000..be0875afbe --- /dev/null +++ b/app/internal_packages/message-list/lib/sidebar-agenda-view.tsx @@ -0,0 +1,125 @@ +import moment, { Moment } from 'moment'; +import React from 'react'; +import { Rx, DatabaseStore, Calendar, Actions, localized } from 'mailspring-exports'; +import { + CalendarDataSource, + EventOccurrence, + FocusedEventInfo, +} from '../../main-calendar/lib/core/calendar-data-source'; +import { AgendaView } from '../../main-calendar/lib/core/agenda-view'; +import { CalendarView } from '../../main-calendar/lib/core/calendar-constants'; +import { CalendarEventPopover } from '../../main-calendar/lib/core/calendar-event-popover'; +import { Disposable } from 'rx-core'; + +const DISABLED_CALENDARS = 'mailspring.disabledCalendars'; + +interface SidebarAgendaViewState { + focusedMoment: Moment; + selectedEvents: EventOccurrence[]; + focusedEvent: FocusedEventInfo | null; + disabledCalendars: string[]; + calendars: Calendar[]; +} + +export class SidebarAgendaView extends React.Component<{}, SidebarAgendaViewState> { + static displayName = 'SidebarAgendaView'; + + _dataSource = new CalendarDataSource(); + _configDisposable?: Disposable; + _calDisposable?: Disposable; + + constructor(props: {}) { + super(props); + this.state = { + focusedMoment: moment(), + selectedEvents: [], + focusedEvent: null, + disabledCalendars: AppEnv.config.get(DISABLED_CALENDARS) || [], + calendars: [], + }; + } + + componentDidMount() { + this._configDisposable = Rx.Observable.fromConfig( + DISABLED_CALENDARS + ).subscribe((disabledCalendars) => { + this.setState({ disabledCalendars: disabledCalendars || [] }); + }); + + const calQuery = DatabaseStore.findAll(Calendar); + this._calDisposable = Rx.Observable.fromQuery(calQuery).subscribe((calendars) => { + this.setState({ calendars }); + }); + } + + componentWillUnmount() { + this._configDisposable?.dispose(); + this._calDisposable?.dispose(); + } + + _getReadOnlyCalendarIds(): Set { + const ids = new Set(); + for (const cal of this.state.calendars) { + if (cal.readOnly) { + ids.add(cal.id); + } + } + return ids; + } + + _onChangeFocusedMoment = (m: Moment) => { + this.setState({ focusedMoment: m, focusedEvent: null }); + }; + + _onChangeView = () => { + // No-op in the sidebar — we always show the agenda view + }; + + _onEventClick = (e: React.MouseEvent, event: EventOccurrence) => { + this.setState({ selectedEvents: [event], focusedEvent: null }); + }; + + _onEventDoubleClick = (event: EventOccurrence) => { + const el = document.getElementById(event.id); + if (!el) return; + Actions.openPopover(, { + originRect: el.getBoundingClientRect(), + direction: 'left', + fallbackDirection: 'right', + closeOnAppBlur: false, + }); + }; + + _onEventFocused = (event: EventOccurrence) => { + this._onEventDoubleClick(event); + }; + + // No-ops for drag and mouse handlers — not needed in sidebar + _noopMouseHandler = () => {}; + _noopDragStart = () => {}; + + render() { + return ( +
+ +
+ ); + } +} diff --git a/app/internal_packages/message-list/lib/sidebar-calendar-day-view.tsx b/app/internal_packages/message-list/lib/sidebar-calendar-day-view.tsx deleted file mode 100644 index 50d3412770..0000000000 --- a/app/internal_packages/message-list/lib/sidebar-calendar-day-view.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import moment, { Moment } from 'moment'; -import React from 'react'; -import { - Rx, - DatabaseStore, - AccountStore, - Calendar, - Event, - Actions, - localized, -} from 'mailspring-exports'; -import { RetinaImg, ScrollRegion } from 'mailspring-component-kit'; -import { - CalendarDataSource, - EventOccurrence, -} from '../../main-calendar/lib/core/calendar-data-source'; -import { Disposable } from 'rx-core'; - -const DISABLED_CALENDARS = 'mailspring.disabledCalendars'; - -interface SidebarCalendarDayViewState { - focusedMoment: Moment; - events: EventOccurrence[]; - disabledCalendars: string[]; -} - -export class SidebarCalendarDayView extends React.Component<{}, SidebarCalendarDayViewState> { - static displayName = 'SidebarCalendarDayView'; - - _dataSource = new CalendarDataSource(); - _configDisposable?: Disposable; - _eventDisposable?: Disposable; - - constructor(props: {}) { - super(props); - this.state = { - focusedMoment: moment(), - events: [], - disabledCalendars: AppEnv.config.get(DISABLED_CALENDARS) || [], - }; - } - - componentDidMount() { - this._configDisposable = Rx.Observable.fromConfig( - DISABLED_CALENDARS - ).subscribe((disabledCalendars) => { - this.setState({ disabledCalendars: disabledCalendars || [] }, () => { - this._subscribeToEvents(); - }); - }); - this._subscribeToEvents(); - } - - componentWillUnmount() { - this._configDisposable?.dispose(); - this._eventDisposable?.dispose(); - } - - _subscribeToEvents() { - this._eventDisposable?.dispose(); - - const { focusedMoment, disabledCalendars } = this.state; - const startOfDay = focusedMoment.clone().startOf('day'); - const endOfDay = focusedMoment.clone().endOf('day'); - - this._eventDisposable = this._dataSource - .buildObservable({ - disabledCalendars, - startUnix: startOfDay.unix(), - endUnix: endOfDay.unix(), - }) - .subscribe(({ events }) => { - const sorted = events - .filter((e) => !e.isCancelled) - .sort((a, b) => { - if (a.isAllDay && !b.isAllDay) return -1; - if (!a.isAllDay && b.isAllDay) return 1; - return a.start - b.start; - }); - this.setState({ events: sorted }); - }); - } - - _onClickToday = () => { - this.setState({ focusedMoment: moment() }, () => this._subscribeToEvents()); - }; - - _onClickPrevDay = () => { - this.setState({ focusedMoment: this.state.focusedMoment.clone().subtract(1, 'day') }, () => - this._subscribeToEvents() - ); - }; - - _onClickNextDay = () => { - this.setState({ focusedMoment: this.state.focusedMoment.clone().add(1, 'day') }, () => - this._subscribeToEvents() - ); - }; - - _onClickEvent = (event: EventOccurrence) => { - Actions.focusCalendarEvent({ id: event.id, start: event.start }); - }; - - _formatEventTime(event: EventOccurrence) { - if (event.isAllDay) { - return localized('All Day'); - } - const start = moment.unix(event.start).format('LT'); - const end = moment.unix(event.end).format('LT'); - return `${start} - ${end}`; - } - - _isToday() { - return this.state.focusedMoment.isSame(moment(), 'day'); - } - - render() { - const { focusedMoment, events } = this.state; - const isToday = this._isToday(); - const dateLabel = isToday ? localized('Today') : focusedMoment.format('ddd, MMM D'); - - return ( -
-
- - - {dateLabel} - - -
- - {events.length === 0 ? ( -
{localized('No events')}
- ) : ( - events.map((event) => ( -
this._onClickEvent(event)} - > -
{this._formatEventTime(event)}
-
{event.title || localized('(No title)')}
- {event.location ?
{event.location}
: null} -
- )) - )} -
-
- ); - } -} diff --git a/app/internal_packages/message-list/lib/sidebar-view-switcher.tsx b/app/internal_packages/message-list/lib/sidebar-view-switcher.tsx index 216d62eb67..0cafb40b52 100644 --- a/app/internal_packages/message-list/lib/sidebar-view-switcher.tsx +++ b/app/internal_packages/message-list/lib/sidebar-view-switcher.tsx @@ -3,7 +3,7 @@ import { PropTypes, FocusedContactsStore, Contact } from 'mailspring-exports'; import { InjectedComponentSet } from 'mailspring-component-kit'; import { SidebarViewToggle, SidebarView } from './sidebar-view-toggle'; import { SidebarParticipantPicker } from './sidebar-participant-picker'; -import { SidebarCalendarDayView } from './sidebar-calendar-day-view'; +import { SidebarAgendaView } from './sidebar-agenda-view'; class FocusedContactStorePropsContainer extends React.Component< { children: React.ReactElement }, @@ -79,7 +79,7 @@ export class SidebarViewSwitcher extends React.Component<{}, { selectedView: Sid constructor(props: {}) { super(props); this.state = { - selectedView: 'contacts', + selectedView: 'participants', }; } @@ -93,15 +93,15 @@ export class SidebarViewSwitcher extends React.Component<{}, { selectedView: Sid return (
- {selectedView === 'contacts' ? ( -
+ {selectedView === 'participants' ? ( +
) : ( - + )}
); diff --git a/app/internal_packages/message-list/lib/sidebar-view-toggle.tsx b/app/internal_packages/message-list/lib/sidebar-view-toggle.tsx index c194f88ae9..f5c9f25edb 100644 --- a/app/internal_packages/message-list/lib/sidebar-view-toggle.tsx +++ b/app/internal_packages/message-list/lib/sidebar-view-toggle.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { localized } from 'mailspring-exports'; -export type SidebarView = 'contacts' | 'calendar'; +export type SidebarView = 'participants' | 'calendar'; interface SidebarViewToggleProps { selectedView: SidebarView; @@ -16,10 +16,10 @@ export class SidebarViewToggle extends React.Component { return (