Merge commit 'ba83509ff4ed3f7193f3ca5c5deb3038c39620b1' into glitch-soc/merge-upstream

This commit is contained in:
Claire committed 2026-05-04 21:08:25 +02:00
commit 6935fce458
161 files changed
+1899 -583

No files matched your search

@@ -62,6 +62,10 @@ const Blocks: React.FC<{ multiColumn: boolean }> = ({ multiColumn }) => {
columnRef.current?.scrollTop();
}, []);
const handleUnblock = useCallback((domain: string) => {
setDomains((prev) => prev.filter((d) => d !== domain));
}, []);
const emptyMessage = (
<FormattedMessage
id='empty_column.domain_blocks'
@@ -95,7 +99,7 @@ const Blocks: React.FC<{ multiColumn: boolean }> = ({ multiColumn }) => {
bindToDocument={!multiColumn}
>
{domains.map((domain) => (
<Domain key={domain} domain={domain} />
<Domain key={domain} domain={domain} onUnblock={handleUnblock} />
))}
</ScrollableList>
@@ -269,6 +269,10 @@ export async function searchCustomEmojisByShortcodes(shortcodes: string[]) {
export async function loadAllCustomEmoji() {
const db = await loadDB();
const cacheValue = await db.get('etags', 'custom');
if (!cacheValue) {
return null;
}
return db.getAll('custom');
}
@@ -28,10 +28,18 @@ export async function fetchCustomEmojiData() {
const { loadAllCustomEmoji } = await import('./database');
const emojisRaw = await loadAllCustomEmoji();
if (emojisRaw.length === 0) {
// If it returns null then custom emojis aren't even loaded yet.
if (emojisRaw === null) {
return [];
}
// If it's empty, then they are loaded but there aren't any.
if (emojisRaw.length === 0) {
customEmojis = [];
return customEmojis;
}
const categories = new Set(['custom']);
const emojis = [];
for (const emoji of emojisRaw) {
@@ -10,12 +10,14 @@ import { useDispatch } from 'react-redux';
import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
import BlockIcon from '@/material-icons/400-24px/block.svg?react';
import CampaignIcon from '@/material-icons/400-24px/campaign.svg?react';
import CollectionsIcon from '@/material-icons/400-24px/category.svg?react';
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react';
import { blockAccount } from 'mastodon/actions/accounts';
import { closeModal } from 'mastodon/actions/modal';
import { Button } from 'mastodon/components/button';
import { Icon } from 'mastodon/components/icon';
import { areCollectionsEnabled } from '../../collections/utils';
export const BlockModal = ({ accountId, acct }) => {
const dispatch = useDispatch();
@@ -46,31 +48,38 @@ export const BlockModal = ({ accountId, acct }) => {
<div>
<h1><FormattedMessage id='block_modal.title' defaultMessage='Block user?' /></h1>
<div>@{acct}</div>
<p>@{acct}</p>
</div>
</div>
<div className='safety-action-modal__bullet-points'>
<div>
<ul className='safety-action-modal__bullet-points'>
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={CampaignIcon} /></div>
<div><FormattedMessage id='block_modal.they_will_know' defaultMessage="They can see that they're blocked." /></div>
</div>
</li>
<div>
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={VisibilityOffIcon} /></div>
<div><FormattedMessage id='block_modal.they_cant_see_posts' defaultMessage="They can't see your posts and you won't see theirs." /></div>
</div>
<div><FormattedMessage id='block_modal.they_cant_see_posts' defaultMessage="They can't see your content and you won't see theirs." /></div>
</li>
<div>
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={AlternateEmailIcon} /></div>
<div><FormattedMessage id='block_modal.you_wont_see_mentions' defaultMessage="You won't see posts that mentions them." /></div>
</div>
<div><FormattedMessage id='block_modal.you_wont_see_mentions' defaultMessage="You won't see posts from others that mention them." /></div>
</li>
<div>
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={ReplyIcon} /></div>
<div><FormattedMessage id='block_modal.they_cant_mention' defaultMessage="They can't mention or follow you." /></div>
</div>
</div>
<div><FormattedMessage id='block_modal.they_cant_mention' defaultMessage="You can't mention, follow, or quote each other." /></div>
</li>
{areCollectionsEnabled() &&
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={CollectionsIcon} /></div>
<div><FormattedMessage id='block_modal.no_collections' defaultMessage="Neither of you can add each other to collections. You'll be automatically removed from each others' existing collections, if applicable." /></div>
</li>
}
</ul>
</div>
<div className={classNames('safety-action-modal__bottom', { active: expanded })}>
@@ -83,15 +83,15 @@ export const DomainBlockModal: React.FC<{
defaultMessage='Block domain?'
/>
</h1>
<div>{domain}</div>
<p>{domain}</p>
</div>
</div>
<div className='safety-action-modal__bullet-points'>
<ul className='safety-action-modal__bullet-points'>
{preview &&
preview !== 'error' &&
preview.followers_count + preview.following_count > 0 && (
<div>
<li>
<div className='safety-action-modal__bullet-points__icon'>
<Icon id='' icon={PersonRemoveIcon} />
</div>
@@ -113,11 +113,11 @@ export const DomainBlockModal: React.FC<{
/>
</strong>
</div>
</div>
</li>
)}
{preview === 'error' && (
<div>
<li>
<div className='safety-action-modal__bullet-points__icon'>
<Icon id='' icon={PersonRemoveIcon} />
</div>
@@ -129,10 +129,10 @@ export const DomainBlockModal: React.FC<{
/>
</strong>
</div>
</div>
</li>
)}
<div className='safety-action-modal__bullet-points--deemphasized'>
<li className='safety-action-modal__bullet-points--deemphasized'>
<div className='safety-action-modal__bullet-points__icon'>
<Icon id='' icon={CampaignIcon} />
</div>
@@ -142,9 +142,9 @@ export const DomainBlockModal: React.FC<{
defaultMessage="They won't know they've been blocked."
/>
</div>
</div>
</li>
<div className='safety-action-modal__bullet-points--deemphasized'>
<li className='safety-action-modal__bullet-points--deemphasized'>
<div className='safety-action-modal__bullet-points__icon'>
<Icon id='' icon={VisibilityOffIcon} />
</div>
@@ -154,9 +154,9 @@ export const DomainBlockModal: React.FC<{
defaultMessage="You won't see posts or notifications from users on this server."
/>
</div>
</div>
</li>
<div className='safety-action-modal__bullet-points--deemphasized'>
<li className='safety-action-modal__bullet-points--deemphasized'>
<div className='safety-action-modal__bullet-points__icon'>
<Icon id='' icon={ReplyIcon} />
</div>
@@ -166,9 +166,9 @@ export const DomainBlockModal: React.FC<{
defaultMessage='Nobody from this server can follow you.'
/>
</div>
</div>
</li>
<div className='safety-action-modal__bullet-points--deemphasized'>
<li className='safety-action-modal__bullet-points--deemphasized'>
<div className='safety-action-modal__bullet-points__icon'>
<Icon id='' icon={HistoryIcon} />
</div>
@@ -178,8 +178,8 @@ export const DomainBlockModal: React.FC<{
defaultMessage='People from this server can interact with your old posts.'
/>
</div>
</div>
</div>
</li>
</ul>
</div>
<div className='safety-action-modal__bottom'>
@@ -57,22 +57,22 @@ export const IgnoreNotificationsModal = ({ filterType }) => {
<h1>{title}</h1>
</div>
<div className='safety-action-modal__bullet-points'>
<div>
<ul className='safety-action-modal__bullet-points'>
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={InventoryIcon} /></div>
<div><FormattedMessage id='ignore_notifications_modal.filter_to_review_separately' defaultMessage='You can review filtered notifications separately' /></div>
</div>
</li>
<div>
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={PersonAlertIcon} /></div>
<div><FormattedMessage id='ignore_notifications_modal.filter_to_act_users' defaultMessage="You'll still be able to accept, reject, or report users" /></div>
</div>
</li>
<div>
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={ShieldQuestionIcon} /></div>
<div><FormattedMessage id='ignore_notifications_modal.filter_to_avoid_confusion' defaultMessage='Filtering helps avoid potential confusion' /></div>
</div>
</div>
</li>
</ul>
<div>
<FormattedMessage id='ignore_notifications_modal.disclaimer' defaultMessage="Mastodon cannot inform users that you've ignored their notifications. Ignoring notifications will not stop the messages themselves from being sent." />
@@ -85,31 +85,31 @@ export const MuteModal = ({ accountId, acct }) => {
<div>
<h1><FormattedMessage id='mute_modal.title' defaultMessage='Mute user?' /></h1>
<div>@{acct}</div>
<p>@{acct}</p>
</div>
</div>
<div className='safety-action-modal__bullet-points'>
<div>
<ul className='safety-action-modal__bullet-points'>
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={CampaignIcon} /></div>
<div><FormattedMessage id='mute_modal.they_wont_know' defaultMessage="They won't know they've been muted." /></div>
</div>
</li>
<div>
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={VisibilityOffIcon} /></div>
<div><FormattedMessage id='mute_modal.you_wont_see_posts' defaultMessage="They can still see your posts, but you won't see theirs." /></div>
</div>
</li>
<div>
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={AlternateEmailIcon} /></div>
<div><FormattedMessage id='mute_modal.you_wont_see_mentions' defaultMessage="You won't see posts that mention them." /></div>
</div>
</li>
<div>
<li>
<div className='safety-action-modal__bullet-points__icon'><Icon icon={ReplyIcon} /></div>
<div><FormattedMessage id='mute_modal.they_can_mention_and_follow' defaultMessage="They can mention and follow you, but you won't see them." /></div>
</div>
</div>
</li>
</ul>
</div>
<div className={classNames('safety-action-modal__bottom', { active: expanded })}>