Skip to main content

DynamicLoader

Pro class that owns range caching, preloading, debounce, and in-flight coordination for range-based event loading. It fetches events through injected transport code and dispatches provide-data batches back to the store. Constructing a loader makes it active; the boolean config form is not an enable/disable switch.

Usage

class DynamicLoader {
constructor(config: DynamicLoadingConfig, infra: DynamicLoaderInfra);
request(requestData: RequestDataAction): Promise<void>;
}

type DynamicLoadingConfig =
| boolean
| {
debounce?: number;
reset?: boolean;
cache?: boolean | number;
preload?: false | "day" | "month" | "year";
};

type DynamicLoaderInfra = {
fetch(range: { startDate: Date; endDate: Date }): Promise<CalendarEvent[]>;
dispatch(action: {
data: { events: CalendarEvent[] };
reset?: boolean;
}): unknown;
};

true is shorthand for all defaults.

OptionTypeDefaultBehavior
debouncenumber0Delay processing and collapse a burst of ranges to its latest one.
resetbooleanfalseAdd reset: true to every dispatched provide-data payload.
cacheboolean | numbertruetrue: no expiry; false: evict before every request; number: TTL in seconds.
preloadfalse | "day" | "month" | "year"falseWiden both range edges to the local day, month, or year boundary before cache checks.

infra.fetch returns the events for a range; infra.dispatch pushes a provide-data payload. request() resolves once the range has been processed.

Example

<script setup>
import { Calendar, DynamicLoader } from "@svar-ui/vue-calendar";

function init(api) {
const loader = new DynamicLoader(
{ preload: "month", cache: 300 },
{
fetch: ({ startDate, endDate }) => fetchEvents(startDate, endDate),
dispatch: data => api.exec("provide-data", data),
}
);

api.on("request-data", data => loader.request(data));
}
</script>

<template>
<Calendar :events="[]" :init="init" />
</template>