-
Notifications
You must be signed in to change notification settings - Fork 701
/
Copy pathHighlighter.tsx
128 lines (117 loc) · 4.06 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
126
127
128
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.recordAnalyticsEvent('Highlighter', {
type: 'HighlighterTabViewed',
view: viewState,
});
}, [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);
}
}