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