@pmcollab/coworkstream-store
v0.1.0
Published
Optional Zustand-based state container for @pmcollab/coworkstream — items, filter, expand, deferred-to-desktop, and optimistic actions.
Readme
@pmcollab/coworkstream-store
Optional Zustand-based state container for @pmcollab/coworkstream. Use this when you don't want to wire your own state library.
Install
npm install @pmcollab/coworkstream-store zustandUse
import { WorkStream } from '@pmcollab/coworkstream'
import { createWorkStreamStore } from '@pmcollab/coworkstream-store'
const useWorkStream = createWorkStreamStore({
fetchItems: () => fetch('/api/inbox').then((r) => r.json()),
onAction: (action, item) =>
fetch(`/api/inbox/${item.id}/${action}`, { method: 'POST' }),
})
export function Inbox() {
const items = useWorkStream((s) => s.items)
const isLoading = useWorkStream((s) => s.isLoading)
const filter = useWorkStream((s) => s.filter)
const setFilter = useWorkStream((s) => s.setFilter)
const expandedId = useWorkStream((s) => s.expandedId)
const setExpandedId = useWorkStream((s) => s.setExpandedId)
const handleAction = useWorkStream((s) => s.handleAction)
useEffect(() => { useWorkStream.getState().load() }, [])
return (
<WorkStream
items={items}
isLoading={isLoading}
activeFilter={filter}
onFilterChange={setFilter}
expandedId={expandedId}
onExpandChange={setExpandedId}
onAction={handleAction}
/>
)
}Behavior
- Optimistic updates by default:
handleActionremoves the item immediately, callsonAction, and on failure rolls back + setsstate.error. - Pass
optimistic: falseif your action should keep the item in the list (e.g. an in-place edit). load()calls yourfetchItemsand togglesisLoading/error.deferToDesktop(item)andclearDeferred(item)manage thedeferredIdsarray.
API
createWorkStreamStore({
initialItems?: WorkStreamItem[],
fetchItems?: () => Promise<WorkStreamItem[]>,
onAction?: (action, item) => Promise<void> | void,
optimistic?: boolean, // default true
})License
Commercial. See LICENSE in the repository root.
