From 23613219e1790aecd5d9ec7f38c490cb358385d3 Mon Sep 17 00:00:00 2001 From: Ben Beauchamp Date: Fri, 31 Jan 2025 19:48:02 -0600 Subject: [PATCH] refactor(blacklist): change all instances of blacktag to blacklistedTag and update doc to match --- cypress/config/settings.cypress.json | 4 +- docs/using-jellyseerr/settings/general.md | 4 +- jellyseerr-api.yml | 2 +- server/entity/Blacklist.ts | 4 +- server/interfaces/api/blacklistInterfaces.ts | 2 +- ...ocessor.ts => blacklistedTagsProcessor.ts} | 32 +++++----- server/job/schedule.ts | 12 ++-- server/lib/settings/index.ts | 8 +-- .../1737320080282-AddBlacklistTagsColumn.ts | 6 +- .../1737320080282-AddBlacklistTagsColumn.ts | 4 +- server/routes/blacklist.ts | 8 +-- src/components/Blacklist/index.tsx | 14 ++--- src/components/BlacklistBlock/index.tsx | 6 +- .../index.tsx | 21 ++++--- .../index.tsx | 61 +++++++++++-------- .../Settings/SettingsJobsCache/index.tsx | 2 +- .../Settings/SettingsMain/index.tsx | 54 ++++++++-------- src/i18n/locale/en.json | 24 ++++---- 18 files changed, 144 insertions(+), 124 deletions(-) rename server/job/{blacktagsProcessor.ts => blacklistedTagsProcessor.ts} (83%) rename src/components/{BlacktagsBadge => BlacklistedTagsBadge}/index.tsx (67%) rename src/components/{BlacktagsSelector => BlacklistedTagsSelector}/index.tsx (85%) diff --git a/cypress/config/settings.cypress.json b/cypress/config/settings.cypress.json index 0f18ad16..2e2dbbfb 100644 --- a/cypress/config/settings.cypress.json +++ b/cypress/config/settings.cypress.json @@ -19,8 +19,8 @@ "discoverRegion": "", "streamingRegion": "", "originalLanguage": "", - "blacktags": "", - "blacktagsLimit": 50, + "blacklistedTags": "", + "blacklistedTagsLimit": 50, "trustProxy": false, "mediaServerType": 1, "partialRequestsEnabled": true, diff --git a/docs/using-jellyseerr/settings/general.md b/docs/using-jellyseerr/settings/general.md index 73d4f6ce..57857670 100644 --- a/docs/using-jellyseerr/settings/general.md +++ b/docs/using-jellyseerr/settings/general.md @@ -64,9 +64,9 @@ These settings filter content shown on the "Discover" home page based on regiona ## Blacklist Content with Tags and Limit Content Blacklisted per Tag -These settings blacklist any TV shows or movies that have one of the entered tags. Entries are added to the blacklist using the "Process Blacktags" job. Removing blacktags will remove media from the blacklist if it was blacklisted for that blacktag. To clear all blacklist entries created with blacktags, remove all blacktags in the setting and run the "Process Blacktags" job. +These settings blacklist any TV shows or movies that have one of the entered tags. Entries are added to the blacklist using the "Process Blacklisted Tags" job. Removing blacklisted tags will remove media from the blacklist if it was blacklisted for that tag. To clear all blacklist entries created with tag, remove all tags in the setting and run the "Process Blacklisted Tags" job. The limit configures the number of pages per tag the job will blacklist, where each page is 20 entires. The job cycles through each of the 16 available discovery sort options and queries the defined number of pages to blacklist media most likely to appear at the top of a sort. Increasing the limit will create a more accurate blacklist, but will use more space. -Blacktags are disabled until tags to blacklist are entered. These settings cannot be overriden in user settings. +Blacklisted tags are disabled until tags to blacklist are entered. These settings cannot be overriden in user settings. ## Hide Available Media diff --git a/jellyseerr-api.yml b/jellyseerr-api.yml index 4afaab5d..4e40b233 100644 --- a/jellyseerr-api.yml +++ b/jellyseerr-api.yml @@ -4160,7 +4160,7 @@ paths: name: filter schema: type: string - enum: [all, manual, blacktags] + enum: [all, manual, blacklistedTags] default: manual responses: '200': diff --git a/server/entity/Blacklist.ts b/server/entity/Blacklist.ts index 90c79dcf..a6bac9d9 100644 --- a/server/entity/Blacklist.ts +++ b/server/entity/Blacklist.ts @@ -45,7 +45,7 @@ export class Blacklist implements BlacklistItem { public media: Media; @Column({ nullable: true, type: 'varchar' }) - public blacktags?: string; + public blacklistedTags?: string; @CreateDateColumn() public createdAt: Date; @@ -62,7 +62,7 @@ export class Blacklist implements BlacklistItem { mediaType: MediaType; title?: ZodOptional['_output']; tmdbId: ZodNumber['_output']; - blacktags?: string; + blacklistedTags?: string; }; }, entityManager?: EntityManager diff --git a/server/interfaces/api/blacklistInterfaces.ts b/server/interfaces/api/blacklistInterfaces.ts index 07326f3e..0cf4646e 100644 --- a/server/interfaces/api/blacklistInterfaces.ts +++ b/server/interfaces/api/blacklistInterfaces.ts @@ -7,7 +7,7 @@ export interface BlacklistItem { title?: string; createdAt?: Date; user?: User; - blacktags?: string; + blacklistedTags?: string; } export interface BlacklistResultsResponse extends PaginatedResponse { diff --git a/server/job/blacktagsProcessor.ts b/server/job/blacklistedTagsProcessor.ts similarity index 83% rename from server/job/blacktagsProcessor.ts rename to server/job/blacklistedTagsProcessor.ts index 52889d32..06cb1892 100644 --- a/server/job/blacktagsProcessor.ts +++ b/server/job/blacklistedTagsProcessor.ts @@ -20,7 +20,7 @@ import type { EntityManager } from 'typeorm'; const TMDB_API_DELAY_MS = 250; class AbortTransaction extends Error {} -class BlacktagProcessor implements RunnableScanner { +class BlacklistedTagProcessor implements RunnableScanner { private running = false; private progress = 0; private total = 0; @@ -35,7 +35,7 @@ class BlacktagProcessor implements RunnableScanner { }); } catch (err) { if (err instanceof AbortTransaction) { - logger.info('Aborting job: Process Blacktags', { + logger.info('Aborting job: Process Blacklisted Tags', { label: 'Jobs', }); } else { @@ -68,25 +68,25 @@ class BlacktagProcessor implements RunnableScanner { const tmdb = createTmdbWithRegionLanguage(); const settings = getSettings(); - const blacktags = settings.main.blacktags; - const blacktagsArr = blacktags.split(','); + const blacklistedTags = settings.main.blacklistedTags; + const blacklistedTagsArr = blacklistedTags.split(','); - const pageLimit = settings.main.blacktagsLimit; + const pageLimit = settings.main.blacklistedTagsLimit; - if (blacktags.length === 0) { + if (blacklistedTags.length === 0) { return; } // The maximum number of queries we're expected to execute this.total = - 2 * blacktagsArr.length * pageLimit * SortOptionsIterable.length; + 2 * blacklistedTagsArr.length * pageLimit * SortOptionsIterable.length; for (const type of [MediaType.MOVIE, MediaType.TV]) { const getDiscover = type == MediaType.MOVIE ? tmdb.getDiscoverMovies : tmdb.getDiscoverTv; // Iterate for each tag - for (const tag of blacktagsArr) { + for (const tag of blacklistedTagsArr) { let queryMax = pageLimit * SortOptionsIterable.length; let fixedSortMode = false; // Set to true when the page limit allows for getting every page of tag @@ -139,11 +139,11 @@ class BlacktagProcessor implements RunnableScanner { // Don't mark manual blacklists with tags // If media wasn't previously blacklisted for this tag, add the tag to the media's blacklist if ( - blacklistEntry.blacktags != null && - !blacklistEntry.blacktags.includes(`,${keywordId},`) + blacklistEntry.blacklistedTags != null && + !blacklistEntry.blacklistedTags.includes(`,${keywordId},`) ) { await blacklistRepository.update(blacklistEntry.id, { - blacktags: `${blacklistEntry.blacktags}${keywordId},`, + blacklistedTags: `${blacklistEntry.blacklistedTags}${keywordId},`, }); } @@ -157,7 +157,7 @@ class BlacktagProcessor implements RunnableScanner { mediaType, title: 'title' in entry ? entry.title : entry.name, tmdbId: entry.id, - blacktags: `,${keywordId},`, + blacklistedTags: `,${keywordId},`, }, }, em @@ -166,12 +166,12 @@ class BlacktagProcessor implements RunnableScanner { } private async cleanBlacklist(em: EntityManager) { - // Remove blacklist and media entries blacklisted by blacktags + // Remove blacklist and media entries blacklisted by tags const mediaRepository = em.getRepository(Media); const mediaToRemove = await mediaRepository .createQueryBuilder('media') .innerJoinAndSelect(Blacklist, 'blist', 'blist.tmdbId = media.tmdbId') - .where(`blist.blacktags IS NOT NULL`) + .where(`blist.blacklistedTags IS NOT NULL`) .getMany(); // Batch removes so the query doesn't get too large @@ -181,6 +181,6 @@ class BlacktagProcessor implements RunnableScanner { } } -const blacktagsProcessor = new BlacktagProcessor(); +const blacklistedTagsProcessor = new BlacklistedTagProcessor(); -export default blacktagsProcessor; +export default blacklistedTagsProcessor; diff --git a/server/job/schedule.ts b/server/job/schedule.ts index 537352ce..873666ae 100644 --- a/server/job/schedule.ts +++ b/server/job/schedule.ts @@ -1,5 +1,5 @@ import { MediaServerType } from '@server/constants/server'; -import blacktagsProcessor from '@server/job/blacktagsProcessor'; +import blacklistedTagsProcessor from '@server/job/blacklistedTagsProcessor'; import availabilitySync from '@server/lib/availabilitySync'; import downloadTracker from '@server/lib/downloadtracker'; import ImageProxy from '@server/lib/imageproxy'; @@ -240,18 +240,18 @@ export const startJobs = (): void => { scheduledJobs.push({ id: 'process-blacklisted-tags', - name: 'Process Blacktags', + name: 'Process Blacklisted Tags', type: 'process', interval: 'days', cronSchedule: jobs['process-blacklisted-tags'].schedule, job: schedule.scheduleJob(jobs['process-blacklisted-tags'].schedule, () => { - logger.info('Starting scheduled job: Process Blacktags', { + logger.info('Starting scheduled job: Process Blacklisted Tags', { label: 'Jobs', }); - blacktagsProcessor.run(); + blacklistedTagsProcessor.run(); }), - running: () => blacktagsProcessor.status().running, - cancelFn: () => blacktagsProcessor.cancel(), + running: () => blacklistedTagsProcessor.status().running, + cancelFn: () => blacklistedTagsProcessor.cancel(), }); logger.info('Scheduled jobs loaded', { label: 'Jobs' }); diff --git a/server/lib/settings/index.ts b/server/lib/settings/index.ts index bb9772b6..fa1ef34a 100644 --- a/server/lib/settings/index.ts +++ b/server/lib/settings/index.ts @@ -128,8 +128,8 @@ export interface MainSettings { discoverRegion: string; streamingRegion: string; originalLanguage: string; - blacktags: string; - blacktagsLimit: number; + blacklistedTags: string; + blacklistedTagsLimit: number; mediaServerType: number; partialRequestsEnabled: boolean; enableSpecialEpisodes: boolean; @@ -353,8 +353,8 @@ class Settings { discoverRegion: '', streamingRegion: '', originalLanguage: '', - blacktags: '', - blacktagsLimit: 50, + blacklistedTags: '', + blacklistedTagsLimit: 50, mediaServerType: MediaServerType.NOT_CONFIGURED, partialRequestsEnabled: true, enableSpecialEpisodes: false, diff --git a/server/migration/postgres/1737320080282-AddBlacklistTagsColumn.ts b/server/migration/postgres/1737320080282-AddBlacklistTagsColumn.ts index b943901d..d6a717ee 100644 --- a/server/migration/postgres/1737320080282-AddBlacklistTagsColumn.ts +++ b/server/migration/postgres/1737320080282-AddBlacklistTagsColumn.ts @@ -5,11 +5,13 @@ export class AddBlacklistTagsColumn1737320080282 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise { await queryRunner.query( - `ALTER TABLE "blacklist" ADD blacktags character varying` + `ALTER TABLE "blacklist" ADD blacklistedTags character varying` ); } public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "blacklist" DROP COLUMN blacktags`); + await queryRunner.query( + `ALTER TABLE "blacklist" DROP COLUMN blacklistedTags` + ); } } diff --git a/server/migration/sqlite/1737320080282-AddBlacklistTagsColumn.ts b/server/migration/sqlite/1737320080282-AddBlacklistTagsColumn.ts index b56f6a3d..4f38807f 100644 --- a/server/migration/sqlite/1737320080282-AddBlacklistTagsColumn.ts +++ b/server/migration/sqlite/1737320080282-AddBlacklistTagsColumn.ts @@ -5,10 +5,10 @@ export class AddBlacklistTagsColumn1737320080282 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise { await queryRunner.query( - `CREATE TABLE "temporary_blacklist" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "mediaType" varchar NOT NULL, "title" varchar, "tmdbId" integer NOT NULL, "blacktags" varchar, "createdAt" datetime NOT NULL DEFAULT (datetime('now')), "userId" integer, "mediaId" integer, CONSTRAINT "UQ_6bbafa28411e6046421991ea21c" UNIQUE ("tmdbId"), CONSTRAINT "REL_62b7ade94540f9f8d8bede54b9" UNIQUE ("mediaId"), CONSTRAINT "FK_53c1ab62c3e5875bc3ac474823e" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_62b7ade94540f9f8d8bede54b99" FOREIGN KEY ("mediaId") REFERENCES "media" ("id") ON DELETE CASCADE ON UPDATE NO ACTION)` + `CREATE TABLE "temporary_blacklist" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "mediaType" varchar NOT NULL, "title" varchar, "tmdbId" integer NOT NULL, "blacklistedTags" varchar, "createdAt" datetime NOT NULL DEFAULT (datetime('now')), "userId" integer, "mediaId" integer, CONSTRAINT "UQ_6bbafa28411e6046421991ea21c" UNIQUE ("tmdbId"), CONSTRAINT "REL_62b7ade94540f9f8d8bede54b9" UNIQUE ("mediaId"), CONSTRAINT "FK_53c1ab62c3e5875bc3ac474823e" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_62b7ade94540f9f8d8bede54b99" FOREIGN KEY ("mediaId") REFERENCES "media" ("id") ON DELETE CASCADE ON UPDATE NO ACTION)` ); await queryRunner.query( - `INSERT INTO "temporary_blacklist"("id", "mediaType", "title", "tmdbId", "blacktags", "createdAt", "userId", "mediaId") SELECT "id", "mediaType", "title", "tmdbId", "blacktags", "createdAt", "userId", "mediaId" FROM "blacklist"` + `INSERT INTO "temporary_blacklist"("id", "mediaType", "title", "tmdbId", "blacklistedTags", "createdAt", "userId", "mediaId") SELECT "id", "mediaType", "title", "tmdbId", "blacklistedTags", "createdAt", "userId", "mediaId" FROM "blacklist"` ); await queryRunner.query(`DROP TABLE "blacklist"`); await queryRunner.query( diff --git a/server/routes/blacklist.ts b/server/routes/blacklist.ts index 9e31d528..e0540c48 100644 --- a/server/routes/blacklist.ts +++ b/server/routes/blacklist.ts @@ -23,7 +23,7 @@ const blacklistGet = z.object({ take: z.coerce.number().int().positive().default(25), skip: z.coerce.number().int().nonnegative().default(0), search: z.string().optional(), - filter: z.enum(['all', 'manual', 'blacktags']).optional(), + filter: z.enum(['all', 'manual', 'blacklistedTags']).optional(), }); blacklistRoutes.get( @@ -42,10 +42,10 @@ blacklistRoutes.get( switch (filter) { case 'manual': - query = query.andWhere('blacklist.blacktags IS NULL'); + query = query.andWhere('blacklist.blacklistedTags IS NULL'); break; - case 'blacktags': - query = query.andWhere('blacklist.blacktags IS NOT NULL'); + case 'blacklistedTags': + query = query.andWhere('blacklist.blacklistedTags IS NOT NULL'); break; } diff --git a/src/components/Blacklist/index.tsx b/src/components/Blacklist/index.tsx index 8173583a..e1dc8e01 100644 --- a/src/components/Blacklist/index.tsx +++ b/src/components/Blacklist/index.tsx @@ -1,4 +1,4 @@ -import BlacktagsBadge from '@app/components/BlacktagsBadge'; +import BlacklistedTagsBadge from '@app/components/BlacklistedTagsBadge'; import Badge from '@app/components/Common/Badge'; import Button from '@app/components/Common/Button'; import CachedImage from '@app/components/Common/CachedImage'; @@ -44,14 +44,14 @@ const messages = defineMessages('components.Blacklist', { blacklistedby: '{date} by {user}', blacklistNotFoundError: '{title} is not blacklisted.', filterManual: 'Manual', - filterBlacktags: 'Blacktags', + filterBlacklistedTags: 'Blacklisted Tags', showAllBlacklisted: 'Show All Blacklisted Media', }); enum Filter { ALL = 'all', MANUAL = 'manual', - BLACKTAGS = 'blacktags', + BLACKLISTEDTAGS = 'blacklistedTags', } const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => { @@ -136,8 +136,8 @@ const Blacklist = () => { - @@ -428,9 +428,9 @@ const BlacklistedItem = ({ item, revalidateList }: BlacklistedItemProps) => { - ) : item.blacktags ? ( + ) : item.blacklistedTags ? ( - + ) : ( diff --git a/src/components/BlacklistBlock/index.tsx b/src/components/BlacklistBlock/index.tsx index 26899618..cabf3227 100644 --- a/src/components/BlacklistBlock/index.tsx +++ b/src/components/BlacklistBlock/index.tsx @@ -1,4 +1,4 @@ -import BlacktagsBadge from '@app/components/BlacktagsBadge'; +import BlacklistedTagsBadge from '@app/components/BlacklistedTagsBadge'; import Badge from '@app/components/Common/Badge'; import Button from '@app/components/Common/Button'; import LoadingSpinner from '@app/components/Common/LoadingSpinner'; @@ -98,12 +98,12 @@ const BlacklistBlock = ({ - ) : data.blacktags != null && data.blacktags != '' ? ( + ) : data.blacklistedTags != null && data.blacklistedTags != '' ? ( <> {intl.formatMessage(messages.blacklistedby)}:  - + ) : null} diff --git a/src/components/BlacktagsBadge/index.tsx b/src/components/BlacklistedTagsBadge/index.tsx similarity index 67% rename from src/components/BlacktagsBadge/index.tsx rename to src/components/BlacklistedTagsBadge/index.tsx index 4da27f65..2c949154 100644 --- a/src/components/BlacktagsBadge/index.tsx +++ b/src/components/BlacklistedTagsBadge/index.tsx @@ -1,24 +1,31 @@ import Badge from '@app/components/Common/Badge'; import Tooltip from '@app/components/Common/Tooltip'; +import defineMessages from '@app/utils/defineMessages'; import { TagIcon } from '@heroicons/react/20/solid'; import type { BlacklistItem } from '@server/interfaces/api/blacklistInterfaces'; import type { Keyword } from '@server/models/common'; import { useEffect, useState } from 'react'; +import { useIntl } from 'react-intl'; -interface BlacktagsBadgeProps { +const messages = defineMessages('components.Settings', { + blacklistedTagsText: 'Blacklisted Tags', +}); + +interface BlacklistedTagsBadgeProps { data: BlacklistItem; } -const BlacktagsBadge = ({ data }: BlacktagsBadgeProps) => { +const BlacklistedTagsBadge = ({ data }: BlacklistedTagsBadgeProps) => { const [tagNamesBlacklistedFor, setTagNamesBlacklistedFor] = useState('Loading...'); + const intl = useIntl(); useEffect(() => { - if (data.blacktags == null) { + if (data.blacklistedTags == null) { return; } - const keywordIds = data.blacktags.slice(1, -1).split(','); + const keywordIds = data.blacklistedTags.slice(1, -1).split(','); Promise.all( keywordIds.map(async (keywordId) => { const res = await fetch(`/api/v1/keyword/${keywordId}`); @@ -32,7 +39,7 @@ const BlacktagsBadge = ({ data }: BlacktagsBadgeProps) => { ).then((keywords) => { setTagNamesBlacklistedFor(keywords.join(', ')); }); - }, [data.blacktags]); + }, [data.blacklistedTags]); return ( { className="items-center border border-red-500 !text-red-400" > - Blacktags + {intl.formatMessage(messages.blacklistedTagsText)} ); }; -export default BlacktagsBadge; +export default BlacklistedTagsBadge; diff --git a/src/components/BlacktagsSelector/index.tsx b/src/components/BlacklistedTagsSelector/index.tsx similarity index 85% rename from src/components/BlacktagsSelector/index.tsx rename to src/components/BlacklistedTagsSelector/index.tsx index 6a07e865..47bb9f1c 100644 --- a/src/components/BlacktagsSelector/index.tsx +++ b/src/components/BlacklistedTagsSelector/index.tsx @@ -26,17 +26,18 @@ import { useToasts } from 'react-toast-notifications'; import useClipboard from 'react-use-clipboard'; const messages = defineMessages('components.Settings', { - copyBlacktags: 'Copied blacktags to clipboard.', - copyBlacktagsTip: 'Copy blacktag configuration', - importBlacktagsTip: 'Import blacktag configuration', - clearBlacktagsConfirm: 'Are you sure you want to clear the blacktags?', + copyBlacklistedTags: 'Copied blacklisted tags to clipboard.', + copyBlacklistedTagsTip: 'Copy blacklisted tags configuration', + importBlacklistedTagsTip: 'Import blacklisted tags configuration', + clearBlacklistedTagsConfirm: + 'Are you sure you want to clear the blacklisted tags?', yes: 'Yes', no: 'No', searchKeywords: 'Search keywords…', starttyping: 'Starting typing to search.', nooptions: 'No results.', - blacktagImportTitle: 'Import Blacktag Configuration', - blacktagImportInstructions: 'Paste blacktag configuration below.', + blacklistedTagImportTitle: 'Import Blacklist Tag Configuration', + blacklistedTagImportInstructions: 'Paste blacklist tag configuration below.', valueRequired: 'You must provide a value.', noSpecialCharacters: 'Configuration must be a comma delimited list of TMDB keyword ids, and must not start or end with a comma.', @@ -48,11 +49,13 @@ type SingleVal = { value: number; }; -type BlacktagsSelectorProps = { +type BlacklistedTagsSelectorProps = { defaultValue?: string; }; -const BlacktagsSelector = ({ defaultValue }: BlacktagsSelectorProps) => { +const BlacklistedTagsSelector = ({ + defaultValue, +}: BlacklistedTagsSelectorProps) => { const { setFieldValue } = useFormikContext(); const [value, setValue] = useState(defaultValue); const [selectorValue, setSelectorValue] = @@ -63,7 +66,7 @@ const BlacktagsSelector = ({ defaultValue }: BlacktagsSelectorProps) => { const strVal = value?.map((v) => v.value).join(','); setSelectorValue(value); setValue(strVal); - setFieldValue('blacktags', strVal); + setFieldValue('blacklistedTags', strVal); }, [setSelectorValue, setValue, setFieldValue] ); @@ -81,8 +84,8 @@ const BlacktagsSelector = ({ defaultValue }: BlacktagsSelectorProps) => { }} /> - - + + ); }; @@ -148,7 +151,7 @@ const ControlledKeywordSelector = ({ return ( { +const BlacklistedTagsCopyButton = ({ + value, +}: BlacklistedTagsCopyButtonProps) => { const intl = useIntl(); const [isCopied, setCopied] = useClipboard(value, { successDuration: 1000, @@ -180,7 +185,7 @@ const BlacktagsCopyButton = ({ value }: BlacktagsCopyButtonProps) => { useEffect(() => { if (isCopied) { - addToast(intl.formatMessage(messages.copyBlacktags), { + addToast(intl.formatMessage(messages.copyBlacklistedTags), { appearance: 'info', autoDismiss: true, }); @@ -189,7 +194,7 @@ const BlacktagsCopyButton = ({ value }: BlacktagsCopyButtonProps) => { return (