feat: add pagination state and offset to session API calls

Made-with: Cursor
This commit is contained in:
cottongin
2026-03-23 11:32:59 -04:00
parent db369a807e
commit ad8efc0fbf

View File

@@ -15,6 +15,8 @@ function History() {
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [totalCount, setTotalCount] = useState(0); const [totalCount, setTotalCount] = useState(0);
const [absoluteTotal, setAbsoluteTotal] = useState(0); const [absoluteTotal, setAbsoluteTotal] = useState(0);
const [page, setPage] = useState(1);
const [prevLastDate, setPrevLastDate] = useState(null);
const [closingSession, setClosingSession] = useState(null); const [closingSession, setClosingSession] = useState(null);
const [filter, setFilter] = useState(() => localStorage.getItem(prefixKey(adminName, 'history-filter')) || 'default'); const [filter, setFilter] = useState(() => localStorage.getItem(prefixKey(adminName, 'history-filter')) || 'default');
@@ -29,18 +31,26 @@ function History() {
const loadSessions = useCallback(async () => { const loadSessions = useCallback(async () => {
try { try {
const limitNum = limit === 'all' ? null : parseInt(limit, 10);
const offset = limitNum ? (page - 1) * limitNum : 0;
const response = await api.get('/sessions', { const response = await api.get('/sessions', {
params: { filter, limit } params: { filter, limit, offset: offset || undefined }
}); });
setSessions(response.data); setSessions(response.data);
setTotalCount(parseInt(response.headers['x-total-count'] || '0', 10)); setTotalCount(parseInt(response.headers['x-total-count'] || '0', 10));
setAbsoluteTotal(parseInt(response.headers['x-absolute-total'] || '0', 10)); setAbsoluteTotal(parseInt(response.headers['x-absolute-total'] || '0', 10));
setPrevLastDate(response.headers['x-prev-last-date'] || null);
if (response.data.length === 0 && offset > 0) {
setPage(1);
}
} catch (err) { } catch (err) {
console.error('Failed to load sessions', err); console.error('Failed to load sessions', err);
} finally { } finally {
setLoading(false); setLoading(false);
} }
}, [filter, limit]); }, [filter, limit, page]);
useEffect(() => { useEffect(() => {
loadSessions(); loadSessions();
@@ -66,12 +76,14 @@ function History() {
setFilter(newFilter); setFilter(newFilter);
localStorage.setItem(prefixKey(adminName, 'history-filter'), newFilter); localStorage.setItem(prefixKey(adminName, 'history-filter'), newFilter);
setSelectedIds(new Set()); setSelectedIds(new Set());
setPage(1);
}; };
const handleLimitChange = (newLimit) => { const handleLimitChange = (newLimit) => {
setLimit(newLimit); setLimit(newLimit);
localStorage.setItem(prefixKey(adminName, 'history-show-limit'), newLimit); localStorage.setItem(prefixKey(adminName, 'history-show-limit'), newLimit);
setSelectedIds(new Set()); setSelectedIds(new Set());
setPage(1);
}; };
const handleCloseSession = async (sessionId, notes) => { const handleCloseSession = async (sessionId, notes) => {
@@ -102,6 +114,7 @@ function History() {
setSelectMode(false); setSelectMode(false);
setSelectedIds(new Set()); setSelectedIds(new Set());
setShowBulkDeleteConfirm(false); setShowBulkDeleteConfirm(false);
setPage(1);
}; };
const handlePointerDown = (sessionId) => { const handlePointerDown = (sessionId) => {
@@ -111,6 +124,7 @@ function History() {
longPressFired.current = true; longPressFired.current = true;
setSelectMode(true); setSelectMode(true);
setSelectedIds(new Set([sessionId])); setSelectedIds(new Set([sessionId]));
setPage(1);
}, 500); }, 500);
}; };
@@ -188,7 +202,7 @@ function History() {
</span> </span>
{isAuthenticated && ( {isAuthenticated && (
<button <button
onClick={selectMode ? exitSelectMode : () => setSelectMode(true)} onClick={selectMode ? exitSelectMode : () => { setSelectMode(true); setPage(1); }}
className={`px-3 py-1.5 rounded text-sm font-medium transition ${ className={`px-3 py-1.5 rounded text-sm font-medium transition ${
selectMode selectMode
? 'bg-indigo-600 dark:bg-indigo-700 text-white hover:bg-indigo-700 dark:hover:bg-indigo-800' ? 'bg-indigo-600 dark:bg-indigo-700 text-white hover:bg-indigo-700 dark:hover:bg-indigo-800'