UNPKG

@brightsoftware/date-np

Version:

Simple & minimal Nepali date picker that just works.

237 lines (236 loc) 6.97 kB
import { jsx as F } from "react/jsx-runtime"; import { createContext as p, 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 C } from "../../data/constants.js"; import { compareDates as A } from "../../utils/validators.js"; const y = p(null), q = () => { const c = O(y); if (!c) throw new Error("usePicker must be used within a PickerProvider"); const { setPickerState: i } = c, D = (e, t) => { const { onSelect: n } = c.pickerState; n && t && e && n(e), i((a) => e ? { ...a, selectedDate: e, activeMonth: e.getMonth(), activeYear: e.getFullYear() } : { ...a, 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, i((a) => ({ ...a, activeYear: a.activeYear + t, activeMonth: n })); }, d = (e) => { i((t) => t.isVisible === e ? t : { ...t, isVisible: e }); }, k = (e, t) => { i((n) => ({ ...n, mode: n.mode === e ? t : e })); }, M = (e) => { i((t) => ({ ...t, mode: e })); }, T = (e) => { i((t) => ({ ...t, activeYear: e })); }, N = (e) => { i((t) => { if (t.locale === e) return t; const n = t.selectedDate; if (!n) { let o; return e === "ne" ? t.minDate ? o = r.fromADDate(t.minDate) : o = r.fromADDate(t.today) : t.minDate ? o = t.minDate : o = t.today, { ...t, activeMonth: o.getMonth(), activeYear: o.getFullYear(), locale: e }; } const a = e === "ne" ? n instanceof r ? n : r.fromADDate(n) : n instanceof Date ? n : n.toADDate(); return { ...t, activeMonth: a.getMonth(), activeYear: a.getFullYear(), selectedDate: a, locale: e }; }); }, Y = () => { const { minDate: e, locale: t } = c.pickerState; return e ? e instanceof r ? e.toADDate() : e : new Date(C, 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: k, updatePickerMode: M, updatePickerYear: T, changePickerLocale: N, updatePickerVisiblity: d, getEffectiveMinDate: Y, getEffectiveMaxDate: m, isDateInRange: (e) => { const t = e instanceof r ? e.toADDate() : e, n = Y(), a = m(), o = t.getTime(), s = n.getTime(), v = a.getTime(); return o >= s && o <= v; }, canNavigateToPreviousMonth: () => { const { activeYear: e, activeMonth: t, locale: n } = c.pickerState, a = Y(); let o = t - 1, s = e; o < 0 && (o = 11, s = s - 1); let v; if (n === "ne") { const x = new r( s, o, 1 ).getDaysInMonth(); v = new r( s, o, x ).toADDate(); } else v = new Date(s, o + 1, 0); return v.getTime() >= a.getTime(); }, canNavigateToNextMonth: () => { const { activeYear: e, activeMonth: t, locale: n } = c.pickerState, a = m(); let o = t + 1, s = e; return o > 11 && (o = 0, s = s + 1), (n === "ne" ? new r(s, o, 1).toADDate() : new Date(s, o, 1)).getTime() <= a.getTime(); }, canNavigateToPreviousYear: () => { const { activeYear: e, locale: t } = c.pickerState, n = Y(), a = e - 1; return (t === "ne" ? new r(a, 11, 30).toADDate() : new Date(a, 11, 31)).getTime() >= n.getTime(); }, canNavigateToNextYear: () => { const { activeYear: e, locale: t } = c.pickerState, n = m(), a = e + 1; return (t === "ne" ? new r(a, 0, 1).toADDate() : new Date(a, 0, 1)).getTime() <= n.getTime(); }, resetToOriginalState: () => { const { minDate: e, today: t } = c.pickerState, a = (() => { if (e) { const o = (e instanceof Date, e); return { month: o.getMonth(), year: o.getFullYear() }; } return { month: t.getMonth(), year: t.getFullYear() }; })(); i((o) => ({ ...o, activeMonth: a.month, activeYear: a.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) => { i((t) => { const n = { ...t, minDate: e }; return t.selectedDate || (e.getFullYear() !== t.activeYear || e.getMonth() !== t.activeMonth) && (n.activeYear = e.getFullYear(), n.activeMonth = e.getMonth()), n; }); }, setMaxDate: (e) => { i((t) => { const n = { ...t, maxDate: e }; return t.selectedDate || (e.getFullYear() !== t.activeYear || e.getMonth() !== t.activeMonth) && (n.activeYear = e.getFullYear(), n.activeMonth = e.getMonth()), n; }); } }; }, z = ({ children: c, minDate: i, maxDate: D, defaultDate: f, defaultLocale: d = "AD", onSelect: k }) => { const M = /* @__PURE__ */ new Date(), T = () => { if (!f) return !1; let h = !0; return i && (h = h && A(f, i) >= 0), D && (h = h && A(f, D) <= 0), h; }, Y = (() => { if (!f) { let l = M; if (i || D) { let g = !0; i && (g = g && A(M, i) >= 0), D && (g = g && A(M, D) <= 0), !g && i && (l = i instanceof r ? i.toADDate() : i); } if (d === "BS") { const g = r.fromADDate(l); return { month: g.getMonth(), year: g.getFullYear() }; } return { month: l.getMonth(), year: l.getFullYear() }; } const h = T(); let u; if (h ? u = f : i ? u = i : u = M, 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: i instanceof r ? i.toADDate() : i, maxDate: D instanceof r ? D.toADDate() : D, today: M, // 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: k }); return /* @__PURE__ */ F(y.Provider, { value: { pickerState: m, setPickerState: P }, children: c }); }; export { z as PickerProvider, q as usePicker };