@ampless/admin 1.0.0-beta.89 → 1.0.0-beta.91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.d.ts +1 -1
- package/dist/{chunk-STD3UYXK.js → chunk-2ND3UUVK.js} +2 -2
- package/dist/{chunk-K67HINPW.js → chunk-2SYDNTEW.js} +1 -1
- package/dist/chunk-36MRQN3G.js +35 -0
- package/dist/{chunk-LUONBBOA.js → chunk-4YVI7TI4.js} +2 -2
- package/dist/{chunk-25CIZ4R4.js → chunk-6PAJSUMF.js} +1 -1
- package/dist/{chunk-F4BDO5XD.js → chunk-7VF6F2P5.js} +68 -2
- package/dist/{chunk-OVUT27GX.js → chunk-B7DJVPO3.js} +19 -7
- package/dist/{chunk-DLIP4JOY.js → chunk-CH2BLQD7.js} +2 -2
- package/dist/chunk-CU3CL5DB.js +167 -0
- package/dist/{chunk-OS6QI7VW.js → chunk-MOXQLS3E.js} +1 -1
- package/dist/{chunk-X4V3LAP5.js → chunk-QOUZDIVS.js} +2 -2
- package/dist/{chunk-OLI5JPHI.js → chunk-R5CWAZEY.js} +1 -1
- package/dist/{chunk-VDNJ5KXR.js → chunk-T3UDPN3W.js} +1 -1
- package/dist/{chunk-DIIJWZPF.js → chunk-TSPYGLX3.js} +58 -4
- package/dist/{chunk-T3R5QD5K.js → chunk-YGGBEDUG.js} +1 -1
- package/dist/{chunk-TSHYVPGI.js → chunk-ZDKVGJ4F.js} +2 -2
- package/dist/{chunk-VX5FWOOG.js → chunk-ZHOVAVUK.js} +1 -1
- package/dist/components/account-view.d.ts +7 -0
- package/dist/components/account-view.js +10 -0
- package/dist/components/admin-dashboard.js +3 -3
- package/dist/components/edit-post-view.js +5 -5
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.js +7 -7
- package/dist/components/login-view.js +4 -3
- package/dist/components/mcp-tokens-view.js +3 -3
- package/dist/components/media-view.js +5 -5
- package/dist/components/new-post-view.js +5 -5
- package/dist/components/plugin-settings-form.js +3 -3
- package/dist/components/posts-list-view.js +3 -3
- package/dist/components/users-list-view.js +3 -3
- package/dist/{i18n-BA6o0jvS.d.ts → i18n-DiA-HQ9_.d.ts} +85 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/pages/index.d.ts +13 -2
- package/dist/pages/index.js +37 -22
- package/package.json +5 -5
package/dist/api/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import {
|
|
3
3
|
PostForm
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-QOUZDIVS.js";
|
|
5
5
|
import {
|
|
6
6
|
useT
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ZHOVAVUK.js";
|
|
8
8
|
|
|
9
9
|
// src/components/new-post-view.tsx
|
|
10
10
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// src/lib/passkey.ts
|
|
2
|
+
import { signIn } from "aws-amplify/auth";
|
|
3
|
+
var FIRST_FACTOR_SELECTION = "CONTINUE_SIGN_IN_WITH_FIRST_FACTOR_SELECTION";
|
|
4
|
+
function isWebAuthnSupported() {
|
|
5
|
+
return typeof window !== "undefined" && typeof window.PublicKeyCredential !== "undefined" && typeof navigator !== "undefined" && typeof navigator.credentials !== "undefined" && typeof navigator.credentials.get === "function";
|
|
6
|
+
}
|
|
7
|
+
function classifyPasskeyError(err) {
|
|
8
|
+
const name = typeof err === "object" && err !== null && "name" in err ? String(err.name) : "";
|
|
9
|
+
if (name === "NotAllowedError") return "cancelled";
|
|
10
|
+
if (name === "SecurityError") return "rpMismatch";
|
|
11
|
+
return "failed";
|
|
12
|
+
}
|
|
13
|
+
function interpretPasskeySignInResult(result) {
|
|
14
|
+
if (result.isSignedIn) return { status: "signedIn" };
|
|
15
|
+
if (result.nextStep.signInStep === FIRST_FACTOR_SELECTION) {
|
|
16
|
+
return { status: "noPasskey" };
|
|
17
|
+
}
|
|
18
|
+
return { status: "otherStep", step: result.nextStep.signInStep };
|
|
19
|
+
}
|
|
20
|
+
async function signInWithPasskey(username) {
|
|
21
|
+
const result = await signIn({
|
|
22
|
+
username,
|
|
23
|
+
options: {
|
|
24
|
+
authFlowType: "USER_AUTH",
|
|
25
|
+
preferredChallenge: "WEB_AUTHN"
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return interpretPasskeySignInResult(result);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export {
|
|
32
|
+
isWebAuthnSupported,
|
|
33
|
+
classifyPasskeyError,
|
|
34
|
+
signInWithPasskey
|
|
35
|
+
};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import {
|
|
3
3
|
MediaUploader
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-CH2BLQD7.js";
|
|
5
5
|
import {
|
|
6
6
|
useT
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ZHOVAVUK.js";
|
|
8
8
|
|
|
9
9
|
// src/components/media-view.tsx
|
|
10
10
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
'use client';
|
|
2
|
+
import {
|
|
3
|
+
classifyPasskeyError,
|
|
4
|
+
isWebAuthnSupported,
|
|
5
|
+
signInWithPasskey
|
|
6
|
+
} from "./chunk-36MRQN3G.js";
|
|
2
7
|
import {
|
|
3
8
|
useT
|
|
4
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-ZHOVAVUK.js";
|
|
5
10
|
|
|
6
11
|
// src/components/login-view.tsx
|
|
7
|
-
import { useState } from "react";
|
|
12
|
+
import { useEffect, useRef, useState } from "react";
|
|
8
13
|
import { useRouter } from "next/navigation";
|
|
14
|
+
import { Fingerprint } from "lucide-react";
|
|
9
15
|
import {
|
|
10
16
|
signIn,
|
|
11
17
|
signUp,
|
|
@@ -24,6 +30,7 @@ import {
|
|
|
24
30
|
CardDescription
|
|
25
31
|
} from "@ampless/runtime/ui";
|
|
26
32
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
33
|
+
var LAST_EMAIL_KEY = "ampless.lastSignInEmail";
|
|
27
34
|
function LoginPage() {
|
|
28
35
|
const router = useRouter();
|
|
29
36
|
const t = useT();
|
|
@@ -34,6 +41,49 @@ function LoginPage() {
|
|
|
34
41
|
const [error, setError] = useState(null);
|
|
35
42
|
const [info, setInfo] = useState(null);
|
|
36
43
|
const [loading, setLoading] = useState(false);
|
|
44
|
+
const [passkeySupported, setPasskeySupported] = useState(false);
|
|
45
|
+
const emailRef = useRef(null);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
setPasskeySupported(isWebAuthnSupported());
|
|
48
|
+
try {
|
|
49
|
+
const last = window.localStorage.getItem(LAST_EMAIL_KEY);
|
|
50
|
+
if (last) setEmail(last);
|
|
51
|
+
} catch {
|
|
52
|
+
}
|
|
53
|
+
}, []);
|
|
54
|
+
function rememberEmail(value) {
|
|
55
|
+
try {
|
|
56
|
+
window.localStorage.setItem(LAST_EMAIL_KEY, value);
|
|
57
|
+
} catch {
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function handlePasskeySignIn() {
|
|
61
|
+
setError(null);
|
|
62
|
+
setInfo(null);
|
|
63
|
+
if (!email) {
|
|
64
|
+
setError(t("auth.passkey.emailRequired"));
|
|
65
|
+
emailRef.current?.focus();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
setLoading(true);
|
|
69
|
+
try {
|
|
70
|
+
const outcome = await signInWithPasskey(email);
|
|
71
|
+
if (outcome.status === "signedIn") {
|
|
72
|
+
rememberEmail(email);
|
|
73
|
+
router.push("/admin");
|
|
74
|
+
router.refresh();
|
|
75
|
+
} else if (outcome.status === "noPasskey") {
|
|
76
|
+
setInfo(t("auth.passkey.noneRegistered"));
|
|
77
|
+
} else {
|
|
78
|
+
setError(t("auth.additionalStep", { step: outcome.step }));
|
|
79
|
+
}
|
|
80
|
+
} catch (err) {
|
|
81
|
+
console.error("[login-view] passkey sign-in failed", err);
|
|
82
|
+
setError(t(`auth.passkey.${classifyPasskeyError(err)}`));
|
|
83
|
+
} finally {
|
|
84
|
+
setLoading(false);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
37
87
|
function go(next) {
|
|
38
88
|
setMode(next);
|
|
39
89
|
setError(null);
|
|
@@ -50,6 +100,7 @@ function LoginPage() {
|
|
|
50
100
|
if (mode === "signIn") {
|
|
51
101
|
const result = await signIn({ username: email, password });
|
|
52
102
|
if (result.isSignedIn) {
|
|
103
|
+
rememberEmail(email);
|
|
53
104
|
router.push("/admin");
|
|
54
105
|
router.refresh();
|
|
55
106
|
} else {
|
|
@@ -109,6 +160,7 @@ function LoginPage() {
|
|
|
109
160
|
Input,
|
|
110
161
|
{
|
|
111
162
|
id: "email",
|
|
163
|
+
ref: emailRef,
|
|
112
164
|
type: "email",
|
|
113
165
|
required: true,
|
|
114
166
|
value: email,
|
|
@@ -149,6 +201,20 @@ function LoginPage() {
|
|
|
149
201
|
info && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: info }),
|
|
150
202
|
error && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: error }),
|
|
151
203
|
/* @__PURE__ */ jsx(Button, { type: "submit", className: "w-full", disabled: loading, children: loading ? t("auth.common.working") : t(`auth.${mode}.submit`) }),
|
|
204
|
+
mode === "signIn" && passkeySupported && /* @__PURE__ */ jsxs(
|
|
205
|
+
Button,
|
|
206
|
+
{
|
|
207
|
+
type: "button",
|
|
208
|
+
variant: "outline",
|
|
209
|
+
className: "w-full gap-2",
|
|
210
|
+
disabled: loading,
|
|
211
|
+
onClick: () => void handlePasskeySignIn(),
|
|
212
|
+
children: [
|
|
213
|
+
/* @__PURE__ */ jsx(Fingerprint, { className: "h-4 w-4" }),
|
|
214
|
+
t("auth.signIn.passkeyButton")
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
),
|
|
152
218
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1 text-center text-sm", children: [
|
|
153
219
|
mode === "signIn" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
154
220
|
/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
'use client';
|
|
2
|
+
import {
|
|
3
|
+
setMcpTokenStore
|
|
4
|
+
} from "./chunk-C7G5AQ3L.js";
|
|
2
5
|
import {
|
|
3
6
|
invalidateSiteSettingsCache
|
|
4
7
|
} from "./chunk-D72XF3Q3.js";
|
|
5
8
|
import {
|
|
6
9
|
clearAllDrafts
|
|
7
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-QOUZDIVS.js";
|
|
8
11
|
import {
|
|
9
12
|
setAdminCmsConfigClient
|
|
10
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-R5CWAZEY.js";
|
|
11
14
|
import {
|
|
12
15
|
setAdminMediaContext
|
|
13
16
|
} from "./chunk-2ITWLRYF.js";
|
|
14
|
-
import {
|
|
15
|
-
setMcpTokenStore
|
|
16
|
-
} from "./chunk-C7G5AQ3L.js";
|
|
17
17
|
import {
|
|
18
18
|
useLocale,
|
|
19
19
|
useT
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-ZHOVAVUK.js";
|
|
21
21
|
|
|
22
22
|
// src/lib/amplify-client.ts
|
|
23
23
|
import { Amplify } from "aws-amplify";
|
|
@@ -342,6 +342,7 @@ import {
|
|
|
342
342
|
Puzzle,
|
|
343
343
|
LogOut,
|
|
344
344
|
ExternalLink,
|
|
345
|
+
UserCircle,
|
|
345
346
|
Menu,
|
|
346
347
|
X
|
|
347
348
|
} from "lucide-react";
|
|
@@ -466,7 +467,18 @@ function Sidebar({
|
|
|
466
467
|
]
|
|
467
468
|
}
|
|
468
469
|
),
|
|
469
|
-
/* @__PURE__ */
|
|
470
|
+
/* @__PURE__ */ jsxs(
|
|
471
|
+
Link,
|
|
472
|
+
{
|
|
473
|
+
href: "/admin/account",
|
|
474
|
+
className: "flex items-center gap-3 rounded-md px-3 py-2 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground",
|
|
475
|
+
title: t("sidebar.account"),
|
|
476
|
+
children: [
|
|
477
|
+
/* @__PURE__ */ jsx2(UserCircle, { className: "h-4 w-4 shrink-0" }),
|
|
478
|
+
/* @__PURE__ */ jsx2("span", { className: "truncate", children: email })
|
|
479
|
+
]
|
|
480
|
+
}
|
|
481
|
+
),
|
|
470
482
|
/* @__PURE__ */ jsxs(
|
|
471
483
|
Button,
|
|
472
484
|
{
|
|
@@ -3,13 +3,13 @@ import {
|
|
|
3
3
|
ImageUploadDialog,
|
|
4
4
|
createMediaRow,
|
|
5
5
|
getMediaProcessingDefaults
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-R5CWAZEY.js";
|
|
7
7
|
import {
|
|
8
8
|
publicMediaUrl
|
|
9
9
|
} from "./chunk-2ITWLRYF.js";
|
|
10
10
|
import {
|
|
11
11
|
useT
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-ZHOVAVUK.js";
|
|
13
13
|
|
|
14
14
|
// src/components/media-uploader.tsx
|
|
15
15
|
import { useState, useEffect, useCallback, useRef } from "react";
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import {
|
|
3
|
+
isWebAuthnSupported
|
|
4
|
+
} from "./chunk-36MRQN3G.js";
|
|
5
|
+
import {
|
|
6
|
+
useT
|
|
7
|
+
} from "./chunk-ZHOVAVUK.js";
|
|
8
|
+
|
|
9
|
+
// src/components/account-view.tsx
|
|
10
|
+
import { useEffect, useState } from "react";
|
|
11
|
+
import {
|
|
12
|
+
Button,
|
|
13
|
+
Table,
|
|
14
|
+
TableBody,
|
|
15
|
+
TableCell,
|
|
16
|
+
TableHead,
|
|
17
|
+
TableHeader,
|
|
18
|
+
TableRow
|
|
19
|
+
} from "@ampless/runtime/ui";
|
|
20
|
+
|
|
21
|
+
// src/lib/passkey-store.ts
|
|
22
|
+
import {
|
|
23
|
+
associateWebAuthnCredential,
|
|
24
|
+
listWebAuthnCredentials,
|
|
25
|
+
deleteWebAuthnCredential
|
|
26
|
+
} from "aws-amplify/auth";
|
|
27
|
+
var defaultPasskeyApi = {
|
|
28
|
+
async register() {
|
|
29
|
+
await associateWebAuthnCredential();
|
|
30
|
+
},
|
|
31
|
+
async list() {
|
|
32
|
+
const credentials = [];
|
|
33
|
+
let nextToken;
|
|
34
|
+
do {
|
|
35
|
+
const page = await listWebAuthnCredentials(nextToken ? { nextToken } : void 0);
|
|
36
|
+
for (const cred of page.credentials) {
|
|
37
|
+
if (!cred.credentialId) continue;
|
|
38
|
+
credentials.push({
|
|
39
|
+
credentialId: cred.credentialId,
|
|
40
|
+
friendlyName: cred.friendlyCredentialName,
|
|
41
|
+
createdAt: cred.createdAt ? cred.createdAt.toISOString() : null
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
nextToken = page.nextToken;
|
|
45
|
+
} while (nextToken);
|
|
46
|
+
credentials.sort((a, b) => {
|
|
47
|
+
if (!a.createdAt) return 1;
|
|
48
|
+
if (!b.createdAt) return -1;
|
|
49
|
+
return b.createdAt.localeCompare(a.createdAt);
|
|
50
|
+
});
|
|
51
|
+
return credentials;
|
|
52
|
+
},
|
|
53
|
+
async remove(credentialId) {
|
|
54
|
+
await deleteWebAuthnCredential({ credentialId });
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var api = defaultPasskeyApi;
|
|
58
|
+
function getPasskeyApi() {
|
|
59
|
+
return api;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// src/components/account-view.tsx
|
|
63
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
64
|
+
function formatDate(iso) {
|
|
65
|
+
if (!iso) return "";
|
|
66
|
+
const d = new Date(iso);
|
|
67
|
+
if (Number.isNaN(d.getTime())) return "";
|
|
68
|
+
return d.toLocaleString();
|
|
69
|
+
}
|
|
70
|
+
function AccountView({ currentUserEmail }) {
|
|
71
|
+
const t = useT();
|
|
72
|
+
const [supported, setSupported] = useState(false);
|
|
73
|
+
const [supportResolved, setSupportResolved] = useState(false);
|
|
74
|
+
const [passkeys, setPasskeys] = useState(null);
|
|
75
|
+
const [loading, setLoading] = useState(true);
|
|
76
|
+
const [loadError, setLoadError] = useState(null);
|
|
77
|
+
const [adding, setAdding] = useState(false);
|
|
78
|
+
const [addError, setAddError] = useState(null);
|
|
79
|
+
async function loadPasskeys() {
|
|
80
|
+
setLoading(true);
|
|
81
|
+
setLoadError(null);
|
|
82
|
+
try {
|
|
83
|
+
const list = await getPasskeyApi().list();
|
|
84
|
+
setPasskeys(list);
|
|
85
|
+
} catch (err) {
|
|
86
|
+
console.error("[account-view] list passkeys failed", err);
|
|
87
|
+
setLoadError(err instanceof Error ? err.message : String(err));
|
|
88
|
+
} finally {
|
|
89
|
+
setLoading(false);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
const ok = isWebAuthnSupported();
|
|
94
|
+
setSupported(ok);
|
|
95
|
+
setSupportResolved(true);
|
|
96
|
+
if (ok) void loadPasskeys();
|
|
97
|
+
else setLoading(false);
|
|
98
|
+
}, []);
|
|
99
|
+
async function handleAdd() {
|
|
100
|
+
setAdding(true);
|
|
101
|
+
setAddError(null);
|
|
102
|
+
try {
|
|
103
|
+
await getPasskeyApi().register();
|
|
104
|
+
await loadPasskeys();
|
|
105
|
+
} catch (err) {
|
|
106
|
+
console.error("[account-view] register passkey failed", err);
|
|
107
|
+
setAddError(err instanceof Error ? err.message : String(err));
|
|
108
|
+
} finally {
|
|
109
|
+
setAdding(false);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function handleRemove(credentialId) {
|
|
113
|
+
if (!confirm(t("account.passkeys.deleteConfirm"))) return;
|
|
114
|
+
try {
|
|
115
|
+
await getPasskeyApi().remove(credentialId);
|
|
116
|
+
await loadPasskeys();
|
|
117
|
+
} catch (err) {
|
|
118
|
+
console.error("[account-view] remove passkey failed", err);
|
|
119
|
+
alert(err instanceof Error ? err.message : String(err));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-4xl space-y-8 p-4 md:p-8", children: [
|
|
123
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
124
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold md:text-3xl", children: t("account.title") }),
|
|
125
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: currentUserEmail })
|
|
126
|
+
] }),
|
|
127
|
+
/* @__PURE__ */ jsxs("section", { className: "space-y-4 rounded-md border bg-card p-4 md:p-6", children: [
|
|
128
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
|
|
129
|
+
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: t("account.passkeys.title") }) }),
|
|
130
|
+
supportResolved && supported && /* @__PURE__ */ jsx(Button, { type: "button", disabled: adding, onClick: () => void handleAdd(), children: adding ? t("account.passkeys.adding") : t("account.passkeys.add") })
|
|
131
|
+
] }),
|
|
132
|
+
addError && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: addError }),
|
|
133
|
+
supportResolved && !supported ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("account.passkeys.unsupported") }) : loading ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("account.passkeys.loading") }) : loadError ? /* @__PURE__ */ jsxs("p", { className: "text-sm text-destructive", children: [
|
|
134
|
+
t("account.passkeys.loadError"),
|
|
135
|
+
": ",
|
|
136
|
+
loadError
|
|
137
|
+
] }) : !passkeys || passkeys.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("account.passkeys.empty") }) : /* @__PURE__ */ jsx("div", { className: "overflow-x-auto rounded-md border", children: /* @__PURE__ */ jsxs(Table, { children: [
|
|
138
|
+
/* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
139
|
+
/* @__PURE__ */ jsx(TableHead, { children: t("account.passkeys.columnName") }),
|
|
140
|
+
/* @__PURE__ */ jsx(TableHead, { children: t("account.passkeys.columnCreated") }),
|
|
141
|
+
/* @__PURE__ */ jsx(TableHead, { className: "w-[1%] whitespace-nowrap", children: t("common.actions") })
|
|
142
|
+
] }) }),
|
|
143
|
+
/* @__PURE__ */ jsx(TableBody, { children: passkeys.map((pk) => /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
144
|
+
/* @__PURE__ */ jsx(TableCell, { className: "font-medium", children: pk.friendlyName || /* @__PURE__ */ jsxs("span", { className: "font-mono text-xs text-muted-foreground", children: [
|
|
145
|
+
pk.credentialId.slice(0, 12),
|
|
146
|
+
"\u2026"
|
|
147
|
+
] }) }),
|
|
148
|
+
/* @__PURE__ */ jsx(TableCell, { className: "text-xs text-muted-foreground", children: pk.createdAt ? /* @__PURE__ */ jsx("span", { title: pk.createdAt, children: formatDate(pk.createdAt) }) : "" }),
|
|
149
|
+
/* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(
|
|
150
|
+
Button,
|
|
151
|
+
{
|
|
152
|
+
type: "button",
|
|
153
|
+
variant: "outline",
|
|
154
|
+
size: "sm",
|
|
155
|
+
onClick: () => void handleRemove(pk.credentialId),
|
|
156
|
+
children: t("account.passkeys.delete")
|
|
157
|
+
}
|
|
158
|
+
) })
|
|
159
|
+
] }, pk.credentialId)) })
|
|
160
|
+
] }) })
|
|
161
|
+
] })
|
|
162
|
+
] });
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export {
|
|
166
|
+
AccountView
|
|
167
|
+
};
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
getAdminCmsConfig,
|
|
5
5
|
getMediaProcessingDefaults,
|
|
6
6
|
uploadProcessedImage
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-R5CWAZEY.js";
|
|
8
8
|
import {
|
|
9
9
|
getAdminEditorExtensions,
|
|
10
10
|
getAdminTiptapNodeHtml,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
} from "./chunk-2ITWLRYF.js";
|
|
16
16
|
import {
|
|
17
17
|
useT
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-ZHOVAVUK.js";
|
|
19
19
|
|
|
20
20
|
// src/components/media-picker.tsx
|
|
21
21
|
import { useEffect, useRef, useState } from "react";
|
|
@@ -41,7 +41,8 @@ var en_default = {
|
|
|
41
41
|
signOut: "Sign out",
|
|
42
42
|
site: "Site",
|
|
43
43
|
openMenu: "Open menu",
|
|
44
|
-
closeMenu: "Close menu"
|
|
44
|
+
closeMenu: "Close menu",
|
|
45
|
+
account: "Account"
|
|
45
46
|
},
|
|
46
47
|
dashboard: {
|
|
47
48
|
title: "Dashboard",
|
|
@@ -293,7 +294,8 @@ var en_default = {
|
|
|
293
294
|
description: "Sign in to manage your site.",
|
|
294
295
|
submit: "Sign in",
|
|
295
296
|
forgotPassword: "Forgot password?",
|
|
296
|
-
createAccount: "Create admin account"
|
|
297
|
+
createAccount: "Create admin account",
|
|
298
|
+
passkeyButton: "Sign in with passkey"
|
|
297
299
|
},
|
|
298
300
|
signUp: {
|
|
299
301
|
title: "Create admin account",
|
|
@@ -324,6 +326,14 @@ var en_default = {
|
|
|
324
326
|
invalidCredentials: "Invalid email or password.",
|
|
325
327
|
passwordTooShort: "Password must be at least 8 characters.",
|
|
326
328
|
userExists: "An account with this email already exists."
|
|
329
|
+
},
|
|
330
|
+
passkey: {
|
|
331
|
+
emailRequired: "Enter your email first, then sign in with your passkey.",
|
|
332
|
+
noneRegistered: "No passkey is registered for this account yet. Sign in with your password, then add one from the account page.",
|
|
333
|
+
cancelled: "Passkey sign-in was cancelled.",
|
|
334
|
+
unsupported: "This browser does not support passkeys.",
|
|
335
|
+
rpMismatch: "This site isn't configured for passkeys on this domain. Ask the site engineer to set the relyingPartyId in amplify/auth/resource.custom.ts.",
|
|
336
|
+
failed: "Passkey sign-in failed. Try again, or sign in with your password."
|
|
327
337
|
}
|
|
328
338
|
},
|
|
329
339
|
plugins: {
|
|
@@ -385,6 +395,23 @@ var en_default = {
|
|
|
385
395
|
tagLabel: "Tag",
|
|
386
396
|
permalink: "Permalink",
|
|
387
397
|
shareOnX: "Share on X"
|
|
398
|
+
},
|
|
399
|
+
account: {
|
|
400
|
+
title: "Account",
|
|
401
|
+
passkeys: {
|
|
402
|
+
title: "Passkeys",
|
|
403
|
+
add: "Add passkey",
|
|
404
|
+
adding: "Adding...",
|
|
405
|
+
added: "Passkey added.",
|
|
406
|
+
loading: "Loading passkeys...",
|
|
407
|
+
empty: "No passkeys yet. Add one to sign in with Face ID, Touch ID, or your security key.",
|
|
408
|
+
columnName: "Name",
|
|
409
|
+
columnCreated: "Created",
|
|
410
|
+
delete: "Delete",
|
|
411
|
+
deleteConfirm: "Delete this passkey? You will no longer be able to sign in with it.",
|
|
412
|
+
loadError: "Failed to load passkeys",
|
|
413
|
+
unsupported: "This browser does not support passkeys."
|
|
414
|
+
}
|
|
388
415
|
}
|
|
389
416
|
};
|
|
390
417
|
|
|
@@ -431,7 +458,8 @@ var ja_default = {
|
|
|
431
458
|
signOut: "\u30B5\u30A4\u30F3\u30A2\u30A6\u30C8",
|
|
432
459
|
site: "\u30B5\u30A4\u30C8",
|
|
433
460
|
openMenu: "\u30E1\u30CB\u30E5\u30FC\u3092\u958B\u304F",
|
|
434
|
-
closeMenu: "\u30E1\u30CB\u30E5\u30FC\u3092\u9589\u3058\u308B"
|
|
461
|
+
closeMenu: "\u30E1\u30CB\u30E5\u30FC\u3092\u9589\u3058\u308B",
|
|
462
|
+
account: "\u30A2\u30AB\u30A6\u30F3\u30C8"
|
|
435
463
|
},
|
|
436
464
|
dashboard: {
|
|
437
465
|
title: "\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9",
|
|
@@ -683,7 +711,8 @@ var ja_default = {
|
|
|
683
711
|
description: "\u30B5\u30A4\u30F3\u30A4\u30F3\u3057\u3066\u30B5\u30A4\u30C8\u3092\u7BA1\u7406\u3057\u307E\u3059\u3002",
|
|
684
712
|
submit: "\u30B5\u30A4\u30F3\u30A4\u30F3",
|
|
685
713
|
forgotPassword: "\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u304A\u5FD8\u308C\u3067\u3059\u304B?",
|
|
686
|
-
createAccount: "\u7BA1\u7406\u8005\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u4F5C\u6210"
|
|
714
|
+
createAccount: "\u7BA1\u7406\u8005\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u4F5C\u6210",
|
|
715
|
+
passkeyButton: "\u30D1\u30B9\u30AD\u30FC\u3067\u30B5\u30A4\u30F3\u30A4\u30F3"
|
|
687
716
|
},
|
|
688
717
|
signUp: {
|
|
689
718
|
title: "\u7BA1\u7406\u8005\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4F5C\u6210",
|
|
@@ -714,6 +743,14 @@ var ja_default = {
|
|
|
714
743
|
invalidCredentials: "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u307E\u305F\u306F\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093\u3002",
|
|
715
744
|
passwordTooShort: "\u30D1\u30B9\u30EF\u30FC\u30C9\u306F8\u6587\u5B57\u4EE5\u4E0A\u5FC5\u8981\u3067\u3059\u3002",
|
|
716
745
|
userExists: "\u3053\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002"
|
|
746
|
+
},
|
|
747
|
+
passkey: {
|
|
748
|
+
emailRequired: "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u3066\u304B\u3089\u3001\u30D1\u30B9\u30AD\u30FC\u3067\u30B5\u30A4\u30F3\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
749
|
+
noneRegistered: "\u3053\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u306F\u307E\u3060\u30D1\u30B9\u30AD\u30FC\u304C\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u30D1\u30B9\u30EF\u30FC\u30C9\u3067\u30B5\u30A4\u30F3\u30A4\u30F3\u3057\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u30DA\u30FC\u30B8\u304B\u3089\u767B\u9332\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
750
|
+
cancelled: "\u30D1\u30B9\u30AD\u30FC\u306E\u30B5\u30A4\u30F3\u30A4\u30F3\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F\u3002",
|
|
751
|
+
unsupported: "\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u306F\u30D1\u30B9\u30AD\u30FC\u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u305B\u3093\u3002",
|
|
752
|
+
rpMismatch: "\u3053\u306E\u30C9\u30E1\u30A4\u30F3\u3067\u306F\u30D1\u30B9\u30AD\u30FC\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u30B5\u30A4\u30C8\u30A8\u30F3\u30B8\u30CB\u30A2\u306B amplify/auth/resource.custom.ts \u306E relyingPartyId \u8A2D\u5B9A\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
753
|
+
failed: "\u30D1\u30B9\u30AD\u30FC\u306E\u30B5\u30A4\u30F3\u30A4\u30F3\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u8A66\u3059\u304B\u3001\u30D1\u30B9\u30EF\u30FC\u30C9\u3067\u30B5\u30A4\u30F3\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002"
|
|
717
754
|
}
|
|
718
755
|
},
|
|
719
756
|
plugins: {
|
|
@@ -775,6 +812,23 @@ var ja_default = {
|
|
|
775
812
|
tagLabel: "\u30BF\u30B0",
|
|
776
813
|
permalink: "\u30D1\u30FC\u30DE\u30EA\u30F3\u30AF",
|
|
777
814
|
shareOnX: "X\u3067\u5171\u6709"
|
|
815
|
+
},
|
|
816
|
+
account: {
|
|
817
|
+
title: "\u30A2\u30AB\u30A6\u30F3\u30C8",
|
|
818
|
+
passkeys: {
|
|
819
|
+
title: "\u30D1\u30B9\u30AD\u30FC",
|
|
820
|
+
add: "\u30D1\u30B9\u30AD\u30FC\u3092\u8FFD\u52A0",
|
|
821
|
+
adding: "\u8FFD\u52A0\u4E2D...",
|
|
822
|
+
added: "\u30D1\u30B9\u30AD\u30FC\u3092\u8FFD\u52A0\u3057\u307E\u3057\u305F\u3002",
|
|
823
|
+
loading: "\u30D1\u30B9\u30AD\u30FC\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...",
|
|
824
|
+
empty: "\u30D1\u30B9\u30AD\u30FC\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002\u8FFD\u52A0\u3059\u308B\u3068 Face ID\u30FBTouch ID\u30FB\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30AD\u30FC\u3067\u30B5\u30A4\u30F3\u30A4\u30F3\u3067\u304D\u307E\u3059\u3002",
|
|
825
|
+
columnName: "\u540D\u524D",
|
|
826
|
+
columnCreated: "\u4F5C\u6210\u65E5",
|
|
827
|
+
delete: "\u524A\u9664",
|
|
828
|
+
deleteConfirm: "\u3053\u306E\u30D1\u30B9\u30AD\u30FC\u3092\u524A\u9664\u3057\u307E\u3059\u304B? \u3053\u306E\u30D1\u30B9\u30AD\u30FC\u3067\u306F\u30B5\u30A4\u30F3\u30A4\u30F3\u3067\u304D\u306A\u304F\u306A\u308A\u307E\u3059\u3002",
|
|
829
|
+
loadError: "\u30D1\u30B9\u30AD\u30FC\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
830
|
+
unsupported: "\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u306F\u30D1\u30B9\u30AD\u30FC\u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u305B\u3093\u3002"
|
|
831
|
+
}
|
|
778
832
|
}
|
|
779
833
|
};
|
|
780
834
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import {
|
|
3
3
|
PostForm
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-QOUZDIVS.js";
|
|
5
5
|
import {
|
|
6
6
|
useT
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ZHOVAVUK.js";
|
|
8
8
|
|
|
9
9
|
// src/components/edit-post-view.tsx
|
|
10
10
|
import { useEffect, useState, use } from "react";
|