diff options
author | 2022-12-11 16:00:23 +0100 | |
---|---|---|
committer | 2022-12-11 16:00:23 +0100 | |
commit | 4b8d7bd952dd97091d1baddeab10213e9c38cef3 (patch) | |
tree | 368b80e82590ca85c031b9d720dc7dd7c4fbbb6b /web/source/settings/lib/query/custom-emoji.js | |
parent | [docs] Serve static assets with nginx (#1251) (diff) | |
download | gotosocial-4b8d7bd952dd97091d1baddeab10213e9c38cef3.tar.xz |
[frogend] Emoji copy "Steal this look" (#1222)
* split emoji into local and remote, allow looking up remote emoji by toot url
* optimize some/all filtering
* fix local emoji routes
* implement copy action
* shortcode validation, don't wipe form on error
* copy & disable PATCH
* remove local toot acceptance for testing
* unused import
* parse emoji from account and status, get web_url from status uri
* fix url parse
* submit button loading info
* actually send category
* code cleanup, distinguish between account and status responses
* use loading icons
* fix loading icon on federation page
* require Loading element
* remove unused require
* query explanation, small accessibility tweaks
Diffstat (limited to 'web/source/settings/lib/query/custom-emoji.js')
-rw-r--r-- | web/source/settings/lib/query/custom-emoji.js | 97 |
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"}] }) }); |