diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js index 0ca1cb9996..faa6f2564a 100644 --- a/src/components/structures/TimelinePanel.js +++ b/src/components/structures/TimelinePanel.js @@ -42,8 +42,6 @@ import EditorStateTransfer from '../../utils/EditorStateTransfer'; const PAGINATE_SIZE = 20; const INITIAL_SIZE = 20; -const READ_MARKER_INVIEW_THRESHOLD_MS = 1 * 1000; -const READ_MARKER_OUTOFVIEW_THRESHOLD_MS = 30 * 1000; const READ_RECEIPT_INTERVAL_MS = 500; const DEBUG = false; @@ -191,6 +189,12 @@ const TimelinePanel = createReactClass({ // always show timestamps on event tiles? alwaysShowTimestamps: SettingsStore.getValue("alwaysShowTimestamps"), + + // how long to show the RM for when it's visible in the window + readMarkerInViewThresholdMs: SettingsStore.getValue("readMarkerInViewThresholdMs"), + + // how long to show the RM for when it's scrolled off-screen + readMarkerOutOfViewThresholdMs: SettingsStore.getValue("readMarkerOutOfViewThresholdMs"), }; }, @@ -593,8 +597,8 @@ const TimelinePanel = createReactClass({ _readMarkerTimeout(readMarkerPosition) { return readMarkerPosition === 0 ? - READ_MARKER_INVIEW_THRESHOLD_MS : - READ_MARKER_OUTOFVIEW_THRESHOLD_MS; + this.state.readMarkerInViewThresholdMs : + this.state.readMarkerOutOfViewThresholdMs; }, updateReadMarkerOnUserActivity: async function() { diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js index 6507854e59..6528c86f19 100644 --- a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js @@ -69,7 +69,12 @@ export default class PreferencesUserSettingsTab extends React.Component { alwaysShowMenuBarSupported: false, minimizeToTray: true, minimizeToTraySupported: false, - autocompleteDelay: SettingsStore.getValueAt(SettingLevel.DEVICE, 'autocompleteDelay').toString(10), + autocompleteDelay: + SettingsStore.getValueAt(SettingLevel.DEVICE, 'autocompleteDelay').toString(10), + readMarkerInViewThresholdMs: + SettingsStore.getValueAt(SettingLevel.DEVICE, 'readMarkerInViewThresholdMs').toString(10), + readMarkerOutOfViewThresholdMs: + SettingsStore.getValueAt(SettingLevel.DEVICE, 'readMarkerOutOfViewThresholdMs').toString(10), }; } @@ -124,6 +129,16 @@ export default class PreferencesUserSettingsTab extends React.Component { SettingsStore.setValue("autocompleteDelay", null, SettingLevel.DEVICE, e.target.value); }; + _onReadMarkerInViewThresholdMs = (e) => { + this.setState({readMarkerInViewThresholdMs: e.target.value}); + SettingsStore.setValue("readMarkerInViewThresholdMs", null, SettingLevel.DEVICE, e.target.value); + }; + + _onReadMarkerOutOfViewThresholdMs = (e) => { + this.setState({readMarkerOutOfViewThresholdMs: e.target.value}); + SettingsStore.setValue("readMarkerOutOfViewThresholdMs", null, SettingLevel.DEVICE, e.target.value); + }; + _renderGroup(settingIds) { const SettingsFlag = sdk.getComponent("views.elements.SettingsFlag"); return settingIds.map(i => ); @@ -178,6 +193,18 @@ export default class PreferencesUserSettingsTab extends React.Component { type='number' value={this.state.autocompleteDelay} onChange={this._onAutocompleteDelayChange} /> + + ); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 32f4569a3a..f55eff0aff 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -636,6 +636,8 @@ "Timeline": "Timeline", "Room list": "Room list", "Autocomplete delay (ms)": "Autocomplete delay (ms)", + "Read Marker lifetime (ms)": "Read Marker lifetime (ms)", + "Read Marker off-screen lifetime (ms)": "Read Marker off-screen lifetime (ms)", "Unignore": "Unignore", "": "", "Import E2E room keys": "Import E2E room keys", diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 7b049208aa..e0ff16c538 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -284,6 +284,14 @@ export const SETTINGS = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: 200, }, + "readMarkerInViewThresholdMs": { + supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, + default: 3000, + }, + "readMarkerOutOfViewThresholdMs": { + supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, + default: 30000, + }, "blacklistUnverifiedDevices": { // We specifically want to have room-device > device so that users may set a device default // with a per-room override.