pinafore/routes/_actions/deleteStatuses.js

64 lines
2.6 KiB
JavaScript
Raw Permalink Normal View History

2018-03-11 00:21:10 +00:00
import { getIdsThatRebloggedThisStatus, getNotificationIdsForStatuses } from './statuses'
2018-02-17 03:38:21 +00:00
import { store } from '../_store/store'
import { scheduleIdleTask } from '../_utils/scheduleIdleTask'
import isEqual from 'lodash-es/isEqual'
import {
deleteStatusesAndNotifications as deleteStatusesAndNotificationsFromDatabase
} from '../_database/timelines/deletion'
function filterItemIdsFromTimelines (instanceName, timelineFilter, idFilter) {
let keys = ['timelineItemIds', 'itemIdsToAdd']
keys.forEach(key => {
let timelineData = store.getAllTimelineData(instanceName, key)
Object.keys(timelineData).forEach(timelineName => {
let ids = timelineData[timelineName]
if (!timelineFilter(timelineName)) {
return
}
let filteredIds = ids.filter(idFilter)
if (!isEqual(ids, filteredIds)) {
store.setForTimeline(instanceName, timelineName, {
[key]: filteredIds
})
}
})
})
}
2018-02-17 03:38:21 +00:00
function deleteStatusIdsFromStore (instanceName, idsToDelete) {
let idsToDeleteSet = new Set(idsToDelete)
2018-03-11 00:21:10 +00:00
let idWasNotDeleted = id => !idsToDeleteSet.has(id)
let notNotificationTimeline = timelineName => timelineName !== 'notifications'
2018-03-11 00:21:10 +00:00
filterItemIdsFromTimelines(instanceName, notNotificationTimeline, idWasNotDeleted)
}
2018-03-11 00:21:10 +00:00
function deleteNotificationIdsFromStore (instanceName, idsToDelete) {
let idsToDeleteSet = new Set(idsToDelete)
let idWasNotDeleted = id => !idsToDeleteSet.has(id)
let isNotificationTimeline = timelineName => timelineName === 'notifications'
2018-03-11 00:21:10 +00:00
filterItemIdsFromTimelines(instanceName, isNotificationTimeline, idWasNotDeleted)
2018-02-17 03:38:21 +00:00
}
async function deleteStatusesAndNotifications (instanceName, statusIdsToDelete, notificationIdsToDelete) {
deleteStatusIdsFromStore(instanceName, statusIdsToDelete)
deleteNotificationIdsFromStore(instanceName, notificationIdsToDelete)
await deleteStatusesAndNotificationsFromDatabase(instanceName, statusIdsToDelete, notificationIdsToDelete)
2018-02-17 03:38:21 +00:00
}
async function doDeleteStatus (instanceName, statusId) {
2018-03-11 00:21:10 +00:00
console.log('deleting statusId', statusId)
let rebloggedIds = await getIdsThatRebloggedThisStatus(instanceName, statusId)
let statusIdsToDelete = Array.from(new Set([statusId].concat(rebloggedIds).filter(Boolean)))
let notificationIdsToDelete = Array.from(new Set(await getNotificationIdsForStatuses(instanceName, statusIdsToDelete)))
await deleteStatusesAndNotifications(instanceName, statusIdsToDelete, notificationIdsToDelete)
2018-02-17 03:38:21 +00:00
}
export function deleteStatus (instanceName, statusId) {
scheduleIdleTask(() => {
/* no await */ doDeleteStatus(instanceName, statusId)
})
}