summaryrefslogtreecommitdiff
path: root/web/source/settings/lib/query/custom-emoji.js
diff options
context:
space:
mode:
Diffstat (limited to 'web/source/settings/lib/query/custom-emoji.js')
-rw-r--r--web/source/settings/lib/query/custom-emoji.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/web/source/settings/lib/query/custom-emoji.js b/web/source/settings/lib/query/custom-emoji.js
index fa2a08db6..593556620 100644
--- a/web/source/settings/lib/query/custom-emoji.js
+++ b/web/source/settings/lib/query/custom-emoji.js
@@ -18,8 +18,18 @@
"use strict";
+const Promise = require("bluebird");
+
const base = require("./base");
+function unwrap(res) {
+ if (res.error != undefined) {
+ throw res.error;
+ } else {
+ return res.data;
+ }
+}
+
const endpoints = (build) => ({
getAllEmoji: build.query({
query: (params = {}) => ({
@@ -77,6 +87,93 @@ const endpoints = (build) => ({
url: `/api/v1/admin/custom_emojis/${id}`
}),
invalidatesTags: (res, error, id) => [{type: "Emojis", id}]
+ }),
+ searchStatusForEmoji: build.mutation({
+ query: (url) => ({
+ method: "GET",
+ url: `/api/v2/search?q=${encodeURIComponent(url)}&resolve=true&limit=1`
+ }),
+ transformResponse: (res) => {
+ /* Parses search response, prioritizing a toot result,
+ and returns referenced custom emoji
+ */
+ let type;
+
+ if (res.statuses.length > 0) {
+ type = "statuses";
+ } else if (res.accounts.length > 0) {
+ type = "accounts";
+ } else {
+ return {
+ type: "none"
+ };
+ }
+
+ let data = res[type][0];
+
+ return {
+ type,
+ domain: (new URL(data.url)).host, // to get WEB_DOMAIN, see https://github.com/superseriousbusiness/gotosocial/issues/1225
+ list: data.emojis
+ };
+ }
+ }),
+ patchRemoteEmojis: build.mutation({
+ queryFn: ({action, domain, list, category}, api, _extraOpts, baseQuery) => {
+ const data = [];
+ const errors = [];
+
+ return Promise.each(list, (emoji) => {
+ return Promise.try(() => {
+ return baseQuery({
+ method: "GET",
+ url: `/api/v1/admin/custom_emojis`,
+ params: {
+ filter: `domain:${domain},shortcode:${emoji.shortcode}`,
+ limit: 1
+ }
+ }).then(unwrap);
+ }).then(([lookup]) => {
+ if (lookup == undefined) { throw "not found"; }
+
+ let body = {
+ type: action
+ };
+
+ if (action == "copy") {
+ body.shortcode = emoji.localShortcode ?? emoji.shortcode;
+ if (category.trim().length != 0) {
+ body.category = category;
+ }
+ }
+
+ return baseQuery({
+ method: "PATCH",
+ url: `/api/v1/admin/custom_emojis/${lookup.id}`,
+ asForm: true,
+ body: body
+ }).then(unwrap);
+ }).then((res) => {
+ data.push([emoji.shortcode, res]);
+ }).catch((e) => {
+ console.error("emoji lookup for", emoji.shortcode, "failed:", e);
+ let msg = e.message ?? e;
+ if (e.data.error) {
+ msg = e.data.error;
+ }
+ errors.push([emoji.shortcode, msg]);
+ });
+ }).then(() => {
+ if (errors.length == 0) {
+ return { data };
+ } else {
+ return {
+ error: errors
+ };
+ }
+ });
+ },
+ invalidatesTags: () => [{type: "Emojis", id: "LIST"}]
})
});