@brightsoftware/date-np
Version:
Simple & minimal Nepali date picker that just works.
242 lines (241 loc) • 7.26 kB
JavaScript
import { jsx as F } from "react/jsx-runtime";
import { createContext as O, useContext as b, useState as x } from "react";
import { NepaliDate as a } from "../NepaliDate.js";
import { MAX_AD_YEAR as V, MIN_AD_YEAR as I } from "../../data/constants.js";
import { compareDates as T } from "../../utils/validators.js";
const N = O(null), q = () => {
const c = b(N);
if (!c)
throw new Error("usePicker must be used within a PickerProvider");
const { setPickerState: o } = c, f = (e, t) => {
const { onSelect: n } = c.pickerState;
n && t && e && n(e), o((i) => ({
...i,
selectedDate: e
}));
}, g = (e) => {
let t = 0, n = 0;
e > 11 ? (t = Math.floor(e / 12), n = e % 12) : e < 0 ? (t = Math.floor(e / 12), n = 12 + e % 12) : n = e, o((i) => ({
...i,
activeYear: i.activeYear + t,
activeMonth: n
}));
}, y = (e) => {
o((t) => t.isVisible === e ? t : {
...t,
isVisible: e
});
}, A = (e, t) => {
o((n) => ({
...n,
mode: n.mode === e ? t : e
}));
}, Y = (e) => {
o((t) => ({
...t,
mode: e
}));
}, d = (e) => {
o((t) => ({
...t,
activeYear: e
}));
}, k = (e) => {
o((t) => {
if (t.locale === e) return t;
const n = t.selectedDate;
if (!n) {
let r;
return e === "ne" ? t.minDate ? r = a.fromADDate(t.minDate) : r = a.fromADDate(t.today) : t.minDate ? r = t.minDate : r = t.today, {
...t,
activeMonth: r.getMonth(),
activeYear: r.getFullYear(),
locale: e
};
}
const i = e === "ne" ? n instanceof a ? n : a.fromADDate(n) : n instanceof Date ? n : n.toADDate();
return {
...t,
activeMonth: i.getMonth(),
activeYear: i.getFullYear(),
selectedDate: i,
locale: e
};
});
}, M = () => {
const { minDate: e, locale: t } = c.pickerState;
return e ? e instanceof a ? e.toADDate() : e : new Date(I, 0, 1);
}, v = () => {
const { maxDate: e, locale: t } = c.pickerState;
return e ? e instanceof a ? e.toADDate() : e : new Date(V, 11, 31);
};
return {
...c,
updatePickerDay: f,
updatePickerMonth: g,
togglePickerMode: A,
updatePickerMode: Y,
updatePickerYear: d,
changePickerLocale: k,
updatePickerVisiblity: y,
getEffectiveMinDate: M,
getEffectiveMaxDate: v,
isDateInRange: (e) => {
const t = e instanceof a ? e.toADDate() : e, n = M(), i = v(), r = t.getTime(), s = n.getTime(), m = i.getTime();
return r >= s && r <= m;
},
canNavigateToPreviousMonth: () => {
const { activeYear: e, activeMonth: t, locale: n } = c.pickerState, i = M();
let r = t - 1, s = e;
r < 0 && (r = 11, s = s - 1);
let m;
if (n === "ne") {
const p = new a(
s,
r,
1
).getDaysInMonth();
m = new a(
s,
r,
p
).toADDate();
} else
m = new Date(s, r + 1, 0);
return m.getTime() >= i.getTime();
},
canNavigateToNextMonth: () => {
const { activeYear: e, activeMonth: t, locale: n } = c.pickerState, i = v();
let r = t + 1, s = e;
return r > 11 && (r = 0, s = s + 1), (n === "ne" ? new a(s, r, 1).toADDate() : new Date(s, r, 1)).getTime() <= i.getTime();
},
canNavigateToPreviousYear: () => {
const { activeYear: e, locale: t } = c.pickerState, n = M(), i = e - 1;
return (t === "ne" ? new a(i, 11, 30).toADDate() : new Date(i, 11, 31)).getTime() >= n.getTime();
},
canNavigateToNextYear: () => {
const { activeYear: e, locale: t } = c.pickerState, n = v(), i = e + 1;
return (t === "ne" ? new a(i, 0, 1).toADDate() : new Date(i, 0, 1)).getTime() <= n.getTime();
},
resetToOriginalState: () => {
const { minDate: e, today: t } = c.pickerState, i = (() => {
if (e) {
const r = (e instanceof Date, e);
return {
month: r.getMonth(),
year: r.getFullYear()
};
}
return {
month: t.getMonth(),
year: t.getFullYear()
};
})();
o((r) => ({
...r,
activeMonth: i.month,
activeYear: i.year,
mode: "date"
// Don't reset selectedDate - keep it as is
}));
},
getDisplayDate: () => {
const { selectedDate: e, defaultDate: t } = c.pickerState;
return e || t || null;
},
setMinDate: (e) => {
o((t) => ({
...t,
minDate: e
})), e instanceof a && e.getFullYear() !== new a()._year && e.getMonth() !== new a().getMonth() && o((t) => ({
...t,
activeYear: e.getFullYear(),
activeMonth: e.getMonth()
})), e instanceof Date && e.getFullYear() !== new a()._year && e.getMonth() !== new a().getMonth() && o((t) => ({
...t,
activeYear: e.getFullYear(),
activeMonth: e.getMonth()
}));
},
setMaxDate: (e) => {
o((t) => ({
...t,
maxDate: e
})), e instanceof a && e.getFullYear() !== new a()._year && e.getMonth() !== new a().getMonth() && o((t) => ({
...t,
activeYear: e.getFullYear(),
activeMonth: e.getMonth()
})), e instanceof Date && e.getFullYear() !== new a()._year && e.getMonth() !== new a().getMonth() && o((t) => ({
...t,
activeYear: e.getFullYear(),
activeMonth: e.getMonth()
}));
}
};
}, w = ({
children: c,
minDate: o,
maxDate: f,
defaultDate: g,
defaultLocale: y = "AD",
onSelect: A
}) => {
const Y = /* @__PURE__ */ new Date(), d = () => {
if (!g) return !1;
let D = !0;
return o && (D = D && T(g, o) >= 0), f && (D = D && T(g, f) <= 0), D;
}, M = (() => {
if (!g) {
let l = Y;
if (o || f) {
let h = !0;
o && (h = h && T(Y, o) >= 0), f && (h = h && T(Y, f) <= 0), !h && o && (l = o instanceof a ? o.toADDate() : o);
}
if (y === "BS") {
const h = a.fromADDate(l);
return {
month: h.getMonth(),
year: h.getFullYear()
};
}
return {
month: l.getMonth(),
year: l.getFullYear()
};
}
const D = d();
let u;
if (D ? u = g : o ? u = o : u = Y, y === "BS") {
const l = u instanceof a ? u : a.fromADDate(u);
return {
month: l.getMonth(),
year: l.getFullYear()
};
} else {
const l = u instanceof Date ? u : u.toADDate();
return {
month: l.getMonth(),
year: l.getFullYear()
};
}
})(), [v, P] = x({
minDate: o instanceof a ? o.toADDate() : o,
maxDate: f instanceof a ? f.toADDate() : f,
today: Y,
// Only set selectedDate if defaultDate is valid, otherwise keep it null
selectedDate: g && d() ? g : null,
// Store defaultDate for use as label in picker input
defaultDate: g,
activeMonth: M.month,
activeYear: M.year,
isVisible: !1,
locale: y === "BS" ? "ne" : "en",
mode: "date",
onSelect: A
});
return /* @__PURE__ */ F(N.Provider, { value: { pickerState: v, setPickerState: P }, children: c });
};
export {
w as PickerProvider,
q as usePicker
};