UNPKG

@brightsoftware/date-np

Version:

Simple & minimal Nepali date picker that just works.

401 lines (400 loc) 15.4 kB
import { jsx as X } from "react/jsx-runtime"; import { createContext as q, useContext as H, useState as G } from "react"; import { NepaliDate as l } from "../../NepaliDate.js"; import { areDatesEqual as J, compareDates as x } from "../../../utils/validators.js"; import { MAX_BS_YEAR as Q, MAX_AD_YEAR as U, MIN_BS_YEAR as W, MIN_AD_YEAR as Z } from "../../../data/constants.js"; const p = q(null), re = () => { const h = H(p); if (!h) throw new Error("useRangePicker must be used within a RangePickerProvider"); const { setRangePickerState: d } = h, A = (e, t) => { const { startDate: a, endDate: n, locale: o, onRangeSelect: s } = h.rangePickerState; let i = null, r = null; const c = o === "ne" ? e instanceof l ? e : l.fromADDate(e) : e instanceof Date ? e : e.toADDate(); if (!a) i = c, r = null; else if (a && n) { const f = o === "ne" ? a instanceof l ? a : l.fromADDate(a) : a instanceof Date ? a : a.toADDate(), D = o === "ne" ? n instanceof l ? n : l.fromADDate(n) : n instanceof Date ? n : n.toADDate(); let u = !1, E = !1; if (o === "ne") { const m = c, F = f, Y = D; u = m.compare(F) < 0, E = m.compare(Y) > 0; } else { const m = c, F = f, Y = D; u = m < F, E = m > Y; } if (u) i = c, r = D; else if (E) i = f, r = c; else { let m = !1, F = !1; if (o === "ne") { const Y = c, P = f, y = D; m = Y.compare(P) === 0, F = Y.compare(y) === 0; } else { const Y = c, P = f, y = D; m = Y.getTime() === P.getTime(), F = Y.getTime() === y.getTime(); } if (m || F) i = null, r = null; else { let Y = 0, P = 0; if (o === "ne") { const y = c, C = f, K = D; Y = Math.abs(y.toADDate().getTime() - C.toADDate().getTime()), P = Math.abs(y.toADDate().getTime() - K.toADDate().getTime()); } else { const y = c, C = f, K = D; Y = Math.abs(y.getTime() - C.getTime()), P = Math.abs(y.getTime() - K.getTime()); } Y <= P ? t === "end" ? (i = f, r = c) : (i = c, r = D) : t === "start" ? (i = c, r = D) : (i = f, r = c); } } } else if (a && !n) { if (i = o === "ne" ? a instanceof l ? a : l.fromADDate(a) : a instanceof Date ? a : a.toADDate(), r = c, o === "ne") { const D = i, u = r; D.compare(u) > 0 && (i = u, r = D); } else if (o === "en") { const D = i, u = r; D > u && (i = u, r = D); } } return d((f) => (t && i && r && (s == null || s(i, r)), { ...f, startDate: i, endDate: r, hoverDate: null })), { latestStartDate: i, latestEndDate: r }; }, k = (e) => { d((t) => { if (!e) return t.hoverDate === null ? t : { ...t, hoverDate: null }; const a = t.locale === "ne" ? e instanceof l ? e : l.fromADDate(e) : e instanceof Date ? e : e.toADDate(); return t.hoverDate && J(a, t.hoverDate) ? t : { ...t, hoverDate: a }; }); }, M = (e, t) => { let a = 0, n = 0; e > 11 ? (a = Math.floor(e / 12), n = e % 12) : e < 0 ? (a = Math.floor(e / 12), n = 12 + e % 12) : n = e, d((o) => { const s = t === "left" ? "leftPanel" : "rightPanel"; return { ...o, [s]: { ...o[s], activeYear: o[s].activeYear + a, activeMonth: n } }; }); }, g = (e, t = 1) => { d((a) => { const n = e === "left" ? "leftPanel" : "rightPanel", o = a[n], s = o.activeMonth + t; return { ...a, [n]: { ...o, activeMonth: s >= 12 ? 0 : s < 0 ? 11 : s, activeYear: s >= 12 ? o.activeYear + 1 : s < 0 ? o.activeYear - 1 : o.activeYear } }; }); }, b = (e) => { d((t) => t.isVisible === e ? t : { ...t, isVisible: e }); }, S = (e, t, a) => { d((n) => { const o = e === "left" ? "leftPanel" : "rightPanel"; return { ...n, [o]: { ...n[o], mode: n[o].mode === t ? a : t } }; }); }, B = (e, t) => { d((a) => { const n = e === "left" ? "leftPanel" : "rightPanel"; return { ...a, [n]: { ...a[n], mode: t } }; }); }, j = (e, t) => { d((a) => { const n = e === "left" ? "leftPanel" : "rightPanel"; return { ...a, [n]: { ...a[n], activeYear: t } }; }); }, N = (e) => { d((t) => { if (t.locale === e) return t; const a = (r) => r ? e === "ne" ? r instanceof l ? r : l.fromADDate(r) : r instanceof Date ? r : r.toADDate() : null, n = a(t.startDate), o = a(t.endDate); let s, i; if (n && o) if (s = n, n.getMonth() === o.getMonth() && n.getFullYear() === o.getFullYear()) { const r = n.getMonth() + 1, c = r > 11 ? n.getFullYear() + 1 : n.getFullYear(), f = r > 11 ? 0 : r; e === "ne" ? i = new l(c, f, 1) : i = new Date(c, f, 1); } else i = o; else if (t.minDate && t.maxDate) { const r = e === "ne" ? t.minDate instanceof l ? t.minDate : l.fromADDate(t.minDate) : t.minDate instanceof Date ? t.minDate : t.minDate.toADDate(), c = e === "ne" ? t.maxDate instanceof l ? t.maxDate : l.fromADDate(t.maxDate) : t.maxDate instanceof Date ? t.maxDate : t.maxDate.toADDate(); if (s = r, r.getMonth() === c.getMonth() && r.getFullYear() === c.getFullYear()) { const f = r.getMonth() + 1, D = f > 11 ? r.getFullYear() + 1 : r.getFullYear(), u = f > 11 ? 0 : f; e === "ne" ? i = new l(D, u, 1) : i = new Date(D, u, 1); } else i = c; } else { const r = /* @__PURE__ */ new Date(), c = n || (e === "ne" ? l.fromADDate(r) : r); s = c; const f = c.getMonth() + 1, D = f > 11 ? c.getFullYear() + 1 : c.getFullYear(), u = f > 11 ? 0 : f; e === "ne" ? i = new l(D, u, 1) : i = new Date(D, u, 1); } return { ...t, startDate: n, endDate: o, locale: e, leftPanel: { ...t.leftPanel, selectedDate: s, activeMonth: s.getMonth(), activeYear: s.getFullYear() }, rightPanel: { ...t.rightPanel, selectedDate: i, activeMonth: i.getMonth(), activeYear: i.getFullYear() } }; }); }, I = () => { d((e) => ({ ...e, startDate: null, endDate: null, hoverDate: null })); }, V = () => { const { minDate: e, locale: t } = h.rangePickerState; return e ? e instanceof l ? e.toADDate() : new Date(e) : t === "ne" ? new l(W, 0, 1).toADDate() : new Date(Z, 0, 1); }, O = () => { const { maxDate: e, locale: t } = h.rangePickerState; return e ? e instanceof l ? e.toADDate() : new Date(e) : t === "ne" ? new l(Q, 11, 30).toADDate() : new Date(U, 11, 31); }; return { ...h, updateRangePickerDay: A, updateHoverDate: k, updatePanelMonth: M, incrementPanelMonth: g, togglePanelMode: S, updatePanelMode: B, updatePanelYear: j, changeRangePickerLocale: N, updateRangePickerVisibility: b, clearSelection: I, getEffectiveMinDate: V, getEffectiveMaxDate: O, isDateInRange: (e) => { const t = e instanceof l ? e.toADDate() : e, a = V(), n = O(), o = t.getTime(), s = a.getTime(), i = n.getTime(); return o >= s && o <= i; }, canNavigateToPreviousMonth: (e) => { const t = e === "left" ? h.rangePickerState.leftPanel : h.rangePickerState.rightPanel, { activeYear: a, activeMonth: n } = t, { locale: o } = h.rangePickerState, s = V(); let i = n - 1, r = a; i < 0 && (i = 11, r = r - 1); let c; if (o === "ne") { const f = new l(r, i, 1).getDaysInMonth(); c = new l(r, i, f).toADDate(); } else c = new Date(r, i + 1, 0); return c.getTime() >= s.getTime(); }, canNavigateToNextMonth: (e) => { const t = e === "left" ? h.rangePickerState.leftPanel : h.rangePickerState.rightPanel, { activeYear: a, activeMonth: n } = t, { locale: o } = h.rangePickerState, s = O(); let i = n + 1, r = a; return i > 11 && (i = 0, r = r + 1), (o === "ne" ? new l(r, i, 1).toADDate() : new Date(r, i, 1)).getTime() <= s.getTime(); }, canNavigateToPreviousYear: (e) => { const t = e === "left" ? h.rangePickerState.leftPanel : h.rangePickerState.rightPanel, { activeYear: a } = t, { locale: n } = h.rangePickerState, o = V(), s = a - 1; return (n === "ne" ? new l(s, 11, 30).toADDate() : new Date(s, 11, 31)).getTime() >= o.getTime(); }, canNavigateToNextYear: (e) => { const t = e === "left" ? h.rangePickerState.leftPanel : h.rangePickerState.rightPanel, { activeYear: a } = t, { locale: n } = h.rangePickerState, o = O(), s = a + 1; return (n === "ne" ? new l(s, 0, 1).toADDate() : new Date(s, 0, 1)).getTime() <= o.getTime(); }, setShouldShowSinglePanel: (e) => { d((t) => ({ ...t, shouldShowSinglePanel: e })); }, shouldShowSinglePanel: () => { const { minDate: e, maxDate: t, locale: a } = h.rangePickerState; if (!e || !t) return !1; let n, o; return a === "ne" ? (n = e instanceof l ? e : l.fromADDate(e), o = t instanceof l ? t : l.fromADDate(t)) : (n = e instanceof Date ? e : e.toADDate(), o = t instanceof Date ? t : t.toADDate()), n.getMonth() === o.getMonth() && n.getFullYear() === o.getFullYear(); }, resetToOriginalState: () => { const { minDate: e, maxDate: t, today: a } = h.rangePickerState, o = (() => { if (e && t) { const s = (e instanceof Date, e), i = (t instanceof Date, t); return { leftMonth: s.getMonth(), leftYear: s.getFullYear(), rightMonth: i.getMonth(), rightYear: i.getFullYear() }; } return { leftMonth: a.getMonth(), leftYear: a.getFullYear(), rightMonth: a.getMonth() + 1 > 11 ? 0 : a.getMonth() + 1, rightYear: a.getMonth() + 1 > 11 ? a.getFullYear() + 1 : a.getFullYear() }; })(); d((s) => ({ ...s, leftPanel: { ...s.leftPanel, activeMonth: o.leftMonth, activeYear: o.leftYear, mode: "date" }, rightPanel: { ...s.rightPanel, activeMonth: o.rightMonth, activeYear: o.rightYear, mode: "date" }, hoverDate: null // Don't reset startDate and endDate - keep them as is })); }, getDisplayDateRange: () => { const { startDate: e, endDate: t, startingDateRange: a, endingDateRange: n } = h.rangePickerState; return { startDate: e || null, endDate: e ? t : null }; }, setDatePickerRange: (e, t) => { let a = e, n = t; const { minDate: o, maxDate: s, today: i, locale: r } = h.rangePickerState, f = ((F, Y) => { if (!a && !n) return !0; let P = !0; return a && (F && (P = P && x(a, F) >= 0), Y && (P = P && x(a, Y) <= 0)), n && (F && (P = P && x(n, F) >= 0), Y && (P = P && x(n, Y) <= 0)), a && n && (P = P && x(a, n) <= 0), P; })(o, s); let D, u, E, m; if (f && a && n ? (D = a instanceof l ? a.toADDate() : a, E = D, a instanceof l && n instanceof l && a.getMonth() === n.getMonth() && a.getFullYear() === n.getFullYear() ? (m = n.toADDate(), u = new l(n.getFullYear(), n.getMonth() + 1, 1).toADDate()) : a instanceof Date && n instanceof Date && a.getMonth() === n.getMonth() && a.getFullYear() === n.getFullYear() ? (m = n, u = new Date(n.getFullYear(), n.getMonth() + 1, 1)) : (m = n instanceof l ? n.toADDate() : n, u = n instanceof l ? n.toADDate() : n)) : o && s ? (D = o instanceof l ? o.toADDate() : o, u = s instanceof l ? s.toADDate() : s) : o ? (D = o instanceof l ? o.toADDate() : o, u = new Date(D.getFullYear(), D.getMonth() + 1, D.getDate())) : (D = i, u = new Date(i.getFullYear(), i.getMonth() + 1, i.getDate())), r === "ne") { const F = l.fromADDate(D), Y = l.fromADDate(u); d( (P) => ({ ...P, startDate: E instanceof l ? E : l.fromADDate(E), endDate: m instanceof l ? m : l.fromADDate(m), leftPanel: { ...P.leftPanel, activeMonth: F.getMonth(), activeYear: F.getFullYear(), mode: "date" }, rightPanel: { ...P.rightPanel, activeMonth: Y.getMonth(), activeYear: Y.getFullYear(), mode: "date" } }) ); return; } }, onRangeSelect: h.rangePickerState.onRangeSelect }; }, se = ({ onRangeSelect: h, children: d, minDate: A, maxDate: k, startingDateRange: M, endingDateRange: g, defaultLocale: b = "AD" }) => { const S = /* @__PURE__ */ new Date(), B = () => { if (!M && !g) return !0; let T = !0; return M && (A && (T = T && x(M, A) >= 0), k && (T = T && x(M, k) <= 0)), g && (A && (T = T && x(g, A) >= 0), k && (T = T && x(g, k) <= 0)), M && g && (T = T && x(M, g) <= 0), T; }, N = (() => { const T = B(); let w, v; if (T && M && g ? (w = M instanceof l ? M.toADDate() : M, M instanceof l && g instanceof l && M.getMonth() === g.getMonth() && M.getFullYear() === g.getFullYear() ? v = new l(g.getFullYear(), g.getMonth() + 1, 1).toADDate() : M instanceof Date && g instanceof Date && M.getMonth() === g.getMonth() && M.getFullYear() === g.getFullYear() ? v = new Date(g.getFullYear(), g.getMonth() + 1, 1) : v = g instanceof l ? g.toADDate() : g) : A && k ? (w = A instanceof l ? A.toADDate() : A, v = k instanceof l ? k.toADDate() : k) : A ? (w = A instanceof l ? A.toADDate() : A, v = new Date(w.getFullYear(), w.getMonth() + 1, w.getDate())) : (w = S, v = new Date(S.getFullYear(), S.getMonth() + 1, S.getDate())), b === "BS") { const _ = l.fromADDate(w), z = l.fromADDate(v); return { leftMonth: _.getMonth(), leftYear: _.getFullYear(), rightMonth: z.getMonth(), rightYear: z.getFullYear() }; } return { leftMonth: w.getMonth(), leftYear: w.getFullYear(), rightMonth: v.getMonth(), rightYear: v.getFullYear() }; })(), I = B(), [V, O] = G({ onRangeSelect: h || void 0, minDate: A, maxDate: k, today: S, // Only set selected dates if the default range is valid, otherwise keep them null startDate: I && M ? M : null, endDate: I && g ? g : null, hoverDate: null, // Store default dates for use as fallback in display startingDateRange: M, endingDateRange: g, isVisible: !1, locale: b === "BS" ? "ne" : "en", leftPanel: { selectedDate: S, activeMonth: N.leftMonth, activeYear: N.leftYear, mode: "date" }, rightPanel: { selectedDate: S, activeMonth: N.rightMonth, activeYear: N.rightYear, mode: "date" } }); return /* @__PURE__ */ X(p.Provider, { value: { rangePickerState: V, setRangePickerState: O }, children: d }); }; export { se as RangePickerProvider, re as useRangePicker };