@brightsoftware/date-np
Version:
Simple & minimal Nepali date picker that just works.
246 lines (245 loc) • 7.12 kB
JavaScript
import { jsx as T } from "react/jsx-runtime";
import { createContext as B, useState as M, useContext as S } from "react";
const g = B(null), j = () => {
const l = S(g);
if (!l)
throw new Error("useTimePicker must be used within a TimePickerProvider");
const { timePickerState: s, setTimePickerState: n } = l, o = (e) => {
n((t) => {
let c = e;
return t.format === "24hr" ? c = Math.max(0, Math.min(23, e)) : c = Math.max(1, Math.min(12, e)), {
...t,
selectedTime: {
...t.selectedTime,
hours: c
}
};
});
}, m = (e) => {
n((t) => ({
...t,
selectedTime: {
...t.selectedTime,
minutes: Math.max(0, Math.min(59, e))
}
}));
}, f = (e) => {
n((t) => ({
...t,
selectedTime: {
...t.selectedTime,
seconds: Math.max(0, Math.min(59, e))
}
}));
}, P = (e) => {
s.format === "am/pm" && n((t) => ({
...t,
selectedTime: {
...t.selectedTime,
period: e
}
}));
};
return {
timePickerState: s,
updateHours: o,
updateMinutes: m,
updateSeconds: f,
updatePeriod: P,
incrementHours: () => {
const e = s.selectedTime.hours;
s.format === "24hr" ? o(e === 23 ? 0 : e + 1) : o(e === 12 ? 1 : e + 1);
},
decrementHours: () => {
const e = s.selectedTime.hours;
s.format === "24hr" ? o(e === 0 ? 23 : e - 1) : o(e === 1 ? 12 : e - 1);
},
incrementMinutes: () => {
const e = s.selectedTime.minutes;
m(e === 59 ? 0 : e + 1);
},
decrementMinutes: () => {
const e = s.selectedTime.minutes;
m(e === 0 ? 59 : e - 1);
},
incrementSeconds: () => {
const e = s.selectedTime.seconds;
f(e === 59 ? 0 : e + 1);
},
decrementSeconds: () => {
const e = s.selectedTime.seconds;
f(e === 0 ? 59 : e - 1);
},
togglePeriod: () => {
s.format === "am/pm" && s.selectedTime.period && P(s.selectedTime.period === "AM" ? "PM" : "AM");
},
setVisibility: (e) => {
n((t) => ({
...t,
isVisible: e
}));
},
getFormattedTime: () => {
const { hours: e, minutes: t, seconds: c, period: a } = s.selectedTime, d = e.toString().padStart(2, "0"), i = t.toString().padStart(2, "0"), r = c.toString().padStart(2, "0");
return s.format === "am/pm" ? `${d}:${i}:${r} ${a}` : `${d}:${i}:${r}`;
},
setCurrentInputPosition: (e) => {
n((t) => ({
...t,
currentInputPosition: e,
inputBuffer: ""
// Clear buffer when changing position
}));
},
handleKeyInput: (e) => {
if (!/^\d$/.test(e)) return !1;
const t = parseInt(e), { currentInputPosition: c, inputBuffer: a, format: d } = s;
switch (c) {
case "hours": {
const i = a + t;
if (i.length === 1)
if (d === "24hr")
if (t >= 0 && t <= 2) {
const r = t * 10;
return o(r), n((u) => ({
...u,
inputBuffer: i
})), !0;
} else
return o(t), n((r) => ({
...r,
currentInputPosition: "minutes",
inputBuffer: ""
})), !0;
else
return t === 0 ? (o(t), n((r) => ({
...r,
inputBuffer: i
})), !0) : t === 1 ? (o(10), n((r) => ({
...r,
inputBuffer: i
})), !0) : (o(t), n((r) => ({
...r,
currentInputPosition: "minutes",
inputBuffer: ""
})), !0);
else if (i.length === 2) {
const r = parseInt(i);
if (d === "24hr") {
if (r <= 23)
return o(r), n((u) => ({
...u,
currentInputPosition: "minutes",
inputBuffer: ""
})), !0;
} else if (r >= 1 && r <= 12)
return o(r), n((u) => ({
...u,
currentInputPosition: "minutes",
inputBuffer: ""
})), !0;
return n((u) => ({
...u,
inputBuffer: ""
})), !1;
}
break;
}
case "minutes": {
const i = a + t;
if (i.length === 1)
if (t >= 0 && t <= 5) {
const r = t * 10;
return m(r), n((u) => ({
...u,
inputBuffer: i
})), !0;
} else
return m(t), n((r) => ({
...r,
currentInputPosition: "seconds",
inputBuffer: ""
})), !0;
else if (i.length === 2) {
const r = parseInt(i);
return r <= 59 ? (m(r), n((u) => ({
...u,
currentInputPosition: "seconds",
inputBuffer: ""
})), !0) : (n((u) => ({
...u,
inputBuffer: ""
})), !1);
}
break;
}
case "seconds": {
const i = a + t;
if (i.length === 1)
if (t >= 0 && t <= 5) {
const r = t * 10;
return f(r), n((u) => ({
...u,
inputBuffer: i
})), !0;
} else
return f(t), n((r) => ({
...r,
inputBuffer: ""
})), !0;
else if (i.length === 2) {
const r = parseInt(i);
return r <= 59 ? (f(r), n((u) => ({
...u,
inputBuffer: ""
})), !0) : (n((u) => ({
...u,
inputBuffer: ""
})), !1);
}
break;
}
}
return !1;
},
getFormattedTimeWithHighlight: () => {
const { hours: e, minutes: t, seconds: c, period: a } = s.selectedTime, { currentInputPosition: d } = s, i = e.toString().padStart(2, "0"), r = t.toString().padStart(2, "0"), u = c.toString().padStart(2, "0");
let p = "";
switch (d) {
case "hours":
p = i;
break;
case "minutes":
p = r;
break;
case "seconds":
p = u;
break;
}
let h = "";
return s.format === "am/pm" ? h = `${i}:${r}:${u} ${a}` : h = `${i}:${r}:${u}`, { display: h, highlightedPart: p };
}
};
}, v = ({
children: l,
format: s = "am/pm",
defaultTime: n = {}
}) => {
const o = () => n.hours ?? 8, [m, f] = M({
isVisible: !1,
selectedTime: {
hours: o(),
minutes: n.minutes ?? 30,
seconds: n.seconds ?? 45,
period: s === "am/pm" ? n.period ?? "PM" : void 0
},
format: s,
currentInputPosition: "hours",
inputBuffer: ""
});
return /* @__PURE__ */ T(g.Provider, { value: { timePickerState: m, setTimePickerState: f }, children: l });
};
export {
v as TimePickerProvider,
j as useTimePicker
};