diff options
author | 2023-01-18 14:45:14 +0100 | |
---|---|---|
committer | 2023-01-18 14:45:14 +0100 | |
commit | 9b139b632098e6741b10fa87ff6224dcb5045947 (patch) | |
tree | c72b5c666ed01db7d1a18e531e5e01e07f504a46 /web/source/settings/lib/query/admin/custom-emoji.js | |
parent | [chore] Change default sqlite busy timeout to 5m (#1352) (diff) | |
download | gotosocial-9b139b632098e6741b10fa87ff6224dcb5045947.tar.xz |
[frogend] Settings refactor (#1318)
* yakshave new form field structure
* fully refactor user profile settings form
* use rtk query api for profile settings
* refactor user post settings
* refactor password change form
* refactor admin settings
* FormWithData structure for user forms
* admin actions refactor
* whitespace
* fix user settings data prop
* remove superfluous logging
* cleanup old code
* refactor federation/suspend (overview, detail)
* mostly abstracted (emoji) checkbox list
* refactor parse-from-toot
* refactor custom-emoji, progress on federation bulk
* loading icon styling to prevent big spinny
* refactor federation import-export interface
* cleanup old files
* [chore] Update/add license headers for 2023
* redux fixes
* text-field exports
* appease the linter
* refactor authentication with RTK Query
* fix login/logout state transition weirdness
* fixes/cleanup
* small linter-related fixes
* add eslint license header check, fix existing files
* remove old code, clarify comment
* clarify suspend on subdomains
* collapse if/else
* fa-fw width info comment
Diffstat (limited to 'web/source/settings/lib/query/admin/custom-emoji.js')
-rw-r--r-- | web/source/settings/lib/query/admin/custom-emoji.js | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/web/source/settings/lib/query/admin/custom-emoji.js b/web/source/settings/lib/query/admin/custom-emoji.js new file mode 100644 index 000000000..94917f382 --- /dev/null +++ b/web/source/settings/lib/query/admin/custom-emoji.js @@ -0,0 +1,195 @@ +/* + GoToSocial + Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +"use strict"; + +const Promise = require("bluebird"); + +const { unwrapRes } = require("../lib"); + +module.exports = (build) => ({ + getAllEmoji: build.query({ + query: (params = {}) => ({ + url: "/api/v1/admin/custom_emojis", + params: { + limit: 0, + ...params + } + }), + providesTags: (res) => + res + ? [...res.map((emoji) => ({ type: "Emojis", id: emoji.id })), { type: "Emojis", id: "LIST" }] + : [{ type: "Emojis", id: "LIST" }] + }), + + getEmoji: build.query({ + query: (id) => ({ + url: `/api/v1/admin/custom_emojis/${id}` + }), + providesTags: (res, error, id) => [{ type: "Emojis", id }] + }), + + addEmoji: build.mutation({ + query: (form) => { + return { + method: "POST", + url: `/api/v1/admin/custom_emojis`, + asForm: true, + body: form, + discardEmpty: true + }; + }, + invalidatesTags: (res) => + res + ? [{ type: "Emojis", id: "LIST" }, { type: "Emojis", id: res.id }] + : [{ type: "Emojis", id: "LIST" }] + }), + + editEmoji: build.mutation({ + query: ({ id, ...patch }) => { + return { + method: "PATCH", + url: `/api/v1/admin/custom_emojis/${id}`, + asForm: true, + body: { + type: "modify", + ...patch + } + }; + }, + invalidatesTags: (res) => + res + ? [{ type: "Emojis", id: "LIST" }, { type: "Emojis", id: res.id }] + : [{ type: "Emojis", id: "LIST" }] + }), + + deleteEmoji: build.mutation({ + query: (id) => ({ + method: "DELETE", + url: `/api/v1/admin/custom_emojis/${id}` + }), + invalidatesTags: (res, error, id) => [{ type: "Emojis", id }] + }), + + searchStatusForEmoji: build.mutation({ + queryFn: (url, api, _extraOpts, baseQuery) => { + return Promise.try(() => { + return baseQuery({ + url: `/api/v2/search?q=${encodeURIComponent(url)}&resolve=true&limit=1` + }).then(unwrapRes); + }).then((searchRes) => { + return emojiFromSearchResult(searchRes); + }).then(({ type, domain, list }) => { + const state = api.getState(); + if (domain == new URL(state.oauth.instance).host) { + throw "LOCAL_INSTANCE"; + } + + // search for every mentioned emoji with the admin api to get their ID + return Promise.map(list, (emoji) => { + return baseQuery({ + url: `/api/v1/admin/custom_emojis`, + params: { + filter: `domain:${domain},shortcode:${emoji.shortcode}`, + limit: 1 + } + }).then((unwrapRes)).then((list) => list[0]); + }, { concurrency: 5 }).then((listWithIDs) => { + return { + data: { + type, + domain, + list: listWithIDs + } + }; + }); + }).catch((e) => { + return { error: e }; + }); + } + }), + + patchRemoteEmojis: build.mutation({ + queryFn: ({ action, ...formData }, _api, _extraOpts, baseQuery) => { + const data = []; + const errors = []; + + return Promise.each(formData.selectedEmoji, (emoji) => { + return Promise.try(() => { + let body = { + type: action + }; + + if (action == "copy") { + body.shortcode = emoji.shortcode; + if (formData.category.trim().length != 0) { + body.category = formData.category; + } + } + + return baseQuery({ + method: "PATCH", + url: `/api/v1/admin/custom_emojis/${emoji.id}`, + asForm: true, + body: body + }).then(unwrapRes); + }).then((res) => { + data.push([emoji.shortcode, res]); + }).catch((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" }] + }) +}); + +function emojiFromSearchResult(searchRes) { + /* Parses the search response, prioritizing a toot result, + and returns referenced custom emoji + */ + let type; + + if (searchRes.statuses.length > 0) { + type = "statuses"; + } else if (searchRes.accounts.length > 0) { + type = "accounts"; + } else { + throw "NONE_FOUND"; + } + + let data = searchRes[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 + }; +}
\ No newline at end of file |