aesirx-analytics 1.2.2 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,34 @@
1
+ // src/utils/AnalyticsContextProvider.tsx
2
+ import React, { useState } from "react";
3
+ var AnalyticsContext = React.createContext({
4
+ event_uuid: void 0,
5
+ visitor_uuid: void 0,
6
+ setEventID: void 0,
7
+ setUUID: void 0
8
+ });
9
+ var AnalyticsContextProvider = ({ children }) => {
10
+ const [eventID, setEventID] = useState();
11
+ const [UUID, setUUID] = useState();
12
+ return /* @__PURE__ */ React.createElement(
13
+ AnalyticsContext.Provider,
14
+ {
15
+ value: {
16
+ event_uuid: eventID,
17
+ visitor_uuid: UUID,
18
+ setEventID,
19
+ setUUID
20
+ }
21
+ },
22
+ children
23
+ );
24
+ };
25
+ var AnalyticsContextProvider_default = AnalyticsContextProvider;
26
+
27
+ export {
28
+ AnalyticsContext,
29
+ AnalyticsContextProvider_default
30
+ };
31
+ /*
32
+ * @copyright Copyright (C) 2022 AesirX. All rights reserved.
33
+ * @license GNU General Public License version 3, see LICENSE.
34
+ */
package/dist/index.d.ts CHANGED
@@ -19,15 +19,13 @@ interface AnalyticsReact {
19
19
  }
20
20
  declare const AnalyticsReact: ({ location, history, children }: AnalyticsReact) => React.JSX.Element;
21
21
 
22
- declare const trackEvent: (endpoint: string, visitor_uuid: string, referer?: string, data?: object) => Promise<boolean>;
22
+ declare const trackEvent: (endpoint: string, referer?: string, data?: object) => Promise<boolean>;
23
23
 
24
24
  interface AnalyticsContextType {
25
+ event_uuid: string;
25
26
  visitor_uuid: string;
26
- event_uuid_start: string;
27
- visitor_uuid_start: string;
27
+ setEventID: Dispatch<SetStateAction<string>>;
28
28
  setUUID: Dispatch<SetStateAction<string>>;
29
- setEventIDStart: Dispatch<SetStateAction<string>>;
30
- setUUIDStart: Dispatch<SetStateAction<string>>;
31
29
  }
32
30
  declare const AnalyticsContext: React.Context<AnalyticsContextType>;
33
31
 
package/dist/index.js CHANGED
@@ -1 +1,276 @@
1
- import{AnalyticsContext as t,AnalyticsContextProvider_default as i}from"./chunk-D75AKWUD.js";import e,{Suspense as r}from"react";import o,{useCallback as s,useEffect as n,useState as a}from"react";var u=async(t,i)=>{const e=await fetch(t,{method:"POST",body:JSON.stringify(i),headers:(r={"Content-Type":"application/json"},o={"x-tracker-cache":void 0},Object.keys(o).forEach((t=>{void 0!==o[t]&&(r[t]=o[t])})),r)});var r,o;const s=await e.json();if(s.error)throw s.error;return s};import c from"bowser";var d=(t,i)=>`${t}/visitor/v1/${i}`,_=async(t,i,e,r)=>{const{document:o}=window,{pathname:s,search:n,origin:a}=location;i=`${a}${s}${n}`,e=o.referrer,r=window.navigator.userAgent;const _=c.parse(window.navigator.userAgent),l=_?.browser?.name,v=_?.browser?.version??"0",w=window.navigator.userLanguage||window.navigator.language,m=_?.platform?.model??_?.platform?.type,h=location?.host?.replace(/^www\./,""),p=window.location.search,f=new URLSearchParams(p),g=[];for(const t of f.keys())t.startsWith("utm_")&&f.get(t)&&g.push({name:t,value:f.get(t)});if(!f.get("visitor_uuid")){const o="";try{return await u(d(t,"init"),{url:i,referer:e,user_agent:r,ip:o,domain:h,browser_name:l,browser_version:v,lang:w,device:m,event_name:"visit",event_type:"action",attributes:g})}catch(t){}}},l=async(t,i,e)=>{if("0"===localStorage.getItem("aesirx-analytics-allow"))return null;const{location:r,document:o}=window,{pathname:s,origin:n}=r;e=e?r.protocol+"//"+r.host+e:o.referrer?f("visitor_uuid",o.referrer):`${n}${s}`;const a=r.protocol+"//"+r.host+r.pathname,c=window.location.search,_=new URLSearchParams(c);return await u(d(t,"start"),{..._.get("visitor_uuid")&&{visitor_uuid:_.get("visitor_uuid")},...i&&{visitor_uuid:i},referer:"/"===e?"":e,url:a})},v=async(t,i,e,r)=>{if("0"===localStorage.getItem("aesirx-analytics-allow"))return null;const{location:o,document:s}=window;e=e?o.protocol+"//"+o.host+e:s.referrer.split("?")[0];const n=o.protocol+"//"+o.host+o.pathname,a=window.location.search,u=new URLSearchParams(a),c={...u.get("visitor_uuid")&&{visitor_uuid:u.get("visitor_uuid")},...i&&{visitor_uuid:i},referer:"/"===e?"":e,url:n,...r},_=new Blob([JSON.stringify(c)],{type:"application/json"});return navigator.sendBeacon(d(t,"start"),_)},w=(t,i=window.location.href)=>{if(i){return new URL(i).searchParams.get(t)}},m=t=>{const i=document.getElementsByTagName("a");for(let e=0;e<i.length;e++){const r=w("visitor_uuid",i[e].href);if(i[e].href){const o=new URL(i[e].href);!r&&t&&o.searchParams.append("visitor_uuid",t),i[e].href=o.href}}},h=(t,i,e)=>{if(i&&e){const r={event_uuid:i,visitor_uuid:e},o={type:"application/json"},s=new Blob([JSON.stringify(r)],o);navigator.sendBeacon(d(t,"end"),s)}},p=t=>{document.addEventListener("visibilitychange",(async()=>{if("hidden"===document.visibilityState&&h(t,window.event_uuid_start,window.visitor_uuid_start),"visible"===document.visibilityState){if(new URLSearchParams(window.location.search).get("visitor_uuid")||window.visitor_uuid){const i=await l(t,window.visitor_uuid,window.referer);window.event_uuid_start=i?.event_uuid}}})),window.addEventListener("pagehide",(i=>{i.persisted&&h(t,window.event_uuid_start,window.visitor_uuid_start)}),!1)};function f(t,i){let e,r=i.split("?")[0],o=[];const s=-1!==i.indexOf("?")?i.split("?")[1]:"";if(""!==s){o=s.split("&");for(let i=o.length-1;i>=0;i-=1)e=o[i].split("=")[0],e===t&&o.splice(i,1);o.length&&(r=r+"?"+o.join("&"))}return r}var g=({router:i,children:e})=>{const r=o.useContext(t),u=process.env.NEXT_PUBLIC_ENDPOINT_ANALYTICS_URL,[c,d]=a(""),v=s((async t=>{const i=t||"";window.referer=i;const e=await l(u,r.visitor_uuid,i);e?.event_uuid&&r.setEventIDStart(e.event_uuid),e?.visitor_uuid&&r.setUUIDStart(e.visitor_uuid)}),[r,u]);return n((()=>{(async()=>{const t=new URLSearchParams(window.location.search).get("visitor_uuid");if(r.visitor_uuid)await v(f("visitor_uuid",i.asPath));else if(t)r.setUUID(t);else{const t=await _(u);t?.visitor_uuid&&r.setUUID(t?.visitor_uuid)}})()}),[r.visitor_uuid]),n((()=>{const t=async()=>{const{visitor_uuid:t}=i.query;t&&d(f("visitor_uuid",i.asPath)),r.visitor_uuid_start&&!t&&(h(u,window.event_uuid_start,r.visitor_uuid_start),await v(c))};i.events.on("routeChangeComplete",t);const e=new URLSearchParams(window.location.search),o=e.get("visitor_uuid"),s=e.get("state"),n=e.get("code");return o||s||n||r.visitor_uuid&&(i.asPath.includes("?")?Object.keys(i.query).length&&i.replace({query:{...i.query,visitor_uuid:r.visitor_uuid}},void 0,{shallow:!0}):i.replace({query:{...i.query,visitor_uuid:r.visitor_uuid}},void 0,{shallow:!0})),o&&m(o),()=>{i.events.off("routeChangeComplete",t)}}),[i.events,r.visitor_uuid,i.asPath,i.query]),n((()=>{(async()=>{p(u)})()}),[]),n((()=>{(async()=>{window.visitor_uuid=r.visitor_uuid,window.event_uuid_start=r.event_uuid_start,window.visitor_uuid_start=r.visitor_uuid_start})()}),[r.event_uuid_start,r.visitor_uuid_start]),o.createElement(o.Fragment,null,e)},y=e.lazy((()=>import("./Consent-4MLNPIUE.js"))),E=({router:t,children:o})=>e.createElement(e.Fragment,null,e.createElement(i,null,e.createElement(g,{router:t},o,e.createElement(r,{fallback:e.createElement(e.Fragment,null)},e.createElement(y,{endpoint:process.env.NEXT_PUBLIC_ENDPOINT_ANALYTICS_URL})))));import U,{Suspense as P}from"react";import S,{useEffect as L,useState as I}from"react";import N from"query-string";var b=({location:i,history:e,children:r})=>{const o=S.useContext(t),s=process.env.REACT_APP_ENDPOINT_ANALYTICS_URL,[n,a]=I(i.pathname);return L((()=>{(async()=>{if(o.visitor_uuid_start&&h(s,window.event_uuid_start,o.visitor_uuid_start),o.visitor_uuid){const t={...N.parse(i.search),visitor_uuid:o.visitor_uuid};e.replace({search:N.stringify(t)});const r=n||"";window.referer=r;const u=await l(s,o.visitor_uuid,r);u.event_uuid&&o.setEventIDStart(u.event_uuid),u.visitor_uuid&&o.setUUIDStart(u.visitor_uuid),a(i.pathname),m(o.visitor_uuid)}else{const t=new URLSearchParams(window.location.search).get("visitor_uuid");if(t)o.setUUID(t);else{const t=await _(s);t.visitor_uuid&&o.setUUID(t.visitor_uuid);const r={...N.parse(i.search),visitor_uuid:t.visitor_uuid};e.replace({search:N.stringify(r)})}}})()}),[i.pathname,o.visitor_uuid,e]),L((()=>{(async()=>{p(s)})()}),[]),L((()=>{(async()=>{window.visitor_uuid=o.visitor_uuid,window.event_uuid_start=o.event_uuid_start,window.visitor_uuid_start=o.visitor_uuid_start})()}),[o.visitor_uuid,o.event_uuid_start,o.visitor_uuid_start]),S.createElement(S.Fragment,null,r)},A=U.lazy((()=>import("./Consent-4MLNPIUE.js"))),C=({location:t,history:e,children:r})=>U.createElement(i,null,U.createElement(b,{location:t,history:e},r,U.createElement(P,{fallback:U.createElement(U.Fragment,null)},U.createElement(A,{endpoint:process.env.REACT_APP_ENDPOINT_ANALYTICS_URL}))));export{t as AnalyticsContext,E as AnalyticsNext,C as AnalyticsReact,v as trackEvent};
1
+ import {
2
+ AnalyticsContext,
3
+ AnalyticsContextProvider_default
4
+ } from "./chunk-JQ6CXYV4.js";
5
+
6
+ // src/AnalyticsNext/index.tsx
7
+ import React2 from "react";
8
+
9
+ // src/AnalyticsNext/handle.tsx
10
+ import React, { useCallback, useEffect, useState } from "react";
11
+
12
+ // src/utils/services.ts
13
+ var cache;
14
+ var assign = (a, b) => {
15
+ Object.keys(b).forEach((key) => {
16
+ if (b[key] !== void 0)
17
+ a[key] = b[key];
18
+ });
19
+ return a;
20
+ };
21
+ var trackerService = async (endpoint, payload) => {
22
+ const fetchData = await fetch(endpoint, {
23
+ method: "POST",
24
+ body: JSON.stringify(payload),
25
+ headers: assign({ "Content-Type": "application/json" }, { ["x-tracker-cache"]: cache })
26
+ });
27
+ const response = await fetchData.json();
28
+ if (response.error) {
29
+ throw response.error;
30
+ } else {
31
+ return response;
32
+ }
33
+ };
34
+
35
+ // src/utils/index.ts
36
+ import Bowser from "bowser";
37
+ import * as FingerprintJS from "@fingerprintjs/fingerprintjs";
38
+ var createRequest = (endpoint, task) => {
39
+ return `${endpoint}/visitor/v1/${task}`;
40
+ };
41
+ var createRequestV2 = (endpoint, task) => {
42
+ return `${endpoint}/visitor/v2/${task}`;
43
+ };
44
+ var startTracker = async (endpoint, url, referer, user_agent) => {
45
+ const allow = sessionStorage.getItem("aesirx-analytics-allow");
46
+ if (allow === "0") {
47
+ return null;
48
+ }
49
+ const { location, document: document2 } = window;
50
+ const { pathname, search, origin } = location;
51
+ url = `${origin}${pathname}${search}`;
52
+ referer = referer ? location.protocol + "//" + location.host + referer : document2.referrer ? document2.referrer : "";
53
+ user_agent = window.navigator.userAgent;
54
+ const browser = Bowser.parse(window.navigator.userAgent);
55
+ const browser_name = browser?.browser?.name;
56
+ const browser_version = browser?.browser?.version ?? "0";
57
+ const lang = window.navigator["userLanguage"] || window.navigator.language;
58
+ const device = browser?.platform?.model ?? browser?.platform?.type;
59
+ const queryString = window.location.search;
60
+ const urlParams = new URLSearchParams(queryString);
61
+ const ip = "";
62
+ const fpPromise = FingerprintJS.load({ monitoring: false });
63
+ try {
64
+ const responseStart = fpPromise.then((fp) => fp.get()).then(async (result) => {
65
+ const fingerprint = result.visitorId;
66
+ const attributes = [];
67
+ for (const key of urlParams.keys()) {
68
+ if (key.startsWith("utm_")) {
69
+ urlParams.get(key) && attributes.push({ name: key, value: urlParams.get(key) });
70
+ }
71
+ }
72
+ return await trackerService(createRequestV2(endpoint, "start"), {
73
+ fingerprint,
74
+ url,
75
+ ...referer && referer !== url && {
76
+ referer
77
+ },
78
+ user_agent,
79
+ ip,
80
+ browser_name,
81
+ browser_version,
82
+ lang,
83
+ device,
84
+ ...attributes?.length && {
85
+ event_name: "visit",
86
+ event_type: "action",
87
+ attributes
88
+ }
89
+ });
90
+ });
91
+ return responseStart;
92
+ } catch (error) {
93
+ }
94
+ };
95
+ var trackEvent = async (endpoint, referer, data) => {
96
+ const allow = sessionStorage.getItem("aesirx-analytics-allow");
97
+ if (allow === "0") {
98
+ return null;
99
+ }
100
+ const { location, document: document2 } = window;
101
+ referer = referer ? location.protocol + "//" + location.host + referer : document2.referrer.split("?")[0];
102
+ const url = location.protocol + "//" + location.host + location.pathname;
103
+ const user_agent = window.navigator.userAgent;
104
+ const browser = Bowser.parse(window.navigator.userAgent);
105
+ const browser_name = browser?.browser?.name;
106
+ const browser_version = browser?.browser?.version ?? "0";
107
+ const lang = window.navigator["userLanguage"] || window.navigator.language;
108
+ const device = browser?.platform?.model ?? browser?.platform?.type;
109
+ const ip = "";
110
+ const fpPromise = FingerprintJS.load({ monitoring: false });
111
+ const body = fpPromise.then((fp) => fp.get()).then(async (result) => {
112
+ const fingerprint = result.visitorId;
113
+ return {
114
+ fingerprint,
115
+ url,
116
+ ...referer !== "/" && referer && {
117
+ referer
118
+ },
119
+ user_agent,
120
+ ip,
121
+ browser_name,
122
+ browser_version,
123
+ lang,
124
+ device,
125
+ ...data
126
+ };
127
+ });
128
+ const headers = { type: "application/json" };
129
+ const blob = new Blob([JSON.stringify(body)], headers);
130
+ const responseStart = navigator.sendBeacon(createRequestV2(endpoint, "start"), blob);
131
+ return responseStart;
132
+ };
133
+ var endTracker = (endPoint, event_uuid, visitor_uuid) => {
134
+ if (event_uuid && visitor_uuid) {
135
+ const body = {
136
+ event_uuid,
137
+ visitor_uuid
138
+ };
139
+ const headers = { type: "application/json" };
140
+ const blob = new Blob([JSON.stringify(body)], headers);
141
+ navigator.sendBeacon(createRequest(endPoint, "end"), blob);
142
+ }
143
+ };
144
+ var endTrackerVisibilityState = (endPoint) => {
145
+ document.addEventListener("visibilitychange", async () => {
146
+ if (document.visibilityState === "hidden") {
147
+ endTracker(endPoint, window["event_uuid"], window["visitor_uuid"]);
148
+ }
149
+ if (document.visibilityState === "visible") {
150
+ const response = await startTracker(endPoint);
151
+ window["event_uuid"] = response?.event_uuid;
152
+ }
153
+ });
154
+ window.addEventListener(
155
+ "pagehide",
156
+ (event) => {
157
+ if (event.persisted) {
158
+ endTracker(endPoint, window["event_uuid"], window["visitor_uuid"]);
159
+ }
160
+ },
161
+ false
162
+ );
163
+ };
164
+
165
+ // src/AnalyticsNext/handle.tsx
166
+ var AnalyticsHandle = ({ router, children }) => {
167
+ const AnalyticsStore = React.useContext(AnalyticsContext);
168
+ const endPoint = process.env.NEXT_PUBLIC_ENDPOINT_ANALYTICS_URL;
169
+ const [prevRoute, setPrevRoute] = useState("");
170
+ const handleStartTracker = useCallback(
171
+ async (prevRoute2) => {
172
+ const referer = prevRoute2 ? prevRoute2 : "";
173
+ window["referer"] = referer;
174
+ const responseStart = await startTracker(endPoint, "", referer);
175
+ responseStart?.event_uuid && AnalyticsStore.setEventID(responseStart.event_uuid);
176
+ responseStart?.visitor_uuid && AnalyticsStore.setUUID(responseStart.visitor_uuid);
177
+ },
178
+ [AnalyticsStore, endPoint]
179
+ );
180
+ useEffect(() => {
181
+ const init = async () => {
182
+ if (!AnalyticsStore.visitor_uuid) {
183
+ await handleStartTracker(router.asPath);
184
+ }
185
+ };
186
+ init();
187
+ }, [AnalyticsStore.visitor_uuid]);
188
+ useEffect(() => {
189
+ const handleRouteChange = async () => {
190
+ setPrevRoute(router.asPath);
191
+ if (AnalyticsStore.visitor_uuid) {
192
+ endTracker(endPoint, window["event_uuid"], AnalyticsStore.visitor_uuid);
193
+ await handleStartTracker(prevRoute);
194
+ }
195
+ };
196
+ router.events.on("routeChangeComplete", handleRouteChange);
197
+ return () => {
198
+ router.events.off("routeChangeComplete", handleRouteChange);
199
+ };
200
+ }, [router.events, router.asPath, router.query]);
201
+ useEffect(() => {
202
+ const init = async () => {
203
+ endTrackerVisibilityState(endPoint);
204
+ };
205
+ init();
206
+ }, []);
207
+ useEffect(() => {
208
+ const init = async () => {
209
+ window["event_uuid"] = AnalyticsStore.event_uuid;
210
+ window["visitor_uuid"] = AnalyticsStore.visitor_uuid;
211
+ };
212
+ init();
213
+ }, [AnalyticsStore.event_uuid, AnalyticsStore.visitor_uuid]);
214
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, children);
215
+ };
216
+ var handle_default = AnalyticsHandle;
217
+
218
+ // src/AnalyticsNext/index.tsx
219
+ import dynamic from "next/dynamic";
220
+ var ConsentComponent = dynamic(() => import("./Consent-6SCX7LT4.js"), { ssr: false });
221
+ var AnalyticsNext = ({ router, children }) => {
222
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(AnalyticsContextProvider_default, null, /* @__PURE__ */ React2.createElement(handle_default, { router }, children, process.env.NEXT_PUBLIC_DISABLE_ANALYTICS_CONSENT !== "true" && /* @__PURE__ */ React2.createElement(ConsentComponent, { endpoint: process.env.NEXT_PUBLIC_ENDPOINT_ANALYTICS_URL }))));
223
+ };
224
+ var AnalyticsNext_default = AnalyticsNext;
225
+
226
+ // src/AnalyticsReact/index.tsx
227
+ import React4, { Suspense } from "react";
228
+
229
+ // src/AnalyticsReact/handle.tsx
230
+ import React3, { useEffect as useEffect2 } from "react";
231
+ var AnalyticsHandle2 = ({ location, history, children }) => {
232
+ const AnalyticsStore = React3.useContext(AnalyticsContext);
233
+ const endPoint = process.env.REACT_APP_ENDPOINT_ANALYTICS_URL;
234
+ useEffect2(() => {
235
+ const init = async () => {
236
+ if (!AnalyticsStore.visitor_uuid) {
237
+ const referer = location.pathname ? location.pathname : "";
238
+ window["referer"] = referer;
239
+ const responseStart = await startTracker(endPoint, "", referer);
240
+ responseStart.event_uuid && AnalyticsStore.setEventID(responseStart.event_uuid);
241
+ responseStart.visitor_uuid && AnalyticsStore.setUUID(responseStart.visitor_uuid);
242
+ } else {
243
+ endTracker(endPoint, window["event_uuid"], AnalyticsStore.visitor_uuid);
244
+ }
245
+ };
246
+ init();
247
+ }, [location.pathname, history]);
248
+ useEffect2(() => {
249
+ const init = async () => {
250
+ endTrackerVisibilityState(endPoint);
251
+ };
252
+ init();
253
+ }, []);
254
+ useEffect2(() => {
255
+ const init = async () => {
256
+ window["event_uuid"] = AnalyticsStore.event_uuid;
257
+ window["visitor_uuid"] = AnalyticsStore.visitor_uuid;
258
+ };
259
+ init();
260
+ }, [AnalyticsStore.event_uuid, AnalyticsStore.visitor_uuid]);
261
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, children);
262
+ };
263
+ var handle_default2 = AnalyticsHandle2;
264
+
265
+ // src/AnalyticsReact/index.tsx
266
+ var ConsentComponent2 = React4.lazy(() => import("./Consent-6SCX7LT4.js"));
267
+ var AnalyticsReact = ({ location, history, children }) => {
268
+ return /* @__PURE__ */ React4.createElement(AnalyticsContextProvider_default, null, /* @__PURE__ */ React4.createElement(handle_default2, { location, history }, children, process.env.REACT_APP_DISABLE_ANALYTICS_CONSENT !== "true" && /* @__PURE__ */ React4.createElement(Suspense, { fallback: /* @__PURE__ */ React4.createElement(React4.Fragment, null) }, /* @__PURE__ */ React4.createElement(ConsentComponent2, { endpoint: process.env.REACT_APP_ENDPOINT_ANALYTICS_URL }))));
269
+ };
270
+ var AnalyticsReact_default = AnalyticsReact;
271
+ export {
272
+ AnalyticsContext,
273
+ AnalyticsNext_default as AnalyticsNext,
274
+ AnalyticsReact_default as AnalyticsReact,
275
+ trackEvent
276
+ };
package/package.json CHANGED
@@ -1,16 +1,19 @@
1
1
  {
2
2
  "name": "aesirx-analytics",
3
- "version": "1.2.2",
3
+ "version": "2.0.1",
4
4
  "license": "GPL-3.0-only",
5
5
  "author": "AesirX",
6
6
  "repository": "https://gitlab.redweb.dk/aesirx/analytics",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
9
+ "types": "dist/index.d.ts",
9
10
  "type": "module",
10
11
  "dependencies": {
11
12
  "@concordium/browser-wallet-api-helpers": "^2",
13
+ "@concordium/react-components": "^0.3.0",
12
14
  "@concordium/web-sdk": "^6",
13
- "aesirx-sso": "^1.1.1",
15
+ "@fingerprintjs/fingerprintjs": "^3.4.2",
16
+ "aesirx-sso": "^1.2.1",
14
17
  "axios": "^1.4.0",
15
18
  "bootstrap": "^5.3.0",
16
19
  "bowser": "^2.11.0",
@@ -20,11 +23,12 @@
20
23
  "react": "18",
21
24
  "react-bootstrap": "^2.8.0",
22
25
  "react-content-loader": "^6.2.1",
26
+ "react-device-detect": "^2.2.3",
23
27
  "react-dom": "18",
24
28
  "react-toastify": "^9.1.3"
25
29
  },
26
30
  "scripts": {
27
- "dev": "NODE_ENV=development tsup --watch --onSuccess 'yalc push --changed --no-scripts'",
31
+ "dev": "tsup --watch --onSuccess 'yalc push --changed --no-scripts'",
28
32
  "build": "tsup",
29
33
  "lint": "eslint --fix \"src/**/\"",
30
34
  "lint:check": "eslint \"src/**/\"",
@@ -62,6 +66,7 @@
62
66
  "@types/react-dom": "^18.2.4",
63
67
  "@typescript-eslint/eslint-plugin": "^5.57.0",
64
68
  "@typescript-eslint/parser": "^5.57.0",
69
+ "@walletconnect/types": "^2.9.1",
65
70
  "dotenv": "^16.0.3",
66
71
  "esbuild-plugin-inline-image": "^0.0.9",
67
72
  "esbuild-sass-plugin": "^2.10.0",
@@ -72,7 +77,6 @@
72
77
  "jest-environment-jsdom": "^29.4.3",
73
78
  "node-fetch": "^3.3.1",
74
79
  "prettier": "^2.8.4",
75
- "terser": "^5.19.0",
76
80
  "ts-jest": "^29.0.5",
77
81
  "tsup": "^6.7.0",
78
82
  "typescript": "^5.0.3"