-
Notifications
You must be signed in to change notification settings - Fork 701
/
Copy pathHighlighter.tsx
125 lines (114 loc) · 4 KB
/
Highlighter.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import SettingsView from 'components-react/highlighter/SettingsView';
import { useVuex } from 'components-react/hooks';
import React, { useEffect, useState } from 'react';
import { EHighlighterView, IViewState } from 'services/highlighter/models/highlighter.models';
import { Services } from 'components-react/service-provider';
import StreamView from 'components-react/highlighter/StreamView';
import ClipsView from 'components-react/highlighter/ClipsView';
import UpdateModal from 'components-react/highlighter/UpdateModal';
import { EAvailableFeatures } from 'services/incremental-rollout';
export default function Highlighter(props: { params?: { view: string } }) {
const { HighlighterService, IncrementalRolloutService, UsageStatisticsService } = Services;
const aiHighlighterFeatureEnabled = IncrementalRolloutService.views.featureIsEnabled(
EAvailableFeatures.aiHighlighter,
);
const v = useVuex(() => ({
useAiHighlighter: HighlighterService.views.useAiHighlighter,
isUpdaterRunning: HighlighterService.views.isUpdaterRunning,
highlighterVersion: HighlighterService.views.highlighterVersion,
progress: HighlighterService.views.updaterProgress,
clipsAmount: HighlighterService.views.clips.length,
streamAmount: HighlighterService.views.highlightedStreams.length,
}));
let initialViewState: IViewState;
if (props.params?.view) {
const view =
props.params?.view === 'settings' ? EHighlighterView.SETTINGS : EHighlighterView.STREAM;
initialViewState = { view };
} else if (v.streamAmount > 0 && v.clipsAmount > 0 && aiHighlighterFeatureEnabled) {
initialViewState = { view: EHighlighterView.STREAM };
} else if (v.clipsAmount > 0) {
initialViewState = { view: EHighlighterView.CLIPS, id: undefined };
} else {
initialViewState = { view: EHighlighterView.SETTINGS };
}
useEffect(() => {
// check if ai highlighter is activated and we need to update it
async function shouldUpdate() {
if (!HighlighterService.aiHighlighterUpdater) return false;
const versionAvailable = await HighlighterService.aiHighlighterUpdater.isNewVersionAvailable();
return versionAvailable && aiHighlighterFeatureEnabled && v.useAiHighlighter;
}
shouldUpdate().then(shouldUpdate => {
if (shouldUpdate) HighlighterService.actions.startUpdater();
});
}, []);
const [viewState, setViewState] = useState<IViewState>(initialViewState);
useEffect(() => {
UsageStatisticsService.recordShown('HighlighterTab', viewState.view);
}, [viewState]);
const updaterModal = (
<UpdateModal
version={v.highlighterVersion}
progress={v.progress}
isVisible={v.isUpdaterRunning}
/>
);
switch (viewState.view) {
case EHighlighterView.STREAM:
return (
<>
{aiHighlighterFeatureEnabled && updaterModal}
<StreamView
emitSetView={data => {
setViewFromEmit(data);
}}
/>
</>
);
case EHighlighterView.CLIPS:
return (
<>
{aiHighlighterFeatureEnabled && updaterModal}
<ClipsView
emitSetView={data => {
setViewFromEmit(data);
}}
props={{
id: viewState.id,
streamTitle: HighlighterService.views.highlightedStreams.find(
s => s.id === viewState.id,
)?.title,
}}
/>
</>
);
default:
return (
<>
{aiHighlighterFeatureEnabled && updaterModal}
<SettingsView
close={() => {
HighlighterService.actions.dismissTutorial();
}}
emitSetView={data => setViewFromEmit(data)}
/>
</>
);
}
function setViewFromEmit(data: IViewState) {
if (data.view === EHighlighterView.CLIPS) {
setView({
view: data.view,
id: data.id,
});
} else {
setView({
view: data.view,
});
}
}
function setView(view: IViewState) {
setViewState(view);
}
}