@brightsoftware/date-np
Version:
Simple & minimal Nepali date picker that just works.
401 lines (400 loc) • 15.4 kB
JavaScript
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
};