Skip to content

Commit

Permalink
Extract ViewRenderOptions
Browse files Browse the repository at this point in the history
Introduce the `ViewRenderOptions` to store the
`resume()` function dispatched with the `turbo:before-render` event.

Future commits will add additional properties to this option interface.
  • Loading branch information
seanpdoyle committed Jul 18, 2022
1 parent 4ce1594 commit dd86c23
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 10 deletions.
4 changes: 3 additions & 1 deletion src/core/drive/page_view.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { nextEventLoopTick } from "../../util"
import { View, ViewDelegate } from "../view"
import { View, ViewDelegate, ViewRenderOptions } from "../view"
import { ErrorRenderer } from "./error_renderer"
import { PageRenderer } from "./page_renderer"
import { PageSnapshot } from "./page_snapshot"
import { SnapshotCache } from "./snapshot_cache"
import { Visit } from "./visit"

export type PageViewRenderOptions = ViewRenderOptions

export interface PageViewDelegate extends ViewDelegate<HTMLBodyElement, PageSnapshot> {
viewWillCacheSnapshot(): void
}
Expand Down
4 changes: 2 additions & 2 deletions src/core/frames/frame_controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { AppearanceObserver, AppearanceObserverDelegate } from "../../observers/
import { clearBusyState, getAttribute, parseHTMLDocument, markAsBusy } from "../../util"
import { FormSubmission, FormSubmissionDelegate } from "../drive/form_submission"
import { Snapshot } from "../snapshot"
import { ViewDelegate } from "../view"
import { ViewDelegate, ViewRenderOptions } from "../view"
import { getAction, expandURL, urlsAreEqual, locationIsVisitable } from "../url"
import { FormInterceptor, FormInterceptorDelegate } from "./form_interceptor"
import { FrameView } from "./frame_view"
Expand Down Expand Up @@ -252,7 +252,7 @@ export class FrameController

// View delegate

allowsImmediateRender(_snapshot: Snapshot, _resume: (value: any) => void) {
allowsImmediateRender(_snapshot: Snapshot, _options: ViewRenderOptions) {
return true
}

Expand Down
10 changes: 5 additions & 5 deletions src/core/session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { StreamMessage } from "./streams/stream_message"
import { StreamObserver } from "../observers/stream_observer"
import { Action, Position, StreamSource, isAction } from "./types"
import { clearBusyState, dispatch, markAsBusy } from "../util"
import { PageView, PageViewDelegate } from "./drive/page_view"
import { PageView, PageViewDelegate, PageViewRenderOptions } from "./drive/page_view"
import { Visit, VisitOptions } from "./drive/visit"
import { PageSnapshot } from "./drive/page_snapshot"
import { FrameElement } from "../elements/frame_element"
Expand Down Expand Up @@ -259,8 +259,8 @@ export class Session
}
}

allowsImmediateRender({ element }: PageSnapshot, resume: (value: any) => void) {
const event = this.notifyApplicationBeforeRender(element, resume)
allowsImmediateRender({ element }: PageSnapshot, options: PageViewRenderOptions) {
const event = this.notifyApplicationBeforeRender(element, options)
return !event.defaultPrevented
}

Expand Down Expand Up @@ -323,9 +323,9 @@ export class Session
return dispatch<TurboBeforeCacheEvent>("turbo:before-cache")
}

notifyApplicationBeforeRender(newBody: HTMLBodyElement, resume: (value: any) => void) {
notifyApplicationBeforeRender(newBody: HTMLBodyElement, options: PageViewRenderOptions) {
return dispatch<TurboBeforeRenderEvent>("turbo:before-render", {
detail: { newBody, resume },
detail: { newBody, ...options },
cancelable: true,
})
}
Expand Down
9 changes: 7 additions & 2 deletions src/core/view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,12 @@ import { Snapshot } from "./snapshot"
import { Position } from "./types"
import { getAnchor } from "./url"

export interface ViewRenderOptions {
resume: (value: any) => void
}

export interface ViewDelegate<E extends Element, S extends Snapshot<E>> {
allowsImmediateRender(snapshot: S, resume: (value: any) => void): boolean
allowsImmediateRender(snapshot: S, options: ViewRenderOptions): boolean
preloadOnLoadLinksForView(element: Element): void
viewRenderedSnapshot(snapshot: S, isPreview: boolean): void
viewInvalidated(reason: ReloadReason): void
Expand Down Expand Up @@ -85,7 +89,8 @@ export abstract class View<
this.prepareToRenderSnapshot(renderer)

const renderInterception = new Promise((resolve) => (this.resolveInterceptionPromise = resolve))
const immediateRender = this.delegate.allowsImmediateRender(snapshot, this.resolveInterceptionPromise)
const options = { resume: this.resolveInterceptionPromise }
const immediateRender = this.delegate.allowsImmediateRender(snapshot, options)
if (!immediateRender) await renderInterception

await this.renderSnapshot(renderer)
Expand Down

0 comments on commit dd86c23

Please sign in to comment.