feat: sunset web scene editor - #3438
Conversation
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>
|
Deployment failed with the following error: View Documentation: https://vercel.com/docs/two-factor-authentication |
Coverage Report for CI Build 30133609804Coverage remained the same at 52.401%Details
Uncovered ChangesNo uncovered changes found. Coverage RegressionsNo coverage regressions found. Coverage Stats💛 - Coveralls |
decentraland-bot
left a comment
There was a problem hiding this comment.
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.openwith the correct URL and callsonClose - "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,noreferreronwindow.openis correct.CREATOR_HUB_DOWNLOAD_URLcomes from build-time config (verified indev.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 editorfollows 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" |
There was a problem hiding this comment.
[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) |
There was a problem hiding this comment.
[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) |
There was a problem hiding this comment.
[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.

Description
Adds a sunset notice for the web scene editor ahead of its retirement on August 18th:
WebEditorSunsetModalshown when opening a scene from its detail page, prompting users to download Creator Hub (with an option to continue to the editor).Replaces #3437, which was mistakenly based on
feat/shop-credits-publish-feeinstead ofmaster. Same changes, cherry-picked ontomaster.🤖 Generated with Claude Code