@@ -3,14 +3,14 @@ import type { ReactNode } from 'react';
33
44import {
55 EuiButton ,
6+ EuiButtonGroup ,
67 EuiConfirmModal ,
78 EuiEmptyPrompt ,
89 EuiFlexGroup ,
910 EuiFlexItem ,
1011 EuiIcon ,
1112 EuiPanel ,
1213 EuiSelect ,
13- EuiSwitch ,
1414} from '@elastic/eui' ;
1515import { css } from '@emotion/react' ;
1616import axios from 'axios' ;
@@ -25,20 +25,35 @@ import { useWorkspaceContext } from '../../hooks';
2525export interface WebPageTrackerHistoryProps {
2626 tracker : WebPageTracker ;
2727 kind : 'content' | 'resources' ;
28- children : ( revision : WebPageDataRevision , showDiff : boolean ) => ReactNode ;
28+ children : ( revision : WebPageDataRevision , mode : WebPageTrackerHistoryMode ) => ReactNode ;
2929}
3030
31+ export type WebPageTrackerHistoryMode = 'default' | 'diff' | 'source' ;
32+
3133export function WebPageTrackerHistory ( { kind, tracker, children } : WebPageTrackerHistoryProps ) {
3234 const { uiState, addToast } = useWorkspaceContext ( ) ;
3335
34- const [ showDiff , setShowDiff ] = useState < boolean > ( true ) ;
3536 const [ revisions , setRevisions ] = useState < AsyncData < WebPageContentRevision [ ] , WebPageContentRevision [ ] | null > > ( {
3637 status : 'pending' ,
3738 state : null ,
3839 } ) ;
3940 const [ revisionIndex , setRevisionIndex ] = useState < number | null > ( null ) ;
41+
42+ const modes = [
43+ { id : 'default' as const , label : 'Default' , isDisabled : revisions . status !== 'succeeded' } ,
44+ { id : 'diff' as const , label : 'Diff' , isDisabled : revisionIndex === 0 || revisions . status !== 'succeeded' } ,
45+ ...( kind === 'content'
46+ ? [ { id : 'source' as const , label : 'Source' , isDisabled : revisions . status !== 'succeeded' } ]
47+ : [ ] ) ,
48+ ] ;
49+ const [ mode , setMode ] = useState < WebPageTrackerHistoryMode > ( 'default' ) ;
50+
4051 const fetchHistory = useCallback (
41- ( { refresh } : { refresh : boolean } = { refresh : false } ) => {
52+ (
53+ { refresh, forceMode } : { refresh : boolean ; forceMode ?: WebPageTrackerHistoryMode } = {
54+ refresh : false ,
55+ } ,
56+ ) => {
4257 setRevisions ( ( currentRevisions ) =>
4358 currentRevisions . status === 'succeeded'
4459 ? { status : 'pending' , state : currentRevisions . data }
@@ -47,7 +62,7 @@ export function WebPageTrackerHistory({ kind, tracker, children }: WebPageTracke
4762 axios
4863 . post < WebPageContentRevision [ ] > (
4964 getApiUrl ( `/api/utils/web_scraping/${ kind } /${ encodeURIComponent ( tracker . id ) } /history` ) ,
50- { refresh, calculateDiff : showDiff } ,
65+ { refresh, calculateDiff : ( forceMode ?? mode ) === 'diff' } ,
5166 getApiRequestConfig ( ) ,
5267 )
5368 . then (
@@ -58,6 +73,12 @@ export function WebPageTrackerHistory({ kind, tracker, children }: WebPageTracke
5873 if ( refresh || revisionIndex === null || revisionIndex >= response . data . length ) {
5974 setRevisionIndex ( response . data . length > 0 ? response . data . length - 1 : null ) ;
6075 }
76+
77+ if ( response . data . length < 2 ) {
78+ setMode ( 'default' ) ;
79+ } else if ( forceMode && forceMode !== mode ) {
80+ setMode ( forceMode ) ;
81+ }
6182 } ,
6283 ( err : Error ) => {
6384 setRevisions ( ( currentRevisions ) => ( {
@@ -69,7 +90,7 @@ export function WebPageTrackerHistory({ kind, tracker, children }: WebPageTracke
6990 } ,
7091 ) ;
7192 } ,
72- [ getApiUrl , revisionIndex , showDiff ] ,
93+ [ getApiUrl , revisionIndex , mode ] ,
7394 ) ;
7495
7596 useEffect ( ( ) => {
@@ -78,7 +99,7 @@ export function WebPageTrackerHistory({ kind, tracker, children }: WebPageTracke
7899 }
79100
80101 fetchHistory ( ) ;
81- } , [ uiState , tracker , showDiff ] ) ;
102+ } , [ uiState , tracker ] ) ;
82103
83104 const onRevisionChange = useCallback (
84105 ( revisionId : string ) => {
@@ -163,7 +184,7 @@ export function WebPageTrackerHistory({ kind, tracker, children }: WebPageTracke
163184 />
164185 ) ;
165186 } else if ( revisionIndex !== null ) {
166- history = children ( revisions . data [ revisionIndex ] , showDiff ) ;
187+ history = children ( revisions . data [ revisionIndex ] , mode ) ;
167188 } else {
168189 const updateButton = (
169190 < EuiButton
@@ -227,13 +248,23 @@ export function WebPageTrackerHistory({ kind, tracker, children }: WebPageTracke
227248 />
228249 </ EuiFlexItem >
229250 < EuiFlexItem grow = { false } >
230- < EuiSwitch
231- label = "Show diff"
232- disabled = {
233- revisions . status !== 'succeeded' || ( revisions . status === 'succeeded' && revisions . data . length < 2 )
251+ < EuiButtonGroup
252+ legend = "View mode"
253+ options = { modes }
254+ idSelected = { mode }
255+ isDisabled = {
256+ revisions . status !== 'succeeded' ||
257+ ( kind === 'resources' && revisions . status === 'succeeded' && revisions . data . length < 2 )
234258 }
235- checked = { showDiff }
236- onChange = { ( e ) => setShowDiff ( e . target . checked ) }
259+ onChange = { ( id ) => {
260+ const newMode = id as WebPageTrackerHistoryMode ;
261+ setMode ( newMode ) ;
262+
263+ const shouldFetch = ( mode === 'diff' && id !== 'diff' ) || ( mode !== 'diff' && id === 'diff' ) ;
264+ if ( shouldFetch ) {
265+ fetchHistory ( { forceMode : newMode , refresh : false } ) ;
266+ }
267+ } }
237268 />
238269 </ EuiFlexItem >
239270 < EuiFlexItem grow = { false } >
0 commit comments