semaphore/src/routes/_actions/filters.js

64 lines
2.4 KiB
JavaScript

import { store } from '../_store/store.js'
import { createFilter, getFilters, updateFilter, deleteFilter as doDeleteFilter } from '../_api/filters.js'
import { cacheFirstUpdateAfter, cacheFirstUpdateOnlyIfNotInCache } from '../_utils/sync.js'
import { database } from '../_database/database.js'
import { isEqual } from '../_thirdparty/lodash/objects.js'
import { toast } from '../_components/toast/toast.js'
import { formatIntl } from '../_utils/formatIntl.js'
import { emit } from '../_utils/eventBus.js'
async function syncFilters (instanceName, syncMethod) {
const { loggedInInstances } = store.get()
const accessToken = loggedInInstances[instanceName].access_token
await syncMethod(
() => getFilters(instanceName, accessToken),
() => database.getFilters(instanceName),
filters => database.setFilters(instanceName, filters),
filters => {
const { instanceFilters } = store.get()
if (!isEqual(instanceFilters[instanceName], filters)) { // avoid re-render if nothing changed
instanceFilters[instanceName] = filters
store.set({ instanceFilters })
}
}
)
}
export async function updateFiltersForInstance (instanceName) {
await syncFilters(instanceName, cacheFirstUpdateAfter)
}
export async function setupFiltersForInstance (instanceName) {
await syncFilters(instanceName, cacheFirstUpdateOnlyIfNotInCache)
}
export async function createOrUpdateFilter (instanceName, filter) {
const { loggedInInstances } = store.get()
const accessToken = loggedInInstances[instanceName].access_token
try {
if (filter.id) {
await updateFilter(instanceName, accessToken, filter)
/* no await */ toast.say('intl.updatedFilter')
} else {
await createFilter(instanceName, accessToken, filter)
/* no await */ toast.say('intl.createdFilter')
}
emit('wordFiltersChanged', instanceName)
} catch (err) {
/* no await */ toast.say(formatIntl('intl.failedToModifyFilter', err.message || ''))
}
}
export async function deleteFilter (instanceName, id) {
const { loggedInInstances } = store.get()
const accessToken = loggedInInstances[instanceName].access_token
try {
await doDeleteFilter(instanceName, accessToken, id)
/* no await */ toast.say('intl.deletedFilter')
emit('wordFiltersChanged', instanceName)
} catch (err) {
/* no await */ toast.say(formatIntl('intl.failedToModifyFilter', err.message || ''))
}
}