(options: UseStreamingStateOptions)
| 92 | * ``` |
| 93 | */ |
| 94 | export function useStreamingState(options: UseStreamingStateOptions) { |
| 95 | const { |
| 96 | surfaceId, |
| 97 | containerRef, |
| 98 | preserveScroll = true, |
| 99 | preserveFocus = true, |
| 100 | } = options; |
| 101 | |
| 102 | const isRestoring = ref(false); |
| 103 | |
| 104 | /** |
| 105 | * Save current scroll positions within the container |
| 106 | */ |
| 107 | function saveScrollPositions(): void { |
| 108 | if (!preserveScroll || !containerRef.value) return; |
| 109 | |
| 110 | const state = getPreservedState(surfaceId); |
| 111 | state.scrollPositions.clear(); |
| 112 | |
| 113 | // Save container scroll position |
| 114 | state.scrollPositions.set('__container__', { |
| 115 | top: containerRef.value.scrollTop, |
| 116 | left: containerRef.value.scrollLeft, |
| 117 | }); |
| 118 | |
| 119 | // Save scroll positions of scrollable children |
| 120 | const scrollableElements = containerRef.value.querySelectorAll('[data-scroll-preserve]'); |
| 121 | scrollableElements.forEach((el) => { |
| 122 | const id = el.getAttribute('data-scroll-preserve') || el.id; |
| 123 | if (id) { |
| 124 | state.scrollPositions.set(id, { |
| 125 | top: (el as HTMLElement).scrollTop, |
| 126 | left: (el as HTMLElement).scrollLeft, |
| 127 | }); |
| 128 | } |
| 129 | }); |
| 130 | } |
| 131 | |
| 132 | /** |
| 133 | * Restore saved scroll positions |
| 134 | */ |
| 135 | function restoreScrollPositions(): void { |
| 136 | if (!preserveScroll || !containerRef.value) return; |
| 137 | |
| 138 | const state = getPreservedState(surfaceId); |
| 139 | |
| 140 | // Restore container scroll position |
| 141 | const containerScroll = state.scrollPositions.get('__container__'); |
| 142 | if (containerScroll) { |
| 143 | containerRef.value.scrollTop = containerScroll.top; |
| 144 | containerRef.value.scrollLeft = containerScroll.left; |
| 145 | } |
| 146 | |
| 147 | // Restore scroll positions of scrollable children |
| 148 | state.scrollPositions.forEach((pos, id) => { |
| 149 | if (id === '__container__') return; |
| 150 | |
| 151 | const el = containerRef.value?.querySelector(`[data-scroll-preserve="${id}"]`) |
nothing calls this directly
no test coverage detected