1 | import { last } from 'lodash-es';
|
2 | import * as React from 'react';
|
3 | import { EMPTY, from, Subject, Subscription } from 'rxjs';
|
4 | import { switchMap } from 'rxjs/operators';
|
5 | import { isErrorLike } from '../errors';
|
6 | import { extractErrors } from '../settings';
|
7 | import { Toggle } from '../ui/generic/Toggle';
|
8 | import { confirmAddExtension, isExtensionAdded, isExtensionEnabled } from './extension';
|
9 |
|
10 |
|
11 |
|
12 | export 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 |
|
26 | return EMPTY;
|
27 | }
|
28 |
|
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 |
|
\ | No newline at end of file |