084a01fb02
* ActivityPub admin pages for configuration * Fix dev build * Add support for requiring follow approval. Closes https://github.com/owncast/owncast/issues/1208 * Point at admin version of followers endpoint * Add setting for toggling displaying fediverse engagement in admin. https://github.com/owncast/owncast/issues/1404 * Add instance URL textfield to federation config and disable federation if it is empty * If instance URL is not https disable federation * Tweak federation toggle text. Make go live message optional * Add federation info modal. Closes https://github.com/owncast/owncast/issues/1544 * Add support for blocked federated domains. For https://github.com/owncast/owncast/issues/1209 * Simplify fediverse post input * Add placeholder Fediverse icon * Tweak federation logo in admin menu. Closes https://github.com/owncast/owncast/issues/1603 * Add global button for composing a fediverse post. Closes https://github.com/owncast/owncast/issues/1610 * Federation -> Social * Add page for listing federated actions. Closes https://github.com/owncast/owncast/issues/1573 * Auto-close social post modal after success * Make user modal action buttons look nicer * Center and reduce width and center count column. Closes https://github.com/owncast/owncast/issues/1580 * Update the followers table to be clearer * Fix exception thrown when passing undefined * Disable federation settings if feature is disabled * Update enable social modal. For https://github.com/owncast/owncast/issues/1594 * Fix type props * Quiet, linter * Move compose button to the left * Add tooltip for compose button * Add NSFW toggle to federation config. Closes https://github.com/owncast/owncast/issues/1628 * Add support for blocking/removing followers. For https://github.com/owncast/owncast/issues/1630 * Allow editing the server url field even when federation is disabled * Continue to update the copy around the social features * Use relative path to action images. Fixes https://github.com/owncast/owncast/issues/1646 * Link IRIs and make action verbse present tense * Update caniuse
153 lines
3.4 KiB
TypeScript
153 lines
3.4 KiB
TypeScript
// TODO: add a notication after updating info that changes will take place either on a new stream or server restart. may be different for each field.
|
|
|
|
import React, { useState, useEffect } from 'react';
|
|
import PropTypes from 'prop-types';
|
|
|
|
import { STATUS, fetchData, FETCH_INTERVAL, SERVER_CONFIG } from './apis';
|
|
import { ConfigDetails, UpdateArgs } from '../types/config-section';
|
|
import { DEFAULT_VARIANT_STATE } from './config-constants';
|
|
|
|
export const initialServerConfigState: ConfigDetails = {
|
|
streamKey: '',
|
|
instanceDetails: {
|
|
customStyles: '',
|
|
extraPageContent: '',
|
|
logo: '',
|
|
name: '',
|
|
nsfw: false,
|
|
socialHandles: [],
|
|
streamTitle: '',
|
|
summary: '',
|
|
tags: [],
|
|
title: '',
|
|
welcomeMessage: '',
|
|
},
|
|
ffmpegPath: '',
|
|
rtmpServerPort: '',
|
|
webServerPort: '',
|
|
s3: {
|
|
accessKey: '',
|
|
acl: '',
|
|
bucket: '',
|
|
enabled: false,
|
|
endpoint: '',
|
|
region: '',
|
|
secret: '',
|
|
servingEndpoint: '',
|
|
forcePathStyle: false,
|
|
},
|
|
yp: {
|
|
enabled: false,
|
|
instanceUrl: '',
|
|
},
|
|
videoSettings: {
|
|
latencyLevel: 4,
|
|
cpuUsageLevel: 3,
|
|
videoQualityVariants: [DEFAULT_VARIANT_STATE],
|
|
},
|
|
federation: {
|
|
enabled: false,
|
|
isPrivate: false,
|
|
username: '',
|
|
goLiveMessage: '',
|
|
showEngagement: true,
|
|
blockedDomains: [],
|
|
},
|
|
externalActions: [],
|
|
supportedCodecs: [],
|
|
videoCodec: '',
|
|
forbiddenUsernames: [],
|
|
suggestedUsernames: [],
|
|
chatDisabled: false,
|
|
};
|
|
|
|
const initialServerStatusState = {
|
|
broadcastActive: false,
|
|
broadcaster: null,
|
|
currentBroadcast: null,
|
|
online: false,
|
|
viewerCount: 0,
|
|
sessionMaxViewerCount: 0,
|
|
sessionPeakViewerCount: 0,
|
|
overallPeakViewerCount: 0,
|
|
versionNumber: '0.0.0',
|
|
streamTitle: '',
|
|
chatDisabled: false,
|
|
};
|
|
|
|
export const ServerStatusContext = React.createContext({
|
|
...initialServerStatusState,
|
|
serverConfig: initialServerConfigState,
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
setFieldInConfigState: (args: UpdateArgs) => null,
|
|
});
|
|
|
|
const ServerStatusProvider = ({ children }) => {
|
|
const [status, setStatus] = useState(initialServerStatusState);
|
|
const [config, setConfig] = useState(initialServerConfigState);
|
|
|
|
const getStatus = async () => {
|
|
try {
|
|
const result = await fetchData(STATUS);
|
|
setStatus({ ...result });
|
|
} catch (error) {
|
|
// todo
|
|
}
|
|
};
|
|
const getConfig = async () => {
|
|
try {
|
|
const result = await fetchData(SERVER_CONFIG);
|
|
setConfig(result);
|
|
} catch (error) {
|
|
// todo
|
|
}
|
|
};
|
|
|
|
const setFieldInConfigState = ({ fieldName, value, path }: UpdateArgs) => {
|
|
const updatedConfig = path
|
|
? {
|
|
...config,
|
|
[path]: {
|
|
...config[path],
|
|
[fieldName]: value,
|
|
},
|
|
}
|
|
: {
|
|
...config,
|
|
[fieldName]: value,
|
|
};
|
|
setConfig(updatedConfig);
|
|
};
|
|
|
|
useEffect(() => {
|
|
let getStatusIntervalId = null;
|
|
|
|
getStatus();
|
|
getStatusIntervalId = setInterval(getStatus, FETCH_INTERVAL);
|
|
|
|
getConfig();
|
|
|
|
// returned function will be called on component unmount
|
|
return () => {
|
|
clearInterval(getStatusIntervalId);
|
|
};
|
|
}, []);
|
|
|
|
const providerValue = {
|
|
...status,
|
|
serverConfig: config,
|
|
|
|
setFieldInConfigState,
|
|
};
|
|
return (
|
|
<ServerStatusContext.Provider value={providerValue}>{children}</ServerStatusContext.Provider>
|
|
);
|
|
};
|
|
|
|
ServerStatusProvider.propTypes = {
|
|
children: PropTypes.element.isRequired,
|
|
};
|
|
|
|
export default ServerStatusProvider;
|