@pageloop/client 0.5.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/LICENSE +94 -0
- package/README.md +97 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/.tsbuildinfo.preact +1 -0
- package/dist/.tsbuildinfo.react +1 -0
- package/dist/.tsbuildinfo.solid +1 -0
- package/dist/ApiClient.d.ts +121 -0
- package/dist/ApiClient.d.ts.map +1 -0
- package/dist/ApiClient.js +512 -0
- package/dist/ApiClient.js.map +1 -0
- package/dist/CommentEngine.d.ts +111 -0
- package/dist/CommentEngine.d.ts.map +1 -0
- package/dist/CommentEngine.js +277 -0
- package/dist/CommentEngine.js.map +1 -0
- package/dist/EventBus.d.ts +122 -0
- package/dist/EventBus.d.ts.map +1 -0
- package/dist/EventBus.js +34 -0
- package/dist/EventBus.js.map +1 -0
- package/dist/IdbCache.d.ts +22 -0
- package/dist/IdbCache.d.ts.map +1 -0
- package/dist/IdbCache.js +79 -0
- package/dist/IdbCache.js.map +1 -0
- package/dist/PageLoop.d.ts +424 -0
- package/dist/PageLoop.d.ts.map +1 -0
- package/dist/PageLoop.js +1092 -0
- package/dist/PageLoop.js.map +1 -0
- package/dist/PageTracker.d.ts +32 -0
- package/dist/PageTracker.d.ts.map +1 -0
- package/dist/PageTracker.js +105 -0
- package/dist/PageTracker.js.map +1 -0
- package/dist/UIRenderer.d.ts +218 -0
- package/dist/UIRenderer.d.ts.map +1 -0
- package/dist/UIRenderer.js +2 -0
- package/dist/UIRenderer.js.map +1 -0
- package/dist/auth/resolveInitialToken.d.ts +49 -0
- package/dist/auth/resolveInitialToken.d.ts.map +1 -0
- package/dist/auth/resolveInitialToken.js +97 -0
- package/dist/auth/resolveInitialToken.js.map +1 -0
- package/dist/errorCode.d.ts +12 -0
- package/dist/errorCode.d.ts.map +1 -0
- package/dist/errorCode.js +21 -0
- package/dist/errorCode.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications/BrowserNotifications.d.ts +68 -0
- package/dist/notifications/BrowserNotifications.d.ts.map +1 -0
- package/dist/notifications/BrowserNotifications.js +147 -0
- package/dist/notifications/BrowserNotifications.js.map +1 -0
- package/dist/preact/index.d.ts +37 -0
- package/dist/preact/index.d.ts.map +1 -0
- package/dist/preact/index.js +150 -0
- package/dist/preact/index.js.map +1 -0
- package/dist/preact/style.css +12 -0
- package/dist/react/index.d.ts +52 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +165 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/style.css +12 -0
- package/dist/safeStorage.d.ts +26 -0
- package/dist/safeStorage.d.ts.map +1 -0
- package/dist/safeStorage.js +78 -0
- package/dist/safeStorage.js.map +1 -0
- package/dist/solid/index.d.ts +40 -0
- package/dist/solid/index.d.ts.map +1 -0
- package/dist/solid/index.jsx +134 -0
- package/dist/solid/index.jsx.map +1 -0
- package/dist/solid/style.css +12 -0
- package/package.json +85 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @pageloop/react
|
|
4
|
+
*
|
|
5
|
+
* React wrapper. <PageLoopProvider> mounts the SDK with the vanilla DOM
|
|
6
|
+
* renderer (or one you pass); hooks expose the running instance + every
|
|
7
|
+
* piece of state the bus broadcasts. The renderer paints into
|
|
8
|
+
* `document.body` directly — these hooks are for app code that wants
|
|
9
|
+
* to read/mutate comments alongside the floating UI, not replace it.
|
|
10
|
+
*/
|
|
11
|
+
import { createContext, useContext, useEffect, useMemo, useRef, useState, } from 'react';
|
|
12
|
+
import { PageLoop } from '@pageloop/client';
|
|
13
|
+
const PageLoopContext = createContext(null);
|
|
14
|
+
export function PageLoopProvider(props) {
|
|
15
|
+
const { config, renderer, children } = props;
|
|
16
|
+
const [instance, setInstance] = useState(null);
|
|
17
|
+
const [page, setPage] = useState(null);
|
|
18
|
+
const [project, setProject] = useState(null);
|
|
19
|
+
const [user, setUser] = useState(null);
|
|
20
|
+
const [role, setRole] = useState('anonymous');
|
|
21
|
+
const [comments, setComments] = useState([]);
|
|
22
|
+
const [connected, setConnected] = useState(false);
|
|
23
|
+
const startedRef = useRef(false);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (startedRef.current)
|
|
26
|
+
return;
|
|
27
|
+
startedRef.current = true;
|
|
28
|
+
let ld = null;
|
|
29
|
+
let cleanup = [];
|
|
30
|
+
(async () => {
|
|
31
|
+
const r = renderer ?? (await loadVanilla());
|
|
32
|
+
ld = new PageLoop(config, { renderer: r });
|
|
33
|
+
setInstance(ld);
|
|
34
|
+
const refresh = () => {
|
|
35
|
+
if (!ld)
|
|
36
|
+
return;
|
|
37
|
+
setPage(ld.getCurrentPage());
|
|
38
|
+
setProject(ld.getProject());
|
|
39
|
+
setUser(ld.getCurrentUser());
|
|
40
|
+
setRole(ld.getCurrentRole());
|
|
41
|
+
const p = ld.getCurrentPage();
|
|
42
|
+
setComments(p ? ld.comments.load(p.id) : []);
|
|
43
|
+
};
|
|
44
|
+
cleanup = [
|
|
45
|
+
ld.bus.on('connection:open', () => setConnected(true)),
|
|
46
|
+
ld.bus.on('connection:closed', () => setConnected(false)),
|
|
47
|
+
ld.bus.on('page:change', refresh),
|
|
48
|
+
ld.bus.on('page:resolved', refresh),
|
|
49
|
+
ld.bus.on('auth:changed', refresh),
|
|
50
|
+
ld.bus.on('comment:created', refresh),
|
|
51
|
+
ld.bus.on('comment:updated', refresh),
|
|
52
|
+
ld.bus.on('comment:deleted', refresh),
|
|
53
|
+
ld.bus.on('comment:bulkDeleted', refresh),
|
|
54
|
+
];
|
|
55
|
+
await ld.start();
|
|
56
|
+
refresh();
|
|
57
|
+
})();
|
|
58
|
+
return () => {
|
|
59
|
+
for (const fn of cleanup)
|
|
60
|
+
fn();
|
|
61
|
+
void ld?.stop();
|
|
62
|
+
};
|
|
63
|
+
// Mount-once: config changes after mount don't re-init the instance
|
|
64
|
+
// (the bundle holds resources you'd want to drop intentionally).
|
|
65
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
66
|
+
}, []);
|
|
67
|
+
const value = useMemo(() => ({ instance, page, project, user, role, comments, connected }), [instance, page, project, user, role, comments, connected]);
|
|
68
|
+
return _jsx(PageLoopContext.Provider, { value: value, children: children });
|
|
69
|
+
}
|
|
70
|
+
/** Throws if called outside the provider. */
|
|
71
|
+
export function usePageLoop() {
|
|
72
|
+
const ctx = useContext(PageLoopContext);
|
|
73
|
+
if (!ctx)
|
|
74
|
+
throw new Error('usePageLoop must be called inside <PageLoopProvider>');
|
|
75
|
+
return ctx;
|
|
76
|
+
}
|
|
77
|
+
/** Direct access to the running PageLoop instance (for imperative calls). */
|
|
78
|
+
export function usePageLoopInstance() {
|
|
79
|
+
return usePageLoop().instance;
|
|
80
|
+
}
|
|
81
|
+
export function useComments() {
|
|
82
|
+
return usePageLoop().comments;
|
|
83
|
+
}
|
|
84
|
+
export function usePage() {
|
|
85
|
+
return usePageLoop().page;
|
|
86
|
+
}
|
|
87
|
+
export function useProject() {
|
|
88
|
+
return usePageLoop().project;
|
|
89
|
+
}
|
|
90
|
+
export function useUser() {
|
|
91
|
+
return usePageLoop().user;
|
|
92
|
+
}
|
|
93
|
+
export function useRole() {
|
|
94
|
+
return usePageLoop().role;
|
|
95
|
+
}
|
|
96
|
+
export function useConnected() {
|
|
97
|
+
return usePageLoop().connected;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Reactive replies for a comment. Subscribes to reply:* events so when a
|
|
101
|
+
* reply is added/edited/deleted the value updates. Returns null until
|
|
102
|
+
* the first `fetchReplies` call resolves; re-uses the engine's cache.
|
|
103
|
+
*/
|
|
104
|
+
export function useReplies(commentId) {
|
|
105
|
+
const ctx = usePageLoop();
|
|
106
|
+
const [list, setList] = useState(null);
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
if (!ctx.instance || !commentId)
|
|
109
|
+
return;
|
|
110
|
+
const ld = ctx.instance;
|
|
111
|
+
const sync = () => setList(ld.comments.loadedReplies(commentId));
|
|
112
|
+
sync();
|
|
113
|
+
if (ld.comments.loadedReplies(commentId) === null) {
|
|
114
|
+
void ld.comments
|
|
115
|
+
.fetchReplies(commentId)
|
|
116
|
+
.then(sync)
|
|
117
|
+
.catch(() => undefined);
|
|
118
|
+
}
|
|
119
|
+
const offs = [
|
|
120
|
+
ld.bus.on('reply:created', sync),
|
|
121
|
+
ld.bus.on('reply:updated', sync),
|
|
122
|
+
ld.bus.on('reply:deleted', sync),
|
|
123
|
+
];
|
|
124
|
+
return () => {
|
|
125
|
+
for (const fn of offs)
|
|
126
|
+
fn();
|
|
127
|
+
};
|
|
128
|
+
}, [ctx.instance, commentId]);
|
|
129
|
+
return list;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Reactive reactions for a comment OR reply. Subscribes to `reaction:changed`
|
|
133
|
+
* and re-fetches when the targetKind/targetId pair changes.
|
|
134
|
+
*/
|
|
135
|
+
export function useReactions(targetKind, targetId) {
|
|
136
|
+
const ctx = usePageLoop();
|
|
137
|
+
const [list, setList] = useState([]);
|
|
138
|
+
useEffect(() => {
|
|
139
|
+
if (!ctx.instance || !targetKind || !targetId)
|
|
140
|
+
return;
|
|
141
|
+
const ld = ctx.instance;
|
|
142
|
+
const sync = () => setList(ld.comments.loadedReactions(targetKind, targetId));
|
|
143
|
+
sync();
|
|
144
|
+
void ld.comments
|
|
145
|
+
.fetchReactions(targetKind, targetId)
|
|
146
|
+
.then(sync)
|
|
147
|
+
.catch(() => undefined);
|
|
148
|
+
const off = ld.bus.on('reaction:changed', sync);
|
|
149
|
+
return () => off();
|
|
150
|
+
}, [ctx.instance, targetKind, targetId]);
|
|
151
|
+
return list;
|
|
152
|
+
}
|
|
153
|
+
async function loadVanilla() {
|
|
154
|
+
// @pageloop/vanilla is an optional runtime peer (lazy-loaded), deliberately
|
|
155
|
+
// NOT a build dependency of @pageloop/client — declaring it would create a
|
|
156
|
+
// vanilla↔client build cycle (vanilla depends on the client core). The
|
|
157
|
+
// `as string` keeps tsc from resolving a non-dependency at build time; the
|
|
158
|
+
// assertion is erased in the emitted JS, so the literal survives and a
|
|
159
|
+
// consumer's bundler still code-splits @pageloop/vanilla. Consumers of this
|
|
160
|
+
// subpath install @pageloop/vanilla themselves.
|
|
161
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
162
|
+
const mod = await import('@pageloop/vanilla');
|
|
163
|
+
return new mod.VanillaRenderer();
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-export of the vanilla renderer's stylesheet. Consumers of
|
|
3
|
+
* `@pageloop/react` who use the default renderer get the styles by
|
|
4
|
+
* importing this file instead of reaching directly into
|
|
5
|
+
* `@pageloop/vanilla` — keeps the consumer's package.json to a
|
|
6
|
+
* single `@pageloop/react` dep without phantom-dependency errors
|
|
7
|
+
* under pnpm's strict resolution.
|
|
8
|
+
*
|
|
9
|
+
* Consumers who ship a custom renderer don't import this file and
|
|
10
|
+
* don't pay the CSS cost.
|
|
11
|
+
*/
|
|
12
|
+
@import '@pageloop/vanilla/style.css';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defensive `localStorage` wrapper. Safari private mode throws on
|
|
3
|
+
* every read/write; some embedded webviews disable storage entirely;
|
|
4
|
+
* iframes can be `sandbox`'d without `allow-same-origin`. All of those
|
|
5
|
+
* scenarios will throw a SecurityError or QuotaExceededError on the
|
|
6
|
+
* first access.
|
|
7
|
+
*
|
|
8
|
+
* `safeStorage` swallows those errors + falls back to an in-memory map
|
|
9
|
+
* so the rest of the widget continues to work. Without this, a single
|
|
10
|
+
* unguarded `localStorage.getItem(...)` crashes the entire embed in
|
|
11
|
+
* any of the above environments.
|
|
12
|
+
*
|
|
13
|
+
* Single shared instance: the in-memory fallback is process-wide so a
|
|
14
|
+
* write in one module is visible to a read in another, matching the
|
|
15
|
+
* real localStorage semantics. The instance is created lazily on first
|
|
16
|
+
* use so SSR / test bootstraps don't crash on module import.
|
|
17
|
+
*/
|
|
18
|
+
export declare const safeStorage: {
|
|
19
|
+
readonly getItem: (key: string) => string | null;
|
|
20
|
+
readonly setItem: (key: string, value: string) => void;
|
|
21
|
+
readonly removeItem: (key: string) => void;
|
|
22
|
+
/** Whether persistence is available. Components that want to warn
|
|
23
|
+
* the user about lost-on-reload state read this. */
|
|
24
|
+
readonly isPersistent: () => boolean;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=safeStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeStorage.d.ts","sourceRoot":"","sources":["../src/safeStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAqBH,eAAO,MAAM,WAAW;4BACV,MAAM,KAAG,MAAM,GAAG,IAAI;4BAUtB,MAAM,SAAS,MAAM,KAAG,IAAI;+BAWzB,MAAM,KAAG,IAAI;IAW7B;yDACqD;iCACrC,OAAO;CAGd,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defensive `localStorage` wrapper. Safari private mode throws on
|
|
3
|
+
* every read/write; some embedded webviews disable storage entirely;
|
|
4
|
+
* iframes can be `sandbox`'d without `allow-same-origin`. All of those
|
|
5
|
+
* scenarios will throw a SecurityError or QuotaExceededError on the
|
|
6
|
+
* first access.
|
|
7
|
+
*
|
|
8
|
+
* `safeStorage` swallows those errors + falls back to an in-memory map
|
|
9
|
+
* so the rest of the widget continues to work. Without this, a single
|
|
10
|
+
* unguarded `localStorage.getItem(...)` crashes the entire embed in
|
|
11
|
+
* any of the above environments.
|
|
12
|
+
*
|
|
13
|
+
* Single shared instance: the in-memory fallback is process-wide so a
|
|
14
|
+
* write in one module is visible to a read in another, matching the
|
|
15
|
+
* real localStorage semantics. The instance is created lazily on first
|
|
16
|
+
* use so SSR / test bootstraps don't crash on module import.
|
|
17
|
+
*/
|
|
18
|
+
const memory = new Map();
|
|
19
|
+
let backendIsReal = true;
|
|
20
|
+
function detectBackend() {
|
|
21
|
+
if (typeof window === 'undefined' || typeof localStorage === 'undefined') {
|
|
22
|
+
backendIsReal = false;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const probe = '__ld_probe__';
|
|
27
|
+
localStorage.setItem(probe, '1');
|
|
28
|
+
localStorage.removeItem(probe);
|
|
29
|
+
backendIsReal = true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
backendIsReal = false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
detectBackend();
|
|
36
|
+
export const safeStorage = {
|
|
37
|
+
getItem(key) {
|
|
38
|
+
if (backendIsReal) {
|
|
39
|
+
try {
|
|
40
|
+
return localStorage.getItem(key);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
/* fall through */
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return memory.get(key) ?? null;
|
|
47
|
+
},
|
|
48
|
+
setItem(key, value) {
|
|
49
|
+
if (backendIsReal) {
|
|
50
|
+
try {
|
|
51
|
+
localStorage.setItem(key, value);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
/* fall through */
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
memory.set(key, value);
|
|
59
|
+
},
|
|
60
|
+
removeItem(key) {
|
|
61
|
+
if (backendIsReal) {
|
|
62
|
+
try {
|
|
63
|
+
localStorage.removeItem(key);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
/* fall through */
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
memory.delete(key);
|
|
71
|
+
},
|
|
72
|
+
/** Whether persistence is available. Components that want to warn
|
|
73
|
+
* the user about lost-on-reload state read this. */
|
|
74
|
+
isPersistent() {
|
|
75
|
+
return backendIsReal;
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=safeStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeStorage.js","sourceRoot":"","sources":["../src/safeStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;AACzC,IAAI,aAAa,GAAG,IAAI,CAAC;AAEzB,SAAS,aAAa;IACrB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;QAC1E,aAAa,GAAG,KAAK,CAAC;QACtB,OAAO;IACR,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,cAAc,CAAC;QAC7B,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,aAAa,GAAG,IAAI,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACR,aAAa,GAAG,KAAK,CAAC;IACvB,CAAC;AACF,CAAC;AACD,aAAa,EAAE,CAAC;AAEhB,MAAM,CAAC,MAAM,WAAW,GAAG;IAC1B,OAAO,CAAC,GAAW;QAClB,IAAI,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC;gBACJ,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACR,kBAAkB;YACnB,CAAC;QACF,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,GAAW,EAAE,KAAa;QACjC,IAAI,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC;gBACJ,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACjC,OAAO;YACR,CAAC;YAAC,MAAM,CAAC;gBACR,kBAAkB;YACnB,CAAC;QACF,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,UAAU,CAAC,GAAW;QACrB,IAAI,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC;gBACJ,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC7B,OAAO;YACR,CAAC;YAAC,MAAM,CAAC;gBACR,kBAAkB;YACnB,CAAC;QACF,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD;yDACqD;IACrD,YAAY;QACX,OAAO,aAAa,CAAC;IACtB,CAAC;CACQ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pageloop/solid
|
|
3
|
+
*
|
|
4
|
+
* Solid wrapper. <PageLoopProvider> mounts the SDK and exposes reactive
|
|
5
|
+
* signals for page / project / user / role / comments / connection.
|
|
6
|
+
* Hooks like createReplies / createReactions return Accessor<T> for use
|
|
7
|
+
* inside Solid components. UI rendering is delegated to a UIRenderer;
|
|
8
|
+
* the default vanilla renderer is loaded lazily.
|
|
9
|
+
*/
|
|
10
|
+
import { type JSX, type Accessor } from 'solid-js';
|
|
11
|
+
import { PageLoop, type PageLoopConfig, type UIRenderer } from '@pageloop/client';
|
|
12
|
+
import type { Comment, Reply, Reaction, ReactionTargetKind, TrackedPage, Project, User } from '@pageloop/shared';
|
|
13
|
+
type Role = 'owner' | 'editor' | 'commenter' | 'viewer' | 'anonymous';
|
|
14
|
+
interface PageLoopContextValue {
|
|
15
|
+
instance: Accessor<PageLoop | null>;
|
|
16
|
+
page: Accessor<TrackedPage | null>;
|
|
17
|
+
project: Accessor<Project | null>;
|
|
18
|
+
user: Accessor<User | null>;
|
|
19
|
+
role: Accessor<Role>;
|
|
20
|
+
comments: Accessor<Comment[]>;
|
|
21
|
+
connected: Accessor<boolean>;
|
|
22
|
+
}
|
|
23
|
+
export interface PageLoopProviderProps {
|
|
24
|
+
config: PageLoopConfig;
|
|
25
|
+
/** Defaults to the vanilla DOM renderer (loaded lazily). */
|
|
26
|
+
renderer?: UIRenderer;
|
|
27
|
+
children: JSX.Element;
|
|
28
|
+
}
|
|
29
|
+
export declare function PageLoopProvider(props: PageLoopProviderProps): JSX.Element;
|
|
30
|
+
/** Access the running PageLoop instance + reactive signals. Throws outside the provider. */
|
|
31
|
+
export declare function usePageLoop(): PageLoopContextValue;
|
|
32
|
+
/**
|
|
33
|
+
* Reactive replies accessor. The returned Accessor is null until the first
|
|
34
|
+
* fetch resolves; updates whenever a reply is added/edited/deleted.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createReplies(commentId: Accessor<string | null>): Accessor<Reply[] | null>;
|
|
37
|
+
/** Reactive reactions accessor for a comment OR reply target. */
|
|
38
|
+
export declare function createReactions(targetKind: Accessor<ReactionTargetKind | null>, targetId: Accessor<string | null>): Accessor<Reaction[]>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/solid/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAON,KAAK,GAAG,EACR,KAAK,QAAQ,EACb,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,KAAK,EACX,OAAO,EACP,KAAK,EACL,QAAQ,EACR,kBAAkB,EAClB,WAAW,EACX,OAAO,EACP,IAAI,EACJ,MAAM,kBAAkB,CAAC;AAE1B,KAAK,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEtE,UAAU,oBAAoB;IAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACpC,IAAI,EAAE,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACnC,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAClC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC5B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9B,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;CAC7B;AAID,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,cAAc,CAAC;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,GAAG,CAAC,OAAO,CAoD1E;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,IAAI,oBAAoB,CAIlD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CA4B1F;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAC9B,UAAU,EAAE,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC,EAC/C,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,GAC/B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAqBtB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pageloop/solid
|
|
3
|
+
*
|
|
4
|
+
* Solid wrapper. <PageLoopProvider> mounts the SDK and exposes reactive
|
|
5
|
+
* signals for page / project / user / role / comments / connection.
|
|
6
|
+
* Hooks like createReplies / createReactions return Accessor<T> for use
|
|
7
|
+
* inside Solid components. UI rendering is delegated to a UIRenderer;
|
|
8
|
+
* the default vanilla renderer is loaded lazily.
|
|
9
|
+
*/
|
|
10
|
+
import { createContext, useContext, createSignal, createEffect, onCleanup, onMount, } from 'solid-js';
|
|
11
|
+
import { PageLoop } from '@pageloop/client';
|
|
12
|
+
const PageLoopContext = createContext(null);
|
|
13
|
+
export function PageLoopProvider(props) {
|
|
14
|
+
const [instance, setInstance] = createSignal(null);
|
|
15
|
+
const [page, setPage] = createSignal(null);
|
|
16
|
+
const [project, setProject] = createSignal(null);
|
|
17
|
+
const [user, setUser] = createSignal(null);
|
|
18
|
+
const [role, setRole] = createSignal('anonymous');
|
|
19
|
+
const [comments, setComments] = createSignal([]);
|
|
20
|
+
const [connected, setConnected] = createSignal(false);
|
|
21
|
+
onMount(async () => {
|
|
22
|
+
const renderer = props.renderer ?? (await loadVanilla());
|
|
23
|
+
const ld = new PageLoop(props.config, { renderer });
|
|
24
|
+
setInstance(ld);
|
|
25
|
+
const refresh = () => {
|
|
26
|
+
setPage(ld.getCurrentPage());
|
|
27
|
+
setProject(ld.getProject());
|
|
28
|
+
setUser(ld.getCurrentUser());
|
|
29
|
+
setRole(ld.getCurrentRole());
|
|
30
|
+
const p = ld.getCurrentPage();
|
|
31
|
+
setComments(p ? ld.comments.load(p.id) : []);
|
|
32
|
+
};
|
|
33
|
+
const offs = [
|
|
34
|
+
ld.bus.on('connection:open', () => setConnected(true)),
|
|
35
|
+
ld.bus.on('connection:closed', () => setConnected(false)),
|
|
36
|
+
ld.bus.on('page:change', refresh),
|
|
37
|
+
ld.bus.on('page:resolved', refresh),
|
|
38
|
+
ld.bus.on('auth:changed', refresh),
|
|
39
|
+
ld.bus.on('comment:created', refresh),
|
|
40
|
+
ld.bus.on('comment:updated', refresh),
|
|
41
|
+
ld.bus.on('comment:deleted', refresh),
|
|
42
|
+
ld.bus.on('comment:bulkDeleted', refresh),
|
|
43
|
+
];
|
|
44
|
+
await ld.start();
|
|
45
|
+
refresh();
|
|
46
|
+
onCleanup(() => {
|
|
47
|
+
for (const fn of offs)
|
|
48
|
+
fn();
|
|
49
|
+
void ld.stop();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
return (
|
|
53
|
+
// eslint-disable-next-line solid/reactivity
|
|
54
|
+
<PageLoopContext.Provider value={{ instance, page, project, user, role, comments, connected }}>
|
|
55
|
+
{props.children}
|
|
56
|
+
</PageLoopContext.Provider>);
|
|
57
|
+
}
|
|
58
|
+
/** Access the running PageLoop instance + reactive signals. Throws outside the provider. */
|
|
59
|
+
export function usePageLoop() {
|
|
60
|
+
const ctx = useContext(PageLoopContext);
|
|
61
|
+
if (!ctx)
|
|
62
|
+
throw new Error('usePageLoop must be called inside <PageLoopProvider>');
|
|
63
|
+
return ctx;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reactive replies accessor. The returned Accessor is null until the first
|
|
67
|
+
* fetch resolves; updates whenever a reply is added/edited/deleted.
|
|
68
|
+
*/
|
|
69
|
+
export function createReplies(commentId) {
|
|
70
|
+
const ctx = usePageLoop();
|
|
71
|
+
const [list, setList] = createSignal(null);
|
|
72
|
+
createEffect(() => {
|
|
73
|
+
const ld = ctx.instance();
|
|
74
|
+
const id = commentId();
|
|
75
|
+
if (!ld || !id) {
|
|
76
|
+
setList(null);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const sync = () => setList(ld.comments.loadedReplies(id));
|
|
80
|
+
sync();
|
|
81
|
+
if (ld.comments.loadedReplies(id) === null) {
|
|
82
|
+
void ld.comments
|
|
83
|
+
.fetchReplies(id)
|
|
84
|
+
.then(sync)
|
|
85
|
+
.catch(() => undefined);
|
|
86
|
+
}
|
|
87
|
+
const offs = [
|
|
88
|
+
ld.bus.on('reply:created', sync),
|
|
89
|
+
ld.bus.on('reply:updated', sync),
|
|
90
|
+
ld.bus.on('reply:deleted', sync),
|
|
91
|
+
];
|
|
92
|
+
onCleanup(() => {
|
|
93
|
+
for (const fn of offs)
|
|
94
|
+
fn();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
return list;
|
|
98
|
+
}
|
|
99
|
+
/** Reactive reactions accessor for a comment OR reply target. */
|
|
100
|
+
export function createReactions(targetKind, targetId) {
|
|
101
|
+
const ctx = usePageLoop();
|
|
102
|
+
const [list, setList] = createSignal([]);
|
|
103
|
+
createEffect(() => {
|
|
104
|
+
const ld = ctx.instance();
|
|
105
|
+
const k = targetKind();
|
|
106
|
+
const id = targetId();
|
|
107
|
+
if (!ld || !k || !id) {
|
|
108
|
+
setList([]);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const sync = () => setList(ld.comments.loadedReactions(k, id));
|
|
112
|
+
sync();
|
|
113
|
+
void ld.comments
|
|
114
|
+
.fetchReactions(k, id)
|
|
115
|
+
.then(sync)
|
|
116
|
+
.catch(() => undefined);
|
|
117
|
+
const off = ld.bus.on('reaction:changed', sync);
|
|
118
|
+
onCleanup(() => off());
|
|
119
|
+
});
|
|
120
|
+
return list;
|
|
121
|
+
}
|
|
122
|
+
async function loadVanilla() {
|
|
123
|
+
// @pageloop/vanilla is an optional runtime peer (lazy-loaded), deliberately
|
|
124
|
+
// NOT a build dependency of @pageloop/client — declaring it would create a
|
|
125
|
+
// vanilla↔client build cycle (vanilla depends on the client core). The
|
|
126
|
+
// `as string` keeps tsc from resolving a non-dependency at build time; the
|
|
127
|
+
// assertion is erased in the emitted JS, so the literal survives and a
|
|
128
|
+
// consumer's bundler still code-splits @pageloop/vanilla. Consumers of this
|
|
129
|
+
// subpath install @pageloop/vanilla themselves.
|
|
130
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
131
|
+
const mod = await import('@pageloop/vanilla');
|
|
132
|
+
return new mod.VanillaRenderer();
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=index.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/solid/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-export of the vanilla renderer's stylesheet. Consumers of
|
|
3
|
+
* `@pageloop/solid` who use the default renderer get the styles by
|
|
4
|
+
* importing this file instead of reaching directly into
|
|
5
|
+
* `@pageloop/vanilla` — keeps the consumer's package.json to a
|
|
6
|
+
* single `@pageloop/solid` dep without phantom-dependency errors
|
|
7
|
+
* under pnpm's strict resolution.
|
|
8
|
+
*
|
|
9
|
+
* Consumers who ship a custom renderer don't import this file and
|
|
10
|
+
* don't pay the CSS cost.
|
|
11
|
+
*/
|
|
12
|
+
@import '@pageloop/vanilla/style.css';
|
package/package.json
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pageloop/client",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./react": {
|
|
13
|
+
"types": "./dist/react/index.d.ts",
|
|
14
|
+
"import": "./dist/react/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./react/style.css": "./dist/react/style.css",
|
|
17
|
+
"./preact": {
|
|
18
|
+
"types": "./dist/preact/index.d.ts",
|
|
19
|
+
"import": "./dist/preact/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./preact/style.css": "./dist/preact/style.css",
|
|
22
|
+
"./solid": {
|
|
23
|
+
"types": "./dist/solid/index.d.ts",
|
|
24
|
+
"solid": "./dist/solid/index.jsx",
|
|
25
|
+
"import": "./dist/solid/index.jsx"
|
|
26
|
+
},
|
|
27
|
+
"./solid/style.css": "./dist/solid/style.css",
|
|
28
|
+
"./package.json": "./package.json"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist"
|
|
32
|
+
],
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"idb": "^8.0.1",
|
|
35
|
+
"@pageloop/anchor": "0.5.0",
|
|
36
|
+
"@pageloop/shared": "0.5.0"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"react": ">=18",
|
|
40
|
+
"preact": ">=10",
|
|
41
|
+
"solid-js": ">=1.8"
|
|
42
|
+
},
|
|
43
|
+
"peerDependenciesMeta": {
|
|
44
|
+
"react": {
|
|
45
|
+
"optional": true
|
|
46
|
+
},
|
|
47
|
+
"preact": {
|
|
48
|
+
"optional": true
|
|
49
|
+
},
|
|
50
|
+
"solid-js": {
|
|
51
|
+
"optional": true
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/react": "^19.0.2",
|
|
56
|
+
"jsdom": "^25.0.1",
|
|
57
|
+
"preact": "^10.25.4",
|
|
58
|
+
"react": "^19.0.0",
|
|
59
|
+
"solid-js": "^1.9.4",
|
|
60
|
+
"vitest": "^2.1.8"
|
|
61
|
+
},
|
|
62
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
63
|
+
"author": {
|
|
64
|
+
"name": "Ryan Weiss",
|
|
65
|
+
"email": "rw3iss@gmail.com"
|
|
66
|
+
},
|
|
67
|
+
"repository": {
|
|
68
|
+
"type": "git",
|
|
69
|
+
"url": "git+https://github.com/rw3iss/pageloop.git",
|
|
70
|
+
"directory": "packages/client/core"
|
|
71
|
+
},
|
|
72
|
+
"homepage": "https://github.com/rw3iss/pageloop/tree/main/packages/client/core#readme",
|
|
73
|
+
"bugs": {
|
|
74
|
+
"url": "https://github.com/rw3iss/pageloop/issues"
|
|
75
|
+
},
|
|
76
|
+
"publishConfig": {
|
|
77
|
+
"access": "public"
|
|
78
|
+
},
|
|
79
|
+
"scripts": {
|
|
80
|
+
"build": "tsc -b tsconfig.json tsconfig.react.json tsconfig.preact.json tsconfig.solid.json && cp src/react/style.css dist/react/style.css && cp src/preact/style.css dist/preact/style.css && cp src/solid/style.css dist/solid/style.css",
|
|
81
|
+
"typecheck": "tsc -b tsconfig.json tsconfig.react.json tsconfig.preact.json tsconfig.solid.json",
|
|
82
|
+
"test": "vitest run",
|
|
83
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
84
|
+
}
|
|
85
|
+
}
|