UNPKG

@brightsoftware/date-np

Version:

Simple & minimal Nepali date picker that just works.

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