@hot-updater/console 1.0.0 → 1.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.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/{ConsoleFeatureUnavailable-jB4Loglh.js → ConsoleFeatureUnavailable-Bf8tgug-.js} +1 -1
- package/.output/public/assets/{EventDetails-B6yUsyNA.js → EventDetails-CgtEWl-Y.js} +1 -1
- package/.output/public/assets/HashValueDisplay-DvXl147n.js +1 -0
- package/.output/public/assets/{InsightsPageHeader-B892oVml.js → InsightsPageHeader-eViliItR.js} +1 -1
- package/.output/public/assets/{NotFoundPage-DIqCpWa3.js → NotFoundPage-HomiHjdL.js} +1 -1
- package/.output/public/assets/{alert-dialog-Bbk_4-WJ.js → alert-dialog-BSs_5Od-.js} +1 -1
- package/.output/public/assets/{api-DCM0wr6O.js → api-DSWk32Mz.js} +1 -1
- package/.output/public/assets/api-keys-CHA2X9W0.js +1 -0
- package/.output/public/assets/api-keys-D0yD891K.js +1 -0
- package/.output/public/assets/arrow-left-vK2qGQsd.js +1 -0
- package/.output/public/assets/arrow-up-right-Dz8o-Kab.js +1 -0
- package/.output/public/assets/chevron-right-CBl7aqu_.js +1 -0
- package/.output/public/assets/{clipboard-DS9ucUQL.js → clipboard-BYT_TJ0K.js} +1 -1
- package/.output/public/assets/{console-features-api-BH5m_PtQ.js → console-features-api-BD7j--gS.js} +1 -1
- package/.output/public/assets/{dialog-Bqbb7B0N.js → dialog-YKZpU5St.js} +1 -1
- package/.output/public/assets/{dist-LxKJB-Vu.js → dist-B7eA4Mtf.js} +1 -1
- package/.output/public/assets/{empty-CuT2UhFp.js → empty-L3UcNk_l.js} +1 -1
- package/.output/public/assets/{field-BBDpjIqu.js → field-DNqNwq7i.js} +1 -1
- package/.output/public/assets/{index-6o51GkFe.js → index-C-dDMnWK.js} +4 -4
- package/.output/public/assets/{input-group-ja_30qaF.js → input-group-C9ZIjV0o.js} +1 -1
- package/.output/public/assets/insights-C54__dPi.js +1 -0
- package/.output/public/assets/insights-DM0CTj58.js +2 -0
- package/.output/public/assets/insights-SVMoazdd.js +42 -0
- package/.output/public/assets/{insights-api-BigAU9sZ.js → insights-api-BsX1zQDf.js} +1 -1
- package/.output/public/assets/insights-search-B-F2wop6.js +1 -0
- package/.output/public/assets/insights-usage-rpc-CSAoKS_b.js +1 -0
- package/.output/public/assets/insights_.distribution-BAaD6rZK.js +1 -0
- package/.output/public/assets/insights_.distribution-C6tGV7qU.js +2 -0
- package/.output/public/assets/insights_.distribution-oxPmgcHr.js +1 -0
- package/.output/public/assets/installations-1jALHnM3.js +1 -0
- package/.output/public/assets/installations-DUidui9Z.js +1 -0
- package/.output/public/assets/{installations-BazSJXE0.js → installations-RfpwK-ld.js} +2 -2
- package/.output/public/assets/{key-round-wS_SIZ6b.js → key-round-CrqLmblG.js} +1 -1
- package/.output/public/assets/{list-CgrYiadM.js → list-BSpjGUS6.js} +1 -1
- package/.output/public/assets/{refresh-cw-BYgoNCco.js → refresh-cw-BMlpOsfM.js} +1 -1
- package/.output/public/assets/remote-config-BcoOZ9fs.js +1 -0
- package/.output/public/assets/remote-config-BtStN5bt.js +1 -0
- package/.output/public/assets/{remote-config-Br56BODb.js → remote-config-Cwwsatrr.js} +4 -4
- package/.output/public/assets/routes-Bc3J564t.js +2 -0
- package/.output/public/assets/routes-Bxu5_zNh.js +1 -0
- package/.output/public/assets/search-B_o3avCI.js +1 -0
- package/.output/public/assets/select-BE-xONpm.js +1 -0
- package/.output/public/assets/{sidebar-DNVyJPfX.js → sidebar-CQ6iq0qe.js} +1 -1
- package/.output/public/assets/smartphone--CTny1h9.js +1 -0
- package/.output/public/assets/{switch-DZ1TPwx-.js → switch-DR0WP2g8.js} +1 -1
- package/.output/public/assets/{table-Gm4qRWwE.js → table-DW0243Jw.js} +1 -1
- package/.output/public/assets/tabs-B4Ffq4fD.js +1 -0
- package/.output/public/assets/{undo-2-CmrHjwFc.js → undo-2-Dcq6sgUo.js} +1 -1
- package/.output/public/assets/{useCompositeListItem-9E4pj_CH.js → useCompositeListItem-VmWjhZ9j.js} +1 -1
- package/.output/public/assets/{valueToPercent-CH8GCHaL.js → valueToPercent-C-rPd_Or.js} +1 -1
- package/.output/server/{__23tanstack-start-server-fn-resolver-BpRlos5Q.mjs → __23tanstack-start-server-fn-resolver-CludPNXL.mjs} +40 -40
- package/.output/server/_libs/@base-ui/react+[...].mjs +20 -20
- package/.output/server/_libs/@tanstack/react-router+[...].mjs +1 -1
- package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +1 -1
- package/.output/server/_libs/recharts+[...].mjs +1 -1
- package/.output/server/_libs/sonner.mjs +1 -1
- package/.output/server/_ssr/{BundleIdDisplay-x94o9rlU.mjs → BundleIdDisplay-CAIibMnZ.mjs} +2 -2
- package/.output/server/_ssr/{ConsoleFeatureUnavailable-ldW8v8-q.mjs → ConsoleFeatureUnavailable-CTbvhAts.mjs} +6 -6
- package/.output/server/_ssr/{EventDetails-Q8kfj9Nr.mjs → EventDetails-Dz5O2hup.mjs} +6 -6
- package/.output/server/_ssr/{HashValueDisplay-n1GholGS.mjs → HashValueDisplay-BBUzwDu0.mjs} +2 -2
- package/.output/server/_ssr/{InsightsPageHeader-BSUX3Ye9.mjs → InsightsPageHeader-BisxLsg_.mjs} +6 -6
- package/.output/server/_ssr/{NotFoundPage-DZzOOzS3.mjs → NotFoundPage-oKeLJAKO.mjs} +2 -2
- package/.output/server/_ssr/{alert-dialog-C43Doa0I.mjs → alert-dialog-D9gKu-6B.mjs} +1 -1
- package/.output/server/_ssr/{api-oZjRn9tP.mjs → api-Ctf4ONl0.mjs} +3 -3
- package/.output/server/_ssr/{api-keys-CEnM9fqG.mjs → api-keys-BYVLgcvB.mjs} +2 -2
- package/.output/server/_ssr/{api-keys-B4sYm8dM.mjs → api-keys-CBdMIgQH.mjs} +7 -7
- package/.output/server/_ssr/{api-keys-rpc-BIFuUgMt.mjs → api-keys-rpc-D_MGDGrN.mjs} +3 -3
- package/.output/server/_ssr/{api-rpc-BNiFRRK8.mjs → api-rpc-BOn0fmSj.mjs} +3 -3
- package/.output/server/_ssr/{auth-rpc-DnZqYxyq.mjs → auth-rpc-MuU8dCi_.mjs} +4 -4
- package/.output/server/_ssr/{auth.server-DFpyxRDd.mjs → auth.server-QA_53YPj.mjs} +2 -2
- package/.output/server/_ssr/{config.server-DskXCAyI.mjs → config.server-fNcSQwfX.mjs} +3 -3
- package/.output/server/_ssr/{console-access-BJfAXknd.mjs → console-access-C6aSaMHp.mjs} +2 -2
- package/.output/server/_ssr/{console-features-api-C9kiKvaV.mjs → console-features-api-nN-3jUli.mjs} +5 -5
- package/.output/server/_ssr/{console-features-rpc-P0GL7Z-R.mjs → console-features-rpc-By6Aak_o.mjs} +3 -3
- package/.output/server/_ssr/{dialog-BbYDMjdC.mjs → dialog-IVRlM1J9.mjs} +1 -1
- package/.output/server/_ssr/{empty-CVLGfxuu.mjs → empty-CXw7UkQ9.mjs} +2 -2
- package/.output/server/_ssr/{field-asw83X0v.mjs → field-D5rycmNU.mjs} +2 -2
- package/.output/server/_ssr/{input-group-CuYJHosb.mjs → input-group-CcwGtPaf.mjs} +1 -1
- package/.output/server/_ssr/{insights-B55FG5fm.mjs → insights-BO3tHc8m.mjs} +5 -5
- package/.output/server/_ssr/{insights-CWnHIFUV.mjs → insights-BfjtzxAt.mjs} +2 -2
- package/.output/server/_ssr/{insights-CpLpedFZ.mjs → insights-CKC8xDHf.mjs} +24 -24
- package/.output/server/_ssr/{insights-api-sjws23WF.mjs → insights-api-CxvjRcJY.mjs} +3 -3
- package/.output/server/_ssr/{insights-failures-rpc-BvbWvqNf.mjs → insights-failures-rpc-3LR3gf5_.mjs} +4 -4
- package/.output/server/_ssr/{insights-recovery-rpc-GiYXdkaY.mjs → insights-recovery-rpc-KZuPFtPi.mjs} +3 -3
- package/.output/server/_ssr/{insights-rpc-DP_8Rmz4.mjs → insights-rpc-B5DF87z1.mjs} +3 -3
- package/.output/server/_ssr/{InsightsInfo-DuJFatQO.mjs → insights-search--Biw1Q83.mjs} +31 -31
- package/.output/server/_ssr/{insights-usage-rpc-BiolgB8e.mjs → insights-usage-rpc-BjyoZrsk.mjs} +3 -3
- package/.output/server/_ssr/{insights-usage-rpc-KStL0zOx.mjs → insights-usage-rpc-Dvt-RmGH.mjs} +3 -3
- package/.output/server/_ssr/{insights_.distribution-CVrnbP3R.mjs → insights_.distribution-C9WdD2pp.mjs} +2 -2
- package/.output/server/_ssr/{insights_.distribution-DN9pR422.mjs → insights_.distribution-Czd0R3x1.mjs} +13 -13
- package/.output/server/_ssr/{insights_.distribution-D2HaNTAA.mjs → insights_.distribution-DMcff9C5.mjs} +5 -5
- package/.output/server/_ssr/{installations-DD1g__Nc.mjs → installations-BZg4I7rk.mjs} +4 -4
- package/.output/server/_ssr/{installations-BSCmFq8Q.mjs → installations-CETpe6aH.mjs} +10 -10
- package/.output/server/_ssr/{installations-BHmbbnH8.mjs → installations-CbX4TTtL.mjs} +2 -2
- package/.output/server/_ssr/{release-adoption-rpc-BsstqxUp.mjs → release-adoption-rpc-CEY0I6O4.mjs} +5 -5
- package/.output/server/_ssr/{remote-config-Dv1ccMo-.mjs → remote-config-BZoufETF.mjs} +2 -2
- package/.output/server/_ssr/{remote-config-C2Ee8lXO.mjs → remote-config-CORErMXh.mjs} +2 -2
- package/.output/server/_ssr/{remote-config-of0lGQH8.mjs → remote-config-D2VfWi8m.mjs} +16 -16
- package/.output/server/_ssr/{remote-config-rpc-BzX31mUS.mjs → remote-config-rpc-DKcBdTyh.mjs} +3 -3
- package/.output/server/_ssr/{router-D8NuoJ_I.mjs → router-CRDbJodQ.mjs} +14 -14
- package/.output/server/_ssr/{routes-V8sDybGf.mjs → routes-Bpmxf-r8.mjs} +12 -12
- package/.output/server/_ssr/{routes-DgvnFqDy.mjs → routes-DC3sK0ON.mjs} +38 -25
- package/.output/server/_ssr/{select-t3iXRwc9.mjs → select-CzanJCWl.mjs} +1 -1
- package/.output/server/_ssr/{server-h4VxnExB.mjs → server-C4JCTB-q.mjs} +3 -3
- package/.output/server/_ssr/{sidebar-DJcErBMo.mjs → sidebar-DcFhy0Zq.mjs} +18 -18
- package/.output/server/_ssr/ssr.mjs +1 -1
- package/.output/server/_ssr/{switch-E-btwMGt.mjs → switch-DAHDLynM.mjs} +2 -2
- package/.output/server/_ssr/{table-37Dd23TN.mjs → table-DNcXrt9t.mjs} +1 -1
- package/.output/server/_ssr/{tabs-DEFnTm95.mjs → tabs-BlbEfZeV.mjs} +2 -2
- package/.output/server/_tanstack-start-manifest_v-DaM-WBL0.mjs +139 -0
- package/.output/server/index.mjs +265 -265
- package/package.json +7 -7
- package/src/components/{features/insights/InsightsInfo.tsx → InfoTooltip.tsx} +1 -1
- package/src/components/features/insights/AppUsage.tsx +3 -3
- package/src/components/features/insights/InsightsOverview.tsx +5 -5
- package/src/components/features/insights/ReleaseActivity.tsx +5 -5
- package/src/components/features/insights/ReportingDevicesSummary.tsx +3 -3
- package/src/components/features/insights/UpdateFailures.tsx +2 -4
- package/src/components/features/releases/ReleaseEditorSheet.tsx +33 -21
- package/src/routes/insights_.distribution.tsx +3 -3
- package/.output/public/assets/HashValueDisplay-BFX_kY3-.js +0 -1
- package/.output/public/assets/InsightsInfo-BNO0WznZ.js +0 -1
- package/.output/public/assets/api-keys-CIO9L_wu.js +0 -1
- package/.output/public/assets/api-keys-DVTL_--f.js +0 -1
- package/.output/public/assets/arrow-left-CnMYpqB7.js +0 -1
- package/.output/public/assets/arrow-up-right-BtffZA6e.js +0 -1
- package/.output/public/assets/chevron-right-BqD5wtFb.js +0 -1
- package/.output/public/assets/insights-CmraDzQh.js +0 -1
- package/.output/public/assets/insights-CxZ2GCYV.js +0 -2
- package/.output/public/assets/insights-usage-rpc-DYEhsCKT.js +0 -1
- package/.output/public/assets/insights-vNRCrfnS.js +0 -42
- package/.output/public/assets/insights_.distribution-ChOerfJt.js +0 -1
- package/.output/public/assets/insights_.distribution-D-e4iga8.js +0 -1
- package/.output/public/assets/insights_.distribution-DZtkibX1.js +0 -2
- package/.output/public/assets/installations-ClHTqdAO.js +0 -1
- package/.output/public/assets/installations-DpKsBuHi.js +0 -1
- package/.output/public/assets/remote-config-BWwHOkCK.js +0 -1
- package/.output/public/assets/remote-config-CXOi0LRu.js +0 -1
- package/.output/public/assets/routes-B88Erkpk.js +0 -2
- package/.output/public/assets/routes-CfzsAleC.js +0 -1
- package/.output/public/assets/search-DaTDPW25.js +0 -1
- package/.output/public/assets/select-BZZBXMkr.js +0 -1
- package/.output/public/assets/smartphone-DpTFgtKf.js +0 -1
- package/.output/public/assets/tabs-C7FOEjFC.js +0 -1
- package/.output/server/_tanstack-start-manifest_v-55AGsehh.mjs +0 -139
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/console",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.1",
|
|
5
5
|
"files": [
|
|
6
6
|
".output",
|
|
7
7
|
"lib",
|
|
@@ -58,10 +58,10 @@
|
|
|
58
58
|
"tailwindcss": "^4.2.1",
|
|
59
59
|
"tw-animate-css": "^1.4.0",
|
|
60
60
|
"verkit": "0.4.0",
|
|
61
|
-
"@hot-updater/bsdiff": "1.0.
|
|
62
|
-
"@hot-updater/
|
|
63
|
-
"@hot-updater/
|
|
64
|
-
"@hot-updater/
|
|
61
|
+
"@hot-updater/bsdiff": "1.0.1",
|
|
62
|
+
"@hot-updater/plugin-core": "1.0.1",
|
|
63
|
+
"@hot-updater/protocol": "1.0.1",
|
|
64
|
+
"@hot-updater/server": "1.0.1"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@tanstack/devtools-vite": "^0.6.0",
|
|
@@ -86,8 +86,8 @@
|
|
|
86
86
|
"vite-tsconfig-paths": "^6.1.1",
|
|
87
87
|
"vitest": "4.1.4",
|
|
88
88
|
"web-vitals": "^5.1.0",
|
|
89
|
-
"@hot-updater/cli-tools": "1.0.
|
|
90
|
-
"@hot-updater/mock": "1.0.
|
|
89
|
+
"@hot-updater/cli-tools": "1.0.1",
|
|
90
|
+
"@hot-updater/mock": "1.0.1"
|
|
91
91
|
},
|
|
92
92
|
"description": "React Native OTA solution for self-hosted",
|
|
93
93
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -3,6 +3,7 @@ import { Link } from "@tanstack/react-router";
|
|
|
3
3
|
import { ArrowRight, ChevronRight } from "lucide-react";
|
|
4
4
|
import { CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts";
|
|
5
5
|
|
|
6
|
+
import { InfoTooltip } from "@/components/InfoTooltip";
|
|
6
7
|
import { PlatformIcon } from "@/components/PlatformIcon";
|
|
7
8
|
import { Badge } from "@/components/ui/badge";
|
|
8
9
|
import { Button, buttonVariants } from "@/components/ui/button";
|
|
@@ -46,7 +47,6 @@ import type { AppUsageReport, UsageWindow } from "@/lib/insights-usage";
|
|
|
46
47
|
|
|
47
48
|
import { EstimatedCount } from "./EstimatedCount";
|
|
48
49
|
import { InsightsErrorAlert } from "./InsightsErrorAlert";
|
|
49
|
-
import { InsightsInfo } from "./InsightsInfo";
|
|
50
50
|
import { UsagePeriodSelector } from "./InsightsPeriodSelector";
|
|
51
51
|
import { ReportingDevicesSummary } from "./ReportingDevicesSummary";
|
|
52
52
|
|
|
@@ -231,11 +231,11 @@ export function AppUsage({
|
|
|
231
231
|
<CardTitle className="flex min-h-9 items-center">
|
|
232
232
|
Distribution
|
|
233
233
|
</CardTitle>
|
|
234
|
-
<
|
|
234
|
+
<InfoTooltip label="How distribution is counted">
|
|
235
235
|
Each installation counts once, by its latest report{" "}
|
|
236
236
|
{distributionPeriod}.
|
|
237
237
|
{report?.truncated ? " Some history is missing." : ""}
|
|
238
|
-
</
|
|
238
|
+
</InfoTooltip>
|
|
239
239
|
</CardHeader>
|
|
240
240
|
<CardContent className="flex-1">
|
|
241
241
|
{query.isPending ? (
|
|
@@ -3,6 +3,7 @@ import { ListIcon, RotateCcw, RotateCw, TriangleAlert, X } from "lucide-react";
|
|
|
3
3
|
import { useState } from "react";
|
|
4
4
|
|
|
5
5
|
import { BundleIdDisplay } from "@/components/BundleIdDisplay";
|
|
6
|
+
import { InfoTooltip } from "@/components/InfoTooltip";
|
|
6
7
|
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
|
|
7
8
|
import { Badge } from "@/components/ui/badge";
|
|
8
9
|
import { Button, buttonVariants } from "@/components/ui/button";
|
|
@@ -60,7 +61,6 @@ import {
|
|
|
60
61
|
useSeriesColors,
|
|
61
62
|
} from "./ComparedBundlesChart";
|
|
62
63
|
import { InsightsErrorAlert } from "./InsightsErrorAlert";
|
|
63
|
-
import { InsightsInfo } from "./InsightsInfo";
|
|
64
64
|
import { InsightsPeriodSelector } from "./InsightsPeriodSelector";
|
|
65
65
|
import { RollbackButton } from "./RollbackButton";
|
|
66
66
|
|
|
@@ -185,11 +185,11 @@ export function InsightsOverview({
|
|
|
185
185
|
<div className="flex flex-col gap-1">
|
|
186
186
|
<div className="flex items-center gap-1 text-sm font-medium">
|
|
187
187
|
Installations downloading and launching each bundle
|
|
188
|
-
<
|
|
188
|
+
<InfoTooltip label="About adoption">
|
|
189
189
|
Dashed: installations that downloaded the bundle. Solid:
|
|
190
190
|
installations that launched it. After a forced update the two lines
|
|
191
191
|
meet.
|
|
192
|
-
</
|
|
192
|
+
</InfoTooltip>
|
|
193
193
|
</div>
|
|
194
194
|
<div className="flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground">
|
|
195
195
|
<p>
|
|
@@ -212,12 +212,12 @@ export function InsightsOverview({
|
|
|
212
212
|
<div className="flex flex-col gap-1">
|
|
213
213
|
<div className="flex items-center gap-1 text-sm font-medium">
|
|
214
214
|
Crashes after each deployment
|
|
215
|
-
<
|
|
215
|
+
<InfoTooltip label="About crashes">
|
|
216
216
|
Installations that crashed on a bundle and rolled back. Crash rate =
|
|
217
217
|
crashed ÷ (launched + crashed). A rollback is suggested at{" "}
|
|
218
218
|
{percent(CRASH_RATE_THRESHOLD)} once {CRASH_MIN_ATTEMPTS}{" "}
|
|
219
219
|
installations tried it.
|
|
220
|
-
</
|
|
220
|
+
</InfoTooltip>
|
|
221
221
|
</div>
|
|
222
222
|
<p className="text-xs text-muted-foreground">
|
|
223
223
|
{cadenceOf(period.intervalMs)} · last {lengthOf(period.durationMs)} ·
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Link } from "@tanstack/react-router";
|
|
2
2
|
import { ChartLine } from "lucide-react";
|
|
3
3
|
|
|
4
|
+
import { InfoTooltip } from "@/components/InfoTooltip";
|
|
4
5
|
import { buttonVariants } from "@/components/ui/button";
|
|
5
6
|
import {
|
|
6
7
|
Card,
|
|
@@ -23,7 +24,6 @@ import { adoptionWindow } from "@/lib/insights-search";
|
|
|
23
24
|
import { cn } from "@/lib/utils";
|
|
24
25
|
|
|
25
26
|
import type { ReleaseColumn } from "../FeatureSlots";
|
|
26
|
-
import { InsightsInfo } from "./InsightsInfo";
|
|
27
27
|
|
|
28
28
|
const activityStats = [
|
|
29
29
|
{ label: "Downloaded", field: "downloads", color: "text-primary/85" },
|
|
@@ -46,11 +46,11 @@ const notLaunched = (report: BundleActivityReport) =>
|
|
|
46
46
|
|
|
47
47
|
function ReleaseMetricsInfo() {
|
|
48
48
|
return (
|
|
49
|
-
<
|
|
49
|
+
<InfoTooltip label="About release insight metrics">
|
|
50
50
|
Downloaded: got this bundle. Launched: ran it. Crashed: crashed on it and
|
|
51
51
|
rolled back. Once every installation restarts, Downloaded = Launched +
|
|
52
52
|
Crashed.
|
|
53
|
-
</
|
|
53
|
+
</InfoTooltip>
|
|
54
54
|
);
|
|
55
55
|
}
|
|
56
56
|
|
|
@@ -205,10 +205,10 @@ export function BundleDownloadFailures({
|
|
|
205
205
|
—
|
|
206
206
|
</span>
|
|
207
207
|
)}
|
|
208
|
-
<
|
|
208
|
+
<InfoTooltip label="About download failures">
|
|
209
209
|
Failed downloads or installs of this bundle, at most one per
|
|
210
210
|
installation a day. Rate = failures ÷ (failures + downloads).
|
|
211
|
-
</
|
|
211
|
+
</InfoTooltip>
|
|
212
212
|
</div>
|
|
213
213
|
);
|
|
214
214
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { InfoTooltip } from "@/components/InfoTooltip";
|
|
1
2
|
import { Skeleton } from "@/components/ui/skeleton";
|
|
2
3
|
import { usageMetrics, type UsageWindow } from "@/lib/insights-usage";
|
|
3
4
|
|
|
4
5
|
import { EstimatedCount } from "./EstimatedCount";
|
|
5
|
-
import { InsightsInfo } from "./InsightsInfo";
|
|
6
6
|
|
|
7
7
|
export function ReportingDevicesSummary({
|
|
8
8
|
window,
|
|
@@ -37,11 +37,11 @@ export function ReportingDevicesSummary({
|
|
|
37
37
|
)}
|
|
38
38
|
<div className="flex items-center gap-1 text-sm text-muted-foreground">
|
|
39
39
|
<span>{metric.label}</span>
|
|
40
|
-
<
|
|
40
|
+
<InfoTooltip label={`How ${metric.label} is counted`}>
|
|
41
41
|
Installations that reported in the last {metric.period}, estimated
|
|
42
42
|
within about 3%. The chart shows them per {metric.interval}.
|
|
43
43
|
{partial ? " Some history is missing, so this is a minimum." : ""}
|
|
44
|
-
</
|
|
44
|
+
</InfoTooltip>
|
|
45
45
|
</div>
|
|
46
46
|
</div>
|
|
47
47
|
);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ChevronRight, RotateCw } from "lucide-react";
|
|
2
2
|
import type { ReactNode } from "react";
|
|
3
3
|
|
|
4
|
+
import { InfoTooltip } from "@/components/InfoTooltip";
|
|
4
5
|
import { Button } from "@/components/ui/button";
|
|
5
6
|
import {
|
|
6
7
|
Card,
|
|
@@ -34,7 +35,6 @@ import { cn } from "@/lib/utils";
|
|
|
34
35
|
|
|
35
36
|
import { EstimatedCount } from "./EstimatedCount";
|
|
36
37
|
import { InsightsErrorAlert } from "./InsightsErrorAlert";
|
|
37
|
-
import { InsightsInfo } from "./InsightsInfo";
|
|
38
38
|
|
|
39
39
|
const share = (events: number, total: number) =>
|
|
40
40
|
total === 0 ? "—" : `${((events / total) * 100).toFixed(1)}%`;
|
|
@@ -75,9 +75,7 @@ function FailureSummary({
|
|
|
75
75
|
className="flex min-h-11 items-center gap-1 text-sm font-medium sm:min-h-7"
|
|
76
76
|
>
|
|
77
77
|
{title}
|
|
78
|
-
<
|
|
79
|
-
{info}
|
|
80
|
-
</InsightsInfo>
|
|
78
|
+
<InfoTooltip label={`About ${title.toLowerCase()}`}>{info}</InfoTooltip>
|
|
81
79
|
</h3>
|
|
82
80
|
<p className="text-3xl font-semibold tracking-tight tabular-nums">
|
|
83
81
|
<Rate value={rate} />
|
|
@@ -18,6 +18,7 @@ import { BundleIdDisplay } from "@/components/BundleIdDisplay";
|
|
|
18
18
|
import { BundleMetadata } from "@/components/features/bundles/BundleMetadata";
|
|
19
19
|
import { RolloutCohortsDialog } from "@/components/features/bundles/RolloutCohortsDialog";
|
|
20
20
|
import { ReleaseSections } from "@/components/features/FeatureSlots";
|
|
21
|
+
import { InfoTooltip } from "@/components/InfoTooltip";
|
|
21
22
|
import { PlatformIcon } from "@/components/PlatformIcon";
|
|
22
23
|
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
|
|
23
24
|
import {
|
|
@@ -472,9 +473,16 @@ export function ReleaseEditorSheet({
|
|
|
472
473
|
) : null}
|
|
473
474
|
<Field>
|
|
474
475
|
<div className="flex items-center justify-between gap-4">
|
|
475
|
-
<
|
|
476
|
-
|
|
477
|
-
|
|
476
|
+
<div className="flex items-center gap-1">
|
|
477
|
+
<FieldLabel htmlFor="release-enabled">
|
|
478
|
+
Enabled
|
|
479
|
+
</FieldLabel>
|
|
480
|
+
<InfoTooltip label="About Enabled">
|
|
481
|
+
Disabling rolls devices back to the previous enabled
|
|
482
|
+
bundle on their next check, or to the built-in app
|
|
483
|
+
when none remains.
|
|
484
|
+
</InfoTooltip>
|
|
485
|
+
</div>
|
|
478
486
|
<Switch
|
|
479
487
|
aria-label="Enabled"
|
|
480
488
|
checked={draft.enabled}
|
|
@@ -485,25 +493,29 @@ export function ReleaseEditorSheet({
|
|
|
485
493
|
}
|
|
486
494
|
/>
|
|
487
495
|
</div>
|
|
488
|
-
<FieldDescription>
|
|
489
|
-
Disabling rolls devices back to the previous enabled
|
|
490
|
-
bundle on their next check, or to the built-in app when
|
|
491
|
-
none remains.
|
|
492
|
-
</FieldDescription>
|
|
493
496
|
</Field>
|
|
494
|
-
<Field
|
|
495
|
-
<
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
497
|
+
<Field>
|
|
498
|
+
<div className="flex items-center justify-between gap-4">
|
|
499
|
+
<div className="flex items-center gap-1">
|
|
500
|
+
<FieldLabel htmlFor="release-force-update">
|
|
501
|
+
Force update
|
|
502
|
+
</FieldLabel>
|
|
503
|
+
<InfoTooltip label="About Force update">
|
|
504
|
+
Devices apply this bundle right away, and so do
|
|
505
|
+
devices that skip it to update straight to a newer
|
|
506
|
+
bundle.
|
|
507
|
+
</InfoTooltip>
|
|
508
|
+
</div>
|
|
509
|
+
<Switch
|
|
510
|
+
aria-label="Force update"
|
|
511
|
+
checked={draft.shouldForceUpdate}
|
|
512
|
+
id="release-force-update"
|
|
513
|
+
name="shouldForceUpdate"
|
|
514
|
+
onCheckedChange={(shouldForceUpdate) =>
|
|
515
|
+
setDraft({ ...draft, shouldForceUpdate })
|
|
516
|
+
}
|
|
517
|
+
/>
|
|
518
|
+
</div>
|
|
507
519
|
</Field>
|
|
508
520
|
<Field>
|
|
509
521
|
<FieldLabel htmlFor="release-rollout-percentage">
|
|
@@ -6,9 +6,9 @@ import { BundleIdDisplay } from "@/components/BundleIdDisplay";
|
|
|
6
6
|
import { ConsoleFeatureUnavailable } from "@/components/ConsoleFeatureUnavailable";
|
|
7
7
|
import { BuiltinBundleBadge } from "@/components/features/insights/BuiltinBundle";
|
|
8
8
|
import { InsightsErrorAlert } from "@/components/features/insights/InsightsErrorAlert";
|
|
9
|
-
import { InsightsInfo } from "@/components/features/insights/InsightsInfo";
|
|
10
9
|
import { InsightsPageHeader } from "@/components/features/insights/InsightsPageHeader";
|
|
11
10
|
import { UsagePeriodSelector } from "@/components/features/insights/InsightsPeriodSelector";
|
|
11
|
+
import { InfoTooltip } from "@/components/InfoTooltip";
|
|
12
12
|
import { PlatformIcon } from "@/components/PlatformIcon";
|
|
13
13
|
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
|
|
14
14
|
import { Badge } from "@/components/ui/badge";
|
|
@@ -219,12 +219,12 @@ function DistributionPage() {
|
|
|
219
219
|
<CardHeader className="flex flex-col gap-3">
|
|
220
220
|
<div className="flex items-center justify-between gap-2">
|
|
221
221
|
<CardTitle>Bundles by app version</CardTitle>
|
|
222
|
-
<
|
|
222
|
+
<InfoTooltip label="How bundle distribution is counted">
|
|
223
223
|
Each installation counts once, by its latest report{" "}
|
|
224
224
|
{distributionPeriod}. Shares are within each app version.
|
|
225
225
|
Built-in bundle: the bundle the native build shipped, by its
|
|
226
226
|
ID. Unknown bundle: no deployment and no built-in bundle ID.
|
|
227
|
-
</
|
|
227
|
+
</InfoTooltip>
|
|
228
228
|
</div>
|
|
229
229
|
<div className="flex flex-wrap items-baseline gap-x-3 gap-y-1">
|
|
230
230
|
{query.isPending ? (
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{$ as e,Ln as t,Ur as n,ar as r,et as i,nt as a}from"./sidebar-DNVyJPfX.js";import{n as o}from"./dist-LxKJB-Vu.js";var s=r(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]),c=n(),l=(e,t=12)=>e.length>t?`${e.slice(0,Math.max(1,t-4))}…${e.slice(-4)}`:e;function u({value:n,maxLength:r=12,className:s,buttonClassName:u}){let d=n.length>r,f=l(n,r),p=async()=>{try{await navigator.clipboard.writeText(n),o.success(`Copied to clipboard`,{description:n})}catch{o.error(`Failed to copy value`)}},m=e=>{e.preventDefault(),e.stopPropagation(),p()},h=e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),e.stopPropagation(),p())},g=(0,c.jsx)(`span`,{translate:`no`,className:t(`font-mono text-xs tabular-nums whitespace-nowrap`,s),children:f});return(0,c.jsxs)(e,{children:[(0,c.jsx)(a,{render:(0,c.jsx)(`button`,{type:`button`,"aria-label":`Copy full value: ${n}`,translate:`no`,className:t(`ring-ring/30 bg-muted/40 border-border/70 inline-flex min-w-0 max-w-full cursor-pointer items-center rounded-md border px-1.5 py-0.5 align-top shadow-xs outline-none transition-[background-color,border-color,transform,box-shadow]`,`hover:bg-muted/70 active:scale-[0.98] active:bg-muted/85 focus-visible:ring-[2px]`,`touch-manipulation select-none motion-reduce:transition-none motion-reduce:active:scale-100`,!d&&`cursor-copy`,u),onClick:m,onKeyDown:h}),children:g}),(0,c.jsx)(i,{hidden:!d,children:(0,c.jsx)(`p`,{translate:`no`,className:`break-all font-mono text-xs tabular-nums`,children:n})})]})}export{l as n,s as r,u as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{$ as e,Fn as t,Ur as n,ei as r,et as i,nt as a,ri as o}from"./sidebar-DNVyJPfX.js";import{b as s}from"./insights-api-BigAU9sZ.js";var c=`[a-zA-Z0-9-]`,l=String.raw`0|[1-9]\d*`,u=String.raw`\d+`,d=String.raw`\d*[a-zA-Z-]${c}*`,ee=String.raw`(${l})\.(${l})\.(${l})`,te=String.raw`(${u})\.(${u})\.(${u})`,f=`(?:${d}|${l})`,p=`(?:${d}|${u})`,m=String.raw`(?:-(${f}(?:\.${f})*))`,h=String.raw`(?:-?(${p}(?:\.${p})*))`,g=`${c}+`,_=String.raw`(?:\+(${g}(?:\.${g})*))`,v=`v?${ee}${m}?${_}?`,y=String.raw`[v=\s]*${te}${h}?${_}?`,b=String.raw`${l}|x|X|\*`,x=String.raw`${u}|x|X|\*`;String.raw`[v=\s]*(${b})(?:\.(${b})(?:\.(${b})(?:${m})?${_}?)?)?`,String.raw`[v=\s]*(${x})(?:\.(${x})(?:\.(${x})(?:${h})?${_}?)?)?`,String.raw`(?:\^)`;var S=String.raw`(^|[^\d])(\d{1,${16}})(?:\.(\d{1,${16}}))?(?:\.(\d{1,${16}}))?`,C=String.raw`${S}(?:$|[^\d])`,w=String.raw`${S}(?:${m})?(?:${_})?(?:$|[^\d])`;function T(e){let t=[[String.raw`\s`,1],[String.raw`\d`,256],[c,250]];for(let[n,r]of t)e=e.split(`${n}*`).join(`${n}{0,${r}}`).split(`${n}+`).join(`${n}{1,${r}}`);return e}function E(e,t){return new RegExp(T(e),t)}E(`^${v}$`),E(`^${y}$`),E(C),E(w),E(`^${m}$`),E(`^${h}$`);var ne=e=>{if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.baseBundleId==`string`&&typeof t.baseFileHash==`string`&&typeof t.patchFileHash==`string`&&typeof t.patchStorageUri==`string`},re=e=>Array.isArray(e)?e.filter(ne):[],ie=e=>{let t=re(e.patches),n=new Set;return t.filter(e=>n.has(e.baseBundleId)?!1:(n.add(e.baseBundleId),!0))},D=e=>ie(e)[0]??null,ae=e=>D(e)?.baseBundleId??null,oe=e=>D(e)?.baseFileHash??null,se=e=>D(e)?.patchFileHash??null,O=1e3,k=O,A=`Invalid cohort. Use 1-1000 or a lowercase slug without spaces, up to 64 characters.`,j=/^[a-z0-9-]+$/;function M(e){if(!/^\d+$/.test(e))return null;let t=Number.parseInt(e,10);return Number.isNaN(t)||t<1||t>1e3?null:t}function N(e,t){return(e%t+t)%t}function P(e){let t=0;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);t=(t<<5)-t+r,t|=0}return t}function F(e,t){let n=Math.abs(e),r=Math.abs(t);for(;r!==0;){let e=n%r;n=r,r=e}return n}function I(e,t){let n=0,r=1,i=t,a=N(e,t);for(;a!==0;){let e=Math.floor(i/a);[n,r]=[r,n-e*r],[i,a]=[a,i-e*a]}if(i>1)throw Error(`No modular inverse for ${e} mod ${t}`);return N(n,t)}function L(e){let t=N(P(`${e}:multiplier`),997);for(t===0&&(t=1);F(t,O)!==1;)t=N(t+1,O),t===0&&(t=1);let n=N(P(`${e}:offset`),O);return{multiplier:t,offset:n,inverseMultiplier:I(t,O)}}function R(e){return e==null?k:e<=0?0:e>=1e3?O:Math.floor(e)}function z(e){let t=e.trim().toLowerCase(),n=M(t);return n===null?t:String(n)}function B(e){return M(z(e))}function V(e){return B(e)!==null}function H(e){let t=z(e);return t.length>0&&t.length<=64&&!/^\d+$/.test(t)&&j.test(t)}function U(e){let t=z(e);return V(t)||H(t)}function W(e,t){if(t<1||t>1e3)throw Error(`Invalid numeric cohort: ${t}`);let{offset:n,inverseMultiplier:r}=L(e);return N(r*(t-1-n),O)}var G=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,K=e=>typeof e==`string`&&G.test(e),q=e=>{if(!K(e))throw TypeError(`Expected a canonical lowercase UUIDv7`);let t=e.split(`-`).join(``).slice(0,12);return Number.parseInt(t,16)},J=e=>typeof e==`string`&&e.trim().length>0&&e.length<=1024?e:void 0,Y=e=>e===`24h`||e===`7d`||e===`30d`?e:void 0,ce=e=>e===`adoption`||e===`crashes`?e:void 0,le=e=>e===`12m`?e:Y(e);function X(e){return{platform:e.platform===`all`||e.platform===`ios`||e.platform===`android`?e.platform:void 0,channel:J(e.channel),appVersion:J(e.appVersion),window:le(e.window),bundleWindow:Y(e.bundleWindow),healthPlatform:e.healthPlatform===`ios`||e.healthPlatform===`android`?e.healthPlatform:void 0,healthChannel:J(e.healthChannel),releaseId:J(e.releaseId),healthChart:ce(e.healthChart),bundles:J(e.bundles)}}function Z(e){return{...X(e),version:J(e.version),page:typeof e.page==`number`&&Number.isSafeInteger(e.page)&&e.page>0?e.page:void 0}}function ue(e,t=Date.now()){if(!K(e))return`7d`;let n=t-q(e);return n<=864e5?`24h`:n<=7*864e5?`7d`:`30d`}var de=e=>e===void 0?void 0:[...new Set(e.split(`,`).filter(e=>e.length>0))],Q=o(r(),1),$=n();function fe({label:n,children:r}){let o=(0,Q.useId)(),[c,l]=(0,Q.useState)(!1);return(0,$.jsxs)(e,{open:c,onOpenChange:l,triggerId:o,children:[(0,$.jsx)(a,{id:o,"aria-describedby":c?`${o}-description`:void 0,closeOnClick:!1,onClick:()=>l(e=>!e),render:(0,$.jsx)(t,{"aria-label":n,className:`size-11 sm:size-7`,size:`icon`,variant:`ghost`}),children:(0,$.jsx)(s,{})}),(0,$.jsx)(i,{id:`${o}-description`,role:`tooltip`,className:`max-w-64`,side:`bottom`,children:r})]})}export{X as a,O as c,oe as d,se as f,R as h,Z as i,W as l,z as m,ue as n,q as o,U as p,de as r,A as s,fe as t,ae as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Fn as e,Hr as t,Nn as n,Ur as r,Wr as i,Z as a,ar as o,cr as s,ei as c,nr as l,p as u,ri as d,rr as f}from"./sidebar-DNVyJPfX.js";import{a as ee,c as te,d as p,i as ne,l as m,n as h,o as g,r as _,s as v,t as y,u as b}from"./alert-dialog-Bbk_4-WJ.js";import{a as x,b as re,d as ie,f as ae,h as oe,i as S,l as C,m as w,n as T,p as E,r as D,t as O,u as k,v as A,x as j,y as M}from"./field-BBDpjIqu.js";import{t as N}from"./clipboard-DS9ucUQL.js";import{t as P}from"./key-round-wS_SIZ6b.js";import{a as F,c as I,i as L,l as R,n as z,o as B,r as se,t as V}from"./dialog-Bqbb7B0N.js";import{t as H}from"./refresh-cw-BYgoNCco.js";import{n as U}from"./dist-LxKJB-Vu.js";import{a as W,i as G,n as K,o as q,r as J,t as ce}from"./table-Gm4qRWwE.js";var Y=o(`shield-off`,[[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71`,key:`1jlk70`}],[`path`,{d:`M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264`,key:`18rp1v`}]]),X=d(c(),1),le=f({method:`GET`}).middleware([l]).handler(i(`2c7f3cdb9bd3cab2c026a48abdc84c362db0362924a08679052a325640aec56b`)),ue=f({method:`POST`}).middleware([l]).handler(i(`68a2d94ee016be64936401f5eba60ab08a47ff373e1cf9de48e4413336e6034b`)),de=f({method:`POST`}).middleware([l]).handler(i(`a1cb80b19ca72a64fb631ca28ebb9b6941db245983de082d5dd3203ec2eef795`)),Z={list:[`api-keys`,`list`]},fe=()=>s({queryKey:Z.list,queryFn:()=>le()}),Q=()=>{let e=t();return p({mutationFn:e=>ue({data:{name:e}}),onSuccess:async()=>{await e.invalidateQueries({queryKey:Z.list})}})},pe=()=>{let e=t();return p({mutationFn:e=>de({data:{id:e}}),onSuccess:async()=>{await e.invalidateQueries({queryKey:Z.list})}})},$=r(),me=e=>new Date(e).toISOString().slice(0,10);function he(){let[t,n]=(0,X.useState)(!1),[r,i]=(0,X.useState)(``),[o,s]=(0,X.useState)(null),c=Q(),l=r.trim(),u=l.length>64?`Name must be 64 characters or fewer.`:null,d=()=>{i(``),s(null),c.reset()},f=e=>{n(e),e||d()};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(e,{onClick:()=>n(!0),children:[(0,$.jsx)(I,{"data-icon":`inline-start`}),`Create API key`]}),(0,$.jsx)(V,{open:t,onOpenChange:f,children:(0,$.jsxs)(z,{showCloseButton:o===null,children:[(0,$.jsxs)(F,{children:[(0,$.jsx)(B,{children:o===null?`Create API key`:`Save your API key`}),(0,$.jsx)(se,{children:o===null?`Name the app or environment that will use this key.`:`This key is shown once. Store it securely before closing.`})]}),o===null?(0,$.jsxs)(`form`,{onSubmit:async e=>{if(e.preventDefault(),!(l.length===0||u!==null))try{s((await c.mutateAsync(l)).apiKey),U.success(`API key created`)}catch(e){U.error(e instanceof Error?e.message:`Unable to create API key`)}},children:[(0,$.jsx)(S,{children:(0,$.jsxs)(O,{"data-invalid":u!==null||void 0,children:[(0,$.jsx)(x,{htmlFor:`api-key-name`,children:`Name`}),(0,$.jsx)(a,{id:`api-key-name`,autoComplete:`off`,maxLength:65,onChange:e=>i(e.target.value),placeholder:`Production app`,value:r}),(0,$.jsx)(T,{children:`Use a name you can identify before revoking the key.`}),(0,$.jsx)(D,{children:u})]})}),(0,$.jsx)(L,{className:`mt-4`,children:(0,$.jsxs)(e,{disabled:c.isPending||l.length===0||u!==null,type:`submit`,children:[c.isPending?(0,$.jsx)(R,{"data-icon":`inline-start`,className:`animate-spin`}):(0,$.jsx)(P,{"data-icon":`inline-start`}),`Create API key`]})})]}):(0,$.jsxs)(S,{children:[(0,$.jsxs)(O,{children:[(0,$.jsx)(x,{htmlFor:`created-api-key`,children:`API key`}),(0,$.jsxs)(`div`,{className:`flex gap-2`,children:[(0,$.jsx)(a,{id:`created-api-key`,className:`font-mono`,readOnly:!0,value:o}),(0,$.jsxs)(e,{onClick:async()=>{if(o!==null)try{await navigator.clipboard.writeText(o),U.success(`API key copied`)}catch{U.error(`Unable to copy API key`)}},type:`button`,variant:`outline`,children:[(0,$.jsx)(N,{"data-icon":`inline-start`}),`Copy`]})]})]}),(0,$.jsx)(L,{children:(0,$.jsxs)(e,{onClick:()=>f(!1),children:[(0,$.jsx)(j,{"data-icon":`inline-start`}),`Done`]})})]})]})})]})}function ge({record:t}){let[n,r]=(0,X.useState)(!1),i=pe(),a=async e=>{e.preventDefault();try{await i.mutateAsync(t.id),r(!1),U.success(`API key revoked`)}catch(e){U.error(e instanceof Error?e.message:`Unable to revoke API key`)}};return(0,$.jsxs)(y,{open:n,onOpenChange:e=>{i.isPending||r(e)},children:[(0,$.jsxs)(b,{render:(0,$.jsx)(e,{size:`sm`,variant:`ghost`}),children:[(0,$.jsx)(Y,{"data-icon":`inline-start`}),`Revoke`]}),(0,$.jsxs)(ne,{children:[(0,$.jsxs)(v,{children:[(0,$.jsx)(te,{children:(0,$.jsx)(Y,{})}),(0,$.jsxs)(m,{children:[`Revoke `,t.name,`?`]}),(0,$.jsxs)(ee,{children:[`Apps using `,t.prefix,`… will immediately lose OTA update and insights access. This action cannot be undone.`]})]}),(0,$.jsxs)(g,{children:[(0,$.jsx)(_,{disabled:i.isPending,children:`Cancel`}),(0,$.jsx)(h,{disabled:i.isPending,onClick:e=>void a(e),variant:`destructive`,children:`Revoke API key`})]})]})]})}function _e(){let t=fe();return(0,$.jsxs)(w,{className:`overflow-hidden shadow-sm`,children:[(0,$.jsxs)(A,{className:`flex-row items-center justify-between space-y-0 border-b px-4 py-3`,children:[(0,$.jsx)(M,{className:`text-sm`,children:(0,$.jsx)(`h2`,{children:`API keys`})}),(0,$.jsx)(he,{})]}),(0,$.jsx)(oe,{className:`p-0`,children:t.isError?(0,$.jsx)(`div`,{className:`p-4`,children:(0,$.jsxs)(k,{variant:`destructive`,children:[(0,$.jsx)(re,{}),(0,$.jsx)(E,{children:`API keys couldn't be loaded`}),(0,$.jsx)(ae,{children:`Check your connection and try again.`}),(0,$.jsx)(ie,{children:(0,$.jsxs)(e,{onClick:()=>void t.refetch(),size:`xs`,variant:`outline`,children:[(0,$.jsx)(H,{"data-icon":`inline-start`}),`Retry`]})})]})}):(0,$.jsxs)(ce,{"aria-label":`API keys`,className:`table-fixed`,children:[(0,$.jsx)(W,{children:(0,$.jsxs)(q,{children:[(0,$.jsx)(G,{children:`Key`}),(0,$.jsx)(G,{className:`w-32`,children:`Created`}),(0,$.jsx)(G,{className:`w-24 text-right`,children:(0,$.jsx)(`span`,{className:`sr-only`,children:`Actions`})})]})}),(0,$.jsx)(K,{children:t.isLoading?Array.from({length:3},(e,t)=>(0,$.jsxs)(q,{children:[(0,$.jsxs)(J,{className:`space-y-2 py-3`,children:[t===0?(0,$.jsx)(`span`,{className:`sr-only`,children:`Loading API keys`}):null,(0,$.jsx)(n,{className:`h-3.5 w-32`}),(0,$.jsx)(n,{className:`h-3 w-20`})]}),(0,$.jsx)(J,{children:(0,$.jsx)(n,{className:`h-3.5 w-20`})}),(0,$.jsx)(J,{children:(0,$.jsx)(n,{className:`ml-auto h-6 w-16`})})]},t)):t.data?.length===0?(0,$.jsx)(q,{children:(0,$.jsx)(J,{colSpan:3,className:`h-40 text-center text-muted-foreground`,children:(0,$.jsxs)(`div`,{className:`mx-auto flex max-w-xs flex-col items-center gap-2`,children:[(0,$.jsx)(P,{className:`size-5`}),(0,$.jsx)(`p`,{className:`font-medium text-foreground`,children:`No API keys`}),(0,$.jsx)(`p`,{children:`Create an API key to connect an app.`})]})})}):t.data?.map(e=>(0,$.jsxs)(q,{className:e.revoked_at_ms===null?void 0:`text-muted-foreground`,children:[(0,$.jsx)(J,{className:`whitespace-normal py-3`,children:(0,$.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,$.jsx)(`p`,{className:`break-words font-medium text-foreground`,children:e.name}),(0,$.jsxs)(`p`,{className:`font-mono text-xs text-muted-foreground`,children:[e.prefix,`…`]})]})}),(0,$.jsx)(J,{className:`text-xs text-muted-foreground`,children:(0,$.jsx)(`time`,{dateTime:new Date(e.created_at_ms).toISOString(),children:me(e.created_at_ms)})}),(0,$.jsx)(J,{className:`text-right`,children:e.revoked_at_ms===null?(0,$.jsx)(ge,{record:e}):(0,$.jsx)(C,{variant:`outline`,children:`Revoked`})})]},e.id))})]})})]})}function ve(){return(0,$.jsxs)(`div`,{className:`flex h-svh min-h-0 flex-col`,children:[(0,$.jsxs)(`header`,{className:`sticky top-0 z-10 flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 border-b bg-background px-3 py-3 sm:min-h-12 sm:flex-nowrap sm:bg-card/70 sm:px-4 sm:backdrop-blur-sm`,children:[(0,$.jsx)(u,{className:`-ml-1`}),(0,$.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,$.jsx)(P,{"aria-hidden":`true`,className:`size-3.5 text-muted-foreground`}),(0,$.jsx)(`h1`,{className:`text-sm font-medium`,children:`API keys`})]}),(0,$.jsx)(`p`,{className:`basis-full pl-9 text-xs text-muted-foreground sm:basis-auto sm:pl-0`,children:`API keys can download OTA updates and submit insights only.`})]}),(0,$.jsx)(`div`,{className:`min-h-0 min-w-0 flex-1 overflow-y-auto bg-muted/5 p-3 sm:p-6`,children:(0,$.jsx)(`div`,{className:`mx-auto w-full max-w-5xl`,children:(0,$.jsx)(_e,{})})})]})}export{ve as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./ConsoleFeatureUnavailable-jB4Loglh.js";var t=e;export{t as notFoundComponent};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ar as e}from"./sidebar-DNVyJPfX.js";var t=e(`arrow-left`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ar as e}from"./sidebar-DNVyJPfX.js";var t=e(`arrow-up-right`,[[`path`,{d:`M7 7h10v10`,key:`1tivn9`}],[`path`,{d:`M7 17 17 7`,key:`1vkiza`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ar as e}from"./sidebar-DNVyJPfX.js";var t=e(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./ConsoleFeatureUnavailable-jB4Loglh.js";var t=e;export{t as notFoundComponent};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/insights-CmraDzQh.js","assets/ConsoleFeatureUnavailable-jB4Loglh.js","assets/sidebar-DNVyJPfX.js","assets/console-features-api-BH5m_PtQ.js","assets/arrow-up-right-BtffZA6e.js","assets/NotFoundPage-DIqCpWa3.js","assets/empty-CuT2UhFp.js","assets/insights-vNRCrfnS.js","assets/useCompositeListItem-9E4pj_CH.js","assets/alert-dialog-Bbk_4-WJ.js","assets/select-BZZBXMkr.js","assets/field-BBDpjIqu.js","assets/tabs-C7FOEjFC.js","assets/insights-usage-rpc-DYEhsCKT.js","assets/valueToPercent-CH8GCHaL.js","assets/EventDetails-B6yUsyNA.js","assets/insights-api-BigAU9sZ.js","assets/HashValueDisplay-BFX_kY3-.js","assets/dist-LxKJB-Vu.js","assets/input-group-ja_30qaF.js","assets/smartphone-DpTFgtKf.js","assets/InsightsPageHeader-B892oVml.js","assets/list-CgrYiadM.js","assets/api-DCM0wr6O.js","assets/chevron-right-BqD5wtFb.js","assets/refresh-cw-BYgoNCco.js","assets/undo-2-CmrHjwFc.js","assets/InsightsInfo-BNO0WznZ.js","assets/table-Gm4qRWwE.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{r as e}from"./console-features-api-BH5m_PtQ.js";import{a as t,c as n,s as r}from"./useCompositeListItem-9E4pj_CH.js";import{a as i}from"./InsightsInfo-BNO0WznZ.js";var a=n(`/insights`)({beforeLoad:({context:t})=>e(t.queryClient,`insightsAnalytics`),notFoundComponent:r(()=>t(()=>import(`./insights-CmraDzQh.js`),__vite__mapDeps([0,1,2,3,4,5,6])),`notFoundComponent`),component:r(()=>t(()=>import(`./insights-vNRCrfnS.js`),__vite__mapDeps([7,2,8,3,9,10,11,12,13,14,15,16,17,18,19,20,21,22,6,23,4,24,25,26,27,28])),`component`),validateSearch:i});export{a as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Bn as e,Gt as t,Jn as n,Ln as r,Ur as i,Vt as a,Wr as o,ar as s,ei as c,nr as l,ri as u,rr as d}from"./sidebar-DNVyJPfX.js";import{r as f,t as p}from"./valueToPercent-CH8GCHaL.js";var m=s(`rotate-cw`,[[`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`,key:`1p45f6`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}]]),h=u(c()),g=h.createContext(void 0);function _(){let e=h.useContext(g);if(e===void 0)throw Error(n(51));return e}var v=function(e){return e.complete=`data-complete`,e.indeterminate=`data-indeterminate`,e.progressing=`data-progressing`,e}({}),y={status(e){return e===`progressing`?{[v.progressing]:``}:e===`complete`?{[v.complete]:``}:e===`indeterminate`?{[v.indeterminate]:``}:null}},b=i();function x(e,t){return t==null?`indeterminate progress`:e||`${t}%`}var S=h.forwardRef(function(n,r){let{format:i,getAriaValueText:o=x,locale:s,max:c=100,min:l=0,value:u,render:d,className:p,children:m,style:_,...v}=n,[S,C]=h.useState(),w=t(i),T=`indeterminate`;Number.isFinite(u)&&(T=u===c?`complete`:`progressing`);let E=f(u,s,w.current),D=h.useMemo(()=>({status:T}),[T]),O={"aria-labelledby":S,"aria-valuemax":c,"aria-valuemin":l,"aria-valuenow":u??void 0,"aria-valuetext":o(E,u),role:`progressbar`,children:(0,b.jsxs)(h.Fragment,{children:[m,(0,b.jsx)(`span`,{role:`presentation`,style:a,children:`x`})]})},k=h.useMemo(()=>({formattedValue:E,max:c,min:l,setLabelId:C,state:D,status:T,value:u}),[E,c,l,C,D,T,u]),A=e(`div`,n,{state:D,ref:r,props:[O,v],stateAttributesMapping:y});return(0,b.jsx)(g.Provider,{value:k,children:A})}),C=h.forwardRef(function(t,n){let{render:r,className:i,style:a,...o}=t,{state:s}=_();return e(`div`,t,{state:s,ref:n,props:o,stateAttributesMapping:y})}),w=h.forwardRef(function(t,n){let{render:r,className:i,style:a,...o}=t,{max:s,min:c,value:l,state:u}=_(),d=Number.isFinite(l)&&l!==null?p(l,c,s):null;return e(`div`,t,{state:u,ref:n,props:[{style:d==null?{}:{insetInlineStart:0,height:`inherit`,width:`${d}%`}},o],stateAttributesMapping:y})});function T({className:e,children:t,value:n,...i}){return(0,b.jsxs)(S,{value:n,"data-slot":`progress`,className:r(`w-full`,e),...i,children:[t,(0,b.jsx)(E,{children:(0,b.jsx)(D,{})})]})}function E({className:e,...t}){return(0,b.jsx)(C,{className:r(`relative flex h-1 w-full items-center overflow-x-hidden rounded-md bg-muted`,e),"data-slot":`progress-track`,...t})}function D({className:e,...t}){return(0,b.jsx)(w,{"data-slot":`progress-indicator`,className:r(`h-full bg-primary transition-transform motion-reduce:transition-none`,e),...t})}var O=d({method:`GET`}).middleware([l]).handler(o(`8a98cd9c178e4a54185d62c25a95f09d3d59850c43d3f5baa1563e1614ad942e`));export{T as n,m as r,O as t};
|