@embedreach/components 0.1.12 → 0.1.14
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/dist/chunks/B4MFY5CR.js +12394 -0
- package/dist/chunks/HO4MOOFI.js +38 -0
- package/dist/chunks/HUY7CZI3.js +47 -0
- package/dist/chunks/index.js +37019 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.es.js +7 -0
- package/dist/index.umd.js +1233 -0
- package/dist/styles.css +1 -0
- package/package.json +21 -11
- package/dist/AdDashboard-BEWUbw3u.js +0 -2535
- package/dist/AdDashboard-BEWUbw3u.js.map +0 -1
- package/dist/AdMetricsDashboardHeader-V03rQC0y.js +0 -23
- package/dist/AdMetricsDashboardHeader-V03rQC0y.js.map +0 -1
- package/dist/assets/style-Dpp-A13q.css +0 -1
- package/dist/assets/style-J0h0u-n8.css +0 -1
- package/dist/index-OHOroL_D.js +0 -17027
- package/dist/index-OHOroL_D.js.map +0 -1
- package/dist/reach.es.js +0 -6
- package/dist/reach.es.js.map +0 -1
- package/dist/reach.umd.js +0 -16
- package/dist/reach.umd.js.map +0 -1
- package/dist/styles.module-B1IY0-9d.js +0 -342
- package/dist/styles.module-B1IY0-9d.js.map +0 -1
|
@@ -1,342 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useFlags } from "launchdarkly-react-client-sdk";
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
import React__default, { useState, useEffect } from "react";
|
|
5
|
-
import { useTranslation } from "react-i18next";
|
|
6
|
-
import { useNavigate } from "react-router-dom";
|
|
7
|
-
import { n as cn, U as PoweredByReach, V as analytics, W as megaphone, X as useOAuthCard, B as Button, Y as OAuthCardWrapper } from "./index-OHOroL_D.js";
|
|
8
|
-
import { Settings, X, BarChart2, Megaphone } from "lucide-react";
|
|
9
|
-
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
10
|
-
import { cva } from "class-variance-authority";
|
|
11
|
-
const calculateDateRange = (preset) => {
|
|
12
|
-
const today = /* @__PURE__ */ new Date();
|
|
13
|
-
today.setHours(0, 0, 0, 0);
|
|
14
|
-
const endDate = new Date(today);
|
|
15
|
-
endDate.setDate(today.getDate() - 1);
|
|
16
|
-
const startDate = new Date(today);
|
|
17
|
-
startDate.setHours(0, 0, 0, 0);
|
|
18
|
-
switch (preset) {
|
|
19
|
-
case "last-week":
|
|
20
|
-
startDate.setDate(today.getDate() - 7);
|
|
21
|
-
break;
|
|
22
|
-
case "last-month":
|
|
23
|
-
startDate.setDate(today.getDate() - 30);
|
|
24
|
-
break;
|
|
25
|
-
case "last-quarter":
|
|
26
|
-
startDate.setDate(today.getDate() - 90);
|
|
27
|
-
break;
|
|
28
|
-
case "last-year":
|
|
29
|
-
startDate.setDate(today.getDate() - 365);
|
|
30
|
-
break;
|
|
31
|
-
default:
|
|
32
|
-
throw new Error("Invalid date range preset");
|
|
33
|
-
}
|
|
34
|
-
return {
|
|
35
|
-
from: startDate,
|
|
36
|
-
to: endDate
|
|
37
|
-
};
|
|
38
|
-
};
|
|
39
|
-
const checkIfNearExpiry = (account) => {
|
|
40
|
-
var _a, _b;
|
|
41
|
-
const bufferTime = 24 * 60 * 60 * 1e3 * 5;
|
|
42
|
-
if (account.ad_platform === "google") {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
const isNearExpiry = new Date(
|
|
46
|
-
((_b = (_a = account.ad_platform_metadata) == null ? void 0 : _a.encrypted_credentials) == null ? void 0 : _b.expiryDate) || 0
|
|
47
|
-
).getTime() - bufferTime < Date.now();
|
|
48
|
-
return isNearExpiry;
|
|
49
|
-
};
|
|
50
|
-
const formatDateToString = (date) => {
|
|
51
|
-
const year = date.getUTCFullYear();
|
|
52
|
-
const month = String(date.getUTCMonth() + 1).padStart(2, "0");
|
|
53
|
-
const day = String(date.getUTCDate()).padStart(2, "0");
|
|
54
|
-
return `${year}-${month}-${day}`;
|
|
55
|
-
};
|
|
56
|
-
const InteractiveHoverButton = React__default.forwardRef(
|
|
57
|
-
({
|
|
58
|
-
text = "Button",
|
|
59
|
-
className,
|
|
60
|
-
pulse = false,
|
|
61
|
-
pulseDuration = 1e4,
|
|
62
|
-
...props
|
|
63
|
-
}, ref) => {
|
|
64
|
-
const [isPulsing, setIsPulsing] = useState(pulse);
|
|
65
|
-
useEffect(() => {
|
|
66
|
-
if (pulse && pulseDuration) {
|
|
67
|
-
setIsPulsing(true);
|
|
68
|
-
const timer = setTimeout(() => {
|
|
69
|
-
setIsPulsing(false);
|
|
70
|
-
}, pulseDuration);
|
|
71
|
-
return () => clearTimeout(timer);
|
|
72
|
-
}
|
|
73
|
-
}, [pulse, pulseDuration]);
|
|
74
|
-
const PulseElement = () => /* @__PURE__ */ jsx("div", { className: "right-1.5 top-3.5 z-20", children: /* @__PURE__ */ jsxs("span", { className: "relative flex h-3 w-3", children: [
|
|
75
|
-
/* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-[ping_1s_ease-in-out_infinite] rounded-full bg-red-500 opacity-75" }),
|
|
76
|
-
/* @__PURE__ */ jsx("span", { className: "relative inline-flex rounded-full h-3 w-3 bg-red-600" })
|
|
77
|
-
] }) });
|
|
78
|
-
return /* @__PURE__ */ jsxs(
|
|
79
|
-
"button",
|
|
80
|
-
{
|
|
81
|
-
ref,
|
|
82
|
-
className: cn(
|
|
83
|
-
"group relative w-32 cursor-pointer overflow-hidden rounded-full border bg-[var(--reach-background)] p-1 text-center font-semibold",
|
|
84
|
-
className
|
|
85
|
-
),
|
|
86
|
-
...props,
|
|
87
|
-
children: [
|
|
88
|
-
/* @__PURE__ */ jsxs("span", { className: "flex items-center justify-evenly transition-all duration-300 group-hover:translate-x-12 group-hover:opacity-0 px-2 py-1", children: [
|
|
89
|
-
/* @__PURE__ */ jsx(PoweredByReach, { showText: false }),
|
|
90
|
-
isPulsing && /* @__PURE__ */ jsx(PulseElement, {})
|
|
91
|
-
] }),
|
|
92
|
-
/* @__PURE__ */ jsxs("div", { className: "absolute top-0 z-10 flex h-full w-full translate-x-12 items-center justify-center gap-2 text-primary-foreground opacity-0 transition-all duration-300 group-hover:-translate-x-1 group-hover:opacity-100", children: [
|
|
93
|
-
/* @__PURE__ */ jsx("span", { children: text }),
|
|
94
|
-
!isPulsing && /* @__PURE__ */ jsx(Settings, {}),
|
|
95
|
-
isPulsing && /* @__PURE__ */ jsx(PulseElement, {})
|
|
96
|
-
] }),
|
|
97
|
-
/* @__PURE__ */ jsx("div", { className: "absolute left-[20%] top-[40%] h-2 w-2 scale-[0] rounded-lg bg-[var(--reach-primary)] transition-all duration-300 group-hover:left-[0%] group-hover:top-[0%] group-hover:h-full group-hover:w-full group-hover:scale-[1.8] group-hover:bg-[var(--reach-primary)]" })
|
|
98
|
-
]
|
|
99
|
-
}
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
);
|
|
103
|
-
InteractiveHoverButton.displayName = "InteractiveHoverButton";
|
|
104
|
-
const Sheet = DialogPrimitive.Root;
|
|
105
|
-
const SheetTrigger = DialogPrimitive.Trigger;
|
|
106
|
-
const SheetPortal = DialogPrimitive.Portal;
|
|
107
|
-
const SheetOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
108
|
-
DialogPrimitive.Overlay,
|
|
109
|
-
{
|
|
110
|
-
className: cn(
|
|
111
|
-
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
112
|
-
className
|
|
113
|
-
),
|
|
114
|
-
...props,
|
|
115
|
-
ref
|
|
116
|
-
}
|
|
117
|
-
));
|
|
118
|
-
SheetOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
119
|
-
const sheetVariants = cva(
|
|
120
|
-
"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
121
|
-
{
|
|
122
|
-
variants: {
|
|
123
|
-
side: {
|
|
124
|
-
top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
|
|
125
|
-
bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
|
|
126
|
-
left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
|
|
127
|
-
right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
defaultVariants: {
|
|
131
|
-
side: "right"
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
);
|
|
135
|
-
const SheetContent = React.forwardRef(({ side = "right", className, children, ...props }, ref) => /* @__PURE__ */ jsxs(SheetPortal, { children: [
|
|
136
|
-
/* @__PURE__ */ jsx(SheetOverlay, {}),
|
|
137
|
-
/* @__PURE__ */ jsxs(
|
|
138
|
-
DialogPrimitive.Content,
|
|
139
|
-
{
|
|
140
|
-
ref,
|
|
141
|
-
className: cn(sheetVariants({ side }), className),
|
|
142
|
-
...props,
|
|
143
|
-
children: [
|
|
144
|
-
/* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
|
|
145
|
-
/* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
|
|
146
|
-
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
147
|
-
] }),
|
|
148
|
-
children
|
|
149
|
-
]
|
|
150
|
-
}
|
|
151
|
-
)
|
|
152
|
-
] }));
|
|
153
|
-
SheetContent.displayName = DialogPrimitive.Content.displayName;
|
|
154
|
-
const SheetHeader = ({
|
|
155
|
-
className,
|
|
156
|
-
...props
|
|
157
|
-
}) => /* @__PURE__ */ jsx(
|
|
158
|
-
"div",
|
|
159
|
-
{
|
|
160
|
-
className: cn(
|
|
161
|
-
"flex flex-col space-y-2 text-center sm:text-left",
|
|
162
|
-
className
|
|
163
|
-
),
|
|
164
|
-
...props
|
|
165
|
-
}
|
|
166
|
-
);
|
|
167
|
-
SheetHeader.displayName = "SheetHeader";
|
|
168
|
-
const SheetTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
169
|
-
DialogPrimitive.Title,
|
|
170
|
-
{
|
|
171
|
-
ref,
|
|
172
|
-
className: cn("text-lg font-semibold text-foreground", className),
|
|
173
|
-
...props
|
|
174
|
-
}
|
|
175
|
-
));
|
|
176
|
-
SheetTitle.displayName = DialogPrimitive.Title.displayName;
|
|
177
|
-
const SheetDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
178
|
-
DialogPrimitive.Description,
|
|
179
|
-
{
|
|
180
|
-
ref,
|
|
181
|
-
className: cn("text-sm text-muted-foreground", className),
|
|
182
|
-
...props
|
|
183
|
-
}
|
|
184
|
-
));
|
|
185
|
-
SheetDescription.displayName = DialogPrimitive.Description.displayName;
|
|
186
|
-
const sheetContent = "reach-styles-module__sheetContent___0ciEx";
|
|
187
|
-
const container$1 = "reach-styles-module__container___T38N5";
|
|
188
|
-
const sectionTitle = "reach-styles-module__sectionTitle___EKjxE";
|
|
189
|
-
const setupContainer = "reach-styles-module__setupContainer___eFNIi";
|
|
190
|
-
const featureButton = "reach-styles-module__featureButton___wqCjo";
|
|
191
|
-
const featureContent = "reach-styles-module__featureContent___XZoau";
|
|
192
|
-
const featureTitle = "reach-styles-module__featureTitle___1dex2";
|
|
193
|
-
const featureDescription = "reach-styles-module__featureDescription___e6Nh-";
|
|
194
|
-
const imageContainer = "reach-styles-module__imageContainer___fnBSj";
|
|
195
|
-
const featureImage = "reach-styles-module__featureImage___DZbp8";
|
|
196
|
-
const connectedAccounts = "reach-styles-module__connectedAccounts___6e8OJ";
|
|
197
|
-
const legalSection = "reach-styles-module__legalSection___EAH2m";
|
|
198
|
-
const legalLinks = "reach-styles-module__legalLinks___4PwOC";
|
|
199
|
-
const legalLink = "reach-styles-module__legalLink___XaCkC";
|
|
200
|
-
const styles$1 = {
|
|
201
|
-
sheetContent,
|
|
202
|
-
container: container$1,
|
|
203
|
-
sectionTitle,
|
|
204
|
-
setupContainer,
|
|
205
|
-
featureButton,
|
|
206
|
-
featureContent,
|
|
207
|
-
featureTitle,
|
|
208
|
-
featureDescription,
|
|
209
|
-
imageContainer,
|
|
210
|
-
featureImage,
|
|
211
|
-
connectedAccounts,
|
|
212
|
-
legalSection,
|
|
213
|
-
legalLinks,
|
|
214
|
-
legalLink
|
|
215
|
-
};
|
|
216
|
-
const useSettingsFeatures = () => {
|
|
217
|
-
const { t } = useTranslation();
|
|
218
|
-
return [
|
|
219
|
-
{
|
|
220
|
-
title: t("dashboard.settings_sheet.setup_analytics"),
|
|
221
|
-
description: t("dashboard.settings_sheet.setup_analytics_description"),
|
|
222
|
-
icon: /* @__PURE__ */ jsx(BarChart2, { className: "h-6 w-6" }),
|
|
223
|
-
route: "/setup/analytics",
|
|
224
|
-
image: analytics,
|
|
225
|
-
flagKey: "show-setup-analytics"
|
|
226
|
-
},
|
|
227
|
-
{
|
|
228
|
-
title: t("dashboard.settings_sheet.setup_campaigns"),
|
|
229
|
-
description: t("dashboard.settings_sheet.setup_campaigns_description"),
|
|
230
|
-
icon: /* @__PURE__ */ jsx(Megaphone, { className: "h-6 w-6" }),
|
|
231
|
-
route: "/setup/campaigns",
|
|
232
|
-
image: megaphone,
|
|
233
|
-
flagKey: "show-setup-campaigns"
|
|
234
|
-
}
|
|
235
|
-
];
|
|
236
|
-
};
|
|
237
|
-
const SettingsSheet = () => {
|
|
238
|
-
const flags = useFlags();
|
|
239
|
-
const { t } = useTranslation();
|
|
240
|
-
const [open, setOpen] = useState(false);
|
|
241
|
-
const navigate = useNavigate();
|
|
242
|
-
const { accounts } = useOAuthCard();
|
|
243
|
-
const settingsFeatures = useSettingsFeatures();
|
|
244
|
-
const needsReauth = accounts == null ? void 0 : accounts.some(
|
|
245
|
-
(account) => {
|
|
246
|
-
var _a, _b;
|
|
247
|
-
return ((_b = (_a = account == null ? void 0 : account.ad_platform_metadata) == null ? void 0 : _a.encrypted_credentials) == null ? void 0 : _b.expiryDate) && checkIfNearExpiry(account) || account.status === "revoked";
|
|
248
|
-
}
|
|
249
|
-
);
|
|
250
|
-
if (!accounts) return null;
|
|
251
|
-
return /* @__PURE__ */ jsxs(Sheet, { open, onOpenChange: setOpen, children: [
|
|
252
|
-
/* @__PURE__ */ jsx(SheetTrigger, { asChild: true, children: /* @__PURE__ */ jsx(InteractiveHoverButton, { text: "Settings", pulse: needsReauth }) }),
|
|
253
|
-
/* @__PURE__ */ jsx(SheetContent, { className: styles$1.sheetContent, children: /* @__PURE__ */ jsxs("div", { className: styles$1.container, children: [
|
|
254
|
-
/* @__PURE__ */ jsxs(SheetHeader, { children: [
|
|
255
|
-
/* @__PURE__ */ jsx(SheetTitle, { children: t("account_settings") }),
|
|
256
|
-
/* @__PURE__ */ jsx(SheetDescription, { asChild: true, children: /* @__PURE__ */ jsx("span", { className: needsReauth ? "text-red-500 font-medium" : "", children: needsReauth ? t("reauth_required_description") : t("manage_account_settings") }) })
|
|
257
|
-
] }),
|
|
258
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
259
|
-
/* @__PURE__ */ jsx("h4", { className: styles$1.sectionTitle, children: t("dashboard.settings_sheet.setup") }),
|
|
260
|
-
/* @__PURE__ */ jsx("div", { className: styles$1.setupContainer, children: settingsFeatures.map((item) => {
|
|
261
|
-
const isEnabled = item.flagKey ? flags[item.flagKey] : false;
|
|
262
|
-
return /* @__PURE__ */ jsxs(
|
|
263
|
-
Button,
|
|
264
|
-
{
|
|
265
|
-
variant: "outline",
|
|
266
|
-
disabled: !isEnabled,
|
|
267
|
-
className: styles$1.featureButton,
|
|
268
|
-
onClick: () => isEnabled && navigate(item.route),
|
|
269
|
-
title: !isEnabled ? "Contact your platform admin to enable this feature" : void 0,
|
|
270
|
-
children: [
|
|
271
|
-
/* @__PURE__ */ jsxs("div", { className: styles$1.featureContent, children: [
|
|
272
|
-
/* @__PURE__ */ jsx("div", { className: styles$1.featureTitle, children: item.title }),
|
|
273
|
-
/* @__PURE__ */ jsx("div", { className: styles$1.featureDescription, children: !isEnabled ? "Contact your platform admin to enable this feature" : item.description })
|
|
274
|
-
] }),
|
|
275
|
-
item.image && /* @__PURE__ */ jsx("div", { className: styles$1.imageContainer, children: /* @__PURE__ */ jsx(
|
|
276
|
-
"img",
|
|
277
|
-
{
|
|
278
|
-
src: item.image,
|
|
279
|
-
alt: item.title,
|
|
280
|
-
className: styles$1.featureImage
|
|
281
|
-
}
|
|
282
|
-
) })
|
|
283
|
-
]
|
|
284
|
-
},
|
|
285
|
-
item.title
|
|
286
|
-
);
|
|
287
|
-
}) })
|
|
288
|
-
] }),
|
|
289
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
290
|
-
/* @__PURE__ */ jsx("h4", { className: styles$1.sectionTitle, children: t("dashboard.settings_sheet.connected_accounts") }),
|
|
291
|
-
/* @__PURE__ */ jsx("div", { className: styles$1.connectedAccounts, children: accounts == null ? void 0 : accounts.map((account) => /* @__PURE__ */ jsx(
|
|
292
|
-
OAuthCardWrapper,
|
|
293
|
-
{
|
|
294
|
-
platform: account.ad_platform
|
|
295
|
-
},
|
|
296
|
-
account.id
|
|
297
|
-
)) })
|
|
298
|
-
] }),
|
|
299
|
-
/* @__PURE__ */ jsx("div", { className: styles$1.legalSection, children: /* @__PURE__ */ jsxs("div", { className: styles$1.legalLinks, children: [
|
|
300
|
-
/* @__PURE__ */ jsx(
|
|
301
|
-
Button,
|
|
302
|
-
{
|
|
303
|
-
variant: "link",
|
|
304
|
-
className: styles$1.legalLink,
|
|
305
|
-
onClick: () => window.open(
|
|
306
|
-
"https://www.embedreach.com/terms-of-service/",
|
|
307
|
-
"_blank"
|
|
308
|
-
),
|
|
309
|
-
children: t("dashboard.settings_sheet.terms_of_service")
|
|
310
|
-
}
|
|
311
|
-
),
|
|
312
|
-
/* @__PURE__ */ jsx(
|
|
313
|
-
Button,
|
|
314
|
-
{
|
|
315
|
-
variant: "link",
|
|
316
|
-
className: styles$1.legalLink,
|
|
317
|
-
onClick: () => window.open(
|
|
318
|
-
"https://www.embedreach.com/privacy-policy/",
|
|
319
|
-
"_blank"
|
|
320
|
-
),
|
|
321
|
-
children: t("dashboard.settings_sheet.privacy_policy")
|
|
322
|
-
}
|
|
323
|
-
)
|
|
324
|
-
] }) })
|
|
325
|
-
] }) })
|
|
326
|
-
] });
|
|
327
|
-
};
|
|
328
|
-
const container = "reach-styles-module__container___lqhzq";
|
|
329
|
-
const innerContainer = "reach-styles-module__innerContainer___ESl0A";
|
|
330
|
-
const header = "reach-styles-module__header___D7EkI";
|
|
331
|
-
const styles = {
|
|
332
|
-
container,
|
|
333
|
-
innerContainer,
|
|
334
|
-
header
|
|
335
|
-
};
|
|
336
|
-
export {
|
|
337
|
-
SettingsSheet as S,
|
|
338
|
-
calculateDateRange as c,
|
|
339
|
-
formatDateToString as f,
|
|
340
|
-
styles as s
|
|
341
|
-
};
|
|
342
|
-
//# sourceMappingURL=styles.module-B1IY0-9d.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"styles.module-B1IY0-9d.js","sources":["../../common/utils/dateUtils.ts","../../common/components/ui/interactive-button.tsx","../../common/components/ui/sheet.tsx","../../common/components/dashboard/settings-sheet/useSettingsFeatures.tsx","../../common/components/dashboard/settings-sheet/SettingsSheet.tsx"],"sourcesContent":["import { DateRange } from '../services/ad-metrics';\nimport { AdAccount } from '../services/ad-accounts/types';\nimport type { DateRangePreset } from '../components/dashboard/action-bar/date-range-picker';\n\n/**\n * Calculates date range based on preset.\n * Uses local timezone for UI display purposes.\n */\nexport const calculateDateRange = (preset: DateRangePreset): DateRange => {\n const today = new Date();\n // Set time to start of day to avoid time-related issues\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n endDate.setDate(today.getDate() - 1);\n\n const startDate = new Date(today);\n startDate.setHours(0, 0, 0, 0);\n\n switch (preset) {\n case 'last-week':\n startDate.setDate(today.getDate() - 7);\n break;\n case 'last-month':\n startDate.setDate(today.getDate() - 30);\n break;\n case 'last-quarter':\n startDate.setDate(today.getDate() - 90);\n break;\n case 'last-year':\n startDate.setDate(today.getDate() - 365);\n break;\n default:\n throw new Error('Invalid date range preset');\n }\n\n return {\n from: startDate,\n to: endDate,\n };\n};\n\n/**\n * Checks if account credentials are near expiry.\n * Uses UTC timestamps for comparison.\n */\nexport const checkIfNearExpiry = (account: AdAccount) => {\n const bufferTime = 24 * 60 * 60 * 1000 * 5; // 5 days in ms\n\n // google accounts are handled on the BE with auto refresh\n if (account.ad_platform === 'google') {\n return false;\n }\n\n const isNearExpiry =\n new Date(\n account.ad_platform_metadata?.encrypted_credentials?.expiryDate || 0,\n ).getTime() -\n bufferTime <\n Date.now();\n return isNearExpiry;\n};\n\n/**\n * Formats date to MM/DD for UI display.\n * Uses local timezone formatting.\n */\nexport const formatDateToShortMonthDay = (date: Date) => {\n return date.toLocaleDateString('en-US', {\n month: '2-digit',\n day: '2-digit',\n });\n};\n\n/**\n * Formats date to YYYY-MM-DD for API requests.\n * Uses UTC timestamps for consistency.\n */\nexport const formatDateToString = (date: Date) => {\n // Get the date in UTC to ensure consistency\n const year = date.getUTCFullYear();\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const day = String(date.getUTCDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n};\n","import { Settings } from 'lucide-react';\nimport React, { useEffect, useState } from 'react';\n\nimport { cn } from '../../utils/cn';\nimport PoweredByReach from '../ui/reach';\n\ninterface InteractiveHoverButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n text?: string;\n pulse?: boolean;\n pulseDuration?: number; // Duration in milliseconds\n}\n\nconst InteractiveHoverButton = React.forwardRef<\n HTMLButtonElement,\n InteractiveHoverButtonProps\n>(\n (\n {\n text = 'Button',\n className,\n pulse = false,\n pulseDuration = 10000,\n ...props\n },\n ref,\n ) => {\n const [isPulsing, setIsPulsing] = useState(pulse);\n\n useEffect(() => {\n if (pulse && pulseDuration) {\n // Start pulsing\n setIsPulsing(true);\n\n // Stop pulsing after duration\n const timer = setTimeout(() => {\n setIsPulsing(false);\n }, pulseDuration);\n\n return () => clearTimeout(timer);\n }\n }, [pulse, pulseDuration]);\n\n const PulseElement = () => (\n <div className=\"right-1.5 top-3.5 z-20\">\n <span className=\"relative flex h-3 w-3\">\n <span className=\"absolute inline-flex h-full w-full animate-[ping_1s_ease-in-out_infinite] rounded-full bg-red-500 opacity-75\"></span>\n <span className=\"relative inline-flex rounded-full h-3 w-3 bg-red-600\"></span>\n </span>\n </div>\n );\n\n return (\n <button\n ref={ref}\n className={cn(\n 'group relative w-32 cursor-pointer overflow-hidden rounded-full border bg-[var(--reach-background)] p-1 text-center font-semibold',\n className,\n )}\n {...props}>\n <span className=\"flex items-center justify-evenly transition-all duration-300 group-hover:translate-x-12 group-hover:opacity-0 px-2 py-1\">\n <PoweredByReach showText={false} />\n {isPulsing && <PulseElement />}\n </span>\n <div className=\"absolute top-0 z-10 flex h-full w-full translate-x-12 items-center justify-center gap-2 text-primary-foreground opacity-0 transition-all duration-300 group-hover:-translate-x-1 group-hover:opacity-100\">\n <span>{text}</span>\n {!isPulsing && <Settings />}\n {isPulsing && <PulseElement />}\n </div>\n <div className=\"absolute left-[20%] top-[40%] h-2 w-2 scale-[0] rounded-lg bg-[var(--reach-primary)] transition-all duration-300 group-hover:left-[0%] group-hover:top-[0%] group-hover:h-full group-hover:w-full group-hover:scale-[1.8] group-hover:bg-[var(--reach-primary)]\"></div>\n </button>\n );\n },\n);\n\nInteractiveHoverButton.displayName = 'InteractiveHoverButton';\n\nexport { InteractiveHoverButton };\n","import * as SheetPrimitive from '@radix-ui/react-dialog';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { X } from 'lucide-react';\nimport * as React from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst Sheet = SheetPrimitive.Root;\n\nconst SheetTrigger = SheetPrimitive.Trigger;\n\nconst SheetClose = SheetPrimitive.Close;\n\nconst SheetPortal = SheetPrimitive.Portal;\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n ref={ref}\n />\n));\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName;\n\nconst sheetVariants = cva(\n 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out',\n {\n variants: {\n side: {\n top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',\n bottom:\n 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',\n left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',\n right:\n 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',\n },\n },\n defaultVariants: {\n side: 'right',\n },\n },\n);\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = 'right', className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...props}>\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n {children}\n </SheetPrimitive.Content>\n </SheetPortal>\n));\nSheetContent.displayName = SheetPrimitive.Content.displayName;\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'flex flex-col space-y-2 text-center sm:text-left',\n className,\n )}\n {...props}\n />\n);\nSheetHeader.displayName = 'SheetHeader';\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n className,\n )}\n {...props}\n />\n);\nSheetFooter.displayName = 'SheetFooter';\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold text-foreground', className)}\n {...props}\n />\n));\nSheetTitle.displayName = SheetPrimitive.Title.displayName;\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nSheetDescription.displayName = SheetPrimitive.Description.displayName;\n\nexport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetOverlay,\n SheetPortal,\n SheetTitle,\n SheetTrigger,\n};\n","import { BarChart2, Megaphone } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\n\nimport analytics from '../../../assets/analytics.png';\nimport megaphone from '../../../assets/megaphone.png';\nimport { FeatureItem } from './SettingsSheet.types';\n\nexport const useSettingsFeatures = (): FeatureItem[] => {\n const { t } = useTranslation();\n return [\n {\n title: t('dashboard.settings_sheet.setup_analytics'),\n description: t('dashboard.settings_sheet.setup_analytics_description'),\n icon: <BarChart2 className=\"h-6 w-6\" />,\n route: '/setup/analytics',\n image: analytics,\n flagKey: 'show-setup-analytics',\n },\n {\n title: t('dashboard.settings_sheet.setup_campaigns'),\n description: t('dashboard.settings_sheet.setup_campaigns_description'),\n icon: <Megaphone className=\"h-6 w-6\" />,\n route: '/setup/campaigns',\n image: megaphone,\n flagKey: 'show-setup-campaigns',\n },\n ];\n};\n","import { useFlags } from 'launchdarkly-react-client-sdk';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom';\nimport { LaunchDarklyFlags } from '../../../types/launch-darkly';\n\nimport { useOAuthCard } from '../../../hooks/useOauthCard';\nimport { checkIfNearExpiry } from '../../../utils/dateUtils';\nimport OAuthCardWrapper from '../../auth/oauth/OauthCardWrapper';\nimport { Button } from '../../ui/button';\nimport { InteractiveHoverButton } from '../../ui/interactive-button';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from '../../ui/sheet';\nimport styles from './styles.module.css';\nimport { useSettingsFeatures } from './useSettingsFeatures';\n\nexport const SettingsSheet = () => {\n const flags = useFlags<LaunchDarklyFlags>();\n const { t } = useTranslation();\n const [open, setOpen] = useState(false);\n const navigate = useNavigate();\n const { accounts } = useOAuthCard();\n const settingsFeatures = useSettingsFeatures();\n\n const needsReauth = accounts?.some(\n account =>\n (account?.ad_platform_metadata?.encrypted_credentials?.expiryDate &&\n checkIfNearExpiry(account)) ||\n account.status === 'revoked',\n );\n\n if (!accounts) return null;\n\n return (\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <InteractiveHoverButton text=\"Settings\" pulse={needsReauth} />\n </SheetTrigger>\n <SheetContent className={styles.sheetContent}>\n <div className={styles.container}>\n <SheetHeader>\n <SheetTitle>{t('account_settings')}</SheetTitle>\n <SheetDescription asChild>\n <span className={needsReauth ? 'text-red-500 font-medium' : ''}>\n {needsReauth\n ? t('reauth_required_description')\n : t('manage_account_settings')}\n </span>\n </SheetDescription>\n </SheetHeader>\n\n <div>\n <h4 className={styles.sectionTitle}>\n {t('dashboard.settings_sheet.setup')}\n </h4>\n <div className={styles.setupContainer}>\n {settingsFeatures.map(item => {\n const isEnabled = item.flagKey ? flags[item.flagKey] : false;\n return (\n <Button\n key={item.title}\n variant=\"outline\"\n disabled={!isEnabled}\n className={styles.featureButton}\n onClick={() => isEnabled && navigate(item.route)}\n title={\n !isEnabled\n ? 'Contact your platform admin to enable this feature'\n : undefined\n }>\n <div className={styles.featureContent}>\n <div className={styles.featureTitle}>{item.title}</div>\n <div className={styles.featureDescription}>\n {!isEnabled\n ? 'Contact your platform admin to enable this feature'\n : item.description}\n </div>\n </div>\n {item.image && (\n <div className={styles.imageContainer}>\n <img\n src={item.image}\n alt={item.title}\n className={styles.featureImage}\n />\n </div>\n )}\n </Button>\n );\n })}\n </div>\n </div>\n\n <div>\n <h4 className={styles.sectionTitle}>\n {t('dashboard.settings_sheet.connected_accounts')}\n </h4>\n <div className={styles.connectedAccounts}>\n {accounts?.map(account => (\n <OAuthCardWrapper\n key={account.id}\n platform={account.ad_platform}\n />\n ))}\n </div>\n </div>\n\n <div className={styles.legalSection}>\n <div className={styles.legalLinks}>\n <Button\n variant=\"link\"\n className={styles.legalLink}\n onClick={() =>\n window.open(\n 'https://www.embedreach.com/terms-of-service/',\n '_blank',\n )\n }>\n {t('dashboard.settings_sheet.terms_of_service')}\n </Button>\n <Button\n variant=\"link\"\n className={styles.legalLink}\n onClick={() =>\n window.open(\n 'https://www.embedreach.com/privacy-policy/',\n '_blank',\n )\n }>\n {t('dashboard.settings_sheet.privacy_policy')}\n </Button>\n </div>\n </div>\n </div>\n </SheetContent>\n </Sheet>\n );\n};\n\nexport default SettingsSheet;\n"],"names":["React","SheetPrimitive","styles"],"mappings":"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"}
|