Skip to content

Commit 6bea385

Browse files
committed
Add moderation mode to relay settings with improved text contrast
This commit includes: - Implementation of moderation mode feature in relay settings - Addition of strict and passive mode options - Improved text color contrast for better readability on dark backgrounds - Integration with existing relay settings UI
1 parent db1776f commit 6bea385

File tree

9 files changed

+147
-8
lines changed

9 files changed

+147
-8
lines changed

.env.development

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
REACT_APP_BASE_URL=http://localhost:9002
22
REACT_APP_WALLET_BASE_URL=http://localhost:9003
33
REACT_APP_ASSETS_BUCKET=http://localhost
4-
REACT_APP_DEMO_MODE=true
4+
REACT_APP_DEMO_MODE=false
55

66
# More info https://create-react-app.dev/docs/advanced-configuration
77
ESLINT_NO_DEV_ERRORS=true

src/components/relay-settings/layouts/DesktopLayout.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { AppBucketsSection } from '@app/components/relay-settings/sections/AppBu
1313
import { SubscriptionSection } from '@app/components/relay-settings/sections/SubscriptionSection';
1414
import { KindsSection } from '@app/components/relay-settings/sections/KindsSection';
1515
import { MediaSection } from '@app/components/relay-settings/sections/MediaSection';
16+
import { ModerationSection } from '@app/components/relay-settings/sections/ModerationSection';
1617
import { useTranslation } from 'react-i18next';
1718
import { SubscriptionTier } from '@app/constants/relaySettings';
1819

@@ -68,6 +69,9 @@ interface DesktopLayoutProps {
6869
onChange: (values: string[]) => void;
6970
onToggle: (checked: boolean) => void;
7071
};
72+
// Moderation section props
73+
moderationMode: string;
74+
onModerationModeChange: (mode: string) => void;
7175
}
7276

7377
export const DesktopLayout: React.FC<DesktopLayoutProps> = ({
@@ -93,7 +97,6 @@ export const DesktopLayout: React.FC<DesktopLayoutProps> = ({
9397
freeTierEnabled,
9498
freeTierLimit,
9599
onFreeTierChange,
96-
97100
// Kinds props
98101
isKindsActive,
99102
selectedKinds,
@@ -108,6 +111,9 @@ export const DesktopLayout: React.FC<DesktopLayoutProps> = ({
108111
photos,
109112
videos,
110113
audio,
114+
// Moderation props
115+
moderationMode,
116+
onModerationModeChange,
111117
}) => {
112118
const { t } = useTranslation();
113119

@@ -143,6 +149,11 @@ export const DesktopLayout: React.FC<DesktopLayoutProps> = ({
143149
freeTierLimit={freeTierLimit}
144150
onFreeTierChange={onFreeTierChange}
145151
/>
152+
153+
<ModerationSection
154+
moderationMode={moderationMode}
155+
onModerationModeChange={onModerationModeChange}
156+
/>
146157
</BaseCol>
147158
</BaseRow>
148159

@@ -215,4 +226,4 @@ export const DesktopLayout: React.FC<DesktopLayoutProps> = ({
215226
);
216227
};
217228

218-
export default DesktopLayout;
229+
export default DesktopLayout;

src/components/relay-settings/layouts/MobileLayout.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { AppBucketsSection } from '@app/components/relay-settings/sections/AppBu
1010
import { SubscriptionSection } from '@app/components/relay-settings/sections/SubscriptionSection';
1111
import { KindsSection } from '@app/components/relay-settings/sections/KindsSection';
1212
import { MediaSection } from '@app/components/relay-settings/sections/MediaSection';
13+
import { ModerationSection } from '@app/components/relay-settings/sections/ModerationSection';
1314
import { useTranslation } from 'react-i18next';
1415
import { SubscriptionTier } from '@app/constants/relaySettings';
1516

@@ -65,6 +66,9 @@ interface MobileLayoutProps {
6566
onChange: (values: string[]) => void;
6667
onToggle: (checked: boolean) => void;
6768
};
69+
// Moderation section props
70+
moderationMode: string;
71+
onModerationModeChange: (mode: string) => void;
6872
}
6973

7074
export const MobileLayout: React.FC<MobileLayoutProps> = ({
@@ -104,6 +108,9 @@ export const MobileLayout: React.FC<MobileLayoutProps> = ({
104108
photos,
105109
videos,
106110
audio,
111+
// Moderation props
112+
moderationMode,
113+
onModerationModeChange,
107114
}) => {
108115
const { t } = useTranslation();
109116

@@ -138,6 +145,11 @@ export const MobileLayout: React.FC<MobileLayoutProps> = ({
138145
onFreeTierChange={onFreeTierChange}
139146
/>
140147

148+
<ModerationSection
149+
moderationMode={moderationMode}
150+
onModerationModeChange={onModerationModeChange}
151+
/>
152+
141153
<S.SwitchContainer
142154
style={{
143155
display: 'grid',
@@ -190,4 +202,4 @@ export const MobileLayout: React.FC<MobileLayoutProps> = ({
190202
);
191203
};
192204

193-
export default MobileLayout;
205+
export default MobileLayout;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// src/components/relay-settings/sections/ModerationSection/ModerationSection.tsx
2+
3+
import React from 'react';
4+
import { BaseCol } from '@app/components/common/BaseCol/BaseCol';
5+
import * as S from '@app/pages/uiComponentsPages/UIComponentsPage.styles';
6+
import { CollapsibleSection } from '../../shared/CollapsibleSection/CollapsibleSection';
7+
import { ModerationModeSelect } from './components/ModerationModeSelect';
8+
9+
export interface ModerationSectionProps {
10+
moderationMode: string;
11+
onModerationModeChange: (mode: string) => void;
12+
}
13+
14+
export const ModerationSection: React.FC<ModerationSectionProps> = ({
15+
moderationMode,
16+
onModerationModeChange,
17+
}) => {
18+
return (
19+
<CollapsibleSection header="Moderation Settings">
20+
<S.Card>
21+
<BaseCol span={24}>
22+
<ModerationModeSelect
23+
moderationMode={moderationMode}
24+
onChange={onModerationModeChange}
25+
/>
26+
27+
<div style={{ marginTop: '1rem' }}>
28+
<p style={{ fontSize: '0.9rem', color: '#c5d3e0' }}>
29+
Moderation mode determines how events with media are handled while pending moderation.
30+
<br />
31+
<br />
32+
<strong>Strict Mode:</strong> Events with media are not queryable while pending moderation, except by their authors.
33+
<br />
34+
<strong>Passive Mode:</strong> Events with media are queryable by everyone while pending moderation.
35+
</p>
36+
</div>
37+
</BaseCol>
38+
</S.Card>
39+
</CollapsibleSection>
40+
);
41+
};
42+
43+
export default ModerationSection;
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import React from 'react';
2+
import { Radio, Space, Typography } from 'antd';
3+
import * as S from '@app/pages/uiComponentsPages/UIComponentsPage.styles';
4+
import { useTranslation } from 'react-i18next';
5+
6+
const { Text } = Typography;
7+
8+
interface ModerationModeSelectProps {
9+
moderationMode: string;
10+
onChange: (mode: string) => void;
11+
}
12+
13+
export const ModerationModeSelect: React.FC<ModerationModeSelectProps> = ({
14+
moderationMode,
15+
onChange,
16+
}) => {
17+
const { t } = useTranslation();
18+
19+
return (
20+
<div style={{ display: 'flex', flexDirection: 'column' }}>
21+
<S.LabelSpan style={{ marginBottom: '1rem' }}>
22+
{t('Moderation Mode')}
23+
</S.LabelSpan>
24+
25+
<Radio.Group
26+
value={moderationMode}
27+
onChange={(e) => onChange(e.target.value)}
28+
style={{ marginBottom: '1rem' }}
29+
>
30+
<Space direction="vertical">
31+
<Radio value="strict">
32+
<Text strong>Strict Mode</Text>
33+
<div>
34+
<Text style={{ color: '#c5d3e0' }}>
35+
Events with media are not queryable while pending moderation, except by their authors.
36+
</Text>
37+
</div>
38+
</Radio>
39+
40+
<Radio value="passive">
41+
<Text strong>Passive Mode</Text>
42+
<div>
43+
<Text style={{ color: '#c5d3e0' }}>
44+
Events with media are queryable by everyone while pending moderation.
45+
</Text>
46+
</div>
47+
</Radio>
48+
</Space>
49+
</Radio.Group>
50+
</div>
51+
);
52+
};
53+
54+
export default ModerationModeSelect;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// src/components/relay-settings/sections/ModerationSection/index.ts
2+
3+
export * from './ModerationSection';
4+
export { default } from './ModerationSection';

src/constants/relaySettings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export type Settings = {
1818
subscription_tiers: SubscriptionTier[];
1919
freeTierEnabled: boolean; // New field
2020
freeTierLimit: string; // New field - e.g. "100 MB per month
21+
moderationMode: string; // "strict" or "passive"
2122
}
2223

2324
export type SubscriptionTier = {

src/hooks/useRelaySettings.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ interface BackendRelaySettings {
2020
subscription_tiers: BackendSubscriptionTier[];
2121
freeTierEnabled: boolean; // New field
2222
freeTierLimit: string; // New field - e.g. "100 MB per month"
23+
moderationMode: string; // "strict" or "passive"
2324
MimeTypeGroups: {
2425
images: string[];
2526
videos: string[];
@@ -56,7 +57,8 @@ const getInitialSettings = (): Settings => ({
5657
isFileStorageActive: false,
5758
subscription_tiers: defaultTiers,
5859
freeTierEnabled: false,
59-
freeTierLimit: '100 MB per month'
60+
freeTierLimit: '100 MB per month',
61+
moderationMode: 'strict' // Default to strict mode
6062
});
6163

6264
const useRelaySettings = () => {
@@ -139,6 +141,7 @@ const useRelaySettings = () => {
139141
})),
140142
freeTierEnabled: settings.freeTierEnabled,
141143
freeTierLimit: settings.freeTierLimit,
144+
moderationMode: settings.moderationMode,
142145
MimeTypeGroups: mimeGroups,
143146
isFileStorageActive: settings.isFileStorageActive,
144147
MimeTypeWhitelist: settings.mode === 'smart'
@@ -161,6 +164,7 @@ const useRelaySettings = () => {
161164
settings.protocol = backendSettings.protocol as string[];
162165
settings.freeTierEnabled = backendSettings.freeTierEnabled ?? false;
163166
settings.freeTierLimit = backendSettings.freeTierLimit ?? '100 MB per month';
167+
settings.moderationMode = backendSettings.moderationMode ?? 'strict';
164168

165169
// Handle subscription tiers
166170
if (Array.isArray(backendSettings.subscription_tiers)) {

src/pages/RelaySettingsPage.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ const RelaySettingsPage: React.FC = () => {
4242
isAudioActive: true,
4343
isFileStorageActive: false,
4444
subscription_tiers: [],
45-
freeTierEnabled: false, // Add this
46-
freeTierLimit: '100 MB per month' // Add this
45+
freeTierEnabled: false,
46+
freeTierLimit: '100 MB per month',
47+
moderationMode: 'strict' // Default to strict mode
4748
});
4849

4950
// Initialize stored dynamic items
@@ -138,6 +139,7 @@ const RelaySettingsPage: React.FC = () => {
138139
updateSettings('freeTierEnabled', settings.freeTierEnabled),
139140
updateSettings('freeTierLimit', settings.freeTierLimit),
140141
updateSettings('subscription_tiers', settings.subscription_tiers),
142+
updateSettings('moderationMode', settings.moderationMode),
141143
]);
142144

143145
await saveSettings();
@@ -232,6 +234,12 @@ const RelaySettingsPage: React.FC = () => {
232234
updateSettings(type, checked);
233235
};
234236

237+
// Moderation mode handler
238+
const handleModerationModeChange = (mode: string) => {
239+
setSettings(prev => ({ ...prev, moderationMode: mode }));
240+
updateSettings('moderationMode', mode);
241+
};
242+
235243
const layoutProps = {
236244
mode: settings.mode,
237245
onModeChange: handleModeChange,
@@ -269,7 +277,6 @@ const RelaySettingsPage: React.FC = () => {
269277
updateSettings('freeTierEnabled', enabled);
270278
updateSettings('freeTierLimit', limit);
271279
},
272-
273280
// Kinds props
274281
isKindsActive: settings.isKindsActive,
275282
selectedKinds: settings.kinds,
@@ -299,6 +306,9 @@ const RelaySettingsPage: React.FC = () => {
299306
onChange: (values: string[]) => handleMediaChange('audio', values),
300307
onToggle: (checked: boolean) => handleMediaToggle('isAudioActive', checked),
301308
},
309+
// Moderation props
310+
moderationMode: settings.moderationMode,
311+
onModerationModeChange: handleModerationModeChange,
302312
};
303313

304314
return (

0 commit comments

Comments
 (0)