49 lines
1.6 KiB
JavaScript
49 lines
1.6 KiB
JavaScript
|
import { showMoreItemsForCurrentTimeline } from './timeline'
|
||
|
import { scrollToTop } from '../_utils/scrollToTop'
|
||
|
import { scheduleIdleTask } from '../_utils/scheduleIdleTask'
|
||
|
import { createStatusOrNotificationUuid } from '../_utils/createStatusOrNotificationUuid'
|
||
|
import { store } from '../_store/store'
|
||
|
|
||
|
const RETRIES = 5
|
||
|
const TIMEOUT = 50
|
||
|
|
||
|
export function showMoreAndScrollToTop () {
|
||
|
// Similar to Twitter, pressing "." will click the "show more" button and select
|
||
|
// the first toot.
|
||
|
showMoreItemsForCurrentTimeline()
|
||
|
let {
|
||
|
currentInstance,
|
||
|
timelineItemSummaries,
|
||
|
currentTimelineType,
|
||
|
currentTimelineValue
|
||
|
} = store.get()
|
||
|
let firstItemSummary = timelineItemSummaries && timelineItemSummaries[0]
|
||
|
if (!firstItemSummary) {
|
||
|
return
|
||
|
}
|
||
|
let notificationId = currentTimelineType === 'notifications' && firstItemSummary.id
|
||
|
let statusId = currentTimelineType !== 'notifications' && firstItemSummary.id
|
||
|
scrollToTop(/* smooth */ false)
|
||
|
// try 5 times to wait for the element to be rendered and then focus it
|
||
|
let count = 0
|
||
|
const tryToFocusElement = () => {
|
||
|
let uuid = createStatusOrNotificationUuid(
|
||
|
currentInstance, currentTimelineType,
|
||
|
currentTimelineValue, notificationId, statusId
|
||
|
)
|
||
|
let element = document.getElementById(uuid)
|
||
|
if (element) {
|
||
|
try {
|
||
|
element.focus({ preventScroll: true })
|
||
|
} catch (e) {
|
||
|
console.error(e)
|
||
|
}
|
||
|
} else {
|
||
|
if (++count <= RETRIES) {
|
||
|
setTimeout(() => scheduleIdleTask(tryToFocusElement), TIMEOUT)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
scheduleIdleTask(tryToFocusElement)
|
||
|
}
|