diff --git a/src/components/status.css b/src/components/status.css index 774fb2a0..a2d861fd 100644 --- a/src/components/status.css +++ b/src/components/status.css @@ -280,6 +280,10 @@ .icon { color: var(--text-insignificant-color); } + + &.status-card-ghost { + border-style: dashed; + } } @keyframes skeleton-breathe { diff --git a/src/components/status.jsx b/src/components/status.jsx index 442a4ed0..80294568 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -378,6 +378,7 @@ function Status({ showActionsBar, showReplyParent, mediaFirst, + showFilteredHidden, }) { const { _, t, i18n } = useLingui(); const rtf = RTF(i18n.locale); @@ -499,6 +500,16 @@ function Status({ isFiltered(filtered, filterContext); if (filterInfo?.action === 'hide') { + if (showFilteredHidden) { + return ( +
+ + + Post hidden by your filters + +
+ ); + } return null; } @@ -3940,6 +3951,7 @@ const QuoteStatuses = memo(({ id, instance, level = 0 }) => { size="s" quoted={level + 1} enableCommentHint + showFilteredHidden /> diff --git a/src/locales/en.po b/src/locales/en.po index 5f35edab..47eeca6e 100644 --- a/src/locales/en.po +++ b/src/locales/en.po @@ -34,7 +34,7 @@ msgstr "" #: src/components/account-block.jsx:170 #: src/components/account-info.jsx:715 -#: src/components/status.jsx:590 +#: src/components/status.jsx:601 msgid "Group" msgstr "" @@ -111,11 +111,11 @@ msgstr "" #: src/components/compose.jsx:2792 #: src/components/media-alt-modal.jsx:55 #: src/components/media-modal.jsx:363 -#: src/components/status.jsx:1836 -#: src/components/status.jsx:1853 -#: src/components/status.jsx:1978 -#: src/components/status.jsx:2599 -#: src/components/status.jsx:2602 +#: src/components/status.jsx:1847 +#: src/components/status.jsx:1864 +#: src/components/status.jsx:1989 +#: src/components/status.jsx:2610 +#: src/components/status.jsx:2613 #: src/pages/account-statuses.jsx:531 #: src/pages/accounts.jsx:118 #: src/pages/hashtag.jsx:203 @@ -203,7 +203,7 @@ msgid "Original" msgstr "" #: src/components/account-info.jsx:946 -#: src/components/status.jsx:2383 +#: src/components/status.jsx:2394 #: src/pages/catchup.jsx:71 #: src/pages/catchup.jsx:1448 #: src/pages/catchup.jsx:2061 @@ -329,30 +329,30 @@ msgid "Add/Remove from Lists" msgstr "" #: src/components/account-info.jsx:1490 -#: src/components/status.jsx:1258 +#: src/components/status.jsx:1269 msgid "Link copied" msgstr "" #: src/components/account-info.jsx:1493 -#: src/components/status.jsx:1261 +#: src/components/status.jsx:1272 msgid "Unable to copy link" msgstr "" #: src/components/account-info.jsx:1499 #: src/components/shortcuts-settings.jsx:1059 -#: src/components/status.jsx:1267 -#: src/components/status.jsx:3377 +#: src/components/status.jsx:1278 +#: src/components/status.jsx:3388 msgid "Copy" msgstr "" #: src/components/account-info.jsx:1514 #: src/components/shortcuts-settings.jsx:1077 -#: src/components/status.jsx:1283 +#: src/components/status.jsx:1294 msgid "Sharing doesn't seem to work." msgstr "" #: src/components/account-info.jsx:1520 -#: src/components/status.jsx:1289 +#: src/components/status.jsx:1300 msgid "Share…" msgstr "" @@ -466,9 +466,9 @@ msgstr "" #: src/components/shortcuts-settings.jsx:230 #: src/components/shortcuts-settings.jsx:583 #: src/components/shortcuts-settings.jsx:783 -#: src/components/status.jsx:3101 -#: src/components/status.jsx:3341 -#: src/components/status.jsx:3850 +#: src/components/status.jsx:3112 +#: src/components/status.jsx:3352 +#: src/components/status.jsx:3861 #: src/pages/accounts.jsx:45 #: src/pages/catchup.jsx:1584 #: src/pages/filters.jsx:225 @@ -718,7 +718,7 @@ msgid "Attachment #{i} failed" msgstr "Attachment #{i} failed" #: src/components/compose.jsx:1221 -#: src/components/status.jsx:2166 +#: src/components/status.jsx:2177 #: src/components/timeline.jsx:1023 msgid "Content warning" msgstr "" @@ -754,7 +754,7 @@ msgstr "" #: src/components/compose.jsx:1288 #: src/components/status.jsx:100 -#: src/components/status.jsx:2042 +#: src/components/status.jsx:2053 msgid "Private mention" msgstr "" @@ -791,10 +791,10 @@ msgstr "Schedule" #: src/components/compose.jsx:1677 #: src/components/keyboard-shortcuts-help.jsx:155 -#: src/components/status.jsx:1030 -#: src/components/status.jsx:1816 -#: src/components/status.jsx:1817 -#: src/components/status.jsx:2503 +#: src/components/status.jsx:1041 +#: src/components/status.jsx:1827 +#: src/components/status.jsx:1828 +#: src/components/status.jsx:2514 msgid "Reply" msgstr "" @@ -1016,7 +1016,7 @@ msgstr "" #: src/components/drafts.jsx:128 #: src/components/list-add-edit.jsx:188 -#: src/components/status.jsx:1433 +#: src/components/status.jsx:1444 #: src/pages/filters.jsx:603 #: src/pages/scheduled-posts.jsx:369 msgid "Delete…" @@ -1225,10 +1225,10 @@ msgid "<0>l or <1>f" msgstr "" #: src/components/keyboard-shortcuts-help.jsx:176 -#: src/components/status.jsx:1038 -#: src/components/status.jsx:2530 -#: src/components/status.jsx:2553 -#: src/components/status.jsx:2554 +#: src/components/status.jsx:1049 +#: src/components/status.jsx:2541 +#: src/components/status.jsx:2564 +#: src/components/status.jsx:2565 msgid "Boost" msgstr "" @@ -1237,9 +1237,9 @@ msgid "<0>Shift + <1>b" msgstr "" #: src/components/keyboard-shortcuts-help.jsx:184 -#: src/components/status.jsx:1101 -#: src/components/status.jsx:2578 -#: src/components/status.jsx:2579 +#: src/components/status.jsx:1112 +#: src/components/status.jsx:2589 +#: src/components/status.jsx:2590 msgid "Bookmark" msgstr "" @@ -1304,14 +1304,14 @@ msgid "Media description" msgstr "" #: src/components/media-alt-modal.jsx:67 -#: src/components/status.jsx:1144 -#: src/components/status.jsx:1153 +#: src/components/status.jsx:1155 +#: src/components/status.jsx:1164 #: src/components/translation-block.jsx:239 msgid "Translate" msgstr "" #: src/components/media-alt-modal.jsx:78 -#: src/components/status.jsx:1172 +#: src/components/status.jsx:1183 msgid "Speak" msgstr "" @@ -1348,9 +1348,9 @@ msgid "Filtered: {filterTitleStr}" msgstr "" #: src/components/media-post.jsx:133 -#: src/components/status.jsx:3680 -#: src/components/status.jsx:3776 -#: src/components/status.jsx:3854 +#: src/components/status.jsx:3691 +#: src/components/status.jsx:3787 +#: src/components/status.jsx:3865 #: src/components/timeline.jsx:1012 #: src/pages/catchup.jsx:75 #: src/pages/catchup.jsx:1880 @@ -1662,8 +1662,8 @@ msgid "[Unknown notification type: {type}]" msgstr "" #: src/components/notification.jsx:451 -#: src/components/status.jsx:1115 -#: src/components/status.jsx:1125 +#: src/components/status.jsx:1126 +#: src/components/status.jsx:1136 msgid "Boosted/Liked by…" msgstr "" @@ -1993,7 +1993,7 @@ msgid "Move down" msgstr "" #: src/components/shortcuts-settings.jsx:379 -#: src/components/status.jsx:1395 +#: src/components/status.jsx:1406 #: src/pages/list.jsx:195 msgid "Edit" msgstr "" @@ -2192,341 +2192,345 @@ msgstr "" msgid "Import/export settings from/to instance server (Very experimental)" msgstr "" -#: src/components/status.jsx:614 +#: src/components/status.jsx:508 +msgid "Post hidden by your filters" +msgstr "Post hidden by your filters" + +#: src/components/status.jsx:625 msgid "<0/> <1>boosted" msgstr "" -#: src/components/status.jsx:713 +#: src/components/status.jsx:724 msgid "Sorry, your current logged-in instance can't interact with this post from another instance." msgstr "" #. placeholder {0}: username || acct -#: src/components/status.jsx:867 +#: src/components/status.jsx:878 msgid "Unliked @{0}'s post" msgstr "" #. placeholder {0}: username || acct -#: src/components/status.jsx:868 +#: src/components/status.jsx:879 msgid "Liked @{0}'s post" msgstr "Liked @{0}'s post" #. placeholder {0}: username || acct -#: src/components/status.jsx:907 +#: src/components/status.jsx:918 msgid "Unbookmarked @{0}'s post" msgstr "Unbookmarked @{0}'s post" #. placeholder {0}: username || acct -#: src/components/status.jsx:908 +#: src/components/status.jsx:919 msgid "Bookmarked @{0}'s post" msgstr "Bookmarked @{0}'s post" -#: src/components/status.jsx:1007 +#: src/components/status.jsx:1018 msgid "Some media have no descriptions." msgstr "" #. placeholder {0}: rtf.format(-statusMonthsAgo, 'month') -#: src/components/status.jsx:1014 +#: src/components/status.jsx:1025 msgid "Old post (<0>{0})" msgstr "" -#: src/components/status.jsx:1038 -#: src/components/status.jsx:1078 -#: src/components/status.jsx:2530 -#: src/components/status.jsx:2553 +#: src/components/status.jsx:1049 +#: src/components/status.jsx:1089 +#: src/components/status.jsx:2541 +#: src/components/status.jsx:2564 msgid "Unboost" msgstr "" -#: src/components/status.jsx:1054 -#: src/components/status.jsx:2545 +#: src/components/status.jsx:1065 +#: src/components/status.jsx:2556 msgid "Quote" msgstr "" #. placeholder {0}: username || acct -#: src/components/status.jsx:1066 -#: src/components/status.jsx:1532 +#: src/components/status.jsx:1077 +#: src/components/status.jsx:1543 msgid "Unboosted @{0}'s post" msgstr "Unboosted @{0}'s post" #. placeholder {0}: username || acct -#: src/components/status.jsx:1067 -#: src/components/status.jsx:1533 +#: src/components/status.jsx:1078 +#: src/components/status.jsx:1544 msgid "Boosted @{0}'s post" msgstr "Boosted @{0}'s post" -#: src/components/status.jsx:1079 +#: src/components/status.jsx:1090 msgid "Boost…" msgstr "" -#: src/components/status.jsx:1091 -#: src/components/status.jsx:1826 -#: src/components/status.jsx:2566 +#: src/components/status.jsx:1102 +#: src/components/status.jsx:1837 +#: src/components/status.jsx:2577 msgid "Unlike" msgstr "" -#: src/components/status.jsx:1092 -#: src/components/status.jsx:1826 -#: src/components/status.jsx:1827 -#: src/components/status.jsx:2566 -#: src/components/status.jsx:2567 +#: src/components/status.jsx:1103 +#: src/components/status.jsx:1837 +#: src/components/status.jsx:1838 +#: src/components/status.jsx:2577 +#: src/components/status.jsx:2578 msgid "Like" msgstr "" -#: src/components/status.jsx:1101 -#: src/components/status.jsx:2578 +#: src/components/status.jsx:1112 +#: src/components/status.jsx:2589 msgid "Unbookmark" msgstr "" -#: src/components/status.jsx:1184 +#: src/components/status.jsx:1195 msgid "Post text copied" msgstr "Post text copied" -#: src/components/status.jsx:1187 +#: src/components/status.jsx:1198 msgid "Unable to copy post text" msgstr "Unable to copy post text" -#: src/components/status.jsx:1193 +#: src/components/status.jsx:1204 msgid "Copy post text" msgstr "Copy post text" #. placeholder {0}: username || acct -#: src/components/status.jsx:1211 +#: src/components/status.jsx:1222 msgid "View post by <0>@{0}" msgstr "" -#: src/components/status.jsx:1232 +#: src/components/status.jsx:1243 msgid "Show Edit History" msgstr "" -#: src/components/status.jsx:1235 +#: src/components/status.jsx:1246 msgid "Edited: {editedDateText}" msgstr "" -#: src/components/status.jsx:1302 -#: src/components/status.jsx:3346 +#: src/components/status.jsx:1313 +#: src/components/status.jsx:3357 msgid "Embed post" msgstr "" -#: src/components/status.jsx:1316 +#: src/components/status.jsx:1327 msgid "Conversation unmuted" msgstr "" -#: src/components/status.jsx:1316 +#: src/components/status.jsx:1327 msgid "Conversation muted" msgstr "" -#: src/components/status.jsx:1322 +#: src/components/status.jsx:1333 msgid "Unable to unmute conversation" msgstr "" -#: src/components/status.jsx:1323 +#: src/components/status.jsx:1334 msgid "Unable to mute conversation" msgstr "" -#: src/components/status.jsx:1332 +#: src/components/status.jsx:1343 msgid "Unmute conversation" msgstr "" -#: src/components/status.jsx:1339 +#: src/components/status.jsx:1350 msgid "Mute conversation" msgstr "" -#: src/components/status.jsx:1355 +#: src/components/status.jsx:1366 msgid "Post unpinned from profile" msgstr "" -#: src/components/status.jsx:1356 +#: src/components/status.jsx:1367 msgid "Post pinned to profile" msgstr "" -#: src/components/status.jsx:1361 +#: src/components/status.jsx:1372 msgid "Unable to unpin post" msgstr "" -#: src/components/status.jsx:1361 +#: src/components/status.jsx:1372 msgid "Unable to pin post" msgstr "" -#: src/components/status.jsx:1370 +#: src/components/status.jsx:1381 msgid "Unpin from profile" msgstr "" -#: src/components/status.jsx:1377 +#: src/components/status.jsx:1388 msgid "Pin to profile" msgstr "" -#: src/components/status.jsx:1406 +#: src/components/status.jsx:1417 msgid "Delete this post?" msgstr "" -#: src/components/status.jsx:1422 +#: src/components/status.jsx:1433 msgid "Post deleted" msgstr "" -#: src/components/status.jsx:1425 +#: src/components/status.jsx:1436 msgid "Unable to delete post" msgstr "" -#: src/components/status.jsx:1453 +#: src/components/status.jsx:1464 msgid "Report post…" msgstr "" -#: src/components/status.jsx:1827 -#: src/components/status.jsx:1863 -#: src/components/status.jsx:2567 +#: src/components/status.jsx:1838 +#: src/components/status.jsx:1874 +#: src/components/status.jsx:2578 msgid "Liked" msgstr "" -#: src/components/status.jsx:1860 -#: src/components/status.jsx:2554 +#: src/components/status.jsx:1871 +#: src/components/status.jsx:2565 msgid "Boosted" msgstr "" -#: src/components/status.jsx:1870 -#: src/components/status.jsx:2579 +#: src/components/status.jsx:1881 +#: src/components/status.jsx:2590 msgid "Bookmarked" msgstr "" -#: src/components/status.jsx:1874 +#: src/components/status.jsx:1885 msgid "Pinned" msgstr "" -#: src/components/status.jsx:1920 -#: src/components/status.jsx:2391 +#: src/components/status.jsx:1931 +#: src/components/status.jsx:2402 msgid "Deleted" msgstr "" -#: src/components/status.jsx:1961 +#: src/components/status.jsx:1972 msgid "{repliesCount, plural, one {# reply} other {# replies}}" msgstr "" #. placeholder {0}: snapStates.statusThreadNumber[sKey] ? ` ${snapStates.statusThreadNumber[sKey]}/X` : '' -#: src/components/status.jsx:2051 +#: src/components/status.jsx:2062 msgid "Thread{0}" msgstr "" -#: src/components/status.jsx:2129 -#: src/components/status.jsx:2191 -#: src/components/status.jsx:2287 +#: src/components/status.jsx:2140 +#: src/components/status.jsx:2202 +#: src/components/status.jsx:2298 msgid "Show less" msgstr "" -#: src/components/status.jsx:2129 -#: src/components/status.jsx:2191 +#: src/components/status.jsx:2140 +#: src/components/status.jsx:2202 msgid "Show content" msgstr "" #. placeholder {0}: filterInfo.titlesStr #. placeholder {0}: filterInfo?.titlesStr -#: src/components/status.jsx:2283 +#: src/components/status.jsx:2294 #: src/pages/catchup.jsx:1879 msgid "Filtered: {0}" msgstr "Filtered: {0}" -#: src/components/status.jsx:2287 +#: src/components/status.jsx:2298 msgid "Show media" msgstr "" -#: src/components/status.jsx:2427 +#: src/components/status.jsx:2438 msgid "Edited" msgstr "" -#: src/components/status.jsx:2504 +#: src/components/status.jsx:2515 msgid "Comments" msgstr "" #. More from [Author] -#: src/components/status.jsx:2804 +#: src/components/status.jsx:2815 msgid "More from <0/>" msgstr "More from <0/>" -#: src/components/status.jsx:3106 +#: src/components/status.jsx:3117 msgid "Edit History" msgstr "" -#: src/components/status.jsx:3110 +#: src/components/status.jsx:3121 msgid "Failed to load history" msgstr "" -#: src/components/status.jsx:3115 +#: src/components/status.jsx:3126 #: src/pages/annual-report.jsx:45 msgid "Loading…" msgstr "" -#: src/components/status.jsx:3351 +#: src/components/status.jsx:3362 msgid "HTML Code" msgstr "" -#: src/components/status.jsx:3368 +#: src/components/status.jsx:3379 msgid "HTML code copied" msgstr "" -#: src/components/status.jsx:3371 +#: src/components/status.jsx:3382 msgid "Unable to copy HTML code" msgstr "" -#: src/components/status.jsx:3383 +#: src/components/status.jsx:3394 msgid "Media attachments:" msgstr "" -#: src/components/status.jsx:3405 +#: src/components/status.jsx:3416 msgid "Account Emojis:" msgstr "" -#: src/components/status.jsx:3436 -#: src/components/status.jsx:3481 +#: src/components/status.jsx:3447 +#: src/components/status.jsx:3492 msgid "static URL" msgstr "" -#: src/components/status.jsx:3450 +#: src/components/status.jsx:3461 msgid "Emojis:" msgstr "" -#: src/components/status.jsx:3495 +#: src/components/status.jsx:3506 msgid "Notes:" msgstr "" -#: src/components/status.jsx:3499 +#: src/components/status.jsx:3510 msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." msgstr "" -#: src/components/status.jsx:3505 +#: src/components/status.jsx:3516 msgid "Polls are not interactive, becomes a list with vote counts." msgstr "" -#: src/components/status.jsx:3510 +#: src/components/status.jsx:3521 msgid "Media attachments can be images, videos, audios or any file types." msgstr "" -#: src/components/status.jsx:3516 +#: src/components/status.jsx:3527 msgid "Post could be edited or deleted later." msgstr "" -#: src/components/status.jsx:3522 +#: src/components/status.jsx:3533 msgid "Preview" msgstr "" -#: src/components/status.jsx:3531 +#: src/components/status.jsx:3542 msgid "Note: This preview is lightly styled." msgstr "" #. [Name] [Visibility icon] boosted -#: src/components/status.jsx:3784 +#: src/components/status.jsx:3795 msgid "<0/> <1/> boosted" msgstr "" -#: src/components/status.jsx:3897 +#: src/components/status.jsx:3908 msgid "Post removed by author." msgstr "Post removed by author." -#: src/components/status.jsx:3906 +#: src/components/status.jsx:3917 msgid "You’re not authorized to view this post." msgstr "You’re not authorized to view this post." -#: src/components/status.jsx:3915 +#: src/components/status.jsx:3926 msgid "Post pending author approval." msgstr "Post pending author approval." -#: src/components/status.jsx:3924 +#: src/components/status.jsx:3935 msgid "Quoting not allowed by the author." msgstr "Quoting not allowed by the author." diff --git a/src/pages/sandbox.jsx b/src/pages/sandbox.jsx index dcede502..d70f27d3 100644 --- a/src/pages/sandbox.jsx +++ b/src/pages/sandbox.jsx @@ -45,6 +45,7 @@ const MOCK_STATUS = ({ toggles = {} } = {}) => { showCard, size, filters, + quoteFilters, userPreferences, } = toggles; @@ -312,6 +313,7 @@ const INITIAL_STATE = { quoteNestingLevel: '0', size: 'medium', filters: [false, false, false], // hide, blur, warn + quoteFilters: [false, false, false], // hide, blur, warn for quotes mediaPreference: 'default', expandWarnings: false, contextType: 'none', // Default context type @@ -398,6 +400,7 @@ export default function Sandbox() { quoteNestingLevel: toggleState.quoteNestingLevel, size: toggleState.size, filters: toggleState.filters, + quoteFilters: toggleState.quoteFilters, }, }); @@ -531,7 +534,7 @@ export default function Sandbox() { delete states.statuses[quoteId]; // Create the actual status object that will be retrieved by QuoteStatuses - states.statuses[quoteId] = { + const quoteStatus = { id: quoteId, content: `

This is quote post ${i + 1}${i % 2 === 0 ? '' : ' with some extra text'}

`, account: { @@ -586,6 +589,32 @@ export default function Sandbox() { : null, }; + // Add filtering to quote posts if enabled + if ( + toggleState.quoteFilters && + toggleState.quoteFilters.some((f) => f) + ) { + quoteStatus.filtered = toggleState.quoteFilters + .map((enabled, filterIndex) => { + if (!enabled) return null; + const filterTypes = ['hide', 'blur', 'warn']; + return { + filter: { + id: `quote-filter-${i}-${filterIndex}`, + title: `Quote ${filterTypes[filterIndex]} filter`, + context: ['home', 'public', 'thread', 'account'], + filterAction: filterTypes[filterIndex], + }, + keywordMatches: [], + statusMatches: [], + }; + }) + .filter(Boolean); + } + + // Assign the quote status to the states + states.statuses[quoteId] = quoteStatus; + // If nesting level > 0, add nested quotes to each quote post if (nestingLevel > 0 && i % 2 === 0) { // Add nested quotes to every other quote - use stable ID @@ -670,6 +699,7 @@ export default function Sandbox() { toggleState.showQuotes, toggleState.quotesCount, toggleState.quoteNestingLevel, + toggleState.quoteFilters, ]); // Handler for filter checkboxes @@ -679,6 +709,13 @@ export default function Sandbox() { updateToggles({ filters: newFilters }); }; + // Handler for quote filter checkboxes + const handleQuoteFilterChange = (index) => { + const newQuoteFilters = [...toggleState.quoteFilters]; + newQuoteFilters[index] = !newQuoteFilters[index]; + updateToggles({ quoteFilters: newQuoteFilters }); + }; + // Function to check if the current state is different from the initial state const hasChanges = () => { return Object.keys(INITIAL_STATE).some((key) => { @@ -1214,6 +1251,41 @@ export default function Sandbox() { /> +
  • + Quote Filters + +
  • )}