Skip to content

feat: sunset web scene editor - #3438

Open
nearnshaw wants to merge 2 commits into
masterfrom
feat/sunset-web-scene-editor-main
Open

feat: sunset web scene editor#3438
nearnshaw wants to merge 2 commits into
masterfrom
feat/sunset-web-scene-editor-main

Conversation

@nearnshaw

Copy link
Copy Markdown
Member

Description

Adds a sunset notice for the web scene editor ahead of its retirement on August 18th:

  • New WebEditorSunsetModal shown when opening a scene from its detail page, prompting users to download Creator Hub (with an option to continue to the editor).
  • Removes the "Create scene" / "Upload scene" buttons from the Scenes page and the "Duplicate" action from project cards and the scene detail page.
  • Replaces the SDK7 migration modal flow with the sunset modal.

Replaces #3437, which was mistakenly based on feat/shop-credits-publish-fee instead of master. Same changes, cherry-picked onto master.

🤖 Generated with Claude Code

decentraland-bot and others added 2 commits July 24, 2026 20:21
Remove Upload Scene and Create Scene buttons from the scenes list page.
Remove Duplicate option from scene kebab menus (list and detail views).
Show a deprecation popup when clicking Edit Scene on any SDK6 or SDK7 scene,
informing users the web editor will be retired on August 18th and directing
them to Creator Hub.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 24, 2026

Copy link
Copy Markdown

Deployment failed with the following error:

You must set up Two-Factor Authentication before accessing this team.

View Documentation: https://vercel.com/docs/two-factor-authentication

@coveralls

Copy link
Copy Markdown

Coverage Report for CI Build 30133609804

Coverage remained the same at 52.401%

Details

  • Coverage remained the same as the base build.
  • Patch coverage: No coverable lines changed in this PR.
  • No coverage regressions found.

Uncovered Changes

No uncovered changes found.

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines: 12718
Covered Lines: 7278
Line Coverage: 57.23%
Relevant Branches: 5566
Covered Branches: 2303
Branch Coverage: 41.38%
Branches in Coverage %: Yes
Coverage Strength: 34.48 hits per line

💛 - Coveralls

@decentraland-bot decentraland-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: feat: sunset web scene editor (#3438)

Clean, well-scoped PR that adds a sunset notice for the web scene editor and removes obsolete creation/duplication actions. The new WebEditorSunsetModal follows existing codebase patterns and the removal of duplicate/create/upload functionality is surgically done. No security issues found.

However, there are a few items that should be addressed before merging — most notably the missing translations and test coverage, which were specifically requested as focus areas for this review.


P1 — Missing translations in es.json and zh.json

The four new web_editor_sunset_modal.* keys were only added to en.json. The es.json and zh.json files have zero matches for these keys. Depending on the i18n fallback configuration in decentraland-dapps, Spanish and Chinese users will either see English fallback text or raw translation keys.

Suggestion: Add the keys to es.json and zh.json. Even if initially duplicating the English text with a TODO comment for proper translation, this ensures the modal doesn't display broken content for non-English users.


P2 — No tests for WebEditorSunsetModal

The new modal component has no accompanying test file. Other modal components in the codebase do have tests (e.g. ReclaimNameModal.spec.tsx, PushChangesModal.spec.tsx). This modal gates access to the editor for every scene — if it breaks, users are either blocked or the sunset notice is silently bypassed.

Recommended test cases:

  • Renders title, description, and both buttons
  • "Download Creator Hub" button calls window.open with the correct URL and calls onClose
  • "Continue to editor" button calls onContinue
  • Close (X) button calls onClose

P2 — Dead code: MigrateSceneToSDK7 directory is now orphaned

The MigrateSceneToSDK7 import was removed from SceneDetailPage.tsx, but the entire directory still exists with 6 files (MigrateSceneToSDK7.tsx, .container.ts, .types.ts, .module.css, utils.ts, index.ts). No other file in the codebase imports this component. Consider deleting the directory in this PR to avoid dead code.


P2 — SceneCreationSelector still active in ScenesPage empty state

The PR removes the "Create scene" / "Upload scene" buttons from the ScenesPage header, but SceneCreationSelector (which offers creation options) still renders in the empty-state branch (ScenesPage.tsx line 83). Users with zero scenes will still see creation options that launch the web editor. If the sunset intent is to discourage new scene creation in the web editor, this is inconsistent.


P2 — editorDestination state pattern in SceneDetailPage

The two-state approach (showSunsetModal + editorDestination) works correctly because React re-renders before the modal callback is used. However, it's slightly fragile — a simpler approach would be to use a useRef for editorDestination (avoiding extra renders and stale closure risk) or to compute the destination inline.


P2 — React.memo on WebEditorSunsetModal is defeated

The modal is wrapped in React.memo, but in SceneDetailPage.tsx line 190, onClose is passed as an inline arrow function () => setShowSunsetModal(false), creating a new reference on every render and defeating memoization. Either stabilize onClose with useCallback in the parent, or remove React.memo from the modal (consistent with CreatorHubUpgradeModal which doesn't use it).


Other notes

  • Security: No issues found. noopener,noreferrer on window.open is correct. CREATOR_HUB_DOWNLOAD_URL comes from build-time config (verified in dev.json, stg.json, prod.json). Translation strings are rendered as JSX text children (escaped by React).
  • CI: Tests and audits pass ✅. Vercel deployment failed (appears unrelated to this PR).
  • Git conventions: PR title feat: sunset web scene editor follows semantic commit format ✅.
  • API surface: No public API changes. Removing UI buttons does not affect backend auth — the server-side endpoints retain their own authorization checks.

Reviewed by Jarvis 🤖 · Requested by Gabriel Díaz (<@U03MGHMAJL8>) via Slack

"title": "The web scene editor is being retired on August 18th",
"description": "As of August 18th, the web scene editor will no longer be supported. We recommend downloading Creator Hub — a much more powerful and actively maintained tool that works seamlessly with all your existing scenes. You can always download your scenes and continue working on them in Creator Hub.",
"download_creator_hub": "Download Creator Hub",
"continue_to_editor": "Continue to editor"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] Missing translations in es.json and zh.json

These four new keys (title, description, download_creator_hub, continue_to_editor) are only present in en.json. The es.json and zh.json files need matching entries — even if temporarily duplicated in English with a TODO comment.


const handleContinueToEditor = useCallback(() => {
setShowSunsetModal(false)
history.push(editorDestination)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Consider using a ref instead of state for editorDestination

The current two-state approach works because React re-renders before the modal callback is used, but a useRef avoids the stale closure risk entirely and removes an unnecessary re-render:

const editorDestinationRef = useRef('')

const handleEditScene = useCallback(() => {
  editorDestinationRef.current = scene?.sdk6
    ? locations.sceneEditor(project?.id)
    : locations.inspector(project?.id)
  setShowSunsetModal(true)
}, [project, scene])

const handleContinueToEditor = useCallback(() => {
  setShowSunsetModal(false)
  history.push(editorDestinationRef.current)
}, [history])

)
}

export default React.memo(WebEditorSunsetModal)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] React.memo is defeated by the inline onClose in the parent

In SceneDetailPage.tsx, onClose is passed as () => setShowSunsetModal(false) (new reference every render). Either stabilize it with useCallback in the parent or remove React.memo here — CreatorHubUpgradeModal doesn't use it.

@RocioCM RocioCM left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey Nico, I agree with Jarvis comments, fix them and you'll be ready to merge! 🚀

Btw, what do you thing of adding the notice about the editor sunset on this modal too?

Image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants