Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
7cf45db
add new slice for pull and push states
gcsecsey Nov 7, 2025
1c23381
Merge branch 'trunk' of github.com:Automattic/studio into stu-711-stu…
gcsecsey Dec 11, 2025
7d2d1b0
update useSyncPull and useSyncPush hooks
gcsecsey Dec 11, 2025
fe07c5e
add selectors from hook to slice
gcsecsey Dec 12, 2025
a989798
move clear/cancel operations to thunks
gcsecsey Dec 12, 2025
5640cbb
move pushsite to thunk
gcsecsey Dec 12, 2025
dbf3f4f
move pullsite to thunk
gcsecsey Dec 12, 2025
6b8f4c0
extract polling logic to separate hook
gcsecsey Dec 12, 2025
f55dc48
Remove SyncSitesProvider context, use hooks directly
gcsecsey Dec 22, 2025
a284a77
move polling logic to thunk
gcsecsey Dec 22, 2025
be60973
remove unused onPullSuccess/onPushSuccess props
gcsecsey Dec 22, 2025
3c5ca95
Merge branch 'trunk' of github.com:Automattic/studio into stu-711-stu…
gcsecsey Dec 22, 2025
ff2184b
remove unused actions
gcsecsey Dec 22, 2025
ec936a0
fix unused reference after merge
gcsecsey Dec 22, 2025
f60e93b
update tests
gcsecsey Dec 22, 2025
c5750d0
add null checks
gcsecsey Dec 22, 2025
860a1b0
Merge branch 'trunk' of github.com:Automattic/studio into stu-711-stu…
gcsecsey Dec 23, 2025
d278105
fix linter errors
gcsecsey Dec 23, 2025
f82a301
add runtime checks
gcsecsey Dec 23, 2025
4872b64
add optional chaining to progress data checks
gcsecsey Dec 23, 2025
3eb3778
Merge branch 'trunk' into stu-711-studio-refactor-pull-and-push-state…
gcsecsey Jan 5, 2026
55b1c33
Merge trunk and resolve conflicts
gcsecsey Jan 6, 2026
3ceedf4
Revert "Merge trunk and resolve conflicts"
gcsecsey Jan 6, 2026
0277edc
Merge branch 'trunk' of github.com:Automattic/studio into stu-711-stu…
gcsecsey Jan 14, 2026
fb2546e
Add back upload progress indicator
gcsecsey Jan 14, 2026
b2c526f
Merge branch 'trunk' of github.com:Automattic/studio into stu-711-stu…
gcsecsey Jan 27, 2026
30cc5da
Compare status keys directly, remove unecessary helpers
gcsecsey Jan 27, 2026
74802a7
make clearPullState and clearPushState thunks responsible for clearin…
gcsecsey Jan 27, 2026
6cf80f8
Inline single-use helper functions into their sole callers
gcsecsey Feb 6, 2026
cb963d9
Remove redundant remoteSiteId from updatePushState/updatePullState ca…
gcsecsey Feb 10, 2026
0cc9914
Remove updatePushStateWithIpc, move IPC sync to listener middleware
gcsecsey Feb 10, 2026
e31e351
Guard against missing status in backup polling response
gcsecsey Feb 10, 2026
def9297
Merge branch 'trunk' of github.com:Automattic/studio into stu-711-stu…
gcsecsey Feb 17, 2026
25fbceb
Replace if-else chain with switch statement in pollPushProgressThunk,…
gcsecsey Feb 17, 2026
80bd3bf
Move error state handling to extraReducers, use rejectWithValue in th…
gcsecsey Feb 17, 2026
5670c5c
Move error modals to listener middleware, remove showErrorMessageBox …
gcsecsey Feb 17, 2026
88af0da
Add createAsyncThunk condition to polling thunks, remove manual cance…
gcsecsey Feb 17, 2026
3fd06a0
Remove isKey* helpers, replace with direct comparisons in sync-connec…
gcsecsey Feb 17, 2026
087179a
Move progress info definitions into slice, remove from thunk payloads
gcsecsey Feb 17, 2026
ec81009
Move polling to listener middleware, delete use-sync-polling hook
gcsecsey Feb 17, 2026
3f91221
Move useInitializeSyncStates to initializeSyncStatesThunk, move mapIm…
gcsecsey Feb 17, 2026
5d97f47
Remove useSyncPull and useSyncPush hooks, replace with direct Redux a…
gcsecsey Feb 17, 2026
c941e72
Merge branch 'trunk' of github.com:Automattic/studio into stu-711-stu…
gcsecsey Feb 18, 2026
6f3c627
use selectors in settings-site-menu
gcsecsey Feb 18, 2026
b46fa6e
Replace non-reactive store.getState() with useRootSelector for sync s…
gcsecsey Feb 18, 2026
86cd931
fix tests
gcsecsey Feb 18, 2026
0213e19
Merge branch 'trunk' of github.com:Automattic/studio into stu-711-stu…
gcsecsey Feb 18, 2026
6a72a8d
Merge branch 'trunk' into stu-711-studio-refactor-pull-and-push-state…
gcsecsey Feb 19, 2026
09e4a83
Addressing review comments
fredrikekelund Feb 24, 2026
156aadd
Clean up
fredrikekelund Feb 24, 2026
aeef681
Merge branch 'trunk' into stu-711-studio-refactor-pull-and-push-state…
fredrikekelund Feb 24, 2026
9c83529
Cleanup
fredrikekelund Feb 24, 2026
ebefe47
Fix bad merge and clear import state when pulls finish
fredrikekelund Feb 25, 2026
a0d4540
zod schemas
fredrikekelund Feb 25, 2026
9483375
Correctness and simplification
fredrikekelund Feb 25, 2026
6ed7d2f
Fix schema
fredrikekelund Feb 25, 2026
d04c867
Fix more merge issues
fredrikekelund Feb 25, 2026
c75e34d
Bring back ability to manually pause pushes
fredrikekelund Feb 25, 2026
67437ac
Re-enable skipped tests
fredrikekelund Feb 25, 2026
6fb173f
Restore more of the tests
fredrikekelund Feb 25, 2026
ec825f1
Merge branch 'trunk' into stu-711-studio-refactor-pull-and-push-state…
fredrikekelund Feb 25, 2026
7e4bfe5
Restore even more of the tests
fredrikekelund Feb 25, 2026
ccb562a
Fix diff
fredrikekelund Feb 25, 2026
e440f5c
Minor tweaks
fredrikekelund Feb 25, 2026
bb73d26
remove unused export
gcsecsey Feb 25, 2026
a2c25d2
Fix tests
fredrikekelund Feb 25, 2026
e041e31
Update listeners to react to state updates rather than action types, …
gcsecsey Feb 25, 2026
72ebc55
Merge branch 'stu-711-studio-refactor-pull-and-push-states-from-syncs…
gcsecsey Feb 25, 2026
ac9c2cd
Merge branch 'trunk' of github.com:Automattic/studio into stu-711-stu…
gcsecsey Feb 25, 2026
1cd2659
Revert "Update listeners to react to state updates rather than action…
gcsecsey Feb 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion apps/studio/src/components/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import { NoStudioSites } from 'src/components/no-studio-sites';
import { SiteContentTabs } from 'src/components/site-content-tabs';
import TopBar from 'src/components/top-bar';
import WindowsTitlebar from 'src/components/windows-titlebar';
import { useListenDeepLinkConnection } from 'src/hooks/sync-sites/use-listen-deep-link-connection';
import { useAuth } from 'src/hooks/use-auth';
import { useLocalizationSupport } from 'src/hooks/use-localization-support';
import { useSidebarVisibility } from 'src/hooks/use-sidebar-visibility';
import { useSiteDetails } from 'src/hooks/use-site-details';
Expand All @@ -19,8 +21,9 @@ import { Onboarding } from 'src/modules/onboarding';
import { useOnboarding } from 'src/modules/onboarding/hooks/use-onboarding';
import { UserSettings } from 'src/modules/user-settings';
import { WhatsNewModal, useWhatsNew } from 'src/modules/whats-new';
import { useRootSelector } from 'src/stores';
import { useAppDispatch, useRootSelector } from 'src/stores';
import { selectOnboardingLoading } from 'src/stores/onboarding-slice';
import { syncOperationsThunks } from 'src/stores/sync';
import 'src/index.css';

export default function App() {
Expand All @@ -32,6 +35,17 @@ export default function App() {
const { sites: localSites, loadingSites } = useSiteDetails();
const isEmpty = ! loadingSites && ! localSites.length;
const shouldShowWhatsNew = showWhatsNew && ! isEmpty;
const { client } = useAuth();
const dispatch = useAppDispatch();

// Initialize sync states from in-progress server operations
useEffect( () => {
if ( client ) {
void dispatch( syncOperationsThunks.initializeSyncStates( { client } ) );
}
}, [ client, dispatch ] );

useListenDeepLinkConnection();

useEffect( () => {
void getIpcApi().setupAppMenu( { needsOnboarding } );
Expand Down
16 changes: 12 additions & 4 deletions apps/studio/src/components/content-tab-import-export.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ import { LearnMoreLink } from 'src/components/learn-more';
import ProgressBar from 'src/components/progress-bar';
import { Tooltip } from 'src/components/tooltip';
import { ACCEPTED_IMPORT_FILE_TYPES } from 'src/constants';
import { useSyncSites } from 'src/hooks/sync-sites/sync-sites-context';
import { useAuth } from 'src/hooks/use-auth';
import { useConfirmationDialog } from 'src/hooks/use-confirmation-dialog';
import { useDragAndDropFile } from 'src/hooks/use-drag-and-drop-file';
import { useImportExport } from 'src/hooks/use-import-export';
import { useSiteDetails } from 'src/hooks/use-site-details';
import { cx } from 'src/lib/cx';
import { getIpcApi } from 'src/lib/get-ipc-api';
import { useRootSelector } from 'src/stores';
import { syncOperationsSelectors } from 'src/stores/sync';
import { useGetConnectedSitesForLocalSiteQuery } from 'src/stores/sync/connected-sites';

interface ContentTabImportExportProps {
Expand Down Expand Up @@ -343,14 +344,21 @@ const ImportSite = ( {
export function ContentTabImportExport( { selectedSite }: ContentTabImportExportProps ) {
const { __ } = useI18n();
const [ isSupported, setIsSupported ] = useState< boolean | null >( null );
const { isSiteIdPulling, isSiteIdPushing } = useSyncSites();
const { user } = useAuth();
const { data: connectedSites = [] } = useGetConnectedSitesForLocalSiteQuery( {
localSiteId: selectedSite.id,
userId: user?.id,
} );
const isPulling = connectedSites.some( ( site ) => isSiteIdPulling( selectedSite.id, site.id ) );
const isPushing = connectedSites.some( ( site ) => isSiteIdPushing( selectedSite.id, site.id ) );
const isPulling = useRootSelector( ( state ) =>
connectedSites.some( ( site ) =>
syncOperationsSelectors.selectIsSiteIdPulling( selectedSite.id, site.id )( state )
)
);
const isPushing = useRootSelector( ( state ) =>
connectedSites.some( ( site ) =>
syncOperationsSelectors.selectIsSiteIdPushing( selectedSite.id, site.id )( state )
)
);
const isThisSiteSyncing = isPulling || isPushing;

useEffect( () => {
Expand Down
6 changes: 4 additions & 2 deletions apps/studio/src/components/publish-site-button.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { cloudUpload } from '@wordpress/icons';
import { useI18n } from '@wordpress/react-i18n';
import { useCallback } from 'react';
import { useSyncSites } from 'src/hooks/sync-sites';
import { useAuth } from 'src/hooks/use-auth';
import { useSiteDetails } from 'src/hooks/use-site-details';
import { generateCheckoutUrl } from 'src/lib/generate-checkout-url';
import { getIpcApi } from 'src/lib/get-ipc-api';
import { ConnectButton } from 'src/modules/sync/components/connect-button';
import { useRootSelector } from 'src/stores';
import { syncOperationsSelectors } from 'src/stores/sync';
import { useGetConnectedSitesForLocalSiteQuery } from 'src/stores/sync/connected-sites';

export const PublishSiteButton = () => {
Expand All @@ -17,7 +18,8 @@ export const PublishSiteButton = () => {
localSiteId: selectedSite?.id,
userId: user?.id,
} );
const { isAnySitePulling, isAnySitePushing } = useSyncSites();
const isAnySitePulling = useRootSelector( syncOperationsSelectors.selectIsAnySitePulling );
const isAnySitePushing = useRootSelector( syncOperationsSelectors.selectIsAnySitePushing );
const isAnySiteSyncing = isAnySitePulling || isAnySitePushing;

const handlePublishClick = useCallback( () => {
Expand Down
5 changes: 1 addition & 4 deletions apps/studio/src/components/root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import AuthProvider from 'src/components/auth-provider';
import CrashTester from 'src/components/crash-tester';
import ErrorBoundary from 'src/components/error-boundary';
import { WordPressStyles } from 'src/components/wordpress-styles';
import { SyncSitesProvider } from 'src/hooks/sync-sites/sync-sites-context';
import { ContentTabsProvider } from 'src/hooks/use-content-tabs';
import { FeatureFlagsProvider } from 'src/hooks/use-feature-flags';
import { ImportExportProvider } from 'src/hooks/use-import-export';
Expand Down Expand Up @@ -43,9 +42,7 @@ const Root = () => {
<ThemeDetailsProvider>
<OnboardingProvider>
<ImportExportProvider>
<SyncSitesProvider>
<App />
</SyncSitesProvider>
<App />
</ImportExportProvider>
</OnboardingProvider>
</ThemeDetailsProvider>
Expand Down
13 changes: 9 additions & 4 deletions apps/studio/src/components/settings-site-menu.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { MenuItem } from '@wordpress/components';
import { useSyncSites } from 'src/hooks/sync-sites';
import { useSiteDetails } from 'src/hooks/use-site-details';
import { useRootSelector } from 'src/stores';
import { syncOperationsSelectors } from 'src/stores/sync';

type SettingsMenuItemProps = {
onClick: () => void;
Expand All @@ -14,12 +15,16 @@ export const SettingsMenuItem = ( {
isDestructive = false,
}: SettingsMenuItemProps ) => {
const { isDeleting, sites, selectedSite } = useSiteDetails();
const { isSiteIdPulling, isSiteIdPushing } = useSyncSites();
const isPulling = useRootSelector(
syncOperationsSelectors.selectIsSiteIdPulling( selectedSite?.id ?? '' )
);
const isPushing = useRootSelector(
syncOperationsSelectors.selectIsSiteIdPushing( selectedSite?.id ?? '' )
);
if ( ! selectedSite ) {
return null;
}
const isThisSiteSyncing =
isSiteIdPulling( selectedSite.id ) || isSiteIdPushing( selectedSite.id );
const isThisSiteSyncing = isPulling || isPushing;
const isAddingSite = sites.some( ( site ) => site.isAddingSite );
const isDisabled = isDeleting || isThisSiteSyncing || isAddingSite;

Expand Down
8 changes: 5 additions & 3 deletions apps/studio/src/components/site-management-actions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ import { useI18n } from '@wordpress/react-i18n';
import { ActionButton } from 'src/components/action-button';
import { PublishSiteButton } from 'src/components/publish-site-button';
import { Tooltip } from 'src/components/tooltip';
import { useSyncSites } from 'src/hooks/sync-sites';
import { useImportExport } from 'src/hooks/use-import-export';
import { useRootSelector } from 'src/stores';
import { syncOperationsSelectors } from 'src/stores/sync';

export interface SiteManagementActionProps {
onStop: ( id: string ) => Promise< void >;
Expand All @@ -21,14 +22,15 @@ export const SiteManagementActions = ( {
}: SiteManagementActionProps ) => {
const { __ } = useI18n();
const { isSiteImporting } = useImportExport();
const { isSiteIdPulling } = useSyncSites();
const isPulling = useRootSelector(
syncOperationsSelectors.selectIsSiteIdPulling( selectedSite?.id ?? '' )
);

if ( ! selectedSite ) {
return null;
}

const isImporting = isSiteImporting( selectedSite.id );
const isPulling = isSiteIdPulling( selectedSite.id );
const disabled = isImporting || isPulling;

let buttonLabelOnDisabled: string = __( 'Importing…' );
Expand Down
8 changes: 4 additions & 4 deletions apps/studio/src/components/site-menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { __, sprintf } from '@wordpress/i18n';
import { useEffect, useState } from 'react';
import { XDebugIcon } from 'src/components/icons/xdebug-icon';
import { Tooltip } from 'src/components/tooltip';
import { useSyncSites } from 'src/hooks/sync-sites';
import { useContentTabs } from 'src/hooks/use-content-tabs';
import { useDeleteSite } from 'src/hooks/use-delete-site';
import { useImportExport } from 'src/hooks/use-import-export';
Expand All @@ -15,7 +14,9 @@ import { cx } from 'src/lib/cx';
import { getIpcApi } from 'src/lib/get-ipc-api';
import { supportedEditorConfig } from 'src/modules/user-settings/lib/editor';
import { getTerminalName } from 'src/modules/user-settings/lib/terminal';
import { useRootSelector } from 'src/stores';
import { useGetUserEditorQuery, useGetUserTerminalQuery } from 'src/stores/installed-apps-api';
import { syncOperationsSelectors } from 'src/stores/sync';

interface SiteMenuProps {
className?: string;
Expand Down Expand Up @@ -158,13 +159,12 @@ function SiteItem( {
useSiteDetails();
const isSelected = site === selectedSite;
const { isSiteImporting, isSiteExporting } = useImportExport();
const { isSiteIdPulling, isSiteIdPushing } = useSyncSites();
const { data: editor } = useGetUserEditorQuery();
const { data: terminal } = useGetUserTerminalQuery();
const isImporting = isSiteImporting( site.id );
const isExporting = isSiteExporting( site.id );
const isPulling = isSiteIdPulling( site.id );
const isPushing = isSiteIdPushing( site.id );
const isPulling = useRootSelector( syncOperationsSelectors.selectIsSiteIdPulling( site.id ) );
const isPushing = useRootSelector( syncOperationsSelectors.selectIsSiteIdPushing( site.id ) );
const isSyncing = isPulling || isPushing;
const isDeleting = isSiteDeleting( site.id );
const showSpinner =
Expand Down
5 changes: 1 addition & 4 deletions apps/studio/src/components/tests/app.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { render, screen, waitFor } from '@testing-library/react';
import { Provider } from 'react-redux';
import { vi, type Mock } from 'vitest';
import App from 'src/components/app';
import { SyncSitesProvider } from 'src/hooks/sync-sites';
import { ContentTabsProvider } from 'src/hooks/use-content-tabs';
import { useSiteDetails } from 'src/hooks/use-site-details';
import { useOnboarding } from 'src/modules/onboarding/hooks/use-onboarding';
Expand Down Expand Up @@ -109,9 +108,7 @@ describe( 'App', () => {
} );
return render(
<Provider store={ store }>
<ContentTabsProvider>
<SyncSitesProvider>{ component }</SyncSitesProvider>
</ContentTabsProvider>
<ContentTabsProvider>{ component }</ContentTabsProvider>
</Provider>
);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { act } from 'react';
import { Provider } from 'react-redux';
import { vi } from 'vitest';
import { ContentTabImportExport } from 'src/components/content-tab-import-export';
import { SyncSitesProvider } from 'src/hooks/sync-sites';
import { ContentTabsProvider } from 'src/hooks/use-content-tabs';
import { useImportExport } from 'src/hooks/use-import-export';
import { useSiteDetails } from 'src/hooks/use-site-details';
Expand Down Expand Up @@ -49,9 +48,7 @@ beforeEach( () => {
const renderWithProvider = ( children: React.ReactElement ) => {
return render(
<Provider store={ store }>
<ContentTabsProvider>
<SyncSitesProvider>{ children }</SyncSitesProvider>
</ContentTabsProvider>
<ContentTabsProvider>{ children }</ContentTabsProvider>
</Provider>
);
};
Expand Down
5 changes: 1 addition & 4 deletions apps/studio/src/components/tests/header.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { userEvent } from '@testing-library/user-event';
import { Provider } from 'react-redux';
import { vi, beforeAll, type Mock } from 'vitest';
import Header from 'src/components/header';
import { SyncSitesProvider } from 'src/hooks/sync-sites';
import { ContentTabsProvider } from 'src/hooks/use-content-tabs';
import { SiteDetailsProvider } from 'src/hooks/use-site-details';
import { getIpcApi } from 'src/lib/get-ipc-api';
Expand Down Expand Up @@ -46,9 +45,7 @@ const renderWithProvider = ( children: React.ReactElement ) => {
return render(
<Provider store={ store }>
<ContentTabsProvider>
<SyncSitesProvider>
<SiteDetailsProvider>{ children }</SiteDetailsProvider>
</SyncSitesProvider>
<SiteDetailsProvider>{ children }</SiteDetailsProvider>
</ContentTabsProvider>
</Provider>
);
Expand Down
5 changes: 1 addition & 4 deletions apps/studio/src/components/tests/main-sidebar.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { userEvent } from '@testing-library/user-event';
import { Provider } from 'react-redux';
import { vi } from 'vitest';
import MainSidebar from 'src/components/main-sidebar';
import { SyncSitesProvider } from 'src/hooks/sync-sites';
import { useAuth } from 'src/hooks/use-auth';
import { ContentTabsProvider } from 'src/hooks/use-content-tabs';
import { store } from 'src/stores';
Expand Down Expand Up @@ -102,9 +101,7 @@ vi.mock( 'src/hooks/use-site-details', () => ( {
const renderWithProvider = ( children: React.ReactElement ) => {
return render(
<Provider store={ store }>
<ContentTabsProvider>
<SyncSitesProvider>{ children }</SyncSitesProvider>
</ContentTabsProvider>
<ContentTabsProvider>{ children }</ContentTabsProvider>
</Provider>
);
};
Expand Down
5 changes: 1 addition & 4 deletions apps/studio/src/components/tests/site-content-tabs.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { act, render, screen } from '@testing-library/react';
import { Provider } from 'react-redux';
import { vi } from 'vitest';
import { SiteContentTabs } from 'src/components/site-content-tabs';
import { SyncSitesProvider } from 'src/hooks/sync-sites';
import { ContentTabsProvider } from 'src/hooks/use-content-tabs';
import { useSiteDetails } from 'src/hooks/use-site-details';
import { store } from 'src/stores';
Expand Down Expand Up @@ -76,9 +75,7 @@ describe( 'SiteContentTabs', () => {
const renderWithProvider = ( component: React.ReactElement ) => {
return render(
<Provider store={ store }>
<ContentTabsProvider>
<SyncSitesProvider>{ component }</SyncSitesProvider>
</ContentTabsProvider>
<ContentTabsProvider>{ component }</ContentTabsProvider>
</Provider>
);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {
SiteManagementActionProps,
SiteManagementActions,
} from 'src/components/site-management-actions';
import { SyncSitesProvider } from 'src/hooks/sync-sites';
import { ContentTabsProvider } from 'src/hooks/use-content-tabs';
import { store } from 'src/stores';
import { connectedSitesApi } from 'src/stores/sync/connected-sites';
Expand Down Expand Up @@ -55,9 +54,7 @@ describe( 'SiteManagementActions', () => {
const renderWithProvider = ( children: React.ReactElement ) => {
return render(
<Provider store={ store }>
<ContentTabsProvider>
<SyncSitesProvider>{ children }</SyncSitesProvider>
</ContentTabsProvider>
<ContentTabsProvider>{ children }</ContentTabsProvider>
</Provider>
);
};
Expand Down
3 changes: 2 additions & 1 deletion apps/studio/src/hooks/sync-sites/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './sync-sites-context';
export { useLastSyncTimeText } from './use-last-sync-time-text';
export type { GetLastSyncTimeText } from './use-last-sync-time-text';
Loading