owncast/web/utils/server-status-context.tsx

197 lines
4.6 KiB
TypeScript
Raw Normal View History

2021-01-17 11:40:46 +03:00
// 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, FC, ReactElement } from 'react';
import { STATUS, fetchData, FETCH_INTERVAL, SERVER_CONFIG } from './apis';
import { ConfigDetails, UpdateArgs } from '../types/config-section';
import { DEFAULT_VARIANT_STATE } from './config-constants';
const initialServerConfigState: ConfigDetails = {
streamKeys: [],
streamKeyOverridden: false,
adminPassword: '',
instanceDetails: {
customStyles: '',
customJavascript: '',
extraPageContent: '',
logo: '',
name: '',
nsfw: false,
2021-01-19 21:34:06 +03:00
socialHandles: [],
streamTitle: '',
summary: '',
tags: [],
title: '',
welcomeMessage: '',
offlineMessage: '',
appearanceVariables: {},
},
ffmpegPath: '',
rtmpServerPort: '',
webServerPort: '',
socketHostOverride: null,
videoServingEndpoint: '',
s3: {
accessKey: '',
acl: '',
bucket: '',
enabled: false,
endpoint: '',
region: '',
secret: '',
pathPrefix: '',
forcePathStyle: false,
},
yp: {
enabled: false,
instanceUrl: '',
},
videoSettings: {
latencyLevel: 4,
2021-01-31 09:53:00 +03:00
cpuUsageLevel: 3,
2021-01-10 13:37:22 +03:00
videoQualityVariants: [DEFAULT_VARIANT_STATE],
},
Admin social features (#408) * 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
2022-01-13 00:52:37 +03:00
federation: {
enabled: false,
isPrivate: false,
username: '',
goLiveMessage: '',
showEngagement: true,
blockedDomains: [],
},
Mange outbound notification settings (#458) * 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 * Notifications configuration UI * Remove twilio add email notifications * WIP email support * Add support for managing twitter notifications * Mark fields as passwords * Continued WIP * Post merge cleanup * Cleanup * Remove email config. Handle disabled notifications state * Remove email related components * Remove email related settings properties
2022-03-23 18:57:09 +03:00
notifications: {
browser: { enabled: false, goLiveMessage: '' },
discord: { enabled: false, webhook: '', goLiveMessage: '' },
},
externalActions: [],
2021-03-23 06:34:52 +03:00
supportedCodecs: [],
videoCodec: '',
2021-07-20 08:02:02 +03:00
forbiddenUsernames: [],
suggestedUsernames: [],
2021-07-20 08:02:02 +03:00
chatDisabled: false,
chatSpamProtectionEnabled: true,
chatSlurFilterEnabled: false,
chatJoinMessagesEnabled: true,
chatEstablishedUserMode: false,
hideViewerCount: false,
disableSearchIndexing: false,
};
const initialServerStatusState = {
broadcastActive: false,
broadcaster: null,
currentBroadcast: null,
online: false,
viewerCount: 0,
sessionMaxViewerCount: 0,
sessionPeakViewerCount: 0,
overallPeakViewerCount: 0,
versionNumber: '0.0.0',
streamTitle: '',
2021-07-20 08:02:02 +03:00
chatDisabled: false,
2022-03-25 09:04:20 +03:00
health: {
healthy: true,
healthPercentage: 100,
message: '',
representation: 0,
2022-03-25 09:04:20 +03:00
},
error: {
type: null,
msg: null,
},
};
export const ServerStatusContext = React.createContext({
...initialServerStatusState,
serverConfig: initialServerConfigState,
2020-12-27 05:04:23 +03:00
// eslint-disable-next-line @typescript-eslint/no-unused-vars
setFieldInConfigState: (_args: UpdateArgs) => null,
});
export type ServerStatusProviderProps = {
children: ReactElement;
};
const ServerStatusProvider: FC<ServerStatusProviderProps> = ({ children }) => {
const [status, setStatus] = useState(initialServerStatusState);
const [config, setConfig] = useState(initialServerConfigState);
const getStatus = async () => {
try {
const result = await fetchData(STATUS);
if (result instanceof Error) {
throw result;
}
setStatus({ ...result, error: { type: null, msg: null } });
} catch (error) {
setStatus(initialStatus => ({
...initialStatus,
error: {
type: 'OWNCAST_SERVICE_UNREACHABLE',
msg: 'Cannot connect to the Owncast service. Please check you are connected to the internet and the Owncast server is running.',
},
}));
// todo
}
};
const getConfig = async () => {
try {
const result = await fetchData(SERVER_CONFIG);
if (result instanceof Error) {
throw result;
}
setConfig(result);
} catch (error) {
console.error(error);
}
};
2021-01-03 12:54:04 +03:00
const setFieldInConfigState = ({ fieldName, value, path }: UpdateArgs) => {
const updatedConfig = path
? {
...config,
[path]: {
...config[path],
[fieldName]: value,
},
}
: {
...config,
[fieldName]: value,
};
2020-12-27 05:04:23 +03:00
setConfig(updatedConfig);
};
2020-12-27 05:04:23 +03:00
useEffect(() => {
let getStatusIntervalId = null;
getStatus();
getStatusIntervalId = setInterval(getStatus, FETCH_INTERVAL);
getConfig();
// returned function will be called on component unmount
return () => {
clearInterval(getStatusIntervalId);
};
}, []);
// eslint-disable-next-line react/jsx-no-constructed-context-values
const providerValue = {
...status,
serverConfig: config,
2020-12-27 05:04:23 +03:00
setFieldInConfigState,
};
return (
<ServerStatusContext.Provider value={providerValue}>{children}</ServerStatusContext.Provider>
);
};
export default ServerStatusProvider;