close
Skip to content

feat(sheets): remember last active sheet on reopen#496

Open
the-narwhal wants to merge 1 commit intoProtonMail:mainfrom
the-narwhal:remember-last-active-sheet
Open

feat(sheets): remember last active sheet on reopen#496
the-narwhal wants to merge 1 commit intoProtonMail:mainfrom
the-narwhal:remember-last-active-sheet

Conversation

@the-narwhal
Copy link
Copy Markdown

Note on Testing

This PR was implemented via static analysis of the codebase only. The editor runs inside an iframe with a full Proton Drive/RTS backend, so end-to-end verification wasn't possible in this context. The change is submitted as a complete, ready-to-review implementation for Proton to merge as-is, iterate on, or use as a reference. Unit-level logic is straightforward and self-contained; the main thing that warrants a real integration smoke test before shipping is confirming documentId is stable and populated by the time initializeEditor fires for the sheet case.


Remember Last Active Sheet on Reopen

Closes the community-requested UX gap where opening a multi-worksheet spreadsheet always landed on tab 1, regardless of where the user left off.

Problem

handleInitialLoad in useYjsState unconditionally called onChangeActiveSheet(firstSheetId) after receiving the initial RTS sync. There was no persistence of the active sheet between sessions.

Solution

Two small additions to useYjsState in state.ts:

On open: restore saved sheet
handleInitialLoad now checks localStorage before defaulting to sheet 1. If a saved sheet ID is found and the sheet still exists in the document, it is activated instead. If the saved sheet has since been deleted, or this is the first time the document is opened, it falls back to sheet 1 exactly as before.

On tab switch: persist active sheet
A new saveActiveSheetToStorage effect writes the current activeSheetId to localStorage whenever it changes, gated on receivedEverythingFromRTS to avoid persisting the library's pre-load default value.

Storage key design
Keys are scoped to both documentId and userName so that collaborators on the same shared spreadsheet each independently remember their own last position:

proton-sheets-active-sheet:{documentId}:{userName}

Files Changed

  • state.ts — all logic lives here: getActiveSheetStorageKey helper, documentId added to YjsStateDependencies (which automatically propagates to ProtonSheetsStateDependencies via the existing type spread), modified handleInitialLoad, new saveActiveSheetToStorage effect
  • Spreadsheet.tsxdocumentId: string added to SpreadsheetProps, threaded into useProtonSheetsState
  • App.tsxdocumentId={editorConfig.current.documentId} passed to <Spreadsheet>, mirroring the existing pattern already used for <Editor>

What Was Not Changed

  • No changes to the Yjs document content or RTS sync; this is purely client-side localStorage
  • No changes to sheet switching UX or collaborator cursor following
  • Fallback to sheet 1 is fully preserved for first-open and deleted-sheet cases
  • Read-only and revision modes are unaffected

Integration Smoke Test Recommended

Before merging, confirm:

  1. Open a spreadsheet, switch to a non-first sheet, close and reopen. Should land on that sheet.
  2. Open the same spreadsheet as a second user. Their position should be tracked independently.
  3. Switch to a sheet, delete it, then reopen. Should fall back to sheet 1 without errors.
  4. Open a brand new spreadsheet for the first time. Should open on sheet 1 as before.

When a spreadsheet with ultiple worksheets is opened, the editor now
restores the user's last-visited sheet instead of always defaulting to
the first tab.

Implementation:
- On every active-sheet change (after initial RTS sync), persist the
  sheet ID to localStorage under a key scoped to both the document ID
  and the user, so collaborators each retain their own position.
- On initial load, read that key and activate the saved sheet if it
  still exists in the document; otherwise fall back to sheet 1 as
  before (covers first-open and deleted-sheet cases).
- Thread `documentId` from App → Spreadsheet → useProtonSheetsState →
  useYjsState to provide a stable per-document storage key.
@the-narwhal the-narwhal marked this pull request as ready for review April 26, 2026 17:51
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.

1 participant