UNPKG

2.94 kBJavaScriptView Raw
1import { last } from 'lodash-es';
2import * as React from 'react';
3import { EMPTY, from, Subject, Subscription } from 'rxjs';
4import { switchMap } from 'rxjs/operators';
5import { isErrorLike } from '../errors';
6import { extractErrors } from '../settings';
7import { Toggle } from '../ui/generic/Toggle';
8import { confirmAddExtension, isExtensionAdded, isExtensionEnabled } from './extension';
9/**
10 * Displays a toggle button for an extension.
11 */
12export class ExtensionToggle extends React.PureComponent {
13 constructor() {
14 super(...arguments);
15 this.toggles = new Subject();
16 this.subscriptions = new Subscription();
17 }
18 componentDidMount() {
19 this.subscriptions.add(this.toggles
20 .pipe(switchMap(enabled => {
21 if (this.props.configurationCascade.subjects === null) {
22 return EMPTY;
23 }
24 if (isErrorLike(this.props.configurationCascade.subjects)) {
25 // TODO: Show error.
26 return EMPTY;
27 }
28 // Only operate on the highest precedence settings, for simplicity.
29 const subjects = this.props.configurationCascade.subjects;
30 if (subjects.length === 0) {
31 return EMPTY;
32 }
33 const highestPrecedenceSubject = subjects[subjects.length - 1];
34 if (!highestPrecedenceSubject || !highestPrecedenceSubject.subject.viewerCanAdminister) {
35 return EMPTY;
36 }
37 if (!isExtensionAdded(this.props.configurationCascade.merged, this.props.extension.id) &&
38 !confirmAddExtension(this.props.extension.id, this.props.extension.manifest)) {
39 return EMPTY;
40 }
41 return from(this.props.extensions.context.updateExtensionSettings(highestPrecedenceSubject.subject.id, {
42 extensionID: this.props.extension.id,
43 enabled,
44 }));
45 }))
46 .subscribe());
47 }
48 componentWillUnmount() {
49 this.subscriptions.unsubscribe();
50 }
51 render() {
52 const cascade = extractErrors(this.props.configurationCascade);
53 const subject = isErrorLike(cascade)
54 ? undefined
55 : last(cascade.subjects.filter(subject => isExtensionAdded(subject.settings, this.props.extension.id)));
56 const state = subject && {
57 state: subject.settings.extensions ? subject.settings.extensions[this.props.extension.id] : false,
58 name: subject.subject.__typename,
59 };
60 const onToggle = (enabled) => {
61 this.toggles.next(enabled);
62 };
63 return (React.createElement(Toggle, { value: isExtensionEnabled(this.props.configurationCascade.merged, this.props.extension.id), onToggle: onToggle, title: state ? `${state.state ? 'Enabled' : 'Disabled'} in ${state.name} settings` : 'Click to enable' }));
64 }
65}
66//# sourceMappingURL=ExtensionToggle.js.map
\No newline at end of file