@blueprintjs/datetime
Version:
Components for interacting with dates and times
79 lines • 3.39 kB
JavaScript
/*
* Copyright 2023 Palantir Technologies, Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.DateFnsLocalizedComponent = void 0;
const core_1 = require("@blueprintjs/core");
const dateFnsLocaleUtils_1 = require("../common/dateFnsLocaleUtils");
/**
* Abstract component which accepts a date-fns locale prop and loads the corresponding `Locale` object as necessary.
*
* Currently used by DatePicker, DateRangePicker, and DateRangeInput, but we would ideally migrate to the
* `useDateFnsLocale()` hook once those components are refactored into functional components.
*/
class DateFnsLocalizedComponent extends core_1.AbstractPureComponent {
constructor() {
super(...arguments);
// Keeping track of `isMounted` state is generally considered an anti-pattern, but since there is no way to
// cancel/abort dyanmic ES module `import()` calls to load the date-fns locale, this is the best way to avoid
// setting state on an unmounted component, which creates noise in the console (especially while running tests).
// N.B. this cannot be named `isMounted` because that conflicts with a React internal property.
this.isComponentMounted = false;
}
// HACKHACK: type fix for setState which does not accept partial state objects in our version of
// @types/react (v16.14.x)
setState(nextStateOrAction, callback) {
if (typeof nextStateOrAction === "function") {
super.setState(nextStateOrAction, callback);
}
else {
super.setState(nextStateOrAction);
}
}
async componentDidMount() {
this.isComponentMounted = true;
await this.loadLocale(this.props.locale);
}
async componentDidUpdate(prevProps) {
if (this.props.locale !== prevProps.locale) {
await this.loadLocale(this.props.locale);
}
}
componentWillUnmount() {
this.isComponentMounted = false;
}
async loadLocale(localeOrCode) {
var _a, _b;
if (localeOrCode === undefined) {
return;
}
else if (((_a = this.state.locale) === null || _a === void 0 ? void 0 : _a.code) === localeOrCode) {
return;
}
if (typeof localeOrCode === "string") {
const loader = (_b = this.props.dateFnsLocaleLoader) !== null && _b !== void 0 ? _b : dateFnsLocaleUtils_1.loadDateFnsLocale;
const locale = await loader(localeOrCode);
if (this.isComponentMounted) {
this.setState({ locale });
}
}
else {
this.setState({ locale: localeOrCode });
}
}
}
exports.DateFnsLocalizedComponent = DateFnsLocalizedComponent;
//# sourceMappingURL=dateFnsLocalizedComponent.js.map
;