semaphore/src/routes/_actions/emoji.js

47 lines
1.6 KiB
JavaScript

import {
cacheFirstUpdateAfter,
cacheFirstUpdateOnlyIfNotInCache
} from '../_utils/sync.js'
import { database } from '../_database/database.js'
import { getCustomEmoji } from '../_api/emoji.js'
import { store } from '../_store/store.js'
import { isEqual } from '../_thirdparty/lodash/objects.js'
async function syncEmojiForInstance (instanceName, syncMethod) {
await syncMethod(
() => {
const { loggedInInstances } = store.get()
const accessToken = loggedInInstances[instanceName].access_token
return getCustomEmoji(instanceName, accessToken)
},
() => database.getCustomEmoji(instanceName),
emoji => database.setCustomEmoji(instanceName, emoji),
emoji => {
const { customEmoji } = store.get()
if (!isEqual(customEmoji[instanceName], emoji)) { // avoid triggering updates if nothing's changed
customEmoji[instanceName] = emoji
store.set({ customEmoji })
}
}
)
}
export async function updateCustomEmojiForInstance (instanceName) {
await syncEmojiForInstance(instanceName, cacheFirstUpdateAfter)
}
export async function setupCustomEmojiForInstance (instanceName) {
await syncEmojiForInstance(instanceName, cacheFirstUpdateOnlyIfNotInCache)
}
export function insertEmoji (realm, emoji) {
const emojiText = emoji.unicode || `:${emoji.name}:`
const { composeSelectionStart } = store.get()
const idx = composeSelectionStart || 0
const oldText = store.getComposeData(realm, 'text') || ''
const pre = oldText.substring(0, idx)
const post = oldText.substring(idx)
const newText = `${pre}${emojiText} ${post}`
store.setComposeData(realm, { text: newText })
}