From 465f0552b8b3dbbaf18192b2e8ecb8a299f767c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Wed, 11 Mar 2026 04:59:13 +0100 Subject: [PATCH] pl-api: update interaction policies API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- .../nicolium/src/hooks/use-can-interact.ts | 9 +++++--- .../compose-interaction-policy-modal.tsx | 6 +++-- .../pages/settings/interaction-policies.tsx | 22 +++++++++---------- .../pl-api/lib/entities/interaction-policy.ts | 19 ++++++++++++---- packages/pl-api/lib/params/settings.ts | 2 +- 5 files changed, 37 insertions(+), 21 deletions(-) diff --git a/packages/nicolium/src/hooks/use-can-interact.ts b/packages/nicolium/src/hooks/use-can-interact.ts index ab6f6310c..c03d76851 100644 --- a/packages/nicolium/src/hooks/use-can-interact.ts +++ b/packages/nicolium/src/hooks/use-can-interact.ts @@ -29,13 +29,13 @@ const useCanInteract = ( } const interactionPolicy = status.interaction_policy; - if (me === status.account_id || interactionPolicy[type].always.includes('me')) + if (me === status.account_id || interactionPolicy[type].automatic_approval.includes('me')) return { canInteract: true, approvalRequired: false, }; - if (interactionPolicy[type].with_approval.includes('me')) + if (interactionPolicy[type].manual_approval.includes('me')) return { canInteract: true, approvalRequired: true, @@ -44,7 +44,10 @@ const useCanInteract = ( return { canInteract: false, approvalRequired: null, - allowed: [...interactionPolicy[type].always, ...interactionPolicy[type].with_approval], + allowed: [ + ...interactionPolicy[type].automatic_approval, + ...interactionPolicy[type].manual_approval, + ], }; }, [me, status.id, type]); }; diff --git a/packages/nicolium/src/modals/compose-interaction-policy-modal.tsx b/packages/nicolium/src/modals/compose-interaction-policy-modal.tsx index 55acdbbe2..560fbb05a 100644 --- a/packages/nicolium/src/modals/compose-interaction-policy-modal.tsx +++ b/packages/nicolium/src/modals/compose-interaction-policy-modal.tsx @@ -68,8 +68,10 @@ const ComposeInteractionPolicyModal: React.FC< draft.interactionPolicy ?? interactionPolicy, (draftPolicy: InteractionPolicy) => { draftPolicy[policy][rule] = value; - draftPolicy[policy][rule === 'always' ? 'with_approval' : 'always'] = draftPolicy[policy][ - rule === 'always' ? 'with_approval' : 'always' + draftPolicy[policy][ + rule === 'automatic_approval' ? 'manual_approval' : 'automatic_approval' + ] = draftPolicy[policy][ + rule === 'automatic_approval' ? 'manual_approval' : 'automatic_approval' ].filter((r) => !value.includes(r as Scope)); }, ); diff --git a/packages/nicolium/src/pages/settings/interaction-policies.tsx b/packages/nicolium/src/pages/settings/interaction-policies.tsx index fab840ed6..0ba9816f1 100644 --- a/packages/nicolium/src/pages/settings/interaction-policies.tsx +++ b/packages/nicolium/src/pages/settings/interaction-policies.tsx @@ -23,7 +23,7 @@ import type { CreateStatusParams, InteractionPolicy } from 'pl-api'; type Visibility = 'public' | 'unlisted' | 'private'; type Policy = 'can_favourite' | 'can_reblog' | 'can_reply'; -type Rule = 'always' | 'with_approval'; +type Rule = 'automatic_approval' | 'manual_approval'; type Scope = 'followers' | 'following' | 'mentioned' | 'public'; type QuoteApprovalPolicy = CreateStatusParams['quote_approval_policy']; @@ -210,8 +210,8 @@ const InteractionPolicyConfig: React.FC = ({ > items={items} - value={interactionPolicy[policy].always as Array} - onChange={handleChange(policy, 'always')} + value={interactionPolicy[policy].automatic_approval as Array} + onChange={handleChange(policy, 'automatic_approval')} disabled={disabled} /> @@ -225,8 +225,8 @@ const InteractionPolicyConfig: React.FC = ({ > } - onChange={handleChange(policy, 'with_approval')} + value={interactionPolicy[policy].manual_approval as Array} + onChange={handleChange(policy, 'manual_approval')} disabled={disabled} /> @@ -294,11 +294,11 @@ const InteractionPoliciesPage = () => { setInteractionPolicies((policies) => create(policies, (draft) => { draft[visibility][policy][rule] = value; - draft[visibility][policy][rule === 'always' ? 'with_approval' : 'always'] = draft[ - visibility - ][policy][rule === 'always' ? 'with_approval' : 'always'].filter( - (rule) => !value.includes(rule as any), - ); + draft[visibility][policy][ + rule === 'automatic_approval' ? 'manual_approval' : 'automatic_approval' + ] = draft[visibility][policy][ + rule === 'automatic_approval' ? 'manual_approval' : 'automatic_approval' + ].filter((rule) => !value.includes(rule as any)); }), ); }; @@ -321,7 +321,7 @@ const InteractionPoliciesPage = () => { ); } - if (features.quoteApprovalPolicies) { + if (features.quoteApprovalPolicies && !features.interactionRequests) { promises.push(dispatch(patchMe({ source: { quote_policy: quotePolicy } }))); } diff --git a/packages/pl-api/lib/entities/interaction-policy.ts b/packages/pl-api/lib/entities/interaction-policy.ts index 78f17de70..ed7d7b4c2 100644 --- a/packages/pl-api/lib/entities/interaction-policy.ts +++ b/packages/pl-api/lib/entities/interaction-policy.ts @@ -17,10 +17,21 @@ const interactionPolicyEntrySchema = v.picklist([ */ type InteractionPolicyEntry = v.InferOutput; -const interactionPolicyRuleSchema = coerceObject({ - always: v.fallback(v.array(interactionPolicyEntrySchema), ['public', 'me']), - with_approval: v.fallback(v.array(interactionPolicyEntrySchema), []), -}); +const interactionPolicyRuleSchema = v.optional( + v.pipe( + v.any(), + v.transform((rule) => { + if (rule.always) rule.automatic_approval = rule.always; + if (rule.with_approval) rule.manual_approval = rule.with_approval; + return rule; + }), + v.object({ + automatic_approval: v.fallback(v.array(interactionPolicyEntrySchema), ['public', 'me']), + manual_approval: v.fallback(v.array(interactionPolicyEntrySchema), []), + }), + ), + {}, +); /** * @category Schemas diff --git a/packages/pl-api/lib/params/settings.ts b/packages/pl-api/lib/params/settings.ts index 4dc994e2a..af4e6c052 100644 --- a/packages/pl-api/lib/params/settings.ts +++ b/packages/pl-api/lib/params/settings.ts @@ -204,7 +204,7 @@ type UpdateInteractionPoliciesParams = Record< Record< 'can_favourite' | 'can_reblog' | 'can_reply', Record< - 'always' | 'with_approval', + 'automatic_approval' | 'manual_approval', Array< 'public' | 'followers' | 'following' | 'mutuals' | 'mentioned' | 'author' | 'me' | string >