Skip to content

Commit eaeab36

Browse files
yashwinclaude
andcommitted
A4A: Consume shared backup page shells
Replace the duplicated agency backup shells with the shared components extracted in the base branch, addressing the review feedback: * backups-list-page renders <BackupsPage> with agency-route navigation built via useBackupsNavigation * backups uses <BackupFileBrowserProvider> * backup-download renders <BackupDownloadPage> Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 1da68e4 commit eaeab36

3 files changed

Lines changed: 29 additions & 168 deletions

File tree

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
import { siteBySlugQuery } from '@automattic/api-queries';
22
import { useSuspenseQuery } from '@tanstack/react-query';
33
import { useRouter } from '@tanstack/react-router';
4-
import { __ } from '@wordpress/i18n';
54
import { useCallback } from 'react';
6-
import Breadcrumbs from '../../../app/breadcrumbs';
75
import { agencySiteBackupDownloadRoute } from '../../../app/router/agency';
8-
import { PageHeader } from '../../../components/page-header';
9-
import PageLayout from '../../../components/page-layout';
10-
import { BackupDownloadFlow } from '../../../sites/backup-download/flow';
6+
import { BackupDownloadPage } from '../../../sites/backup-download/download-page';
117

128
export default function AgencySiteBackupDownload() {
139
const { siteSlug, rewindId } = agencySiteBackupDownloadRoute.useParams();
1410
const { downloadId } = agencySiteBackupDownloadRoute.useSearch();
1511
const { data: site } = useSuspenseQuery( siteBySlugQuery( siteSlug ) );
1612
const router = useRouter();
1713

18-
const handleDownloadIdConsumed = useCallback( () => {
14+
const onConsumeDownloadId = useCallback( () => {
1915
router.navigate( {
2016
to: agencySiteBackupDownloadRoute.fullPath,
2117
params: { siteSlug, rewindId },
@@ -25,18 +21,11 @@ export default function AgencySiteBackupDownload() {
2521
}, [ router, siteSlug, rewindId ] );
2622

2723
return (
28-
<PageLayout
29-
size="small"
30-
header={
31-
<PageHeader prefix={ <Breadcrumbs length={ 2 } /> } title={ __( 'Download backup' ) } />
32-
}
33-
>
34-
<BackupDownloadFlow
35-
site={ site }
36-
rewindId={ rewindId }
37-
initialDownloadId={ downloadId }
38-
onDownloadIdConsumed={ handleDownloadIdConsumed }
39-
/>
40-
</PageLayout>
24+
<BackupDownloadPage
25+
site={ site }
26+
rewindId={ rewindId }
27+
downloadId={ downloadId }
28+
onConsumeDownloadId={ onConsumeDownloadId }
29+
/>
4130
);
4231
}
Lines changed: 18 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
1-
import { siteBySlugQuery, siteSettingsQuery } from '@automattic/api-queries';
2-
import { DateRangePicker } from '@automattic/date-range-picker';
1+
import { siteBySlugQuery } from '@automattic/api-queries';
32
import { useSuspenseQuery } from '@tanstack/react-query';
4-
import { useParams, useRouter } from '@tanstack/react-router';
5-
import { __ } from '@wordpress/i18n';
6-
import { useCallback } from 'react';
7-
import Breadcrumbs from '../../../app/breadcrumbs';
8-
import { useDateRange } from '../../../app/hooks/use-date-range';
9-
import { useLocale } from '../../../app/locale';
3+
import { useParams } from '@tanstack/react-router';
104
import {
115
agencySiteRoute,
126
agencySiteBackupsRoute,
@@ -15,145 +9,33 @@ import {
159
agencySiteBackupRestoreRoute,
1610
agencySiteBackupDownloadRoute,
1711
} from '../../../app/router/agency';
18-
import { PageHeader } from '../../../components/page-header';
19-
import PageLayout from '../../../components/page-layout';
20-
import { BackupNotices } from '../../../sites/backups/backup-notices';
21-
import { BackupNowButton } from '../../../sites/backups/backup-now-button';
22-
import { BackupsBrowser, useIsBackupsSmallViewport } from '../../../sites/backups/backups-browser';
23-
import { useBackupState } from '../../../sites/backups/use-backup-state';
24-
import type { ActivityLogEntry } from '@automattic/api-core';
12+
import { BackupsPage } from '../../../sites/backups/backups-page';
13+
import { useBackupsNavigation } from '../../../sites/backups/use-backups-navigation';
2514

2615
export default function AgencySiteBackupsListPage() {
2716
const { siteSlug } = agencySiteRoute.useParams();
28-
const router = useRouter();
29-
const locale = useLocale();
17+
const { data: site } = useSuspenseQuery( siteBySlugQuery( siteSlug ) );
18+
const searchParams = agencySiteBackupsRoute.useSearch();
3019

3120
const routeParams = useParams( { strict: false, shouldThrow: false } ) as
3221
| { rewindId?: string }
3322
| undefined;
3423
const rewindId = routeParams?.rewindId;
35-
const searchParams = agencySiteBackupsRoute.useSearch();
36-
37-
const { data: site } = useSuspenseQuery( siteBySlugQuery( siteSlug ) );
3824

39-
const { data: siteSettings } = useSuspenseQuery( {
40-
...siteSettingsQuery( site.ID ),
41-
select: ( s ) => ( {
42-
gmtOffset: Number( s?.gmt_offset ) || 0,
43-
timezoneString: s?.timezone_string || undefined,
44-
} ),
25+
const navigation = useBackupsNavigation( {
26+
siteSlug,
27+
indexRoute: agencySiteBackupsIndexRoute,
28+
detailRoute: agencySiteBackupDetailRoute,
29+
restoreRoute: agencySiteBackupRestoreRoute,
30+
downloadRoute: agencySiteBackupDownloadRoute,
4531
} );
46-
const { gmtOffset, timezoneString } = siteSettings;
47-
48-
const backupState = useBackupState( site.ID );
49-
50-
const { dateRange, handleDateRangeChange } = useDateRange( {
51-
timezoneString,
52-
gmtOffset,
53-
defaultDays: 30,
54-
} );
55-
56-
const navigateToBackup = useCallback(
57-
( selected: ActivityLogEntry | null ) => {
58-
router.navigate(
59-
selected
60-
? {
61-
to: agencySiteBackupDetailRoute.fullPath,
62-
params: { siteSlug, rewindId: selected.rewind_id },
63-
search: ( query: Record< string, string > ) => query,
64-
}
65-
: {
66-
to: agencySiteBackupsIndexRoute.fullPath,
67-
params: { siteSlug },
68-
search: ( query: Record< string, string > ) => query,
69-
}
70-
);
71-
},
72-
[ router, siteSlug ]
73-
);
74-
75-
const handleRequestRestore = ( selected: ActivityLogEntry ) => {
76-
router.navigate( {
77-
to: agencySiteBackupRestoreRoute.fullPath,
78-
params: { siteSlug, rewindId: selected.rewind_id },
79-
} );
80-
};
81-
82-
const handleRequestDownload = ( selected: ActivityLogEntry ) => {
83-
router.navigate( {
84-
to: agencySiteBackupDownloadRoute.fullPath,
85-
params: { siteSlug, rewindId: selected.rewind_id },
86-
} );
87-
};
88-
89-
const handleGranularDownloadReady = ( selected: ActivityLogEntry, downloadId: number ) => {
90-
router.navigate( {
91-
to: agencySiteBackupDownloadRoute.fullPath,
92-
params: { siteSlug, rewindId: selected.rewind_id },
93-
search: { downloadId },
94-
} );
95-
};
96-
97-
const handleDateRangeChangeWrapper = ( next: { start: Date; end: Date } ) => {
98-
handleDateRangeChange( next );
99-
navigateToBackup( null );
100-
};
101-
102-
const isMobileDetailsView = useIsBackupsSmallViewport() && !! rewindId;
103-
104-
const actions = (
105-
<>
106-
{ /* This div is required to fix a layout width issue when the DateRangePicker is placed together with the BackupNowButton. */ }
107-
<div>
108-
<DateRangePicker
109-
start={ dateRange.start }
110-
end={ dateRange.end }
111-
gmtOffset={ gmtOffset }
112-
timezoneString={ timezoneString }
113-
locale={ locale }
114-
defaultFallbackPreset="last-30-days"
115-
onChange={ handleDateRangeChangeWrapper }
116-
/>
117-
</div>
118-
<BackupNowButton site={ site } backupState={ backupState } />
119-
</>
120-
);
12132

12233
return (
123-
<PageLayout
124-
header={
125-
<PageHeader
126-
title={ isMobileDetailsView ? __( 'Backup details' ) : __( 'Backups' ) }
127-
description={ __(
128-
'Access and restore your site backups, powered by Jetpack VaultPress Backup.'
129-
) }
130-
prefix={ isMobileDetailsView ? <Breadcrumbs length={ 2 } /> : undefined }
131-
actions={ isMobileDetailsView ? undefined : actions }
132-
/>
133-
}
134-
notices={
135-
! isMobileDetailsView && backupState.status !== 'idle' ? (
136-
<BackupNotices
137-
backupState={ backupState }
138-
site={ site }
139-
timezoneString={ timezoneString }
140-
gmtOffset={ gmtOffset }
141-
/>
142-
) : undefined
143-
}
144-
>
145-
<BackupsBrowser
146-
site={ site }
147-
rewindId={ rewindId }
148-
dateRange={ dateRange }
149-
timezoneString={ timezoneString }
150-
gmtOffset={ gmtOffset }
151-
searchParams={ searchParams }
152-
onSelectBackup={ navigateToBackup }
153-
onRequestRestore={ handleRequestRestore }
154-
onRequestDownload={ handleRequestDownload }
155-
onGranularDownloadReady={ handleGranularDownloadReady }
156-
/>
157-
</PageLayout>
34+
<BackupsPage
35+
site={ site }
36+
navigation={ navigation }
37+
rewindId={ rewindId }
38+
searchParams={ searchParams }
39+
/>
15840
);
15941
}

client/dashboard/agency/sites/site/backups.tsx

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,18 @@ import { agencySiteQuery } from '@automattic/api-queries';
22
import { useSuspenseQuery } from '@tanstack/react-query';
33
import { Outlet } from '@tanstack/react-router';
44
import { __experimentalHStack as HStack } from '@wordpress/components';
5-
import { useDispatch } from '@wordpress/data';
65
import { __ } from '@wordpress/i18n';
76
import { Icon, backup as backupIcon } from '@wordpress/icons';
8-
import { store as noticesStore } from '@wordpress/notices';
9-
import { FileBrowserProvider } from '../../../../my-sites/backup/backup-contents-page/file-browser/file-browser-context';
10-
import { useLocale } from '../../../app/locale';
117
import { agencySiteRoute } from '../../../app/router/agency';
128
import { Card, CardBody } from '../../../components/card';
139
import { PageHeader } from '../../../components/page-header';
1410
import PageLayout from '../../../components/page-layout';
1511
import { Text } from '../../../components/text';
12+
import { BackupFileBrowserProvider } from '../../../sites/backups/backup-file-browser-provider';
1613

1714
export default function AgencySiteBackups() {
1815
const { siteSlug } = agencySiteRoute.useParams();
1916
const { data: site } = useSuspenseQuery( agencySiteQuery( siteSlug ) );
20-
const locale = useLocale();
21-
const { createErrorNotice, createSuccessNotice } = useDispatch( noticesStore );
2217

2318
if ( ! site?.has_backup ) {
2419
return (
@@ -35,14 +30,9 @@ export default function AgencySiteBackups() {
3530
);
3631
}
3732

38-
const notices = {
39-
showError: ( message: string ) => createErrorNotice( message, { type: 'snackbar' } ),
40-
showSuccess: ( message: string ) => createSuccessNotice( message, { type: 'snackbar' } ),
41-
};
42-
4333
return (
44-
<FileBrowserProvider locale={ locale } notices={ notices }>
34+
<BackupFileBrowserProvider>
4535
<Outlet />
46-
</FileBrowserProvider>
36+
</BackupFileBrowserProvider>
4737
);
4838
}

0 commit comments

Comments
 (0)