Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Optimistic writes disappear on rows retained from a derived store's draft

Open
#3,859 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
70/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
typescript
Domain
frontend

Research direction

Start by examining the store implementation, focusing on how writable derived stores retain rows from drafts and how createOptimisticStore applies updates. Look at the regression tests for #3767 to understand the expected behavior for ordinary writes, then add a similar test case for optimistic writes. The fix should ensure optimistic updates correctly modify retained rows, possibly by copying them as described in the workaround.

Written by the indexing model from the issue text.

Description

Describe the bug

A writable derived store retains a local row across a source refresh:

const [local, setLocal] = createStore<Row[]>(
  draft => [...source(), ...draft.filter(row => row.id === "local")],
  [],
);
const [view, setView] = createOptimisticStore(local);

After the refresh, an action optimistically sets the retained row's value to 1 and waits two seconds. The optimistic view keeps showing 0 throughout the action.

There are no concurrent actions or pending source updates; the setup updates finish before the action starts.

Your Example Website or App

https://s.olid.uk/id/zG2yQHbUQPa-SyUMiPm_pg

Steps to Reproduce the Bug or Issue
  1. Open the playground.
  2. Click Run once. The button creates a local row, refreshes the source, then starts the optimistic action, with 100 ms delays between setup updates.
  3. Observe that Local value stays at 0 during the two-second action.
Expected behavior

The optimistic view should show Local value: 1 while the action is pending, then revert to 0 when the action finishes without persisting the change.

Screenshots or Videos

No response

Platform
  • OS: Linux
  • Browser: Chromium 153.0.8010.12
  • Solid: published preview mizulu/solid2@5c2174c
Additional context

Returning a copy of the retained row (draft.filter(...).map(row => ({ ...row }))) makes the optimistic update appear and revert as expected. Both variants were tested in the browser.

The retained-draft-row pattern is already covered for ordinary writes by the regression tests for #3767. This report concerns optimistic writes over that store.

The playground has Tailwind disabled.

Dominant language
TypeScript
Stars
36.1k
Forks
1.1k
Avg merge
13h 13m
Merged PRs (30d)
306

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from solidjs/solid

All issues in solidjs/solid

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.