From 4b8d7bd952dd97091d1baddeab10213e9c38cef3 Mon Sep 17 00:00:00 2001 From: f0x52 Date: Sun, 11 Dec 2022 16:00:23 +0100 Subject: [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 --- web/source/settings/lib/query/custom-emoji.js | 97 +++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) (limited to 'web/source/settings/lib/query') 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"}] }) }); -- cgit v1.2.3