mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
[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
This commit is contained in:
@@ -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"}]
|
||||
})
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user