react-native-ruler-date-picker 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +186 -60
- package/lib/commonjs/LensTick.js +83 -0
- package/lib/commonjs/LensTick.js.map +1 -0
- package/lib/commonjs/Ruler.js +38 -0
- package/lib/commonjs/Ruler.js.map +1 -0
- package/lib/commonjs/RulerContext.js +17 -0
- package/lib/commonjs/RulerContext.js.map +1 -0
- package/lib/commonjs/RulerDatePicker.js +38 -351
- package/lib/commonjs/RulerDatePicker.js.map +1 -1
- package/lib/commonjs/RulerDateRangePicker.js +56 -0
- package/lib/commonjs/RulerDateRangePicker.js.map +1 -0
- package/lib/commonjs/RulerHeader.js +106 -0
- package/lib/commonjs/RulerHeader.js.map +1 -0
- package/lib/commonjs/RulerIndicator.js +67 -0
- package/lib/commonjs/RulerIndicator.js.map +1 -0
- package/lib/commonjs/RulerLensTicks.js +55 -0
- package/lib/commonjs/RulerLensTicks.js.map +1 -0
- package/lib/commonjs/RulerLensTrack.js +52 -0
- package/lib/commonjs/RulerLensTrack.js.map +1 -0
- package/lib/commonjs/RulerRange.js +39 -0
- package/lib/commonjs/RulerRange.js.map +1 -0
- package/lib/commonjs/RulerRangeContext.js +17 -0
- package/lib/commonjs/RulerRangeContext.js.map +1 -0
- package/lib/commonjs/RulerRangeHeader.js +154 -0
- package/lib/commonjs/RulerRangeHeader.js.map +1 -0
- package/lib/commonjs/RulerRangeHighlight.js +50 -0
- package/lib/commonjs/RulerRangeHighlight.js.map +1 -0
- package/lib/commonjs/RulerRangeIndicator.js +71 -0
- package/lib/commonjs/RulerRangeIndicator.js.map +1 -0
- package/lib/commonjs/RulerRangeRoot.js +80 -0
- package/lib/commonjs/RulerRangeRoot.js.map +1 -0
- package/lib/commonjs/RulerRangeTicks.js +57 -0
- package/lib/commonjs/RulerRangeTicks.js.map +1 -0
- package/lib/commonjs/RulerRangeTrack.js +46 -0
- package/lib/commonjs/RulerRangeTrack.js.map +1 -0
- package/lib/commonjs/RulerResetButton.js +46 -0
- package/lib/commonjs/RulerResetButton.js.map +1 -0
- package/lib/commonjs/RulerRoot.js +87 -0
- package/lib/commonjs/RulerRoot.js.map +1 -0
- package/lib/commonjs/RulerTicks.js +51 -0
- package/lib/commonjs/RulerTicks.js.map +1 -0
- package/lib/commonjs/RulerTrack.js +46 -0
- package/lib/commonjs/RulerTrack.js.map +1 -0
- package/lib/commonjs/Tick.js +41 -36
- package/lib/commonjs/Tick.js.map +1 -1
- package/lib/commonjs/defaults.js +20 -19
- package/lib/commonjs/defaults.js.map +1 -1
- package/lib/commonjs/index.js +287 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/presets.js +108 -0
- package/lib/commonjs/presets.js.map +1 -0
- package/lib/commonjs/tickResolver.js +101 -0
- package/lib/commonjs/tickResolver.js.map +1 -0
- package/lib/commonjs/useHaptics.js +1 -1
- package/lib/commonjs/useHaptics.web.js +43 -0
- package/lib/commonjs/useHaptics.web.js.map +1 -0
- package/lib/commonjs/useRulerDatePicker.js +264 -0
- package/lib/commonjs/useRulerDatePicker.js.map +1 -0
- package/lib/commonjs/useRulerDateRangePicker.js +313 -0
- package/lib/commonjs/useRulerDateRangePicker.js.map +1 -0
- package/lib/commonjs/utils.js +61 -47
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/module/LensTick.js +77 -0
- package/lib/module/LensTick.js.map +1 -0
- package/lib/module/Ruler.js +35 -0
- package/lib/module/Ruler.js.map +1 -0
- package/lib/module/RulerContext.js +12 -0
- package/lib/module/RulerContext.js.map +1 -0
- package/lib/module/RulerDatePicker.js +38 -350
- package/lib/module/RulerDatePicker.js.map +1 -1
- package/lib/module/RulerDateRangePicker.js +52 -0
- package/lib/module/RulerDateRangePicker.js.map +1 -0
- package/lib/module/RulerHeader.js +101 -0
- package/lib/module/RulerHeader.js.map +1 -0
- package/lib/module/RulerIndicator.js +62 -0
- package/lib/module/RulerIndicator.js.map +1 -0
- package/lib/module/RulerLensTicks.js +50 -0
- package/lib/module/RulerLensTicks.js.map +1 -0
- package/lib/module/RulerLensTrack.js +47 -0
- package/lib/module/RulerLensTrack.js.map +1 -0
- package/lib/module/RulerRange.js +36 -0
- package/lib/module/RulerRange.js.map +1 -0
- package/lib/module/RulerRangeContext.js +12 -0
- package/lib/module/RulerRangeContext.js.map +1 -0
- package/lib/module/RulerRangeHeader.js +149 -0
- package/lib/module/RulerRangeHeader.js.map +1 -0
- package/lib/module/RulerRangeHighlight.js +45 -0
- package/lib/module/RulerRangeHighlight.js.map +1 -0
- package/lib/module/RulerRangeIndicator.js +66 -0
- package/lib/module/RulerRangeIndicator.js.map +1 -0
- package/lib/module/RulerRangeRoot.js +75 -0
- package/lib/module/RulerRangeRoot.js.map +1 -0
- package/lib/module/RulerRangeTicks.js +51 -0
- package/lib/module/RulerRangeTicks.js.map +1 -0
- package/lib/module/RulerRangeTrack.js +41 -0
- package/lib/module/RulerRangeTrack.js.map +1 -0
- package/lib/module/RulerResetButton.js +41 -0
- package/lib/module/RulerResetButton.js.map +1 -0
- package/lib/module/RulerRoot.js +82 -0
- package/lib/module/RulerRoot.js.map +1 -0
- package/lib/module/RulerTicks.js +45 -0
- package/lib/module/RulerTicks.js.map +1 -0
- package/lib/module/RulerTrack.js +41 -0
- package/lib/module/RulerTrack.js.map +1 -0
- package/lib/module/Tick.js +41 -36
- package/lib/module/Tick.js.map +1 -1
- package/lib/module/defaults.js +19 -18
- package/lib/module/defaults.js.map +1 -1
- package/lib/module/index.js +46 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/presets.js +103 -0
- package/lib/module/presets.js.map +1 -0
- package/lib/module/tickResolver.js +97 -0
- package/lib/module/tickResolver.js.map +1 -0
- package/lib/module/useHaptics.js +1 -1
- package/lib/module/useHaptics.js.map +1 -1
- package/lib/module/useHaptics.web.js +39 -0
- package/lib/module/useHaptics.web.js.map +1 -0
- package/lib/module/useRulerDatePicker.js +260 -0
- package/lib/module/useRulerDatePicker.js.map +1 -0
- package/lib/module/useRulerDateRangePicker.js +310 -0
- package/lib/module/useRulerDateRangePicker.js.map +1 -0
- package/lib/module/utils.js +59 -45
- package/lib/module/utils.js.map +1 -1
- package/lib/typescript/LensTick.d.ts +20 -0
- package/lib/typescript/LensTick.d.ts.map +1 -0
- package/lib/typescript/Ruler.d.ts +31 -0
- package/lib/typescript/Ruler.d.ts.map +1 -0
- package/lib/typescript/RulerContext.d.ts +11 -0
- package/lib/typescript/RulerContext.d.ts.map +1 -0
- package/lib/typescript/RulerDatePicker.d.ts +10 -7
- package/lib/typescript/RulerDatePicker.d.ts.map +1 -1
- package/lib/typescript/RulerDateRangePicker.d.ts +26 -0
- package/lib/typescript/RulerDateRangePicker.d.ts.map +1 -0
- package/lib/typescript/RulerHeader.d.ts +14 -0
- package/lib/typescript/RulerHeader.d.ts.map +1 -0
- package/lib/typescript/RulerIndicator.d.ts +17 -0
- package/lib/typescript/RulerIndicator.d.ts.map +1 -0
- package/lib/typescript/RulerLensTicks.d.ts +12 -0
- package/lib/typescript/RulerLensTicks.d.ts.map +1 -0
- package/lib/typescript/RulerLensTrack.d.ts +13 -0
- package/lib/typescript/RulerLensTrack.d.ts.map +1 -0
- package/lib/typescript/RulerRange.d.ts +32 -0
- package/lib/typescript/RulerRange.d.ts.map +1 -0
- package/lib/typescript/RulerRangeContext.d.ts +11 -0
- package/lib/typescript/RulerRangeContext.d.ts.map +1 -0
- package/lib/typescript/RulerRangeHeader.d.ts +12 -0
- package/lib/typescript/RulerRangeHeader.d.ts.map +1 -0
- package/lib/typescript/RulerRangeHighlight.d.ts +8 -0
- package/lib/typescript/RulerRangeHighlight.d.ts.map +1 -0
- package/lib/typescript/RulerRangeIndicator.d.ts +17 -0
- package/lib/typescript/RulerRangeIndicator.d.ts.map +1 -0
- package/lib/typescript/RulerRangeRoot.d.ts +7 -0
- package/lib/typescript/RulerRangeRoot.d.ts.map +1 -0
- package/lib/typescript/RulerRangeTicks.d.ts +14 -0
- package/lib/typescript/RulerRangeTicks.d.ts.map +1 -0
- package/lib/typescript/RulerRangeTrack.d.ts +8 -0
- package/lib/typescript/RulerRangeTrack.d.ts.map +1 -0
- package/lib/typescript/RulerResetButton.d.ts +10 -0
- package/lib/typescript/RulerResetButton.d.ts.map +1 -0
- package/lib/typescript/RulerRoot.d.ts +7 -0
- package/lib/typescript/RulerRoot.d.ts.map +1 -0
- package/lib/typescript/RulerTicks.d.ts +9 -0
- package/lib/typescript/RulerTicks.d.ts.map +1 -0
- package/lib/typescript/RulerTrack.d.ts +8 -0
- package/lib/typescript/RulerTrack.d.ts.map +1 -0
- package/lib/typescript/Tick.d.ts +3 -16
- package/lib/typescript/Tick.d.ts.map +1 -1
- package/lib/typescript/defaults.d.ts +6 -9
- package/lib/typescript/defaults.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +37 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/presets.d.ts +27 -0
- package/lib/typescript/presets.d.ts.map +1 -0
- package/lib/typescript/tickResolver.d.ts +10 -0
- package/lib/typescript/tickResolver.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +302 -85
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/useHaptics.web.d.ts +17 -0
- package/lib/typescript/useHaptics.web.d.ts.map +1 -0
- package/lib/typescript/useRulerDatePicker.d.ts +26 -0
- package/lib/typescript/useRulerDatePicker.d.ts.map +1 -0
- package/lib/typescript/useRulerDateRangePicker.d.ts +40 -0
- package/lib/typescript/useRulerDateRangePicker.d.ts.map +1 -0
- package/lib/typescript/utils.d.ts +14 -12
- package/lib/typescript/utils.d.ts.map +1 -1
- package/package.json +25 -7
- package/src/LensTick.tsx +90 -0
- package/src/Ruler.ts +32 -0
- package/src/RulerContext.tsx +20 -0
- package/src/RulerDatePicker.tsx +41 -439
- package/src/RulerDateRangePicker.tsx +53 -0
- package/src/RulerHeader.tsx +125 -0
- package/src/RulerIndicator.tsx +84 -0
- package/src/RulerLensTicks.tsx +50 -0
- package/src/RulerLensTrack.tsx +45 -0
- package/src/RulerRange.ts +33 -0
- package/src/RulerRangeContext.tsx +20 -0
- package/src/RulerRangeHeader.tsx +180 -0
- package/src/RulerRangeHighlight.tsx +47 -0
- package/src/RulerRangeIndicator.tsx +85 -0
- package/src/RulerRangeRoot.tsx +87 -0
- package/src/RulerRangeTicks.tsx +68 -0
- package/src/RulerRangeTrack.tsx +39 -0
- package/src/RulerResetButton.tsx +59 -0
- package/src/RulerRoot.tsx +93 -0
- package/src/RulerTicks.tsx +57 -0
- package/src/RulerTrack.tsx +39 -0
- package/src/Tick.tsx +60 -49
- package/src/defaults.ts +21 -19
- package/src/index.ts +83 -1
- package/src/presets.ts +108 -0
- package/src/tickResolver.ts +123 -0
- package/src/types.ts +354 -102
- package/src/useHaptics.web.ts +55 -0
- package/src/useRulerDatePicker.ts +373 -0
- package/src/useRulerDateRangePicker.ts +468 -0
- package/src/utils.ts +67 -68
- package/lib/commonjs/package.json +0 -1
- package/lib/module/package.json +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DEFAULT_CALENDAR_TICKS","condition","height","width","label","format","d","toLocaleDateString","month","day","fontWeight","getDate","dayOfWeek","DEFAULT_METRIC_TICKS","interval","DEFAULT_MINIMAL_TICKS","resolveTickRules","ticks","Array","isArray"],"sourceRoot":"../../src","sources":["presets.ts"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,sBAAkC,GAAG,CAChD;EACEC,SAAS,EAAE,SAAS;EACpBC,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE,GAAG;EACVC,KAAK,EAAE;IACLC,MAAM,EAAGC,CAAC,IACRA,CAAC,CAACC,kBAAkB,CAAC,OAAO,EAAE;MAAEC,KAAK,EAAE,OAAO;MAAEC,GAAG,EAAE;IAAU,CAAC,CAAC;IACnEC,UAAU,EAAE;EACd;AACF,CAAC,EACD;EACET,SAAS,EAAE,QAAQ;EACnBC,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE,CAAC;EACRC,KAAK,EAAE;IACLC,MAAM,EAAGC,CAAC,IAAK,GAAGA,CAAC,CAACK,OAAO,CAAC,CAAC,EAAE;IAC/BD,UAAU,EAAE;EACd;AACF,CAAC,EACD;EACET,SAAS,EAAE;IAAEW,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;EAAE,CAAC;EAChCV,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE;AACT,CAAC,EACD;EACE;EACAF,SAAS,EAAE,OAAO;EAClBC,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE;AACT,CAAC,CACF;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMU,oBAAgC,GAAG,CAC9C;EACEZ,SAAS,EAAE;IAAEa,QAAQ,EAAE;EAAG,CAAC;EAC3BZ,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE,GAAG;EACVC,KAAK,EAAE;IACLC,MAAM,EAAGC,CAAC,IAAK,GAAGA,CAAC,CAACK,OAAO,CAAC,CAAC,EAAE;IAC/BD,UAAU,EAAE;EACd;AACF,CAAC,EACD;EACET,SAAS,EAAE;IAAEa,QAAQ,EAAE;EAAE,CAAC;EAC1BZ,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE;AACT,CAAC,EACD;EACEF,SAAS,EAAE,OAAO;EAClBC,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE;AACT,CAAC,CACF;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMY,qBAAiC,GAAG,CAC/C;EACEd,SAAS,EAAE,QAAQ;EACnBC,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE,CAAC;EACRC,KAAK,EAAE;IACLC,MAAM,EAAGC,CAAC,IAAK,GAAGA,CAAC,CAACK,OAAO,CAAC,CAAC;EAC/B;AACF,CAAC,EACD;EACEV,SAAS,EAAE,OAAO;EAClBC,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE;AACT,CAAC,CACF;;AAED;AACA;AACA;AACA,OAAO,SAASa,gBAAgBA,CAC9BC,KAAsD,EAC1C;EACZ,IAAIC,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC,EAAE;IACxB,OAAOA,KAAK;EACd;EACA,IAAIA,KAAK,KAAK,QAAQ,EAAE;IACtB,OAAOJ,oBAAoB;EAC7B;EACA,IAAII,KAAK,KAAK,SAAS,EAAE;IACvB,OAAOF,qBAAqB;EAC9B;EACA,OAAOf,sBAAsB;AAC/B","ignoreList":[]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { formatDateString } from "./utils.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Checks whether a given TickCondition matches the provided TickContext.
|
|
7
|
+
*/
|
|
8
|
+
export function matchesCondition(condition, ctx) {
|
|
9
|
+
if (condition === undefined || condition === 'daily') {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
if (condition === 'weekly') {
|
|
13
|
+
return ctx.offset % 7 === 0;
|
|
14
|
+
}
|
|
15
|
+
if (condition === 'monthly') {
|
|
16
|
+
return ctx.date.getDate() === 1;
|
|
17
|
+
}
|
|
18
|
+
if (condition === 'yearly') {
|
|
19
|
+
return ctx.date.getDate() === 1 && ctx.date.getMonth() === 0;
|
|
20
|
+
}
|
|
21
|
+
if (typeof condition === 'object') {
|
|
22
|
+
if ('interval' in condition && typeof condition.interval === 'number') {
|
|
23
|
+
return condition.interval !== 0 && ctx.offset % condition.interval === 0;
|
|
24
|
+
}
|
|
25
|
+
if ('dayOfWeek' in condition && Array.isArray(condition.dayOfWeek)) {
|
|
26
|
+
return condition.dayOfWeek.includes(ctx.date.getDay());
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (typeof condition === 'function') {
|
|
30
|
+
return condition(ctx);
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Resolves visual attributes for a tick by evaluating the rule array in order (first match wins).
|
|
37
|
+
*/
|
|
38
|
+
export function resolveTick(ctx, rules, theme, defaultWidth = 3) {
|
|
39
|
+
// Find the first matching rule, or fall back to the last rule in the list
|
|
40
|
+
const matchedRule = rules.find(rule => matchesCondition(rule.condition, ctx)) ?? rules[rules.length - 1];
|
|
41
|
+
const height = matchedRule?.height ?? 12;
|
|
42
|
+
const width = matchedRule?.width ?? defaultWidth;
|
|
43
|
+
const color = matchedRule?.color ?? theme.defaultTickColor;
|
|
44
|
+
|
|
45
|
+
// Resolve label
|
|
46
|
+
let labelText;
|
|
47
|
+
let labelColor = theme.labelColor;
|
|
48
|
+
let labelFontSize = 10;
|
|
49
|
+
let labelFontWeight = 'normal';
|
|
50
|
+
if (matchedRule?.label) {
|
|
51
|
+
if (typeof matchedRule.label === 'object') {
|
|
52
|
+
labelText = matchedRule.label.format ? matchedRule.label.format(ctx.date, ctx) : String(ctx.date.getDate());
|
|
53
|
+
if (matchedRule.label.color) labelColor = matchedRule.label.color;
|
|
54
|
+
if (matchedRule.label.fontSize) labelFontSize = matchedRule.label.fontSize;
|
|
55
|
+
if (matchedRule.label.fontWeight) labelFontWeight = matchedRule.label.fontWeight;
|
|
56
|
+
} else if (matchedRule.label === true) {
|
|
57
|
+
labelText = String(ctx.date.getDate());
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Resolve dot indicator
|
|
62
|
+
let hasDot = false;
|
|
63
|
+
let dotSize = 6;
|
|
64
|
+
let dotColor = theme.accentColor;
|
|
65
|
+
if (matchedRule?.dot !== undefined) {
|
|
66
|
+
if (typeof matchedRule.dot === 'object') {
|
|
67
|
+
hasDot = true;
|
|
68
|
+
if (matchedRule.dot.size) dotSize = matchedRule.dot.size;
|
|
69
|
+
if (matchedRule.dot.color) dotColor = matchedRule.dot.color;
|
|
70
|
+
} else if (matchedRule.dot === true) {
|
|
71
|
+
hasDot = true;
|
|
72
|
+
}
|
|
73
|
+
} else if (ctx.isToday) {
|
|
74
|
+
// Default: show today dot if rule didn't explicitly disable it
|
|
75
|
+
hasDot = true;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
offset: ctx.offset,
|
|
79
|
+
date: ctx.date,
|
|
80
|
+
dateStr: formatDateString(ctx.date),
|
|
81
|
+
height,
|
|
82
|
+
width,
|
|
83
|
+
color,
|
|
84
|
+
labelText,
|
|
85
|
+
labelColor,
|
|
86
|
+
labelFontSize,
|
|
87
|
+
labelFontWeight,
|
|
88
|
+
hasDot,
|
|
89
|
+
dotSize,
|
|
90
|
+
dotColor,
|
|
91
|
+
customRender: matchedRule?.render,
|
|
92
|
+
isToday: ctx.isToday,
|
|
93
|
+
isSelected: ctx.isSelected,
|
|
94
|
+
isInRange: ctx.isInRange ?? false
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=tickResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["formatDateString","matchesCondition","condition","ctx","undefined","offset","date","getDate","getMonth","interval","Array","isArray","dayOfWeek","includes","getDay","resolveTick","rules","theme","defaultWidth","matchedRule","find","rule","length","height","width","color","defaultTickColor","labelText","labelColor","labelFontSize","labelFontWeight","label","format","String","fontSize","fontWeight","hasDot","dotSize","dotColor","accentColor","dot","size","isToday","dateStr","customRender","render","isSelected","isInRange"],"sourceRoot":"../../src","sources":["tickResolver.ts"],"mappings":";;AAOA,SAASA,gBAAgB,QAAQ,YAAS;;AAE1C;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAC9BC,SAAoC,EACpCC,GAAgB,EACP;EACT,IAAID,SAAS,KAAKE,SAAS,IAAIF,SAAS,KAAK,OAAO,EAAE;IACpD,OAAO,IAAI;EACb;EAEA,IAAIA,SAAS,KAAK,QAAQ,EAAE;IAC1B,OAAOC,GAAG,CAACE,MAAM,GAAG,CAAC,KAAK,CAAC;EAC7B;EAEA,IAAIH,SAAS,KAAK,SAAS,EAAE;IAC3B,OAAOC,GAAG,CAACG,IAAI,CAACC,OAAO,CAAC,CAAC,KAAK,CAAC;EACjC;EAEA,IAAIL,SAAS,KAAK,QAAQ,EAAE;IAC1B,OAAOC,GAAG,CAACG,IAAI,CAACC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAIJ,GAAG,CAACG,IAAI,CAACE,QAAQ,CAAC,CAAC,KAAK,CAAC;EAC9D;EAEA,IAAI,OAAON,SAAS,KAAK,QAAQ,EAAE;IACjC,IAAI,UAAU,IAAIA,SAAS,IAAI,OAAOA,SAAS,CAACO,QAAQ,KAAK,QAAQ,EAAE;MACrE,OAAOP,SAAS,CAACO,QAAQ,KAAK,CAAC,IAAIN,GAAG,CAACE,MAAM,GAAGH,SAAS,CAACO,QAAQ,KAAK,CAAC;IAC1E;IACA,IAAI,WAAW,IAAIP,SAAS,IAAIQ,KAAK,CAACC,OAAO,CAACT,SAAS,CAACU,SAAS,CAAC,EAAE;MAClE,OAAOV,SAAS,CAACU,SAAS,CAACC,QAAQ,CAACV,GAAG,CAACG,IAAI,CAACQ,MAAM,CAAC,CAAC,CAAC;IACxD;EACF;EAEA,IAAI,OAAOZ,SAAS,KAAK,UAAU,EAAE;IACnC,OAAOA,SAAS,CAACC,GAAG,CAAC;EACvB;EAEA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA,OAAO,SAASY,WAAWA,CACzBZ,GAAgB,EAChBa,KAAiB,EACjBC,KAAyB,EACzBC,YAAoB,GAAG,CAAC,EACV;EACd;EACA,MAAMC,WAAW,GACfH,KAAK,CAACI,IAAI,CAAEC,IAAI,IAAKpB,gBAAgB,CAACoB,IAAI,CAACnB,SAAS,EAAEC,GAAG,CAAC,CAAC,IAC3Da,KAAK,CAACA,KAAK,CAACM,MAAM,GAAG,CAAC,CAAC;EAEzB,MAAMC,MAAM,GAAGJ,WAAW,EAAEI,MAAM,IAAI,EAAE;EACxC,MAAMC,KAAK,GAAGL,WAAW,EAAEK,KAAK,IAAIN,YAAY;EAChD,MAAMO,KAAK,GAAGN,WAAW,EAAEM,KAAK,IAAIR,KAAK,CAACS,gBAAgB;;EAE1D;EACA,IAAIC,SAA6B;EACjC,IAAIC,UAAU,GAAGX,KAAK,CAACW,UAAU;EACjC,IAAIC,aAAa,GAAG,EAAE;EACtB,IAAIC,eAAgD,GAAG,QAAQ;EAE/D,IAAIX,WAAW,EAAEY,KAAK,EAAE;IACtB,IAAI,OAAOZ,WAAW,CAACY,KAAK,KAAK,QAAQ,EAAE;MACzCJ,SAAS,GAAGR,WAAW,CAACY,KAAK,CAACC,MAAM,GAChCb,WAAW,CAACY,KAAK,CAACC,MAAM,CAAC7B,GAAG,CAACG,IAAI,EAAEH,GAAG,CAAC,GACvC8B,MAAM,CAAC9B,GAAG,CAACG,IAAI,CAACC,OAAO,CAAC,CAAC,CAAC;MAC9B,IAAIY,WAAW,CAACY,KAAK,CAACN,KAAK,EAAEG,UAAU,GAAGT,WAAW,CAACY,KAAK,CAACN,KAAK;MACjE,IAAIN,WAAW,CAACY,KAAK,CAACG,QAAQ,EAAEL,aAAa,GAAGV,WAAW,CAACY,KAAK,CAACG,QAAQ;MAC1E,IAAIf,WAAW,CAACY,KAAK,CAACI,UAAU,EAAEL,eAAe,GAAGX,WAAW,CAACY,KAAK,CAACI,UAAU;IAClF,CAAC,MAAM,IAAIhB,WAAW,CAACY,KAAK,KAAK,IAAI,EAAE;MACrCJ,SAAS,GAAGM,MAAM,CAAC9B,GAAG,CAACG,IAAI,CAACC,OAAO,CAAC,CAAC,CAAC;IACxC;EACF;;EAEA;EACA,IAAI6B,MAAM,GAAG,KAAK;EAClB,IAAIC,OAAO,GAAG,CAAC;EACf,IAAIC,QAAQ,GAAGrB,KAAK,CAACsB,WAAW;EAEhC,IAAIpB,WAAW,EAAEqB,GAAG,KAAKpC,SAAS,EAAE;IAClC,IAAI,OAAOe,WAAW,CAACqB,GAAG,KAAK,QAAQ,EAAE;MACvCJ,MAAM,GAAG,IAAI;MACb,IAAIjB,WAAW,CAACqB,GAAG,CAACC,IAAI,EAAEJ,OAAO,GAAGlB,WAAW,CAACqB,GAAG,CAACC,IAAI;MACxD,IAAItB,WAAW,CAACqB,GAAG,CAACf,KAAK,EAAEa,QAAQ,GAAGnB,WAAW,CAACqB,GAAG,CAACf,KAAK;IAC7D,CAAC,MAAM,IAAIN,WAAW,CAACqB,GAAG,KAAK,IAAI,EAAE;MACnCJ,MAAM,GAAG,IAAI;IACf;EACF,CAAC,MAAM,IAAIjC,GAAG,CAACuC,OAAO,EAAE;IACtB;IACAN,MAAM,GAAG,IAAI;EACf;EAEA,OAAO;IACL/B,MAAM,EAAEF,GAAG,CAACE,MAAM;IAClBC,IAAI,EAAEH,GAAG,CAACG,IAAI;IACdqC,OAAO,EAAE3C,gBAAgB,CAACG,GAAG,CAACG,IAAI,CAAC;IACnCiB,MAAM;IACNC,KAAK;IACLC,KAAK;IACLE,SAAS;IACTC,UAAU;IACVC,aAAa;IACbC,eAAe;IACfM,MAAM;IACNC,OAAO;IACPC,QAAQ;IACRM,YAAY,EAAEzB,WAAW,EAAE0B,MAAM;IACjCH,OAAO,EAAEvC,GAAG,CAACuC,OAAO;IACpBI,UAAU,EAAE3C,GAAG,CAAC2C,UAAU;IAC1BC,SAAS,EAAE5C,GAAG,CAAC4C,SAAS,IAAI;EAC9B,CAAC;AACH","ignoreList":[]}
|
package/lib/module/useHaptics.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useRef","Platform","DEFAULTS","ExpoHaptics","require","useHaptics","enableHaptics","onHapticTrigger","continuousHapticIntervalMs","hapticIntervalRef","fireDiscreteHaptic","OS","impactAsync","ImpactFeedbackStyle","Light","catch","selectionAsync","startContinuousHaptic","current","interval","setInterval","stopContinuousHaptic","clearInterval"],"sourceRoot":"../../src","sources":["useHaptics.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,MAAM,QAAQ,OAAO;AAC3C,SAASC,QAAQ,QAAQ,cAAc;AACvC,SAASC,QAAQ,QAAQ,
|
|
1
|
+
{"version":3,"names":["useCallback","useRef","Platform","DEFAULTS","ExpoHaptics","require","useHaptics","enableHaptics","onHapticTrigger","continuousHapticIntervalMs","hapticIntervalRef","fireDiscreteHaptic","OS","impactAsync","ImpactFeedbackStyle","Light","catch","selectionAsync","startContinuousHaptic","current","interval","setInterval","stopContinuousHaptic","clearInterval"],"sourceRoot":"../../src","sources":["useHaptics.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,MAAM,QAAQ,OAAO;AAC3C,SAASC,QAAQ,QAAQ,cAAc;AACvC,SAASC,QAAQ,QAAQ,eAAY;;AAErC;AACA;AACA;AACA;AACA;AACA,IAAIC,WAAiD,GAAG,IAAI;AAC5D,IAAI;EACFA,WAAW,GAAGC,OAAO,CAAC,cAAc,CAAC;AACvC,CAAC,CAAC,MAAM;EACN;AAAA;AAeF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAAC;EACzBC,aAAa;EACbC,eAAe;EACfC,0BAA0B,GAAGN,QAAQ,CAACM;AACrB,CAAC,EAAc;EAChC,MAAMC,iBAAiB,GAAGT,MAAM,CAC9B,IACF,CAAC;;EAED;EACA,MAAMU,kBAAkB,GAAGX,WAAW,CAAC,MAAM;IAC3C,IAAI,CAACO,aAAa,EAAE;IAEpB,IAAIC,eAAe,EAAE;MACnBA,eAAe,CAAC,MAAM,CAAC;MACvB;IACF;IAEA,IAAI,CAACJ,WAAW,EAAE;IAElB,IAAIF,QAAQ,CAACU,EAAE,KAAK,SAAS,EAAE;MAC7BR,WAAW,CAACS,WAAW,CAACT,WAAW,CAACU,mBAAmB,CAACC,KAAK,CAAC,CAACC,KAAK,CAClE,MAAM,CAAC,CACT,CAAC;IACH,CAAC,MAAM;MACLZ,WAAW,CAACa,cAAc,CAAC,CAAC,CAACD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C;EACF,CAAC,EAAE,CAACT,aAAa,EAAEC,eAAe,CAAC,CAAC;;EAEpC;EACA,MAAMU,qBAAqB,GAAGlB,WAAW,CAAC,MAAM;IAC9C,IAAI,CAACO,aAAa,EAAE;IAEpB,IAAIC,eAAe,EAAE;MACnBA,eAAe,CAAC,YAAY,CAAC;MAC7B;IACF;IAEA,IAAI,CAACJ,WAAW,EAAE;;IAElB;IACA,IAAIM,iBAAiB,CAACS,OAAO,EAAE;;IAE/B;IACAf,WAAW,CAACS,WAAW,CAACT,WAAW,CAACU,mBAAmB,CAACC,KAAK,CAAC,CAACC,KAAK,CAClE,MAAM,CAAC,CACT,CAAC;IAED,MAAMI,QAAQ,GACZlB,QAAQ,CAACU,EAAE,KAAK,SAAS,GAAG,EAAE,GAAGH,0BAA0B;IAE7DC,iBAAiB,CAACS,OAAO,GAAGE,WAAW,CAAC,MAAM;MAC5CjB,WAAW,CAAES,WAAW,CAACT,WAAW,CAAEU,mBAAmB,CAACC,KAAK,CAAC,CAACC,KAAK,CACpE,MAAM,CAAC,CACT,CAAC;IACH,CAAC,EAAEI,QAAQ,CAAC;EACd,CAAC,EAAE,CAACb,aAAa,EAAEC,eAAe,EAAEC,0BAA0B,CAAC,CAAC;;EAEhE;EACA,MAAMa,oBAAoB,GAAGtB,WAAW,CAAC,MAAM;IAC7C,IAAIU,iBAAiB,CAACS,OAAO,EAAE;MAC7BI,aAAa,CAACb,iBAAiB,CAACS,OAAO,CAAC;MACxCT,iBAAiB,CAACS,OAAO,GAAG,IAAI;IAClC;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IACLR,kBAAkB;IAClBO,qBAAqB;IACrBI;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useCallback, useRef } from 'react';
|
|
4
|
+
import { DEFAULTS } from "./defaults.js";
|
|
5
|
+
/**
|
|
6
|
+
* Haptics hook implementation for Web environments.
|
|
7
|
+
* Delegates to onHapticTrigger if provided, otherwise gracefully no-ops without requiring expo-haptics.
|
|
8
|
+
*/
|
|
9
|
+
export function useHaptics({
|
|
10
|
+
enableHaptics,
|
|
11
|
+
onHapticTrigger,
|
|
12
|
+
continuousHapticIntervalMs = DEFAULTS.continuousHapticIntervalMs
|
|
13
|
+
}) {
|
|
14
|
+
const hapticIntervalRef = useRef(null);
|
|
15
|
+
const fireDiscreteHaptic = useCallback(() => {
|
|
16
|
+
if (!enableHaptics || !onHapticTrigger) return;
|
|
17
|
+
onHapticTrigger('tick');
|
|
18
|
+
}, [enableHaptics, onHapticTrigger]);
|
|
19
|
+
const startContinuousHaptic = useCallback(() => {
|
|
20
|
+
if (!enableHaptics || !onHapticTrigger) return;
|
|
21
|
+
if (hapticIntervalRef.current) return;
|
|
22
|
+
onHapticTrigger('continuous');
|
|
23
|
+
hapticIntervalRef.current = setInterval(() => {
|
|
24
|
+
onHapticTrigger('continuous');
|
|
25
|
+
}, continuousHapticIntervalMs);
|
|
26
|
+
}, [enableHaptics, onHapticTrigger, continuousHapticIntervalMs]);
|
|
27
|
+
const stopContinuousHaptic = useCallback(() => {
|
|
28
|
+
if (hapticIntervalRef.current) {
|
|
29
|
+
clearInterval(hapticIntervalRef.current);
|
|
30
|
+
hapticIntervalRef.current = null;
|
|
31
|
+
}
|
|
32
|
+
}, []);
|
|
33
|
+
return {
|
|
34
|
+
fireDiscreteHaptic,
|
|
35
|
+
startContinuousHaptic,
|
|
36
|
+
stopContinuousHaptic
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=useHaptics.web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useCallback","useRef","DEFAULTS","useHaptics","enableHaptics","onHapticTrigger","continuousHapticIntervalMs","hapticIntervalRef","fireDiscreteHaptic","startContinuousHaptic","current","setInterval","stopContinuousHaptic","clearInterval"],"sourceRoot":"../../src","sources":["useHaptics.web.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,MAAM,QAAQ,OAAO;AAC3C,SAASC,QAAQ,QAAQ,eAAY;AAcrC;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAAC;EACzBC,aAAa;EACbC,eAAe;EACfC,0BAA0B,GAAGJ,QAAQ,CAACI;AACrB,CAAC,EAAc;EAChC,MAAMC,iBAAiB,GAAGN,MAAM,CAC9B,IACF,CAAC;EAED,MAAMO,kBAAkB,GAAGR,WAAW,CAAC,MAAM;IAC3C,IAAI,CAACI,aAAa,IAAI,CAACC,eAAe,EAAE;IACxCA,eAAe,CAAC,MAAM,CAAC;EACzB,CAAC,EAAE,CAACD,aAAa,EAAEC,eAAe,CAAC,CAAC;EAEpC,MAAMI,qBAAqB,GAAGT,WAAW,CAAC,MAAM;IAC9C,IAAI,CAACI,aAAa,IAAI,CAACC,eAAe,EAAE;IACxC,IAAIE,iBAAiB,CAACG,OAAO,EAAE;IAC/BL,eAAe,CAAC,YAAY,CAAC;IAC7BE,iBAAiB,CAACG,OAAO,GAAGC,WAAW,CAAC,MAAM;MAC5CN,eAAe,CAAC,YAAY,CAAC;IAC/B,CAAC,EAAEC,0BAA0B,CAAC;EAChC,CAAC,EAAE,CAACF,aAAa,EAAEC,eAAe,EAAEC,0BAA0B,CAAC,CAAC;EAEhE,MAAMM,oBAAoB,GAAGZ,WAAW,CAAC,MAAM;IAC7C,IAAIO,iBAAiB,CAACG,OAAO,EAAE;MAC7BG,aAAa,CAACN,iBAAiB,CAACG,OAAO,CAAC;MACxCH,iBAAiB,CAACG,OAAO,GAAG,IAAI;IAClC;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IACLF,kBAAkB;IAClBC,qBAAqB;IACrBG;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useState, useRef, useCallback, useMemo, useEffect } from 'react';
|
|
4
|
+
import { useWindowDimensions } from 'react-native';
|
|
5
|
+
import { useSharedValue, withDecay, withTiming, useAnimatedReaction, runOnJS } from 'react-native-reanimated';
|
|
6
|
+
import { Gesture } from 'react-native-gesture-handler';
|
|
7
|
+
import { DEFAULTS } from "./defaults.js";
|
|
8
|
+
import { resolveTickRules } from "./presets.js";
|
|
9
|
+
import { resolveTick } from "./tickResolver.js";
|
|
10
|
+
import { formatDateString, normalizeDate, dateToDayOffset, dayOffsetToDate, computeDayRange, useResolvedTheme } from "./utils.js";
|
|
11
|
+
import { useHaptics } from './useHaptics';
|
|
12
|
+
/**
|
|
13
|
+
* Headless Hook encapsulating gesture physics, Reanimated 3 decay/snapping,
|
|
14
|
+
* windowed tick resolution, and haptics for the Ruler Date Picker.
|
|
15
|
+
*/
|
|
16
|
+
export function useRulerDatePicker(props = {}) {
|
|
17
|
+
const {
|
|
18
|
+
value,
|
|
19
|
+
defaultValue,
|
|
20
|
+
onChange,
|
|
21
|
+
minDate,
|
|
22
|
+
maxDate,
|
|
23
|
+
ticks = 'calendar',
|
|
24
|
+
tickSpacing = DEFAULTS.tickSpacing,
|
|
25
|
+
tickWidth = DEFAULTS.tickWidth,
|
|
26
|
+
rulerHeight = DEFAULTS.rulerHeight,
|
|
27
|
+
theme: propTheme,
|
|
28
|
+
debounceMs = DEFAULTS.debounceMs,
|
|
29
|
+
haptics = true,
|
|
30
|
+
style
|
|
31
|
+
} = props;
|
|
32
|
+
const bufferTicks = DEFAULTS.bufferTicks;
|
|
33
|
+
const isHapticsEnabled = typeof haptics === 'boolean' ? haptics : haptics?.enabled ?? true;
|
|
34
|
+
const resolvedHapticTrigger = typeof haptics === 'object' ? haptics.onTrigger : undefined;
|
|
35
|
+
const fastSwipeTickThreshold = (typeof haptics === 'object' ? haptics.fastSwipeTickThreshold : undefined) ?? DEFAULTS.fastSwipeTickThreshold;
|
|
36
|
+
const continuousHapticIntervalMs = (typeof haptics === 'object' ? haptics.continuousHapticIntervalMs : undefined) ?? DEFAULTS.continuousHapticIntervalMs;
|
|
37
|
+
const height = style?.height ?? DEFAULTS.height;
|
|
38
|
+
|
|
39
|
+
// ── Resolved Theme ────────────────────────────────────────────────────────
|
|
40
|
+
const theme = useResolvedTheme(propTheme);
|
|
41
|
+
|
|
42
|
+
// ── Resolved Rules ────────────────────────────────────────────────────────
|
|
43
|
+
const rules = useMemo(() => resolveTickRules(ticks), [ticks]);
|
|
44
|
+
|
|
45
|
+
// ── Haptics ───────────────────────────────────────────────────────────────
|
|
46
|
+
const {
|
|
47
|
+
fireDiscreteHaptic,
|
|
48
|
+
startContinuousHaptic,
|
|
49
|
+
stopContinuousHaptic
|
|
50
|
+
} = useHaptics({
|
|
51
|
+
enableHaptics: isHapticsEnabled,
|
|
52
|
+
onHapticTrigger: resolvedHapticTrigger,
|
|
53
|
+
continuousHapticIntervalMs
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// ── Reference Time (Midnight Today) ───────────────────────────────────────
|
|
57
|
+
const todayTime = useMemo(() => {
|
|
58
|
+
const d = new Date();
|
|
59
|
+
d.setHours(0, 0, 0, 0);
|
|
60
|
+
return d.getTime();
|
|
61
|
+
}, []);
|
|
62
|
+
|
|
63
|
+
// ── Bounds ────────────────────────────────────────────────────────────────
|
|
64
|
+
const {
|
|
65
|
+
minOffset,
|
|
66
|
+
maxOffset
|
|
67
|
+
} = useMemo(() => computeDayRange(todayTime, minDate, maxDate), [todayTime, minDate, maxDate]);
|
|
68
|
+
|
|
69
|
+
// ── Initial Date Calculation ──────────────────────────────────────────────
|
|
70
|
+
const initialDate = useMemo(() => {
|
|
71
|
+
return normalizeDate(value ?? defaultValue ?? new Date());
|
|
72
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
73
|
+
}, []);
|
|
74
|
+
const initialOffsetDays = useMemo(() => {
|
|
75
|
+
return dateToDayOffset(initialDate, todayTime);
|
|
76
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
77
|
+
}, []);
|
|
78
|
+
|
|
79
|
+
// ── Animated Values ───────────────────────────────────────────────────────
|
|
80
|
+
const translateX = useSharedValue(-initialOffsetDays * tickSpacing);
|
|
81
|
+
const contextX = useSharedValue(0);
|
|
82
|
+
const previousIndex = useSharedValue(-initialOffsetDays);
|
|
83
|
+
const isFastMode = useSharedValue(false);
|
|
84
|
+
|
|
85
|
+
// ── State ─────────────────────────────────────────────────────────────────
|
|
86
|
+
const [selectedDate, setSelectedDate] = useState(initialDate);
|
|
87
|
+
const [selectedDateStr, setSelectedDateStr] = useState(formatDateString(initialDate));
|
|
88
|
+
const [windowCenter, setWindowCenter] = useState(-initialOffsetDays);
|
|
89
|
+
const debounceTimerRef = useRef(null);
|
|
90
|
+
const windowDimensions = useWindowDimensions();
|
|
91
|
+
const width = props.width ?? windowDimensions.width;
|
|
92
|
+
const halfVisible = Math.ceil(width / 2 / tickSpacing);
|
|
93
|
+
const windowSize = halfVisible + bufferTicks;
|
|
94
|
+
|
|
95
|
+
// ── Visible Ticks Resolution ──────────────────────────────────────────────
|
|
96
|
+
const visibleTicks = useMemo(() => {
|
|
97
|
+
const resolved = [];
|
|
98
|
+
const start = Math.max(windowCenter - windowSize, minOffset);
|
|
99
|
+
const end = Math.min(windowCenter + windowSize, maxOffset);
|
|
100
|
+
for (let i = start; i <= end; i++) {
|
|
101
|
+
const d = dayOffsetToDate(i, todayTime);
|
|
102
|
+
const isToday = i === 0;
|
|
103
|
+
const isSelected = formatDateString(d) === selectedDateStr;
|
|
104
|
+
resolved.push(resolveTick({
|
|
105
|
+
date: d,
|
|
106
|
+
offset: i,
|
|
107
|
+
isToday,
|
|
108
|
+
isSelected
|
|
109
|
+
}, rules, theme, tickWidth));
|
|
110
|
+
}
|
|
111
|
+
return resolved;
|
|
112
|
+
}, [windowCenter, windowSize, minOffset, maxOffset, todayTime, selectedDateStr, rules, theme, tickWidth]);
|
|
113
|
+
|
|
114
|
+
// ── Tick Changed Callback ─────────────────────────────────────────────────
|
|
115
|
+
const onTickChanged = useCallback((index, enteringFastMode) => {
|
|
116
|
+
if (enteringFastMode) {
|
|
117
|
+
startContinuousHaptic();
|
|
118
|
+
} else {
|
|
119
|
+
stopContinuousHaptic();
|
|
120
|
+
fireDiscreteHaptic();
|
|
121
|
+
}
|
|
122
|
+
const d = dayOffsetToDate(index, todayTime);
|
|
123
|
+
const dateStr = formatDateString(d);
|
|
124
|
+
setSelectedDate(d);
|
|
125
|
+
setSelectedDateStr(dateStr);
|
|
126
|
+
setWindowCenter(prev => {
|
|
127
|
+
if (Math.abs(index - prev) >= 5) {
|
|
128
|
+
return index;
|
|
129
|
+
}
|
|
130
|
+
return prev;
|
|
131
|
+
});
|
|
132
|
+
if (debounceTimerRef.current) {
|
|
133
|
+
clearTimeout(debounceTimerRef.current);
|
|
134
|
+
}
|
|
135
|
+
debounceTimerRef.current = setTimeout(() => {
|
|
136
|
+
onChange?.(d, dateStr);
|
|
137
|
+
}, debounceMs);
|
|
138
|
+
}, [todayTime, onChange, debounceMs, startContinuousHaptic, stopContinuousHaptic, fireDiscreteHaptic]);
|
|
139
|
+
|
|
140
|
+
// ── Animation Settled Callback ────────────────────────────────────────────
|
|
141
|
+
const onAnimationSettled = useCallback(index => {
|
|
142
|
+
stopContinuousHaptic();
|
|
143
|
+
fireDiscreteHaptic();
|
|
144
|
+
const d = dayOffsetToDate(index, todayTime);
|
|
145
|
+
const dateStr = formatDateString(d);
|
|
146
|
+
setSelectedDate(d);
|
|
147
|
+
setSelectedDateStr(dateStr);
|
|
148
|
+
setWindowCenter(index);
|
|
149
|
+
onChange?.(d, dateStr);
|
|
150
|
+
}, [todayTime, onChange, stopContinuousHaptic, fireDiscreteHaptic]);
|
|
151
|
+
|
|
152
|
+
// ── Animated Reaction ─────────────────────────────────────────────────────
|
|
153
|
+
useAnimatedReaction(() => Math.round(-translateX.value / tickSpacing), (index, prev) => {
|
|
154
|
+
if (index !== prev && index >= minOffset && index <= maxOffset) {
|
|
155
|
+
previousIndex.value = index;
|
|
156
|
+
const ticksSkipped = prev !== null ? Math.abs(index - prev) : 1;
|
|
157
|
+
const shouldBeFast = ticksSkipped > fastSwipeTickThreshold;
|
|
158
|
+
if (shouldBeFast && !isFastMode.value) {
|
|
159
|
+
isFastMode.value = true;
|
|
160
|
+
runOnJS(onTickChanged)(index, true);
|
|
161
|
+
} else if (!shouldBeFast && isFastMode.value) {
|
|
162
|
+
isFastMode.value = false;
|
|
163
|
+
runOnJS(onTickChanged)(index, false);
|
|
164
|
+
} else if (!shouldBeFast) {
|
|
165
|
+
runOnJS(onTickChanged)(index, false);
|
|
166
|
+
}
|
|
167
|
+
if (shouldBeFast && isFastMode.value) {
|
|
168
|
+
runOnJS(onTickChanged)(index, true);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}, [tickSpacing, minOffset, maxOffset, fastSwipeTickThreshold]);
|
|
172
|
+
|
|
173
|
+
// ── Pan Gesture ───────────────────────────────────────────────────────────
|
|
174
|
+
const panGesture = useMemo(() => {
|
|
175
|
+
return Gesture.Pan().onStart(() => {
|
|
176
|
+
contextX.value = translateX.value;
|
|
177
|
+
}).onUpdate(event => {
|
|
178
|
+
translateX.value = contextX.value + event.translationX;
|
|
179
|
+
}).onEnd(event => {
|
|
180
|
+
translateX.value = withDecay({
|
|
181
|
+
velocity: event.velocityX,
|
|
182
|
+
deceleration: 0.99
|
|
183
|
+
}, finished => {
|
|
184
|
+
if (finished) {
|
|
185
|
+
const maxTranslateX = -minOffset * tickSpacing;
|
|
186
|
+
const minTranslateX = -maxOffset * tickSpacing;
|
|
187
|
+
const clampedX = Math.min(Math.max(translateX.value, minTranslateX), maxTranslateX);
|
|
188
|
+
const snappedIndex = Math.round(clampedX / tickSpacing);
|
|
189
|
+
const snappedX = snappedIndex * tickSpacing;
|
|
190
|
+
translateX.value = withTiming(snappedX, {
|
|
191
|
+
duration: 150
|
|
192
|
+
}, done => {
|
|
193
|
+
if (done) {
|
|
194
|
+
isFastMode.value = false;
|
|
195
|
+
const index = Math.round(-snappedX / tickSpacing);
|
|
196
|
+
runOnJS(onAnimationSettled)(index);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
}, [contextX, translateX, minOffset, maxOffset, tickSpacing, onAnimationSettled, isFastMode]);
|
|
203
|
+
|
|
204
|
+
// ── Programmatic Control ──────────────────────────────────────────────────
|
|
205
|
+
const scrollToDate = useCallback((targetDate, animated = true) => {
|
|
206
|
+
const d = normalizeDate(targetDate);
|
|
207
|
+
const offset = dateToDayOffset(d, todayTime);
|
|
208
|
+
const clampedOffset = Math.max(minOffset, Math.min(offset, maxOffset));
|
|
209
|
+
const targetX = -clampedOffset * tickSpacing;
|
|
210
|
+
stopContinuousHaptic();
|
|
211
|
+
if (animated) {
|
|
212
|
+
translateX.value = withTiming(targetX, {
|
|
213
|
+
duration: 250
|
|
214
|
+
}, done => {
|
|
215
|
+
if (done) {
|
|
216
|
+
runOnJS(onAnimationSettled)(clampedOffset);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
} else {
|
|
220
|
+
translateX.value = targetX;
|
|
221
|
+
onAnimationSettled(clampedOffset);
|
|
222
|
+
}
|
|
223
|
+
}, [todayTime, minOffset, maxOffset, tickSpacing, translateX, stopContinuousHaptic, onAnimationSettled]);
|
|
224
|
+
const resetToToday = useCallback((animated = true) => {
|
|
225
|
+
scrollToDate(new Date(todayTime), animated);
|
|
226
|
+
}, [scrollToDate, todayTime]);
|
|
227
|
+
|
|
228
|
+
// ── Sync with external controlled value ───────────────────────────────────
|
|
229
|
+
const prevValuePropRef = useRef(value);
|
|
230
|
+
useEffect(() => {
|
|
231
|
+
if (value !== undefined && value !== prevValuePropRef.current) {
|
|
232
|
+
prevValuePropRef.current = value;
|
|
233
|
+
const target = normalizeDate(value);
|
|
234
|
+
if (formatDateString(target) !== formatDateString(selectedDate)) {
|
|
235
|
+
scrollToDate(target, true);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}, [value, selectedDate, scrollToDate]);
|
|
239
|
+
const isTodaySelected = useMemo(() => {
|
|
240
|
+
return selectedDateStr === formatDateString(new Date(todayTime));
|
|
241
|
+
}, [selectedDateStr, todayTime]);
|
|
242
|
+
return {
|
|
243
|
+
translateX,
|
|
244
|
+
panGesture,
|
|
245
|
+
selectedDate,
|
|
246
|
+
selectedDateStr,
|
|
247
|
+
isTodaySelected,
|
|
248
|
+
visibleTicks,
|
|
249
|
+
theme,
|
|
250
|
+
tickSpacing,
|
|
251
|
+
rulerHeight,
|
|
252
|
+
height,
|
|
253
|
+
width,
|
|
254
|
+
minOffset,
|
|
255
|
+
maxOffset,
|
|
256
|
+
scrollToDate,
|
|
257
|
+
resetToToday
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=useRulerDatePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useState","useRef","useCallback","useMemo","useEffect","useWindowDimensions","useSharedValue","withDecay","withTiming","useAnimatedReaction","runOnJS","Gesture","DEFAULTS","resolveTickRules","resolveTick","formatDateString","normalizeDate","dateToDayOffset","dayOffsetToDate","computeDayRange","useResolvedTheme","useHaptics","useRulerDatePicker","props","value","defaultValue","onChange","minDate","maxDate","ticks","tickSpacing","tickWidth","rulerHeight","theme","propTheme","debounceMs","haptics","style","bufferTicks","isHapticsEnabled","enabled","resolvedHapticTrigger","onTrigger","undefined","fastSwipeTickThreshold","continuousHapticIntervalMs","height","rules","fireDiscreteHaptic","startContinuousHaptic","stopContinuousHaptic","enableHaptics","onHapticTrigger","todayTime","d","Date","setHours","getTime","minOffset","maxOffset","initialDate","initialOffsetDays","translateX","contextX","previousIndex","isFastMode","selectedDate","setSelectedDate","selectedDateStr","setSelectedDateStr","windowCenter","setWindowCenter","debounceTimerRef","windowDimensions","width","halfVisible","Math","ceil","windowSize","visibleTicks","resolved","start","max","end","min","i","isToday","isSelected","push","date","offset","onTickChanged","index","enteringFastMode","dateStr","prev","abs","current","clearTimeout","setTimeout","onAnimationSettled","round","ticksSkipped","shouldBeFast","panGesture","Pan","onStart","onUpdate","event","translationX","onEnd","velocity","velocityX","deceleration","finished","maxTranslateX","minTranslateX","clampedX","snappedIndex","snappedX","duration","done","scrollToDate","targetDate","animated","clampedOffset","targetX","resetToToday","prevValuePropRef","target","isTodaySelected"],"sourceRoot":"../../src","sources":["useRulerDatePicker.ts"],"mappings":"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","ignoreList":[]}
|