import React, { useState, useContext, useEffect } from 'react'; import { Button, Typography } from 'antd'; import { markdown, markdownLanguage } from '@codemirror/lang-markdown'; import CodeMirror from '@uiw/react-codemirror'; import { bbedit } from '@uiw/codemirror-theme-bbedit'; import { languages } from '@codemirror/language-data'; import { TextFieldWithSubmit, TEXTFIELD_TYPE_TEXTAREA, TEXTFIELD_TYPE_URL, } from '../../TextFieldWithSubmit'; import { ServerStatusContext } from '../../../../utils/server-status-context'; import { postConfigUpdateToAPI, TEXTFIELD_PROPS_INSTANCE_URL, TEXTFIELD_PROPS_SERVER_NAME, TEXTFIELD_PROPS_SERVER_SUMMARY, TEXTFIELD_PROPS_SERVER_OFFLINE_MESSAGE, API_YP_SWITCH, FIELD_PROPS_YP, FIELD_PROPS_NSFW, FIELD_PROPS_HIDE_VIEWER_COUNT, API_SERVER_OFFLINE_MESSAGE, FIELD_PROPS_DISABLE_SEARCH_INDEXING, } from '../../../../utils/config-constants'; import { UpdateArgs } from '../../../../types/config-section'; import { ToggleSwitch } from '../../ToggleSwitch'; import { EditLogo } from '../../EditLogo'; import FormStatusIndicator from '../../FormStatusIndicator'; import { createInputStatus, STATUS_SUCCESS } from '../../../../utils/input-statuses'; const { Title } = Typography; // eslint-disable-next-line react/function-component-definition export default function EditInstanceDetails() { const [formDataValues, setFormDataValues] = useState(null); const serverStatusData = useContext(ServerStatusContext); const { serverConfig } = serverStatusData || {}; const { instanceDetails, yp, hideViewerCount, disableSearchIndexing } = serverConfig; const { instanceUrl } = yp; const [offlineMessageSaveStatus, setOfflineMessageSaveStatus] = useState(null); useEffect(() => { setFormDataValues({ ...instanceDetails, ...yp, hideViewerCount, disableSearchIndexing, }); }, [instanceDetails, yp]); if (!formDataValues) { return null; } // if instanceUrl is empty, we should also turn OFF the `enabled` field of directory. const handleSubmitInstanceUrl = () => { if (formDataValues.instanceUrl === '') { if (yp.enabled === true) { postConfigUpdateToAPI({ apiPath: API_YP_SWITCH, data: { value: false }, }); } } }; const handleSaveOfflineMessage = () => { postConfigUpdateToAPI({ apiPath: API_SERVER_OFFLINE_MESSAGE, data: { value: formDataValues.offlineMessage }, }); setOfflineMessageSaveStatus(createInputStatus(STATUS_SUCCESS)); setTimeout(() => { setOfflineMessageSaveStatus(null); }, 2000); }; const handleFieldChange = ({ fieldName, value }: UpdateArgs) => { setFormDataValues({ ...formDataValues, [fieldName]: value, }); }; function handleHideViewerCountChange(enabled: boolean) { handleFieldChange({ fieldName: 'hideViewerCount', value: enabled }); } function handleDisableSearchEngineIndexingChange(enabled: boolean) { handleFieldChange({ fieldName: 'disableSearchIndexing', value: enabled }); } const hasInstanceUrl = instanceUrl !== ''; return (
Configure Instance Details

Offline Message:

{ handleFieldChange({ fieldName: 'offlineMessage', value }); }} extensions={[markdown({ base: markdownLanguage, codeLanguages: languages })]} />
The offline message is displayed to your page visitors when you're not streaming. Markdown is supported.
{/* Logo section */}

Increase your audience by appearing in the{' '} Owncast Directory . This is an external service run by the Owncast project.{' '} Learn more .

{!yp.instanceUrl && (

You must set your Server URL above to enable the directory.

)}
); }