mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 09:02:25 -05: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:
		
					parent
					
						
							
								ce615b5d59
							
						
					
				
			
			
				commit
				
					
						4b8d7bd952
					
				
			
		
					 13 changed files with 623 additions and 33 deletions
				
			
		|  | @ -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"}] | ||||
| 	}) | ||||
| }); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue