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