UNPKG

@brightsoftware/date-np

Version:

Simple & minimal Nepali date picker that just works.

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