pl-api: update interaction policies API

Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
nicole mikołajczyk
2026-03-11 04:59:13 +01:00
parent f0d610e448
commit 465f0552b8
5 changed files with 37 additions and 21 deletions

View File

@ -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]);
};

View File

@ -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));
},
);

View File

@ -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<IInteractionPolicyConfig> = ({
>
<InlineMultiselect<Scope>
items={items}
value={interactionPolicy[policy].always as Array<Scope>}
onChange={handleChange(policy, 'always')}
value={interactionPolicy[policy].automatic_approval as Array<Scope>}
onChange={handleChange(policy, 'automatic_approval')}
disabled={disabled}
/>
</ListItem>
@ -225,8 +225,8 @@ const InteractionPolicyConfig: React.FC<IInteractionPolicyConfig> = ({
>
<InlineMultiselect
items={items}
value={interactionPolicy[policy].with_approval as Array<Scope>}
onChange={handleChange(policy, 'with_approval')}
value={interactionPolicy[policy].manual_approval as Array<Scope>}
onChange={handleChange(policy, 'manual_approval')}
disabled={disabled}
/>
</ListItem>
@ -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 } })));
}

View File

@ -17,10 +17,21 @@ const interactionPolicyEntrySchema = v.picklist([
*/
type InteractionPolicyEntry = v.InferOutput<typeof interactionPolicyEntrySchema>;
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

View File

@ -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
>