@kiosinc/commons-rn 0.7.0 → 0.7.1
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/lib/commonjs/helpers/businessHours.js +63 -23
- package/lib/commonjs/helpers/businessHours.js.map +1 -1
- package/lib/commonjs/localization/translations/en.json +1 -1
- package/lib/module/helpers/businessHours.js +63 -23
- package/lib/module/helpers/businessHours.js.map +1 -1
- package/lib/module/localization/translations/en.json +1 -1
- package/lib/typescript/src/helpers/businessHours.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/helpers/businessHours.ts +70 -35
- package/src/localization/translations/en.json +1 -1
|
@@ -31,35 +31,44 @@ const getTodayStatus = (periods, utcOffset) => {
|
|
|
31
31
|
statusFlag: null
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
+
|
|
35
|
+
// "Local" time for the business using utcOffset in minutes (e.g., PT = -420)
|
|
34
36
|
const now = new Date();
|
|
35
|
-
const localTime = new Date(now.getTime() + (utcOffset ?? 0) *
|
|
36
|
-
const today = localTime.getUTCDay(); // 0-6
|
|
37
|
+
const localTime = new Date(now.getTime() + (utcOffset ?? 0) * 60_000);
|
|
38
|
+
const today = localTime.getUTCDay(); // 0-6, Sunday=0
|
|
37
39
|
|
|
38
|
-
//
|
|
39
|
-
const
|
|
40
|
-
let
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const
|
|
40
|
+
// Ensure a stable order
|
|
41
|
+
const sorted = [...periods].sort((a, b) => Number(a.open.day) - Number(b.open.day));
|
|
42
|
+
let nextOpenDate = null;
|
|
43
|
+
let nextOpenTimeStr = null;
|
|
44
|
+
for (const p of sorted) {
|
|
45
|
+
const openDay = Number(p.open.day);
|
|
46
|
+
const closeDay = Number(p.close.day);
|
|
47
|
+
const openTime = p.open.time; // "HHmm"
|
|
48
|
+
const closeTime = p.close.time; // "HHmm"
|
|
46
49
|
|
|
47
|
-
//
|
|
50
|
+
// Build open & close dates relative to localTime's week
|
|
48
51
|
const openDate = new Date(localTime);
|
|
49
|
-
const closeDate = new Date(localTime);
|
|
50
|
-
|
|
51
|
-
// Set open time
|
|
52
52
|
openDate.setUTCDate(localTime.getUTCDate() + (openDay - today + 7) % 7);
|
|
53
53
|
openDate.setUTCHours(Number(openTime.slice(0, 2)));
|
|
54
54
|
openDate.setUTCMinutes(Number(openTime.slice(2, 4)));
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
openDate.setUTCSeconds(0, 0);
|
|
56
|
+
const closeDate = new Date(localTime);
|
|
57
57
|
closeDate.setUTCDate(localTime.getUTCDate() + (closeDay - today + 7) % 7);
|
|
58
58
|
closeDate.setUTCHours(Number(closeTime.slice(0, 2)));
|
|
59
59
|
closeDate.setUTCMinutes(Number(closeTime.slice(2, 4)));
|
|
60
|
-
|
|
60
|
+
closeDate.setUTCSeconds(0, 0);
|
|
61
|
+
|
|
62
|
+
// Handle overnight windows (close after midnight/next day)
|
|
63
|
+
let normalizedClose = closeDate;
|
|
64
|
+
if (normalizedClose <= openDate) {
|
|
65
|
+
normalizedClose = new Date(closeDate.getTime() + 24 * 60 * 60 * 1000);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Is open now?
|
|
69
|
+
const isOpenNow = localTime >= openDate && localTime < normalizedClose;
|
|
61
70
|
if (isOpenNow) {
|
|
62
|
-
const minutesToClose = Math.floor((
|
|
71
|
+
const minutesToClose = Math.floor((normalizedClose.getTime() - localTime.getTime()) / 60_000);
|
|
63
72
|
const isClosingSoon = minutesToClose < 60;
|
|
64
73
|
return {
|
|
65
74
|
main: isClosingSoon ? (0, _i18next.t)('restaurant.closesSoon') : (0, _i18next.t)('restaurant.openNow'),
|
|
@@ -68,7 +77,9 @@ const getTodayStatus = (periods, utcOffset) => {
|
|
|
68
77
|
statusFlag: isClosingSoon ? 'closingSoon' : null
|
|
69
78
|
};
|
|
70
79
|
}
|
|
71
|
-
|
|
80
|
+
|
|
81
|
+
// Opening soon (within 60 minutes)
|
|
82
|
+
const minutesToOpen = Math.floor((openDate.getTime() - localTime.getTime()) / 60_000);
|
|
72
83
|
if (minutesToOpen > 0 && minutesToOpen <= 60) {
|
|
73
84
|
return {
|
|
74
85
|
main: (0, _i18next.t)('restaurant.openingSoon'),
|
|
@@ -78,14 +89,43 @@ const getTodayStatus = (periods, utcOffset) => {
|
|
|
78
89
|
};
|
|
79
90
|
}
|
|
80
91
|
|
|
81
|
-
// Track next opening
|
|
82
|
-
if (
|
|
83
|
-
|
|
92
|
+
// Track the next future opening strictly after now
|
|
93
|
+
if (openDate > localTime) {
|
|
94
|
+
if (!nextOpenDate || openDate < nextOpenDate) {
|
|
95
|
+
nextOpenDate = openDate;
|
|
96
|
+
nextOpenTimeStr = openTime;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// If we didn’t find a future opening in the current week window,
|
|
102
|
+
// the next opening is the earliest weekly opening + 7 days.
|
|
103
|
+
if (!nextOpenDate) {
|
|
104
|
+
let earliestOpenDate = null;
|
|
105
|
+
let earliestOpenTimeStr = null;
|
|
106
|
+
for (const p of sorted) {
|
|
107
|
+
const openDay = Number(p.open.day);
|
|
108
|
+
const openTime = p.open.time;
|
|
109
|
+
const openDate = new Date(localTime);
|
|
110
|
+
openDate.setUTCDate(localTime.getUTCDate() + (openDay - today + 7) % 7);
|
|
111
|
+
openDate.setUTCHours(Number(openTime.slice(0, 2)));
|
|
112
|
+
openDate.setUTCMinutes(Number(openTime.slice(2, 4)));
|
|
113
|
+
openDate.setUTCSeconds(0, 0);
|
|
114
|
+
|
|
115
|
+
// If it's not in the future relative to localTime, push to next week
|
|
116
|
+
const rolled = openDate <= localTime ? new Date(openDate.getTime() + 7 * 24 * 60 * 60 * 1000) : openDate;
|
|
117
|
+
if (!earliestOpenDate || rolled < earliestOpenDate) {
|
|
118
|
+
earliestOpenDate = rolled;
|
|
119
|
+
earliestOpenTimeStr = openTime;
|
|
120
|
+
}
|
|
84
121
|
}
|
|
122
|
+
nextOpenDate = earliestOpenDate;
|
|
123
|
+
nextOpenTimeStr = earliestOpenTimeStr;
|
|
85
124
|
}
|
|
125
|
+
const weekdayFromDate = d => getWeekDayString(d.getUTCDay());
|
|
86
126
|
return {
|
|
87
127
|
main: (0, _i18next.t)('restaurant.closedNow'),
|
|
88
|
-
additional:
|
|
128
|
+
additional: nextOpenDate && nextOpenTimeStr ? `${(0, _i18next.t)('restaurant.opensAt')} ${weekdayFromDate(nextOpenDate)} ${formatPeriodTime(nextOpenTimeStr)}` : undefined,
|
|
89
129
|
isOpen: false,
|
|
90
130
|
statusFlag: null
|
|
91
131
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_i18next","require","getWeekDayString","day","days","t","exports","formatPeriodTime","time","hours","parseInt","substring","minutes","period","formattedHours","toString","padStart","getTodayStatus","periods","utcOffset","length","main","isOpen","statusFlag","now","Date","localTime","getTime","today","getUTCDay","
|
|
1
|
+
{"version":3,"names":["_i18next","require","getWeekDayString","day","days","t","exports","formatPeriodTime","time","hours","parseInt","substring","minutes","period","formattedHours","toString","padStart","getTodayStatus","periods","utcOffset","length","main","isOpen","statusFlag","now","Date","localTime","getTime","today","getUTCDay","sorted","sort","a","b","Number","open","nextOpenDate","nextOpenTimeStr","p","openDay","closeDay","close","openTime","closeTime","openDate","setUTCDate","getUTCDate","setUTCHours","slice","setUTCMinutes","setUTCSeconds","closeDate","normalizedClose","isOpenNow","minutesToClose","Math","floor","isClosingSoon","additional","minutesToOpen","earliestOpenDate","earliestOpenTimeStr","rolled","weekdayFromDate","d","undefined","WEEK_DAYS","formatBusinessHours","map","dayNum","dayMap","forEach"],"sourceRoot":"../../../src","sources":["helpers/businessHours.ts"],"mappings":"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"}
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"payByCard": "Pay by card",
|
|
75
75
|
"confirmCardDelete": "Confirm Delete Card",
|
|
76
76
|
"cardDeleteDesc": "Are you sure you want to delete card ending in {{card}}?",
|
|
77
|
-
"total": "
|
|
77
|
+
"total": "Total",
|
|
78
78
|
"createBusiness": "Create Business",
|
|
79
79
|
"selectBusiness": "Select Business",
|
|
80
80
|
"searchBusiness": "Search Business",
|
|
@@ -23,35 +23,44 @@ export const getTodayStatus = (periods, utcOffset) => {
|
|
|
23
23
|
statusFlag: null
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
|
+
|
|
27
|
+
// "Local" time for the business using utcOffset in minutes (e.g., PT = -420)
|
|
26
28
|
const now = new Date();
|
|
27
|
-
const localTime = new Date(now.getTime() + (utcOffset ?? 0) *
|
|
28
|
-
const today = localTime.getUTCDay(); // 0-6
|
|
29
|
+
const localTime = new Date(now.getTime() + (utcOffset ?? 0) * 60_000);
|
|
30
|
+
const today = localTime.getUTCDay(); // 0-6, Sunday=0
|
|
29
31
|
|
|
30
|
-
//
|
|
31
|
-
const
|
|
32
|
-
let
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
32
|
+
// Ensure a stable order
|
|
33
|
+
const sorted = [...periods].sort((a, b) => Number(a.open.day) - Number(b.open.day));
|
|
34
|
+
let nextOpenDate = null;
|
|
35
|
+
let nextOpenTimeStr = null;
|
|
36
|
+
for (const p of sorted) {
|
|
37
|
+
const openDay = Number(p.open.day);
|
|
38
|
+
const closeDay = Number(p.close.day);
|
|
39
|
+
const openTime = p.open.time; // "HHmm"
|
|
40
|
+
const closeTime = p.close.time; // "HHmm"
|
|
38
41
|
|
|
39
|
-
//
|
|
42
|
+
// Build open & close dates relative to localTime's week
|
|
40
43
|
const openDate = new Date(localTime);
|
|
41
|
-
const closeDate = new Date(localTime);
|
|
42
|
-
|
|
43
|
-
// Set open time
|
|
44
44
|
openDate.setUTCDate(localTime.getUTCDate() + (openDay - today + 7) % 7);
|
|
45
45
|
openDate.setUTCHours(Number(openTime.slice(0, 2)));
|
|
46
46
|
openDate.setUTCMinutes(Number(openTime.slice(2, 4)));
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
openDate.setUTCSeconds(0, 0);
|
|
48
|
+
const closeDate = new Date(localTime);
|
|
49
49
|
closeDate.setUTCDate(localTime.getUTCDate() + (closeDay - today + 7) % 7);
|
|
50
50
|
closeDate.setUTCHours(Number(closeTime.slice(0, 2)));
|
|
51
51
|
closeDate.setUTCMinutes(Number(closeTime.slice(2, 4)));
|
|
52
|
-
|
|
52
|
+
closeDate.setUTCSeconds(0, 0);
|
|
53
|
+
|
|
54
|
+
// Handle overnight windows (close after midnight/next day)
|
|
55
|
+
let normalizedClose = closeDate;
|
|
56
|
+
if (normalizedClose <= openDate) {
|
|
57
|
+
normalizedClose = new Date(closeDate.getTime() + 24 * 60 * 60 * 1000);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Is open now?
|
|
61
|
+
const isOpenNow = localTime >= openDate && localTime < normalizedClose;
|
|
53
62
|
if (isOpenNow) {
|
|
54
|
-
const minutesToClose = Math.floor((
|
|
63
|
+
const minutesToClose = Math.floor((normalizedClose.getTime() - localTime.getTime()) / 60_000);
|
|
55
64
|
const isClosingSoon = minutesToClose < 60;
|
|
56
65
|
return {
|
|
57
66
|
main: isClosingSoon ? t('restaurant.closesSoon') : t('restaurant.openNow'),
|
|
@@ -60,7 +69,9 @@ export const getTodayStatus = (periods, utcOffset) => {
|
|
|
60
69
|
statusFlag: isClosingSoon ? 'closingSoon' : null
|
|
61
70
|
};
|
|
62
71
|
}
|
|
63
|
-
|
|
72
|
+
|
|
73
|
+
// Opening soon (within 60 minutes)
|
|
74
|
+
const minutesToOpen = Math.floor((openDate.getTime() - localTime.getTime()) / 60_000);
|
|
64
75
|
if (minutesToOpen > 0 && minutesToOpen <= 60) {
|
|
65
76
|
return {
|
|
66
77
|
main: t('restaurant.openingSoon'),
|
|
@@ -70,14 +81,43 @@ export const getTodayStatus = (periods, utcOffset) => {
|
|
|
70
81
|
};
|
|
71
82
|
}
|
|
72
83
|
|
|
73
|
-
// Track next opening
|
|
74
|
-
if (
|
|
75
|
-
|
|
84
|
+
// Track the next future opening strictly after now
|
|
85
|
+
if (openDate > localTime) {
|
|
86
|
+
if (!nextOpenDate || openDate < nextOpenDate) {
|
|
87
|
+
nextOpenDate = openDate;
|
|
88
|
+
nextOpenTimeStr = openTime;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// If we didn’t find a future opening in the current week window,
|
|
94
|
+
// the next opening is the earliest weekly opening + 7 days.
|
|
95
|
+
if (!nextOpenDate) {
|
|
96
|
+
let earliestOpenDate = null;
|
|
97
|
+
let earliestOpenTimeStr = null;
|
|
98
|
+
for (const p of sorted) {
|
|
99
|
+
const openDay = Number(p.open.day);
|
|
100
|
+
const openTime = p.open.time;
|
|
101
|
+
const openDate = new Date(localTime);
|
|
102
|
+
openDate.setUTCDate(localTime.getUTCDate() + (openDay - today + 7) % 7);
|
|
103
|
+
openDate.setUTCHours(Number(openTime.slice(0, 2)));
|
|
104
|
+
openDate.setUTCMinutes(Number(openTime.slice(2, 4)));
|
|
105
|
+
openDate.setUTCSeconds(0, 0);
|
|
106
|
+
|
|
107
|
+
// If it's not in the future relative to localTime, push to next week
|
|
108
|
+
const rolled = openDate <= localTime ? new Date(openDate.getTime() + 7 * 24 * 60 * 60 * 1000) : openDate;
|
|
109
|
+
if (!earliestOpenDate || rolled < earliestOpenDate) {
|
|
110
|
+
earliestOpenDate = rolled;
|
|
111
|
+
earliestOpenTimeStr = openTime;
|
|
112
|
+
}
|
|
76
113
|
}
|
|
114
|
+
nextOpenDate = earliestOpenDate;
|
|
115
|
+
nextOpenTimeStr = earliestOpenTimeStr;
|
|
77
116
|
}
|
|
117
|
+
const weekdayFromDate = d => getWeekDayString(d.getUTCDay());
|
|
78
118
|
return {
|
|
79
119
|
main: t('restaurant.closedNow'),
|
|
80
|
-
additional:
|
|
120
|
+
additional: nextOpenDate && nextOpenTimeStr ? `${t('restaurant.opensAt')} ${weekdayFromDate(nextOpenDate)} ${formatPeriodTime(nextOpenTimeStr)}` : undefined,
|
|
81
121
|
isOpen: false,
|
|
82
122
|
statusFlag: null
|
|
83
123
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["t","getWeekDayString","day","days","formatPeriodTime","time","hours","parseInt","substring","minutes","period","formattedHours","toString","padStart","getTodayStatus","periods","utcOffset","length","main","isOpen","statusFlag","now","Date","localTime","getTime","today","getUTCDay","
|
|
1
|
+
{"version":3,"names":["t","getWeekDayString","day","days","formatPeriodTime","time","hours","parseInt","substring","minutes","period","formattedHours","toString","padStart","getTodayStatus","periods","utcOffset","length","main","isOpen","statusFlag","now","Date","localTime","getTime","today","getUTCDay","sorted","sort","a","b","Number","open","nextOpenDate","nextOpenTimeStr","p","openDay","closeDay","close","openTime","closeTime","openDate","setUTCDate","getUTCDate","setUTCHours","slice","setUTCMinutes","setUTCSeconds","closeDate","normalizedClose","isOpenNow","minutesToClose","Math","floor","isClosingSoon","additional","minutesToOpen","earliestOpenDate","earliestOpenTimeStr","rolled","weekdayFromDate","d","undefined","WEEK_DAYS","formatBusinessHours","map","dayNum","dayMap","forEach"],"sourceRoot":"../../../src","sources":["helpers/businessHours.ts"],"mappings":"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"}
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"payByCard": "Pay by card",
|
|
75
75
|
"confirmCardDelete": "Confirm Delete Card",
|
|
76
76
|
"cardDeleteDesc": "Are you sure you want to delete card ending in {{card}}?",
|
|
77
|
-
"total": "
|
|
77
|
+
"total": "Total",
|
|
78
78
|
"createBusiness": "Create Business",
|
|
79
79
|
"selectBusiness": "Select Business",
|
|
80
80
|
"searchBusiness": "Search Business",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"businessHours.d.ts","sourceRoot":"","sources":["../../../../src/helpers/businessHours.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGrD,eAAO,MAAM,gBAAgB,QAAS,MAAM,KAAG,MAW9C,CAAC;AAEF,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,MAY/C,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,aAAa,GAAG,aAAa,GAAG,IAAI,CAAC;CACnD,CAAC;AAEF,eAAO,MAAM,cAAc,YAChB,MAAM,EAAE,GAAG,IAAI,cACZ,MAAM,KACjB,
|
|
1
|
+
{"version":3,"file":"businessHours.d.ts","sourceRoot":"","sources":["../../../../src/helpers/businessHours.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGrD,eAAO,MAAM,gBAAgB,QAAS,MAAM,KAAG,MAW9C,CAAC;AAEF,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,MAY/C,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,aAAa,GAAG,aAAa,GAAG,IAAI,CAAC;CACnD,CAAC;AAEF,eAAO,MAAM,cAAc,YAChB,MAAM,EAAE,GAAG,IAAI,cACZ,MAAM,KACjB,WAqIF,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAIF,eAAO,MAAM,mBAAmB,YACrB,MAAM,EAAE,GAAG,IAAI,KACvB,kBAAkB,EAqBpB,CAAC"}
|
package/package.json
CHANGED
|
@@ -47,45 +47,51 @@ export const getTodayStatus = (
|
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
// "Local" time for the business using utcOffset in minutes (e.g., PT = -420)
|
|
50
51
|
const now = new Date();
|
|
51
|
-
const localTime = new Date(now.getTime() + (utcOffset ?? 0) *
|
|
52
|
+
const localTime = new Date(now.getTime() + (utcOffset ?? 0) * 60_000);
|
|
52
53
|
|
|
53
|
-
const today = localTime.getUTCDay(); // 0-6
|
|
54
|
+
const today = localTime.getUTCDay(); // 0-6, Sunday=0
|
|
54
55
|
|
|
55
|
-
//
|
|
56
|
-
const
|
|
56
|
+
// Ensure a stable order
|
|
57
|
+
const sorted = [...periods].sort(
|
|
57
58
|
(a, b) => Number(a.open.day) - Number(b.open.day)
|
|
58
59
|
);
|
|
59
60
|
|
|
60
|
-
let
|
|
61
|
+
let nextOpenDate: Date | null = null;
|
|
62
|
+
let nextOpenTimeStr: string | null = null;
|
|
61
63
|
|
|
62
|
-
for (const
|
|
63
|
-
const openDay = Number(
|
|
64
|
-
const closeDay = Number(
|
|
65
|
-
const openTime =
|
|
66
|
-
const closeTime =
|
|
64
|
+
for (const p of sorted) {
|
|
65
|
+
const openDay = Number(p.open.day);
|
|
66
|
+
const closeDay = Number(p.close.day);
|
|
67
|
+
const openTime = p.open.time; // "HHmm"
|
|
68
|
+
const closeTime = p.close.time; // "HHmm"
|
|
67
69
|
|
|
68
|
-
//
|
|
70
|
+
// Build open & close dates relative to localTime's week
|
|
69
71
|
const openDate = new Date(localTime);
|
|
70
|
-
const closeDate = new Date(localTime);
|
|
71
|
-
|
|
72
|
-
// Set open time
|
|
73
72
|
openDate.setUTCDate(localTime.getUTCDate() + ((openDay - today + 7) % 7));
|
|
74
73
|
openDate.setUTCHours(Number(openTime.slice(0, 2)));
|
|
75
74
|
openDate.setUTCMinutes(Number(openTime.slice(2, 4)));
|
|
75
|
+
openDate.setUTCSeconds(0, 0);
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
const closeDate = new Date(localTime);
|
|
78
78
|
closeDate.setUTCDate(localTime.getUTCDate() + ((closeDay - today + 7) % 7));
|
|
79
79
|
closeDate.setUTCHours(Number(closeTime.slice(0, 2)));
|
|
80
80
|
closeDate.setUTCMinutes(Number(closeTime.slice(2, 4)));
|
|
81
|
+
closeDate.setUTCSeconds(0, 0);
|
|
81
82
|
|
|
82
|
-
|
|
83
|
+
// Handle overnight windows (close after midnight/next day)
|
|
84
|
+
let normalizedClose = closeDate;
|
|
85
|
+
if (normalizedClose <= openDate) {
|
|
86
|
+
normalizedClose = new Date(closeDate.getTime() + 24 * 60 * 60 * 1000);
|
|
87
|
+
}
|
|
83
88
|
|
|
89
|
+
// Is open now?
|
|
90
|
+
const isOpenNow = localTime >= openDate && localTime < normalizedClose;
|
|
84
91
|
if (isOpenNow) {
|
|
85
92
|
const minutesToClose = Math.floor(
|
|
86
|
-
(
|
|
93
|
+
(normalizedClose.getTime() - localTime.getTime()) / 60_000
|
|
87
94
|
);
|
|
88
|
-
|
|
89
95
|
const isClosingSoon = minutesToClose < 60;
|
|
90
96
|
|
|
91
97
|
return {
|
|
@@ -100,10 +106,10 @@ export const getTodayStatus = (
|
|
|
100
106
|
};
|
|
101
107
|
}
|
|
102
108
|
|
|
109
|
+
// Opening soon (within 60 minutes)
|
|
103
110
|
const minutesToOpen = Math.floor(
|
|
104
|
-
(openDate.getTime() - localTime.getTime()) /
|
|
111
|
+
(openDate.getTime() - localTime.getTime()) / 60_000
|
|
105
112
|
);
|
|
106
|
-
|
|
107
113
|
if (minutesToOpen > 0 && minutesToOpen <= 60) {
|
|
108
114
|
return {
|
|
109
115
|
main: t('restaurant.openingSoon'),
|
|
@@ -113,26 +119,55 @@ export const getTodayStatus = (
|
|
|
113
119
|
};
|
|
114
120
|
}
|
|
115
121
|
|
|
116
|
-
// Track next opening
|
|
117
|
-
if (
|
|
118
|
-
!
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
((Number(nextOpeningPeriod.open.day) - today + 7) % 7) * 86400000
|
|
123
|
-
)
|
|
124
|
-
) {
|
|
125
|
-
nextOpeningPeriod = period;
|
|
122
|
+
// Track the next future opening strictly after now
|
|
123
|
+
if (openDate > localTime) {
|
|
124
|
+
if (!nextOpenDate || openDate < nextOpenDate) {
|
|
125
|
+
nextOpenDate = openDate;
|
|
126
|
+
nextOpenTimeStr = openTime;
|
|
127
|
+
}
|
|
126
128
|
}
|
|
127
129
|
}
|
|
128
130
|
|
|
131
|
+
// If we didn’t find a future opening in the current week window,
|
|
132
|
+
// the next opening is the earliest weekly opening + 7 days.
|
|
133
|
+
if (!nextOpenDate) {
|
|
134
|
+
let earliestOpenDate: Date | null = null;
|
|
135
|
+
let earliestOpenTimeStr: string | null = null;
|
|
136
|
+
for (const p of sorted) {
|
|
137
|
+
const openDay = Number(p.open.day);
|
|
138
|
+
const openTime = p.open.time;
|
|
139
|
+
|
|
140
|
+
const openDate = new Date(localTime);
|
|
141
|
+
openDate.setUTCDate(localTime.getUTCDate() + ((openDay - today + 7) % 7));
|
|
142
|
+
openDate.setUTCHours(Number(openTime.slice(0, 2)));
|
|
143
|
+
openDate.setUTCMinutes(Number(openTime.slice(2, 4)));
|
|
144
|
+
openDate.setUTCSeconds(0, 0);
|
|
145
|
+
|
|
146
|
+
// If it's not in the future relative to localTime, push to next week
|
|
147
|
+
const rolled =
|
|
148
|
+
openDate <= localTime
|
|
149
|
+
? new Date(openDate.getTime() + 7 * 24 * 60 * 60 * 1000)
|
|
150
|
+
: openDate;
|
|
151
|
+
|
|
152
|
+
if (!earliestOpenDate || rolled < earliestOpenDate) {
|
|
153
|
+
earliestOpenDate = rolled;
|
|
154
|
+
earliestOpenTimeStr = openTime;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
nextOpenDate = earliestOpenDate;
|
|
158
|
+
nextOpenTimeStr = earliestOpenTimeStr;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const weekdayFromDate = (d: Date) => getWeekDayString(d.getUTCDay());
|
|
162
|
+
|
|
129
163
|
return {
|
|
130
164
|
main: t('restaurant.closedNow'),
|
|
131
|
-
additional:
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
165
|
+
additional:
|
|
166
|
+
nextOpenDate && nextOpenTimeStr
|
|
167
|
+
? `${t('restaurant.opensAt')} ${weekdayFromDate(
|
|
168
|
+
nextOpenDate
|
|
169
|
+
)} ${formatPeriodTime(nextOpenTimeStr)}`
|
|
170
|
+
: undefined,
|
|
136
171
|
isOpen: false,
|
|
137
172
|
statusFlag: null,
|
|
138
173
|
};
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"payByCard": "Pay by card",
|
|
75
75
|
"confirmCardDelete": "Confirm Delete Card",
|
|
76
76
|
"cardDeleteDesc": "Are you sure you want to delete card ending in {{card}}?",
|
|
77
|
-
"total": "
|
|
77
|
+
"total": "Total",
|
|
78
78
|
"createBusiness": "Create Business",
|
|
79
79
|
"selectBusiness": "Select Business",
|
|
80
80
|
"searchBusiness": "Search Business",
|