atmosphere explorer pdsls.dev
atproto tool typescript

add limit parameter

juli.ee 27210d9f b23dcadc

verified
Changed files
+15 -4
src
+1
src/utils/route-cache.ts
··· 5 cursor: string | undefined; 6 scrollY: number; 7 reverse: boolean; 8 } 9 10 type RouteCache = Record<string, CollectionCacheEntry>;
··· 5 cursor: string | undefined; 6 scrollY: number; 7 reverse: boolean; 8 + limit: number; 9 } 10 11 type RouteCache = Record<string, CollectionCacheEntry>;
+14 -4
src/views/collection.tsx
··· 40 toDelete: boolean; 41 } 42 43 - const LIMIT = 100; 44 45 const RecordLink = (props: { record: AtprotoRecord }) => { 46 const [hover, setHover] = createSignal(false); ··· 98 const [batchDelete, setBatchDelete] = createSignal(false); 99 const [lastSelected, setLastSelected] = createSignal<number>(); 100 const [reverse, setReverse] = createSignal(searchParams.reverse === "true"); 101 const [recreate, setRecreate] = createSignal(false); 102 const [openDelete, setOpenDelete] = createSignal(false); 103 const [restoredFromCache, setRestoredFromCache] = createSignal(false); ··· 113 setRecords(cached.records as AtprotoRecord[]); 114 setCursor(cached.cursor); 115 setReverse(cached.reverse); 116 - setSearchParams({ reverse: cached.reverse ? "true" : undefined }); 117 setRestoredFromCache(true); 118 requestAnimationFrame(() => { 119 window.scrollTo(0, cached.scrollY); ··· 131 cursor: cursor(), 132 scrollY: window.scrollY, 133 reverse: reverse(), 134 }); 135 } else { 136 clearCollectionCache(cacheKey()); ··· 152 params: { 153 repo: did as ActorIdentifier, 154 collection: params.collection as `${string}.${string}.${string}`, 155 - limit: LIMIT, 156 cursor: cursor(), 157 reverse: reverse(), 158 }, 159 }); 160 if (!res.ok) throw new Error(res.data.error); 161 - setCursor(res.data.records.length < LIMIT ? undefined : res.data.cursor); 162 const tmpRecords: AtprotoRecord[] = []; 163 res.data.records.forEach((record) => { 164 const rkey = record.uri.split("/").pop()!;
··· 40 toDelete: boolean; 41 } 42 43 + const DEFAULT_LIMIT = 100; 44 45 const RecordLink = (props: { record: AtprotoRecord }) => { 46 const [hover, setHover] = createSignal(false); ··· 98 const [batchDelete, setBatchDelete] = createSignal(false); 99 const [lastSelected, setLastSelected] = createSignal<number>(); 100 const [reverse, setReverse] = createSignal(searchParams.reverse === "true"); 101 + const limit = () => { 102 + const limitParam = 103 + Array.isArray(searchParams.limit) ? searchParams.limit[0] : searchParams.limit; 104 + const paramLimit = parseInt(limitParam || ""); 105 + return !isNaN(paramLimit) && paramLimit > 0 && paramLimit <= 100 ? paramLimit : DEFAULT_LIMIT; 106 + }; 107 const [recreate, setRecreate] = createSignal(false); 108 const [openDelete, setOpenDelete] = createSignal(false); 109 const [restoredFromCache, setRestoredFromCache] = createSignal(false); ··· 119 setRecords(cached.records as AtprotoRecord[]); 120 setCursor(cached.cursor); 121 setReverse(cached.reverse); 122 + setSearchParams({ 123 + reverse: cached.reverse ? "true" : undefined, 124 + limit: cached.limit !== DEFAULT_LIMIT ? cached.limit.toString() : undefined, 125 + }); 126 setRestoredFromCache(true); 127 requestAnimationFrame(() => { 128 window.scrollTo(0, cached.scrollY); ··· 140 cursor: cursor(), 141 scrollY: window.scrollY, 142 reverse: reverse(), 143 + limit: limit(), 144 }); 145 } else { 146 clearCollectionCache(cacheKey()); ··· 162 params: { 163 repo: did as ActorIdentifier, 164 collection: params.collection as `${string}.${string}.${string}`, 165 + limit: limit(), 166 cursor: cursor(), 167 reverse: reverse(), 168 }, 169 }); 170 if (!res.ok) throw new Error(res.data.error); 171 + setCursor(res.data.records.length < limit() ? undefined : res.data.cursor); 172 const tmpRecords: AtprotoRecord[] = []; 173 res.data.records.forEach((record) => { 174 const rkey = record.uri.split("/").pop()!;