feat(admin): add explicit directory info agreement modal. Closes #3258

This commit is contained in:
Gabe Kangas 2023-08-16 17:07:39 -07:00
parent f3f93c8d08
commit 5ac0d5bbca
No known key found for this signature in database
GPG Key ID: 4345B2060657F330

View File

@ -1,5 +1,5 @@
import React, { useState, useContext, useEffect } from 'react';
import { Button, Typography } from 'antd';
import React, { useState, useContext, useEffect, FC } from 'react';
import { Button, Modal, Typography } from 'antd';
import { markdown, markdownLanguage } from '@codemirror/lang-markdown';
import CodeMirror from '@uiw/react-codemirror';
import { bbedit } from '@uiw/codemirror-theme-bbedit';
@ -31,6 +31,67 @@ import { createInputStatus, STATUS_SUCCESS } from '../../../../utils/input-statu
const { Title } = Typography;
export type DirectoryInfoModalProps = {
cancelPressed: () => void;
okPressed: () => void;
};
const DirectoryInfoModal: FC<DirectoryInfoModalProps> = ({ cancelPressed, okPressed }) => (
<Modal
width="70%"
title="Owncast Directory"
visible
onCancel={cancelPressed}
footer={
<div>
<Button onClick={cancelPressed}>Do not share my server.</Button>
<Button type="primary" onClick={okPressed}>
Understood. Share my server publicly.
</Button>
</div>
}
>
<Typography.Title level={3}>What is the Owncast Directory?</Typography.Title>
<Typography.Paragraph>
Owncast operates a public directory at{' '}
<a href="https://directory.owncast.online">directory.owncast.online</a> to share your video
streams with more people, while also using these as examples for others. Live streams and
servers listed on the directory may optionally be shared on other platforms and applications.
</Typography.Paragraph>
<Typography.Title level={3}>Disclaimers and Responsibility</Typography.Title>
<Typography.Paragraph>
<ul>
<li>
By enabling this feature you are granting explicit rights to Owncast to share your stream
to the public via the directory, as well as other sites, applications and any platform
where the Owncast project may be promoting Owncast-powered streams including social media.
</li>
<li>
There is no obligation to list any specific server or topic. Servers can and will be
removed at any time for any reason.
</li>
<li>
Any server that is streaming Not Safe For Work (NSFW) content and does not have the NSFW
toggle enabled on their server will be removed.
</li>
<li>
Any server streaming harmful, hurtful, misleading or hateful content in any way will not
be listed.
</li>
<li>
You may reach out to the Owncast team to report any objectionable content or content that
you believe should not be be publicly listed.
</li>
<li>
You have the right to free software and to build whatever you want with it. But there is
no obligation for others to share it.
</li>
</ul>
</Typography.Paragraph>
</Modal>
);
// eslint-disable-next-line react/function-component-definition
export default function EditInstanceDetails() {
const [formDataValues, setFormDataValues] = useState(null);
@ -41,6 +102,7 @@ export default function EditInstanceDetails() {
const { instanceUrl } = yp;
const [offlineMessageSaveStatus, setOfflineMessageSaveStatus] = useState(null);
const [isDirectoryInfoModalOpen, setIsDirectoryInfoModalOpen] = useState(false);
useEffect(() => {
setFormDataValues({
@ -55,6 +117,20 @@ export default function EditInstanceDetails() {
return null;
}
const handleDirectorySwitchChange = (value: boolean) => {
if (!value) {
// Disabled. No-op.
} else {
setIsDirectoryInfoModalOpen(true);
}
setFormDataValues({
...formDataValues,
yp: {
enabled: value,
},
});
};
// if instanceUrl is empty, we should also turn OFF the `enabled` field of directory.
const handleSubmitInstanceUrl = () => {
if (formDataValues.instanceUrl === '') {
@ -93,6 +169,23 @@ export default function EditInstanceDetails() {
handleFieldChange({ fieldName: 'disableSearchIndexing', value: enabled });
}
function directoryInfoModalCancelPressed() {
setIsDirectoryInfoModalOpen(false);
handleDirectorySwitchChange(false);
handleFieldChange({ fieldName: 'enabled', value: false });
}
function directoryInfoModalOkPressed() {
setIsDirectoryInfoModalOpen(false);
handleFieldChange({ fieldName: 'enabled', value: true });
setFormDataValues({
...formDataValues,
yp: {
enabled: true,
},
});
}
const hasInstanceUrl = instanceUrl !== '';
return (
@ -214,6 +307,7 @@ export default function EditInstanceDetails() {
{...FIELD_PROPS_YP}
checked={formDataValues.enabled}
disabled={!hasInstanceUrl}
onChange={handleDirectorySwitchChange}
/>
<ToggleSwitch
fieldName="nsfw"
@ -223,6 +317,12 @@ export default function EditInstanceDetails() {
disabled={!hasInstanceUrl}
/>
</div>
{isDirectoryInfoModalOpen && (
<DirectoryInfoModal
cancelPressed={directoryInfoModalCancelPressed}
okPressed={directoryInfoModalOkPressed}
/>
)}
</div>
);
}