From 8005a9ee435de4049d3d14349fd9759725a95e76 Mon Sep 17 00:00:00 2001 From: Tony Arcangelini Date: Wed, 6 May 2026 10:18:53 +0200 Subject: [PATCH 1/4] Podcast: scaffold AdminPage chrome + empty tabs in dashboard route --- pnpm-lock.yaml | 56 ++++++++++++++--- .../podcast/changelog/add-admin-tabs-scaffold | 4 ++ projects/packages/podcast/package.json | 8 ++- .../podcast/routes/dashboard/package.json | 4 +- .../podcast/routes/dashboard/stage.tsx | 61 ++++++++++++++++++- 5 files changed, 118 insertions(+), 15 deletions(-) create mode 100644 projects/packages/podcast/changelog/add-admin-tabs-scaffold diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f7b10a3b67..d43e91e6031 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3579,6 +3579,19 @@ importers: version: 6.0.1(webpack@5.105.2) projects/packages/podcast: + dependencies: + '@wordpress/components': + specifier: 32.6.0 + version: 32.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@wordpress/element': + specifier: 6.44.0 + version: 6.44.0 + '@wordpress/i18n': + specifier: 6.17.0 + version: 6.17.0 + '@wordpress/ui': + specifier: 0.11.0 + version: 0.11.0(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@automattic/jetpack-wp-build-polyfills': specifier: workspace:* @@ -3598,12 +3611,6 @@ importers: '@wordpress/build': specifier: 0.13.0 version: 0.13.0(@babel/core@7.29.0)(browserslist@4.28.2) - '@wordpress/element': - specifier: 6.44.0 - version: 6.44.0 - '@wordpress/i18n': - specifier: 6.17.0 - version: 6.17.0 browserslist: specifier: ^4.24.0 version: 4.28.2 @@ -19432,6 +19439,7 @@ snapshots: use-sync-external-store: 1.6.0(react@18.3.1) optionalDependencies: '@types/react': 18.3.28 + optional: true '@base-ui/react@1.4.0(@date-fns/tz@1.4.1)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -19444,6 +19452,21 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.6.0(react@18.3.1) + optional: true + + '@base-ui/react@1.4.1(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@base-ui/utils': 0.2.8(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) + optionalDependencies: + '@date-fns/tz': 1.4.1 + '@types/react': 18.3.28 + date-fns: 4.1.0 '@base-ui/react@1.4.1(@date-fns/tz@1.4.1)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -19468,6 +19491,7 @@ snapshots: use-sync-external-store: 1.6.0(react@18.3.1) optionalDependencies: '@types/react': 18.3.28 + optional: true '@base-ui/utils@0.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -19477,6 +19501,18 @@ snapshots: react-dom: 18.3.1(react@18.3.1) reselect: 5.1.1 use-sync-external-store: 1.6.0(react@18.3.1) + optional: true + + '@base-ui/utils@0.2.8(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@floating-ui/utils': 0.2.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + reselect: 5.1.1 + use-sync-external-store: 1.6.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 '@base-ui/utils@0.2.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -24202,7 +24238,7 @@ snapshots: '@wordpress/base-styles': 6.20.0 '@wordpress/compose': 7.44.0(react@18.3.1) '@wordpress/date': 5.44.0 - '@wordpress/deprecated': 4.44.0 + '@wordpress/deprecated': 4.45.0 '@wordpress/dom': 4.44.0 '@wordpress/element': 6.44.0 '@wordpress/escape-html': 3.44.0 @@ -24210,7 +24246,7 @@ snapshots: '@wordpress/html-entities': 4.44.0 '@wordpress/i18n': 6.17.0 '@wordpress/icons': 12.2.0(react@18.3.1) - '@wordpress/is-shallow-equal': 5.44.0 + '@wordpress/is-shallow-equal': 5.45.0 '@wordpress/keycodes': 4.44.0 '@wordpress/primitives': 4.44.0(react@18.3.1) '@wordpress/private-apis': 1.44.0 @@ -25916,7 +25952,7 @@ snapshots: '@wordpress/ui@0.11.0(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@base-ui/react': 1.4.0(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@base-ui/react': 1.4.1(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@date-fns/tz': 1.4.1 '@wordpress/a11y': 4.44.0 '@wordpress/compose': 7.44.0(react@18.3.1) @@ -25938,7 +25974,7 @@ snapshots: '@wordpress/ui@0.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@base-ui/react': 1.4.0(@date-fns/tz@1.4.1)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@base-ui/react': 1.4.1(@date-fns/tz@1.4.1)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@date-fns/tz': 1.4.1 '@wordpress/a11y': 4.44.0 '@wordpress/compose': 7.44.0(react@18.3.1) diff --git a/projects/packages/podcast/changelog/add-admin-tabs-scaffold b/projects/packages/podcast/changelog/add-admin-tabs-scaffold new file mode 100644 index 00000000000..de1a7d28cc7 --- /dev/null +++ b/projects/packages/podcast/changelog/add-admin-tabs-scaffold @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Replace the wp-build placeholder with page chrome (title, tagline) plus tab navigation (Welcome, Settings, Episodes, Distribution). Each tab panel is still empty — PR 4 in the untangle train fills them in. diff --git a/projects/packages/podcast/package.json b/projects/packages/podcast/package.json index fd66f8c84ed..f3eeedc12ad 100644 --- a/projects/packages/podcast/package.json +++ b/projects/packages/podcast/package.json @@ -26,6 +26,12 @@ "browserslist": [ "extends @wordpress/browserslist-config" ], + "dependencies": { + "@wordpress/components": "32.6.0", + "@wordpress/element": "6.44.0", + "@wordpress/i18n": "6.17.0", + "@wordpress/ui": "0.11.0" + }, "devDependencies": { "@automattic/jetpack-wp-build-polyfills": "workspace:*", "@babel/core": "7.29.0", @@ -33,8 +39,6 @@ "@types/react": "18.3.28", "@wordpress/browserslist-config": "6.44.0", "@wordpress/build": "0.13.0", - "@wordpress/element": "6.44.0", - "@wordpress/i18n": "6.17.0", "browserslist": "^4.24.0" }, "optionalDependencies": { diff --git a/projects/packages/podcast/routes/dashboard/package.json b/projects/packages/podcast/routes/dashboard/package.json index 7dab7404e23..f130ca6154a 100644 --- a/projects/packages/podcast/routes/dashboard/package.json +++ b/projects/packages/podcast/routes/dashboard/package.json @@ -4,8 +4,10 @@ "private": true, "dependencies": { "@types/react": "18.3.28", + "@wordpress/components": "32.6.0", "@wordpress/element": "6.44.0", - "@wordpress/i18n": "6.17.0" + "@wordpress/i18n": "6.17.0", + "@wordpress/ui": "0.11.0" }, "route": { "path": "/", diff --git a/projects/packages/podcast/routes/dashboard/stage.tsx b/projects/packages/podcast/routes/dashboard/stage.tsx index 4cee550f943..dbda37f6ce3 100644 --- a/projects/packages/podcast/routes/dashboard/stage.tsx +++ b/projects/packages/podcast/routes/dashboard/stage.tsx @@ -1,6 +1,63 @@ +/** + * Podcast dashboard stage: page chrome + tab navigation. + * + * Placeholder scaffolding only — each tab panel renders a stub. PR 4 in the + * untangle train wires the full AdminPage + jetpack-components integration + * along with the real tab contents. + */ + +import { useState, useCallback } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { Tabs } from '@wordpress/ui'; + +const TAB_VALUES = [ 'welcome', 'settings', 'episodes', 'distribution' ] as const; +type TabName = ( typeof TAB_VALUES )[ number ]; + +const isValidTab = ( value: string | null ): value is TabName => + !! value && ( TAB_VALUES as readonly string[] ).includes( value ); + const Stage = () => { - // "Podcast" is a product name, do not translate. - return

Podcast

; + const [ activeTab, setActiveTab ] = useState< TabName >( 'welcome' ); + + const handleTabChange = useCallback( ( value: string | null ) => { + if ( isValidTab( value ) ) { + setActiveTab( value ); + } + }, [] ); + + return ( +
+ { /* "Podcast" is a product name, do not translate. */ } +

Podcast

+

+ { __( + 'Publish a podcast and reach your fans, anywhere they listen.', + 'jetpack-podcast' + ) } +

+ + + + { __( 'Welcome', 'jetpack-podcast' ) } + { __( 'Settings', 'jetpack-podcast' ) } + { __( 'Episodes', 'jetpack-podcast' ) } + { __( 'Distribution', 'jetpack-podcast' ) } + + +

{ __( 'Welcome — placeholder.', 'jetpack-podcast' ) }

+
+ +

{ __( 'Settings — placeholder.', 'jetpack-podcast' ) }

+
+ +

{ __( 'Episodes — placeholder.', 'jetpack-podcast' ) }

+
+ +

{ __( 'Distribution — placeholder.', 'jetpack-podcast' ) }

+
+
+
+ ); }; export { Stage as stage }; From baa9e5e30987827f10433155090fbfae9f77af0c Mon Sep 17 00:00:00 2001 From: Tony Arcangelini Date: Wed, 6 May 2026 22:28:10 +0200 Subject: [PATCH 2/4] Podcast: drop redundant late_initialization loader --- .../jetpack/changelog/add-podcast-admin-tabs-scaffold | 5 +++++ projects/plugins/jetpack/class.jetpack.php | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 projects/plugins/jetpack/changelog/add-podcast-admin-tabs-scaffold diff --git a/projects/plugins/jetpack/changelog/add-podcast-admin-tabs-scaffold b/projects/plugins/jetpack/changelog/add-podcast-admin-tabs-scaffold new file mode 100644 index 00000000000..0a0efdec006 --- /dev/null +++ b/projects/plugins/jetpack/changelog/add-podcast-admin-tabs-scaffold @@ -0,0 +1,5 @@ +Significance: patch +Type: other +Comment: Podcast: drop redundant late_initialization load — the package is loaded via jetpack-mu-wpcom on Simple/Atomic, and the host gate makes the Jetpack plugin call a no-op. + + diff --git a/projects/plugins/jetpack/class.jetpack.php b/projects/plugins/jetpack/class.jetpack.php index e1cff5aedfc..72eaa5ae5d6 100644 --- a/projects/plugins/jetpack/class.jetpack.php +++ b/projects/plugins/jetpack/class.jetpack.php @@ -32,7 +32,6 @@ use Automattic\Jetpack\Paths; use Automattic\Jetpack\Plugin\Deprecate; use Automattic\Jetpack\Plugin\Tracking as Plugin_Tracking; -use Automattic\Jetpack\Podcast\Podcast as Podcast_Init; use Automattic\Jetpack\Redirect; use Automattic\Jetpack\Scan_Page\Jetpack_Scan as Scan_Page_Init; use Automattic\Jetpack\Status; @@ -874,7 +873,6 @@ public function late_initialization() { My_Jetpack_Initializer::init(); Activity_Log_Init::initialize(); Scan_Page_Init::initialize(); - Podcast_Init::init(); // Initialize Boost Speed Score new Speed_Score( array(), 'jetpack-dashboard' ); From 7cc07dc6777a5c8142d42fb0fdfcb24e68cb8d63 Mon Sep 17 00:00:00 2001 From: Tony Arcangelini Date: Wed, 6 May 2026 23:10:11 +0200 Subject: [PATCH 3/4] Podcast: swap Welcome tab for Stats; default to Settings --- .../packages/podcast/routes/dashboard/stage.tsx | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/projects/packages/podcast/routes/dashboard/stage.tsx b/projects/packages/podcast/routes/dashboard/stage.tsx index dbda37f6ce3..1b221ce1ad6 100644 --- a/projects/packages/podcast/routes/dashboard/stage.tsx +++ b/projects/packages/podcast/routes/dashboard/stage.tsx @@ -10,14 +10,14 @@ import { useState, useCallback } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { Tabs } from '@wordpress/ui'; -const TAB_VALUES = [ 'welcome', 'settings', 'episodes', 'distribution' ] as const; +const TAB_VALUES = [ 'settings', 'episodes', 'distribution', 'stats' ] as const; type TabName = ( typeof TAB_VALUES )[ number ]; const isValidTab = ( value: string | null ): value is TabName => !! value && ( TAB_VALUES as readonly string[] ).includes( value ); const Stage = () => { - const [ activeTab, setActiveTab ] = useState< TabName >( 'welcome' ); + const [ activeTab, setActiveTab ] = useState< TabName >( 'settings' ); const handleTabChange = useCallback( ( value: string | null ) => { if ( isValidTab( value ) ) { @@ -30,22 +30,16 @@ const Stage = () => { { /* "Podcast" is a product name, do not translate. */ }

Podcast

- { __( - 'Publish a podcast and reach your fans, anywhere they listen.', - 'jetpack-podcast' - ) } + { __( 'Publish a podcast and reach your fans, anywhere they listen.', 'jetpack-podcast' ) }

- { __( 'Welcome', 'jetpack-podcast' ) } { __( 'Settings', 'jetpack-podcast' ) } { __( 'Episodes', 'jetpack-podcast' ) } { __( 'Distribution', 'jetpack-podcast' ) } + { __( 'Stats', 'jetpack-podcast' ) } - -

{ __( 'Welcome — placeholder.', 'jetpack-podcast' ) }

-

{ __( 'Settings — placeholder.', 'jetpack-podcast' ) }

@@ -55,6 +49,9 @@ const Stage = () => {

{ __( 'Distribution — placeholder.', 'jetpack-podcast' ) }

+ +

{ __( 'Stats — placeholder.', 'jetpack-podcast' ) }

+
); From c59f252177976eb99cbac13bfce50d929e80c186 Mon Sep 17 00:00:00 2001 From: Tony Arcangelini Date: Wed, 6 May 2026 23:13:19 +0200 Subject: [PATCH 4/4] Podcast: remove redundant 'do not translate' comment --- projects/packages/podcast/routes/dashboard/stage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/projects/packages/podcast/routes/dashboard/stage.tsx b/projects/packages/podcast/routes/dashboard/stage.tsx index 1b221ce1ad6..92f5ceebfb9 100644 --- a/projects/packages/podcast/routes/dashboard/stage.tsx +++ b/projects/packages/podcast/routes/dashboard/stage.tsx @@ -27,7 +27,6 @@ const Stage = () => { return (
- { /* "Podcast" is a product name, do not translate. */ }

Podcast

{ __( 'Publish a podcast and reach your fans, anywhere they listen.', 'jetpack-podcast' ) }