feat: add pagination state and offset to session API calls
Made-with: Cursor
This commit is contained in:
@@ -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'
|
||||||
|
|||||||
Reference in New Issue
Block a user