@timeback/sdk 0.1.7 → 0.1.9
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 +97 -8
- package/dist/chunk-07j8zre9.js +2 -0
- package/dist/chunk-5171mkp2.js +2 -0
- package/dist/chunk-63afdp3y.js +8 -0
- package/dist/chunk-8gg8n8v9.js +2 -0
- package/dist/chunk-9se82640.js +1 -0
- package/dist/chunk-agpf1x3g.js +16 -0
- package/dist/chunk-hnf0tart.js +2 -0
- package/dist/chunk-qr0bbnsr.js +1 -0
- package/dist/chunk-whc53e0y.js +11 -0
- package/dist/chunk-x9gvef7q.js +1 -0
- package/dist/client/adapters/react/hooks/types.d.ts +80 -0
- package/dist/client/adapters/react/hooks/types.d.ts.map +1 -1
- package/dist/client/adapters/react/hooks/useTimebackProfile.d.ts +42 -0
- package/dist/client/adapters/react/hooks/useTimebackProfile.d.ts.map +1 -0
- package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts +17 -5
- package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts.map +1 -1
- package/dist/client/adapters/react/index.d.ts +2 -1
- package/dist/client/adapters/react/index.d.ts.map +1 -1
- package/dist/client/adapters/react/index.js +2 -494
- package/dist/client/adapters/react/provider.d.ts.map +1 -1
- package/dist/client/adapters/solid/index.d.ts +3 -0
- package/dist/client/adapters/solid/index.d.ts.map +1 -1
- package/dist/client/adapters/solid/index.ts +12 -0
- package/dist/client/adapters/solid/primitives/createTimebackProfile.d.ts +58 -0
- package/dist/client/adapters/solid/primitives/createTimebackProfile.d.ts.map +1 -0
- package/dist/client/adapters/solid/primitives/createTimebackProfile.ts +209 -0
- package/dist/client/adapters/solid/primitives/createTimebackVerification.d.ts +38 -0
- package/dist/client/adapters/solid/primitives/createTimebackVerification.d.ts.map +1 -0
- package/dist/client/adapters/solid/primitives/createTimebackVerification.ts +173 -0
- package/dist/client/adapters/solid/types.d.ts +109 -0
- package/dist/client/adapters/solid/types.d.ts.map +1 -0
- package/dist/client/adapters/solid/types.ts +110 -0
- package/dist/client/adapters/svelte/index.d.ts +2 -1
- package/dist/client/adapters/svelte/index.d.ts.map +1 -1
- package/dist/client/adapters/svelte/index.ts +11 -2
- package/dist/client/adapters/svelte/{stores.d.ts → stores/client.d.ts} +11 -9
- package/dist/client/adapters/svelte/stores/client.d.ts.map +1 -0
- package/dist/client/adapters/svelte/{stores.ts → stores/client.ts} +24 -52
- package/dist/client/adapters/svelte/stores/index.d.ts +10 -0
- package/dist/client/adapters/svelte/stores/index.d.ts.map +1 -0
- package/dist/client/adapters/svelte/stores/index.ts +22 -0
- package/dist/client/adapters/svelte/stores/profile.d.ts +66 -0
- package/dist/client/adapters/svelte/stores/profile.d.ts.map +1 -0
- package/dist/client/adapters/svelte/stores/profile.ts +168 -0
- package/dist/client/adapters/svelte/stores/verification.d.ts +43 -0
- package/dist/client/adapters/svelte/stores/verification.d.ts.map +1 -0
- package/dist/client/adapters/svelte/stores/verification.ts +208 -0
- package/dist/client/adapters/svelte/types.d.ts +35 -0
- package/dist/client/adapters/svelte/types.d.ts.map +1 -0
- package/dist/client/adapters/vue/composables/useTimebackProfile.d.ts +51 -0
- package/dist/client/adapters/vue/composables/useTimebackProfile.d.ts.map +1 -0
- package/dist/client/adapters/vue/composables/useTimebackProfile.ts +186 -0
- package/dist/client/adapters/vue/composables/useTimebackVerification.d.ts +46 -0
- package/dist/client/adapters/vue/composables/useTimebackVerification.d.ts.map +1 -0
- package/dist/client/adapters/vue/composables/useTimebackVerification.ts +169 -0
- package/dist/client/adapters/vue/index.d.ts +3 -0
- package/dist/client/adapters/vue/index.d.ts.map +1 -1
- package/dist/client/adapters/vue/index.ts +12 -1
- package/dist/client/adapters/vue/types.d.ts +109 -0
- package/dist/client/adapters/vue/types.d.ts.map +1 -0
- package/dist/client/adapters/vue/types.ts +110 -0
- package/dist/client/lib/activity/activity.class.d.ts +5 -5
- package/dist/client/lib/activity/activity.class.d.ts.map +1 -1
- package/dist/client/lib/user-cache.d.ts +39 -0
- package/dist/client/lib/user-cache.d.ts.map +1 -0
- package/dist/client/lib/user-cache.ts +168 -0
- package/dist/client/lib/utils.d.ts +15 -0
- package/dist/client/lib/utils.d.ts.map +1 -1
- package/dist/client/namespaces/activity.d.ts +2 -3
- package/dist/client/namespaces/activity.d.ts.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +1 -257
- package/dist/edge.js +1 -86271
- package/dist/identity.js +1 -86131
- package/dist/index.d.ts +2 -2
- package/dist/index.js +22 -104883
- package/dist/server/adapters/express.js +1 -85973
- package/dist/server/adapters/native.js +2 -221
- package/dist/server/adapters/nextjs.js +1 -233
- package/dist/server/adapters/nuxt.js +1 -86046
- package/dist/server/adapters/solid-start.js +1 -85945
- package/dist/server/adapters/svelte-kit.js +1 -279
- package/dist/server/adapters/tanstack-start.js +1 -85918
- package/dist/server/handlers/activity/attempts.d.ts +51 -0
- package/dist/server/handlers/activity/attempts.d.ts.map +1 -0
- package/dist/server/handlers/activity/caliper.d.ts +46 -5
- package/dist/server/handlers/activity/caliper.d.ts.map +1 -1
- package/dist/server/handlers/activity/completion.d.ts +43 -0
- package/dist/server/handlers/activity/completion.d.ts.map +1 -0
- package/dist/server/handlers/activity/handler.d.ts +18 -1
- package/dist/server/handlers/activity/handler.d.ts.map +1 -1
- package/dist/server/handlers/activity/progress.d.ts +47 -0
- package/dist/server/handlers/activity/progress.d.ts.map +1 -0
- package/dist/server/handlers/activity/schema.d.ts +1 -2
- package/dist/server/handlers/activity/schema.d.ts.map +1 -1
- package/dist/server/handlers/activity/types.d.ts +1 -2
- package/dist/server/handlers/activity/types.d.ts.map +1 -1
- package/dist/server/lib/index.d.ts +1 -1
- package/dist/server/lib/index.d.ts.map +1 -1
- package/dist/server/lib/utils.d.ts +61 -0
- package/dist/server/lib/utils.d.ts.map +1 -1
- package/dist/server/timeback.d.ts +2 -2
- package/dist/server/timeback.d.ts.map +1 -1
- package/dist/server/types.d.ts +7 -1
- package/dist/server/types.d.ts.map +1 -1
- package/dist/shared/constants.d.ts +19 -0
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/types.d.ts +62 -8
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/xp-calculator.d.ts +25 -0
- package/dist/shared/xp-calculator.d.ts.map +1 -0
- package/package.json +6 -4
- package/dist/client/adapters/svelte/stores.d.ts.map +0 -1
- package/dist/server/handlers/activity/gradebook.d.ts +0 -56
- package/dist/server/handlers/activity/gradebook.d.ts.map +0 -1
|
@@ -1,425 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
var DEFAULT_BASE_PATH = "/api/timeback";
|
|
3
|
-
var ROUTES = {
|
|
4
|
-
ACTIVITY: "/activity",
|
|
5
|
-
IDENTITY: {
|
|
6
|
-
SIGNIN: "/identity/signin",
|
|
7
|
-
SIGNOUT: "/identity/signout",
|
|
8
|
-
CALLBACK: "/identity/callback"
|
|
9
|
-
},
|
|
10
|
-
USER: {
|
|
11
|
-
ME: "/user/me",
|
|
12
|
-
VERIFY: "/user/verify"
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
// src/client/lib/utils.ts
|
|
17
|
-
function isBrowser() {
|
|
18
|
-
return typeof window !== "undefined";
|
|
19
|
-
}
|
|
20
|
-
function getDefaultBaseURL() {
|
|
21
|
-
if (!isBrowser()) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
return `${window.location.origin}${DEFAULT_BASE_PATH}`;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// src/client/lib/fetch.ts
|
|
28
|
-
function getDefaultFetch() {
|
|
29
|
-
const globalFetch = typeof globalThis === "undefined" ? undefined : globalThis.fetch;
|
|
30
|
-
if (!globalFetch) {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
return (input, init) => globalThis.fetch(input, init);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// src/client/lib/activity/activity.class.ts
|
|
37
|
-
class Activity {
|
|
38
|
-
params;
|
|
39
|
-
sendActivity;
|
|
40
|
-
_startedAt;
|
|
41
|
-
_isPaused = false;
|
|
42
|
-
_pausedAt;
|
|
43
|
-
_totalPausedMs = 0;
|
|
44
|
-
_ended = false;
|
|
45
|
-
constructor(params, sendActivity) {
|
|
46
|
-
this.params = params;
|
|
47
|
-
this.sendActivity = sendActivity;
|
|
48
|
-
this._startedAt = new Date;
|
|
49
|
-
}
|
|
50
|
-
get startedAt() {
|
|
51
|
-
return this._startedAt;
|
|
52
|
-
}
|
|
53
|
-
get isPaused() {
|
|
54
|
-
return this._isPaused;
|
|
55
|
-
}
|
|
56
|
-
get elapsedMs() {
|
|
57
|
-
if (this._ended) {
|
|
58
|
-
return 0;
|
|
59
|
-
}
|
|
60
|
-
const now = new Date;
|
|
61
|
-
let elapsed = now.getTime() - this._startedAt.getTime() - this._totalPausedMs;
|
|
62
|
-
if (this._isPaused && this._pausedAt) {
|
|
63
|
-
elapsed -= now.getTime() - this._pausedAt.getTime();
|
|
64
|
-
}
|
|
65
|
-
return Math.max(0, elapsed);
|
|
66
|
-
}
|
|
67
|
-
_buildPayload(data) {
|
|
68
|
-
const now = new Date;
|
|
69
|
-
const pausedMs = this._totalPausedMs + (this._isPaused && this._pausedAt ? now.getTime() - this._pausedAt.getTime() : 0);
|
|
70
|
-
const elapsedMs = now.getTime() - this._startedAt.getTime() - pausedMs;
|
|
71
|
-
return {
|
|
72
|
-
id: this.params.id,
|
|
73
|
-
name: this.params.name,
|
|
74
|
-
course: this.params.course,
|
|
75
|
-
startedAt: this._startedAt.toISOString(),
|
|
76
|
-
endedAt: now.toISOString(),
|
|
77
|
-
elapsedMs: Math.max(0, elapsedMs),
|
|
78
|
-
pausedMs,
|
|
79
|
-
metrics: {
|
|
80
|
-
totalQuestions: data.totalQuestions,
|
|
81
|
-
correctQuestions: data.correctQuestions,
|
|
82
|
-
...data.xpEarned === undefined ? {} : { xpEarned: data.xpEarned },
|
|
83
|
-
...data.masteredUnits === undefined ? {} : { masteredUnits: data.masteredUnits }
|
|
84
|
-
},
|
|
85
|
-
...data.attemptNumber === undefined ? {} : { attemptNumber: data.attemptNumber },
|
|
86
|
-
...data.pctCompleteApp === undefined ? {} : { pctCompleteApp: data.pctCompleteApp }
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
pause() {
|
|
90
|
-
if (this._isPaused || this._ended)
|
|
91
|
-
return;
|
|
92
|
-
this._isPaused = true;
|
|
93
|
-
this._pausedAt = new Date;
|
|
94
|
-
}
|
|
95
|
-
resume() {
|
|
96
|
-
if (!this._isPaused || this._ended || !this._pausedAt)
|
|
97
|
-
return;
|
|
98
|
-
this._totalPausedMs += new Date().getTime() - this._pausedAt.getTime();
|
|
99
|
-
this._isPaused = false;
|
|
100
|
-
this._pausedAt = undefined;
|
|
101
|
-
}
|
|
102
|
-
async end(data) {
|
|
103
|
-
if (this._ended)
|
|
104
|
-
return;
|
|
105
|
-
this._ended = true;
|
|
106
|
-
if (this._isPaused && this._pausedAt) {
|
|
107
|
-
this._totalPausedMs += new Date().getTime() - this._pausedAt.getTime();
|
|
108
|
-
this._isPaused = false;
|
|
109
|
-
this._pausedAt = undefined;
|
|
110
|
-
}
|
|
111
|
-
const payload = this._buildPayload(data);
|
|
112
|
-
await this.sendActivity(payload);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// src/client/namespaces/activity.ts
|
|
116
|
-
class ActivityManager {
|
|
117
|
-
sendActivity;
|
|
118
|
-
constructor(sendActivity) {
|
|
119
|
-
this.sendActivity = sendActivity;
|
|
120
|
-
}
|
|
121
|
-
start(params) {
|
|
122
|
-
return new Activity(params, this.sendActivity);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
// src/client/namespaces/auth.ts
|
|
126
|
-
class Auth {
|
|
127
|
-
getBaseURL;
|
|
128
|
-
constructor(getBaseURL) {
|
|
129
|
-
this.getBaseURL = getBaseURL;
|
|
130
|
-
}
|
|
131
|
-
signIn() {
|
|
132
|
-
if (!isBrowser()) {
|
|
133
|
-
throw new Error("signIn() requires a browser environment");
|
|
134
|
-
}
|
|
135
|
-
window.location.href = `${this.getBaseURL()}${ROUTES.IDENTITY.SIGNIN}`;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
// src/client/namespaces/user.ts
|
|
139
|
-
class User {
|
|
140
|
-
getBaseURL;
|
|
141
|
-
fetchImpl;
|
|
142
|
-
constructor(getBaseURL, fetchImpl) {
|
|
143
|
-
this.getBaseURL = getBaseURL;
|
|
144
|
-
this.fetchImpl = fetchImpl;
|
|
145
|
-
}
|
|
146
|
-
async fetch() {
|
|
147
|
-
if (!isBrowser()) {
|
|
148
|
-
throw new Error("user.fetch() requires a browser environment");
|
|
149
|
-
}
|
|
150
|
-
const response = await this.fetchImpl(`${this.getBaseURL()}${ROUTES.USER.ME}`, {
|
|
151
|
-
method: "GET",
|
|
152
|
-
credentials: "include"
|
|
153
|
-
});
|
|
154
|
-
if (!response.ok) {
|
|
155
|
-
const errorResponse = await response.json().catch(() => ({ error: "Unknown error" }));
|
|
156
|
-
throw new Error(errorResponse.error ?? "Failed to fetch user profile");
|
|
157
|
-
}
|
|
158
|
-
return response.json();
|
|
159
|
-
}
|
|
160
|
-
async verify() {
|
|
161
|
-
if (!isBrowser()) {
|
|
162
|
-
throw new Error("user.verify() requires a browser environment");
|
|
163
|
-
}
|
|
164
|
-
const response = await this.fetchImpl(`${this.getBaseURL()}${ROUTES.USER.VERIFY}`, {
|
|
165
|
-
method: "GET",
|
|
166
|
-
credentials: "include"
|
|
167
|
-
});
|
|
168
|
-
if (!response.ok) {
|
|
169
|
-
const errorResponse = await response.json().catch(() => ({ error: "Unknown error" }));
|
|
170
|
-
throw new Error(errorResponse.error ?? "Failed to verify Timeback user");
|
|
171
|
-
}
|
|
172
|
-
const data = await response.json();
|
|
173
|
-
if (data.verified && data.timebackId) {
|
|
174
|
-
return { verified: true, timebackId: data.timebackId };
|
|
175
|
-
}
|
|
176
|
-
return { verified: false };
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
// src/client/timeback-client.class.ts
|
|
180
|
-
class TimebackClient {
|
|
181
|
-
activity;
|
|
182
|
-
auth;
|
|
183
|
-
user;
|
|
184
|
-
_baseURL;
|
|
185
|
-
_fetch;
|
|
186
|
-
constructor(config = {}) {
|
|
187
|
-
this._baseURL = config.baseURL;
|
|
188
|
-
const baseFetch = config.fetch ?? getDefaultFetch();
|
|
189
|
-
if (!baseFetch) {
|
|
190
|
-
throw new Error("TimebackClient requires a fetch implementation. " + "Provide `fetch` in the constructor config for non-browser runtimes.");
|
|
191
|
-
}
|
|
192
|
-
const rawPlugins = config.plugins;
|
|
193
|
-
const plugins = Array.isArray(rawPlugins) ? rawPlugins : rawPlugins ? [rawPlugins] : [];
|
|
194
|
-
this._fetch = plugins.reduce((f, p) => p.wrapFetch(f), baseFetch);
|
|
195
|
-
this.activity = new ActivityManager((payload) => this.sendActivity(payload));
|
|
196
|
-
this.auth = new Auth(() => this.baseURL);
|
|
197
|
-
this.user = new User(() => this.baseURL, this._fetch);
|
|
198
|
-
}
|
|
199
|
-
get baseURL() {
|
|
200
|
-
if (!this._baseURL) {
|
|
201
|
-
const resolved = getDefaultBaseURL();
|
|
202
|
-
if (!resolved) {
|
|
203
|
-
throw new Error("Timeback client requires a browser environment for default baseURL. " + "Provide an explicit baseURL for server-side usage.");
|
|
204
|
-
}
|
|
205
|
-
this._baseURL = resolved;
|
|
206
|
-
}
|
|
207
|
-
return this._baseURL;
|
|
208
|
-
}
|
|
209
|
-
async sendActivity(payload) {
|
|
210
|
-
const response = await this._fetch(`${this.baseURL}${ROUTES.ACTIVITY}`, {
|
|
211
|
-
method: "POST",
|
|
212
|
-
headers: { "Content-Type": "application/json" },
|
|
213
|
-
body: JSON.stringify(payload),
|
|
214
|
-
credentials: "include"
|
|
215
|
-
});
|
|
216
|
-
if (!response.ok) {
|
|
217
|
-
const errorResponse = await response.json().catch(() => ({ error: "Unknown error" }));
|
|
218
|
-
throw new Error(errorResponse.error ?? "Failed to send activity");
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// src/client/timeback-client.ts
|
|
224
|
-
function createClient(config = {}) {
|
|
225
|
-
const baseURL = config.baseURL ?? getDefaultBaseURL();
|
|
226
|
-
return new TimebackClient({
|
|
227
|
-
baseURL,
|
|
228
|
-
fetch: config.fetch,
|
|
229
|
-
plugins: config.plugins
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
// src/client/adapters/react/provider.tsx
|
|
233
|
-
import * as React from "react";
|
|
234
|
-
import { jsx } from "react/jsx-runtime";
|
|
235
|
-
var TimebackContext = React.createContext(undefined);
|
|
236
|
-
var clientInstance;
|
|
237
|
-
function getOrCreateClient() {
|
|
238
|
-
if (!clientInstance) {
|
|
239
|
-
clientInstance = new TimebackClient;
|
|
240
|
-
}
|
|
241
|
-
return clientInstance;
|
|
242
|
-
}
|
|
243
|
-
function TimebackProvider({
|
|
244
|
-
client: providedClient,
|
|
245
|
-
children
|
|
246
|
-
}) {
|
|
247
|
-
const [client, setClient] = React.useState(providedClient);
|
|
248
|
-
React.useEffect(() => {
|
|
249
|
-
if (!client) {
|
|
250
|
-
setClient(providedClient ?? getOrCreateClient());
|
|
251
|
-
}
|
|
252
|
-
}, [client, providedClient]);
|
|
253
|
-
return /* @__PURE__ */ jsx(TimebackContext.Provider, {
|
|
254
|
-
value: client,
|
|
255
|
-
children
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
function useTimeback() {
|
|
259
|
-
return React.useContext(TimebackContext);
|
|
260
|
-
}
|
|
261
|
-
// src/client/adapters/react/hooks/useTimebackVerification.ts
|
|
262
|
-
import * as React2 from "react";
|
|
263
|
-
var VERIFY_CACHE_TTL_MS = 1500;
|
|
264
|
-
var verifyInFlight = new WeakMap;
|
|
265
|
-
var verifyCache = new WeakMap;
|
|
266
|
-
function isCacheFresh(entry) {
|
|
267
|
-
return !!entry && Date.now() - entry.atMs < VERIFY_CACHE_TTL_MS;
|
|
268
|
-
}
|
|
269
|
-
function toState(result) {
|
|
270
|
-
return result.verified ? { status: "verified", timebackId: result.timebackId } : { status: "unverified" };
|
|
271
|
-
}
|
|
272
|
-
async function verifyOnce(timeback, force) {
|
|
273
|
-
if (!force) {
|
|
274
|
-
const cached = verifyCache.get(timeback);
|
|
275
|
-
if (isCacheFresh(cached)) {
|
|
276
|
-
return cached.result;
|
|
277
|
-
}
|
|
278
|
-
const existing = verifyInFlight.get(timeback);
|
|
279
|
-
if (existing) {
|
|
280
|
-
return await existing;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
const p = timeback.user.verify().then((result) => {
|
|
284
|
-
if (verifyInFlight.get(timeback) === p) {
|
|
285
|
-
verifyCache.set(timeback, { atMs: Date.now(), result });
|
|
286
|
-
}
|
|
287
|
-
return result;
|
|
288
|
-
});
|
|
289
|
-
verifyInFlight.set(timeback, p);
|
|
290
|
-
try {
|
|
291
|
-
return await p;
|
|
292
|
-
} finally {
|
|
293
|
-
if (verifyInFlight.get(timeback) === p) {
|
|
294
|
-
verifyInFlight.delete(timeback);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
function useTimebackVerification(options = {}) {
|
|
299
|
-
const timeback = useTimeback();
|
|
300
|
-
const enabled = options.enabled ?? true;
|
|
301
|
-
const [state, setState] = React2.useState({ status: "loading" });
|
|
302
|
-
const [refreshNonce, setRefreshNonce] = React2.useState(0);
|
|
303
|
-
const lastHandledRefreshNonceRef = React2.useRef(0);
|
|
304
|
-
const refresh = React2.useCallback(() => {
|
|
305
|
-
setRefreshNonce((n) => n + 1);
|
|
306
|
-
}, []);
|
|
307
|
-
React2.useEffect(() => {
|
|
308
|
-
if (!enabled)
|
|
309
|
-
return;
|
|
310
|
-
let cancelled = false;
|
|
311
|
-
const force = refreshNonce > lastHandledRefreshNonceRef.current;
|
|
312
|
-
if (timeback && !force) {
|
|
313
|
-
const cached = verifyCache.get(timeback);
|
|
314
|
-
if (isCacheFresh(cached)) {
|
|
315
|
-
setState(toState(cached.result));
|
|
316
|
-
return () => {
|
|
317
|
-
cancelled = true;
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
setState({ status: "loading" });
|
|
322
|
-
(async () => {
|
|
323
|
-
try {
|
|
324
|
-
if (!timeback)
|
|
325
|
-
return;
|
|
326
|
-
if (force) {
|
|
327
|
-
lastHandledRefreshNonceRef.current = refreshNonce;
|
|
328
|
-
}
|
|
329
|
-
const result = await verifyOnce(timeback, force);
|
|
330
|
-
if (cancelled)
|
|
331
|
-
return;
|
|
332
|
-
setState(toState(result));
|
|
333
|
-
} catch (err) {
|
|
334
|
-
if (!cancelled) {
|
|
335
|
-
setState({
|
|
336
|
-
status: "error",
|
|
337
|
-
message: err instanceof Error ? err.message : "Failed to verify Timeback user"
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
})();
|
|
342
|
-
return () => {
|
|
343
|
-
cancelled = true;
|
|
344
|
-
};
|
|
345
|
-
}, [enabled, refreshNonce, timeback]);
|
|
346
|
-
return { state, refresh };
|
|
347
|
-
}
|
|
348
|
-
// src/client/adapters/react/SignInButton.tsx
|
|
349
|
-
import * as React3 from "react";
|
|
350
|
-
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
351
|
-
function TimebackLogo({ className }) {
|
|
352
|
-
return /* @__PURE__ */ jsxs("svg", {
|
|
353
|
-
className,
|
|
354
|
-
width: "20",
|
|
355
|
-
height: "18",
|
|
356
|
-
viewBox: "0 0 199 180",
|
|
357
|
-
fill: "none",
|
|
358
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
359
|
-
"aria-hidden": "true",
|
|
360
|
-
children: [
|
|
361
|
-
/* @__PURE__ */ jsxs("g", {
|
|
362
|
-
clipPath: "url(#tb-logo-clip)",
|
|
363
|
-
children: [
|
|
364
|
-
/* @__PURE__ */ jsx2("path", {
|
|
365
|
-
d: "M121.432 179.456C110.607 177.871 101.153 173.91 92.4882 168.085C91.1274 167.17 89.4598 165.404 89.4375 164.008C89.2123 149.891 89.3002 135.77 89.3002 119.86C93.1365 123.255 95.8538 125.706 98.6224 128.099C103.151 132.012 107.437 136.28 112.314 139.703C126.466 149.635 145.037 147.25 156.045 134.448C166.919 121.803 167.226 101.374 155.695 89.6399C145.727 79.4958 134.693 70.3995 123.251 60.0438C123.251 77.8871 123.251 94.5637 123.251 112.15C121.428 110.999 120.279 110.479 119.383 109.676C110.329 101.573 101.241 93.5044 92.3634 85.2109C90.8519 83.7988 89.4363 81.3758 89.4209 79.4084C89.2249 54.4218 89.2905 29.4332 89.3061 4.44502C89.3066 3.64954 89.3061 2.22136 89.3061 1.47755C90.8061 1.47755 92.694 1.47857 94.1427 1.47755C118.131 1.46071 142.12 1.52088 166.108 1.39821C169.235 1.38222 171.33 2.18661 173.251 4.75826C180.607 14.6032 188.189 24.279 196.266 34.7705C179.79 34.7705 164.169 34.7705 148.548 34.7705C147.871 34.7705 147.366 34.7705 146.866 34.7705C147.866 35.7705 150.35 38.3018 151.61 39.4825C162.643 49.8249 174.663 59.3807 184.245 70.947C202.474 92.9508 203.539 118.134 191.204 143.046C178.598 168.508 156.61 180.302 128.298 180.295C126.154 180.295 124.011 179.778 121.432 179.456Z",
|
|
366
|
-
fill: "currentColor"
|
|
367
|
-
}),
|
|
368
|
-
/* @__PURE__ */ jsx2("circle", {
|
|
369
|
-
cx: "40",
|
|
370
|
-
cy: "133",
|
|
371
|
-
r: "39",
|
|
372
|
-
fill: "currentColor"
|
|
373
|
-
}),
|
|
374
|
-
/* @__PURE__ */ jsx2("circle", {
|
|
375
|
-
cx: "39",
|
|
376
|
-
cy: "39",
|
|
377
|
-
r: "39",
|
|
378
|
-
fill: "currentColor"
|
|
379
|
-
})
|
|
380
|
-
]
|
|
381
|
-
}),
|
|
382
|
-
/* @__PURE__ */ jsx2("defs", {
|
|
383
|
-
children: /* @__PURE__ */ jsx2("clipPath", {
|
|
384
|
-
id: "tb-logo-clip",
|
|
385
|
-
children: /* @__PURE__ */ jsx2("rect", {
|
|
386
|
-
width: "199",
|
|
387
|
-
height: "180",
|
|
388
|
-
fill: "currentColor"
|
|
389
|
-
})
|
|
390
|
-
})
|
|
391
|
-
})
|
|
392
|
-
]
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
function LoadingSpinner({ className }) {
|
|
396
|
-
return /* @__PURE__ */ jsxs("svg", {
|
|
397
|
-
className,
|
|
398
|
-
width: "16",
|
|
399
|
-
height: "16",
|
|
400
|
-
viewBox: "0 0 24 24",
|
|
401
|
-
fill: "none",
|
|
402
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
403
|
-
"aria-hidden": "true",
|
|
404
|
-
children: [
|
|
405
|
-
/* @__PURE__ */ jsx2("circle", {
|
|
406
|
-
cx: "12",
|
|
407
|
-
cy: "12",
|
|
408
|
-
r: "10",
|
|
409
|
-
stroke: "currentColor",
|
|
410
|
-
strokeWidth: "2",
|
|
411
|
-
strokeOpacity: "0.25"
|
|
412
|
-
}),
|
|
413
|
-
/* @__PURE__ */ jsx2("path", {
|
|
414
|
-
d: "M12 2C6.48 2 2 6.48 2 12",
|
|
415
|
-
stroke: "currentColor",
|
|
416
|
-
strokeWidth: "2",
|
|
417
|
-
strokeLinecap: "round"
|
|
418
|
-
})
|
|
419
|
-
]
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
var defaultStyles = `
|
|
1
|
+
import{a as m,b as u,c as b,d,e as UK,f as S,g as ZK}from"../../../chunk-8gg8n8v9.js";import*as _ from"react";import{jsx as c}from"react/jsx-runtime";var p=_.createContext(void 0),I;function s(){if(!I)I=new S;return I}function n({client:K,children:J}){let[Q,q]=_.useState(void 0);_.useEffect(()=>{if(!K&&!Q)q(s())},[K,Q]);let U=K??Q;return c(p.Provider,{value:U,children:J})}function w(){return _.useContext(p)}import*as A from"react";var i=1500,T=new WeakMap,N=new WeakMap;function f(K){return!!K&&Date.now()-K.atMs<i}function k(K){return K.verified?{status:"verified",timebackId:K.timebackId}:{status:"unverified"}}async function a(K,J){if(!J){let q=N.get(K);if(f(q))return q.result;let U=T.get(K);if(U)return await U}let Q=K.user.verify().then((q)=>{if(T.get(K)===Q)N.set(K,{atMs:Date.now(),result:q});return q});T.set(K,Q);try{return await Q}finally{if(T.get(K)===Q)T.delete(K)}}function F(K={}){let J=w(),Q=K.enabled??!0,q=K.retryAttempts??m,U=K.retryDelays??u,[L,$]=A.useState({status:"loading"}),[M,H]=A.useState(0),V=A.useRef(0),P=A.useCallback(()=>{H((Z)=>Z+1)},[]);return A.useEffect(()=>{if(!Q)return;let Z=!1,D=M>V.current;if(J&&!D){let G=N.get(J);if(f(G))return $(k(G.result)),()=>{Z=!0}}return $({status:"loading"}),(async()=>{if(!J)return;if(D)V.current=M;let G;for(let O=0;O<=q;O++){if(Z)return;if(O>0){let X=d(U,O-1);if(await b(X),Z)return}try{let X=await a(J,D||O>0);if(Z)return;$(k(X));return}catch(X){G=X instanceof Error?X:Error("Failed to verify Timeback user")}}if(!Z&&G)$({status:"error",message:G.message})})(),()=>{Z=!0}},[Q,M,q,U,J]),{state:L,refresh:P}}import*as z from"react";var j=new WeakMap,C=new WeakMap;function h(K){return!!K&&Date.now()-K.atMs<5000}async function o(K,J){if(!J){let q=C.get(K);if(h(q))return q.profile;let U=j.get(K);if(U)return await U}let Q=K.user.fetch().then((q)=>{if(j.get(K)===Q)C.set(K,{atMs:Date.now(),profile:q});return q});j.set(K,Q);try{return await Q}finally{if(j.get(K)===Q)j.delete(K)}}function v(K){let J=C.get(K);return h(J)?J.profile:void 0}function t(K={}){let{enabled:J=!0,auto:Q=!1}=K,q=w(),{state:U}=F({enabled:J}),[L,$]=z.useState({status:"idle"}),[M,H]=z.useState(0),[V,P]=z.useState(0),Z=z.useRef(0),D=z.useRef(0),G=J&&U.status==="verified"&&!!q,O=z.useCallback(()=>{if(!G)return;H((Y)=>Y+1)},[G]),X=z.useCallback(()=>{if(!G)return;P((Y)=>Y+1)},[G]),E=z.useRef(!1);return z.useEffect(()=>{if(!J){$({status:"idle"});return}if(U.status!=="verified"){$((W)=>W.status==="idle"?W:{status:"idle"}),E.current=!1;return}if(Q&&!E.current&&M===0){E.current=!0,H(1);return}if(M===0&&V===0)return;let Y=!1,r=M>Z.current,y=V>D.current,g=y;if(!r&&!y){if(q){let W=v(q);if(W)return $({status:"loaded",profile:W}),()=>{Y=!0}}return}if(q&&!g){let W=v(q);if(W)return $({status:"loaded",profile:W}),Z.current=M,()=>{Y=!0}}return $({status:"loading"}),(async()=>{try{if(!q)return;Z.current=M,D.current=V;let W=await o(q,g);if(Y)return;$({status:"loaded",profile:W})}catch(W){if(!Y)$({status:"error",message:W instanceof Error?W.message:"Failed to fetch profile"})}})(),()=>{Y=!0}},[J,U.status,M,V,q,Q]),{state:L,canFetch:G,fetchProfile:O,refresh:X}}import*as R from"react";import{jsx as B,jsxs as x}from"react/jsx-runtime";function e({className:K}){return x("svg",{className:K,width:"20",height:"18",viewBox:"0 0 199 180",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[x("g",{clipPath:"url(#tb-logo-clip)",children:[B("path",{d:"M121.432 179.456C110.607 177.871 101.153 173.91 92.4882 168.085C91.1274 167.17 89.4598 165.404 89.4375 164.008C89.2123 149.891 89.3002 135.77 89.3002 119.86C93.1365 123.255 95.8538 125.706 98.6224 128.099C103.151 132.012 107.437 136.28 112.314 139.703C126.466 149.635 145.037 147.25 156.045 134.448C166.919 121.803 167.226 101.374 155.695 89.6399C145.727 79.4958 134.693 70.3995 123.251 60.0438C123.251 77.8871 123.251 94.5637 123.251 112.15C121.428 110.999 120.279 110.479 119.383 109.676C110.329 101.573 101.241 93.5044 92.3634 85.2109C90.8519 83.7988 89.4363 81.3758 89.4209 79.4084C89.2249 54.4218 89.2905 29.4332 89.3061 4.44502C89.3066 3.64954 89.3061 2.22136 89.3061 1.47755C90.8061 1.47755 92.694 1.47857 94.1427 1.47755C118.131 1.46071 142.12 1.52088 166.108 1.39821C169.235 1.38222 171.33 2.18661 173.251 4.75826C180.607 14.6032 188.189 24.279 196.266 34.7705C179.79 34.7705 164.169 34.7705 148.548 34.7705C147.871 34.7705 147.366 34.7705 146.866 34.7705C147.866 35.7705 150.35 38.3018 151.61 39.4825C162.643 49.8249 174.663 59.3807 184.245 70.947C202.474 92.9508 203.539 118.134 191.204 143.046C178.598 168.508 156.61 180.302 128.298 180.295C126.154 180.295 124.011 179.778 121.432 179.456Z",fill:"currentColor"}),B("circle",{cx:"40",cy:"133",r:"39",fill:"currentColor"}),B("circle",{cx:"39",cy:"39",r:"39",fill:"currentColor"})]}),B("defs",{children:B("clipPath",{id:"tb-logo-clip",children:B("rect",{width:"199",height:"180",fill:"currentColor"})})})]})}function KK({className:K}){return x("svg",{className:K,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[B("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"2",strokeOpacity:"0.25"}),B("path",{d:"M12 2C6.48 2 2 6.48 2 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]})}var qK=`
|
|
423
2
|
.timeback-signin-btn {
|
|
424
3
|
/* Colors */
|
|
425
4
|
--tb-btn-bg: #0f172a;
|
|
@@ -531,75 +110,4 @@ var defaultStyles = `
|
|
|
531
110
|
from { transform: rotate(0deg); }
|
|
532
111
|
to { transform: rotate(360deg); }
|
|
533
112
|
}
|
|
534
|
-
|
|
535
|
-
var stylesInjected = false;
|
|
536
|
-
function injectStyles() {
|
|
537
|
-
if (typeof document === "undefined" || stylesInjected)
|
|
538
|
-
return;
|
|
539
|
-
const styleEl = document.createElement("style");
|
|
540
|
-
styleEl.setAttribute("data-timeback-styles", "");
|
|
541
|
-
styleEl.textContent = defaultStyles;
|
|
542
|
-
document.head.appendChild(styleEl);
|
|
543
|
-
stylesInjected = true;
|
|
544
|
-
}
|
|
545
|
-
function SignInButton(props) {
|
|
546
|
-
const {
|
|
547
|
-
children = "Sign in with Timeback",
|
|
548
|
-
className,
|
|
549
|
-
style,
|
|
550
|
-
disabled,
|
|
551
|
-
showLoading = true,
|
|
552
|
-
onClick,
|
|
553
|
-
variant = "default",
|
|
554
|
-
size = "md",
|
|
555
|
-
showLogo = true
|
|
556
|
-
} = props;
|
|
557
|
-
const timeback = useTimeback();
|
|
558
|
-
const [isLoading, setIsLoading] = React3.useState(false);
|
|
559
|
-
const isReady = !!timeback;
|
|
560
|
-
React3.useEffect(() => {
|
|
561
|
-
injectStyles();
|
|
562
|
-
}, []);
|
|
563
|
-
const handleClick = (e) => {
|
|
564
|
-
if (onClick) {
|
|
565
|
-
onClick(e);
|
|
566
|
-
if (e.defaultPrevented)
|
|
567
|
-
return;
|
|
568
|
-
}
|
|
569
|
-
if (showLoading) {
|
|
570
|
-
setIsLoading(true);
|
|
571
|
-
}
|
|
572
|
-
timeback?.auth.signIn();
|
|
573
|
-
};
|
|
574
|
-
const classNames = [
|
|
575
|
-
"timeback-signin-btn",
|
|
576
|
-
variant !== "default" && `timeback-signin-btn--${variant}`,
|
|
577
|
-
size !== "md" && `timeback-signin-btn--${size}`,
|
|
578
|
-
className
|
|
579
|
-
].filter(Boolean).join(" ");
|
|
580
|
-
return /* @__PURE__ */ jsxs("button", {
|
|
581
|
-
type: "button",
|
|
582
|
-
className: classNames,
|
|
583
|
-
style,
|
|
584
|
-
disabled: disabled || !isReady || isLoading,
|
|
585
|
-
onClick: handleClick,
|
|
586
|
-
"aria-busy": isLoading,
|
|
587
|
-
children: [
|
|
588
|
-
isLoading ? /* @__PURE__ */ jsx2(LoadingSpinner, {
|
|
589
|
-
className: "timeback-signin-btn__spinner"
|
|
590
|
-
}) : showLogo ? /* @__PURE__ */ jsx2(TimebackLogo, {
|
|
591
|
-
className: "timeback-signin-btn__logo"
|
|
592
|
-
}) : null,
|
|
593
|
-
children
|
|
594
|
-
]
|
|
595
|
-
});
|
|
596
|
-
}
|
|
597
|
-
export {
|
|
598
|
-
useTimebackVerification,
|
|
599
|
-
useTimeback,
|
|
600
|
-
createClient,
|
|
601
|
-
TimebackProvider,
|
|
602
|
-
TimebackClient,
|
|
603
|
-
SignInButton,
|
|
604
|
-
Activity
|
|
605
|
-
};
|
|
113
|
+
`,l=!1;function JK(){if(typeof document>"u"||l)return;let K=document.createElement("style");K.setAttribute("data-timeback-styles",""),K.textContent=qK,document.head.appendChild(K),l=!0}function QK(K){let{children:J="Sign in with Timeback",className:Q,style:q,disabled:U,showLoading:L=!0,onClick:$,variant:M="default",size:H="md",showLogo:V=!0}=K,P=w(),[Z,D]=R.useState(!1),G=!!P;R.useEffect(()=>{JK()},[]);let O=(E)=>{if($){if($(E),E.defaultPrevented)return}if(L)D(!0);P?.auth.signIn()},X=["timeback-signin-btn",M!=="default"&&`timeback-signin-btn--${M}`,H!=="md"&&`timeback-signin-btn--${H}`,Q].filter(Boolean).join(" ");return x("button",{type:"button",className:X,style:q,disabled:U||!G||Z,onClick:O,"aria-busy":Z,children:[Z?B(KK,{className:"timeback-signin-btn__spinner"}):V?B(e,{className:"timeback-signin-btn__logo"}):null,J]})}export{F as useTimebackVerification,t as useTimebackProfile,w as useTimeback,ZK as createClient,n as TimebackProvider,S as TimebackClient,QK as SignInButton,UK as Activity};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../src/client/adapters/react/provider.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAO5D;;GAEG;AACH,UAAU,qBAAqB;IAC9B,wFAAwF;IACxF,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,uBAAuB;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CACzB;AAiBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,CAAC,EAChC,MAAM,EAAE,cAAc,EACtB,QAAQ,EACR,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../src/client/adapters/react/provider.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAO5D;;GAEG;AACH,UAAU,qBAAqB;IAC9B,wFAAwF;IACxF,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,uBAAuB;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CACzB;AAiBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,CAAC,EAChC,MAAM,EAAE,cAAc,EACtB,QAAQ,EACR,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,CAiC5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,WAAW,IAAI,cAAc,GAAG,SAAS,CAExD"}
|
|
@@ -40,6 +40,9 @@ export { Activity, createClient, TimebackClient } from '@timeback/sdk/client';
|
|
|
40
40
|
export type { ActivityMetrics, ActivityParams, TimebackIdentity } from '@timeback/sdk/client';
|
|
41
41
|
export { TimebackProvider, useTimeback } from './context';
|
|
42
42
|
export type { TimebackProviderProps } from './context';
|
|
43
|
+
export { createTimebackVerification } from './primitives/createTimebackVerification';
|
|
44
|
+
export { createTimebackProfile } from './primitives/createTimebackProfile';
|
|
45
|
+
export type { CreateTimebackProfileOptions, CreateTimebackProfileResult, CreateTimebackVerificationOptions, CreateTimebackVerificationResult, TimebackProfileState, TimebackVerificationState, } from './types';
|
|
43
46
|
export { SignInButton } from './SignInButton';
|
|
44
47
|
export type { SignInButtonProps } from './SignInButton';
|
|
45
48
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/adapters/solid/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC7E,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAG7F,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/adapters/solid/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC7E,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAG7F,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAGtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAA;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,YAAY,EACX,4BAA4B,EAC5B,2BAA2B,EAC3B,iCAAiC,EACjC,gCAAgC,EAChC,oBAAoB,EACpB,yBAAyB,GACzB,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -44,6 +44,18 @@ export type { ActivityMetrics, ActivityParams, TimebackIdentity } from '@timebac
|
|
|
44
44
|
export { TimebackProvider, useTimeback } from './context'
|
|
45
45
|
export type { TimebackProviderProps } from './context'
|
|
46
46
|
|
|
47
|
+
// Primitives
|
|
48
|
+
export { createTimebackVerification } from './primitives/createTimebackVerification'
|
|
49
|
+
export { createTimebackProfile } from './primitives/createTimebackProfile'
|
|
50
|
+
export type {
|
|
51
|
+
CreateTimebackProfileOptions,
|
|
52
|
+
CreateTimebackProfileResult,
|
|
53
|
+
CreateTimebackVerificationOptions,
|
|
54
|
+
CreateTimebackVerificationResult,
|
|
55
|
+
TimebackProfileState,
|
|
56
|
+
TimebackVerificationState,
|
|
57
|
+
} from './types'
|
|
58
|
+
|
|
47
59
|
// Components
|
|
48
60
|
export { SignInButton } from './SignInButton'
|
|
49
61
|
export type { SignInButtonProps } from './SignInButton'
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createTimebackProfile
|
|
3
|
+
*
|
|
4
|
+
* Solid primitive for fetching the current user's Timeback profile.
|
|
5
|
+
*
|
|
6
|
+
* Composes `createTimebackVerification` internally and only fetches
|
|
7
|
+
* the profile when the user is verified (i.e., exists in Timeback).
|
|
8
|
+
*/
|
|
9
|
+
import type { CreateTimebackProfileOptions, CreateTimebackProfileResult } from '../types';
|
|
10
|
+
/**
|
|
11
|
+
* Fetch the current user's Timeback profile.
|
|
12
|
+
*
|
|
13
|
+
* Internally uses `createTimebackVerification` to ensure the user
|
|
14
|
+
* is verified before fetching. When `auto: true`, it automatically fetches
|
|
15
|
+
* the profile once verified. Otherwise, call `fetchProfile()` manually.
|
|
16
|
+
*
|
|
17
|
+
* @param options - Options
|
|
18
|
+
* @param options.enabled - If false, does nothing and stays in idle state. Defaults to true.
|
|
19
|
+
* @param options.auto - If true, automatically fetch once verified. Defaults to false.
|
|
20
|
+
* @returns Profile state and fetch methods
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* // Manual fetch
|
|
25
|
+
* import { createTimebackProfile } from '@timeback/sdk/solid'
|
|
26
|
+
* import { Show } from 'solid-js'
|
|
27
|
+
*
|
|
28
|
+
* function ProfileButton() {
|
|
29
|
+
* const { state, canFetch, fetchProfile } = createTimebackProfile()
|
|
30
|
+
*
|
|
31
|
+
* return (
|
|
32
|
+
* <Show
|
|
33
|
+
* when={state.status === 'loaded'}
|
|
34
|
+
* fallback={
|
|
35
|
+
* <button onClick={fetchProfile} disabled={!canFetch}>
|
|
36
|
+
* {state.status === 'loading' ? 'Loading...' : 'Load Profile'}
|
|
37
|
+
* </button>
|
|
38
|
+
* }
|
|
39
|
+
* >
|
|
40
|
+
* <div>XP: {state.profile.xp}</div>
|
|
41
|
+
* </Show>
|
|
42
|
+
* )
|
|
43
|
+
* }
|
|
44
|
+
*
|
|
45
|
+
* // Auto-fetch
|
|
46
|
+
* function AutoProfile() {
|
|
47
|
+
* const { state } = createTimebackProfile({ auto: true })
|
|
48
|
+
*
|
|
49
|
+
* return (
|
|
50
|
+
* <Show when={state.status === 'loading'}>
|
|
51
|
+
* <div>Loading...</div>
|
|
52
|
+
* </Show>
|
|
53
|
+
* )
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare function createTimebackProfile(options?: CreateTimebackProfileOptions): CreateTimebackProfileResult;
|
|
58
|
+
//# sourceMappingURL=createTimebackProfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createTimebackProfile.d.ts","sourceRoot":"","sources":["../../../../../src/client/adapters/solid/primitives/createTimebackProfile.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EACX,4BAA4B,EAC5B,2BAA2B,EAE3B,MAAM,UAAU,CAAA;AAEjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,GAAE,4BAAiC,GACxC,2BAA2B,CA0I7B"}
|