Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
7f1f47b
fix: prefetch 계산 로직 수정
zaewc Mar 28, 2026
b67e2d6
refector: react/shared가 구현/테스트 모두 소유하도록 변경
zaewc Mar 28, 2026
463d2ca
test(shared): achieve 100% unit test coverage
zaewc Mar 28, 2026
3d37d9e
fix: pattern simplify
zaewc Mar 28, 2026
faa36b6
Merge pull request #34 from 976520/test/shared-unit-test-coverage
zaewc Mar 28, 2026
8e938a2
feat(shared): add InfiniteSource as framework-agnostic state machine
zaewc Mar 29, 2026
3f8c04f
refactor(shared): replace useInfinitePages internals with InfiniteSource
zaewc Mar 29, 2026
680a2a5
chore(core): enforce stricter TypeScript compiler options
zaewc Mar 29, 2026
28da8e0
fix(shared): initialize InfiniteSource via useState lazy initializer
zaewc Mar 29, 2026
ca9fa69
Merge pull request #35 from zaewc/refactor/infinite-source
zaewc Mar 30, 2026
64e9b41
chore(vue): scaffold @scrolloop/vue package
zaewc Mar 30, 2026
05326b8
feat(vue): add VirtualList component
zaewc Mar 30, 2026
8d96995
feat(vue): add useInfinitePages composable
zaewc Mar 30, 2026
d5ff794
feat(vue): add InfiniteList component
zaewc Mar 30, 2026
67c81eb
feat(vue): export public API
zaewc Mar 30, 2026
f7aa7f5
chore(svelte): scaffold @scrolloop/svelte package
zaewc Mar 30, 2026
23b3d15
feat(svelte): add VirtualList component
zaewc Mar 30, 2026
3520a4a
feat(svelte): add createInfinitePages store
zaewc Mar 30, 2026
74798f7
feat(svelte): add InfiniteList component
zaewc Mar 30, 2026
b0beef5
feat(svelte): export public API
zaewc Mar 30, 2026
a156391
chore: update lockfile for @scrolloop/svelte
zaewc Mar 30, 2026
c09f04a
chore: update lockfile for @scrolloop/vue
zaewc Mar 30, 2026
0456448
perf(svelte): use total+pages instead of allItems in InfiniteList
zaewc Mar 30, 2026
96c82cc
perf(vue): use total+pages instead of allItems in InfiniteList
zaewc Mar 30, 2026
e40f263
style(vue): extract inline styles to CSS classes in InfiniteList
zaewc Mar 30, 2026
6d1d997
style(svelte): extract inline styles to CSS classes in InfiniteList
zaewc Mar 30, 2026
c4438b0
refactor(svelte): replace onMount/onDestroy with $effect in VirtualList
zaewc Mar 30, 2026
01b99fc
chore(svelte): remove unused types.ts
zaewc Mar 30, 2026
104c1f9
fix(svelte): prevent $effect re-run on scroll by tracking prev with l…
zaewc Mar 30, 2026
6ce7b3e
feat(svelte): add prefetchThreshold prop to InfiniteList
zaewc Mar 30, 2026
841f178
fix(vue): make useInfinitePages reactive to option changes via watch
zaewc Mar 30, 2026
48883a4
Merge pull request #38 from zaewc/feat/svelte-adapter
zaewc Mar 30, 2026
6ef6ac7
Merge branch 'develop' of https://github.com/zaewc/scrolloop into fea…
zaewc Mar 30, 2026
de22a46
Merge pull request #36 from zaewc/feat/vue-adapter
zaewc Mar 30, 2026
551875f
chore: test coverage
zaewc Mar 30, 2026
62b17c1
chore: update lockfile
zaewc Mar 30, 2026
d6e757c
fix: handleRangeChange 함수가 findMissingPages의 반환값을 활용하도록 ㅅ정
zaewc Mar 30, 2026
02235bf
version
zaewc Mar 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "scrolloop",
"version": "0.4.0",
"version": "0.5.0",
"repository": {
"type": "git",
"url": "git+https://github.com/976520/scrolloop.git"
Expand Down
8 changes: 4 additions & 4 deletions packages/core/src/virtualizer/Virtualizer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,16 @@ export class Virtualizer {
#count: number;
readonly #overscan: number;
#plugins: Plugin[];
readonly #onChange?: (state: VirtualizerState) => void;
readonly #onChange: ((state: VirtualizerState) => void) | undefined;

readonly #layoutStrategy: LayoutStrategy;
readonly #scrollSource: ScrollSource;

#state: VirtualizerState;
readonly #unsubscribe?: () => void;
readonly #unsubscribe: (() => void) | undefined;

#prevRenderRange?: { startIndex: number; endIndex: number };
#prevVirtualItems?: VirtualItem[];
#prevRenderRange: { startIndex: number; endIndex: number } | undefined;
#prevVirtualItems: VirtualItem[] | undefined;

constructor(
layoutStrategy: LayoutStrategy,
Expand Down
5 changes: 4 additions & 1 deletion packages/core/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
"outDir": "./dist",
"declaration": true,
"declarationMap": true,
"types": ["vitest/globals"]
"types": ["vitest/globals"],
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true,
"noImplicitOverride": true
},
"include": ["src/**/*", "tsup.config.ts"],
"exclude": ["node_modules", "dist", "**/*.test.ts"]
Expand Down
15 changes: 8 additions & 7 deletions packages/react-native/src/components/InfiniteList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,19 +57,20 @@ function InfiniteListInner<T>(props: InfiniteListProps<T>) {
]);

const handleRangeChange = (range: Range) => {
const prefetchStart = Math.max(
0,
Math.floor(range.startIndex / pageSize) -
Math.floor(range.endIndex / pageSize)
);
const prefetchStart = Math.floor(range.startIndex / pageSize);
const prefetchEnd =
Math.floor(range.endIndex / pageSize) +
prefetchThreshold +
Math.ceil(overscan / pageSize);

findMissingPages(prefetchStart, prefetchEnd, pages, loadingPages);
const missingPages = findMissingPages(
prefetchStart,
prefetchEnd,
pages,
loadingPages
);

for (let page = prefetchStart; page <= prefetchEnd; page++) {
for (const page of missingPages) {
loadPage(page);
}
};
Expand Down
9 changes: 3 additions & 6 deletions packages/react/src/components/InfiniteList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -130,16 +130,13 @@ function InfiniteListInner<T>(props: InfiniteListProps<T>) {
scrollTopRef.current = containerRef.current?.scrollTop ?? 0;
return;
}
const ps = Math.max(
0,
((range.startIndex / pageSize) | 0) - ((range.endIndex / pageSize) | 0)
);
const ps = (range.startIndex / pageSize) | 0;
const pe =
((range.endIndex / pageSize) | 0) +
prefetchThreshold +
Math.ceil(overscan / pageSize);
findMissingPages(ps, pe, mergedPages, loadingPages);
for (let p = ps; p <= pe; p++) loadPage(p);
const missingPages = findMissingPages(ps, pe, mergedPages, loadingPages);
for (const p of missingPages) loadPage(p);
},
[
isServerSide,
Expand Down
103 changes: 0 additions & 103 deletions packages/react/src/hooks/useInfinitePages.ts

This file was deleted.

17 changes: 0 additions & 17 deletions packages/react/src/utils/canLoadPage.ts

This file was deleted.

13 changes: 0 additions & 13 deletions packages/react/src/utils/findMissingPages.ts

This file was deleted.

3 changes: 3 additions & 0 deletions packages/shared/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@
"react": ">=18.0.0"
},
"devDependencies": {
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^14.3.1",
"jsdom": "^24.1.3",
"react": "^18.2.0",
"tsup": "^8.0.0",
"typescript": "^5.0.0",
Expand Down
Loading
Loading