import { createRoot } from 'octane'
import { useQueuedState } from '@tanstack/octane-pacer/queuer'
import { useState } from 'octane'
function App1() {
function processItem(item: number) {
console.log('processing item', item)
}
const [queueItems, addItem, queuer] = useQueuedState(
processItem,
{
maxSize: 25,
initialItems: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
started: false,
wait: 1000,
},
(state) => ({ items: state.items }),
)
return (
<div>
<h1>{'TanStack Pacer useQueuedState Example 1'}</h1>
<queuer.Subscribe
selector={(state) => ({
size: state.size,
isFull: state.isFull,
isEmpty: state.isEmpty,
isIdle: state.isIdle,
status: state.status,
executionCount: state.executionCount,
isRunning: state.isRunning,
})}
>
{({
size,
isFull,
isEmpty,
isIdle,
status,
executionCount,
isRunning,
}) => (
<>
<div>
{'Queue Size: '}
{size}
</div>
<div>
{'Queue Max Size: '}
{25}
</div>
<div>
{'Queue Full: '}
{isFull ? 'Yes' : 'No'}
</div>
<div>
{'Queue Peek: '}
{queuer.peekNextItem()}
</div>
<div>
{'Queue Empty: '}
{isEmpty ? 'Yes' : 'No'}
</div>
<div>
{'Queue Idle: '}
{isIdle ? 'Yes' : 'No'}
</div>
<div>
{'Queuer Status: '}
{status}
</div>
<div>
{'Items Processed: '}
{executionCount}
</div>
<div>
{'Queue Items: '}
{queueItems.join(', ')}
</div>
<div
style={{
display: 'grid',
gridTemplateColumns: 'repeat(2, 1fr)',
gap: '8px',
maxWidth: '600px',
margin: '16px 0',
}}
>
<button
onClick={() => {
const nextNumber = queueItems.length
? queueItems[queueItems.length - 1]! + 1
: 1
addItem(nextNumber)
}}
disabled={isFull}
>
{'Add Number'}
</button>
<button
disabled={isEmpty}
onClick={() => {
queuer.execute()
}}
>
{'Process Next'}
</button>
<button onClick={() => queuer.clear()} disabled={isEmpty}>
{'Clear Queue'}
</button>
<button onClick={() => queuer.reset()} disabled={isEmpty}>
{'Reset Queue'}
</button>
<button onClick={() => queuer.start()} disabled={isRunning}>
{'Start Processing'}
</button>
<button onClick={() => queuer.stop()} disabled={!isRunning}>
{'Stop Processing'}
</button>
</div>
</>
)}
</queuer.Subscribe>
<queuer.Subscribe selector={(state) => state}>
{(state) => (
<pre style={{ marginTop: '20px' }}>
{JSON.stringify(state, null, 2)}
</pre>
)}
</queuer.Subscribe>
</div>
)
}
function App2() {
const [currentValue, setCurrentValue] = useState(50)
const [queuedValue, setQueuedValue] = useState(50)
const [submittedCount, setSubmittedCount] = useState(0)
const [, addItem, queuer] = useQueuedState(
(item: number) => {
setQueuedValue(item)
},
{
maxSize: 100,
started: true,
wait: 100,
},
)
function handleRangeChange(e: Event & { currentTarget: HTMLInputElement }) {
const newValue = parseInt(e.currentTarget.value, 10)
setCurrentValue(newValue)
setSubmittedCount((c) => c + 1)
addItem(newValue)
}
return (
<div>
<h1>{'TanStack Pacer useQueuedState Example 2'}</h1>
<div style={{ marginBottom: '20px' }}>
<label>
{'Current Range:'}
<input
type="range"
min="0"
max="100"
value={currentValue}
onInput={handleRangeChange}
style={{ width: '100%' }}
/>
<span>{currentValue}</span>
</label>
</div>
<div style={{ marginBottom: '20px' }}>
<label>
{'Queued Range (Readonly):'}
<input
type="range"
min="0"
max="100"
value={queuedValue}
disabled
style={{ width: '100%' }}
/>
<span>{queuedValue}</span>
</label>
</div>
<table>
<tbody>
<queuer.Subscribe
selector={(state) => ({
size: state.size,
isFull: state.isFull,
isEmpty: state.isEmpty,
isIdle: state.isIdle,
status: state.status,
executionCount: state.executionCount,
})}
>
{({ size, isFull, isEmpty, isIdle, status, executionCount }) => (
<>
<tr>
<td>{'Queue Size:'}</td>
<td>{size}</td>
</tr>
<tr>
<td>{'Queue Full:'}</td>
<td>{isFull ? 'Yes' : 'No'}</td>
</tr>
<tr>
<td>{'Queue Empty:'}</td>
<td>{isEmpty ? 'Yes' : 'No'}</td>
</tr>
<tr>
<td>{'Queue Idle:'}</td>
<td>{isIdle ? 'Yes' : 'No'}</td>
</tr>
<tr>
<td>{'Queuer Status:'}</td>
<td>{status}</td>
</tr>
<tr>
<td>{'Values Submitted:'}</td>
<td>{submittedCount}</td>
</tr>
<tr>
<td>{'Items Processed:'}</td>
<td>{executionCount}</td>
</tr>
<tr>
<td>{'Pending Items:'}</td>
<td>{size}</td>
</tr>
</>
)}
</queuer.Subscribe>
</tbody>
</table>
<div style={{ color: '#666', fontSize: '0.9em' }}>
<p>{'Queued with 100ms wait time'}</p>
</div>
<queuer.Subscribe selector={(state) => state}>
{(state) => (
<pre style={{ marginTop: '20px' }}>
{JSON.stringify(state, null, 2)}
</pre>
)}
</queuer.Subscribe>
</div>
)
}
function PacerExample() {
return (
<div>
<App1 />
<hr />
<App2 />
</div>
)
}
createRoot(document.getElementById('app')!).render(PacerExample)