strapi-plugin-magic-sessionmanager 4.0.0 → 4.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.
Files changed (33) hide show
  1. package/admin/src/components/LicenseGuard.jsx +6 -6
  2. package/admin/src/components/SessionDetailModal.jsx +12 -12
  3. package/admin/src/components/SessionInfoCard.jsx +3 -3
  4. package/admin/src/components/SessionInfoPanel.jsx +3 -2
  5. package/admin/src/pages/Analytics.jsx +2 -2
  6. package/admin/src/pages/HomePage.jsx +11 -14
  7. package/admin/src/pages/License.jsx +2 -2
  8. package/admin/src/pages/Settings.jsx +24 -24
  9. package/admin/src/pages/SettingsNew.jsx +21 -21
  10. package/admin/src/utils/parseUserAgent.js +6 -6
  11. package/dist/_chunks/{Analytics-ioaeEh-E.js → Analytics-BBdv1I5y.js} +4 -4
  12. package/dist/_chunks/{Analytics-mYu_uGwU.mjs → Analytics-Dv9f_0eZ.mjs} +4 -4
  13. package/dist/_chunks/{App-BXpIS12l.mjs → App-CIQ-7sa7.mjs} +26 -31
  14. package/dist/_chunks/{App-DdnUYWbC.js → App-CJaZPNjt.js} +26 -31
  15. package/dist/_chunks/{License-DZYrOgcx.js → License-D24rgaZQ.js} +3 -3
  16. package/dist/_chunks/{License-C03C2j9P.mjs → License-nrmFxoBm.mjs} +3 -3
  17. package/dist/_chunks/{Settings-C6_CqpCC.js → Settings-CqxgjU0y.js} +26 -26
  18. package/dist/_chunks/{Settings-0ocB3qHk.mjs → Settings-D5dLEGc_.mjs} +26 -26
  19. package/dist/_chunks/{index-DBRS3kt5.mjs → index-Duk1_Wrz.mjs} +12 -12
  20. package/dist/_chunks/{index-DC8Y0qxx.js → index-WH04CS1c.js} +12 -12
  21. package/dist/_chunks/{useLicense-qgGfMvse.js → useLicense-BwOlCyhc.js} +1 -1
  22. package/dist/_chunks/{useLicense-DSLL9n3Y.mjs → useLicense-Ce8GaxB0.mjs} +1 -1
  23. package/dist/admin/index.js +1 -1
  24. package/dist/admin/index.mjs +1 -1
  25. package/dist/server/index.js +142 -33
  26. package/dist/server/index.mjs +142 -33
  27. package/package.json +1 -1
  28. package/server/src/bootstrap.js +76 -4
  29. package/server/src/controllers/session.js +59 -9
  30. package/server/src/middlewares/last-seen.js +5 -4
  31. package/server/src/routes/content-api.js +11 -2
  32. package/server/src/services/notifications.js +10 -10
  33. package/server/src/services/session.js +24 -4
@@ -7,7 +7,7 @@ export const parseUserAgent = (userAgent) => {
7
7
  if (!userAgent) {
8
8
  return {
9
9
  device: 'Unknown',
10
- deviceIcon: '',
10
+ deviceIcon: 'question',
11
11
  browser: 'Unknown',
12
12
  os: 'Unknown',
13
13
  };
@@ -17,14 +17,14 @@ export const parseUserAgent = (userAgent) => {
17
17
 
18
18
  // Device detection
19
19
  let device = 'Desktop';
20
- let deviceIcon = '💻';
20
+ let deviceIcon = 'desktop';
21
21
 
22
22
  if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(userAgent)) {
23
23
  device = 'Tablet';
24
- deviceIcon = '📱';
24
+ deviceIcon = 'tablet';
25
25
  } else if (/Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(userAgent)) {
26
26
  device = 'Mobile';
27
- deviceIcon = '📱';
27
+ deviceIcon = 'mobile';
28
28
  }
29
29
 
30
30
  // Browser detection
@@ -45,11 +45,11 @@ export const parseUserAgent = (userAgent) => {
45
45
  device = 'API Client';
46
46
  } else if (ua.includes('postman')) {
47
47
  browser = 'Postman';
48
- deviceIcon = '📮';
48
+ deviceIcon = 'code';
49
49
  device = 'API Client';
50
50
  } else if (ua.includes('insomnia')) {
51
51
  browser = 'Insomnia';
52
- deviceIcon = '🌙';
52
+ deviceIcon = 'code';
53
53
  device = 'API Client';
54
54
  }
55
55
 
@@ -6,8 +6,8 @@ const admin = require("@strapi/strapi/admin");
6
6
  const styled = require("styled-components");
7
7
  const designSystem = require("@strapi/design-system");
8
8
  const icons = require("@strapi/icons");
9
- const index = require("./index-DC8Y0qxx.js");
10
- const useLicense = require("./useLicense-qgGfMvse.js");
9
+ const index = require("./index-WH04CS1c.js");
10
+ const useLicense = require("./useLicense-BwOlCyhc.js");
11
11
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
12
12
  const styled__default = /* @__PURE__ */ _interopDefault(styled);
13
13
  const theme = {
@@ -428,7 +428,7 @@ const AnalyticsPage = () => {
428
428
  display: "block",
429
429
  textShadow: "0 2px 4px rgba(0, 0, 0, 0.1)"
430
430
  },
431
- children: "📊 Analytics Dashboard"
431
+ children: "Analytics Dashboard"
432
432
  }
433
433
  ),
434
434
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -471,7 +471,7 @@ const AnalyticsPage = () => {
471
471
  e.currentTarget.style.transform = "translateY(0) scale(1)";
472
472
  e.currentTarget.style.boxShadow = "0 6px 16px rgba(245, 158, 11, 0.4)";
473
473
  },
474
- children: "Upgrade to Premium"
474
+ children: "Upgrade to Premium"
475
475
  }
476
476
  )
477
477
  ] })
@@ -4,8 +4,8 @@ import { useFetchClient } from "@strapi/strapi/admin";
4
4
  import styled, { css, keyframes } from "styled-components";
5
5
  import { Loader, Typography, Box, Flex, Badge } from "@strapi/design-system";
6
6
  import { ChartBubble, Crown, User, Clock, Monitor } from "@strapi/icons";
7
- import { a as pluginId } from "./index-DBRS3kt5.mjs";
8
- import { u as useLicense } from "./useLicense-DSLL9n3Y.mjs";
7
+ import { a as pluginId } from "./index-Duk1_Wrz.mjs";
8
+ import { u as useLicense } from "./useLicense-Ce8GaxB0.mjs";
9
9
  const theme = {
10
10
  colors: {
11
11
  primary: { 100: "#E0F2FE", 500: "#0EA5E9", 600: "#0284C7" },
@@ -424,7 +424,7 @@ const AnalyticsPage = () => {
424
424
  display: "block",
425
425
  textShadow: "0 2px 4px rgba(0, 0, 0, 0.1)"
426
426
  },
427
- children: "📊 Analytics Dashboard"
427
+ children: "Analytics Dashboard"
428
428
  }
429
429
  ),
430
430
  /* @__PURE__ */ jsx(
@@ -467,7 +467,7 @@ const AnalyticsPage = () => {
467
467
  e.currentTarget.style.transform = "translateY(0) scale(1)";
468
468
  e.currentTarget.style.boxShadow = "0 6px 16px rgba(245, 158, 11, 0.4)";
469
469
  },
470
- children: "Upgrade to Premium"
470
+ children: "Upgrade to Premium"
471
471
  }
472
472
  )
473
473
  ] })
@@ -4,8 +4,8 @@ import { useFetchClient, useNotification } from "@strapi/strapi/admin";
4
4
  import styled, { css, keyframes } from "styled-components";
5
5
  import { Modal, Flex, Box, Typography, Badge, Divider, Button, Loader, SingleSelect, SingleSelectOption, Thead, Tr, Th, Tbody, Td, Table, TextInput } from "@strapi/design-system";
6
6
  import { Check, Information, Monitor, Server, Clock, Cross, Earth, Shield, Crown, Phone, Download, User, Eye, Trash, Search, Key } from "@strapi/icons";
7
- import { p as parseUserAgent, a as pluginId } from "./index-DBRS3kt5.mjs";
8
- import { u as useLicense } from "./useLicense-DSLL9n3Y.mjs";
7
+ import { p as parseUserAgent, a as pluginId } from "./index-Duk1_Wrz.mjs";
8
+ import { u as useLicense } from "./useLicense-Ce8GaxB0.mjs";
9
9
  import { useNavigate } from "react-router-dom";
10
10
  const TwoColumnGrid = styled.div`
11
11
  display: grid;
@@ -54,7 +54,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
54
54
  } catch (err) {
55
55
  console.error("[SessionDetailModal] Error fetching geolocation:", err);
56
56
  setGeoData({
57
- country_flag: "🌍",
57
+ country_flag: "",
58
58
  country: "Unknown",
59
59
  city: "Unknown",
60
60
  timezone: "Unknown",
@@ -68,7 +68,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
68
68
  }
69
69
  };
70
70
  const premiumData = geoData || {
71
- country_flag: "🌍",
71
+ country_flag: "",
72
72
  country: "Loading...",
73
73
  city: "Loading...",
74
74
  timezone: "Loading...",
@@ -149,20 +149,20 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
149
149
  textColor: "neutral0",
150
150
  size: "M",
151
151
  style: { fontSize: "14px", padding: "8px 20px", fontWeight: "600" },
152
- children: isOnline ? "🟢 ONLINE" : "OFFLINE"
152
+ children: isOnline ? "ONLINE" : "OFFLINE"
153
153
  }
154
154
  ) }),
155
155
  /* @__PURE__ */ jsx(Divider, { style: { marginBottom: "24px" } }),
156
156
  /* @__PURE__ */ jsxs(TwoColumnGrid, { children: [
157
157
  /* @__PURE__ */ jsxs(Box, { children: [
158
158
  /* @__PURE__ */ jsxs(Section, { children: [
159
- /* @__PURE__ */ jsx(SectionTitle, { children: "👤 User" }),
159
+ /* @__PURE__ */ jsx(SectionTitle, { children: "User" }),
160
160
  /* @__PURE__ */ jsx(DetailRow, { compact: true, icon: Check, label: "Username", value: session.user?.username || "N/A" }),
161
161
  /* @__PURE__ */ jsx(DetailRow, { compact: true, icon: Information, label: "Email", value: session.user?.email || "N/A" }),
162
162
  /* @__PURE__ */ jsx(DetailRow, { compact: true, icon: Information, label: "User ID", value: session.user?.id || "N/A" })
163
163
  ] }),
164
164
  /* @__PURE__ */ jsxs(Section, { children: [
165
- /* @__PURE__ */ jsx(SectionTitle, { children: "💻 Device" }),
165
+ /* @__PURE__ */ jsx(SectionTitle, { children: "Device" }),
166
166
  /* @__PURE__ */ jsx(DetailRow, { compact: true, icon: DeviceIcon, label: "Device", value: deviceInfo.device }),
167
167
  /* @__PURE__ */ jsx(DetailRow, { compact: true, icon: Monitor, label: "Browser", value: `${deviceInfo.browser} ${deviceInfo.browserVersion || ""}` }),
168
168
  /* @__PURE__ */ jsx(DetailRow, { compact: true, icon: Server, label: "OS", value: deviceInfo.os }),
@@ -170,7 +170,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
170
170
  ] })
171
171
  ] }),
172
172
  /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(Section, { children: [
173
- /* @__PURE__ */ jsx(SectionTitle, { children: "⏱️ Timeline" }),
173
+ /* @__PURE__ */ jsx(SectionTitle, { children: "Timeline" }),
174
174
  /* @__PURE__ */ jsx(
175
175
  DetailRow,
176
176
  {
@@ -225,7 +225,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
225
225
  ] }) })
226
226
  ] }),
227
227
  isPremium ? /* @__PURE__ */ jsxs(Section, { children: [
228
- /* @__PURE__ */ jsx(SectionTitle, { children: "🌍 Location & Security" }),
228
+ /* @__PURE__ */ jsx(SectionTitle, { children: "Location and Security" }),
229
229
  geoLoading ? /* @__PURE__ */ jsx(Box, { padding: 4, style: { textAlign: "center" }, children: /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: "Loading location data..." }) }) : /* @__PURE__ */ jsxs(TwoColumnGrid, { children: [
230
230
  /* @__PURE__ */ jsxs(Box, { children: [
231
231
  /* @__PURE__ */ jsx(
@@ -234,7 +234,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
234
234
  compact: true,
235
235
  icon: Earth,
236
236
  label: "Country",
237
- value: `${premiumData.country_flag || "🌍"} ${premiumData.country}`
237
+ value: `${premiumData.country_flag || ""} ${premiumData.country}`.trim()
238
238
  }
239
239
  ),
240
240
  /* @__PURE__ */ jsx(DetailRow, { compact: true, icon: Earth, label: "City", value: premiumData.city }),
@@ -256,7 +256,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
256
256
  compact: true,
257
257
  icon: Shield,
258
258
  label: "VPN",
259
- value: premiumData.isVpn ? "⚠️ Yes" : "No"
259
+ value: premiumData.isVpn ? "[WARNING] Yes" : "No"
260
260
  }
261
261
  ),
262
262
  /* @__PURE__ */ jsx(
@@ -265,7 +265,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
265
265
  compact: true,
266
266
  icon: Shield,
267
267
  label: "Proxy",
268
- value: premiumData.isProxy ? "⚠️ Yes" : "No"
268
+ value: premiumData.isProxy ? "[WARNING] Yes" : "No"
269
269
  }
270
270
  )
271
271
  ] })
@@ -282,7 +282,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
282
282
  },
283
283
  children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "center", gap: 3, children: [
284
284
  /* @__PURE__ */ jsx(Crown, { style: { width: "40px", height: "40px", color: "#d97706" } }),
285
- /* @__PURE__ */ jsx(Typography, { variant: "beta", style: { color: "#92400e", fontWeight: "700" }, children: "🌍 Location & Security Analysis" }),
285
+ /* @__PURE__ */ jsx(Typography, { variant: "beta", style: { color: "#92400e", fontWeight: "700" }, children: "Location and Security Analysis" }),
286
286
  /* @__PURE__ */ jsx(Typography, { variant: "omega", style: { color: "#78350f", fontSize: "14px", lineHeight: "1.6" }, children: "Unlock premium features to get IP geolocation, security scoring, and VPN/Proxy detection for every session" }),
287
287
  /* @__PURE__ */ jsx(
288
288
  Button,
@@ -306,7 +306,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
306
306
  ) }),
307
307
  /* @__PURE__ */ jsxs(Section, { children: [
308
308
  /* @__PURE__ */ jsxs(Flex, { justifyContent: "space-between", alignItems: "center", style: { marginBottom: "12px" }, children: [
309
- /* @__PURE__ */ jsx(SectionTitle, { style: { marginBottom: 0, paddingBottom: 0, border: "none" }, children: "🔧 Technical Details" }),
309
+ /* @__PURE__ */ jsx(SectionTitle, { style: { marginBottom: 0, paddingBottom: 0, border: "none" }, children: "Technical Details" }),
310
310
  /* @__PURE__ */ jsx(
311
311
  Button,
312
312
  {
@@ -805,7 +805,7 @@ const HomePage = () => {
805
805
  }
806
806
  };
807
807
  const handleDeleteSession = async (sessionId) => {
808
- if (!confirm("⚠️ WARNING: This will PERMANENTLY delete this session from the database!\n\nThis action cannot be undone.\n\nAre you sure?")) {
808
+ if (!confirm("[WARNING] This will PERMANENTLY delete this session from the database!\n\nThis action cannot be undone.\n\nAre you sure?")) {
809
809
  return;
810
810
  }
811
811
  try {
@@ -1044,7 +1044,7 @@ const HomePage = () => {
1044
1044
  ] }),
1045
1045
  loading && /* @__PURE__ */ jsx(Flex, { justifyContent: "center", padding: 8, children: /* @__PURE__ */ jsx(Loader, { children: "Loading sessions..." }) }),
1046
1046
  !loading && sessions.length > 0 && /* @__PURE__ */ jsxs(Box, { children: [
1047
- /* @__PURE__ */ jsx(Box, { style: { marginBottom: theme.spacing.md }, children: /* @__PURE__ */ jsx(Typography, { variant: "delta", style: { marginBottom: theme.spacing.md, color: theme.colors.neutral[700] }, children: "📊 All Sessions" }) }),
1047
+ /* @__PURE__ */ jsx(Box, { style: { marginBottom: theme.spacing.md }, children: /* @__PURE__ */ jsx(Typography, { variant: "delta", style: { marginBottom: theme.spacing.md, color: theme.colors.neutral[700] }, children: "All Sessions" }) }),
1048
1048
  /* @__PURE__ */ jsxs(FilterBar, { children: [
1049
1049
  /* @__PURE__ */ jsxs(SearchInputWrapper, { children: [
1050
1050
  /* @__PURE__ */ jsx(SearchIcon, {}),
@@ -1067,10 +1067,10 @@ const HomePage = () => {
1067
1067
  size: "S",
1068
1068
  children: [
1069
1069
  /* @__PURE__ */ jsx(SingleSelectOption, { value: "all", children: "All Sessions" }),
1070
- /* @__PURE__ */ jsx(SingleSelectOption, { value: "active", children: "🟢 Active (< 15 min)" }),
1071
- /* @__PURE__ */ jsx(SingleSelectOption, { value: "idle", children: "🟡 Idle (> 15 min)" }),
1072
- /* @__PURE__ */ jsx(SingleSelectOption, { value: "loggedout", children: "🔴 Logged Out" }),
1073
- /* @__PURE__ */ jsx(SingleSelectOption, { value: "terminated", children: "Terminated" })
1070
+ /* @__PURE__ */ jsx(SingleSelectOption, { value: "active", children: "Active (less than 15 min)" }),
1071
+ /* @__PURE__ */ jsx(SingleSelectOption, { value: "idle", children: "Idle (more than 15 min)" }),
1072
+ /* @__PURE__ */ jsx(SingleSelectOption, { value: "loggedout", children: "Logged Out" }),
1073
+ /* @__PURE__ */ jsx(SingleSelectOption, { value: "terminated", children: "Terminated" })
1074
1074
  ]
1075
1075
  }
1076
1076
  ) }),
@@ -1116,26 +1116,26 @@ const HomePage = () => {
1116
1116
  active: {
1117
1117
  bg: theme.colors.success[50],
1118
1118
  badgeColor: "success600",
1119
- label: "🟢 Active",
1119
+ label: "Active",
1120
1120
  indicator: true
1121
1121
  },
1122
1122
  idle: {
1123
1123
  bg: theme.colors.warning[50],
1124
1124
  badgeColor: "warning600",
1125
- label: "🟡 Idle",
1125
+ label: "Idle",
1126
1126
  indicator: false
1127
1127
  },
1128
1128
  loggedout: {
1129
1129
  bg: theme.colors.danger[50],
1130
1130
  badgeColor: "danger600",
1131
- label: "🔴 Logged Out",
1131
+ label: "Logged Out",
1132
1132
  indicator: false,
1133
1133
  opacity: 0.7
1134
1134
  },
1135
1135
  terminated: {
1136
1136
  bg: theme.colors.neutral[100],
1137
1137
  badgeColor: "neutral600",
1138
- label: "Terminated",
1138
+ label: "Terminated",
1139
1139
  indicator: false,
1140
1140
  opacity: 0.6
1141
1141
  }
@@ -1349,7 +1349,6 @@ const HomePage = () => {
1349
1349
  }
1350
1350
  }
1351
1351
  ),
1352
- /* @__PURE__ */ jsx(FloatingEmoji, { children: "💻" }),
1353
1352
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "center", gap: 6, style: { position: "relative", zIndex: 1 }, children: [
1354
1353
  /* @__PURE__ */ jsx(
1355
1354
  Box,
@@ -1755,7 +1754,7 @@ const LicenseGuard = ({ children }) => {
1755
1754
  border: "2px solid #BAE6FD",
1756
1755
  width: "100%"
1757
1756
  },
1758
- children: /* @__PURE__ */ jsx(Typography, { variant: "omega", style: { fontSize: "13px", lineHeight: "1.6" }, children: useExistingKey ? "🔑 Enter your email and license key to activate." : useAutoCreate && adminUser && adminUser.email ? `✨ Click "Activate" to auto-create a license with your account (${adminUser.email})` : useAutoCreate ? 'Click "Activate" to auto-create a license with your admin account' : "💡 A license will be created with the details below." })
1757
+ children: /* @__PURE__ */ jsx(Typography, { variant: "omega", style: { fontSize: "13px", lineHeight: "1.6" }, children: useExistingKey ? "Enter your email and license key to activate." : useAutoCreate && adminUser && adminUser.email ? `Click "Activate" to auto-create a license with your account (${adminUser.email})` : useAutoCreate ? 'Click "Activate" to auto-create a license with your admin account' : "A license will be created with the details below." })
1759
1758
  }
1760
1759
  ),
1761
1760
  useExistingKey ? (
@@ -1822,15 +1821,11 @@ const LicenseGuard = ({ children }) => {
1822
1821
  children: [
1823
1822
  /* @__PURE__ */ jsx(Typography, { variant: "omega", fontWeight: "bold", style: { marginBottom: "12px", display: "block" }, children: "Ready to activate with your account:" }),
1824
1823
  /* @__PURE__ */ jsxs(Typography, { variant: "pi", style: { marginBottom: "4px", display: "block" }, children: [
1825
- "👤 ",
1826
1824
  adminUser.firstname || "Admin",
1827
1825
  " ",
1828
1826
  adminUser.lastname || "User"
1829
1827
  ] }),
1830
- /* @__PURE__ */ jsxs(Typography, { variant: "pi", textColor: "neutral600", children: [
1831
- "📧 ",
1832
- adminUser.email || "Loading..."
1833
- ] })
1828
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: adminUser.email || "Loading..." })
1834
1829
  ]
1835
1830
  }
1836
1831
  )
@@ -6,8 +6,8 @@ const admin = require("@strapi/strapi/admin");
6
6
  const styled = require("styled-components");
7
7
  const designSystem = require("@strapi/design-system");
8
8
  const icons = require("@strapi/icons");
9
- const index = require("./index-DC8Y0qxx.js");
10
- const useLicense = require("./useLicense-qgGfMvse.js");
9
+ const index = require("./index-WH04CS1c.js");
10
+ const useLicense = require("./useLicense-BwOlCyhc.js");
11
11
  const reactRouterDom = require("react-router-dom");
12
12
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
13
13
  const styled__default = /* @__PURE__ */ _interopDefault(styled);
@@ -58,7 +58,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
58
58
  } catch (err) {
59
59
  console.error("[SessionDetailModal] Error fetching geolocation:", err);
60
60
  setGeoData({
61
- country_flag: "🌍",
61
+ country_flag: "",
62
62
  country: "Unknown",
63
63
  city: "Unknown",
64
64
  timezone: "Unknown",
@@ -72,7 +72,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
72
72
  }
73
73
  };
74
74
  const premiumData = geoData || {
75
- country_flag: "🌍",
75
+ country_flag: "",
76
76
  country: "Loading...",
77
77
  city: "Loading...",
78
78
  timezone: "Loading...",
@@ -153,20 +153,20 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
153
153
  textColor: "neutral0",
154
154
  size: "M",
155
155
  style: { fontSize: "14px", padding: "8px 20px", fontWeight: "600" },
156
- children: isOnline ? "🟢 ONLINE" : "OFFLINE"
156
+ children: isOnline ? "ONLINE" : "OFFLINE"
157
157
  }
158
158
  ) }),
159
159
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Divider, { style: { marginBottom: "24px" } }),
160
160
  /* @__PURE__ */ jsxRuntime.jsxs(TwoColumnGrid, { children: [
161
161
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
162
162
  /* @__PURE__ */ jsxRuntime.jsxs(Section, { children: [
163
- /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { children: "👤 User" }),
163
+ /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { children: "User" }),
164
164
  /* @__PURE__ */ jsxRuntime.jsx(DetailRow, { compact: true, icon: icons.Check, label: "Username", value: session.user?.username || "N/A" }),
165
165
  /* @__PURE__ */ jsxRuntime.jsx(DetailRow, { compact: true, icon: icons.Information, label: "Email", value: session.user?.email || "N/A" }),
166
166
  /* @__PURE__ */ jsxRuntime.jsx(DetailRow, { compact: true, icon: icons.Information, label: "User ID", value: session.user?.id || "N/A" })
167
167
  ] }),
168
168
  /* @__PURE__ */ jsxRuntime.jsxs(Section, { children: [
169
- /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { children: "💻 Device" }),
169
+ /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { children: "Device" }),
170
170
  /* @__PURE__ */ jsxRuntime.jsx(DetailRow, { compact: true, icon: DeviceIcon, label: "Device", value: deviceInfo.device }),
171
171
  /* @__PURE__ */ jsxRuntime.jsx(DetailRow, { compact: true, icon: icons.Monitor, label: "Browser", value: `${deviceInfo.browser} ${deviceInfo.browserVersion || ""}` }),
172
172
  /* @__PURE__ */ jsxRuntime.jsx(DetailRow, { compact: true, icon: icons.Server, label: "OS", value: deviceInfo.os }),
@@ -174,7 +174,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
174
174
  ] })
175
175
  ] }),
176
176
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { children: /* @__PURE__ */ jsxRuntime.jsxs(Section, { children: [
177
- /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { children: "⏱️ Timeline" }),
177
+ /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { children: "Timeline" }),
178
178
  /* @__PURE__ */ jsxRuntime.jsx(
179
179
  DetailRow,
180
180
  {
@@ -229,7 +229,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
229
229
  ] }) })
230
230
  ] }),
231
231
  isPremium ? /* @__PURE__ */ jsxRuntime.jsxs(Section, { children: [
232
- /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { children: "🌍 Location & Security" }),
232
+ /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { children: "Location and Security" }),
233
233
  geoLoading ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 4, style: { textAlign: "center" }, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: "Loading location data..." }) }) : /* @__PURE__ */ jsxRuntime.jsxs(TwoColumnGrid, { children: [
234
234
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
235
235
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -238,7 +238,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
238
238
  compact: true,
239
239
  icon: icons.Earth,
240
240
  label: "Country",
241
- value: `${premiumData.country_flag || "🌍"} ${premiumData.country}`
241
+ value: `${premiumData.country_flag || ""} ${premiumData.country}`.trim()
242
242
  }
243
243
  ),
244
244
  /* @__PURE__ */ jsxRuntime.jsx(DetailRow, { compact: true, icon: icons.Earth, label: "City", value: premiumData.city }),
@@ -260,7 +260,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
260
260
  compact: true,
261
261
  icon: icons.Shield,
262
262
  label: "VPN",
263
- value: premiumData.isVpn ? "⚠️ Yes" : "No"
263
+ value: premiumData.isVpn ? "[WARNING] Yes" : "No"
264
264
  }
265
265
  ),
266
266
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -269,7 +269,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
269
269
  compact: true,
270
270
  icon: icons.Shield,
271
271
  label: "Proxy",
272
- value: premiumData.isProxy ? "⚠️ Yes" : "No"
272
+ value: premiumData.isProxy ? "[WARNING] Yes" : "No"
273
273
  }
274
274
  )
275
275
  ] })
@@ -286,7 +286,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
286
286
  },
287
287
  children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "center", gap: 3, children: [
288
288
  /* @__PURE__ */ jsxRuntime.jsx(icons.Crown, { style: { width: "40px", height: "40px", color: "#d97706" } }),
289
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "beta", style: { color: "#92400e", fontWeight: "700" }, children: "🌍 Location & Security Analysis" }),
289
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "beta", style: { color: "#92400e", fontWeight: "700" }, children: "Location and Security Analysis" }),
290
290
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", style: { color: "#78350f", fontSize: "14px", lineHeight: "1.6" }, children: "Unlock premium features to get IP geolocation, security scoring, and VPN/Proxy detection for every session" }),
291
291
  /* @__PURE__ */ jsxRuntime.jsx(
292
292
  designSystem.Button,
@@ -310,7 +310,7 @@ const SessionDetailModal = ({ session, onClose, onSessionTerminated }) => {
310
310
  ) }),
311
311
  /* @__PURE__ */ jsxRuntime.jsxs(Section, { children: [
312
312
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", alignItems: "center", style: { marginBottom: "12px" }, children: [
313
- /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { style: { marginBottom: 0, paddingBottom: 0, border: "none" }, children: "🔧 Technical Details" }),
313
+ /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { style: { marginBottom: 0, paddingBottom: 0, border: "none" }, children: "Technical Details" }),
314
314
  /* @__PURE__ */ jsxRuntime.jsx(
315
315
  designSystem.Button,
316
316
  {
@@ -809,7 +809,7 @@ const HomePage = () => {
809
809
  }
810
810
  };
811
811
  const handleDeleteSession = async (sessionId) => {
812
- if (!confirm("⚠️ WARNING: This will PERMANENTLY delete this session from the database!\n\nThis action cannot be undone.\n\nAre you sure?")) {
812
+ if (!confirm("[WARNING] This will PERMANENTLY delete this session from the database!\n\nThis action cannot be undone.\n\nAre you sure?")) {
813
813
  return;
814
814
  }
815
815
  try {
@@ -1048,7 +1048,7 @@ const HomePage = () => {
1048
1048
  ] }),
1049
1049
  loading && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", padding: 8, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Loader, { children: "Loading sessions..." }) }),
1050
1050
  !loading && sessions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
1051
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { style: { marginBottom: theme.spacing.md }, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "delta", style: { marginBottom: theme.spacing.md, color: theme.colors.neutral[700] }, children: "📊 All Sessions" }) }),
1051
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { style: { marginBottom: theme.spacing.md }, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "delta", style: { marginBottom: theme.spacing.md, color: theme.colors.neutral[700] }, children: "All Sessions" }) }),
1052
1052
  /* @__PURE__ */ jsxRuntime.jsxs(FilterBar, { children: [
1053
1053
  /* @__PURE__ */ jsxRuntime.jsxs(SearchInputWrapper, { children: [
1054
1054
  /* @__PURE__ */ jsxRuntime.jsx(SearchIcon, {}),
@@ -1071,10 +1071,10 @@ const HomePage = () => {
1071
1071
  size: "S",
1072
1072
  children: [
1073
1073
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "all", children: "All Sessions" }),
1074
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "active", children: "🟢 Active (< 15 min)" }),
1075
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "idle", children: "🟡 Idle (> 15 min)" }),
1076
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "loggedout", children: "🔴 Logged Out" }),
1077
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "terminated", children: "Terminated" })
1074
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "active", children: "Active (less than 15 min)" }),
1075
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "idle", children: "Idle (more than 15 min)" }),
1076
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "loggedout", children: "Logged Out" }),
1077
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "terminated", children: "Terminated" })
1078
1078
  ]
1079
1079
  }
1080
1080
  ) }),
@@ -1120,26 +1120,26 @@ const HomePage = () => {
1120
1120
  active: {
1121
1121
  bg: theme.colors.success[50],
1122
1122
  badgeColor: "success600",
1123
- label: "🟢 Active",
1123
+ label: "Active",
1124
1124
  indicator: true
1125
1125
  },
1126
1126
  idle: {
1127
1127
  bg: theme.colors.warning[50],
1128
1128
  badgeColor: "warning600",
1129
- label: "🟡 Idle",
1129
+ label: "Idle",
1130
1130
  indicator: false
1131
1131
  },
1132
1132
  loggedout: {
1133
1133
  bg: theme.colors.danger[50],
1134
1134
  badgeColor: "danger600",
1135
- label: "🔴 Logged Out",
1135
+ label: "Logged Out",
1136
1136
  indicator: false,
1137
1137
  opacity: 0.7
1138
1138
  },
1139
1139
  terminated: {
1140
1140
  bg: theme.colors.neutral[100],
1141
1141
  badgeColor: "neutral600",
1142
- label: "Terminated",
1142
+ label: "Terminated",
1143
1143
  indicator: false,
1144
1144
  opacity: 0.6
1145
1145
  }
@@ -1353,7 +1353,6 @@ const HomePage = () => {
1353
1353
  }
1354
1354
  }
1355
1355
  ),
1356
- /* @__PURE__ */ jsxRuntime.jsx(FloatingEmoji, { children: "💻" }),
1357
1356
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "center", gap: 6, style: { position: "relative", zIndex: 1 }, children: [
1358
1357
  /* @__PURE__ */ jsxRuntime.jsx(
1359
1358
  designSystem.Box,
@@ -1759,7 +1758,7 @@ const LicenseGuard = ({ children }) => {
1759
1758
  border: "2px solid #BAE6FD",
1760
1759
  width: "100%"
1761
1760
  },
1762
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", style: { fontSize: "13px", lineHeight: "1.6" }, children: useExistingKey ? "🔑 Enter your email and license key to activate." : useAutoCreate && adminUser && adminUser.email ? `✨ Click "Activate" to auto-create a license with your account (${adminUser.email})` : useAutoCreate ? 'Click "Activate" to auto-create a license with your admin account' : "💡 A license will be created with the details below." })
1761
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", style: { fontSize: "13px", lineHeight: "1.6" }, children: useExistingKey ? "Enter your email and license key to activate." : useAutoCreate && adminUser && adminUser.email ? `Click "Activate" to auto-create a license with your account (${adminUser.email})` : useAutoCreate ? 'Click "Activate" to auto-create a license with your admin account' : "A license will be created with the details below." })
1763
1762
  }
1764
1763
  ),
1765
1764
  useExistingKey ? (
@@ -1826,15 +1825,11 @@ const LicenseGuard = ({ children }) => {
1826
1825
  children: [
1827
1826
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", fontWeight: "bold", style: { marginBottom: "12px", display: "block" }, children: "Ready to activate with your account:" }),
1828
1827
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", style: { marginBottom: "4px", display: "block" }, children: [
1829
- "👤 ",
1830
1828
  adminUser.firstname || "Admin",
1831
1829
  " ",
1832
1830
  adminUser.lastname || "User"
1833
1831
  ] }),
1834
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: [
1835
- "📧 ",
1836
- adminUser.email || "Loading..."
1837
- ] })
1832
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: adminUser.email || "Loading..." })
1838
1833
  ]
1839
1834
  }
1840
1835
  )
@@ -6,7 +6,7 @@ const designSystem = require("@strapi/design-system");
6
6
  const admin = require("@strapi/strapi/admin");
7
7
  const icons = require("@strapi/icons");
8
8
  const styled = require("styled-components");
9
- const index = require("./index-DC8Y0qxx.js");
9
+ const index = require("./index-WH04CS1c.js");
10
10
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
11
11
  const styled__default = /* @__PURE__ */ _interopDefault(styled);
12
12
  const theme = {
@@ -339,7 +339,7 @@ Generated: ${(/* @__PURE__ */ new Date()).toLocaleString()}
339
339
  )
340
340
  ] }),
341
341
  data.features?.premium && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { marginBottom: 5, padding: 5, background: "success50", hasRadius: true, style: { border: "2px solid #dcfce7" }, children: [
342
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "delta", fontWeight: "bold", textColor: "success700", style: { marginBottom: "16px", display: "flex", alignItems: "center", gap: "8px" }, children: "Premium Features Active" }),
342
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "delta", fontWeight: "bold", textColor: "success700", style: { marginBottom: "16px", display: "flex", alignItems: "center", gap: "8px" }, children: "Premium Features Active" }),
343
343
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 2, children: [
344
344
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", textColor: "success700", style: { fontSize: "14px", display: "flex", alignItems: "center", gap: "8px" }, children: "✓ IP Geolocation Tracking (Country, City, Timezone)" }),
345
345
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", textColor: "success700", style: { fontSize: "14px", display: "flex", alignItems: "center", gap: "8px" }, children: "✓ Security Risk Scoring (0-100)" }),
@@ -350,7 +350,7 @@ Generated: ${(/* @__PURE__ */ new Date()).toLocaleString()}
350
350
  ] })
351
351
  ] }),
352
352
  data.features?.advanced && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { marginBottom: 5, padding: 5, background: "primary50", hasRadius: true, style: { border: "2px solid #bae6fd" }, children: [
353
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "delta", fontWeight: "bold", textColor: "primary700", style: { marginBottom: "16px", display: "flex", alignItems: "center", gap: "8px" }, children: "🚀 Advanced Features Active" }),
353
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "delta", fontWeight: "bold", textColor: "primary700", style: { marginBottom: "16px", display: "flex", alignItems: "center", gap: "8px" }, children: "Advanced Features Active" }),
354
354
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 2, children: [
355
355
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", textColor: "primary700", style: { fontSize: "14px", display: "flex", alignItems: "center", gap: "8px" }, children: "✓ Email Notifications & Alerts" }),
356
356
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", textColor: "primary700", style: { fontSize: "14px", display: "flex", alignItems: "center", gap: "8px" }, children: "✓ Webhook Integration (Discord/Slack)" }),
@@ -4,7 +4,7 @@ import { Loader, Box, Alert, Flex, Typography, Button, Badge, Accordion } from "
4
4
  import { useFetchClient, useNotification } from "@strapi/strapi/admin";
5
5
  import { ArrowClockwise, Duplicate, Download, User, Shield, Sparkle, ChartBubble } from "@strapi/icons";
6
6
  import styled, { css, keyframes } from "styled-components";
7
- import { a as pluginId } from "./index-DBRS3kt5.mjs";
7
+ import { a as pluginId } from "./index-Duk1_Wrz.mjs";
8
8
  const theme = {
9
9
  colors: {
10
10
  neutral: { 200: "#E5E7EB" }
@@ -335,7 +335,7 @@ Generated: ${(/* @__PURE__ */ new Date()).toLocaleString()}
335
335
  )
336
336
  ] }),
337
337
  data.features?.premium && /* @__PURE__ */ jsxs(Box, { marginBottom: 5, padding: 5, background: "success50", hasRadius: true, style: { border: "2px solid #dcfce7" }, children: [
338
- /* @__PURE__ */ jsx(Typography, { variant: "delta", fontWeight: "bold", textColor: "success700", style: { marginBottom: "16px", display: "flex", alignItems: "center", gap: "8px" }, children: "Premium Features Active" }),
338
+ /* @__PURE__ */ jsx(Typography, { variant: "delta", fontWeight: "bold", textColor: "success700", style: { marginBottom: "16px", display: "flex", alignItems: "center", gap: "8px" }, children: "Premium Features Active" }),
339
339
  /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 2, children: [
340
340
  /* @__PURE__ */ jsx(Typography, { variant: "omega", textColor: "success700", style: { fontSize: "14px", display: "flex", alignItems: "center", gap: "8px" }, children: "✓ IP Geolocation Tracking (Country, City, Timezone)" }),
341
341
  /* @__PURE__ */ jsx(Typography, { variant: "omega", textColor: "success700", style: { fontSize: "14px", display: "flex", alignItems: "center", gap: "8px" }, children: "✓ Security Risk Scoring (0-100)" }),
@@ -346,7 +346,7 @@ Generated: ${(/* @__PURE__ */ new Date()).toLocaleString()}
346
346
  ] })
347
347
  ] }),
348
348
  data.features?.advanced && /* @__PURE__ */ jsxs(Box, { marginBottom: 5, padding: 5, background: "primary50", hasRadius: true, style: { border: "2px solid #bae6fd" }, children: [
349
- /* @__PURE__ */ jsx(Typography, { variant: "delta", fontWeight: "bold", textColor: "primary700", style: { marginBottom: "16px", display: "flex", alignItems: "center", gap: "8px" }, children: "🚀 Advanced Features Active" }),
349
+ /* @__PURE__ */ jsx(Typography, { variant: "delta", fontWeight: "bold", textColor: "primary700", style: { marginBottom: "16px", display: "flex", alignItems: "center", gap: "8px" }, children: "Advanced Features Active" }),
350
350
  /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 2, children: [
351
351
  /* @__PURE__ */ jsx(Typography, { variant: "omega", textColor: "primary700", style: { fontSize: "14px", display: "flex", alignItems: "center", gap: "8px" }, children: "✓ Email Notifications & Alerts" }),
352
352
  /* @__PURE__ */ jsx(Typography, { variant: "omega", textColor: "primary700", style: { fontSize: "14px", display: "flex", alignItems: "center", gap: "8px" }, children: "✓ Webhook Integration (Discord/Slack)" }),