bitsnap-react 1.2.0 → 1.3.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/dist/index.mjs CHANGED
@@ -1,4 +1,6 @@
1
- import "./chunk-ZD7AOCMD.mjs";
1
+ import {
2
+ __export
3
+ } from "./chunk-P6IESOHL.mjs";
2
4
 
3
5
  // src/components/checkout/ApplePay.tsx
4
6
  import ApplePayButton from "apple-pay-button";
@@ -58,12 +60,13 @@ var PublicApiClient;
58
60
 
59
61
  // src/components/checkout/CartProvider.tsx
60
62
  import { create as create2 } from "@bufbuild/protobuf";
61
- import { createContext, useContext } from "react";
63
+ import { createContext, useContext, useEffect } from "react";
62
64
  import zod from "zod";
63
65
 
64
66
  // src/components/checkout/constants.ts
65
67
  var HOST = "https://bitsnap.pl";
66
68
  function setCustomHost(host) {
69
+ console.log("setCustomHost", host);
67
70
  HOST = host;
68
71
  }
69
72
 
@@ -99,7 +102,7 @@ function formatCurrency(amount, currency) {
99
102
  import { create } from "zustand";
100
103
  var useCheckoutStore = create((set) => ({
101
104
  isCartVisible: false,
102
- numberOfProductsInCart: 2,
105
+ numberOfProductsInCart: 0,
103
106
  showCart: () => set((state) => ({ ...state, isCartVisible: true })),
104
107
  hideCart: () => set((state) => ({ ...state, isCartVisible: false })),
105
108
  setNumberOfProductsInCart: (numberOfProductsInCart) => set((state) => ({ ...state, numberOfProductsInCart }))
@@ -343,6 +346,9 @@ function getNewHostIfExist() {
343
346
  }
344
347
  var CartProvider = ({ children }) => {
345
348
  const queryClient = new QueryClient();
349
+ useEffect(() => {
350
+ updateNumberOfProductsInCart();
351
+ }, []);
346
352
  const projectID = getProjectID();
347
353
  if (projectID == null) {
348
354
  return /* @__PURE__ */ jsx(Fragment, {});
@@ -455,6 +461,7 @@ function addProducts(products) {
455
461
  metadata: el.metadata
456
462
  })));
457
463
  saveCheckout(checkout);
464
+ updateNumberOfProductsInCart();
458
465
  }
459
466
  function removeProductFromCheckout(ids) {
460
467
  var _a;
@@ -466,6 +473,7 @@ function removeProductFromCheckout(ids) {
466
473
  )
467
474
  };
468
475
  saveCheckout(newCheckout);
476
+ updateNumberOfProductsInCart();
469
477
  }
470
478
  function saveCheckout(model) {
471
479
  localStorage.setItem(checkoutKey, JSON.stringify(model));
@@ -573,6 +581,7 @@ var getCheckoutMethods = (projectID) => {
573
581
  const empty = structuredClone(emptyCheckout);
574
582
  empty.country = (_a = getCheckout()) == null ? void 0 : _a.country;
575
583
  saveCheckout(empty);
584
+ updateNumberOfProductsInCart();
576
585
  },
577
586
  async getAvailableCountries() {
578
587
  const result = await fetch(buildURL(projectID, "/countries"), {
@@ -654,6 +663,7 @@ var getCheckoutMethods = (projectID) => {
654
663
  return product;
655
664
  });
656
665
  saveCheckout(checkout);
666
+ updateNumberOfProductsInCart();
657
667
  },
658
668
  async redirectToNextStep() {
659
669
  const checkout = getCheckout();
@@ -1039,6 +1049,17 @@ function resolveProductDetailsFromSingleProduct(id, product) {
1039
1049
  images: (_d = variant.images) != null ? _d : product.images
1040
1050
  };
1041
1051
  }
1052
+ function updateNumberOfProductsInCart() {
1053
+ var _a, _b;
1054
+ const checkout = getCheckout();
1055
+ let numberOfProductsInCart = 0;
1056
+ if (checkout == null) {
1057
+ useCheckoutStore.setState((state) => ({ ...state, numberOfProductsInCart }));
1058
+ return;
1059
+ }
1060
+ numberOfProductsInCart = (_b = (_a = checkout.products) == null ? void 0 : _a.reduce((acc, product) => acc + product.quantity, 0)) != null ? _b : 0;
1061
+ useCheckoutStore.setState((state) => ({ ...state, numberOfProductsInCart }));
1062
+ }
1042
1063
 
1043
1064
  // src/components/checkout/ApplePay.tsx
1044
1065
  import { useQuery } from "@tanstack/react-query";
@@ -1350,7 +1371,7 @@ function Wrapper2(props) {
1350
1371
  var GooglePay_default = Wrapper2;
1351
1372
 
1352
1373
  // src/components/checkout/BitsnapCart.tsx
1353
- import { useEffect as useEffect3 } from "react";
1374
+ import { useEffect as useEffect4 } from "react";
1354
1375
  import zod2 from "zod";
1355
1376
 
1356
1377
  // src/components/checkout/CartComponent.tsx
@@ -1362,8 +1383,8 @@ import { useAutoAnimate } from "@formkit/auto-animate/react";
1362
1383
  import React from "react";
1363
1384
 
1364
1385
  // src/components/checkout/CountrySelector.tsx
1365
- import { AnimatePresence, motion } from "framer-motion";
1366
- import { useEffect, useRef, useState } from "react";
1386
+ import { AnimatePresence, motion } from "motion/react";
1387
+ import { useEffect as useEffect2, useRef, useState } from "react";
1367
1388
  import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
1368
1389
  function CountrySelector({
1369
1390
  id,
@@ -1376,7 +1397,7 @@ function CountrySelector({
1376
1397
  }) {
1377
1398
  var _a;
1378
1399
  const ref = useRef(null);
1379
- useEffect(() => {
1400
+ useEffect2(() => {
1380
1401
  const mutableRef = ref;
1381
1402
  const handleClickOutside = (event) => {
1382
1403
  if (mutableRef.current && // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -1391,7 +1412,7 @@ function CountrySelector({
1391
1412
  document.removeEventListener("mousedown", handleClickOutside);
1392
1413
  };
1393
1414
  }, [ref]);
1394
- useEffect(() => {
1415
+ useEffect2(() => {
1395
1416
  if (selectedValue == null && countries.length > 0) {
1396
1417
  onChange(countries[0].code);
1397
1418
  }
@@ -1543,7 +1564,7 @@ function CountrySelector({
1543
1564
  var CountrySelector_default = CountrySelector;
1544
1565
 
1545
1566
  // src/components/checkout/SingleProduct.tsx
1546
- import { useEffect as useEffect2, useState as useState2 } from "react";
1567
+ import { useEffect as useEffect3, useState as useState2 } from "react";
1547
1568
  import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
1548
1569
  var SingleProduct = ({ quantity, details, shouldUpdate }) => {
1549
1570
  var _a;
@@ -1567,7 +1588,7 @@ var QuantityComponent = ({
1567
1588
  }) => {
1568
1589
  const [quantityString, setQuantityString] = useState2(quantity.toString());
1569
1590
  const [quantityValue, setQuantityValue] = useState2(quantity);
1570
- useEffect2(() => {
1591
+ useEffect3(() => {
1571
1592
  shouldUpdate(quantityValue);
1572
1593
  }, [quantityValue]);
1573
1594
  function setNewQuantity(newQuantity) {
@@ -1920,9 +1941,10 @@ function BitsnapCart({
1920
1941
  projectID,
1921
1942
  children,
1922
1943
  onVisibleChange,
1923
- className
1944
+ className,
1945
+ numberOfProductsInCartOptions
1924
1946
  }) {
1925
- const { isCartVisible, showCart, hideCart } = useCheckoutStore();
1947
+ const { isCartVisible, showCart, hideCart, numberOfProductsInCart } = useCheckoutStore();
1926
1948
  function sentPostMessageToIframe(msg) {
1927
1949
  const iframes = document.querySelectorAll("iframe");
1928
1950
  iframes.forEach((iframe) => {
@@ -1930,13 +1952,13 @@ function BitsnapCart({
1930
1952
  (_a = iframe.contentWindow) == null ? void 0 : _a.postMessage(msg, "*");
1931
1953
  });
1932
1954
  }
1933
- useEffect3(() => {
1955
+ useEffect4(() => {
1934
1956
  onVisibleChange == null ? void 0 : onVisibleChange(isCartVisible);
1935
1957
  }, [isCartVisible]);
1936
- useEffect3(() => {
1958
+ useEffect4(() => {
1937
1959
  setProjectID(projectID);
1938
1960
  }, [projectID]);
1939
- useEffect3(() => {
1961
+ useEffect4(() => {
1940
1962
  if (!("cart" in window)) {
1941
1963
  const projectID2 = getProjectID();
1942
1964
  if (projectID2 == null) {
@@ -2021,7 +2043,7 @@ function BitsnapCart({
2021
2043
  }
2022
2044
  });
2023
2045
  }
2024
- useEffect3(() => {
2046
+ useEffect4(() => {
2025
2047
  var _a;
2026
2048
  setupEventListener();
2027
2049
  if (typeof window !== "undefined") {
@@ -2037,31 +2059,57 @@ function BitsnapCart({
2037
2059
  }
2038
2060
  }, []);
2039
2061
  return /* @__PURE__ */ jsxs6(Fragment6, { children: [
2040
- /* @__PURE__ */ jsx10(
2062
+ /* @__PURE__ */ jsxs6(
2041
2063
  "button",
2042
2064
  {
2043
2065
  onClick: () => isCartVisible ? hideCart() : showCart(),
2044
- className: ["bitsnap-checkout", className != null ? className : "relative rounded-full hover:bg-neutral-300 transition p-1"].join(" "),
2045
- children: children ? /* @__PURE__ */ jsx10(Fragment6, { children }) : /* @__PURE__ */ jsxs6(
2046
- "svg",
2047
- {
2048
- xmlns: "http://www.w3.org/2000/svg",
2049
- width: "24",
2050
- height: "24",
2051
- viewBox: "0 0 24 24",
2052
- fill: "none",
2053
- stroke: "currentColor",
2054
- strokeWidth: "2",
2055
- strokeLinecap: "round",
2056
- strokeLinejoin: "round",
2057
- className: "lucide lucide-shopping-cart",
2058
- children: [
2059
- /* @__PURE__ */ jsx10("circle", { cx: "8", cy: "21", r: "1" }),
2060
- /* @__PURE__ */ jsx10("circle", { cx: "19", cy: "21", r: "1" }),
2061
- /* @__PURE__ */ jsx10("path", { d: "M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12" })
2062
- ]
2063
- }
2064
- )
2066
+ style: { position: "relative" },
2067
+ className: ["bitsnap-checkout", className != null ? className : "rounded-full hover:bg-neutral-300 transition p-1"].join(" "),
2068
+ children: [
2069
+ children ? /* @__PURE__ */ jsx10(Fragment6, { children }) : /* @__PURE__ */ jsxs6(
2070
+ "svg",
2071
+ {
2072
+ xmlns: "http://www.w3.org/2000/svg",
2073
+ width: "24",
2074
+ height: "24",
2075
+ viewBox: "0 0 24 24",
2076
+ fill: "none",
2077
+ stroke: "currentColor",
2078
+ strokeWidth: "2",
2079
+ strokeLinecap: "round",
2080
+ strokeLinejoin: "round",
2081
+ className: "lucide lucide-shopping-cart",
2082
+ children: [
2083
+ /* @__PURE__ */ jsx10("circle", { cx: "8", cy: "21", r: "1" }),
2084
+ /* @__PURE__ */ jsx10("circle", { cx: "19", cy: "21", r: "1" }),
2085
+ /* @__PURE__ */ jsx10("path", { d: "M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12" })
2086
+ ]
2087
+ }
2088
+ ),
2089
+ (numberOfProductsInCartOptions == null ? void 0 : numberOfProductsInCartOptions.isVisible) != false && numberOfProductsInCart > 0 && /* @__PURE__ */ jsx10(
2090
+ "div",
2091
+ {
2092
+ style: {
2093
+ position: "absolute",
2094
+ bottom: -5,
2095
+ right: -5,
2096
+ background: "black",
2097
+ color: "white",
2098
+ borderRadius: "50%",
2099
+ width: "22px",
2100
+ height: "22px",
2101
+ display: "flex",
2102
+ alignItems: "center",
2103
+ justifyContent: "center",
2104
+ fontSize: "13px",
2105
+ fontWeight: 600,
2106
+ boxShadow: "0 2px 8px rgba(0, 0, 0, 0.25)",
2107
+ ...numberOfProductsInCartOptions == null ? void 0 : numberOfProductsInCartOptions.style
2108
+ },
2109
+ children: numberOfProductsInCart
2110
+ }
2111
+ )
2112
+ ]
2065
2113
  }
2066
2114
  ),
2067
2115
  /* @__PURE__ */ jsx10(
@@ -2076,11 +2124,2249 @@ function BitsnapCart({
2076
2124
  ] });
2077
2125
  }
2078
2126
  var BitsnapCart_default = BitsnapCart;
2127
+
2128
+ // src/components/notifications/NotificationsComponentPublic.tsx
2129
+ import { useReducer, useRef as useRef2, useEffect as useEffect7 } from "react";
2130
+
2131
+ // src/rpc-provider.tsx
2132
+ import {
2133
+ TransportProvider,
2134
+ useMutation as um,
2135
+ useQuery as uq
2136
+ } from "@connectrpc/connect-query";
2137
+ import { createConnectTransport as createConnectTransport2 } from "@connectrpc/connect-web";
2138
+ import { QueryClient as QueryClient2, QueryClientProvider as QueryClientProvider2 } from "@tanstack/react-query";
2139
+ import { useState as useState3 } from "react";
2140
+
2141
+ // src/gen/proto/public/v1/public_api-PublicApiService_connectquery.ts
2142
+ var public_api_PublicApiService_connectquery_exports = {};
2143
+ __export(public_api_PublicApiService_connectquery_exports, {
2144
+ applePayValidateMerchant: () => applePayValidateMerchant,
2145
+ authorizeOneClickPayment: () => authorizeOneClickPayment,
2146
+ didBuyProduct: () => didBuyProduct,
2147
+ getAvailableCountForProduct: () => getAvailableCountForProduct,
2148
+ getNotificationSettings: () => getNotificationSettings,
2149
+ getNotificationSettingsDetails: () => getNotificationSettingsDetails,
2150
+ getOrder: () => getOrder,
2151
+ getOrderRetryUrl: () => getOrderRetryUrl,
2152
+ getPreOrderDetails: () => getPreOrderDetails,
2153
+ getShopProducts: () => getShopProducts,
2154
+ isOneClickPaymentAvailable: () => isOneClickPaymentAvailable,
2155
+ notifyUserAboutProductAvailability: () => notifyUserAboutProductAvailability,
2156
+ pushEvent: () => pushEvent,
2157
+ pushSendDeviceToken: () => pushSendDeviceToken,
2158
+ shouldShopProducts: () => shouldShopProducts,
2159
+ updateGlobalNotificationSettings: () => updateGlobalNotificationSettings,
2160
+ updateNotificationSettings: () => updateNotificationSettings,
2161
+ userPanelDeleteAccount: () => userPanelDeleteAccount,
2162
+ userPanelGetAudiobookDetails: () => userPanelGetAudiobookDetails,
2163
+ userPanelGetAudiobookDetailsDownloadURLs: () => userPanelGetAudiobookDetailsDownloadURLs,
2164
+ userPanelGetFileDetails: () => userPanelGetFileDetails,
2165
+ userPanelGetProducts: () => userPanelGetProducts,
2166
+ userPanelGetTicketDetails: () => userPanelGetTicketDetails,
2167
+ userPanelLogin: () => userPanelLogin,
2168
+ userPanelLoginWithCode: () => userPanelLoginWithCode,
2169
+ userPanelLogout: () => userPanelLogout
2170
+ });
2171
+ var getOrder = PublicApiService.method.getOrder;
2172
+ var getOrderRetryUrl = PublicApiService.method.getOrderRetryUrl;
2173
+ var userPanelLogin = PublicApiService.method.userPanelLogin;
2174
+ var userPanelLoginWithCode = PublicApiService.method.userPanelLoginWithCode;
2175
+ var userPanelLogout = PublicApiService.method.userPanelLogout;
2176
+ var userPanelDeleteAccount = PublicApiService.method.userPanelDeleteAccount;
2177
+ var userPanelGetProducts = PublicApiService.method.userPanelGetProducts;
2178
+ var userPanelGetAudiobookDetails = PublicApiService.method.userPanelGetAudiobookDetails;
2179
+ var userPanelGetAudiobookDetailsDownloadURLs = PublicApiService.method.userPanelGetAudiobookDetailsDownloadURLs;
2180
+ var userPanelGetFileDetails = PublicApiService.method.userPanelGetFileDetails;
2181
+ var userPanelGetTicketDetails = PublicApiService.method.userPanelGetTicketDetails;
2182
+ var pushSendDeviceToken = PublicApiService.method.pushSendDeviceToken;
2183
+ var pushEvent = PublicApiService.method.pushEvent;
2184
+ var shouldShopProducts = PublicApiService.method.shouldShopProducts;
2185
+ var getShopProducts = PublicApiService.method.getShopProducts;
2186
+ var didBuyProduct = PublicApiService.method.didBuyProduct;
2187
+ var getNotificationSettings = PublicApiService.method.getNotificationSettings;
2188
+ var getNotificationSettingsDetails = PublicApiService.method.getNotificationSettingsDetails;
2189
+ var updateGlobalNotificationSettings = PublicApiService.method.updateGlobalNotificationSettings;
2190
+ var updateNotificationSettings = PublicApiService.method.updateNotificationSettings;
2191
+ var getAvailableCountForProduct = PublicApiService.method.getAvailableCountForProduct;
2192
+ var isOneClickPaymentAvailable = PublicApiService.method.isOneClickPaymentAvailable;
2193
+ var getPreOrderDetails = PublicApiService.method.getPreOrderDetails;
2194
+ var applePayValidateMerchant = PublicApiService.method.applePayValidateMerchant;
2195
+ var authorizeOneClickPayment = PublicApiService.method.authorizeOneClickPayment;
2196
+ var notifyUserAboutProductAvailability = PublicApiService.method.notifyUserAboutProductAvailability;
2197
+
2198
+ // src/gen/proto/dashboard/v1/notifications-NotificationsService_connectquery.ts
2199
+ var notifications_NotificationsService_connectquery_exports = {};
2200
+ __export(notifications_NotificationsService_connectquery_exports, {
2201
+ createNotificationGroup: () => createNotificationGroup,
2202
+ createNotificationGroupUser: () => createNotificationGroupUser,
2203
+ createNotificationMessage: () => createNotificationMessage,
2204
+ createNotificationMessageJob: () => createNotificationMessageJob,
2205
+ createNotificationSetting: () => createNotificationSetting,
2206
+ createNotificationUser: () => createNotificationUser,
2207
+ deleteNotificationGroup: () => deleteNotificationGroup,
2208
+ deleteNotificationGroupUser: () => deleteNotificationGroupUser,
2209
+ deleteNotificationMessage: () => deleteNotificationMessage,
2210
+ deleteNotificationMessageJob: () => deleteNotificationMessageJob,
2211
+ deleteNotificationSetting: () => deleteNotificationSetting,
2212
+ deleteNotificationUser: () => deleteNotificationUser,
2213
+ getNotificationUserSettings: () => getNotificationUserSettings,
2214
+ getSentNotificationMessages: () => getSentNotificationMessages,
2215
+ getUserGroups: () => getUserGroups,
2216
+ readNotificationGroupUsers: () => readNotificationGroupUsers,
2217
+ readNotificationGroups: () => readNotificationGroups,
2218
+ readNotificationMessageJobs: () => readNotificationMessageJobs,
2219
+ readNotificationMessages: () => readNotificationMessages,
2220
+ readNotificationProducts: () => readNotificationProducts,
2221
+ readNotificationSetting: () => readNotificationSetting,
2222
+ readNotificationUsers: () => readNotificationUsers,
2223
+ updateNotificationGroup: () => updateNotificationGroup,
2224
+ updateNotificationGroupUser: () => updateNotificationGroupUser,
2225
+ updateNotificationMessage: () => updateNotificationMessage,
2226
+ updateNotificationMessageJob: () => updateNotificationMessageJob,
2227
+ updateNotificationSetting: () => updateNotificationSetting,
2228
+ updateNotificationUser: () => updateNotificationUser,
2229
+ updateUserGroups: () => updateUserGroups,
2230
+ verifyUserEmail: () => verifyUserEmail
2231
+ });
2232
+
2233
+ // src/gen/proto/dashboard/v1/notifications_pb.ts
2234
+ import { enumDesc as enumDesc6, fileDesc as fileDesc7, messageDesc as messageDesc6, serviceDesc as serviceDesc4 } from "@bufbuild/protobuf/codegenv2";
2235
+ import { file_google_protobuf_empty as file_google_protobuf_empty4, file_google_protobuf_timestamp as file_google_protobuf_timestamp5 } from "@bufbuild/protobuf/wkt";
2236
+
2237
+ // src/gen/proto/dashboard/v1/product_pb.ts
2238
+ import { enumDesc as enumDesc5, fileDesc as fileDesc6, messageDesc as messageDesc5, serviceDesc as serviceDesc3 } from "@bufbuild/protobuf/codegenv2";
2239
+ import { file_google_protobuf_empty as file_google_protobuf_empty3, file_google_protobuf_timestamp as file_google_protobuf_timestamp4 } from "@bufbuild/protobuf/wkt";
2240
+ var file_dashboard_v1_product = /* @__PURE__ */ fileDesc6("ChpkYXNoYm9hcmQvdjEvcHJvZHVjdC5wcm90bxIUZGFzaGJvYXJkLnByb2R1Y3QudjEiNwogRXhjaGFuZ2VQcm9kdWN0SURzVG9OYW1lc1JlcXVlc3QSEwoLcHJvZHVjdF9pZHMYASADKAkiugEKIUV4Y2hhbmdlUHJvZHVjdElEc1RvTmFtZXNSZXNwb25zZRJgCg1wcm9kdWN0X25hbWVzGAEgAygLMkkuZGFzaGJvYXJkLnByb2R1Y3QudjEuRXhjaGFuZ2VQcm9kdWN0SURzVG9OYW1lc1Jlc3BvbnNlLlByb2R1Y3ROYW1lc0VudHJ5GjMKEVByb2R1Y3ROYW1lc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEieQobR2V0RmlsZUFjY2Vzc01lbWJlcnNSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkSEwoGc2VhcmNoGAIgASgJSACIAQESFwoKdmFyaWFudF9pZBgDIAEoCUgBiAEBQgkKB19zZWFyY2hCDQoLX3ZhcmlhbnRfaWQi0QEKHEdldEZpbGVBY2Nlc3NNZW1iZXJzUmVzcG9uc2USSQoHbWVtYmVycxgBIAMoCzI4LmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldEZpbGVBY2Nlc3NNZW1iZXJzUmVzcG9uc2UuVmFsdWUaZgoFVmFsdWUSCgoCaWQYASABKAkSDQoFZW1haWwYAiABKAkSMwoKY3JlYXRlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBAUINCgtfY3JlYXRlZF9hdCJkChdHaXZlQWNjZXNzVG9GaWxlUmVxdWVzdBISCgpwcm9kdWN0X2lkGAEgASgJEhcKCnZhcmlhbnRfaWQYAiABKAlIAIgBARINCgVlbWFpbBgDIAEoCUINCgtfdmFyaWFudF9pZCIrChhHaXZlQWNjZXNzVG9GaWxlUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCInChlSZW1vdmVBY2Nlc3NUb0ZpbGVSZXF1ZXN0EgoKAmlkGAEgASgJIi0KGlJlbW92ZUFjY2Vzc1RvRmlsZVJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgiZAofU2VuZFRlc3RFbWFpbFdpdGhNZXNzYWdlUmVxdWVzdBINCgVlbWFpbBgBIAEoCRIUCgxodG1sX21lc3NhZ2UYAiABKAkSEgoFdGl0bGUYAyABKAlIAIgBAUIICgZfdGl0bGUiLwoZR2V0UHJvZHVjdFZhcmlhbnRzUmVxdWVzdBISCgpwcm9kdWN0X2lkGAEgASgJIpkBChpHZXRQcm9kdWN0VmFyaWFudHNSZXNwb25zZRJQCgh2YXJpYW50cxgBIAMoCzI+LmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldFByb2R1Y3RWYXJpYW50c1Jlc3BvbnNlLlNpbmdsZVZhcmlhbnQaKQoNU2luZ2xlVmFyaWFudBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJIoMBCihVcGRhdGVQcm9kdWN0QWZ0ZXJQdXJjaGFzZU1lc3NhZ2VSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIUCgxodG1sX21lc3NhZ2UYAyABKAkSEgoFdGl0bGUYBCABKAlIAIgBAUIICgZfdGl0bGUiOwolR2V0UHJvZHVjdEFmdGVyUHVyY2hhc2VNZXNzYWdlUmVxdWVzdBISCgpwcm9kdWN0X2lkGAEgASgJIrsCCiZHZXRQcm9kdWN0QWZ0ZXJQdXJjaGFzZU1lc3NhZ2VSZXNwb25zZRJXCgdzdWNjZXNzGAEgASgLMkQuZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdEFmdGVyUHVyY2hhc2VNZXNzYWdlUmVzcG9uc2UuU3VjY2Vzc0gAEjcKB2ZhaWx1cmUYAiABKA4yJC5kYXNoYm9hcmQucHJvZHVjdC52MS5GYWlsdXJlTWVzc2FnZUgAGnUKB1N1Y2Nlc3MSFAoHbWVzc2FnZRgBIAEoCUgAiAEBEhkKDGh0bWxfbWVzc2FnZRgCIAEoCUgBiAEBEhIKBXRpdGxlGAMgASgJSAKIAQFCCgoIX21lc3NhZ2VCDwoNX2h0bWxfbWVzc2FnZUIICgZfdGl0bGVCCAoGcmVzdWx0IjMKHVB1Ymxpc2hQcm9kdWN0SWZOZWVkZWRSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkiZQorVXBkYXRlUHJvZHVjdFNlbmRUaWNrZXRBZnRlclB1cmNoYXNlUmVxdWVzdBISCgpwcm9kdWN0X2lkGAEgASgJEiIKGnNlbmRfdGlja2V0X2FmdGVyX3B1cmNoYXNlGAIgASgIIlYKKlVwZGF0ZVByb2R1Y3RBdWRpb2Jvb2tBZnRlclB1cmNoYXNlUmVxdWVzdBISCgpwcm9kdWN0X2lkGAEgASgJEhQKDGF1ZGlvYm9va19pZBgCIAEoCSI+CihHZXRQcm9kdWN0U2VuZFRpY2tldEFmdGVyUHVyY2hhc2VSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAki+QEKKUdldFByb2R1Y3RTZW5kVGlja2V0QWZ0ZXJQdXJjaGFzZVJlc3BvbnNlEloKB3N1Y2Nlc3MYASABKAsyRy5kYXNoYm9hcmQucHJvZHVjdC52MS5HZXRQcm9kdWN0U2VuZFRpY2tldEFmdGVyUHVyY2hhc2VSZXNwb25zZS5TdWNjZXNzSAASNwoHZmFpbHVyZRgCIAEoDjIkLmRhc2hib2FyZC5wcm9kdWN0LnYxLkZhaWx1cmVNZXNzYWdlSAAaLQoHU3VjY2VzcxIiChpzZW5kX3RpY2tldF9hZnRlcl9wdXJjaGFzZRgBIAEoCEIICgZyZXN1bHQiPQonR2V0UHJvZHVjdEF1ZGlvYm9va0FmdGVyUHVyY2hhc2VSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkinwIKKEdldFByb2R1Y3RBdWRpb2Jvb2tBZnRlclB1cmNoYXNlUmVzcG9uc2USWQoHc3VjY2VzcxgBIAEoCzJGLmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldFByb2R1Y3RBdWRpb2Jvb2tBZnRlclB1cmNoYXNlUmVzcG9uc2UuU3VjY2Vzc0gAEjcKB2ZhaWx1cmUYAiABKA4yJC5kYXNoYm9hcmQucHJvZHVjdC52MS5GYWlsdXJlTWVzc2FnZUgAGlUKB1N1Y2Nlc3MSFAoMYXVkaW9ib29rX2lkGAEgASgJEhcKD2F1ZGlvYm9va190aXRsZRgCIAEoCRIbChNhdWRpb2Jvb2tfaW1hZ2VfdXJsGAMgASgJQggKBnJlc3VsdCI3ChVTZWFyY2hQcm9kdWN0c1JlcXVlc3QSEwoGc2VhcmNoGAEgASgJSACIAQFCCQoHX3NlYXJjaCLMAgoWU2VhcmNoUHJvZHVjdHNSZXNwb25zZRJGCgdzdWNjZXNzGAEgASgLMjMuZGFzaGJvYXJkLnByb2R1Y3QudjEuU2VhcmNoUHJvZHVjdHNSZXNwb25zZS5SZXN1bHRIABI3CgdmYWlsdXJlGAIgASgOMiQuZGFzaGJvYXJkLnByb2R1Y3QudjEuRmFpbHVyZU1lc3NhZ2VIABpPCg1TaW5nbGVQcm9kdWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSFgoJaW1hZ2VfdXJsGAMgASgJSACIAQFCDAoKX2ltYWdlX3VybBpWCgZSZXN1bHQSTAoIcHJvZHVjdHMYASADKAsyOi5kYXNoYm9hcmQucHJvZHVjdC52MS5TZWFyY2hQcm9kdWN0c1Jlc3BvbnNlLlNpbmdsZVByb2R1Y3RCCAoGcmVzdWx0IjUKH0dldFByb2R1Y3RCb3VnaHRBcnRpY2xlc1JlcXVlc3QSEgoKcHJvZHVjdF9pZBgBIAEoCSJgCiBHZXRQcm9kdWN0Qm91Z2h0QXJ0aWNsZXNSZXNwb25zZRI8CghhcnRpY2xlcxgBIAMoCzIqLmRhc2hib2FyZC5wcm9kdWN0LnYxLlByb2R1Y3RCb3VnaHRBcnRpY2xlIogBChRQcm9kdWN0Qm91Z2h0QXJ0aWNsZRIKCgJpZBgBIAEoCRISCgpwcm9kdWN0X2lkGAIgASgJEhQKB2NvbnRlbnQYAyABKAlIAIgBARIuCgpjcmVhdGVkX2F0GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIKCghfY29udGVudCJgCiFVcGRhdGVQcm9kdWN0Qm91Z2h0QXJ0aWNsZVJlcXVlc3QSOwoHYXJ0aWNsZRgBIAEoCzIqLmRhc2hib2FyZC5wcm9kdWN0LnYxLlByb2R1Y3RCb3VnaHRBcnRpY2xlIicKEUdldFByb2R1Y3RSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkiiwEKEkdldFByb2R1Y3RSZXNwb25zZRIyCgdwcm9kdWN0GAEgASgLMh8uZGFzaGJvYXJkLnByb2R1Y3QudjEuUHJvZHVjdFYySAASNwoHZmFpbHVyZRgCIAEoDjIkLmRhc2hib2FyZC5wcm9kdWN0LnYxLkZhaWx1cmVNZXNzYWdlSABCCAoGcmVzdWx0InIKHENyZWF0ZU9yVXBkYXRlUHJvZHVjdFJlcXVlc3QSMAoHcHJvZHVjdBgBIAEoCzIfLmRhc2hib2FyZC5wcm9kdWN0LnYxLlByb2R1Y3RWMhIgChhpc19kZXNjcmlwdGlvbl9kaWZmZXJlbnQYAiABKAgiTQoeVXBkYXRlUHJvZHVjdFVuaXF1ZVNsdWdSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkSFwoPbmV3X3VuaXF1ZV9zbHVnGAIgASgJIpkJCglQcm9kdWN0VjISDwoCaWQYASABKAlIAIgBARITCgt1bmlxdWVfc2x1ZxgCIAEoCRISCgpwcm9qZWN0X2lkGAMgASgJEjYKBnN0YXR1cxgEIAEoDjImLmRhc2hib2FyZC5wcm9kdWN0LnYxLlByb2R1Y3RWMi5TdGF0dXMSGQoMaXNfcmVjdXJyaW5nGAUgASgISAGIAQESNwoJcmVjdXJyaW5nGAYgASgLMh8uZGFzaGJvYXJkLnByb2R1Y3QudjEuUmVjdXJyaW5nSAKIAQESDAoEbmFtZRgHIAEoCRIYCgtkZXNjcmlwdGlvbhgIIAEoCUgDiAEBEh0KEGh0bWxfZGVzY3JpcHRpb24YCSABKAlIBIgBARIeChFzaG9ydF9kZXNjcmlwdGlvbhgKIAEoCUgFiAEBEhkKDHByaWNlX2Ftb3VudBgLIAEoBUgGiAEBEhsKDnByaWNlX2N1cnJlbmN5GAwgASgJSAeIAQESEAoDdGF4GA0gASgCSAiIAQESHwoSYXZhaWxhYmxlX3F1YW50aXR5GA4gASgFSAmIAQESPwoIZmVhdHVyZXMYDyADKAsyLS5kYXNoYm9hcmQucHJvZHVjdC52MS5Qcm9kdWN0VjIuRmVhdHVyZXNFbnRyeRIOCgZpbWFnZXMYECADKAkSHAoPdGh1bWJuYWlsX2ltYWdlGBEgASgJSAqIAQESFwoKbWFpbl9pbWFnZRgSIAEoCUgLiAEBEi8KCHZhcmlhbnRzGBMgAygLMh0uZGFzaGJvYXJkLnByb2R1Y3QudjEuVmFyaWFudBInChpzZW5kX3RpY2tldF9hZnRlcl9wdXJjaGFzZRgUIAEoCEgMiAEBEicKGmlzX3Byb2R1Y3RfdmlzaWJsZV9vbl9saXN0GBUgASgISA2IAQESGwoOaXNfZGVsaXZlcmFibGUYGCABKAhIDogBARISCgpjcmVhdGVkX2F0GBkgASgDEhIKCnVwZGF0ZWRfYXQYGiABKAMSFwoKZGVsZXRlZF9hdBgbIAEoA0gPiAEBGi8KDUZlYXR1cmVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIzCgZTdGF0dXMSCQoFRFJBRlQQABIPCgtVTlBVQkxJU0hFRBABEg0KCVBVQkxJU0hFRBACQgUKA19pZEIPCg1faXNfcmVjdXJyaW5nQgwKCl9yZWN1cnJpbmdCDgoMX2Rlc2NyaXB0aW9uQhMKEV9odG1sX2Rlc2NyaXB0aW9uQhQKEl9zaG9ydF9kZXNjcmlwdGlvbkIPCg1fcHJpY2VfYW1vdW50QhEKD19wcmljZV9jdXJyZW5jeUIGCgRfdGF4QhUKE19hdmFpbGFibGVfcXVhbnRpdHlCEgoQX3RodW1ibmFpbF9pbWFnZUINCgtfbWFpbl9pbWFnZUIdChtfc2VuZF90aWNrZXRfYWZ0ZXJfcHVyY2hhc2VCHQobX2lzX3Byb2R1Y3RfdmlzaWJsZV9vbl9saXN0QhEKD19pc19kZWxpdmVyYWJsZUINCgtfZGVsZXRlZF9hdCK7AwoJUmVjdXJyaW5nEjoKDWJpbGxpbmdQZXJpb2QYASABKA4yIy5kYXNoYm9hcmQucHJvZHVjdC52MS5CaWxsaW5nUGVyaW9kEhcKCnRyaWFsX2RheXMYAiABKAVIAIgBARIfChJudW1iZXJfb2ZfcGF5bWVudHMYAyABKAVIAYgBARIxCiRjaGFuZ2VfYW1vdW50X2Zvcl9jdXJyZW50U3Vic2NyaWJlcnMYBCABKAhIAogBARI0CidyZW1vdmVfYWNjZXNzX2Zvcl9jYW5jZWxsZWRfc3Vic2NyaWJlcnMYBSABKAhIA4gBARIuCiFzaG91bGRfc2VuZF90cmlhbF9wZXJpb2RfcmVtaW5kZXIYBiABKAhIBIgBAUINCgtfdHJpYWxfZGF5c0IVChNfbnVtYmVyX29mX3BheW1lbnRzQicKJV9jaGFuZ2VfYW1vdW50X2Zvcl9jdXJyZW50U3Vic2NyaWJlcnNCKgooX3JlbW92ZV9hY2Nlc3NfZm9yX2NhbmNlbGxlZF9zdWJzY3JpYmVyc0IkCiJfc2hvdWxkX3NlbmRfdHJpYWxfcGVyaW9kX3JlbWluZGVyIr4BCg9WYXJpYW50RGlzY291bnQSOAoEdHlwZRgBIAEoDjIqLmRhc2hib2FyZC5wcm9kdWN0LnYxLlZhcmlhbnREaXNjb3VudC5UeXBlEg4KBmFtb3VudBgCIAEoBRIxCghlbmRfZGF0ZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBASIhCgRUeXBlEgkKBUZJWEVEEAASDgoKUEVSQ0VOVEFHRRABQgsKCV9lbmRfZGF0ZSLLBAoHVmFyaWFudBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKC2Rlc2NyaXB0aW9uGAMgASgJSACIAQESFgoJaW1hZ2VfdXJsGAQgASgJSAGIAQESFAoMcHJpY2VfYW1vdW50GAUgASgFEhYKDnByaWNlX2N1cnJlbmN5GAYgASgJEhAKA3RheBgHIAEoBUgCiAEBEh8KEmF2YWlsYWJsZV9xdWFudGl0eRgIIAEoBUgDiAEBEjcKCXJlY3VycmluZxgJIAEoCzIfLmRhc2hib2FyZC5wcm9kdWN0LnYxLlJlY3VycmluZ0gEiAEBEhsKDmlzX2RlbGl2ZXJhYmxlGAogASgISAWIAQESIQoUbG93ZXN0X3ByaWNlXzMwX2RheXMYCyABKAVIBogBARI8CghkaXNjb3VudBgMIAEoCzIlLmRhc2hib2FyZC5wcm9kdWN0LnYxLlZhcmlhbnREaXNjb3VudEgHiAEBEj4KFWVzdGltYXRlZF9kZWxpdmVyeV9hdBgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBICIgBAUIOCgxfZGVzY3JpcHRpb25CDAoKX2ltYWdlX3VybEIGCgRfdGF4QhUKE19hdmFpbGFibGVfcXVhbnRpdHlCDAoKX3JlY3VycmluZ0IRCg9faXNfZGVsaXZlcmFibGVCFwoVX2xvd2VzdF9wcmljZV8zMF9kYXlzQgsKCV9kaXNjb3VudEIYChZfZXN0aW1hdGVkX2RlbGl2ZXJ5X2F0IngKHUNyZWF0ZU9yVXBkYXRlUHJvZHVjdFJlc3BvbnNlEhQKCnByb2R1Y3RfaWQYASABKAlIABI3CgdmYWlsdXJlGAIgASgOMiQuZGFzaGJvYXJkLnByb2R1Y3QudjEuRmFpbHVyZU1lc3NhZ2VIAEIICgZyZXN1bHQifAoMQm9vbFJlc3BvbnNlEikKB3N1Y2Nlc3MYASABKAsyFi5nb29nbGUucHJvdG9idWYuRW1wdHlIABI3CgdmYWlsdXJlGAIgASgOMiQuZGFzaGJvYXJkLnByb2R1Y3QudjEuRmFpbHVyZU1lc3NhZ2VIAEIICgZyZXN1bHQqvQEKDUJpbGxpbmdQZXJpb2QSGAoUQklMTElOR19QRVJJT0RfREFJTFkQABIZChVCSUxMSU5HX1BFUklPRF9XRUVLTFkQARIaChZCSUxMSU5HX1BFUklPRF9NT05USExZEAISHAoYQklMTElOR19QRVJJT0RfUVVBUlRFUkxZEAMSIAocQklMTElOR19QRVJJT0RfU0VNSV9BTk5VQUxMWRAEEhsKF0JJTExJTkdfUEVSSU9EX0FOTlVBTExZEAUqlQIKDkZhaWx1cmVNZXNzYWdlEhsKF0ZBSUxVUkVfTUVTU0FHRV9VTktOT1dOEAASJQohRkFJTFVSRV9NRVNTQUdFX1BST0pFQ1RfTk9UX0ZPVU5EEAESJQohRkFJTFVSRV9NRVNTQUdFX1BST0RVQ1RfTk9UX0ZPVU5EEAISJgoiRkFJTFVSRV9NRVNTQUdFX0lOVkFMSURfUFJPRFVDVF9JRBADEiYKIkZBSUxVUkVfTUVTU0FHRV9TTFVHX0FMUkVBRFlfVEFLRU4QBBIpCiVGQUlMVVJFX01FU1NBR0VfQ0FOTk9UX0NSRUFURV9QUk9EVUNUEAUSHQoZRkFJTFVSRV9NRVNTQUdFX05PX0FDQ0VTUxAGMrUUCg1Qcm9kdWN0Um91dGVyEoABChVDcmVhdGVPclVwZGF0ZVByb2R1Y3QSMi5kYXNoYm9hcmQucHJvZHVjdC52MS5DcmVhdGVPclVwZGF0ZVByb2R1Y3RSZXF1ZXN0GjMuZGFzaGJvYXJkLnByb2R1Y3QudjEuQ3JlYXRlT3JVcGRhdGVQcm9kdWN0UmVzcG9uc2UScwoXVXBkYXRlUHJvZHVjdFVuaXF1ZVNsdWcSNC5kYXNoYm9hcmQucHJvZHVjdC52MS5VcGRhdGVQcm9kdWN0VW5pcXVlU2x1Z1JlcXVlc3QaIi5kYXNoYm9hcmQucHJvZHVjdC52MS5Cb29sUmVzcG9uc2USXwoKR2V0UHJvZHVjdBInLmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldFByb2R1Y3RSZXF1ZXN0GiguZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdFJlc3BvbnNlEqQBCiFHZXRQcm9kdWN0U2VuZFRpY2tldEFmdGVyUHVyY2hhc2USPi5kYXNoYm9hcmQucHJvZHVjdC52MS5HZXRQcm9kdWN0U2VuZFRpY2tldEFmdGVyUHVyY2hhc2VSZXF1ZXN0Gj8uZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdFNlbmRUaWNrZXRBZnRlclB1cmNoYXNlUmVzcG9uc2USoQEKIEdldFByb2R1Y3RBdWRpb2Jvb2tBZnRlclB1cmNoYXNlEj0uZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdEF1ZGlvYm9va0FmdGVyUHVyY2hhc2VSZXF1ZXN0Gj4uZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdEF1ZGlvYm9va0FmdGVyUHVyY2hhc2VSZXNwb25zZRKNAQokVXBkYXRlUHJvZHVjdFNlbmRUaWNrZXRBZnRlclB1cmNoYXNlEkEuZGFzaGJvYXJkLnByb2R1Y3QudjEuVXBkYXRlUHJvZHVjdFNlbmRUaWNrZXRBZnRlclB1cmNoYXNlUmVxdWVzdBoiLmRhc2hib2FyZC5wcm9kdWN0LnYxLkJvb2xSZXNwb25zZRKLAQojVXBkYXRlUHJvZHVjdEF1ZGlvYm9va0FmdGVyUHVyY2hhc2USQC5kYXNoYm9hcmQucHJvZHVjdC52MS5VcGRhdGVQcm9kdWN0QXVkaW9ib29rQWZ0ZXJQdXJjaGFzZVJlcXVlc3QaIi5kYXNoYm9hcmQucHJvZHVjdC52MS5Cb29sUmVzcG9uc2UScQoWUHVibGlzaFByb2R1Y3RJZk5lZWRlZBIzLmRhc2hib2FyZC5wcm9kdWN0LnYxLlB1Ymxpc2hQcm9kdWN0SWZOZWVkZWRSZXF1ZXN0GiIuZGFzaGJvYXJkLnByb2R1Y3QudjEuQm9vbFJlc3BvbnNlEpsBCh5HZXRQcm9kdWN0QWZ0ZXJQdXJjaGFzZU1lc3NhZ2USOy5kYXNoYm9hcmQucHJvZHVjdC52MS5HZXRQcm9kdWN0QWZ0ZXJQdXJjaGFzZU1lc3NhZ2VSZXF1ZXN0GjwuZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdEFmdGVyUHVyY2hhc2VNZXNzYWdlUmVzcG9uc2UShwEKIVVwZGF0ZVByb2R1Y3RBZnRlclB1cmNoYXNlTWVzc2FnZRI+LmRhc2hib2FyZC5wcm9kdWN0LnYxLlVwZGF0ZVByb2R1Y3RBZnRlclB1cmNoYXNlTWVzc2FnZVJlcXVlc3QaIi5kYXNoYm9hcmQucHJvZHVjdC52MS5Cb29sUmVzcG9uc2USdwoSR2V0UHJvZHVjdFZhcmlhbnRzEi8uZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdFZhcmlhbnRzUmVxdWVzdBowLmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldFByb2R1Y3RWYXJpYW50c1Jlc3BvbnNlEnUKGFNlbmRUZXN0RW1haWxXaXRoTWVzc2FnZRI1LmRhc2hib2FyZC5wcm9kdWN0LnYxLlNlbmRUZXN0RW1haWxXaXRoTWVzc2FnZVJlcXVlc3QaIi5kYXNoYm9hcmQucHJvZHVjdC52MS5Cb29sUmVzcG9uc2USawoOU2VhcmNoUHJvZHVjdHMSKy5kYXNoYm9hcmQucHJvZHVjdC52MS5TZWFyY2hQcm9kdWN0c1JlcXVlc3QaLC5kYXNoYm9hcmQucHJvZHVjdC52MS5TZWFyY2hQcm9kdWN0c1Jlc3BvbnNlEowBChlFeGNoYW5nZVByb2R1Y3RJRHNUb05hbWVzEjYuZGFzaGJvYXJkLnByb2R1Y3QudjEuRXhjaGFuZ2VQcm9kdWN0SURzVG9OYW1lc1JlcXVlc3QaNy5kYXNoYm9hcmQucHJvZHVjdC52MS5FeGNoYW5nZVByb2R1Y3RJRHNUb05hbWVzUmVzcG9uc2USiQEKGEdldFByb2R1Y3RCb3VnaHRBcnRpY2xlcxI1LmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldFByb2R1Y3RCb3VnaHRBcnRpY2xlc1JlcXVlc3QaNi5kYXNoYm9hcmQucHJvZHVjdC52MS5HZXRQcm9kdWN0Qm91Z2h0QXJ0aWNsZXNSZXNwb25zZRJ5ChpVcGRhdGVQcm9kdWN0Qm91Z2h0QXJ0aWNsZRI3LmRhc2hib2FyZC5wcm9kdWN0LnYxLlVwZGF0ZVByb2R1Y3RCb3VnaHRBcnRpY2xlUmVxdWVzdBoiLmRhc2hib2FyZC5wcm9kdWN0LnYxLkJvb2xSZXNwb25zZRJpChdBZGRQcm9kdWN0Qm91Z2h0QXJ0aWNsZRIqLmRhc2hib2FyZC5wcm9kdWN0LnYxLlByb2R1Y3RCb3VnaHRBcnRpY2xlGiIuZGFzaGJvYXJkLnByb2R1Y3QudjEuQm9vbFJlc3BvbnNlEn0KFEdldEZpbGVBY2Nlc3NNZW1iZXJzEjEuZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0RmlsZUFjY2Vzc01lbWJlcnNSZXF1ZXN0GjIuZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0RmlsZUFjY2Vzc01lbWJlcnNSZXNwb25zZRJxChBHaXZlQWNjZXNzVG9GaWxlEi0uZGFzaGJvYXJkLnByb2R1Y3QudjEuR2l2ZUFjY2Vzc1RvRmlsZVJlcXVlc3QaLi5kYXNoYm9hcmQucHJvZHVjdC52MS5HaXZlQWNjZXNzVG9GaWxlUmVzcG9uc2USdwoSUmVtb3ZlQWNjZXNzVG9GaWxlEi8uZGFzaGJvYXJkLnByb2R1Y3QudjEuUmVtb3ZlQWNjZXNzVG9GaWxlUmVxdWVzdBowLmRhc2hib2FyZC5wcm9kdWN0LnYxLlJlbW92ZUFjY2Vzc1RvRmlsZVJlc3BvbnNlYgZwcm90bzM", [file_google_protobuf_empty3, file_google_protobuf_timestamp4]);
2241
+
2242
+ // src/gen/proto/dashboard/v1/notifications_pb.ts
2243
+ var file_dashboard_v1_notifications = /* @__PURE__ */ fileDesc7("CiBkYXNoYm9hcmQvdjEvbm90aWZpY2F0aW9ucy5wcm90bxIaZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEiYAoWVmVyaWZ5VXNlckVtYWlsUmVxdWVzdBISCgVlbWFpbBgBIAEoCUgAiAEBEhEKBGNvZGUYAiABKAlIAYgBARIMCgRzbHVnGAMgASgJQggKBl9lbWFpbEIHCgVfY29kZSJ/ChdWZXJpZnlVc2VyRW1haWxSZXNwb25zZRIPCgJvaxgBIAEoCEgAiAEBEhkKDGFjY2Vzc190b2tlbhgCIAEoCUgBiAEBEhQKB3VzZXJfaWQYAyABKAlIAogBAUIFCgNfb2tCDwoNX2FjY2Vzc190b2tlbkIKCghfdXNlcl9pZCJQChRHZXRVc2VyR3JvdXBzUmVxdWVzdBIMCgRzbHVnGAEgASgJEhkKDGFjY2Vzc190b2tlbhgCIAEoCUgAiAEBQg8KDV9hY2Nlc3NfdG9rZW4iiQIKFUdldFVzZXJHcm91cHNSZXNwb25zZRJHCgZncm91cHMYASADKAsyNy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5HZXRVc2VyR3JvdXBzUmVzcG9uc2UuR3JvdXAapgEKBUdyb3VwEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSGAoLZGVzY3JpcHRpb24YAyABKAlIAIgBARINCgVpc19vbhgEIAEoCBI8Cglob3dfb2Z0ZW4YBSABKA4yJC5jb21tb24udjEuTm90aWZpY2F0aW9uR3JvdXBIb3dPZnRlbkgBiAEBQg4KDF9kZXNjcmlwdGlvbkIMCgpfaG93X29mdGVuIncKF1VwZGF0ZVVzZXJHcm91cHNSZXF1ZXN0EgwKBHNsdWcYASABKAkSDwoHdXNlcl9pZBgCIAEoCRIRCglncm91cF9pZHMYAyADKAkSGQoMYWNjZXNzX3Rva2VuGAQgASgJSACIAQFCDwoNX2FjY2Vzc190b2tlbiJvCiJHZXROb3RpZmljYXRpb25Vc2VyU2V0dGluZ3NSZXF1ZXN0EgwKBHNsdWcYASABKAkSDwoHdXNlcl9pZBgCIAEoCRIZCgxhY2Nlc3NfdG9rZW4YAyABKAlIAIgBAUIPCg1fYWNjZXNzX3Rva2VuIowECiNHZXROb3RpZmljYXRpb25Vc2VyU2V0dGluZ3NSZXNwb25zZRJZCgdzdWNjZXNzGAEgASgLMkYuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0Tm90aWZpY2F0aW9uVXNlclNldHRpbmdzUmVzcG9uc2UuUmVzdWx0SAASPQoHZmFpbHVyZRgCIAEoDjIqLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkZhaWx1cmVNZXNzYWdlSAAawAIKBlJlc3VsdBIfChdub3RpZmljYXRpb25fc2V0dGluZ19pZBgBIAEoCRIZChFzdWJzY3JpcHRpb25fc2x1ZxgCIAEoCRIjChttb2JpbGVfbm90aWZpY2F0aW9uX2VuYWJsZWQYAyABKAgSIgoaZW1haWxfbm90aWZpY2F0aW9uX2VuYWJsZWQYBCABKAgSIAoYc21zX25vdGlmaWNhdGlvbl9lbmFibGVkGAUgASgIEiQKHGVtYWlsX25vdGlmaWNhdGlvbl9hdmFpbGFibGUYBiABKAgSIgoac21zX25vdGlmaWNhdGlvbl9hdmFpbGFibGUYByABKAgSJQodbW9iaWxlX25vdGlmaWNhdGlvbl9hdmFpbGFibGUYCCABKAgSHgoWaGFzX3VzZXJfaW5zdGFsbGVkX2FwcBgJIAEoCEIICgZyZXN1bHQiIgogQ3JlYXRlTm90aWZpY2F0aW9uU2V0dGluZ1JlcXVlc3QiIAoeUmVhZE5vdGlmaWNhdGlvblNldHRpbmdSZXF1ZXN0IskBCiBVcGRhdGVOb3RpZmljYXRpb25TZXR0aW5nUmVxdWVzdBIfChdub3RpZmljYXRpb25fc2V0dGluZ19pZBgBIAEoCRIZChFzdWJzY3JpcHRpb25fc2x1ZxgCIAEoCRIjChttb2JpbGVfbm90aWZpY2F0aW9uX2VuYWJsZWQYAyABKAgSIgoaZW1haWxfbm90aWZpY2F0aW9uX2VuYWJsZWQYBCABKAgSIAoYc21zX25vdGlmaWNhdGlvbl9lbmFibGVkGAUgASgIIkMKIERlbGV0ZU5vdGlmaWNhdGlvblNldHRpbmdSZXF1ZXN0Eh8KF25vdGlmaWNhdGlvbl9zZXR0aW5nX2lkGAEgASgJIvMCCh9SZWFkTm90aWZpY2F0aW9uU2V0dGluZ1Jlc3BvbnNlElUKB3N1Y2Nlc3MYASABKAsyQi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uU2V0dGluZ1Jlc3BvbnNlLlJlc3VsdEgAEj0KB2ZhaWx1cmUYAiABKA4yKi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5GYWlsdXJlTWVzc2FnZUgAGq8BCgZSZXN1bHQSHwoXbm90aWZpY2F0aW9uX3NldHRpbmdfaWQYASABKAkSGQoRc3Vic2NyaXB0aW9uX3NsdWcYAiABKAkSIwobbW9iaWxlX25vdGlmaWNhdGlvbl9lbmFibGVkGAMgASgIEiIKGmVtYWlsX25vdGlmaWNhdGlvbl9lbmFibGVkGAQgASgIEiAKGHNtc19ub3RpZmljYXRpb25fZW5hYmxlZBgFIAEoCEIICgZyZXN1bHQi5AEKG05vdGlmaWNhdGlvblNldHRpbmdSZXNwb25zZRJRCgdzdWNjZXNzGAEgASgLMj4uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uU2V0dGluZ1Jlc3BvbnNlLlJlc3VsdEgAEj0KB2ZhaWx1cmUYAiABKA4yKi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5GYWlsdXJlTWVzc2FnZUgAGikKBlJlc3VsdBIfChdub3RpZmljYXRpb25fc2V0dGluZ19pZBgBIAEoCUIICgZyZXN1bHQiygEKHkNyZWF0ZU5vdGlmaWNhdGlvbkdyb3VwUmVxdWVzdBIMCgRuYW1lGAEgASgJEhgKC2Rlc2NyaXB0aW9uGAIgASgJSACIAQESPAoJaG93X29mdGVuGAMgASgOMiQuY29tbW9uLnYxLk5vdGlmaWNhdGlvbkdyb3VwSG93T2Z0ZW5IAYgBARIWCglpc19wdWJsaWMYBCABKAhIAogBAUIOCgxfZGVzY3JpcHRpb25CDAoKX2hvd19vZnRlbkIMCgpfaXNfcHVibGljIloKHVJlYWROb3RpZmljYXRpb25Hcm91cHNSZXF1ZXN0EhEKCWdyb3VwX2lkcxgBIAMoCRIXCgpncm91cF9uYW1lGAIgASgJSACIAQFCDQoLX2dyb3VwX25hbWUi6QEKHlVwZGF0ZU5vdGlmaWNhdGlvbkdyb3VwUmVxdWVzdBIdChVub3RpZmljYXRpb25fZ3JvdXBfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIYCgtkZXNjcmlwdGlvbhgDIAEoCUgAiAEBEjwKCWhvd19vZnRlbhgEIAEoDjIkLmNvbW1vbi52MS5Ob3RpZmljYXRpb25Hcm91cEhvd09mdGVuSAGIAQESFgoJaXNfcHVibGljGAUgASgISAKIAQFCDgoMX2Rlc2NyaXB0aW9uQgwKCl9ob3dfb2Z0ZW5CDAoKX2lzX3B1YmxpYyI/Ch5EZWxldGVOb3RpZmljYXRpb25Hcm91cFJlcXVlc3QSHQoVbm90aWZpY2F0aW9uX2dyb3VwX2lkGAEgASgJIuoDCh5SZWFkTm90aWZpY2F0aW9uR3JvdXBzUmVzcG9uc2USVAoHc3VjY2VzcxgBIAEoCzJBLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25Hcm91cHNSZXNwb25zZS5SZXN1bHRIABI9CgdmYWlsdXJlGAIgASgOMiouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRmFpbHVyZU1lc3NhZ2VIABrMAQoFR3JvdXASHQoVbm90aWZpY2F0aW9uX2dyb3VwX2lkGAEgASgJEgwKBG5hbWUYAiABKAkSGAoLZGVzY3JpcHRpb24YAyABKAlIAIgBARI8Cglob3dfb2Z0ZW4YBCABKA4yJC5jb21tb24udjEuTm90aWZpY2F0aW9uR3JvdXBIb3dPZnRlbkgBiAEBEg0KBXVzZXJzGAUgASgFEhEKCWlzX3B1YmxpYxgGIAEoCEIOCgxfZGVzY3JpcHRpb25CDAoKX2hvd19vZnRlbhpaCgZSZXN1bHQSUAoGZ3JvdXBzGAEgAygLMkAuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbkdyb3Vwc1Jlc3BvbnNlLkdyb3VwQggKBnJlc3VsdCLeAQoZTm90aWZpY2F0aW9uR3JvdXBSZXNwb25zZRJPCgdzdWNjZXNzGAEgASgLMjwuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uR3JvdXBSZXNwb25zZS5SZXN1bHRIABI9CgdmYWlsdXJlGAIgASgOMiouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRmFpbHVyZU1lc3NhZ2VIABonCgZSZXN1bHQSHQoVbm90aWZpY2F0aW9uX2dyb3VwX2lkGAEgASgJQggKBnJlc3VsdCKjAgodQ3JlYXRlTm90aWZpY2F0aW9uVXNlclJlcXVlc3QSDAoEc2x1ZxgBIAEoCRINCgVlbWFpbBgCIAEoCRIOCgZncm91cHMYAyADKAkSEgoFcGhvbmUYBCABKAlIAIgBARIXCgpmaXJzdF9uYW1lGAUgASgJSAGIAQESFgoJbGFzdF9uYW1lGAYgASgJSAKIAQESIwobbW9iaWxlX25vdGlmaWNhdGlvbl9lbmFibGVkGAcgASgIEiIKGmVtYWlsX25vdGlmaWNhdGlvbl9lbmFibGVkGAggASgIEiAKGHNtc19ub3RpZmljYXRpb25fZW5hYmxlZBgJIAEoCEIICgZfcGhvbmVCDQoLX2ZpcnN0X25hbWVCDAoKX2xhc3RfbmFtZSJYChxSZWFkTm90aWZpY2F0aW9uVXNlcnNSZXF1ZXN0EhAKCHVzZXJfaWRzGAEgAygJEhcKCnVzZXJfZW1haWwYAiABKAlIAIgBAUINCgtfdXNlcl9lbWFpbCKwAgodVXBkYXRlTm90aWZpY2F0aW9uVXNlclJlcXVlc3QSDAoEc2x1ZxgBIAEoCRIcChRub3RpZmljYXRpb25fdXNlcl9pZBgCIAEoCRIXCgpmaXJzdF9uYW1lGAMgASgJSACIAQESFgoJbGFzdF9uYW1lGAQgASgJSAGIAQESIwobbW9iaWxlX25vdGlmaWNhdGlvbl9lbmFibGVkGAUgASgIEiIKGmVtYWlsX25vdGlmaWNhdGlvbl9lbmFibGVkGAYgASgIEiAKGHNtc19ub3RpZmljYXRpb25fZW5hYmxlZBgHIAEoCBIZCgxhY2Nlc3NfdG9rZW4YCCABKAlIAogBAUINCgtfZmlyc3RfbmFtZUIMCgpfbGFzdF9uYW1lQg8KDV9hY2Nlc3NfdG9rZW4iagodRGVsZXRlTm90aWZpY2F0aW9uVXNlclJlcXVlc3QSDwoHdXNlcl9pZBgBIAEoCRIMCgRzbHVnGAIgASgJEhkKDGFjY2Vzc190b2tlbhgDIAEoCUgAiAEBQg8KDV9hY2Nlc3NfdG9rZW4i+AEKHVJlYWROb3RpZmljYXRpb25Vc2Vyc1Jlc3BvbnNlElMKB3N1Y2Nlc3MYASABKAsyQC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uVXNlcnNSZXNwb25zZS5SZXN1bHRIABI9CgdmYWlsdXJlGAIgASgOMiouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRmFpbHVyZU1lc3NhZ2VIABo5CgZSZXN1bHQSLwoFdXNlcnMYASADKAsyIC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Vc2VyQggKBnJlc3VsdCKpAgoYTm90aWZpY2F0aW9uVXNlclJlc3BvbnNlEk4KB3N1Y2Nlc3MYASABKAsyOy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25Vc2VyUmVzcG9uc2UuUmVzdWx0SAASPQoHZmFpbHVyZRgCIAEoDjIqLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkZhaWx1cmVNZXNzYWdlSAASGQoMYWNjZXNzX3Rva2VuGAMgASgJSAGIAQESFAoHdXNlcl9pZBgEIAEoCUgCiAEBGiYKBlJlc3VsdBIcChRub3RpZmljYXRpb25fdXNlcl9pZBgBIAEoCUIICgZyZXN1bHRCDwoNX2FjY2Vzc190b2tlbkIKCghfdXNlcl9pZCJhCiJDcmVhdGVOb3RpZmljYXRpb25Hcm91cFVzZXJSZXF1ZXN0Eh0KFW5vdGlmaWNhdGlvbl9ncm91cF9pZBgBIAEoCRIcChRub3RpZmljYXRpb25fdXNlcl9pZBgCIAEoCSI3CiJSZWFkTm90aWZpY2F0aW9uR3JvdXBVc2Vyc1JlcXVlc3RzEhEKCWdyb3VwX2lkcxgBIAMoCSKFAQoiVXBkYXRlTm90aWZpY2F0aW9uR3JvdXBVc2VyUmVxdWVzdBIiChpub3RpZmljYXRpb25fZ3JvdXBfdXNlcl9pZBgBIAEoCRIdChVub3RpZmljYXRpb25fZ3JvdXBfaWQYAiABKAkSHAoUbm90aWZpY2F0aW9uX3VzZXJfaWQYAyABKAkiSAoiRGVsZXRlTm90aWZpY2F0aW9uR3JvdXBVc2VyUmVxdWVzdBIiChpub3RpZmljYXRpb25fZ3JvdXBfdXNlcl9pZBgBIAEoCSKCAgoiUmVhZE5vdGlmaWNhdGlvbkdyb3VwVXNlcnNSZXNwb25zZRJYCgdzdWNjZXNzGAEgASgLMkUuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbkdyb3VwVXNlcnNSZXNwb25zZS5SZXN1bHRIABI9CgdmYWlsdXJlGAIgASgOMiouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRmFpbHVyZU1lc3NhZ2VIABo5CgZSZXN1bHQSLwoFdXNlcnMYASADKAsyIC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Vc2VyQggKBnJlc3VsdCLrAQodTm90aWZpY2F0aW9uR3JvdXBVc2VyUmVzcG9uc2USUwoHc3VjY2VzcxgBIAEoCzJALmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbkdyb3VwVXNlclJlc3BvbnNlLlJlc3VsdEgAEj0KB2ZhaWx1cmUYAiABKA4yKi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5GYWlsdXJlTWVzc2FnZUgAGiwKBlJlc3VsdBIiChpub3RpZmljYXRpb25fZ3JvdXBfdXNlcl9pZBgBIAEoCUIICgZyZXN1bHQi7wMKE05vdGlmaWNhdGlvbk1lc3NhZ2USHwoXbm90aWZpY2F0aW9uX21lc3NhZ2VfaWQYASABKAkSRQoGc3RhdHVzGAIgASgOMjUuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uTWVzc2FnZVN0YXR1cxIrCgdzZW5kX2F0GAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBINCgV0aXRsZRgEIAEoCRIVCghzdWJ0aXRsZRgFIAEoCUgAiAEBEhQKB21lc3NhZ2UYBiABKAlIAYgBARIWCglpbWFnZV91cmwYByABKAlIAogBARIOCgZncm91cHMYCCADKAkSEAoIcHJvZHVjdHMYCSADKAkSDQoFdXNlcnMYCiADKAkSIwobbW9iaWxlX25vdGlmaWNhdGlvbl9lbmFibGVkGAsgASgIEiIKGmVtYWlsX25vdGlmaWNhdGlvbl9lbmFibGVkGAwgASgIEiAKGHNtc19ub3RpZmljYXRpb25fZW5hYmxlZBgNIAEoCBIaCg1lcnJvcl9tZXNzYWdlGA4gASgJSAOIAQFCCwoJX3N1YnRpdGxlQgoKCF9tZXNzYWdlQgwKCl9pbWFnZV91cmxCEAoOX2Vycm9yX21lc3NhZ2UirQMKIENyZWF0ZU5vdGlmaWNhdGlvbk1lc3NhZ2VSZXF1ZXN0EkUKBnN0YXR1cxgBIAEoDjI1LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbk1lc3NhZ2VTdGF0dXMSKwoHc2VuZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDQoFdGl0bGUYAyABKAkSFQoIc3VidGl0bGUYBCABKAlIAIgBARIUCgdtZXNzYWdlGAUgASgJSAGIAQESFgoJaW1hZ2VfdXJsGAYgASgJSAKIAQESDgoGZ3JvdXBzGAcgAygJEhAKCHByb2R1Y3RzGAggAygJEg0KBXVzZXJzGAkgAygJEiMKG21vYmlsZV9ub3RpZmljYXRpb25fZW5hYmxlZBgKIAEoCBIiChplbWFpbF9ub3RpZmljYXRpb25fZW5hYmxlZBgLIAEoCBIgChhzbXNfbm90aWZpY2F0aW9uX2VuYWJsZWQYDCABKAhCCwoJX3N1YnRpdGxlQgoKCF9tZXNzYWdlQgwKCl9pbWFnZV91cmwipAIKIkdldFNlbnROb3RpZmljYXRpb25NZXNzYWdlc1JlcXVlc3QSJAoXbm90aWZpY2F0aW9uX21lc3NhZ2VfaWQYASABKAlIAIgBARIzCgpzdGFydF90aW1lGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgBiAEBEjEKCGVuZF90aW1lGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgCiAEBEiAKE2luY2x1ZGVfZXhwb3J0X2RhdGEYBCABKAhIA4gBAUIaChhfbm90aWZpY2F0aW9uX21lc3NhZ2VfaWRCDQoLX3N0YXJ0X3RpbWVCCwoJX2VuZF90aW1lQhYKFF9pbmNsdWRlX2V4cG9ydF9kYXRhIuEDCiNHZXRTZW50Tm90aWZpY2F0aW9uTWVzc2FnZXNSZXNwb25zZRJZCgdzdWNjZXNzGAEgASgLMkYuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0U2VudE5vdGlmaWNhdGlvbk1lc3NhZ2VzUmVzcG9uc2UuUmVzdWx0SAASPQoHZmFpbHVyZRgCIAEoDjIqLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkZhaWx1cmVNZXNzYWdlSAAaKAoYTm90aWZpY2F0aW9uTWVzc2FnZVN0YXRzEgwKBHNlbnQYASABKAUa6wEKBlJlc3VsdBJOChVub3RpZmljYXRpb25fbWVzc2FnZXMYASADKAsyLy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlEmcKBXN0YXRzGAIgASgLMlguZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0U2VudE5vdGlmaWNhdGlvbk1lc3NhZ2VzUmVzcG9uc2UuTm90aWZpY2F0aW9uTWVzc2FnZVN0YXRzEhgKC2V4cG9ydF9kYXRhGAMgASgMSACIAQFCDgoMX2V4cG9ydF9kYXRhQggKBnJlc3VsdCJjCh9SZWFkTm90aWZpY2F0aW9uTWVzc2FnZXNSZXF1ZXN0EiQKF25vdGlmaWNhdGlvbl9tZXNzYWdlX2lkGAEgASgJSACIAQFCGgoYX25vdGlmaWNhdGlvbl9tZXNzYWdlX2lkIvwDCiBVcGRhdGVOb3RpZmljYXRpb25NZXNzYWdlUmVxdWVzdBIfChdub3RpZmljYXRpb25fbWVzc2FnZV9pZBgBIAEoCRJFCgZzdGF0dXMYAiABKA4yNS5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlU3RhdHVzEisKB3NlbmRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg0KBXRpdGxlGAQgASgJEhUKCHN1YnRpdGxlGAUgASgJSACIAQESFAoHbWVzc2FnZRgGIAEoCUgBiAEBEhYKCWltYWdlX3VybBgHIAEoCUgCiAEBEg4KBmdyb3VwcxgIIAMoCRIQCghwcm9kdWN0cxgJIAMoCRINCgV1c2VycxgKIAMoCRIjChttb2JpbGVfbm90aWZpY2F0aW9uX2VuYWJsZWQYCyABKAgSIgoaZW1haWxfbm90aWZpY2F0aW9uX2VuYWJsZWQYDCABKAgSIAoYc21zX25vdGlmaWNhdGlvbl9lbmFibGVkGA0gASgIEhoKDWVycm9yX21lc3NhZ2UYDiABKAlIA4gBAUILCglfc3VidGl0bGVCCgoIX21lc3NhZ2VCDAoKX2ltYWdlX3VybEIQCg5fZXJyb3JfbWVzc2FnZSJDCiBEZWxldGVOb3RpZmljYXRpb25NZXNzYWdlUmVxdWVzdBIfChdub3RpZmljYXRpb25fbWVzc2FnZV9pZBgBIAEoCSKdAgogUmVhZE5vdGlmaWNhdGlvbk1lc3NhZ2VzUmVzcG9uc2USVgoHc3VjY2VzcxgBIAEoCzJDLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25NZXNzYWdlc1Jlc3BvbnNlLlJlc3VsdEgAEj0KB2ZhaWx1cmUYAiABKA4yKi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5GYWlsdXJlTWVzc2FnZUgAGlgKBlJlc3VsdBJOChVub3RpZmljYXRpb25fbWVzc2FnZXMYASADKAsyLy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlQggKBnJlc3VsdCLkAQobTm90aWZpY2F0aW9uTWVzc2FnZVJlc3BvbnNlElEKB3N1Y2Nlc3MYASABKAsyPi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlUmVzcG9uc2UuUmVzdWx0SAASPQoHZmFpbHVyZRgCIAEoDjIqLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkZhaWx1cmVNZXNzYWdlSAAaKQoGUmVzdWx0Eh8KF25vdGlmaWNhdGlvbl9tZXNzYWdlX2lkGAEgASgJQggKBnJlc3VsdCKSAgojQ3JlYXRlTm90aWZpY2F0aW9uTWVzc2FnZUpvYlJlcXVlc3QSSAoGc3RhdHVzGAEgASgOMjguZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uTWVzc2FnZUpvYlN0YXR1cxIrCgdzZW50X2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBITCgtjdXN0b21lcl9pZBgDIAEoCRIfChdub3RpZmljYXRpb25fbWVzc2FnZV9pZBgEIAEoCRIQCghwcmlvcml0eRgFIAMoCRIaCg1lcnJvcl9tZXNzYWdlGAYgASgJSACIAQFCEAoOX2Vycm9yX21lc3NhZ2UibgoiUmVhZE5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JzUmVxdWVzdBIoChtub3RpZmljYXRpb25fbWVzc2FnZV9qb2JfaWQYASABKAlIAIgBAUIeChxfbm90aWZpY2F0aW9uX21lc3NhZ2Vfam9iX2lkIu8BCiNVcGRhdGVOb3RpZmljYXRpb25NZXNzYWdlSm9iUmVxdWVzdBIjChtub3RpZmljYXRpb25fbWVzc2FnZV9qb2JfaWQYASABKAkSSAoGc3RhdHVzGAIgASgOMjguZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uTWVzc2FnZUpvYlN0YXR1cxIrCgdzZW50X2F0GAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIaCg1lcnJvcl9tZXNzYWdlGAQgASgJSACIAQFCEAoOX2Vycm9yX21lc3NhZ2UiSgojRGVsZXRlTm90aWZpY2F0aW9uTWVzc2FnZUpvYlJlcXVlc3QSIwobbm90aWZpY2F0aW9uX21lc3NhZ2Vfam9iX2lkGAEgASgJIvwECiNSZWFkTm90aWZpY2F0aW9uTWVzc2FnZUpvYnNSZXNwb25zZRJZCgdzdWNjZXNzGAEgASgLMkYuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JzUmVzcG9uc2UuUmVzdWx0SAASPQoHZmFpbHVyZRgCIAEoDjIqLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkZhaWx1cmVNZXNzYWdlSAAaqgIKFk5vdGlmaWNhdGlvbk1lc3NhZ2VKb2ISIwobbm90aWZpY2F0aW9uX21lc3NhZ2Vfam9iX2lkGAEgASgJEkgKBnN0YXR1cxgCIAEoDjI4LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JTdGF0dXMSKwoHc2VudF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEwoLY3VzdG9tZXJfaWQYBCABKAkSHwoXbm90aWZpY2F0aW9uX21lc3NhZ2VfaWQYBSABKAkSEAoIcHJpb3JpdHkYBiADKAkSGgoNZXJyb3JfbWVzc2FnZRgHIAEoCUgAiAEBQhAKDl9lcnJvcl9tZXNzYWdlGoMBCgZSZXN1bHQSeQoZbm90aWZpY2F0aW9uX21lc3NhZ2Vfam9icxgBIAMoCzJWLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25NZXNzYWdlSm9ic1Jlc3BvbnNlLk5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JCCAoGcmVzdWx0Iu4BCh5Ob3RpZmljYXRpb25NZXNzYWdlSm9iUmVzcG9uc2USVAoHc3VjY2VzcxgBIAEoCzJBLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JSZXNwb25zZS5SZXN1bHRIABI9CgdmYWlsdXJlGAIgASgOMiouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRmFpbHVyZU1lc3NhZ2VIABotCgZSZXN1bHQSIwobbm90aWZpY2F0aW9uX21lc3NhZ2Vfam9iX2lkGAEgASgJQggKBnJlc3VsdCLQAgoEVXNlchIcChRub3RpZmljYXRpb25fdXNlcl9pZBgBIAEoCRINCgVlbWFpbBgCIAEoCRIXCgpmaXJzdF9uYW1lGAMgASgJSACIAQESFgoJbGFzdF9uYW1lGAQgASgJSAGIAQESIwobbW9iaWxlX25vdGlmaWNhdGlvbl9lbmFibGVkGAUgASgIEiIKGmVtYWlsX25vdGlmaWNhdGlvbl9lbmFibGVkGAYgASgIEiAKGHNtc19ub3RpZmljYXRpb25fZW5hYmxlZBgHIAEoCBIuCgpjcmVhdGVkX2F0GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIdChBpc19hcHBfaW5zdGFsbGVkGAkgASgISAKIAQFCDQoLX2ZpcnN0X25hbWVCDAoKX2xhc3RfbmFtZUITChFfaXNfYXBwX2luc3RhbGxlZCI2Ch9SZWFkTm90aWZpY2F0aW9uUHJvZHVjdHNSZXF1ZXN0EhMKC3Byb2R1Y3RfaWRzGAEgAygJKlkKGU5vdGlmaWNhdGlvbk1lc3NhZ2VTdGF0dXMSCQoFRFJBRlQQABILCgdQTEFOTkVEEAESDwoLSU5fUFJPR1JFU1MQAhIICgRTRU5UEAMSCQoFRVJST1IQBCrOAQocTm90aWZpY2F0aW9uTWVzc2FnZUpvYlN0YXR1cxIoCiROT1RJRklDQVRJT05fTUVTU0FHRV9KT0JfU1RBVFVTX1RPRE8QABIvCitOT1RJRklDQVRJT05fTUVTU0FHRV9KT0JfU1RBVFVTX0lOX1BST0dSRVNTEAESKAokTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX1NUQVRVU19TRU5UEAISKQolTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX1NUQVRVU19FUlJPUhADKrcOCg5GYWlsdXJlTWVzc2FnZRIbChdGQUlMVVJFX01FU1NBR0VfVU5LTk9XThAAEiUKIUZBSUxVUkVfTUVTU0FHRV9QUk9KRUNUX05PVF9GT1VORBABEjIKLkZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fU0VUVElOR19OT1RfRk9VTkQQAhI2CjJGQUlMVVJFX01FU1NBR0VfQ1JFQVRFX05PVElGSUNBVElPTl9TRVRUSU5HX0ZBSUxFRBADEjYKMkZBSUxVUkVfTUVTU0FHRV9VUERBVEVfTk9USUZJQ0FUSU9OX1NFVFRJTkdfRkFJTEVEEAQSNgoyRkFJTFVSRV9NRVNTQUdFX0RFTEVURV9OT1RJRklDQVRJT05fU0VUVElOR19GQUlMRUQQBRIwCixGQUlMVVJFX01FU1NBR0VfTk9USUZJQ0FUSU9OX0dST1VQX05PVF9GT1VORBAGEjEKLUZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fR1JPVVBTX05PVF9GT1VORBAHEjQKMEZBSUxVUkVfTUVTU0FHRV9DUkVBVEVfTk9USUZJQ0FUSU9OX0dST1VQX0ZBSUxFRBAIEjQKMEZBSUxVUkVfTUVTU0FHRV9VUERBVEVfTk9USUZJQ0FUSU9OX0dST1VQX0ZBSUxFRBAJEjQKMEZBSUxVUkVfTUVTU0FHRV9ERUxFVEVfTk9USUZJQ0FUSU9OX0dST1VQX0ZBSUxFRBAKEi8KK0ZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fVVNFUl9OT1RfRk9VTkQQCxIwCixGQUlMVVJFX01FU1NBR0VfTk9USUZJQ0FUSU9OX1VTRVJTX05PVF9GT1VORBAMEjMKL0ZBSUxVUkVfTUVTU0FHRV9DUkVBVEVfTk9USUZJQ0FUSU9OX1VTRVJfRkFJTEVEEA0SMwovRkFJTFVSRV9NRVNTQUdFX1VQREFURV9OT1RJRklDQVRJT05fVVNFUl9GQUlMRUQQDhIzCi9GQUlMVVJFX01FU1NBR0VfREVMRVRFX05PVElGSUNBVElPTl9VU0VSX0ZBSUxFRBAPEjUKMUZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fR1JPVVBfVVNFUl9OT1RfRk9VTkQQEBI5CjVGQUlMVVJFX01FU1NBR0VfQ1JFQVRFX05PVElGSUNBVElPTl9HUk9VUF9VU0VSX0ZBSUxFRBAREjkKNUZBSUxVUkVfTUVTU0FHRV9VUERBVEVfTk9USUZJQ0FUSU9OX0dST1VQX1VTRVJfRkFJTEVEEBISOQo1RkFJTFVSRV9NRVNTQUdFX0RFTEVURV9OT1RJRklDQVRJT05fR1JPVVBfVVNFUl9GQUlMRUQQExIyCi5GQUlMVVJFX01FU1NBR0VfTk9USUZJQ0FUSU9OX01FU1NBR0VfTk9UX0ZPVU5EEBQSMwovRkFJTFVSRV9NRVNTQUdFX05PVElGSUNBVElPTl9NRVNTQUdFU19OT1RfRk9VTkQQFRI2CjJGQUlMVVJFX01FU1NBR0VfQ1JFQVRFX05PVElGSUNBVElPTl9NRVNTQUdFX0ZBSUxFRBAWEjYKMkZBSUxVUkVfTUVTU0FHRV9VUERBVEVfTk9USUZJQ0FUSU9OX01FU1NBR0VfRkFJTEVEEBcSNgoyRkFJTFVSRV9NRVNTQUdFX0RFTEVURV9OT1RJRklDQVRJT05fTUVTU0FHRV9GQUlMRUQQGBI2CjJGQUlMVVJFX01FU1NBR0VfTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX05PVF9GT1VORBAZEjcKM0ZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fTUVTU0FHRV9KT0JTX05PVF9GT1VORBAaEjoKNkZBSUxVUkVfTUVTU0FHRV9DUkVBVEVfTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX0ZBSUxFRBAbEjoKNkZBSUxVUkVfTUVTU0FHRV9VUERBVEVfTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX0ZBSUxFRBAcEjoKNkZBSUxVUkVfTUVTU0FHRV9ERUxFVEVfTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX0ZBSUxFRBAdEjYKMkZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fU0VUVElOR19BTFJFQURZX0VYSVNUEB4SOwo3RkFJTFVSRV9NRVNTQUdFX05PVElGSUNBVElPTl9TRVRUSU5HX1NMVUdfQUxSRUFEWV9UQUtFThAfEjMKL0ZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fVVNFUl9BTFJFQURZX0VYSVNUECASNAowRkFJTFVSRV9NRVNTQUdFX05PVElGSUNBVElPTl9HUk9VUF9BTFJFQURZX0VYSVNUECEyuyIKFE5vdGlmaWNhdGlvbnNTZXJ2aWNlEpIBChlDcmVhdGVOb3RpZmljYXRpb25TZXR0aW5nEjwuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuQ3JlYXRlTm90aWZpY2F0aW9uU2V0dGluZ1JlcXVlc3QaNy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25TZXR0aW5nUmVzcG9uc2USkgEKF1JlYWROb3RpZmljYXRpb25TZXR0aW5nEjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvblNldHRpbmdSZXF1ZXN0GjsuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvblNldHRpbmdSZXNwb25zZRKSAQoZVXBkYXRlTm90aWZpY2F0aW9uU2V0dGluZxI8LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZU5vdGlmaWNhdGlvblNldHRpbmdSZXF1ZXN0GjcuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uU2V0dGluZ1Jlc3BvbnNlEpIBChlEZWxldGVOb3RpZmljYXRpb25TZXR0aW5nEjwuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRGVsZXRlTm90aWZpY2F0aW9uU2V0dGluZ1JlcXVlc3QaNy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25TZXR0aW5nUmVzcG9uc2USjAEKF0NyZWF0ZU5vdGlmaWNhdGlvbkdyb3VwEjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuQ3JlYXRlTm90aWZpY2F0aW9uR3JvdXBSZXF1ZXN0GjUuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uR3JvdXBSZXNwb25zZRKPAQoWUmVhZE5vdGlmaWNhdGlvbkdyb3VwcxI5LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25Hcm91cHNSZXF1ZXN0GjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbkdyb3Vwc1Jlc3BvbnNlEowBChdVcGRhdGVOb3RpZmljYXRpb25Hcm91cBI6LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZU5vdGlmaWNhdGlvbkdyb3VwUmVxdWVzdBo1LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbkdyb3VwUmVzcG9uc2USjAEKF0RlbGV0ZU5vdGlmaWNhdGlvbkdyb3VwEjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRGVsZXRlTm90aWZpY2F0aW9uR3JvdXBSZXF1ZXN0GjUuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uR3JvdXBSZXNwb25zZRKJAQoWQ3JlYXRlTm90aWZpY2F0aW9uVXNlchI5LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkNyZWF0ZU5vdGlmaWNhdGlvblVzZXJSZXF1ZXN0GjQuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uVXNlclJlc3BvbnNlEowBChVSZWFkTm90aWZpY2F0aW9uVXNlcnMSOC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uVXNlcnNSZXF1ZXN0GjkuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvblVzZXJzUmVzcG9uc2USiQEKFlVwZGF0ZU5vdGlmaWNhdGlvblVzZXISOS5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5VcGRhdGVOb3RpZmljYXRpb25Vc2VyUmVxdWVzdBo0LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvblVzZXJSZXNwb25zZRKJAQoWRGVsZXRlTm90aWZpY2F0aW9uVXNlchI5LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkRlbGV0ZU5vdGlmaWNhdGlvblVzZXJSZXF1ZXN0GjQuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uVXNlclJlc3BvbnNlEpgBChtDcmVhdGVOb3RpZmljYXRpb25Hcm91cFVzZXISPi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5DcmVhdGVOb3RpZmljYXRpb25Hcm91cFVzZXJSZXF1ZXN0GjkuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uR3JvdXBVc2VyUmVzcG9uc2USnAEKGlJlYWROb3RpZmljYXRpb25Hcm91cFVzZXJzEj4uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbkdyb3VwVXNlcnNSZXF1ZXN0cxo+LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25Hcm91cFVzZXJzUmVzcG9uc2USmAEKG1VwZGF0ZU5vdGlmaWNhdGlvbkdyb3VwVXNlchI+LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZU5vdGlmaWNhdGlvbkdyb3VwVXNlclJlcXVlc3QaOS5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25Hcm91cFVzZXJSZXNwb25zZRKYAQobRGVsZXRlTm90aWZpY2F0aW9uR3JvdXBVc2VyEj4uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRGVsZXRlTm90aWZpY2F0aW9uR3JvdXBVc2VyUmVxdWVzdBo5LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbkdyb3VwVXNlclJlc3BvbnNlEpIBChlDcmVhdGVOb3RpZmljYXRpb25NZXNzYWdlEjwuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuQ3JlYXRlTm90aWZpY2F0aW9uTWVzc2FnZVJlcXVlc3QaNy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlUmVzcG9uc2USlQEKGFJlYWROb3RpZmljYXRpb25NZXNzYWdlcxI7LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25NZXNzYWdlc1JlcXVlc3QaPC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uTWVzc2FnZXNSZXNwb25zZRKeAQobR2V0U2VudE5vdGlmaWNhdGlvbk1lc3NhZ2VzEj4uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0U2VudE5vdGlmaWNhdGlvbk1lc3NhZ2VzUmVxdWVzdBo/LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkdldFNlbnROb3RpZmljYXRpb25NZXNzYWdlc1Jlc3BvbnNlEpIBChlVcGRhdGVOb3RpZmljYXRpb25NZXNzYWdlEjwuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuVXBkYXRlTm90aWZpY2F0aW9uTWVzc2FnZVJlcXVlc3QaNy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlUmVzcG9uc2USkgEKGURlbGV0ZU5vdGlmaWNhdGlvbk1lc3NhZ2USPC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5EZWxldGVOb3RpZmljYXRpb25NZXNzYWdlUmVxdWVzdBo3LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbk1lc3NhZ2VSZXNwb25zZRKbAQocQ3JlYXRlTm90aWZpY2F0aW9uTWVzc2FnZUpvYhI/LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkNyZWF0ZU5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JSZXF1ZXN0GjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uTWVzc2FnZUpvYlJlc3BvbnNlEp4BChtSZWFkTm90aWZpY2F0aW9uTWVzc2FnZUpvYnMSPi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uTWVzc2FnZUpvYnNSZXF1ZXN0Gj8uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JzUmVzcG9uc2USmwEKHFVwZGF0ZU5vdGlmaWNhdGlvbk1lc3NhZ2VKb2ISPy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5VcGRhdGVOb3RpZmljYXRpb25NZXNzYWdlSm9iUmVxdWVzdBo6LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JSZXNwb25zZRKbAQocRGVsZXRlTm90aWZpY2F0aW9uTWVzc2FnZUpvYhI/LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkRlbGV0ZU5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JSZXF1ZXN0GjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uTWVzc2FnZUpvYlJlc3BvbnNlEoUBChhSZWFkTm90aWZpY2F0aW9uUHJvZHVjdHMSOy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uUHJvZHVjdHNSZXF1ZXN0GiwuZGFzaGJvYXJkLnByb2R1Y3QudjEuU2VhcmNoUHJvZHVjdHNSZXNwb25zZRKeAQobR2V0Tm90aWZpY2F0aW9uVXNlclNldHRpbmdzEj4uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0Tm90aWZpY2F0aW9uVXNlclNldHRpbmdzUmVxdWVzdBo/LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkdldE5vdGlmaWNhdGlvblVzZXJTZXR0aW5nc1Jlc3BvbnNlEnoKD1ZlcmlmeVVzZXJFbWFpbBIyLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlZlcmlmeVVzZXJFbWFpbFJlcXVlc3QaMy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5WZXJpZnlVc2VyRW1haWxSZXNwb25zZRJ0Cg1HZXRVc2VyR3JvdXBzEjAuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0VXNlckdyb3Vwc1JlcXVlc3QaMS5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5HZXRVc2VyR3JvdXBzUmVzcG9uc2USXwoQVXBkYXRlVXNlckdyb3VwcxIzLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZVVzZXJHcm91cHNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5YgZwcm90bzM", [file_google_protobuf_timestamp5, file_google_protobuf_empty4, file_dashboard_v1_product, file_common_v1_push_notifications]);
2244
+ var FailureMessage = /* @__PURE__ */ ((FailureMessage2) => {
2245
+ FailureMessage2[FailureMessage2["UNKNOWN"] = 0] = "UNKNOWN";
2246
+ FailureMessage2[FailureMessage2["PROJECT_NOT_FOUND"] = 1] = "PROJECT_NOT_FOUND";
2247
+ FailureMessage2[FailureMessage2["NOTIFICATION_SETTING_NOT_FOUND"] = 2] = "NOTIFICATION_SETTING_NOT_FOUND";
2248
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_SETTING_FAILED"] = 3] = "CREATE_NOTIFICATION_SETTING_FAILED";
2249
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_SETTING_FAILED"] = 4] = "UPDATE_NOTIFICATION_SETTING_FAILED";
2250
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_SETTING_FAILED"] = 5] = "DELETE_NOTIFICATION_SETTING_FAILED";
2251
+ FailureMessage2[FailureMessage2["NOTIFICATION_GROUP_NOT_FOUND"] = 6] = "NOTIFICATION_GROUP_NOT_FOUND";
2252
+ FailureMessage2[FailureMessage2["NOTIFICATION_GROUPS_NOT_FOUND"] = 7] = "NOTIFICATION_GROUPS_NOT_FOUND";
2253
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_GROUP_FAILED"] = 8] = "CREATE_NOTIFICATION_GROUP_FAILED";
2254
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_GROUP_FAILED"] = 9] = "UPDATE_NOTIFICATION_GROUP_FAILED";
2255
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_GROUP_FAILED"] = 10] = "DELETE_NOTIFICATION_GROUP_FAILED";
2256
+ FailureMessage2[FailureMessage2["NOTIFICATION_USER_NOT_FOUND"] = 11] = "NOTIFICATION_USER_NOT_FOUND";
2257
+ FailureMessage2[FailureMessage2["NOTIFICATION_USERS_NOT_FOUND"] = 12] = "NOTIFICATION_USERS_NOT_FOUND";
2258
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_USER_FAILED"] = 13] = "CREATE_NOTIFICATION_USER_FAILED";
2259
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_USER_FAILED"] = 14] = "UPDATE_NOTIFICATION_USER_FAILED";
2260
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_USER_FAILED"] = 15] = "DELETE_NOTIFICATION_USER_FAILED";
2261
+ FailureMessage2[FailureMessage2["NOTIFICATION_GROUP_USER_NOT_FOUND"] = 16] = "NOTIFICATION_GROUP_USER_NOT_FOUND";
2262
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_GROUP_USER_FAILED"] = 17] = "CREATE_NOTIFICATION_GROUP_USER_FAILED";
2263
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_GROUP_USER_FAILED"] = 18] = "UPDATE_NOTIFICATION_GROUP_USER_FAILED";
2264
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_GROUP_USER_FAILED"] = 19] = "DELETE_NOTIFICATION_GROUP_USER_FAILED";
2265
+ FailureMessage2[FailureMessage2["NOTIFICATION_MESSAGE_NOT_FOUND"] = 20] = "NOTIFICATION_MESSAGE_NOT_FOUND";
2266
+ FailureMessage2[FailureMessage2["NOTIFICATION_MESSAGES_NOT_FOUND"] = 21] = "NOTIFICATION_MESSAGES_NOT_FOUND";
2267
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_MESSAGE_FAILED"] = 22] = "CREATE_NOTIFICATION_MESSAGE_FAILED";
2268
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_MESSAGE_FAILED"] = 23] = "UPDATE_NOTIFICATION_MESSAGE_FAILED";
2269
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_MESSAGE_FAILED"] = 24] = "DELETE_NOTIFICATION_MESSAGE_FAILED";
2270
+ FailureMessage2[FailureMessage2["NOTIFICATION_MESSAGE_JOB_NOT_FOUND"] = 25] = "NOTIFICATION_MESSAGE_JOB_NOT_FOUND";
2271
+ FailureMessage2[FailureMessage2["NOTIFICATION_MESSAGE_JOBS_NOT_FOUND"] = 26] = "NOTIFICATION_MESSAGE_JOBS_NOT_FOUND";
2272
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_MESSAGE_JOB_FAILED"] = 27] = "CREATE_NOTIFICATION_MESSAGE_JOB_FAILED";
2273
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_MESSAGE_JOB_FAILED"] = 28] = "UPDATE_NOTIFICATION_MESSAGE_JOB_FAILED";
2274
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_MESSAGE_JOB_FAILED"] = 29] = "DELETE_NOTIFICATION_MESSAGE_JOB_FAILED";
2275
+ FailureMessage2[FailureMessage2["NOTIFICATION_SETTING_ALREADY_EXIST"] = 30] = "NOTIFICATION_SETTING_ALREADY_EXIST";
2276
+ FailureMessage2[FailureMessage2["NOTIFICATION_SETTING_SLUG_ALREADY_TAKEN"] = 31] = "NOTIFICATION_SETTING_SLUG_ALREADY_TAKEN";
2277
+ FailureMessage2[FailureMessage2["NOTIFICATION_USER_ALREADY_EXIST"] = 32] = "NOTIFICATION_USER_ALREADY_EXIST";
2278
+ FailureMessage2[FailureMessage2["NOTIFICATION_GROUP_ALREADY_EXIST"] = 33] = "NOTIFICATION_GROUP_ALREADY_EXIST";
2279
+ return FailureMessage2;
2280
+ })(FailureMessage || {});
2281
+ var NotificationsService = /* @__PURE__ */ serviceDesc4(file_dashboard_v1_notifications, 0);
2282
+
2283
+ // src/gen/proto/dashboard/v1/notifications-NotificationsService_connectquery.ts
2284
+ var createNotificationSetting = NotificationsService.method.createNotificationSetting;
2285
+ var readNotificationSetting = NotificationsService.method.readNotificationSetting;
2286
+ var updateNotificationSetting = NotificationsService.method.updateNotificationSetting;
2287
+ var deleteNotificationSetting = NotificationsService.method.deleteNotificationSetting;
2288
+ var createNotificationGroup = NotificationsService.method.createNotificationGroup;
2289
+ var readNotificationGroups = NotificationsService.method.readNotificationGroups;
2290
+ var updateNotificationGroup = NotificationsService.method.updateNotificationGroup;
2291
+ var deleteNotificationGroup = NotificationsService.method.deleteNotificationGroup;
2292
+ var createNotificationUser = NotificationsService.method.createNotificationUser;
2293
+ var readNotificationUsers = NotificationsService.method.readNotificationUsers;
2294
+ var updateNotificationUser = NotificationsService.method.updateNotificationUser;
2295
+ var deleteNotificationUser = NotificationsService.method.deleteNotificationUser;
2296
+ var createNotificationGroupUser = NotificationsService.method.createNotificationGroupUser;
2297
+ var readNotificationGroupUsers = NotificationsService.method.readNotificationGroupUsers;
2298
+ var updateNotificationGroupUser = NotificationsService.method.updateNotificationGroupUser;
2299
+ var deleteNotificationGroupUser = NotificationsService.method.deleteNotificationGroupUser;
2300
+ var createNotificationMessage = NotificationsService.method.createNotificationMessage;
2301
+ var readNotificationMessages = NotificationsService.method.readNotificationMessages;
2302
+ var getSentNotificationMessages = NotificationsService.method.getSentNotificationMessages;
2303
+ var updateNotificationMessage = NotificationsService.method.updateNotificationMessage;
2304
+ var deleteNotificationMessage = NotificationsService.method.deleteNotificationMessage;
2305
+ var createNotificationMessageJob = NotificationsService.method.createNotificationMessageJob;
2306
+ var readNotificationMessageJobs = NotificationsService.method.readNotificationMessageJobs;
2307
+ var updateNotificationMessageJob = NotificationsService.method.updateNotificationMessageJob;
2308
+ var deleteNotificationMessageJob = NotificationsService.method.deleteNotificationMessageJob;
2309
+ var readNotificationProducts = NotificationsService.method.readNotificationProducts;
2310
+ var getNotificationUserSettings = NotificationsService.method.getNotificationUserSettings;
2311
+ var verifyUserEmail = NotificationsService.method.verifyUserEmail;
2312
+ var getUserGroups = NotificationsService.method.getUserGroups;
2313
+ var updateUserGroups = NotificationsService.method.updateUserGroups;
2314
+
2315
+ // src/rpc-provider.tsx
2316
+ import { jsx as jsx11 } from "react/jsx-runtime";
2317
+ console.log("HOST", HOST);
2318
+ var currentFinalTransportHost;
2319
+ var finalTransport;
2320
+ BigInt.prototype.toJSON = function() {
2321
+ return this.toString();
2322
+ };
2323
+ var rpcProvider = {
2324
+ publicApi: public_api_PublicApiService_connectquery_exports,
2325
+ notifications: notifications_NotificationsService_connectquery_exports
2326
+ };
2327
+ var useQuery4 = uq;
2328
+ var useMutation3 = um;
2329
+ var RpcProvider = ({ children }) => {
2330
+ if (finalTransport == null || currentFinalTransportHost !== HOST) {
2331
+ currentFinalTransportHost = HOST;
2332
+ finalTransport = createConnectTransport2({
2333
+ baseUrl: HOST + "/api/rpc",
2334
+ useBinaryFormat: true,
2335
+ // @ts-ignore
2336
+ fetch: async (input, init) => {
2337
+ return fetch(input, {
2338
+ ...init,
2339
+ keepalive: false,
2340
+ credentials: "include"
2341
+ });
2342
+ }
2343
+ });
2344
+ }
2345
+ const [queryClient] = useState3(
2346
+ () => new QueryClient2({
2347
+ defaultOptions: { queries: { staleTime: 5e3 } }
2348
+ })
2349
+ );
2350
+ return /* @__PURE__ */ jsx11(TransportProvider, { transport: finalTransport, children: /* @__PURE__ */ jsx11(QueryClientProvider2, { client: queryClient, children }) });
2351
+ };
2352
+
2353
+ // src/components/notifications/NotificationsComponentPublic.tsx
2354
+ import { useQuery as UQ } from "@tanstack/react-query";
2355
+ import { Settings } from "lucide-react";
2356
+
2357
+ // src/components/notifications/constants.tsx
2358
+ import { Fragment as Fragment7, jsx as jsx12, jsxs as jsxs7 } from "react/jsx-runtime";
2359
+ var DEFAULT_TEXTS = {
2360
+ title: null,
2361
+ description: null,
2362
+ managingDescription: "Zarz\u0105dzaj rodzajami powiadomie\u0144 i sposobem dostarczania.",
2363
+ formTitle: "Podaj Email aby zapisa\u0107 si\u0119\xA0do powiadomie\u0144",
2364
+ formEmailLabel: "Email",
2365
+ formPhoneLabel: "Numer telefonu",
2366
+ formPhoneOptional: "(opcjonalnie)",
2367
+ formEmailPlaceholder: "np. mail@gmail...",
2368
+ formPhonePlaceholder: "np. 663...",
2369
+ formSubmitButton: "Zapisz si\u0119",
2370
+ formSuccessMessage: "Zapisa\u0142e\u015B si\u0119 do powiadomie\u0144.",
2371
+ agreementText: /* @__PURE__ */ jsxs7(Fragment7, { children: [
2372
+ /* @__PURE__ */ jsx12("span", { style: { color: "red" }, children: "*" }),
2373
+ "Wyra\u017Cam zgod\u0119 na przetwarzanie moich danych w celach marketingowych zgodnie z",
2374
+ " ",
2375
+ /* @__PURE__ */ jsx12(
2376
+ "a",
2377
+ {
2378
+ href: "/regulations/polityka-prywatnosci",
2379
+ target: "_blank",
2380
+ className: "cursor-alias font-bold hover:font-medium",
2381
+ children: "regulaminem"
2382
+ }
2383
+ ),
2384
+ " ",
2385
+ /* @__PURE__ */ jsx12("span", { className: "text-xs font-light", children: "(zgod\u0119 mo\u017Cna w ka\u017Cdej chwili wycofa\u0107)" })
2386
+ ] }),
2387
+ qrCodeTitle: "lub zainstaluj aplikacj\u0119 mobiln\u0105",
2388
+ qrCodeSubtitle: "Aplikacja mobilna",
2389
+ qrCodeScanText: "zeskanuj kod QR",
2390
+ groupsNoSelectionWarning: "Je\u015Bli \u017Cadna z grup nie jest zaznaczona, nie otrzymasz \u017Cadnych powiadomie\u0144.",
2391
+ groupsSelectAllButton: "Zaznacz wszystkie",
2392
+ groupsUpdateButton: "Aktualizuj",
2393
+ groupsUpdateSuccess: "Zaktualizowano pomy\u015Blnie.",
2394
+ groupsTitle: "Zarz\u0105dzaj grupami z kt\xF3rych chcesz otrzymywa\u0107 powiadomienia",
2395
+ manageDataTitle: "Ustawienia powiadomie\u0144",
2396
+ manageDataDescription: "W jaki spos\xF3b chcesz otrzymywa\u0107 powiadomienia?",
2397
+ manageDataUnsubscribeButton: "Odsubskrybuj",
2398
+ manageDataUpdatedMessage: "Zaktualizowano",
2399
+ manageDataUnsubscribeDescription: "Wypisz mnie z wszystkich powiadomie\u0144 i grup.",
2400
+ loginEmailLabel: "Email",
2401
+ loginEmailPlaceholder: "Wprowad\u017A sw\xF3j email",
2402
+ loginSendCodeButton: "Wy\u015Blij kod weryfikacyjny",
2403
+ loginSendingButton: "Wysy\u0142anie...",
2404
+ loginCodeLabel: "Wprowad\u017A kod weryfikacyjny",
2405
+ loginCodeSentMessage: "Wys\u0142ali\u015Bmy kod weryfikacyjny na adres",
2406
+ loginChangeEmailButton: "Popraw email",
2407
+ loginResendCodeButton: "Wy\u015Blij kod ponownie",
2408
+ loginInvalidEmailError: "Wprowad\u017A prawid\u0142owy adres email",
2409
+ loginSlugRequiredError: "Wymagany jest identyfikator projektu",
2410
+ loginInvalidCodeError: "Nieprawid\u0142owy kod weryfikacyjny",
2411
+ loginVerificationFailedError: "Weryfikacja nie powiod\u0142a si\u0119. Sprawd\u017A sw\xF3j kod.",
2412
+ loginSendEmailError: "Nie uda\u0142o si\u0119 wys\u0142a\u0107 kodu weryfikacyjnego",
2413
+ loginVerifyCodeError: "Nie uda\u0142o si\u0119 zweryfikowa\u0107 kodu",
2414
+ loginResendEmailError: "Nie uda\u0142o si\u0119 ponownie wys\u0142a\u0107 kodu weryfikacyjnego",
2415
+ loginTitle: "Wpisz email aby zarz\u0105dza\u0107 powiadomieniami",
2416
+ loginDescription: "Dostaniesz kod weryfikacyjny na email.",
2417
+ loginIHaveCode: "Mam ju\u017C kod"
2418
+ };
2419
+
2420
+ // src/ui/button.tsx
2421
+ import { Slot } from "@radix-ui/react-slot";
2422
+ import { cva } from "class-variance-authority";
2423
+ import { jsx as jsx13 } from "react/jsx-runtime";
2424
+ var buttonVariants = cva(
2425
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
2426
+ {
2427
+ variants: {
2428
+ variant: {
2429
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
2430
+ destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
2431
+ outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
2432
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
2433
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
2434
+ link: "text-primary underline-offset-4 hover:underline"
2435
+ },
2436
+ size: {
2437
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
2438
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
2439
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
2440
+ icon: "size-9",
2441
+ "icon-sm": "size-8",
2442
+ "icon-lg": "size-10"
2443
+ }
2444
+ },
2445
+ defaultVariants: {
2446
+ variant: "default",
2447
+ size: "default"
2448
+ }
2449
+ }
2450
+ );
2451
+ function Button({
2452
+ className,
2453
+ variant,
2454
+ size,
2455
+ asChild = false,
2456
+ ...props
2457
+ }) {
2458
+ const Comp = asChild ? Slot : "button";
2459
+ return /* @__PURE__ */ jsx13(
2460
+ Comp,
2461
+ {
2462
+ "data-slot": "button",
2463
+ className: cn(buttonVariants({ variant, size, className })),
2464
+ ...props
2465
+ }
2466
+ );
2467
+ }
2468
+
2469
+ // src/components/notifications/NotificationHeader.tsx
2470
+ import { LogOutIcon } from "lucide-react";
2471
+ import { Fragment as Fragment8, jsx as jsx14, jsxs as jsxs8 } from "react/jsx-runtime";
2472
+ function NotificationHeader({
2473
+ projectName,
2474
+ projectLogo,
2475
+ projectLogoDark,
2476
+ description,
2477
+ className,
2478
+ onLogout
2479
+ }) {
2480
+ return /* @__PURE__ */ jsxs8(Fragment8, { children: [
2481
+ projectLogo != null || projectName != null && /* @__PURE__ */ jsxs8(
2482
+ "h2",
2483
+ {
2484
+ className: cn(
2485
+ "flex max-w-44 items-center gap-3 text-lg font-medium text-black sm:max-w-none md:text-xl lg:text-2xl xl:text-3xl dark:text-neutral-100",
2486
+ className == null ? void 0 : className.headerTitle
2487
+ ),
2488
+ children: [
2489
+ projectLogo != null && /* @__PURE__ */ jsxs8(Fragment8, { children: [
2490
+ /* @__PURE__ */ jsx14(
2491
+ "img",
2492
+ {
2493
+ src: projectLogo,
2494
+ alt: "",
2495
+ className: cn(
2496
+ "h-12 w-auto dark:hidden",
2497
+ className == null ? void 0 : className.headerLogo
2498
+ )
2499
+ }
2500
+ ),
2501
+ /* @__PURE__ */ jsx14(
2502
+ "img",
2503
+ {
2504
+ src: projectLogoDark != null ? projectLogoDark : projectLogo,
2505
+ alt: "",
2506
+ className: cn(
2507
+ "hidden h-12 w-auto dark:inline",
2508
+ className == null ? void 0 : className.headerLogo
2509
+ )
2510
+ }
2511
+ )
2512
+ ] }),
2513
+ /* @__PURE__ */ jsx14("span", { children: projectName })
2514
+ ]
2515
+ }
2516
+ ),
2517
+ /* @__PURE__ */ jsxs8("div", { className: "flex items-center gap-2", children: [
2518
+ description && /* @__PURE__ */ jsx14(
2519
+ "p",
2520
+ {
2521
+ className: cn(
2522
+ "mt-4 font-medium text-left",
2523
+ className == null ? void 0 : className.headerDescription
2524
+ ),
2525
+ children: description
2526
+ }
2527
+ ),
2528
+ /* @__PURE__ */ jsx14("div", { className: "grow" }),
2529
+ onLogout && /* @__PURE__ */ jsx14(Button, { variant: "ghost", size: "icon-sm", onClick: onLogout, children: /* @__PURE__ */ jsx14(LogOutIcon, { className: "h-5 w-5" }) })
2530
+ ] })
2531
+ ] });
2532
+ }
2533
+
2534
+ // src/ui/switch.tsx
2535
+ import * as SwitchPrimitive from "@radix-ui/react-switch";
2536
+ import { jsx as jsx15 } from "react/jsx-runtime";
2537
+ function Switch({
2538
+ className,
2539
+ ...props
2540
+ }) {
2541
+ return /* @__PURE__ */ jsx15(
2542
+ SwitchPrimitive.Root,
2543
+ {
2544
+ "data-slot": "switch",
2545
+ className: cn(
2546
+ "peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
2547
+ className
2548
+ ),
2549
+ ...props,
2550
+ children: /* @__PURE__ */ jsx15(
2551
+ SwitchPrimitive.Thumb,
2552
+ {
2553
+ "data-slot": "switch-thumb",
2554
+ className: cn(
2555
+ "bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0"
2556
+ )
2557
+ }
2558
+ )
2559
+ }
2560
+ );
2561
+ }
2562
+
2563
+ // src/components/notifications/NotificationGroupsList.tsx
2564
+ import { useAutoAnimate as useAutoAnimate3 } from "@formkit/auto-animate/react";
2565
+ import { CheckCircleIcon, TriangleAlertIcon } from "lucide-react";
2566
+
2567
+ // src/ui/popover.tsx
2568
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
2569
+ import { jsx as jsx16 } from "react/jsx-runtime";
2570
+ function Popover({
2571
+ ...props
2572
+ }) {
2573
+ return /* @__PURE__ */ jsx16(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
2574
+ }
2575
+ function PopoverTrigger({
2576
+ ...props
2577
+ }) {
2578
+ return /* @__PURE__ */ jsx16(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
2579
+ }
2580
+ function PopoverContent({
2581
+ className,
2582
+ align = "center",
2583
+ sideOffset = 4,
2584
+ ...props
2585
+ }) {
2586
+ return /* @__PURE__ */ jsx16(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx16(
2587
+ PopoverPrimitive.Content,
2588
+ {
2589
+ "data-slot": "popover-content",
2590
+ align,
2591
+ sideOffset,
2592
+ className: cn(
2593
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden",
2594
+ className
2595
+ ),
2596
+ ...props
2597
+ }
2598
+ ) });
2599
+ }
2600
+
2601
+ // src/components/notifications/HowOftenComponent.tsx
2602
+ import { ClockIcon } from "lucide-react";
2603
+ import { jsx as jsx17, jsxs as jsxs9 } from "react/jsx-runtime";
2604
+ function HowOftenComponent({ regularity }) {
2605
+ let text = "";
2606
+ switch (regularity) {
2607
+ case "rarely":
2608
+ text = "rzadko";
2609
+ break;
2610
+ case "often":
2611
+ text = "cz\u0119sto";
2612
+ break;
2613
+ case "very_often":
2614
+ text = "codzienne";
2615
+ break;
2616
+ }
2617
+ return /* @__PURE__ */ jsxs9(Popover, { children: [
2618
+ /* @__PURE__ */ jsx17(
2619
+ PopoverTrigger,
2620
+ {
2621
+ onClick: (e) => {
2622
+ e.stopPropagation();
2623
+ },
2624
+ children: /* @__PURE__ */ jsxs9(
2625
+ "button",
2626
+ {
2627
+ type: "button",
2628
+ className: "flex w-[30%] cursor-help flex-col items-center justify-center text-xs md:w-[25%] xl:w-[20%]",
2629
+ children: [
2630
+ /* @__PURE__ */ jsx17(ClockIcon, { size: 12 }),
2631
+ /* @__PURE__ */ jsx17("span", { children: text })
2632
+ ]
2633
+ }
2634
+ )
2635
+ }
2636
+ ),
2637
+ /* @__PURE__ */ jsx17(PopoverContent, { className: "w-80", children: /* @__PURE__ */ jsxs9("div", { className: "grid gap-4", children: [
2638
+ /* @__PURE__ */ jsxs9("div", { className: "space-y-2", children: [
2639
+ /* @__PURE__ */ jsx17("h4", { className: "leading-none font-medium", children: "Co to oznacza?" }),
2640
+ /* @__PURE__ */ jsxs9("ul", { className: "list-inside list-disc text-sm", children: [
2641
+ /* @__PURE__ */ jsxs9("li", { children: [
2642
+ /* @__PURE__ */ jsx17("span", { className: "font-semibold", children: "Rzadko" }),
2643
+ " \u2013 powiadomienia b\u0119d\u0105 wysy\u0142ane maksymalnie kilka razy w miesi\u0105cu."
2644
+ ] }),
2645
+ /* @__PURE__ */ jsxs9("li", { children: [
2646
+ /* @__PURE__ */ jsx17("span", { className: "font-semibold", children: "Cz\u0119sto" }),
2647
+ " \u2013 powiadomienia mog\u0119 by\u0107 wysy\u0142ane kilka razy w tygodniu."
2648
+ ] }),
2649
+ /* @__PURE__ */ jsxs9("li", { children: [
2650
+ /* @__PURE__ */ jsx17("span", { className: "font-semibold", children: "Codzienne" }),
2651
+ " \u2013 powiadomienia b\u0119d\u0105 wysy\u0142ane nawet codziennie."
2652
+ ] })
2653
+ ] })
2654
+ ] }),
2655
+ /* @__PURE__ */ jsx17("div", { className: "grid gap-2" })
2656
+ ] }) })
2657
+ ] });
2658
+ }
2659
+
2660
+ // src/ui/card.tsx
2661
+ import { jsx as jsx18 } from "react/jsx-runtime";
2662
+ function Card({ className, ...props }) {
2663
+ return /* @__PURE__ */ jsx18(
2664
+ "div",
2665
+ {
2666
+ "data-slot": "card",
2667
+ className: cn(
2668
+ "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
2669
+ className
2670
+ ),
2671
+ ...props
2672
+ }
2673
+ );
2674
+ }
2675
+ function CardHeader({ className, ...props }) {
2676
+ return /* @__PURE__ */ jsx18(
2677
+ "div",
2678
+ {
2679
+ "data-slot": "card-header",
2680
+ className: cn(
2681
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
2682
+ className
2683
+ ),
2684
+ ...props
2685
+ }
2686
+ );
2687
+ }
2688
+ function CardTitle({ className, ...props }) {
2689
+ return /* @__PURE__ */ jsx18(
2690
+ "div",
2691
+ {
2692
+ "data-slot": "card-title",
2693
+ className: cn("leading-none font-semibold", className),
2694
+ ...props
2695
+ }
2696
+ );
2697
+ }
2698
+ function CardDescription({ className, ...props }) {
2699
+ return /* @__PURE__ */ jsx18(
2700
+ "div",
2701
+ {
2702
+ "data-slot": "card-description",
2703
+ className: cn("text-muted-foreground text-sm", className),
2704
+ ...props
2705
+ }
2706
+ );
2707
+ }
2708
+ function CardContent({ className, ...props }) {
2709
+ return /* @__PURE__ */ jsx18(
2710
+ "div",
2711
+ {
2712
+ "data-slot": "card-content",
2713
+ className: cn("px-6", className),
2714
+ ...props
2715
+ }
2716
+ );
2717
+ }
2718
+
2719
+ // src/components/notifications/NotificationGroupsList.tsx
2720
+ import { Fragment as Fragment9, jsx as jsx19, jsxs as jsxs10 } from "react/jsx-runtime";
2721
+ function NotificationGroupsList({
2722
+ groups = [],
2723
+ isManaging,
2724
+ onToggle,
2725
+ onCheckAll,
2726
+ onUpdate,
2727
+ isUpdating,
2728
+ wasChanged,
2729
+ isUserGroupsUpdated,
2730
+ className,
2731
+ texts
2732
+ }) {
2733
+ var _a, _b, _c, _d, _e;
2734
+ const [groupsParent] = useAutoAnimate3();
2735
+ const [updateGroupsParent] = useAutoAnimate3();
2736
+ const hasNoSelection = groups.filter((group) => group.isOn === false).length > 0;
2737
+ const hasUnchecked = groups.filter((group) => group.isOn === false).length > 0;
2738
+ if (groups.length <= 1 && isManaging != true) {
2739
+ return null;
2740
+ }
2741
+ const content = /* @__PURE__ */ jsxs10(
2742
+ "div",
2743
+ {
2744
+ ref: groupsParent,
2745
+ className: cn("my-5 flex flex-col gap-3", className == null ? void 0 : className.groupsList),
2746
+ children: [
2747
+ groups.map((group) => /* @__PURE__ */ jsxs10(
2748
+ "div",
2749
+ {
2750
+ id: group.id,
2751
+ role: "button",
2752
+ className: cn(
2753
+ group.isOn ? "bg-neutral-50 hover:bg-transparent shadow-sm border-transparent dark:bg-neutral-800" : "border-neutral-200 hover:bg-neutral-50 dark:hover:border-neutral-800 shadow-sm dark:border-neutral-800",
2754
+ "active:bg-beige-300 flex w-full cursor-pointer items-center gap-3 rounded-xl border px-3 py-2 transition active:dark:bg-neutral-900",
2755
+ className == null ? void 0 : className.groupItem
2756
+ ),
2757
+ onClick: (e) => {
2758
+ if (e.target instanceof HTMLButtonElement) {
2759
+ return;
2760
+ }
2761
+ onToggle(group.id);
2762
+ },
2763
+ children: [
2764
+ /* @__PURE__ */ jsx19(
2765
+ Switch,
2766
+ {
2767
+ checked: group.isOn,
2768
+ className: "data-[state=checked]:bg-blue-500 dark:data-[state=unchecked]:bg-neutral-700",
2769
+ onCheckedChange: () => {
2770
+ onToggle(group.id);
2771
+ }
2772
+ }
2773
+ ),
2774
+ /* @__PURE__ */ jsxs10("div", { className: "flex flex-col items-start justify-start", children: [
2775
+ /* @__PURE__ */ jsx19("p", { className: "font-medium text-sm", children: group.name }),
2776
+ group.description && /* @__PURE__ */ jsx19("p", { className: "text-xs font-light", children: group.description })
2777
+ ] }),
2778
+ /* @__PURE__ */ jsx19("div", { className: "grow" }),
2779
+ group.howOften && /* @__PURE__ */ jsx19(HowOftenComponent, { regularity: group.howOften })
2780
+ ]
2781
+ },
2782
+ group.id
2783
+ )),
2784
+ /* @__PURE__ */ jsxs10("div", { className: "flex gap-2", children: [
2785
+ isManaging === true && /* @__PURE__ */ jsxs10(Fragment9, { children: [
2786
+ /* @__PURE__ */ jsxs10(
2787
+ "div",
2788
+ {
2789
+ ref: updateGroupsParent,
2790
+ className: "flex flex-col items-start justify-start",
2791
+ children: [
2792
+ wasChanged && /* @__PURE__ */ jsxs10(
2793
+ Button,
2794
+ {
2795
+ variant: "default",
2796
+ size: "sm",
2797
+ className: "relative",
2798
+ disabled: isUpdating,
2799
+ onClick: onUpdate,
2800
+ children: [
2801
+ (_a = texts == null ? void 0 : texts.groupsUpdateButton) != null ? _a : DEFAULT_TEXTS.groupsUpdateButton,
2802
+ isUpdating && /* @__PURE__ */ jsx19("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", children: /* @__PURE__ */ jsx19(Spinner, {}) })
2803
+ ]
2804
+ }
2805
+ ),
2806
+ isUserGroupsUpdated && /* @__PURE__ */ jsxs10("p", { className: "mt-3 flex items-center gap-2 text-sm text-green-500", children: [
2807
+ /* @__PURE__ */ jsx19(CheckCircleIcon, { color: "var(--color-green-500", size: 16 }),
2808
+ " ",
2809
+ (_b = texts == null ? void 0 : texts.groupsUpdateSuccess) != null ? _b : DEFAULT_TEXTS.groupsUpdateSuccess
2810
+ ] })
2811
+ ]
2812
+ }
2813
+ ),
2814
+ /* @__PURE__ */ jsx19("div", { className: "grow" })
2815
+ ] }),
2816
+ hasUnchecked && /* @__PURE__ */ jsx19("div", { className: "flex justify-start", children: /* @__PURE__ */ jsx19(
2817
+ Button,
2818
+ {
2819
+ className: "cursor-pointer dark:bg-neutral-700",
2820
+ onClick: onCheckAll,
2821
+ size: "sm",
2822
+ variant: "secondary",
2823
+ type: "button",
2824
+ children: (_c = texts == null ? void 0 : texts.groupsSelectAllButton) != null ? _c : DEFAULT_TEXTS.groupsSelectAllButton
2825
+ }
2826
+ ) })
2827
+ ] }),
2828
+ hasNoSelection && /* @__PURE__ */ jsxs10("div", { className: "flex text-left gap-2 text-xs text-yellow-500", children: [
2829
+ /* @__PURE__ */ jsx19(TriangleAlertIcon, { color: "orange", size: 16 }),
2830
+ (_d = texts == null ? void 0 : texts.groupsNoSelectionWarning) != null ? _d : DEFAULT_TEXTS.groupsNoSelectionWarning
2831
+ ] })
2832
+ ]
2833
+ }
2834
+ );
2835
+ if (isManaging == true) {
2836
+ return /* @__PURE__ */ jsxs10(Card, { className: "mt-5 text-left", children: [
2837
+ /* @__PURE__ */ jsx19(CardHeader, { children: /* @__PURE__ */ jsx19(CardTitle, { children: (_e = texts == null ? void 0 : texts.groupsTitle) != null ? _e : DEFAULT_TEXTS.groupsTitle }) }),
2838
+ /* @__PURE__ */ jsx19(CardContent, { children: content })
2839
+ ] });
2840
+ }
2841
+ return content;
2842
+ }
2843
+
2844
+ // src/components/notifications/QRCodeSection.tsx
2845
+ import { jsx as jsx20, jsxs as jsxs11 } from "react/jsx-runtime";
2846
+ function QRCodeSection({
2847
+ showQRCode = true,
2848
+ isManaging,
2849
+ className,
2850
+ texts
2851
+ }) {
2852
+ var _a, _b, _c, _d;
2853
+ const isBrowser = typeof window !== "undefined";
2854
+ const darkMode = isBrowser ? ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-color-scheme: dark)").matches) ? true : false : false;
2855
+ function getURL(isBrowser2) {
2856
+ if (isBrowser2) {
2857
+ return window.location.href;
2858
+ }
2859
+ return "";
2860
+ }
2861
+ if (!showQRCode) {
2862
+ return null;
2863
+ }
2864
+ return /* @__PURE__ */ jsxs11(
2865
+ Card,
2866
+ {
2867
+ className: cn(
2868
+ "bg-beige-100 rounded-xl p-4 dark:bg-neutral-700",
2869
+ className == null ? void 0 : className.qrCodeSection
2870
+ ),
2871
+ children: [
2872
+ /* @__PURE__ */ jsx20(CardHeader, { children: /* @__PURE__ */ jsxs11(
2873
+ CardTitle,
2874
+ {
2875
+ className: cn(
2876
+ "mb-3 text-base font-medium lg:text-lg",
2877
+ className == null ? void 0 : className.qrCodeTitle
2878
+ ),
2879
+ children: [
2880
+ (_b = texts == null ? void 0 : texts.qrCodeSubtitle) != null ? _b : DEFAULT_TEXTS.qrCodeSubtitle,
2881
+ " " + ((_c = texts == null ? void 0 : texts.qrCodeTitle) != null ? _c : DEFAULT_TEXTS.qrCodeTitle)
2882
+ ]
2883
+ }
2884
+ ) }),
2885
+ /* @__PURE__ */ jsxs11(CardContent, { className: "flex flex-col items-center gap-2", children: [
2886
+ /* @__PURE__ */ jsxs11("div", { className: "mt-1.5 mb-3 flex items-center gap-x-2", children: [
2887
+ /* @__PURE__ */ jsx20(
2888
+ "a",
2889
+ {
2890
+ href: "https://apps.apple.com/us/app/bitsnap/id6741902807",
2891
+ target: "_blank",
2892
+ className: "max-w-28 flex-1 basis-1/2 lg:max-w-36",
2893
+ children: /* @__PURE__ */ jsx20(
2894
+ "img",
2895
+ {
2896
+ className: "h-auto w-full",
2897
+ src: HOST + "/app-store-logo.png",
2898
+ alt: "Download on App Store"
2899
+ }
2900
+ )
2901
+ }
2902
+ ),
2903
+ /* @__PURE__ */ jsx20(
2904
+ "a",
2905
+ {
2906
+ href: "https://play.google.com/store/apps/details?id=com.bitsnap.Bitsnap&pli=1",
2907
+ target: "_blank",
2908
+ className: "max-w-28 flex-1 basis-1/2 lg:max-w-36",
2909
+ children: /* @__PURE__ */ jsx20(
2910
+ "img",
2911
+ {
2912
+ className: "h-auto w-full",
2913
+ src: HOST + "/google-play-logo.png",
2914
+ alt: "Get in on Google Play"
2915
+ }
2916
+ )
2917
+ }
2918
+ )
2919
+ ] }),
2920
+ isBrowser && /* @__PURE__ */ jsx20("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxs11(
2921
+ "div",
2922
+ {
2923
+ className: cn(
2924
+ "flex min-w-[40%] flex-col items-center gap-2 rounded-xl bg-white p-2 dark:bg-neutral-900",
2925
+ className == null ? void 0 : className.qrCodeContainer
2926
+ ),
2927
+ children: [
2928
+ /* @__PURE__ */ jsx20(
2929
+ "img",
2930
+ {
2931
+ className: "mt-3 w-[80%] p-1 pt-3",
2932
+ src: HOST + `/api/qr-gen?url=${getURL(isBrowser)}&bgColor=${!darkMode ? "F6F4F0" : "171717"}&textColor=${!darkMode ? "000000" : "ffffff"}&margin=0`
2933
+ }
2934
+ ),
2935
+ /* @__PURE__ */ jsx20("p", { className: "text-xs md:text-sm", children: (_d = texts == null ? void 0 : texts.qrCodeScanText) != null ? _d : DEFAULT_TEXTS.qrCodeScanText })
2936
+ ]
2937
+ }
2938
+ ) })
2939
+ ] })
2940
+ ]
2941
+ }
2942
+ );
2943
+ }
2944
+
2945
+ // src/components/notifications/AddUserToGroups.tsx
2946
+ import { useState as useState5 } from "react";
2947
+ import { isValidPhoneNumber } from "react-phone-number-input";
2948
+
2949
+ // src/ui/input.tsx
2950
+ import { jsx as jsx21 } from "react/jsx-runtime";
2951
+ function Input({ className, type, ...props }) {
2952
+ return /* @__PURE__ */ jsx21(
2953
+ "input",
2954
+ {
2955
+ type,
2956
+ "data-slot": "input",
2957
+ className: cn(
2958
+ "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
2959
+ "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
2960
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
2961
+ className
2962
+ ),
2963
+ ...props
2964
+ }
2965
+ );
2966
+ }
2967
+
2968
+ // src/components/notifications/FormInput.tsx
2969
+ import { useAutoAnimate as useAutoAnimate4 } from "@formkit/auto-animate/react";
2970
+ import { Label } from "@radix-ui/react-label";
2971
+ import {
2972
+ CheckCircleIcon as CheckCircleIcon2,
2973
+ CircleAlertIcon,
2974
+ TriangleAlertIcon as TriangleAlertIcon2
2975
+ } from "lucide-react";
2976
+ import { useState as useState4 } from "react";
2977
+ import { jsx as jsx22, jsxs as jsxs12 } from "react/jsx-runtime";
2978
+ function FormInput({
2979
+ submit,
2980
+ isLoading,
2981
+ errMsg,
2982
+ emailLack,
2983
+ warnMsg,
2984
+ isSubmited,
2985
+ agreementLack,
2986
+ showPhoneInput = false,
2987
+ agreementText,
2988
+ className,
2989
+ texts
2990
+ }) {
2991
+ var _a, _b, _c, _d, _e, _f, _g;
2992
+ const [email, setEmail] = useState4("");
2993
+ const [phone, setPhone] = useState4("");
2994
+ const [isChecked, setIsChecked] = useState4(false);
2995
+ const [parent] = useAutoAnimate4();
2996
+ function submitForm(e) {
2997
+ e.preventDefault();
2998
+ submit(email, phone, isChecked);
2999
+ }
3000
+ return /* @__PURE__ */ jsxs12(
3001
+ "form",
3002
+ {
3003
+ ref: parent,
3004
+ onSubmit: submitForm,
3005
+ className: cn("flex flex-col gap-3 text-left", className == null ? void 0 : className.formContainer),
3006
+ children: [
3007
+ /* @__PURE__ */ jsxs12("div", { className: "flex flex-col gap-1 text-left", children: [
3008
+ /* @__PURE__ */ jsx22(Label, { className: "text-sm", htmlFor: "bts-notifications-form-email", children: (_a = texts == null ? void 0 : texts.formEmailLabel) != null ? _a : DEFAULT_TEXTS.formEmailLabel }),
3009
+ /* @__PURE__ */ jsx22(
3010
+ Input,
3011
+ {
3012
+ value: email,
3013
+ onChange: (newVal) => {
3014
+ setEmail(newVal.currentTarget.value);
3015
+ },
3016
+ id: "bts-notifications-form-email",
3017
+ className: cn(emailLack === true ? "border-red-400" : ""),
3018
+ type: "email",
3019
+ placeholder: (_b = texts == null ? void 0 : texts.formEmailPlaceholder) != null ? _b : DEFAULT_TEXTS.formEmailPlaceholder
3020
+ }
3021
+ )
3022
+ ] }),
3023
+ showPhoneInput && /* @__PURE__ */ jsxs12("div", { className: "flex flex-col gap-1 text-left", children: [
3024
+ /* @__PURE__ */ jsxs12(Label, { className: "text-sm", htmlFor: "bts-notifications-form-phone", children: [
3025
+ (_c = texts == null ? void 0 : texts.formPhoneLabel) != null ? _c : DEFAULT_TEXTS.formPhoneLabel,
3026
+ " ",
3027
+ /* @__PURE__ */ jsx22("span", { className: "text-neutral-500 dark:text-neutral-500", children: (_d = texts == null ? void 0 : texts.formPhoneOptional) != null ? _d : DEFAULT_TEXTS.formPhoneOptional })
3028
+ ] }),
3029
+ /* @__PURE__ */ jsx22(
3030
+ Input,
3031
+ {
3032
+ value: phone,
3033
+ onChange: (newVal) => {
3034
+ setPhone(newVal.currentTarget.value);
3035
+ },
3036
+ id: "bts-notifications-form-phone",
3037
+ className: "",
3038
+ type: "tel",
3039
+ autoComplete: "tel",
3040
+ autoCorrect: "off",
3041
+ placeholder: (_e = texts == null ? void 0 : texts.formPhonePlaceholder) != null ? _e : DEFAULT_TEXTS.formPhonePlaceholder
3042
+ }
3043
+ )
3044
+ ] }),
3045
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-start gap-x-1.5", children: [
3046
+ /* @__PURE__ */ jsx22(
3047
+ "input",
3048
+ {
3049
+ className: "cursor-pointer",
3050
+ id: "bts-notifications-form-marketing-consent",
3051
+ type: "checkbox",
3052
+ checked: isChecked,
3053
+ onChange: () => {
3054
+ setIsChecked(!isChecked);
3055
+ }
3056
+ }
3057
+ ),
3058
+ /* @__PURE__ */ jsx22(
3059
+ "label",
3060
+ {
3061
+ htmlFor: "bts-notifications-form-marketing-consent",
3062
+ className: cn(
3063
+ "cursor-pointer text-xs leading-4 transition-colors md:text-sm md:leading-4",
3064
+ agreementLack === true ? "text-yellow-700" : ""
3065
+ ),
3066
+ children: agreementText
3067
+ }
3068
+ )
3069
+ ] }),
3070
+ errMsg.length > 0 && /* @__PURE__ */ jsxs12("p", { className: "mb-3 flex items-center gap-1 text-sm text-red-400", children: [
3071
+ /* @__PURE__ */ jsx22(TriangleAlertIcon2, { color: "#ff6467", size: 16 }),
3072
+ " ",
3073
+ errMsg
3074
+ ] }),
3075
+ warnMsg.length > 0 && /* @__PURE__ */ jsxs12("p", { className: "mb-3 flex items-center gap-1 text-sm text-amber-400", children: [
3076
+ /* @__PURE__ */ jsx22(CircleAlertIcon, { color: "var(--color-amber-400)", size: 16 }),
3077
+ " ",
3078
+ warnMsg
3079
+ ] }),
3080
+ isSubmited == false && /* @__PURE__ */ jsx22("div", { className: "flex justify-start", children: /* @__PURE__ */ jsxs12(
3081
+ Button,
3082
+ {
3083
+ variant: "default",
3084
+ disabled: isLoading,
3085
+ className: cn(
3086
+ isLoading ? "cursor-not-allowed text-transparent" : "",
3087
+ "relative"
3088
+ ),
3089
+ children: [
3090
+ (_f = texts == null ? void 0 : texts.formSubmitButton) != null ? _f : DEFAULT_TEXTS.formSubmitButton,
3091
+ isLoading && /* @__PURE__ */ jsx22("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", children: /* @__PURE__ */ jsx22(Spinner, {}) })
3092
+ ]
3093
+ }
3094
+ ) }),
3095
+ isSubmited && /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-3 text-sm text-green-400", children: [
3096
+ /* @__PURE__ */ jsx22(CheckCircleIcon2, { size: 16 }),
3097
+ " ",
3098
+ (_g = texts == null ? void 0 : texts.formSuccessMessage) != null ? _g : DEFAULT_TEXTS.formSuccessMessage
3099
+ ] })
3100
+ ]
3101
+ }
3102
+ );
3103
+ }
3104
+
3105
+ // src/components/notifications/AddUserToGroups.tsx
3106
+ import { jsx as jsx23, jsxs as jsxs13 } from "react/jsx-runtime";
3107
+ var emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
3108
+ function AddUserToGroups({
3109
+ groups,
3110
+ onToggle,
3111
+ onCheckAll,
3112
+ slug,
3113
+ showPhoneInput = false,
3114
+ agreementText,
3115
+ className,
3116
+ texts,
3117
+ isUpdating,
3118
+ wasChanged,
3119
+ onSuccess
3120
+ }) {
3121
+ var _a, _b;
3122
+ const [errMsg, setErrMsg] = useState5("");
3123
+ const [warnMsg, setWarnMsg] = useState5("");
3124
+ const [isSubmited, setIsSubmited] = useState5(false);
3125
+ const [agreementLack, setAgreementLack] = useState5(false);
3126
+ const [emailLack, setEmailLack] = useState5(false);
3127
+ const {
3128
+ mutateAsync: createNotificationUserMutation,
3129
+ isPending: isCreateNotificationUserPending
3130
+ } = useMutation3(rpcProvider.notifications.createNotificationUser);
3131
+ function validatePhoneNumber(phone) {
3132
+ if (phone == null) {
3133
+ return false;
3134
+ }
3135
+ return isValidPhoneNumber(phone, "PL");
3136
+ }
3137
+ async function save(email, phone, agreement) {
3138
+ setErrMsg("");
3139
+ setWarnMsg("");
3140
+ setEmailLack(false);
3141
+ setIsSubmited(false);
3142
+ setAgreementLack(false);
3143
+ if (!agreement) {
3144
+ setAgreementLack(true);
3145
+ const msg = "Zgoda w tym przypadku jest wymagana.";
3146
+ setErrMsg(msg);
3147
+ return;
3148
+ }
3149
+ if (emailRegex.test(email) === false) {
3150
+ setErrMsg("Email jest nieprawid\u0142owy.");
3151
+ setEmailLack(true);
3152
+ return;
3153
+ }
3154
+ if (phone.length > 0) {
3155
+ if (validatePhoneNumber(phone) === false) {
3156
+ const msg = "Numer telefonu mo\u017Ce by\u0107 nieprawid\u0142owy. Zapisali\u015Bmy go ale je\u015Bli jest nieprawid\u0142owy to wpisz jeszcze raz i kliknij przycisk.";
3157
+ setWarnMsg(msg);
3158
+ }
3159
+ }
3160
+ try {
3161
+ const newNotificationUser = await createNotificationUserMutation({
3162
+ slug,
3163
+ email,
3164
+ phone,
3165
+ groups: groups.filter((el) => el.isOn == true).map((el) => el.id),
3166
+ mobileNotificationEnabled: true,
3167
+ emailNotificationEnabled: true,
3168
+ smsNotificationEnabled: true
3169
+ });
3170
+ if (newNotificationUser.result.case === "success") {
3171
+ setIsSubmited(true);
3172
+ setTimeout(() => {
3173
+ onSuccess == null ? void 0 : onSuccess(
3174
+ false,
3175
+ newNotificationUser.userId,
3176
+ newNotificationUser.accessToken
3177
+ );
3178
+ }, 1e3);
3179
+ return;
3180
+ } else {
3181
+ setIsSubmited(true);
3182
+ const failureMessage = newNotificationUser.result.value;
3183
+ if (failureMessage != null) {
3184
+ if (failureMessage == 32 /* NOTIFICATION_USER_ALREADY_EXIST */) {
3185
+ onSuccess == null ? void 0 : onSuccess(true, void 0, void 0);
3186
+ return;
3187
+ }
3188
+ console.log(`Code error: ${FailureMessage[failureMessage]}`);
3189
+ setErrMsg("Wyst\u0105pi\u0142 b\u0142\u0105d: " + FailureMessage[failureMessage]);
3190
+ return;
3191
+ }
3192
+ return;
3193
+ }
3194
+ } catch (e) {
3195
+ setErrMsg("Wyst\u0105pi\u0142 b\u0142\u0105d podczas zapisywania. Spr\xF3buj ponownie.");
3196
+ console.log(`Error: ${e}`);
3197
+ }
3198
+ }
3199
+ const text = (_a = texts == null ? void 0 : texts.formTitle) != null ? _a : DEFAULT_TEXTS.formTitle;
3200
+ return /* @__PURE__ */ jsxs13(
3201
+ "div",
3202
+ {
3203
+ className: cn(
3204
+ "bg-beige-100 rounded-xl p-4 dark:bg-neutral-700",
3205
+ className == null ? void 0 : className.formSection
3206
+ ),
3207
+ children: [
3208
+ text.length > 0 && /* @__PURE__ */ jsx23(
3209
+ "h3",
3210
+ {
3211
+ className: cn(
3212
+ "mb-3 text-base font-medium lg:text-lg",
3213
+ className == null ? void 0 : className.formTitle
3214
+ ),
3215
+ children: text
3216
+ }
3217
+ ),
3218
+ /* @__PURE__ */ jsx23(
3219
+ NotificationGroupsList,
3220
+ {
3221
+ groups,
3222
+ isManaging: false,
3223
+ onToggle: onToggle != null ? onToggle : () => {
3224
+ },
3225
+ onCheckAll: onCheckAll != null ? onCheckAll : () => {
3226
+ },
3227
+ isUpdating: isUpdating != null ? isUpdating : false,
3228
+ wasChanged: wasChanged != null ? wasChanged : false,
3229
+ isUserGroupsUpdated: false,
3230
+ className,
3231
+ texts
3232
+ }
3233
+ ),
3234
+ /* @__PURE__ */ jsx23(
3235
+ FormInput,
3236
+ {
3237
+ errMsg,
3238
+ emailLack,
3239
+ warnMsg,
3240
+ submit: save,
3241
+ isLoading: isCreateNotificationUserPending,
3242
+ isSubmited,
3243
+ agreementLack,
3244
+ showPhoneInput,
3245
+ agreementText: (_b = agreementText != null ? agreementText : texts == null ? void 0 : texts.agreementText) != null ? _b : DEFAULT_TEXTS.agreementText,
3246
+ className,
3247
+ texts
3248
+ }
3249
+ )
3250
+ ]
3251
+ }
3252
+ );
3253
+ }
3254
+
3255
+ // src/components/notifications/ManageMyData.tsx
3256
+ import { useEffect as useEffect6, useState as useState7 } from "react";
3257
+
3258
+ // src/ui/skeleton.tsx
3259
+ import { jsx as jsx24 } from "react/jsx-runtime";
3260
+ function Skeleton2({ className, ...props }) {
3261
+ return /* @__PURE__ */ jsx24(
3262
+ "div",
3263
+ {
3264
+ "data-slot": "skeleton",
3265
+ className: cn("bg-accent animate-pulse rounded-md", className),
3266
+ ...props
3267
+ }
3268
+ );
3269
+ }
3270
+
3271
+ // src/components/notifications/ManageMyData.tsx
3272
+ import { Label as Label2 } from "@radix-ui/react-label";
3273
+ import { MessageCircleWarningIcon } from "lucide-react";
3274
+ import { useDebouncedCallback } from "use-debounce";
3275
+
3276
+ // src/components/notifications/UnsubscribeDialog.tsx
3277
+ import { TriangleAlertIcon as TriangleAlertIcon3, XIcon } from "lucide-react";
3278
+ import { createPortal as createPortal2 } from "react-dom";
3279
+ import { useEffect as useEffect5, useState as useState6 } from "react";
3280
+ import { jsx as jsx25, jsxs as jsxs14 } from "react/jsx-runtime";
3281
+ function UnsubscribeDialog({
3282
+ open: open2,
3283
+ onOpenChange,
3284
+ onConfirm,
3285
+ isDeleting = false
3286
+ }) {
3287
+ const [mounted, setMounted] = useState6(false);
3288
+ useEffect5(() => {
3289
+ setMounted(true);
3290
+ return () => setMounted(false);
3291
+ }, []);
3292
+ useEffect5(() => {
3293
+ if (open2) {
3294
+ document.body.style.overflow = "hidden";
3295
+ } else {
3296
+ document.body.style.overflow = "";
3297
+ }
3298
+ return () => {
3299
+ document.body.style.overflow = "";
3300
+ };
3301
+ }, [open2]);
3302
+ if (!mounted || !open2) {
3303
+ return null;
3304
+ }
3305
+ const handleBackdropClick = (e) => {
3306
+ if (e.target === e.currentTarget) {
3307
+ onOpenChange(false);
3308
+ }
3309
+ };
3310
+ const handleConfirm = () => {
3311
+ onConfirm();
3312
+ };
3313
+ return createPortal2(
3314
+ /* @__PURE__ */ jsx25(
3315
+ "div",
3316
+ {
3317
+ className: "fixed inset-0 z-[9999] flex items-center justify-center bg-black/50 p-4",
3318
+ onClick: handleBackdropClick,
3319
+ children: /* @__PURE__ */ jsxs14(
3320
+ "div",
3321
+ {
3322
+ className: cn(
3323
+ "relative w-full max-w-md rounded-2xl bg-white p-6 shadow-lg",
3324
+ "dark:bg-neutral-800",
3325
+ "animate-in fade-in-0 zoom-in-95 duration-200"
3326
+ ),
3327
+ onClick: (e) => e.stopPropagation(),
3328
+ children: [
3329
+ /* @__PURE__ */ jsxs14(
3330
+ "button",
3331
+ {
3332
+ onClick: () => onOpenChange(false),
3333
+ className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-neutral-950 focus:ring-offset-2 disabled:pointer-events-none dark:ring-offset-neutral-950 dark:focus:ring-neutral-300",
3334
+ disabled: isDeleting,
3335
+ children: [
3336
+ /* @__PURE__ */ jsx25(XIcon, { className: "h-4 w-4" }),
3337
+ /* @__PURE__ */ jsx25("span", { className: "sr-only", children: "Zamknij" })
3338
+ ]
3339
+ }
3340
+ ),
3341
+ /* @__PURE__ */ jsxs14("div", { className: "flex flex-col gap-4", children: [
3342
+ /* @__PURE__ */ jsxs14("div", { className: "flex items-start gap-3", children: [
3343
+ /* @__PURE__ */ jsx25("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsx25(
3344
+ TriangleAlertIcon3,
3345
+ {
3346
+ className: "h-6 w-6 text-amber-500",
3347
+ "aria-hidden": "true"
3348
+ }
3349
+ ) }),
3350
+ /* @__PURE__ */ jsx25("div", { className: "flex-1", children: /* @__PURE__ */ jsx25("h2", { className: "text-lg font-semibold text-black dark:text-neutral-100", children: "Czy na pewno chcesz si\u0119 wypisa\u0107?" }) })
3351
+ ] }),
3352
+ /* @__PURE__ */ jsx25("p", { className: "text-sm text-neutral-600 dark:text-neutral-400", children: "Klikni\u0119cie tego przycisku spowoduje wypisanie z wszelkich powiadomie\u0144 i grup, kt\xF3re zapisa\u0142e\u015B." }),
3353
+ /* @__PURE__ */ jsxs14("div", { className: "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", children: [
3354
+ /* @__PURE__ */ jsx25(
3355
+ Button,
3356
+ {
3357
+ type: "button",
3358
+ variant: "ghost",
3359
+ onClick: () => onOpenChange(false),
3360
+ disabled: isDeleting,
3361
+ className: "sm:min-w-[100px]",
3362
+ children: "Anuluj"
3363
+ }
3364
+ ),
3365
+ /* @__PURE__ */ jsxs14(
3366
+ Button,
3367
+ {
3368
+ type: "button",
3369
+ variant: "destructive",
3370
+ onClick: handleConfirm,
3371
+ disabled: isDeleting,
3372
+ className: cn(
3373
+ isDeleting && "cursor-not-allowed text-transparent",
3374
+ "relative sm:min-w-[100px]"
3375
+ ),
3376
+ children: [
3377
+ "Usu\u0144",
3378
+ isDeleting && /* @__PURE__ */ jsx25("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", children: /* @__PURE__ */ jsx25("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent" }) })
3379
+ ]
3380
+ }
3381
+ )
3382
+ ] })
3383
+ ] })
3384
+ ]
3385
+ }
3386
+ )
3387
+ }
3388
+ ),
3389
+ document.body
3390
+ );
3391
+ }
3392
+
3393
+ // src/components/notifications/ManageMyData.tsx
3394
+ import { useAutoAnimate as useAutoAnimate5 } from "@formkit/auto-animate/react";
3395
+ import { Fragment as Fragment10, jsx as jsx26, jsxs as jsxs15 } from "react/jsx-runtime";
3396
+ function ManageMyData({
3397
+ accessToken,
3398
+ slug,
3399
+ userID,
3400
+ className,
3401
+ texts
3402
+ }) {
3403
+ var _a, _b, _c, _d, _e;
3404
+ const [parent] = useAutoAnimate5();
3405
+ const [parentCard] = useAutoAnimate5();
3406
+ const { mutateAsync: deleteMyData, isPending: isDeleting } = useMutation3(
3407
+ rpcProvider.notifications.deleteNotificationUser
3408
+ );
3409
+ const { mutateAsync: updateNotificationUser2, isPending: isUpdating } = useMutation3(rpcProvider.notifications.updateNotificationUser);
3410
+ const { data: userSettings, isFetching: isLoading } = useQuery4(
3411
+ rpcProvider.notifications.getNotificationUserSettings,
3412
+ {
3413
+ userId: userID,
3414
+ slug,
3415
+ accessToken
3416
+ }
3417
+ );
3418
+ const [email, setEmail] = useState7(false);
3419
+ const [phone, setPhone] = useState7(false);
3420
+ const [isDataUpdated, setIsDataUpdated] = useState7(false);
3421
+ const [push, setPush] = useState7(false);
3422
+ const [isDialogOpen, setIsDialogOpen] = useState7(false);
3423
+ const details = (userSettings == null ? void 0 : userSettings.result.case) === "success" ? (_a = userSettings == null ? void 0 : userSettings.result) == null ? void 0 : _a.value : void 0;
3424
+ function deleteData() {
3425
+ setIsDialogOpen(true);
3426
+ }
3427
+ async function handleConfirmDelete() {
3428
+ await deleteMyData({
3429
+ accessToken,
3430
+ slug,
3431
+ userId: userID
3432
+ });
3433
+ setIsDialogOpen(false);
3434
+ }
3435
+ async function updateData() {
3436
+ await updateNotificationUser2({
3437
+ accessToken,
3438
+ slug,
3439
+ notificationUserId: userID,
3440
+ mobileNotificationEnabled: push,
3441
+ emailNotificationEnabled: email,
3442
+ smsNotificationEnabled: phone
3443
+ });
3444
+ setIsDataUpdated(true);
3445
+ setTimeout(() => {
3446
+ setIsDataUpdated(false);
3447
+ }, 3e3);
3448
+ }
3449
+ const debouncedUpdateData = useDebouncedCallback((_) => {
3450
+ updateData();
3451
+ }, 300);
3452
+ useEffect6(() => {
3453
+ var _a2, _b2, _c2, _d2;
3454
+ const details2 = (userSettings == null ? void 0 : userSettings.result.case) === "success" ? (_a2 = userSettings == null ? void 0 : userSettings.result) == null ? void 0 : _a2.value : void 0;
3455
+ setEmail((_b2 = details2 == null ? void 0 : details2.emailNotificationEnabled) != null ? _b2 : false);
3456
+ setPhone((_c2 = details2 == null ? void 0 : details2.smsNotificationEnabled) != null ? _c2 : false);
3457
+ setPush((_d2 = details2 == null ? void 0 : details2.mobileNotificationEnabled) != null ? _d2 : false);
3458
+ }, [userSettings]);
3459
+ function setData(key, value) {
3460
+ if (key === "email") {
3461
+ setEmail(value);
3462
+ }
3463
+ if (key === "phone") {
3464
+ setPhone(value);
3465
+ }
3466
+ if (key === "push") {
3467
+ setPush(value);
3468
+ }
3469
+ debouncedUpdateData(true);
3470
+ }
3471
+ return /* @__PURE__ */ jsxs15(
3472
+ "div",
3473
+ {
3474
+ className: cn(
3475
+ "bg-beige-100 rounded-xl p-4 dark:bg-neutral-700",
3476
+ className == null ? void 0 : className.manageDataSection
3477
+ ),
3478
+ children: [
3479
+ /* @__PURE__ */ jsx26("div", { className: "flex justify-start", children: /* @__PURE__ */ jsx26(
3480
+ "h3",
3481
+ {
3482
+ className: cn(
3483
+ "mb-3 text-base font-medium lg:text-lg",
3484
+ className == null ? void 0 : className.manageDataTitle
3485
+ ),
3486
+ children: (_b = texts == null ? void 0 : texts.manageDataTitle) != null ? _b : DEFAULT_TEXTS.manageDataTitle
3487
+ }
3488
+ ) }),
3489
+ isLoading ? /* @__PURE__ */ jsx26(Skeleton2, { className: "h-64 w-full" }) : /* @__PURE__ */ jsxs15(Card, { ref: parentCard, className: cn(isUpdating && "relative"), children: [
3490
+ /* @__PURE__ */ jsx26(CardHeader, { children: /* @__PURE__ */ jsx26(CardTitle, { children: /* @__PURE__ */ jsx26("p", { className: "text-sm text-left", children: (_c = texts == null ? void 0 : texts.manageDataDescription) != null ? _c : DEFAULT_TEXTS.manageDataDescription }) }) }),
3491
+ /* @__PURE__ */ jsxs15(CardContent, { ref: parent, children: [
3492
+ /* @__PURE__ */ jsx26(
3493
+ "div",
3494
+ {
3495
+ className: cn(
3496
+ isUpdating && "opacity-50 pointer-events-none",
3497
+ "flex flex-col gap-2"
3498
+ ),
3499
+ children: /* @__PURE__ */ jsxs15("div", { className: "flex flex-col items-start gap-5 gap-x-2", children: [
3500
+ (details == null ? void 0 : details.emailNotificationAvailable) && /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3", children: [
3501
+ /* @__PURE__ */ jsx26(
3502
+ Switch,
3503
+ {
3504
+ id: "email-enabled",
3505
+ className: "data-[state=checked]:bg-blue-500 dark:data-[state=unchecked]:bg-neutral-600",
3506
+ checked: email,
3507
+ onCheckedChange: () => {
3508
+ setData("email", !email);
3509
+ }
3510
+ }
3511
+ ),
3512
+ /* @__PURE__ */ jsx26(Label2, { htmlFor: "email-enabled", className: "text-sm", children: "Email" })
3513
+ ] }),
3514
+ (details == null ? void 0 : details.smsNotificationAvailable) && /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3", children: [
3515
+ /* @__PURE__ */ jsx26(
3516
+ Switch,
3517
+ {
3518
+ id: "sms-enabled",
3519
+ className: "data-[state=checked]:bg-blue-500 dark:data-[state=unchecked]:bg-neutral-600",
3520
+ checked: phone,
3521
+ onCheckedChange: () => {
3522
+ setData("phone", !phone);
3523
+ }
3524
+ }
3525
+ ),
3526
+ /* @__PURE__ */ jsx26(Label2, { htmlFor: "sms-enabled", className: "text-sm", children: "SMS" })
3527
+ ] }),
3528
+ (details == null ? void 0 : details.mobileNotificationAvailable) && /* @__PURE__ */ jsxs15(Fragment10, { children: [
3529
+ /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3", children: [
3530
+ /* @__PURE__ */ jsx26(
3531
+ Switch,
3532
+ {
3533
+ id: "push-enabled",
3534
+ className: "data-[state=checked]:bg-blue-500 dark:data-[state=unchecked]:bg-neutral-600",
3535
+ checked: push,
3536
+ onCheckedChange: () => {
3537
+ setData("push", !push);
3538
+ }
3539
+ }
3540
+ ),
3541
+ /* @__PURE__ */ jsx26(Label2, { htmlFor: "push-enabled", className: "text-sm", children: "Powiadomienia na telefon" })
3542
+ ] }),
3543
+ (details == null ? void 0 : details.hasUserInstalledApp) === false && /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-3", children: [
3544
+ /* @__PURE__ */ jsx26(
3545
+ MessageCircleWarningIcon,
3546
+ {
3547
+ color: "var(--color-amber-500)",
3548
+ size: 26
3549
+ }
3550
+ ),
3551
+ /* @__PURE__ */ jsx26("p", { className: "text-xs text-amber-500", children: "Wygl\u0105da na to, \u017Ce nie masz zainstalowanej aplikacji mobilnej. Zainstaluj i wyra\u017A zgod\u0119 na otrzymywanie powiadomie\u0144 na telefon." })
3552
+ ] })
3553
+ ] })
3554
+ ] })
3555
+ }
3556
+ ),
3557
+ /* @__PURE__ */ jsxs15("div", { className: "mt-5 flex flex-col gap-2 text-left", children: [
3558
+ /* @__PURE__ */ jsx26("hr", {}),
3559
+ isDataUpdated && /* @__PURE__ */ jsx26("p", { className: "text-xs text-green-500", children: (_d = texts == null ? void 0 : texts.manageDataUpdatedMessage) != null ? _d : DEFAULT_TEXTS.manageDataUpdatedMessage }),
3560
+ /* @__PURE__ */ jsx26("div", { className: "flex items-center gap-x-2", children: /* @__PURE__ */ jsxs15(
3561
+ Button,
3562
+ {
3563
+ size: "sm",
3564
+ variant: "link",
3565
+ className: cn(
3566
+ "pl-0 ml-0",
3567
+ isDeleting && "cursor-not-allowed"
3568
+ ),
3569
+ onClick: deleteData,
3570
+ children: [
3571
+ (_e = texts == null ? void 0 : texts.manageDataUnsubscribeButton) != null ? _e : DEFAULT_TEXTS.manageDataUnsubscribeButton,
3572
+ isDeleting && /* @__PURE__ */ jsx26("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", children: /* @__PURE__ */ jsx26(Spinner, {}) })
3573
+ ]
3574
+ }
3575
+ ) })
3576
+ ] })
3577
+ ] }),
3578
+ isUpdating && /* @__PURE__ */ jsx26("div", { className: "bg-black/30 absolute inset-0 rounded-xl", children: /* @__PURE__ */ jsx26("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", children: /* @__PURE__ */ jsx26(Spinner, {}) }) })
3579
+ ] }),
3580
+ /* @__PURE__ */ jsx26(
3581
+ UnsubscribeDialog,
3582
+ {
3583
+ open: isDialogOpen,
3584
+ onOpenChange: setIsDialogOpen,
3585
+ onConfirm: handleConfirmDelete,
3586
+ isDeleting
3587
+ }
3588
+ )
3589
+ ]
3590
+ }
3591
+ );
3592
+ }
3593
+
3594
+ // src/components/notifications/LoginScreen.tsx
3595
+ import { useState as useState8 } from "react";
3596
+
3597
+ // src/ui/label.tsx
3598
+ import * as LabelPrimitive from "@radix-ui/react-label";
3599
+ import { jsx as jsx27 } from "react/jsx-runtime";
3600
+ function Label3({
3601
+ className,
3602
+ ...props
3603
+ }) {
3604
+ return /* @__PURE__ */ jsx27(
3605
+ LabelPrimitive.Root,
3606
+ {
3607
+ "data-slot": "label",
3608
+ className: cn(
3609
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
3610
+ className
3611
+ ),
3612
+ ...props
3613
+ }
3614
+ );
3615
+ }
3616
+
3617
+ // src/ui/input-otp.tsx
3618
+ import * as React3 from "react";
3619
+ import { OTPInput, OTPInputContext } from "input-otp";
3620
+ import { MinusIcon } from "lucide-react";
3621
+ import { jsx as jsx28, jsxs as jsxs16 } from "react/jsx-runtime";
3622
+ function InputOTP({
3623
+ className,
3624
+ containerClassName,
3625
+ ...props
3626
+ }) {
3627
+ return /* @__PURE__ */ jsx28(
3628
+ OTPInput,
3629
+ {
3630
+ "data-slot": "input-otp",
3631
+ containerClassName: cn(
3632
+ "flex items-center gap-2 has-disabled:opacity-50",
3633
+ containerClassName
3634
+ ),
3635
+ className: cn("disabled:cursor-not-allowed", className),
3636
+ ...props
3637
+ }
3638
+ );
3639
+ }
3640
+ function InputOTPGroup({ className, ...props }) {
3641
+ return /* @__PURE__ */ jsx28(
3642
+ "div",
3643
+ {
3644
+ "data-slot": "input-otp-group",
3645
+ className: cn("flex items-center", className),
3646
+ ...props
3647
+ }
3648
+ );
3649
+ }
3650
+ function InputOTPSlot({
3651
+ index,
3652
+ className,
3653
+ ...props
3654
+ }) {
3655
+ var _a;
3656
+ const inputOTPContext = React3.useContext(OTPInputContext);
3657
+ const { char, hasFakeCaret, isActive } = (_a = inputOTPContext == null ? void 0 : inputOTPContext.slots[index]) != null ? _a : {};
3658
+ return /* @__PURE__ */ jsxs16(
3659
+ "div",
3660
+ {
3661
+ "data-slot": "input-otp-slot",
3662
+ "data-active": isActive,
3663
+ className: cn(
3664
+ "data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]",
3665
+ className
3666
+ ),
3667
+ ...props,
3668
+ children: [
3669
+ char,
3670
+ hasFakeCaret && /* @__PURE__ */ jsx28("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx28("div", { className: "animate-caret-blink bg-foreground h-4 w-px duration-1000" }) })
3671
+ ]
3672
+ }
3673
+ );
3674
+ }
3675
+
3676
+ // src/components/notifications/LoginScreen.tsx
3677
+ import { ArrowLeft } from "lucide-react";
3678
+ import { useAutoAnimate as useAutoAnimate6 } from "@formkit/auto-animate/react";
3679
+
3680
+ // src/ui/dialog.tsx
3681
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
3682
+ import { XIcon as XIcon2 } from "lucide-react";
3683
+ import { jsx as jsx29, jsxs as jsxs17 } from "react/jsx-runtime";
3684
+ function Dialog({
3685
+ ...props
3686
+ }) {
3687
+ return /* @__PURE__ */ jsx29(DialogPrimitive.Root, { "data-slot": "dialog", ...props });
3688
+ }
3689
+ function DialogPortal({
3690
+ ...props
3691
+ }) {
3692
+ return /* @__PURE__ */ jsx29(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props });
3693
+ }
3694
+ function DialogOverlay({
3695
+ className,
3696
+ ...props
3697
+ }) {
3698
+ return /* @__PURE__ */ jsx29(
3699
+ DialogPrimitive.Overlay,
3700
+ {
3701
+ "data-slot": "dialog-overlay",
3702
+ className: cn(
3703
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
3704
+ className
3705
+ ),
3706
+ ...props
3707
+ }
3708
+ );
3709
+ }
3710
+ function DialogContent({
3711
+ className,
3712
+ children,
3713
+ showCloseButton = true,
3714
+ ...props
3715
+ }) {
3716
+ return /* @__PURE__ */ jsxs17(DialogPortal, { "data-slot": "dialog-portal", children: [
3717
+ /* @__PURE__ */ jsx29(DialogOverlay, {}),
3718
+ /* @__PURE__ */ jsxs17(
3719
+ DialogPrimitive.Content,
3720
+ {
3721
+ "data-slot": "dialog-content",
3722
+ className: cn(
3723
+ "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",
3724
+ className
3725
+ ),
3726
+ ...props,
3727
+ children: [
3728
+ children,
3729
+ showCloseButton && /* @__PURE__ */ jsxs17(
3730
+ DialogPrimitive.Close,
3731
+ {
3732
+ "data-slot": "dialog-close",
3733
+ className: "ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
3734
+ children: [
3735
+ /* @__PURE__ */ jsx29(XIcon2, {}),
3736
+ /* @__PURE__ */ jsx29("span", { className: "sr-only", children: "Close" })
3737
+ ]
3738
+ }
3739
+ )
3740
+ ]
3741
+ }
3742
+ )
3743
+ ] });
3744
+ }
3745
+
3746
+ // src/components/notifications/LoginScreen.tsx
3747
+ import { Fragment as Fragment11, jsx as jsx30, jsxs as jsxs18 } from "react/jsx-runtime";
3748
+ function LoginScreen({
3749
+ slug,
3750
+ onSuccess,
3751
+ onError,
3752
+ className,
3753
+ isOpen,
3754
+ onClose,
3755
+ texts
3756
+ }) {
3757
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
3758
+ const [parentContent] = useAutoAnimate6();
3759
+ const [parentHeader] = useAutoAnimate6();
3760
+ const [email, setEmail] = useState8("");
3761
+ const [code, setCode] = useState8("");
3762
+ const [isEmailSent, setIsEmailSent] = useState8(false);
3763
+ const [error, setError] = useState8(null);
3764
+ const { mutateAsync: verifyUserEmail2, isPending: isVerifying } = useMutation3(
3765
+ rpcProvider.notifications.verifyUserEmail
3766
+ );
3767
+ const handleSendEmail = async (e) => {
3768
+ var _a2;
3769
+ e.preventDefault();
3770
+ setError(null);
3771
+ if (!email || !email.includes("@")) {
3772
+ setError((_a2 = texts.loginInvalidEmailError) != null ? _a2 : "");
3773
+ return;
3774
+ }
3775
+ try {
3776
+ await verifyUserEmail2({
3777
+ email,
3778
+ slug
3779
+ });
3780
+ setIsEmailSent(true);
3781
+ } catch (err) {
3782
+ const error2 = err instanceof Error ? err : new Error(texts.loginSendEmailError);
3783
+ setError(error2.message);
3784
+ onError == null ? void 0 : onError(error2);
3785
+ }
3786
+ };
3787
+ const handleVerifyCode = async (value) => {
3788
+ var _a2, _b2;
3789
+ setCode(value);
3790
+ setError(null);
3791
+ if (value.length === 6) {
3792
+ try {
3793
+ const response = await verifyUserEmail2({
3794
+ email: void 0,
3795
+ code: value,
3796
+ slug
3797
+ });
3798
+ if (response.ok && response.accessToken) {
3799
+ onSuccess == null ? void 0 : onSuccess(response.userId, response.accessToken);
3800
+ } else {
3801
+ setError((_a2 = texts.loginVerificationFailedError) != null ? _a2 : "");
3802
+ onError == null ? void 0 : onError(new Error(texts.loginVerificationFailedError));
3803
+ }
3804
+ } catch (err) {
3805
+ const error2 = err instanceof Error ? err : new Error(texts.loginVerifyCodeError);
3806
+ if (error2.message.includes("Invalid code")) {
3807
+ setError((_b2 = texts.loginInvalidCodeError) != null ? _b2 : error2.message);
3808
+ setCode("");
3809
+ return;
3810
+ }
3811
+ setError(error2.message);
3812
+ onError == null ? void 0 : onError(error2);
3813
+ setCode("");
3814
+ }
3815
+ }
3816
+ };
3817
+ const handleResendEmail = async () => {
3818
+ var _a2;
3819
+ setCode("");
3820
+ setError(null);
3821
+ if (!email || !slug) {
3822
+ setError((_a2 = texts.loginSlugRequiredError) != null ? _a2 : "");
3823
+ return;
3824
+ }
3825
+ try {
3826
+ await verifyUserEmail2({
3827
+ email,
3828
+ slug
3829
+ });
3830
+ } catch (err) {
3831
+ const error2 = err instanceof Error ? err : new Error(texts.loginResendEmailError);
3832
+ setError(error2.message);
3833
+ onError == null ? void 0 : onError(error2);
3834
+ }
3835
+ };
3836
+ const handleChangeEmail = () => {
3837
+ setIsEmailSent(false);
3838
+ setCode("");
3839
+ setError(null);
3840
+ };
3841
+ return /* @__PURE__ */ jsx30(Dialog, { open: isOpen, onOpenChange: onClose, children: /* @__PURE__ */ jsx30(DialogContent, { className: "sm:max-w-[425px] min-h-[250px]", children: /* @__PURE__ */ jsxs18("div", { className: "flex flex-col min-h-[250px] h-full", children: [
3842
+ /* @__PURE__ */ jsxs18("div", { ref: parentHeader, className: "flex items-start gap-2 mb-2", children: [
3843
+ isEmailSent && /* @__PURE__ */ jsx30(
3844
+ Button,
3845
+ {
3846
+ variant: "ghost",
3847
+ size: "icon-sm",
3848
+ onClick: () => {
3849
+ setIsEmailSent(false);
3850
+ },
3851
+ children: /* @__PURE__ */ jsx30(ArrowLeft, { className: "h-5 w-5" })
3852
+ }
3853
+ ),
3854
+ /* @__PURE__ */ jsx30("div", { children: /* @__PURE__ */ jsx30(CardTitle, { children: isEmailSent ? (_a = texts.loginCodeLabel) != null ? _a : "" : (_b = texts.loginTitle) != null ? _b : "" }) })
3855
+ ] }),
3856
+ /* @__PURE__ */ jsx30(CardDescription, { className: "mb-4", children: isEmailSent ? /* @__PURE__ */ jsxs18(Fragment11, { children: [
3857
+ (_c = texts.loginCodeSentMessage) != null ? _c : "",
3858
+ " ",
3859
+ email
3860
+ ] }) : (_d = texts.loginDescription) != null ? _d : "" }),
3861
+ /* @__PURE__ */ jsx30("div", { className: "flex-1 flex flex-col", children: !isEmailSent ? /* @__PURE__ */ jsxs18("form", { onSubmit: handleSendEmail, className: "flex flex-col flex-1", children: [
3862
+ /* @__PURE__ */ jsxs18("div", { className: "space-y-2", children: [
3863
+ /* @__PURE__ */ jsx30(Label3, { htmlFor: "email", children: (_e = texts.loginEmailLabel) != null ? _e : "" }),
3864
+ /* @__PURE__ */ jsx30(
3865
+ Input,
3866
+ {
3867
+ id: "email",
3868
+ type: "email",
3869
+ placeholder: (_f = texts.loginEmailPlaceholder) != null ? _f : "",
3870
+ value: email,
3871
+ onChange: (e) => setEmail(e.target.value),
3872
+ required: true,
3873
+ disabled: isVerifying,
3874
+ "aria-invalid": error ? "true" : "false"
3875
+ }
3876
+ )
3877
+ ] }),
3878
+ error && /* @__PURE__ */ jsx30(
3879
+ "div",
3880
+ {
3881
+ className: "text-sm text-destructive mt-2 mb-1",
3882
+ role: "alert",
3883
+ children: error
3884
+ }
3885
+ ),
3886
+ /* @__PURE__ */ jsx30("div", { className: "grow" }),
3887
+ /* @__PURE__ */ jsxs18("div", { className: "flex flex-col items-start gap-0 pt-2", children: [
3888
+ /* @__PURE__ */ jsx30(Button, { type: "submit", size: "sm", disabled: isVerifying, children: isVerifying ? (_g = texts.loginSendingButton) != null ? _g : "" : (_h = texts.loginSendCodeButton) != null ? _h : "" }),
3889
+ /* @__PURE__ */ jsx30(
3890
+ Button,
3891
+ {
3892
+ type: "button",
3893
+ variant: "link",
3894
+ className: "ml-0 pl-0",
3895
+ size: "sm",
3896
+ onClick: () => {
3897
+ setIsEmailSent(true);
3898
+ },
3899
+ children: (_i = texts.loginIHaveCode) != null ? _i : ""
3900
+ }
3901
+ )
3902
+ ] })
3903
+ ] }) : /* @__PURE__ */ jsxs18(
3904
+ "form",
3905
+ {
3906
+ onSubmit: (e) => e.preventDefault(),
3907
+ className: "flex flex-col flex-1",
3908
+ children: [
3909
+ /* @__PURE__ */ jsxs18("div", { className: "space-y-2", children: [
3910
+ /* @__PURE__ */ jsx30(Label3, { children: (_j = texts.loginCodeLabel) != null ? _j : "" }),
3911
+ /* @__PURE__ */ jsx30(
3912
+ InputOTP,
3913
+ {
3914
+ maxLength: 6,
3915
+ value: code,
3916
+ onChange: handleVerifyCode,
3917
+ disabled: isVerifying,
3918
+ children: /* @__PURE__ */ jsxs18(InputOTPGroup, { children: [
3919
+ /* @__PURE__ */ jsx30(InputOTPSlot, { index: 0 }),
3920
+ /* @__PURE__ */ jsx30(InputOTPSlot, { index: 1 }),
3921
+ /* @__PURE__ */ jsx30(InputOTPSlot, { index: 2 }),
3922
+ /* @__PURE__ */ jsx30(InputOTPSlot, { index: 3 }),
3923
+ /* @__PURE__ */ jsx30(InputOTPSlot, { index: 4 }),
3924
+ /* @__PURE__ */ jsx30(InputOTPSlot, { index: 5 })
3925
+ ] })
3926
+ }
3927
+ ),
3928
+ isVerifying && /* @__PURE__ */ jsx30(Spinner, {})
3929
+ ] }),
3930
+ error && /* @__PURE__ */ jsx30(
3931
+ "div",
3932
+ {
3933
+ className: "text-sm text-destructive mt-2 mb-1",
3934
+ role: "alert",
3935
+ children: error
3936
+ }
3937
+ ),
3938
+ /* @__PURE__ */ jsx30("div", { className: "grow" }),
3939
+ /* @__PURE__ */ jsxs18("div", { className: "flex flex-col items-start gap-2 pt-2", children: [
3940
+ email.length > 0 && /* @__PURE__ */ jsx30(
3941
+ Button,
3942
+ {
3943
+ variant: "link",
3944
+ size: "sm",
3945
+ onClick: handleResendEmail,
3946
+ disabled: isVerifying,
3947
+ className: "flex-1 ml-0 pl-0",
3948
+ children: (_k = texts.loginResendCodeButton) != null ? _k : ""
3949
+ }
3950
+ ),
3951
+ /* @__PURE__ */ jsx30(
3952
+ Button,
3953
+ {
3954
+ variant: "link",
3955
+ size: "sm",
3956
+ onClick: handleChangeEmail,
3957
+ disabled: isVerifying,
3958
+ className: "flex-1 ml-0 pl-0",
3959
+ children: (_l = texts.loginChangeEmailButton) != null ? _l : ""
3960
+ }
3961
+ )
3962
+ ] })
3963
+ ]
3964
+ }
3965
+ ) })
3966
+ ] }) }) });
3967
+ }
3968
+
3969
+ // src/components/notifications/NotificationsComponentPublic.tsx
3970
+ import { useAutoAnimate as useAutoAnimate7 } from "@formkit/auto-animate/react";
3971
+ import { jsx as jsx31, jsxs as jsxs19 } from "react/jsx-runtime";
3972
+ function reducer(state, action) {
3973
+ switch (action.type) {
3974
+ case "SET_IS_LOGGED_IN": {
3975
+ return {
3976
+ ...state,
3977
+ isLoggedIn: action.value
3978
+ };
3979
+ }
3980
+ case "SET_USER_ID": {
3981
+ return {
3982
+ ...state,
3983
+ userID: action.value
3984
+ };
3985
+ }
3986
+ case "SET_LOADING": {
3987
+ return {
3988
+ ...state,
3989
+ isLoading: action.value
3990
+ };
3991
+ }
3992
+ case "SET_PUBLIC_GROUPS": {
3993
+ return {
3994
+ ...state,
3995
+ groupsProvided: action.value,
3996
+ groups: state.groups.filter(
3997
+ (group) => {
3998
+ var _a;
3999
+ return ((_a = action.value) == null ? void 0 : _a.find((g) => g.id === group.id)) != null;
4000
+ }
4001
+ )
4002
+ };
4003
+ }
4004
+ case "SET_GROUPS": {
4005
+ const isDefaultOn = state.isLoggedIn == false || state.groupsProvided != null;
4006
+ const newGroupsWithIsOn = action.value.map((group) => {
4007
+ var _a, _b, _c;
4008
+ if (state.isLoggedIn == true) {
4009
+ return group;
4010
+ }
4011
+ return {
4012
+ ...group,
4013
+ isOn: (_c = (_b = (_a = state.groupsProvided) == null ? void 0 : _a.find((g) => g.id === group.id)) == null ? void 0 : _b.isOn) != null ? _c : isDefaultOn
4014
+ };
4015
+ });
4016
+ return {
4017
+ ...state,
4018
+ groups: newGroupsWithIsOn
4019
+ };
4020
+ }
4021
+ case "TOGGLE_GROUP": {
4022
+ const updatedGroups = state.groups.map((group) => {
4023
+ if (group.id === action.groupID) {
4024
+ return {
4025
+ ...group,
4026
+ isOn: !group.isOn
4027
+ };
4028
+ }
4029
+ return group;
4030
+ });
4031
+ return {
4032
+ ...state,
4033
+ wasChanged: true,
4034
+ groups: updatedGroups
4035
+ };
4036
+ }
4037
+ case "CHECK_ALL_GROUPS": {
4038
+ const updated = state.groups.map((group) => {
4039
+ return {
4040
+ ...group,
4041
+ isOn: true
4042
+ };
4043
+ });
4044
+ return {
4045
+ ...state,
4046
+ groups: updated,
4047
+ wasChanged: true
4048
+ };
4049
+ }
4050
+ case "SET_WAS_CHANGED":
4051
+ return {
4052
+ ...state,
4053
+ wasChanged: action.value
4054
+ };
4055
+ case "SET_IS_USER_GROUPS_UPDATED":
4056
+ return {
4057
+ ...state,
4058
+ isUserGroupsUpdated: action.value
4059
+ };
4060
+ case "RESET_UPDATE_STATE":
4061
+ return {
4062
+ ...state,
4063
+ wasChanged: false,
4064
+ isUserGroupsUpdated: true
4065
+ };
4066
+ case "SHOW_SETTINGS":
4067
+ return {
4068
+ ...state,
4069
+ showSettings: true
4070
+ };
4071
+ case "HIDE_SETTINGS":
4072
+ return {
4073
+ ...state,
4074
+ showSettings: false
4075
+ };
4076
+ default:
4077
+ return state;
4078
+ }
4079
+ }
4080
+ function NotificationsComponentPublic(props) {
4081
+ var _a, _b, _c, _d;
4082
+ const [parent] = useAutoAnimate7();
4083
+ let slug = (_b = (_a = props.slug) != null ? _a : getProjectID()) != null ? _b : typeof window !== "undefined" ? window.location.hostname : "";
4084
+ const { mutateAsync: updateUserGroups2, isPending: isUpdating } = useMutation3(
4085
+ rpcProvider.notifications.updateUserGroups
4086
+ );
4087
+ const { data: userInfo, refetch: refetchAccessToken } = UQ({
4088
+ queryKey: ["notifications_accessToken"],
4089
+ queryFn: () => {
4090
+ var _a2, _b2;
4091
+ if (typeof window !== "undefined") {
4092
+ return {
4093
+ accessToken: (_a2 = localStorage.getItem("notifications_accessToken")) != null ? _a2 : void 0,
4094
+ userID: (_b2 = localStorage.getItem("notifications_userID")) != null ? _b2 : void 0
4095
+ };
4096
+ }
4097
+ return void 0;
4098
+ }
4099
+ });
4100
+ const {
4101
+ data: groupsDownloaded,
4102
+ isPending: isGroupsDownloading,
4103
+ refetch: refetchGroups
4104
+ } = useQuery4(rpcProvider.notifications.getUserGroups, {
4105
+ slug,
4106
+ accessToken: userInfo == null ? void 0 : userInfo.accessToken
4107
+ });
4108
+ const [state, dispatch] = useReducer(reducer, {
4109
+ isLoading: isGroupsDownloading,
4110
+ isUserGroupsUpdated: false,
4111
+ wasChanged: false,
4112
+ groupsProvided: props.groups,
4113
+ groups: [],
4114
+ showSettings: userInfo != null && props.isManaging == true,
4115
+ isLoggedIn: userInfo != null,
4116
+ userID: void 0
4117
+ });
4118
+ useEffect7(() => {
4119
+ dispatch({ type: "SET_LOADING", value: isUpdating || isGroupsDownloading });
4120
+ }, [isUpdating, isGroupsDownloading]);
4121
+ useEffect7(() => {
4122
+ dispatch({
4123
+ type: "SET_IS_LOGGED_IN",
4124
+ value: (userInfo == null ? void 0 : userInfo.accessToken) != null
4125
+ });
4126
+ dispatch({ type: "SET_USER_ID", value: userInfo == null ? void 0 : userInfo.userID });
4127
+ if ((userInfo == null ? void 0 : userInfo.accessToken) != null && props.isManaging == true) {
4128
+ dispatch({ type: "SHOW_SETTINGS" });
4129
+ }
4130
+ }, [userInfo, props.isManaging]);
4131
+ useEffect7(() => {
4132
+ if (groupsDownloaded == null) {
4133
+ return;
4134
+ }
4135
+ let newGroups = groupsDownloaded.groups.map((group) => {
4136
+ var _a2;
4137
+ let howOften = "rarely";
4138
+ switch (group.howOften) {
4139
+ case 0 /* RARELY */:
4140
+ howOften = "rarely";
4141
+ break;
4142
+ case 1 /* OFTEN */:
4143
+ howOften = "often";
4144
+ break;
4145
+ case 2 /* VERY_OFTEN */:
4146
+ howOften = "veryOften";
4147
+ break;
4148
+ }
4149
+ return {
4150
+ id: group.id,
4151
+ name: group.name,
4152
+ description: group.description,
4153
+ howOften,
4154
+ isOn: (_a2 = group.isOn) != null ? _a2 : void 0
4155
+ };
4156
+ });
4157
+ dispatch({ type: "SET_GROUPS", value: newGroups });
4158
+ }, [groupsDownloaded, isGroupsDownloading, props.groups]);
4159
+ const timeoutRef = useRef2(null);
4160
+ useEffect7(() => {
4161
+ dispatch({ type: "SET_PUBLIC_GROUPS", value: props.groups });
4162
+ }, [props.groups]);
4163
+ const {
4164
+ texts,
4165
+ showQRCode = false,
4166
+ showPhoneInput = false,
4167
+ hiddenGroupIds = [],
4168
+ className
4169
+ } = props;
4170
+ const mergedTexts = { ...DEFAULT_TEXTS, ...texts };
4171
+ async function updateGroups() {
4172
+ await updateUserGroups2({
4173
+ accessToken: userInfo == null ? void 0 : userInfo.accessToken,
4174
+ slug,
4175
+ userId: props.userID,
4176
+ groupIds: state.groups.filter((el) => el.isOn === true).map((el) => el.id)
4177
+ });
4178
+ dispatch({ type: "RESET_UPDATE_STATE" });
4179
+ if (timeoutRef.current) {
4180
+ clearTimeout(timeoutRef.current);
4181
+ }
4182
+ timeoutRef.current = setTimeout(() => {
4183
+ dispatch({ type: "SET_IS_USER_GROUPS_UPDATED", value: false });
4184
+ }, 2e3);
4185
+ }
4186
+ function toggleGroup(groupID) {
4187
+ dispatch({ type: "TOGGLE_GROUP", groupID });
4188
+ }
4189
+ function checkAllGroups() {
4190
+ dispatch({ type: "CHECK_ALL_GROUPS" });
4191
+ }
4192
+ function handleSettingsClick() {
4193
+ dispatch({ type: "SHOW_SETTINGS" });
4194
+ }
4195
+ function handleCloseSettings() {
4196
+ dispatch({ type: "HIDE_SETTINGS" });
4197
+ }
4198
+ function handleLogout() {
4199
+ localStorage.removeItem("notifications_accessToken");
4200
+ localStorage.removeItem("notifications_userID");
4201
+ refetchAccessToken();
4202
+ dispatch({ type: "SET_USER_ID", value: void 0 });
4203
+ dispatch({ type: "SET_IS_LOGGED_IN", value: false });
4204
+ dispatch({ type: "HIDE_SETTINGS" });
4205
+ }
4206
+ async function handleLoginSuccess(userID, accessToken) {
4207
+ if (typeof window !== "undefined") {
4208
+ localStorage.setItem("notifications_accessToken", accessToken);
4209
+ if (userID != null) {
4210
+ localStorage.setItem("notifications_userID", userID);
4211
+ }
4212
+ }
4213
+ dispatch({ type: "SET_USER_ID", value: userID });
4214
+ try {
4215
+ await refetchAccessToken();
4216
+ refetchGroups().then().catch().finally(() => {
4217
+ if (props.isManaging == true) {
4218
+ dispatch({ type: "SHOW_SETTINGS" });
4219
+ }
4220
+ });
4221
+ } catch (e) {
4222
+ console.log(`Error: ${e}`);
4223
+ }
4224
+ }
4225
+ useEffect7(() => {
4226
+ return () => {
4227
+ if (timeoutRef.current) {
4228
+ clearTimeout(timeoutRef.current);
4229
+ }
4230
+ };
4231
+ }, []);
4232
+ const isManagingEnabled = props.isManaging == true && state.userID != null && (userInfo == null ? void 0 : userInfo.accessToken) != null;
4233
+ return /* @__PURE__ */ jsxs19("main", { className: cn("bitsnap-checkout relative", className == null ? void 0 : className.container), children: [
4234
+ mergedTexts.title != null && /* @__PURE__ */ jsx31("h1", { className: "text-2xl font-semibold text-black md:text-3xl lg:text-4xl xl:text-5xl dark:text-neutral-100", children: mergedTexts.title }),
4235
+ !state.showSettings && props.isManaging && /* @__PURE__ */ jsx31(
4236
+ Button,
4237
+ {
4238
+ onClick: handleSettingsClick,
4239
+ variant: "outline",
4240
+ size: "icon",
4241
+ className: "absolute bottom-6 right-6 z-50 h-12 w-12 rounded-full shadow-lg hover:shadow-xl md:bottom-8 md:right-8",
4242
+ "aria-label": "Settings",
4243
+ children: /* @__PURE__ */ jsx31(Settings, { className: "h-5 w-5" })
4244
+ }
4245
+ ),
4246
+ /* @__PURE__ */ jsx31(
4247
+ "div",
4248
+ {
4249
+ className: cn(
4250
+ "md:pt8 relative z-0 mt-6 overflow-hidden rounded-2xl bg-white px-3 pt-6 pb-3 md:px-5 md:pb-5 dark:bg-neutral-800",
4251
+ className == null ? void 0 : className.header
4252
+ ),
4253
+ children: state.showSettings ? (
4254
+ // Settings View
4255
+ /* @__PURE__ */ jsx31("div", { className: "space-y-6", children: state.isLoggedIn && // Managing Groups View (logged in)
4256
+ /* @__PURE__ */ jsxs19(
4257
+ "div",
4258
+ {
4259
+ className: cn(
4260
+ "grid grid-cols-1 gap-3 lg:gap-6",
4261
+ isManagingEnabled ? "md:grid-cols-2" : ""
4262
+ ),
4263
+ children: [
4264
+ /* @__PURE__ */ jsxs19("div", { className: className == null ? void 0 : className.groupsContainer, children: [
4265
+ /* @__PURE__ */ jsx31(
4266
+ NotificationHeader,
4267
+ {
4268
+ projectName: props.projectName,
4269
+ projectLogo: props.projectLogo,
4270
+ projectLogoDark: props.projectLogoDark,
4271
+ description: mergedTexts.managingDescription,
4272
+ className,
4273
+ onLogout: handleLogout
4274
+ }
4275
+ ),
4276
+ isGroupsDownloading && /* @__PURE__ */ jsx31("div", { className: "flex justify-center items-center py-8", children: /* @__PURE__ */ jsx31(Spinner, {}) }),
4277
+ /* @__PURE__ */ jsx31(
4278
+ NotificationGroupsList,
4279
+ {
4280
+ groups: state.groups,
4281
+ hiddenGroupIds,
4282
+ isManaging: props.isManaging,
4283
+ onToggle: toggleGroup,
4284
+ onCheckAll: checkAllGroups,
4285
+ onUpdate: updateGroups,
4286
+ isUpdating,
4287
+ wasChanged: state.wasChanged,
4288
+ isUserGroupsUpdated: state.isUserGroupsUpdated,
4289
+ className,
4290
+ texts: mergedTexts
4291
+ }
4292
+ )
4293
+ ] }),
4294
+ isManagingEnabled && /* @__PURE__ */ jsx31(
4295
+ ManageMyData,
4296
+ {
4297
+ accessToken: (_c = userInfo.accessToken) != null ? _c : "",
4298
+ slug,
4299
+ userID: (_d = state.userID) != null ? _d : "",
4300
+ className,
4301
+ texts: mergedTexts
4302
+ }
4303
+ ),
4304
+ showQRCode != false && /* @__PURE__ */ jsx31(
4305
+ QRCodeSection,
4306
+ {
4307
+ showQRCode,
4308
+ isManaging: true,
4309
+ className,
4310
+ texts: mergedTexts
4311
+ }
4312
+ )
4313
+ ]
4314
+ }
4315
+ ) })
4316
+ ) : (
4317
+ // Default View (Form only)
4318
+ /* @__PURE__ */ jsx31("div", { className: cn("grid grid-cols-1 gap-3 lg:gap-6"), children: /* @__PURE__ */ jsx31(
4319
+ AddUserToGroups,
4320
+ {
4321
+ slug,
4322
+ onToggle: (id) => {
4323
+ dispatch({ type: "TOGGLE_GROUP", groupID: id });
4324
+ },
4325
+ onCheckAll: () => {
4326
+ dispatch({ type: "CHECK_ALL_GROUPS" });
4327
+ },
4328
+ onSuccess: (userAlreadyExists, userID, accessToken) => {
4329
+ if (accessToken != null) {
4330
+ handleLoginSuccess(userID, accessToken);
4331
+ }
4332
+ if (userAlreadyExists) {
4333
+ dispatch({ type: "SHOW_SETTINGS" });
4334
+ }
4335
+ },
4336
+ groups: state.groups,
4337
+ showPhoneInput,
4338
+ agreementText: mergedTexts.agreementText,
4339
+ className,
4340
+ texts: mergedTexts,
4341
+ wasChanged: state.wasChanged,
4342
+ isUpdating
4343
+ }
4344
+ ) })
4345
+ )
4346
+ }
4347
+ ),
4348
+ /* @__PURE__ */ jsx31(
4349
+ LoginScreen,
4350
+ {
4351
+ isOpen: state.showSettings && !state.isLoggedIn,
4352
+ slug,
4353
+ onSuccess: handleLoginSuccess,
4354
+ texts: mergedTexts,
4355
+ onClose: handleCloseSettings
4356
+ }
4357
+ )
4358
+ ] });
4359
+ }
4360
+ function Wrapper3(props) {
4361
+ return /* @__PURE__ */ jsx31(RpcProvider, { children: /* @__PURE__ */ jsx31(NotificationsComponentPublic, { ...props }) });
4362
+ }
4363
+ var NotificationsComponentPublic_default = Wrapper3;
2079
4364
  export {
2080
4365
  ApplePay_default as ApplePayButton,
2081
4366
  Bitsnap,
2082
4367
  BitsnapCart_default as BitsnapCheckout,
2083
4368
  GooglePay_default as GooglePayButton,
4369
+ NotificationsComponentPublic_default as NotificationsComponent,
2084
4370
  createCheckout,
2085
4371
  createPaymentURL,
2086
4372
  getReferenceIfPossible,