@anodb/core 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -8
- package/dist/blob.d.ts +3 -3
- package/dist/blob.js +1 -1
- package/dist/blob.js.map +1 -1
- package/dist/cli/init.js +1 -0
- package/dist/cli/init.js.map +1 -1
- package/dist/db.js +6 -2
- package/dist/db.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/kysely.d.ts +6 -5
- package/dist/kysely.js +3 -2
- package/dist/kysely.js.map +1 -1
- package/dist/react.d.ts +3 -2
- package/dist/react.js +3 -1
- package/dist/react.js.map +1 -1
- package/dist/result-types.d.ts +13 -0
- package/dist/result-types.js +157 -0
- package/dist/result-types.js.map +1 -0
- package/dist/schema.d.ts +7 -1
- package/dist/schema.js +8 -0
- package/dist/schema.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/ui.d.ts +161 -0
- package/dist/ui.js +402 -0
- package/dist/ui.js.map +1 -0
- package/docs/DECISIONS.md +1 -0
- package/package.json +3 -2
package/dist/ui.js
ADDED
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Ready-made React components for anoDB's sharing and device features. They are plain HTML with
|
|
5
|
+
* `anodb-*` class names and minimal layout styles, so they fit into any design:
|
|
6
|
+
*
|
|
7
|
+
* <PairDevice /> add a device to your identity (QR code + safety code)
|
|
8
|
+
* <DeviceList /> your devices, with revoke
|
|
9
|
+
* <InviteLink space={id} /> one-time invite link + QR, and the join requests to approve
|
|
10
|
+
* <JoinSpace /> paste / open an invite link, see invitations by npub
|
|
11
|
+
* <Members space={id} /> members with roles (owners / admins can change them)
|
|
12
|
+
*
|
|
13
|
+
* Links and QR codes are ordinary `https://your-app/#anodb=…` URLs: scanning one with a phone's
|
|
14
|
+
* camera opens your app with the request filled in. Nothing is approved without a click, and
|
|
15
|
+
* pairing always shows a code to compare on both devices.
|
|
16
|
+
*/
|
|
17
|
+
import qrcode from 'qrcode-generator';
|
|
18
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
19
|
+
import { useAnoDB } from './react.js';
|
|
20
|
+
const en = {
|
|
21
|
+
addDevice: 'Add a device',
|
|
22
|
+
addDeviceHint: 'On the new device, choose “This is a new device”, then scan its QR code with this device or paste its link here.',
|
|
23
|
+
pairingLink: 'Pairing link',
|
|
24
|
+
check: 'Check',
|
|
25
|
+
compare: 'Does the new device show this code?',
|
|
26
|
+
deviceName: 'Name for the new device',
|
|
27
|
+
approve: 'Yes, approve',
|
|
28
|
+
cancel: 'Cancel',
|
|
29
|
+
approved: 'Approved. The new device will finish setting up in a moment.',
|
|
30
|
+
newDevice: 'This is a new device',
|
|
31
|
+
newDeviceHint: 'Shows a QR code for one of your existing devices. This device then switches to that identity (its current local data is replaced).',
|
|
32
|
+
showQr: 'Show pairing QR code',
|
|
33
|
+
scanWithOther: 'Scan with your existing device, or copy the link to it. Then check that it shows this code:',
|
|
34
|
+
waiting: 'Waiting for approval…',
|
|
35
|
+
copy: 'Copy link',
|
|
36
|
+
copied: 'Copied',
|
|
37
|
+
devices: 'Your devices',
|
|
38
|
+
thisDevice: 'this device',
|
|
39
|
+
revoked: 'revoked',
|
|
40
|
+
revoke: 'Revoke',
|
|
41
|
+
confirmRevoke: 'Revoke for good?',
|
|
42
|
+
invite: 'Invite',
|
|
43
|
+
role: 'Role',
|
|
44
|
+
createLink: 'Create invite link',
|
|
45
|
+
linkHint: 'One-time link. It expires in {hours} h, and you approve each request below.',
|
|
46
|
+
requests: 'Join requests',
|
|
47
|
+
none: 'None',
|
|
48
|
+
approveRequest: 'Approve',
|
|
49
|
+
reject: 'Reject',
|
|
50
|
+
cannotInvite: 'Only owners and admins can invite.',
|
|
51
|
+
join: 'Join with a link',
|
|
52
|
+
inviteLink: 'Invite link',
|
|
53
|
+
yourName: 'Your name (shown to the admin)',
|
|
54
|
+
requestJoin: 'Request to join',
|
|
55
|
+
requested: 'Request sent. You join as soon as an admin approves it.',
|
|
56
|
+
joined: 'Joined',
|
|
57
|
+
invitations: 'Invitations',
|
|
58
|
+
accept: 'Accept',
|
|
59
|
+
decline: 'Decline',
|
|
60
|
+
members: 'Members',
|
|
61
|
+
you: 'you',
|
|
62
|
+
remove: 'Remove',
|
|
63
|
+
confirmRemove: 'Remove?',
|
|
64
|
+
invalidLink: 'This is not an anoDB link for this app.',
|
|
65
|
+
};
|
|
66
|
+
const ja = {
|
|
67
|
+
addDevice: '端末を追加',
|
|
68
|
+
addDeviceHint: '新しい端末で「この端末を追加する」を選び、表示された QR コードをこの端末で読み取るか、リンクをここに貼り付けてください。',
|
|
69
|
+
pairingLink: 'ペアリング用リンク',
|
|
70
|
+
check: '確認',
|
|
71
|
+
compare: '新しい端末に同じコードが表示されていますか?',
|
|
72
|
+
deviceName: '新しい端末の名前',
|
|
73
|
+
approve: 'はい、承認する',
|
|
74
|
+
cancel: 'キャンセル',
|
|
75
|
+
approved: '承認しました。まもなく新しい端末の設定が完了します。',
|
|
76
|
+
newDevice: 'この端末を追加する',
|
|
77
|
+
newDeviceHint: '既存の端末で読み取る QR コードを表示します。承認されると、この端末はそのアカウントに切り替わります(この端末にある今のデータは置き換わります)。',
|
|
78
|
+
showQr: 'ペアリング用 QR コードを表示',
|
|
79
|
+
scanWithOther: '既存の端末で読み取るか、リンクを送ってください。相手の端末に次のコードが出ていることを確認してください:',
|
|
80
|
+
waiting: '承認を待っています…',
|
|
81
|
+
copy: 'リンクをコピー',
|
|
82
|
+
copied: 'コピーしました',
|
|
83
|
+
devices: 'あなたの端末',
|
|
84
|
+
thisDevice: 'この端末',
|
|
85
|
+
revoked: '失効済み',
|
|
86
|
+
revoke: '失効',
|
|
87
|
+
confirmRevoke: '本当に失効させますか?',
|
|
88
|
+
invite: '招待',
|
|
89
|
+
role: '役割',
|
|
90
|
+
createLink: '招待リンクを作成',
|
|
91
|
+
linkHint: '1回限りのリンクです。{hours} 時間で期限が切れ、参加リクエストは下で1件ずつ承認します。',
|
|
92
|
+
requests: '参加リクエスト',
|
|
93
|
+
none: 'なし',
|
|
94
|
+
approveRequest: '承認',
|
|
95
|
+
reject: '拒否',
|
|
96
|
+
cannotInvite: '招待できるのはオーナーと管理者だけです。',
|
|
97
|
+
join: 'リンクで参加',
|
|
98
|
+
inviteLink: '招待リンク',
|
|
99
|
+
yourName: 'あなたの名前(管理者に表示されます)',
|
|
100
|
+
requestJoin: '参加をリクエスト',
|
|
101
|
+
requested: 'リクエストを送りました。管理者が承認すると参加できます。',
|
|
102
|
+
joined: '参加しました',
|
|
103
|
+
invitations: '招待',
|
|
104
|
+
accept: '参加する',
|
|
105
|
+
decline: '断る',
|
|
106
|
+
members: 'メンバー',
|
|
107
|
+
you: 'あなた',
|
|
108
|
+
remove: '外す',
|
|
109
|
+
confirmRemove: '外しますか?',
|
|
110
|
+
invalidLink: 'このアプリ用の anoDB のリンクではありません。',
|
|
111
|
+
};
|
|
112
|
+
const LABELS = { en, ja };
|
|
113
|
+
function detectLang() {
|
|
114
|
+
const l = typeof navigator !== 'undefined' ? navigator.language : '';
|
|
115
|
+
return /^ja/i.test(l) ? 'ja' : 'en';
|
|
116
|
+
}
|
|
117
|
+
function useLabels(p) {
|
|
118
|
+
return useMemo(() => ({ ...LABELS[p.lang ?? detectLang()], ...p.labels }), [p.lang, p.labels]);
|
|
119
|
+
}
|
|
120
|
+
function useSharingDB() {
|
|
121
|
+
return useAnoDB();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Re-read state that has no change event of its own (members, requests, devices…): on every
|
|
125
|
+
* database change and once a second. Re-renders only when the value changes.
|
|
126
|
+
*/
|
|
127
|
+
export function useLive(read, deps = []) {
|
|
128
|
+
const db = useSharingDB();
|
|
129
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
130
|
+
const fn = useCallback(() => read(db), [db, ...deps]);
|
|
131
|
+
const [value, setValue] = useState(fn);
|
|
132
|
+
const last = useRef(JSON.stringify(value));
|
|
133
|
+
useEffect(() => {
|
|
134
|
+
const update = () => {
|
|
135
|
+
const v = fn();
|
|
136
|
+
const s = JSON.stringify(v);
|
|
137
|
+
if (s !== last.current) {
|
|
138
|
+
last.current = s;
|
|
139
|
+
setValue(v);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
update();
|
|
143
|
+
const stop = db.onChange(update);
|
|
144
|
+
const t = setInterval(update, 1000);
|
|
145
|
+
return () => {
|
|
146
|
+
stop();
|
|
147
|
+
clearInterval(t);
|
|
148
|
+
};
|
|
149
|
+
}, [db, fn]);
|
|
150
|
+
return value;
|
|
151
|
+
}
|
|
152
|
+
// ---- links -----------------------------------------------------------------------------------
|
|
153
|
+
/** Wrap an `anodb://` link into an https URL of this app, so phones open it from a QR code. */
|
|
154
|
+
export function toAppLink(uri, base) {
|
|
155
|
+
const b = base ?? (typeof location !== 'undefined' ? `${location.origin}${location.pathname}` : '');
|
|
156
|
+
return b ? `${b}#anodb=${encodeURIComponent(uri)}` : uri;
|
|
157
|
+
}
|
|
158
|
+
/** Accepts an `anodb://…` link or an app link (`…#anodb=…`) and returns the `anodb://` link. */
|
|
159
|
+
export function parseAppLink(text) {
|
|
160
|
+
const t = text.trim();
|
|
161
|
+
if (t.startsWith('anodb://'))
|
|
162
|
+
return t;
|
|
163
|
+
try {
|
|
164
|
+
const hash = new URL(t).hash.replace(/^#/, '');
|
|
165
|
+
const v = new URLSearchParams(hash).get('anodb');
|
|
166
|
+
return v?.startsWith('anodb://') ? v : null;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** An `anodb://<kind>` link this page was opened with (`#anodb=…`), and a way to clear it. */
|
|
173
|
+
export function useIncomingLink(kind) {
|
|
174
|
+
const [link, setLink] = useState(null);
|
|
175
|
+
useEffect(() => {
|
|
176
|
+
const read = () => {
|
|
177
|
+
const l = typeof location !== 'undefined' ? parseAppLink(location.href) : null;
|
|
178
|
+
setLink(l?.startsWith(`anodb://${kind}`) ? l : null);
|
|
179
|
+
};
|
|
180
|
+
read();
|
|
181
|
+
window.addEventListener('hashchange', read);
|
|
182
|
+
return () => window.removeEventListener('hashchange', read);
|
|
183
|
+
}, [kind]);
|
|
184
|
+
const clear = useCallback(() => {
|
|
185
|
+
setLink(null);
|
|
186
|
+
if (typeof location !== 'undefined' && location.hash.includes('anodb='))
|
|
187
|
+
history.replaceState(null, '', `${location.pathname}${location.search}`);
|
|
188
|
+
}, []);
|
|
189
|
+
return [link, clear];
|
|
190
|
+
}
|
|
191
|
+
// ---- building blocks -------------------------------------------------------------------------
|
|
192
|
+
const col = { display: 'flex', flexDirection: 'column', gap: 8 };
|
|
193
|
+
const row = { display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap' };
|
|
194
|
+
const list = { listStyle: 'none', padding: 0, margin: 0, display: 'flex', flexDirection: 'column', gap: 6 };
|
|
195
|
+
const mono = { fontFamily: 'ui-monospace, monospace', wordBreak: 'break-all', fontSize: '0.85em' };
|
|
196
|
+
const codeStyle = { fontFamily: 'ui-monospace, monospace', fontSize: '1.6em', letterSpacing: '0.15em', fontWeight: 700 };
|
|
197
|
+
/** QR code as SVG (dark modules use `currentColor`). */
|
|
198
|
+
export function QRCode(props) {
|
|
199
|
+
const { path, n } = useMemo(() => {
|
|
200
|
+
const qr = qrcode(0, 'M');
|
|
201
|
+
qr.addData(props.value);
|
|
202
|
+
qr.make();
|
|
203
|
+
const n = qr.getModuleCount();
|
|
204
|
+
let d = '';
|
|
205
|
+
for (let r = 0; r < n; r++)
|
|
206
|
+
for (let c = 0; c < n; c++)
|
|
207
|
+
if (qr.isDark(r, c))
|
|
208
|
+
d += `M${c + 4} ${r + 4}h1v1h-1z`;
|
|
209
|
+
return { path: d, n: n + 8 };
|
|
210
|
+
}, [props.value]);
|
|
211
|
+
const size = props.size ?? 200;
|
|
212
|
+
return (_jsxs("svg", { className: props.className ?? 'anodb-qr', width: size, height: size, viewBox: `0 0 ${n} ${n}`, role: "img", "aria-label": props.title ?? 'QR code', shapeRendering: "crispEdges", children: [_jsx("rect", { width: n, height: n, fill: "#fff" }), _jsx("path", { d: path, fill: "#000" })] }));
|
|
213
|
+
}
|
|
214
|
+
function CopyButton({ text, l }) {
|
|
215
|
+
const [done, setDone] = useState(false);
|
|
216
|
+
return (_jsx("button", { type: "button", className: "anodb-button anodb-secondary", onClick: () => void navigator.clipboard?.writeText(text).then(() => {
|
|
217
|
+
setDone(true);
|
|
218
|
+
setTimeout(() => setDone(false), 1500);
|
|
219
|
+
}), children: done ? l.copied : l.copy }));
|
|
220
|
+
}
|
|
221
|
+
function ErrorText({ error }) {
|
|
222
|
+
return error ? (_jsx("p", { className: "anodb-error", role: "alert", style: { color: '#c0392b', margin: 0 }, children: error })) : null;
|
|
223
|
+
}
|
|
224
|
+
/** A button that asks for a second click before doing something destructive. */
|
|
225
|
+
function ConfirmButton(props) {
|
|
226
|
+
const [armed, setArmed] = useState(false);
|
|
227
|
+
useEffect(() => {
|
|
228
|
+
if (!armed)
|
|
229
|
+
return;
|
|
230
|
+
const t = setTimeout(() => setArmed(false), 4000);
|
|
231
|
+
return () => clearTimeout(t);
|
|
232
|
+
}, [armed]);
|
|
233
|
+
return (_jsx("button", { type: "button", className: `anodb-button ${armed ? 'anodb-danger' : 'anodb-secondary'}`, onClick: () => (armed ? (setArmed(false), props.onConfirm()) : setArmed(true)), children: armed ? props.confirm : props.label }));
|
|
234
|
+
}
|
|
235
|
+
const useErr = () => {
|
|
236
|
+
const [error, setError] = useState(null);
|
|
237
|
+
const run = useCallback((p) => p.then((v) => (setError(null), v)).catch((e) => (setError(e.message), undefined)), []);
|
|
238
|
+
return { error, setError, run };
|
|
239
|
+
};
|
|
240
|
+
/**
|
|
241
|
+
* Add a device to your identity. On the existing device: scan or paste the new device's link,
|
|
242
|
+
* compare the code, approve. On the new device: show the QR code and wait.
|
|
243
|
+
*/
|
|
244
|
+
export function PairDevice(props) {
|
|
245
|
+
const l = useLabels(props);
|
|
246
|
+
const mode = props.mode ?? 'both';
|
|
247
|
+
return (_jsxs("div", { className: props.className ?? 'anodb-pair', style: col, children: [mode !== 'new-device' && _jsx(ApprovePairing, { l: l }), mode !== 'approve' && _jsx(NewDevicePairing, { l: l, ...(props.onPaired ? { onPaired: props.onPaired } : {}), ...(props.linkBase ? { linkBase: props.linkBase } : {}) })] }));
|
|
248
|
+
}
|
|
249
|
+
function ApprovePairing({ l }) {
|
|
250
|
+
const db = useSharingDB();
|
|
251
|
+
const [incoming, clearIncoming] = useIncomingLink('pair');
|
|
252
|
+
const [text, setText] = useState('');
|
|
253
|
+
const [pending, setPending] = useState(null);
|
|
254
|
+
const [name, setName] = useState('');
|
|
255
|
+
const [done, setDone] = useState(false);
|
|
256
|
+
const { error, setError, run } = useErr();
|
|
257
|
+
const check = useCallback((value) => {
|
|
258
|
+
setDone(false);
|
|
259
|
+
const uri = parseAppLink(value);
|
|
260
|
+
if (!uri)
|
|
261
|
+
return setError(l.invalidLink);
|
|
262
|
+
try {
|
|
263
|
+
setPending(db.parsePairing(uri));
|
|
264
|
+
setError(null);
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
setError(e.message);
|
|
268
|
+
}
|
|
269
|
+
}, [db, l, setError]);
|
|
270
|
+
useEffect(() => {
|
|
271
|
+
if (incoming) {
|
|
272
|
+
setText(incoming);
|
|
273
|
+
check(incoming);
|
|
274
|
+
}
|
|
275
|
+
}, [incoming, check]);
|
|
276
|
+
return (_jsxs("section", { className: "anodb-section", style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.addDevice }), _jsx("p", { className: "anodb-hint", style: { margin: 0 }, children: l.addDeviceHint }), !pending && (_jsxs("form", { style: row, onSubmit: (e) => {
|
|
277
|
+
e.preventDefault();
|
|
278
|
+
check(text);
|
|
279
|
+
}, children: [_jsx("input", { className: "anodb-input", "aria-label": l.pairingLink, placeholder: l.pairingLink, value: text, onChange: (e) => setText(e.target.value), style: { flex: 1, minWidth: 0 } }), _jsx("button", { className: "anodb-button", children: l.check })] })), pending && (_jsxs("div", { className: "anodb-confirm", style: col, children: [_jsx("span", { children: l.compare }), _jsx("span", { className: "anodb-code", style: codeStyle, children: pending.code }), _jsx("input", { className: "anodb-input", "aria-label": l.deviceName, placeholder: l.deviceName, value: name, onChange: (e) => setName(e.target.value) }), _jsxs("div", { style: row, children: [_jsx("button", { className: "anodb-button", onClick: () => void run(pending.approve(name.trim() || 'device')).then((ok) => {
|
|
280
|
+
if (ok === undefined)
|
|
281
|
+
return;
|
|
282
|
+
setPending(null);
|
|
283
|
+
setText('');
|
|
284
|
+
setDone(true);
|
|
285
|
+
clearIncoming();
|
|
286
|
+
}), children: l.approve }), _jsx("button", { className: "anodb-button anodb-secondary", onClick: () => {
|
|
287
|
+
setPending(null);
|
|
288
|
+
clearIncoming();
|
|
289
|
+
}, children: l.cancel })] })] })), done && _jsx("p", { style: { margin: 0 }, children: l.approved }), _jsx(ErrorText, { error: error })] }));
|
|
290
|
+
}
|
|
291
|
+
function NewDevicePairing({ l, onPaired, linkBase }) {
|
|
292
|
+
const db = useSharingDB();
|
|
293
|
+
const [offer, setOffer] = useState(null);
|
|
294
|
+
const { error, run } = useErr();
|
|
295
|
+
const link = offer ? toAppLink(offer.uri, linkBase) : '';
|
|
296
|
+
return (_jsxs("section", { className: "anodb-section", style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.newDevice }), _jsx("p", { className: "anodb-hint", style: { margin: 0 }, children: l.newDeviceHint }), !offer && (_jsx("div", { children: _jsx("button", { className: "anodb-button anodb-secondary", onClick: () => void run(db.startPairing()).then((o) => {
|
|
297
|
+
if (!o)
|
|
298
|
+
return;
|
|
299
|
+
setOffer(o);
|
|
300
|
+
void o.done.then(async () => {
|
|
301
|
+
if (onPaired)
|
|
302
|
+
return onPaired();
|
|
303
|
+
await db.close();
|
|
304
|
+
location.reload();
|
|
305
|
+
});
|
|
306
|
+
}), children: l.showQr }) })), offer && (_jsxs("div", { style: col, children: [_jsx(QRCode, { value: link, title: l.pairingLink }), _jsx("span", { style: mono, children: link }), _jsx("span", { children: l.scanWithOther }), _jsx("span", { className: "anodb-code", style: codeStyle, children: offer.code }), _jsx("div", { style: row, children: _jsx(CopyButton, { text: link, l: l }) }), _jsx("span", { className: "anodb-hint", children: l.waiting })] })), _jsx(ErrorText, { error: error })] }));
|
|
307
|
+
}
|
|
308
|
+
/** Your devices, with a revoke button for each other device. */
|
|
309
|
+
export function DeviceList(props) {
|
|
310
|
+
const l = useLabels(props);
|
|
311
|
+
const db = useSharingDB();
|
|
312
|
+
const devices = useLive((d) => d.devices());
|
|
313
|
+
const { error, run } = useErr();
|
|
314
|
+
return (_jsxs("section", { className: props.className ?? 'anodb-devices', style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.devices }), _jsx("ul", { style: list, children: devices.map((d) => (_jsxs("li", { style: { ...row, justifyContent: 'space-between', opacity: d.revoked ? 0.5 : 1 }, children: [_jsxs("span", { children: [d.name, d.current && ` (${l.thisDevice})`, d.revoked && ` — ${l.revoked}`] }), !d.current && !d.revoked && _jsx(ConfirmButton, { label: l.revoke, confirm: l.confirmRevoke, onConfirm: () => void run(db.revokeDevice(d.device)) })] }, d.device))) }), _jsx(ErrorText, { error: error })] }));
|
|
315
|
+
}
|
|
316
|
+
// ---- sharing ---------------------------------------------------------------------------------
|
|
317
|
+
const MANAGER = { owner: true, admin: true };
|
|
318
|
+
/** One-time invite link (with QR code) for a space, and the join requests waiting for approval. */
|
|
319
|
+
export function InviteLink(props) {
|
|
320
|
+
const l = useLabels(props);
|
|
321
|
+
const db = useSharingDB();
|
|
322
|
+
const me = useLive((d) => d.roleIn(props.space), [props.space]);
|
|
323
|
+
const roles = me === 'owner' ? ['writer', 'reader', 'admin'] : ['writer', 'reader'];
|
|
324
|
+
const [role, setRole] = useState('writer');
|
|
325
|
+
const [link, setLink] = useState(null);
|
|
326
|
+
const { error, run } = useErr();
|
|
327
|
+
const expires = props.expiresInMs ?? 24 * 3600_000;
|
|
328
|
+
useEffect(() => setLink(null), [props.space]);
|
|
329
|
+
if (!me || !MANAGER[me]) {
|
|
330
|
+
return (_jsx("p", { className: props.className ?? 'anodb-invite', style: { margin: 0 }, children: l.cannotInvite }));
|
|
331
|
+
}
|
|
332
|
+
return (_jsxs("section", { className: props.className ?? 'anodb-invite', style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.invite }), _jsxs("div", { style: row, children: [_jsx("select", { className: "anodb-select", "aria-label": l.role, value: role, onChange: (e) => setRole(e.target.value), children: roles.map((r) => (_jsx("option", { value: r, children: r }, r))) }), _jsx("button", { className: "anodb-button", onClick: () => void run(db.createInviteLink(props.space, { role, expiresInMs: expires })).then((u) => u && setLink(toAppLink(u, props.linkBase))), children: l.createLink })] }), link && (_jsxs("div", { style: col, children: [_jsx(QRCode, { value: link, title: l.inviteLink }), _jsx("span", { style: mono, children: link }), _jsx("div", { style: row, children: _jsx(CopyButton, { text: link, l: l }) }), _jsx("span", { className: "anodb-hint", children: l.linkHint.replace('{hours}', String(Math.round(expires / 3600_000))) })] })), _jsx(ErrorText, { error: error }), props.showRequests !== false && _jsx(JoinRequests, { space: props.space, ...(props.lang ? { lang: props.lang } : {}), ...(props.labels ? { labels: props.labels } : {}) })] }));
|
|
333
|
+
}
|
|
334
|
+
/** Join requests for one space (or all spaces) with approve / reject. */
|
|
335
|
+
export function JoinRequests(props) {
|
|
336
|
+
const l = useLabels(props);
|
|
337
|
+
const db = useSharingDB();
|
|
338
|
+
const requests = useLive((d) => d.joinRequests().filter((r) => !props.space || r.space === props.space), [props.space]);
|
|
339
|
+
const { error, run } = useErr();
|
|
340
|
+
return (_jsxs("section", { className: props.className ?? 'anodb-requests', style: col, children: [_jsx("h4", { style: { margin: 0 }, children: l.requests }), requests.length === 0 && _jsx("span", { className: "anodb-hint", children: l.none }), _jsx("ul", { style: list, children: requests.map((r) => (_jsxs("li", { style: { ...row, justifyContent: 'space-between' }, children: [_jsxs("span", { children: [r.name || `${r.npub.slice(0, 12)}…`, " ", _jsx("span", { className: "anodb-badge", children: r.role })] }), _jsxs("span", { style: row, children: [_jsx("button", { className: "anodb-button", onClick: () => void run(db.approveJoinRequest(r.id)), children: l.approveRequest }), _jsx("button", { className: "anodb-button anodb-secondary", onClick: () => db.rejectJoinRequest(r.id), children: l.reject })] })] }, r.id))) }), _jsx(ErrorText, { error: error })] }));
|
|
341
|
+
}
|
|
342
|
+
/** Join with an invite link (pasted or opened via QR), and accept invitations sent to your npub. */
|
|
343
|
+
export function JoinSpace(props) {
|
|
344
|
+
const l = useLabels(props);
|
|
345
|
+
const db = useSharingDB();
|
|
346
|
+
const [incoming, clearIncoming] = useIncomingLink('join');
|
|
347
|
+
const [text, setText] = useState('');
|
|
348
|
+
const [name, setName] = useState(props.defaultName ?? '');
|
|
349
|
+
const [sent, setSent] = useState(false);
|
|
350
|
+
const { error, setError, run } = useErr();
|
|
351
|
+
const spaces = useLive((d) => d.spaces().filter((s) => s.status === 'active').map((s) => s.id));
|
|
352
|
+
const before = useRef(null);
|
|
353
|
+
const onJoined = props.onJoined;
|
|
354
|
+
useEffect(() => {
|
|
355
|
+
if (incoming)
|
|
356
|
+
setText(incoming);
|
|
357
|
+
}, [incoming]);
|
|
358
|
+
useEffect(() => {
|
|
359
|
+
if (!before.current)
|
|
360
|
+
return;
|
|
361
|
+
const added = spaces.find((s) => !before.current.has(s));
|
|
362
|
+
if (added) {
|
|
363
|
+
before.current = null;
|
|
364
|
+
setSent(false);
|
|
365
|
+
onJoined?.(added);
|
|
366
|
+
}
|
|
367
|
+
}, [spaces, onJoined]);
|
|
368
|
+
return (_jsxs("section", { className: props.className ?? 'anodb-join', style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.join }), _jsxs("form", { style: col, onSubmit: (e) => {
|
|
369
|
+
e.preventDefault();
|
|
370
|
+
const uri = parseAppLink(text);
|
|
371
|
+
if (!uri?.startsWith('anodb://join'))
|
|
372
|
+
return setError(l.invalidLink);
|
|
373
|
+
before.current = new Set(spaces);
|
|
374
|
+
void run(db.requestJoin(uri, name.trim())).then(() => {
|
|
375
|
+
setSent(true);
|
|
376
|
+
setText('');
|
|
377
|
+
clearIncoming();
|
|
378
|
+
});
|
|
379
|
+
}, children: [_jsx("input", { className: "anodb-input", "aria-label": l.inviteLink, placeholder: l.inviteLink, value: text, onChange: (e) => setText(e.target.value) }), _jsxs("div", { style: row, children: [_jsx("input", { className: "anodb-input", "aria-label": l.yourName, placeholder: l.yourName, value: name, onChange: (e) => setName(e.target.value), style: { flex: 1, minWidth: 0 } }), _jsx("button", { className: "anodb-button", children: l.requestJoin })] })] }), sent && _jsx("span", { className: "anodb-hint", children: l.requested }), _jsx(ErrorText, { error: error }), _jsx(Invitations, { ...props })] }));
|
|
380
|
+
}
|
|
381
|
+
/** Invitations sent to your npub (`db.invite(space, npub, role)`), with accept / decline. */
|
|
382
|
+
export function Invitations(props) {
|
|
383
|
+
const l = useLabels(props);
|
|
384
|
+
const db = useSharingDB();
|
|
385
|
+
const invitations = useLive((d) => d.invitations());
|
|
386
|
+
const { error, run } = useErr();
|
|
387
|
+
if (invitations.length === 0)
|
|
388
|
+
return null;
|
|
389
|
+
return (_jsxs("section", { className: "anodb-invitations", style: col, children: [_jsx("h4", { style: { margin: 0 }, children: l.invitations }), _jsx("ul", { style: list, children: invitations.map((i) => (_jsxs("li", { style: { ...row, justifyContent: 'space-between' }, children: [_jsxs("span", { children: [i.name, " ", _jsx("span", { className: "anodb-badge", children: i.role })] }), _jsxs("span", { style: row, children: [_jsx("button", { className: "anodb-button", onClick: () => void run(db.acceptInvitation(i.space)).then(() => props.onJoined?.(i.space)), children: l.accept }), _jsx("button", { className: "anodb-button anodb-secondary", onClick: () => db.declineInvitation(i.space), children: l.decline })] })] }, i.space))) }), _jsx(ErrorText, { error: error })] }));
|
|
390
|
+
}
|
|
391
|
+
/** Members of a space. Owners and admins can change roles and remove members. */
|
|
392
|
+
export function Members(props) {
|
|
393
|
+
const l = useLabels(props);
|
|
394
|
+
const db = useSharingDB();
|
|
395
|
+
const members = useLive((d) => d.members(props.space), [props.space]);
|
|
396
|
+
const me = useLive((d) => d.roleIn(props.space), [props.space]);
|
|
397
|
+
const { error, run } = useErr();
|
|
398
|
+
const assignable = me === 'owner' ? ['admin', 'writer', 'reader'] : ['writer', 'reader'];
|
|
399
|
+
const canManage = (m) => m.identity !== db.pubkey && m.role !== 'owner' && (me === 'owner' || (me === 'admin' && m.role !== 'admin'));
|
|
400
|
+
return (_jsxs("section", { className: props.className ?? 'anodb-members', style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.members }), _jsx("ul", { style: list, children: members.map((m) => (_jsxs("li", { style: { ...row, justifyContent: 'space-between' }, children: [_jsx("span", { children: props.nameOf ? props.nameOf(m) : m.identity === db.pubkey ? l.you : `${m.npub.slice(0, 12)}…` }), canManage(m) ? (_jsxs("span", { style: row, children: [_jsx("select", { className: "anodb-select", "aria-label": l.role, value: m.role, onChange: (e) => void run(db.setRole(props.space, m.identity, e.target.value)), children: assignable.map((r) => (_jsx("option", { value: r, children: r }, r))) }), _jsx(ConfirmButton, { label: l.remove, confirm: l.confirmRemove, onConfirm: () => void run(db.removeMember(props.space, m.identity)) })] })) : (_jsx("span", { className: "anodb-badge", children: m.role }))] }, m.identity))) }), _jsx(ErrorText, { error: error })] }));
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.tsx"],"names":[],"mappings":"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"}
|
package/docs/DECISIONS.md
CHANGED
|
@@ -27,3 +27,4 @@
|
|
|
27
27
|
| 20 | リリース | v0.2 土台 → v0.3 共有 → v0.4 同期と公開。v0.1 互換は捨てる(protocol v2) |
|
|
28
28
|
| 21 | 大きなファイル(2026-11-10 追加) | **Blossom** に端末側で暗号化して保存し、参照だけを DB に。複数サーバーへミラー、ハッシュ検証、ファイルごとの使い捨て鍵で認可(アップロードした端末だけ削除可)。暗号文を拒否するサーバーを Content-Type の偽装で回避することはしない |
|
|
29
29
|
| 22 | 通信経路(2026-11-10 追加) | **WebRTC を主、リレーを予備**に。シグナリングは Nostr リレー(nostr-p2p、public 化)。既定は**自分の端末同士だけ**直接接続、他メンバーとは `p2p.mode: 'members'` で(IP が見えるため)。全端末が ack したときだけリレー保存を省く |
|
|
30
|
+
| 23 | 型と UI(2026-11-10 追加) | Kysely の結果は **boolean → true/false、json → 値**(クエリの構文木から列の型を解決。生 SQL は SQLite の値のまま)。共有・端末追加の **React 部品を同梱**(`<PairDevice />` など)。リンクと QR は `https://アプリ/#anodb=…` で、開いても**クリックなしでは承認しない**・ペアリングは必ずコード照合 |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anodb/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Absolutely No DB — a decentralized, local-first database over Nostr. Zero servers to run. Zero servers to trust.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -57,7 +57,8 @@
|
|
|
57
57
|
"@noble/hashes": "^2.4.0",
|
|
58
58
|
"kysely": "^0.29.8",
|
|
59
59
|
"nostr-p2p": "^0.1.1",
|
|
60
|
-
"nostr-tools": "^2.26.0"
|
|
60
|
+
"nostr-tools": "^2.26.0",
|
|
61
|
+
"qrcode-generator": "^2.0.4"
|
|
61
62
|
},
|
|
62
63
|
"devDependencies": {
|
|
63
64
|
"@types/node": "^26.6.6",
|