You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.6 KiB
77 lines
2.6 KiB
import { createActiveCurrency } from './currency/active-currency.svelte';
|
|
import { createActiveDates } from './dates/active-dates.svelte';
|
|
import { createActiveNumbers } from './numbers/active-numbers.svelte';
|
|
import { createActiveUnits } from './units/active-units.svelte';
|
|
import { createActiveFormatLocaleSource } from './active-runtime.svelte';
|
|
import type { ActiveCurrency, ActiveCurrencyOptions } from './currency';
|
|
import type { ActiveDates, ActiveDatesOptions } from './dates';
|
|
import type { ActiveNumbers, ActiveNumbersOptions } from './numbers';
|
|
import type { ActiveUnits, ActiveUnitsOptions } from './units';
|
|
import type { FormatLocaleSource } from './types';
|
|
|
|
export interface ActiveFormatOptions {
|
|
locale?: string;
|
|
localeSource?: FormatLocaleSource;
|
|
numbers?: Omit<ActiveNumbersOptions, 'locale' | 'localeSource'>;
|
|
currency?: Omit<ActiveCurrencyOptions, 'locale' | 'localeSource' | 'numbers'>;
|
|
units?: Omit<ActiveUnitsOptions, 'locale' | 'localeSource' | 'numbers'>;
|
|
dates?: Omit<ActiveDatesOptions, 'locale' | 'localeSource'>;
|
|
}
|
|
|
|
export interface ActiveFormat {
|
|
readonly numbers: ActiveNumbers;
|
|
readonly currency: ActiveCurrency;
|
|
readonly units: ActiveUnits;
|
|
readonly dates: ActiveDates;
|
|
getLocale: () => string;
|
|
setLocale: (locale: string) => void;
|
|
/**
|
|
* `true` once `dispose()` has been called. After dispose,
|
|
* `setLocale()` is a silent no-op so a late event from a locale
|
|
* source doesn't reach the already-disposed sub-engines.
|
|
*/
|
|
readonly disposed: boolean;
|
|
/** Idempotent. Disposes every sub-engine in stable order. */
|
|
dispose: () => void;
|
|
}
|
|
|
|
export function createActiveFormat(options: ActiveFormatOptions = {}): ActiveFormat {
|
|
const localeState = createActiveFormatLocaleSource(options);
|
|
const localeSource = localeState.source;
|
|
|
|
const numbers = createActiveNumbers({ ...options.numbers, localeSource });
|
|
const currency = createActiveCurrency({ ...options.currency, localeSource, numbers });
|
|
const units = createActiveUnits({ ...options.units, localeSource, numbers });
|
|
const dates = createActiveDates({ ...options.dates, localeSource });
|
|
let disposed = false;
|
|
|
|
function setLocale(nextLocale: string): void {
|
|
if (disposed) return;
|
|
localeState.setLocale(nextLocale);
|
|
numbers.setLocale(nextLocale);
|
|
currency.setLocale(nextLocale);
|
|
units.setLocale(nextLocale);
|
|
dates.setLocale(nextLocale);
|
|
}
|
|
|
|
return {
|
|
numbers,
|
|
currency,
|
|
units,
|
|
dates,
|
|
getLocale: () => numbers.getLocale(),
|
|
setLocale,
|
|
get disposed() {
|
|
return disposed;
|
|
},
|
|
dispose() {
|
|
if (disposed) return;
|
|
disposed = true;
|
|
numbers.dispose();
|
|
currency.dispose();
|
|
units.dispose();
|
|
dates.dispose();
|
|
}
|
|
};
|
|
}
|