diff --git a/packages/pl-api/lib/entities/account.ts b/packages/pl-api/lib/entities/account.ts
index 9022910cd..8393d939a 100644
--- a/packages/pl-api/lib/entities/account.ts
+++ b/packages/pl-api/lib/entities/account.ts
@@ -54,8 +54,8 @@ const preprocessAccount = v.transform((account: any) => {
...(account.role?.permissions ? {
is_admin: (account.role?.permissions & 0x1) === 0x1,
} : {}),
+ ap_id: account.pleroma?.ap_id ?? account.actor_id,
...(pick(account.pleroma || {}, [
- 'ap_id',
'background_image',
'relationship',
'is_moderator',
@@ -158,6 +158,9 @@ const baseAccountSchema = v.object({
pronouns: v.fallback(v.array(v.string()), []),
+ mention_policy: v.fallback(v.picklist(['none', 'only_known', 'only_followers']), 'none'),
+ subscribers_count: v.fallback(v.number(), 0),
+
is_cat: v.fallback(v.boolean(), false),
speak_as_cat: v.fallback(v.boolean(), false),
diff --git a/packages/pl-api/lib/features.ts b/packages/pl-api/lib/features.ts
index 5b040701e..3e7f231c0 100644
--- a/packages/pl-api/lib/features.ts
+++ b/packages/pl-api/lib/features.ts
@@ -250,6 +250,13 @@ const getFeatures = (instance: Instance) => {
v.software === WORDPRESS,
]),
+ /**
+ * @see PATCH /api/v1/accounts/update_credentials
+ */
+ accountMentionPolicy: any([
+ v.software === MITRA,
+ ]),
+
/**
* Move followers to a different ActivityPub account.
* @see POST /api/pleroma/move_account
diff --git a/packages/pl-api/lib/params/settings.ts b/packages/pl-api/lib/params/settings.ts
index 238ae51c8..cdc6d5fad 100644
--- a/packages/pl-api/lib/params/settings.ts
+++ b/packages/pl-api/lib/params/settings.ts
@@ -133,6 +133,12 @@ interface UpdateCredentialsParams {
is_cat?: boolean;
/** Whether the user speaks as a cat */
speak_as_cat?: boolean;
+
+ /**
+ * Mention policy
+ * Required features{@link Features['accountMentionPolicy']}.
+ */
+ mention_policy?: 'none' | 'only_known' | 'only_contacts';
}
/**
diff --git a/packages/pl-api/package.json b/packages/pl-api/package.json
index 9dce0040c..78c3a282f 100644
--- a/packages/pl-api/package.json
+++ b/packages/pl-api/package.json
@@ -1,6 +1,6 @@
{
"name": "pl-api",
- "version": "1.0.0-rc.41",
+ "version": "1.0.0-rc.42",
"type": "module",
"homepage": "https://github.com/mkljczk/pl-fe/tree/develop/packages/pl-api",
"repository": {
diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json
index f40bde379..98be2bf29 100644
--- a/packages/pl-fe/package.json
+++ b/packages/pl-fe/package.json
@@ -104,7 +104,7 @@
"multiselect-react-dropdown": "^2.0.25",
"mutative": "^1.1.0",
"path-browserify": "^1.0.1",
- "pl-api": "^1.0.0-rc.40",
+ "pl-api": "^1.0.0-rc.42",
"postcss": "^8.4.49",
"process": "^0.11.10",
"punycode": "^2.1.1",
diff --git a/packages/pl-fe/src/features/edit-profile/index.tsx b/packages/pl-fe/src/features/edit-profile/index.tsx
index 038fa00cb..6c4573400 100644
--- a/packages/pl-fe/src/features/edit-profile/index.tsx
+++ b/packages/pl-fe/src/features/edit-profile/index.tsx
@@ -26,6 +26,8 @@ import { useOwnAccount } from 'pl-fe/hooks/use-own-account';
import toast from 'pl-fe/toast';
import { isDefaultAvatar, isDefaultHeader } from 'pl-fe/utils/accounts';
+import { SelectDropdown } from '../forms';
+
import AvatarPicker from './components/avatar-picker';
import HeaderPicker from './components/header-picker';
@@ -55,6 +57,9 @@ const messages = defineMessages({
displayNamePlaceholder: { id: 'edit_profile.fields.display_name_placeholder', defaultMessage: 'Name' },
locationPlaceholder: { id: 'edit_profile.fields.location_placeholder', defaultMessage: 'Location' },
cancel: { id: 'common.cancel', defaultMessage: 'Cancel' },
+ mentionPolicyNone: { id: 'edit_profile.fields.mention_policy.none', defaultMessage: 'Everybody' },
+ mentionPolicyOnlyKnown: { id: 'edit_profile.fields.mention_policy.only_known', defaultMessage: 'Everybody except new accounts' },
+ mentionPolicyOnlyContacts: { id: 'edit_profile.fields.mention_policy.only_contacts', defaultMessage: 'People I follow and my followers' },
});
/**
@@ -127,6 +132,8 @@ interface AccountCredentials {
is_cat?: boolean;
/** Whether the user speaks as a cat. */
speak_as_cat?: boolean;
+ /** Mention policy */
+ mention_policy?: string;
}
/** Convert an account into an update_credentials request object. */
@@ -134,7 +141,7 @@ const accountToCredentials = (account: Account): AccountCredentials => {
const hideNetwork = hidesNetwork(account);
return {
- ...(pick(account, ['discoverable', 'bot', 'display_name', 'locked', 'location', 'avatar_description', 'header_description', 'enable_rss', 'hide_collections', 'is_cat', 'speak_as_cat'])),
+ ...(pick(account, ['discoverable', 'bot', 'display_name', 'locked', 'location', 'avatar_description', 'header_description', 'enable_rss', 'hide_collections', 'is_cat', 'speak_as_cat', 'mention_policy'])),
note: account.__meta.source?.note ?? '',
fields_attributes: [...account.__meta.source?.fields ?? []],
stranger_notifications: account.__meta.pleroma?.notification_settings?.block_from_strangers === true,
@@ -455,6 +462,25 @@ const EditProfile: React.FC = () => {
>
)}
+
+ {features.accountMentionPolicy && (
+ }
+ hint={}
+ >
+ ) => handleFieldChange('mention_policy')(event.target.value)}
+ />
+
+ )}
{features.profileFields && (
diff --git a/packages/pl-fe/src/locales/en.json b/packages/pl-fe/src/locales/en.json
index 2d78e31c5..1a1d2dcff 100644
--- a/packages/pl-fe/src/locales/en.json
+++ b/packages/pl-fe/src/locales/en.json
@@ -655,6 +655,9 @@
"edit_profile.fields.location_label": "Location",
"edit_profile.fields.location_placeholder": "Location",
"edit_profile.fields.locked_label": "Lock account",
+ "edit_profile.fields.mention_policy.none": "Everybody",
+ "edit_profile.fields.mention_policy.only_contacts": "People I follow and my followers",
+ "edit_profile.fields.mention_policy.only_known": "Everybody except new accounts",
"edit_profile.fields.meta_fields.content_placeholder": "Content",
"edit_profile.fields.meta_fields.label_placeholder": "Label",
"edit_profile.fields.meta_fields.label_placeholder.first": "Label (e.g. pronouns)",
@@ -1274,6 +1277,7 @@
"preferences.fields.known_languages_label": "Languages you know",
"preferences.fields.language_label": "Display language",
"preferences.fields.media_display_label": "Sensitive content",
+ "preferences.fields.mention_policy_label": "Accept mentions from",
"preferences.fields.missing_description_modal_label": "Show confirmation dialog before sending a post without media descriptions",
"preferences.fields.preserve_spoilers_label": "Preserve content warning when replying",
"preferences.fields.privacy_label": "Default post privacy",
@@ -1286,6 +1290,7 @@
"preferences.fields.unfollow_modal_label": "Show confirmation dialog before unfollowing someone",
"preferences.fields.wrench_label": "Display wrench reaction button",
"preferences.hints.demetricator": "Decrease social media anxiety by hiding all numbers from the site.",
+ "preferences.hints.mention_policy": "Applies to direct messages and public posts",
"preferences.notifications.advanced": "Show all notification categories",
"preferences.options.brand_color": "Base color",
"preferences.options.content_type_html": "HTML",
diff --git a/packages/pl-fe/yarn.lock b/packages/pl-fe/yarn.lock
index 9574494a6..d9190a6ad 100644
--- a/packages/pl-fe/yarn.lock
+++ b/packages/pl-fe/yarn.lock
@@ -6833,10 +6833,10 @@ pkg-dir@^4.1.0:
dependencies:
find-up "^4.0.0"
-pl-api@^1.0.0-rc.40:
- version "1.0.0-rc.40"
- resolved "https://registry.yarnpkg.com/pl-api/-/pl-api-1.0.0-rc.40.tgz#ae2596a15d28a8662d1a5de083b9596a8b6c00b3"
- integrity sha512-4X7va+KXOcXAOD02W+4e6NHgD+pbxhIoeHxT9rcWdHDjxmWiCapBoxxxa88ASPZKZFoiXZAktsFRSEs9yM3Z6A==
+pl-api@^1.0.0-rc.42:
+ version "1.0.0-rc.42"
+ resolved "https://registry.yarnpkg.com/pl-api/-/pl-api-1.0.0-rc.42.tgz#1353c17e703dc11a6aafefd2886f4dba690e0001"
+ integrity sha512-C5vy/lNJc26VoiGJh9qRoDESM4IYd04OMnrdxUP2TxXL1liCwykDV+VdDH4aN/sKPzNNo07ZerIVGaZd/Mx42g==
dependencies:
blurhash "^2.0.5"
http-link-header "^1.1.3"