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