UNPKG

@brightsoftware/date-np

Version:

Simple & minimal Nepali date picker that just works.

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