diff options
Diffstat (limited to 'web/source/settings/lib')
| -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"}]  	})  }); | 
