UNPKG

@brightsoftware/date-np

Version:

Simple & minimal Nepali date picker that just works.

242 lines (241 loc) 7.26 kB
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 };