summaryrefslogtreecommitdiff
path: root/web/source/settings/views/user/posts/interaction-policy-settings/something-else.tsx
blob: 8882060c4d2d68d0650571cc3c7dff6c76ec83c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
	GoToSocial
	Copyright (C) GoToSocial Authors admin@gotosocial.org
	SPDX-License-Identifier: AGPL-3.0-or-later

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU Affero General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU Affero General Public License for more details.

	You should have received a copy of the GNU Affero General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

import React, { useMemo } from "react";
import { InteractionPolicyValue, PolicyValueFollowers, PolicyValueFollowing, PolicyValuePublic } from "../../../../lib/types/interaction";
import { useTextInput } from "../../../../lib/form";
import { Action, Audience, PolicyFormSub, SomethingElseValue, Visibility } from "./types";

export interface PolicyFormSomethingElse {
	followers: PolicyFormSub,
	following: PolicyFormSub,
	mentioned: PolicyFormSub,
	everyoneElse: PolicyFormSub,
}

function useSomethingElseOptions(
	forVis: Visibility,
	forAction: Action,
	forAudience: Audience,
) {
	return (
		<>
			{ forAudience !== "everyone_else" &&
				<option value="always">Always</option>
			}
			<option value="with_approval">With my approval</option>
			<option value="no">No</option>
		</>
	);
}

export function useSomethingElseFor(
	forVis: Visibility,
	forAction: Action,
	currentAlways: InteractionPolicyValue[],
	currentWithApproval: InteractionPolicyValue[],
): PolicyFormSomethingElse {	
	const followersDefaultValue: SomethingElseValue = useMemo(() => {
		if (currentAlways.includes(PolicyValueFollowers)) {
			return "always";
		}

		if (currentWithApproval.includes(PolicyValueFollowers)) {
			return "with_approval";
		}
		
		return "no";
	}, [currentAlways, currentWithApproval]);
	
	const followingDefaultValue: SomethingElseValue = useMemo(() => {
		if (currentAlways.includes(PolicyValueFollowing)) {
			return "always";
		}

		if (currentWithApproval.includes(PolicyValueFollowing)) {
			return "with_approval";
		}
		
		return "no";
	}, [currentAlways, currentWithApproval]);
	
	const mentionedDefaultValue: SomethingElseValue = useMemo(() => {
		if (currentAlways.includes(PolicyValueFollowing)) {
			return "always";
		}

		if (currentWithApproval.includes(PolicyValueFollowing)) {
			return "with_approval";
		}
		
		return "no";
	}, [currentAlways, currentWithApproval]);
	
	const everyoneElseDefaultValue: SomethingElseValue = useMemo(() => {
		if (currentAlways.includes(PolicyValuePublic)) {
			return "always";
		}

		if (currentWithApproval.includes(PolicyValuePublic)) {
			return "with_approval";
		}
		
		return "no";
	}, [currentAlways, currentWithApproval]);

	return {
		followers: {
			field: useTextInput("followers", { defaultValue: followersDefaultValue }),
			label: "My followers",
			options: useSomethingElseOptions(forVis, forAction, "followers"),
		},
		following: {
			field: useTextInput("following", { defaultValue: followingDefaultValue }),
			label: "Accounts I follow",
			options: useSomethingElseOptions(forVis, forAction, "following"),
		},
		mentioned: {
			field: useTextInput("mentioned_accounts", { defaultValue: mentionedDefaultValue }),
			label: "Accounts mentioned in the post",
			options: useSomethingElseOptions(forVis, forAction, "mentioned_accounts"),
		},
		everyoneElse: {
			field: useTextInput("everyone_else", { defaultValue: everyoneElseDefaultValue }),
			label: "Everyone else",
			options: useSomethingElseOptions(forVis, forAction, "everyone_else"),
		},
	};
}