diff --git a/src/components/Timeline.vue b/src/components/Timeline.vue index 11eb5bc7..a1c72626 100644 --- a/src/components/Timeline.vue +++ b/src/components/Timeline.vue @@ -87,7 +87,7 @@ @@ -235,18 +235,15 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) { } /** Recreate everything */ - async refresh(preservePosition = false) { - // Get current scroll position - const origScroll = (this.$refs.recycler).$el.scrollTop; - - // Reset state + async refresh() { await this.resetState(); await this.createState(); + } - // Restore scroll position - if (preservePosition) { - (this.$refs.recycler).scrollToPosition(origScroll); - } + /** Re-process days */ + async softRefresh() { + this.selectionManager.clearSelection(); + await this.fetchDays(true); } /** Do resize after some time */ @@ -342,9 +339,19 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) { } } + // Check if this was requested by a refresh + const force = this.currentEnd === -1; + // Make sure we don't do this too often this.currentStart = startIndex; this.currentEnd = endIndex; + + // Check if this was requested specifically + if (force) { + this.loadScrollChanges(startIndex, endIndex); + return; + } + setTimeout(() => { // Get the overlapping range between startIndex and // currentStart and endIndex and currentEnd. @@ -472,7 +479,7 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) { } /** Fetch timeline main call */ - async fetchDays() { + async fetchDays(noCache=false) { let url = '/apps/memories/api/days'; let params: any = {}; @@ -480,6 +487,9 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) { let cache: IDay[]; const cacheUrl = window.location.pathname + 'api/days'; + // Make sure to refresh scroll later + this.currentEnd = -1; + try { this.loading++; const startState = this.state; @@ -493,7 +503,7 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) { data = await dav.getPeopleData(); } else { // Try the cache - cache = await utils.getCachedData(cacheUrl); + cache = noCache ? null : (await utils.getCachedData(cacheUrl)); if (cache) { await this.processDays(cache); this.loading--; @@ -578,8 +588,17 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) { heads[day.dayid] = head; list.push(head); + // Dummy rows for placeholders + let nrows = Math.ceil(day.count / this.numCols); + + // Check if already loaded - we can learn + let prevRows: IRow[] | null = null; + if (this.loadedDays.has(day.dayid)) { + prevRows = this.heads[day.dayid]?.day.rows; + nrows = prevRows?.length || nrows; + } + // Add rows - const nrows = Math.ceil(day.count / this.numCols); for (let i = 0; i < nrows; i++) { const row = this.addRow(day); list.push(row); @@ -588,6 +607,12 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) { const leftNum = (day.count - i * this.numCols); row.pct = leftNum > this.numCols ? this.numCols : leftNum; row.photos = []; + + // Learn from existing row + if (prevRows && i < prevRows.length) { + row.size = prevRows[i].size; + row.photos = prevRows[i].photos; + } } // Continue processing