@brightsoftware/date-np
Version:
Simple & minimal Nepali date picker that just works.
388 lines (387 loc) • 13.5 kB
JavaScript
import { jsx as K } from "react/jsx-runtime";
import { createContext as j, useContext as X, useState as p } from "react";
import { NepaliDate as s } from "../../NepaliDate.js";
import { areDatesEqual as q, compareDates as N } from "../../../utils/validators.js";
import { MAX_BS_YEAR as H, MAX_AD_YEAR as G, MIN_BS_YEAR as J, MIN_AD_YEAR as Q } from "../../../data/constants.js";
const C = j(null), ae = () => {
const f = X(C);
if (!f)
throw new Error("useRangePicker must be used within a RangePickerProvider");
const { setRangePickerState: D } = f, Y = (e, t) => {
D((a) => {
const { startDate: n, endDate: o, locale: l } = a, r = l === "ne" ? e instanceof s ? e : s.fromADDate(e) : e instanceof Date ? e : e.toADDate();
if (!n)
return {
...a,
startDate: r,
endDate: null,
hoverDate: null
};
if (n && o) {
const i = l === "ne" ? n instanceof s ? n : s.fromADDate(n) : n instanceof Date ? n : n.toADDate(), c = l === "ne" ? o instanceof s ? o : s.fromADDate(o) : o instanceof Date ? o : o.toADDate();
let h = !1, m = !1;
if (l === "ne") {
const u = r, k = i, F = c;
h = u.compare(k) < 0, m = u.compare(F) > 0;
} else {
const u = r, k = i, F = c;
h = u < k, m = u > F;
}
if (h)
return {
...a,
startDate: r,
endDate: c,
hoverDate: null
};
if (m)
return {
...a,
startDate: i,
endDate: r,
hoverDate: null
};
{
let u = !1, k = !1;
if (l === "ne") {
const A = r, v = i, w = c;
u = A.compare(v) === 0, k = A.compare(w) === 0;
} else {
const A = r, v = i, w = c;
u = A.getTime() === v.getTime(), k = A.getTime() === w.getTime();
}
if (u || k)
return {
...a,
startDate: null,
endDate: null,
hoverDate: null
};
let F = 0, B = 0;
if (l === "ne") {
const A = r, v = i, w = c;
F = Math.abs(A.toADDate().getTime() - v.toADDate().getTime()), B = Math.abs(A.toADDate().getTime() - w.toADDate().getTime());
} else {
const A = r, v = i, w = c;
F = Math.abs(A.getTime() - v.getTime()), B = Math.abs(A.getTime() - w.getTime());
}
return F <= B ? {
...a,
startDate: r,
endDate: c,
hoverDate: null
} : {
...a,
startDate: i,
endDate: r,
hoverDate: null
};
}
}
if (n && !o) {
let c = l === "ne" ? n instanceof s ? n : s.fromADDate(n) : n instanceof Date ? n : n.toADDate(), h = r;
if (l === "ne") {
const m = c, u = h;
m.compare(u) > 0 && (c = u, h = m);
} else if (l === "en") {
const m = c, u = h;
m > u && (c = u, h = m);
}
return {
...a,
startDate: c,
endDate: h,
hoverDate: null
};
}
return a;
});
}, P = (e) => {
D((t) => {
if (!e)
return t.hoverDate === null ? t : {
...t,
hoverDate: null
};
const a = t.locale === "ne" ? e instanceof s ? e : s.fromADDate(e) : e instanceof Date ? e : e.toADDate();
return t.hoverDate && q(a, t.hoverDate) ? t : {
...t,
hoverDate: a
};
});
}, M = (e, t) => {
let a = 0, n = 0;
e > 11 ? (a = Math.floor(e / 12), n = e % 12) : e < 0 ? (a = Math.floor(e / 12), n = 12 + e % 12) : n = e, D((o) => {
const l = t === "left" ? "leftPanel" : "rightPanel";
return {
...o,
[l]: {
...o[l],
activeYear: o[l].activeYear + a,
activeMonth: n
}
};
});
}, O = (e, t = 1) => {
D((a) => {
const n = e === "left" ? "leftPanel" : "rightPanel", o = a[n], l = o.activeMonth + t;
return {
...a,
[n]: {
...o,
activeMonth: l >= 12 ? 0 : l < 0 ? 11 : l,
activeYear: l >= 12 ? o.activeYear + 1 : l < 0 ? o.activeYear - 1 : o.activeYear
}
};
});
}, T = (e) => {
D((t) => t.isVisible === e ? t : {
...t,
isVisible: e
});
}, b = (e, t, a) => {
D((n) => {
const o = e === "left" ? "leftPanel" : "rightPanel";
return {
...n,
[o]: {
...n[o],
mode: n[o].mode === t ? a : t
}
};
});
}, z = (e, t) => {
D((a) => {
const n = e === "left" ? "leftPanel" : "rightPanel";
return {
...a,
[n]: {
...a[n],
mode: t
}
};
});
}, y = (e, t) => {
D((a) => {
const n = e === "left" ? "leftPanel" : "rightPanel";
return {
...a,
[n]: {
...a[n],
activeYear: t
}
};
});
}, V = (e) => {
D((t) => {
if (t.locale === e)
return t;
const a = (i) => i ? e === "ne" ? i instanceof s ? i : s.fromADDate(i) : i instanceof Date ? i : i.toADDate() : null, n = a(t.startDate), o = a(t.endDate);
let l, r;
if (n && o)
if (l = n, n.getMonth() === o.getMonth() && n.getFullYear() === o.getFullYear()) {
const i = n.getMonth() + 1, c = i > 11 ? n.getFullYear() + 1 : n.getFullYear(), h = i > 11 ? 0 : i;
e === "ne" ? r = new s(c, h, 1) : r = new Date(c, h, 1);
} else
r = o;
else if (t.minDate && t.maxDate) {
const i = e === "ne" ? t.minDate instanceof s ? t.minDate : s.fromADDate(t.minDate) : t.minDate instanceof Date ? t.minDate : t.minDate.toADDate(), c = e === "ne" ? t.maxDate instanceof s ? t.maxDate : s.fromADDate(t.maxDate) : t.maxDate instanceof Date ? t.maxDate : t.maxDate.toADDate();
if (l = i, i.getMonth() === c.getMonth() && i.getFullYear() === c.getFullYear()) {
const h = i.getMonth() + 1, m = h > 11 ? i.getFullYear() + 1 : i.getFullYear(), u = h > 11 ? 0 : h;
e === "ne" ? r = new s(m, u, 1) : r = new Date(m, u, 1);
} else
r = c;
} else {
const i = /* @__PURE__ */ new Date(), c = n || (e === "ne" ? s.fromADDate(i) : i);
l = c;
const h = c.getMonth() + 1, m = h > 11 ? c.getFullYear() + 1 : c.getFullYear(), u = h > 11 ? 0 : h;
e === "ne" ? r = new s(m, u, 1) : r = new Date(m, u, 1);
}
return {
...t,
startDate: n,
endDate: o,
locale: e,
leftPanel: {
...t.leftPanel,
selectedDate: l,
activeMonth: l.getMonth(),
activeYear: l.getFullYear()
},
rightPanel: {
...t.rightPanel,
selectedDate: r,
activeMonth: r.getMonth(),
activeYear: r.getFullYear()
}
};
});
}, I = () => {
D((e) => ({
...e,
startDate: null,
endDate: null,
hoverDate: null
}));
}, E = () => {
const { minDate: e, locale: t } = f.rangePickerState;
return e ? e instanceof s ? e.toADDate() : new Date(e) : t === "ne" ? new s(J, 8, 17).toADDate() : new Date(Q, 0, 1);
}, g = () => {
const { maxDate: e, locale: t } = f.rangePickerState;
return e ? e instanceof s ? e.toADDate() : new Date(e) : t === "ne" ? new s(H, 11, 30).toADDate() : new Date(G, 11, 31);
};
return {
...f,
updateRangePickerDay: Y,
updateHoverDate: P,
updatePanelMonth: M,
incrementPanelMonth: O,
togglePanelMode: b,
updatePanelMode: z,
updatePanelYear: y,
changeRangePickerLocale: V,
updateRangePickerVisibility: T,
clearSelection: I,
getEffectiveMinDate: E,
getEffectiveMaxDate: g,
isDateInRange: (e) => {
const t = e instanceof s ? e.toADDate() : e, a = E(), n = g(), o = t.getTime(), l = a.getTime(), r = n.getTime();
return o >= l && o <= r;
},
canNavigateToPreviousMonth: (e) => {
const t = e === "left" ? f.rangePickerState.leftPanel : f.rangePickerState.rightPanel, { activeYear: a, activeMonth: n } = t, { locale: o } = f.rangePickerState, l = E();
let r = n - 1, i = a;
r < 0 && (r = 11, i = i - 1);
let c;
if (o === "ne") {
const h = new s(i, r, 1).getDaysInMonth();
c = new s(i, r, h).toADDate();
} else
c = new Date(i, r + 1, 0);
return c.getTime() >= l.getTime();
},
canNavigateToNextMonth: (e) => {
const t = e === "left" ? f.rangePickerState.leftPanel : f.rangePickerState.rightPanel, { activeYear: a, activeMonth: n } = t, { locale: o } = f.rangePickerState, l = g();
let r = n + 1, i = a;
return r > 11 && (r = 0, i = i + 1), (o === "ne" ? new s(i, r, 1).toADDate() : new Date(i, r, 1)).getTime() <= l.getTime();
},
canNavigateToPreviousYear: (e) => {
const t = e === "left" ? f.rangePickerState.leftPanel : f.rangePickerState.rightPanel, { activeYear: a } = t, { locale: n } = f.rangePickerState, o = E(), l = a - 1;
return (n === "ne" ? new s(l, 11, 30).toADDate() : new Date(l, 11, 31)).getTime() >= o.getTime();
},
canNavigateToNextYear: (e) => {
const t = e === "left" ? f.rangePickerState.leftPanel : f.rangePickerState.rightPanel, { activeYear: a } = t, { locale: n } = f.rangePickerState, o = g(), l = a + 1;
return (n === "ne" ? new s(l, 0, 1).toADDate() : new Date(l, 0, 1)).getTime() <= o.getTime();
},
shouldShowSinglePanel: () => {
const { minDate: e, maxDate: t, locale: a } = f.rangePickerState;
if (!e || !t) return !1;
let n, o;
return a === "ne" ? (n = e instanceof s ? e : s.fromADDate(e), o = t instanceof s ? t : s.fromADDate(t)) : (n = e instanceof Date ? e : e.toADDate(), o = t instanceof Date ? t : t.toADDate()), n.getMonth() === o.getMonth() && n.getFullYear() === o.getFullYear();
},
resetToOriginalState: () => {
const { minDate: e, maxDate: t, today: a } = f.rangePickerState, o = (() => {
if (e && t) {
const l = (e instanceof Date, e), r = (t instanceof Date, t);
return {
leftMonth: l.getMonth(),
leftYear: l.getFullYear(),
rightMonth: r.getMonth(),
rightYear: r.getFullYear()
};
}
return {
leftMonth: a.getMonth(),
leftYear: a.getFullYear(),
rightMonth: a.getMonth() + 1 > 11 ? 0 : a.getMonth() + 1,
rightYear: a.getMonth() + 1 > 11 ? a.getFullYear() + 1 : a.getFullYear()
};
})();
D((l) => ({
...l,
leftPanel: {
...l.leftPanel,
activeMonth: o.leftMonth,
activeYear: o.leftYear,
mode: "date"
},
rightPanel: {
...l.rightPanel,
activeMonth: o.rightMonth,
activeYear: o.rightYear,
mode: "date"
},
hoverDate: null
// Don't reset startDate and endDate - keep them as is
}));
},
getDisplayDateRange: () => {
const { startDate: e, endDate: t, startingDateRange: a, endingDateRange: n } = f.rangePickerState;
return {
startDate: e || a || null,
endDate: e ? t : n || null
};
}
};
}, oe = ({
children: f,
minDate: D,
maxDate: Y,
startingDateRange: P,
endingDateRange: M,
defaultLocale: O = "AD"
}) => {
const T = /* @__PURE__ */ new Date(), b = () => {
if (!P && !M) return !0;
let g = !0;
return P && (D && (g = g && N(P, D) >= 0), Y && (g = g && N(P, Y) <= 0)), M && (D && (g = g && N(M, D) >= 0), Y && (g = g && N(M, Y) <= 0)), P && M && (g = g && N(P, M) <= 0), g;
}, y = (() => {
const g = b();
let d, x;
if (g && P && M ? (d = P instanceof s ? P.toADDate() : P, x = M instanceof s ? M.toADDate() : M) : D && Y ? (d = D instanceof s ? D.toADDate() : D, x = Y instanceof s ? Y.toADDate() : Y) : D ? (d = D instanceof s ? D.toADDate() : D, x = new Date(d.getFullYear(), d.getMonth() + 1, d.getDate())) : (d = T, x = new Date(T.getFullYear(), T.getMonth() + 1, T.getDate())), O === "BS") {
const S = s.fromADDate(d), _ = s.fromADDate(x);
return {
leftMonth: S.getMonth(),
leftYear: S.getFullYear(),
rightMonth: _.getMonth(),
rightYear: _.getFullYear()
};
}
return {
leftMonth: d.getMonth(),
leftYear: d.getFullYear(),
rightMonth: x.getMonth(),
rightYear: x.getFullYear()
};
})(), V = b(), [I, E] = p({
minDate: D,
maxDate: Y,
today: T,
// Only set selected dates if the default range is valid, otherwise keep them null
startDate: V && P ? P : null,
endDate: V && M ? M : null,
hoverDate: null,
// Store default dates for use as fallback in display
startingDateRange: P,
endingDateRange: M,
isVisible: !1,
locale: O === "BS" ? "ne" : "en",
leftPanel: {
selectedDate: T,
activeMonth: y.leftMonth,
activeYear: y.leftYear,
mode: "date"
},
rightPanel: {
selectedDate: T,
activeMonth: y.rightMonth,
activeYear: y.rightYear,
mode: "date"
}
});
return /* @__PURE__ */ K(C.Provider, { value: { rangePickerState: I, setRangePickerState: E }, children: f });
};
export {
oe as RangePickerProvider,
ae as useRangePicker
};