timeback 0.0.0-alpha.2 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +378 -7
- package/dist/client/adapters/react/SignInButton.d.ts +60 -0
- package/dist/client/adapters/react/SignInButton.d.ts.map +1 -0
- package/dist/client/adapters/react/index.d.ts +43 -0
- package/dist/client/adapters/react/index.d.ts.map +1 -0
- package/dist/client/adapters/react/index.js +478 -0
- package/dist/client/adapters/react/provider.d.ts +74 -0
- package/dist/client/adapters/react/provider.d.ts.map +1 -0
- package/dist/client/adapters/solid/SignInButton.d.ts +52 -0
- package/dist/client/adapters/solid/SignInButton.d.ts.map +1 -0
- package/dist/client/adapters/solid/SignInButton.tsx +321 -0
- package/dist/client/adapters/solid/context.d.ts +73 -0
- package/dist/client/adapters/solid/context.d.ts.map +1 -0
- package/dist/client/adapters/solid/context.tsx +91 -0
- package/dist/client/adapters/solid/index.d.ts +42 -0
- package/dist/client/adapters/solid/index.d.ts.map +1 -0
- package/dist/client/adapters/solid/index.ts +46 -0
- package/dist/client/adapters/svelte/SignInButton.svelte +234 -0
- package/dist/client/adapters/svelte/SignInButton.svelte.d.ts +24 -0
- package/dist/client/adapters/svelte/index.d.ts +33 -0
- package/dist/client/adapters/svelte/index.d.ts.map +1 -0
- package/dist/client/adapters/svelte/index.ts +38 -0
- package/dist/client/adapters/svelte/stores.d.ts +62 -0
- package/dist/client/adapters/svelte/stores.d.ts.map +1 -0
- package/dist/client/adapters/svelte/stores.ts +139 -0
- package/dist/client/adapters/vue/SignInButton.vue +260 -0
- package/dist/client/adapters/vue/SignInButton.vue.d.ts +53 -0
- package/dist/client/adapters/vue/index.d.ts +43 -0
- package/dist/client/adapters/vue/index.d.ts.map +1 -0
- package/dist/client/adapters/vue/index.ts +48 -0
- package/dist/client/adapters/vue/provider.d.ts +94 -0
- package/dist/client/adapters/vue/provider.d.ts.map +1 -0
- package/dist/client/adapters/vue/provider.ts +147 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/lib/activity/activity.class.d.ts +73 -0
- package/dist/client/lib/activity/activity.class.d.ts.map +1 -0
- package/dist/client/lib/activity/activity.d.ts +16 -0
- package/dist/client/lib/activity/activity.d.ts.map +1 -0
- package/dist/client/lib/activity/index.d.ts +6 -0
- package/dist/client/lib/activity/index.d.ts.map +1 -0
- package/dist/client/lib/utils.d.ts +20 -0
- package/dist/client/lib/utils.d.ts.map +1 -0
- package/dist/client/namespaces/activity.d.ts +37 -0
- package/dist/client/namespaces/activity.d.ts.map +1 -0
- package/dist/client/namespaces/auth.d.ts +33 -0
- package/dist/client/namespaces/auth.d.ts.map +1 -0
- package/dist/client/namespaces/index.d.ts +7 -0
- package/dist/client/namespaces/index.d.ts.map +1 -0
- package/dist/client/namespaces/user.d.ts +29 -0
- package/dist/client/namespaces/user.d.ts.map +1 -0
- package/dist/client/timeback-client.class.d.ts +37 -0
- package/dist/client/timeback-client.class.d.ts.map +1 -0
- package/dist/client/timeback-client.d.ts +29 -0
- package/dist/client/timeback-client.d.ts.map +1 -0
- package/dist/client.d.ts +30 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +198 -0
- package/dist/index.d.ts +27 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1373 -11
- package/dist/server/adapters/express.d.ts +62 -0
- package/dist/server/adapters/express.d.ts.map +1 -0
- package/dist/server/adapters/express.js +565 -0
- package/dist/server/adapters/native.d.ts +45 -0
- package/dist/server/adapters/native.d.ts.map +1 -0
- package/dist/server/adapters/native.js +509 -0
- package/dist/server/adapters/nextjs.d.ts +30 -0
- package/dist/server/adapters/nextjs.d.ts.map +1 -0
- package/dist/server/adapters/nextjs.js +521 -0
- package/dist/server/adapters/nuxt.d.ts +96 -0
- package/dist/server/adapters/nuxt.d.ts.map +1 -0
- package/dist/server/adapters/nuxt.js +663 -0
- package/dist/server/adapters/solid-start.d.ts +61 -0
- package/dist/server/adapters/solid-start.d.ts.map +1 -0
- package/dist/server/adapters/solid-start.js +551 -0
- package/dist/server/adapters/svelte-kit.d.ts +82 -0
- package/dist/server/adapters/svelte-kit.d.ts.map +1 -0
- package/dist/server/adapters/svelte-kit.js +572 -0
- package/dist/server/adapters/tanstack-start.d.ts +40 -0
- package/dist/server/adapters/tanstack-start.d.ts.map +1 -0
- package/dist/server/adapters/tanstack-start.js +522 -0
- package/dist/server/adapters/types.d.ts +280 -0
- package/dist/server/adapters/types.d.ts.map +1 -0
- package/dist/server/adapters/utils.d.ts +15 -0
- package/dist/server/adapters/utils.d.ts.map +1 -0
- package/dist/server/handlers/activity.d.ts +28 -0
- package/dist/server/handlers/activity.d.ts.map +1 -0
- package/dist/server/handlers/identity.d.ts +24 -0
- package/dist/server/handlers/identity.d.ts.map +1 -0
- package/dist/server/handlers/index.d.ts +9 -0
- package/dist/server/handlers/index.d.ts.map +1 -0
- package/dist/server/handlers/user.d.ts +30 -0
- package/dist/server/handlers/user.d.ts.map +1 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/lib/index.d.ts +9 -0
- package/dist/server/lib/index.d.ts.map +1 -0
- package/dist/server/lib/logger.d.ts +21 -0
- package/dist/server/lib/logger.d.ts.map +1 -0
- package/dist/server/lib/oidc.d.ts +76 -0
- package/dist/server/lib/oidc.d.ts.map +1 -0
- package/dist/server/lib/utils.d.ts +39 -0
- package/dist/server/lib/utils.d.ts.map +1 -0
- package/dist/server/timeback.d.ts +48 -0
- package/dist/server/timeback.d.ts.map +1 -0
- package/dist/server/types.d.ts +300 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/shared/constants.d.ts +18 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/types.d.ts +100 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/package.json +104 -28
package/README.md
CHANGED
|
@@ -1,15 +1,386 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Timeback SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
TypeScript SDK for integrating Timeback into your application. Provides server-side route handlers and client-side components for activity tracking and SSO authentication.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Installation](#installation)
|
|
8
|
+
- [Quick Start](#quick-start)
|
|
9
|
+
- [Server Adapters](#server-adapters)
|
|
10
|
+
- [Next.js](#nextjs)
|
|
11
|
+
- [Nuxt](#nuxt)
|
|
12
|
+
- [SvelteKit](#sveltekit)
|
|
13
|
+
- [SolidStart](#solidstart)
|
|
14
|
+
- [TanStack Start](#tanstack-start)
|
|
15
|
+
- [Express](#express)
|
|
16
|
+
- [Client Adapters](#client-adapters)
|
|
17
|
+
- [React](#react)
|
|
18
|
+
- [Vue](#vue)
|
|
19
|
+
- [Svelte](#svelte)
|
|
20
|
+
- [Solid](#solid)
|
|
21
|
+
- [Identity Modes](#identity-modes)
|
|
22
|
+
- [Activity Tracking](#activity-tracking)
|
|
23
|
+
|
|
24
|
+
## Installation
|
|
4
25
|
|
|
5
26
|
```bash
|
|
6
|
-
|
|
27
|
+
npm install timeback
|
|
28
|
+
# or
|
|
29
|
+
bun add timeback
|
|
7
30
|
```
|
|
8
31
|
|
|
9
|
-
|
|
32
|
+
## Quick Start
|
|
10
33
|
|
|
11
|
-
|
|
12
|
-
|
|
34
|
+
1. Create a server instance with your credentials
|
|
35
|
+
2. Mount the route handlers for your framework
|
|
36
|
+
3. Wrap your app with the client provider
|
|
37
|
+
4. Use hooks/composables to track activities
|
|
38
|
+
|
|
39
|
+
## Server Adapters
|
|
40
|
+
|
|
41
|
+
All server adapters use the same core configuration:
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
// lib/timeback.ts
|
|
45
|
+
import { createServer } from 'timeback'
|
|
46
|
+
|
|
47
|
+
export const timeback = await createServer({
|
|
48
|
+
env: 'staging', // 'development' | 'staging' | 'production'
|
|
49
|
+
api: {
|
|
50
|
+
clientId: process.env.TIMEBACK_API_CLIENT_ID!,
|
|
51
|
+
clientSecret: process.env.TIMEBACK_API_CLIENT_SECRET!,
|
|
52
|
+
},
|
|
53
|
+
identity: {
|
|
54
|
+
mode: 'sso',
|
|
55
|
+
clientId: process.env.AWS_COGNITO_CLIENT_ID!,
|
|
56
|
+
clientSecret: process.env.AWS_COGNITO_CLIENT_SECRET!,
|
|
57
|
+
redirectUri: 'http://localhost:3000/api/auth/sso/callback/timeback',
|
|
58
|
+
onCallbackSuccess: ({ user, redirect }) => {
|
|
59
|
+
// Set session, then redirect
|
|
60
|
+
return redirect('/')
|
|
61
|
+
},
|
|
62
|
+
onCallbackError: ({ error, redirect }) => {
|
|
63
|
+
console.error('SSO Error:', error)
|
|
64
|
+
return redirect('/?error=sso_failed')
|
|
65
|
+
},
|
|
66
|
+
getUser: () => getSession(), // Return current user or undefined
|
|
67
|
+
},
|
|
68
|
+
})
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Next.js
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// app/api/timeback/[...timeback]/route.ts
|
|
75
|
+
import { toNextjsHandler } from 'timeback/nextjs'
|
|
76
|
+
|
|
77
|
+
import { timeback } from '@/lib/timeback'
|
|
78
|
+
|
|
79
|
+
export const { GET, POST } = toNextjsHandler(timeback)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Nuxt
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
// server/middleware/timeback.ts
|
|
86
|
+
import { nuxtHandler } from 'timeback/nuxt'
|
|
87
|
+
|
|
88
|
+
import { timeback } from '../lib/timeback'
|
|
89
|
+
|
|
90
|
+
export default defineEventHandler(async event => {
|
|
91
|
+
const response = await nuxtHandler({
|
|
92
|
+
timeback,
|
|
93
|
+
event,
|
|
94
|
+
})
|
|
95
|
+
if (response) return response
|
|
96
|
+
})
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### SvelteKit
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
// src/hooks.server.ts
|
|
103
|
+
import { building } from '$app/environment'
|
|
104
|
+
import { timeback } from '$lib/timeback'
|
|
105
|
+
import { svelteKitHandler } from 'timeback/svelte-kit'
|
|
106
|
+
|
|
107
|
+
import type { Handle } from '@sveltejs/kit'
|
|
108
|
+
|
|
109
|
+
export const handle: Handle = ({ event, resolve }) => {
|
|
110
|
+
return svelteKitHandler({
|
|
111
|
+
timeback,
|
|
112
|
+
event,
|
|
113
|
+
resolve,
|
|
114
|
+
building,
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### SolidStart
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
// src/middleware.ts
|
|
123
|
+
import { createMiddleware } from '@solidjs/start/middleware'
|
|
124
|
+
import { timeback } from '~/lib/timeback'
|
|
125
|
+
import { solidStartHandler } from 'timeback/solid-start'
|
|
126
|
+
|
|
127
|
+
export default createMiddleware({
|
|
128
|
+
onRequest: [
|
|
129
|
+
async event => {
|
|
130
|
+
const response = await solidStartHandler({
|
|
131
|
+
timeback,
|
|
132
|
+
event,
|
|
133
|
+
})
|
|
134
|
+
if (response) return response
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
})
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### TanStack Start
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
// src/routes/api/timeback/$.ts
|
|
144
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
145
|
+
import { toTanStackStartHandler } from 'timeback/tanstack-start'
|
|
146
|
+
|
|
147
|
+
import { timeback } from '@/lib/timeback'
|
|
148
|
+
|
|
149
|
+
const handlers = toTanStackStartHandler(timeback)
|
|
150
|
+
|
|
151
|
+
export const Route = createFileRoute('/api/timeback/$')({
|
|
152
|
+
server: { handlers },
|
|
153
|
+
})
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Express
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
// server.ts
|
|
160
|
+
import express from 'express'
|
|
161
|
+
import { toExpressMiddleware } from 'timeback/express'
|
|
162
|
+
|
|
163
|
+
import { timeback } from './lib/timeback'
|
|
164
|
+
|
|
165
|
+
const app = express()
|
|
166
|
+
app.use(express.json())
|
|
167
|
+
app.use('/api/timeback', toExpressMiddleware(timeback))
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Client Adapters
|
|
171
|
+
|
|
172
|
+
### React
|
|
173
|
+
|
|
174
|
+
```tsx
|
|
175
|
+
// app/providers.tsx
|
|
176
|
+
'use client'
|
|
177
|
+
|
|
178
|
+
import { TimebackProvider } from 'timeback/react'
|
|
179
|
+
|
|
180
|
+
export function Providers({ children }: { children: React.ReactNode }) {
|
|
181
|
+
return <TimebackProvider>{children}</TimebackProvider>
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
```tsx
|
|
186
|
+
// components/ActivityTracker.tsx
|
|
187
|
+
import { useEffect } from 'react'
|
|
188
|
+
import { SignInButton, useTimeback } from 'timeback/react'
|
|
189
|
+
|
|
190
|
+
function MyComponent() {
|
|
191
|
+
const timeback = useTimeback()
|
|
192
|
+
|
|
193
|
+
useEffect(() => {
|
|
194
|
+
if (!timeback) return
|
|
195
|
+
|
|
196
|
+
const activity = timeback.activity
|
|
197
|
+
.new({ id: 'lesson-1', name: 'Intro', courseCode: 'MATH-101' })
|
|
198
|
+
.start()
|
|
199
|
+
|
|
200
|
+
return () => {
|
|
201
|
+
activity.end()
|
|
202
|
+
}
|
|
203
|
+
}, [timeback])
|
|
204
|
+
|
|
205
|
+
return <SignInButton size="lg" />
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Vue
|
|
210
|
+
|
|
211
|
+
```vue
|
|
212
|
+
<!-- app.vue -->
|
|
213
|
+
<script setup>
|
|
214
|
+
import { TimebackProvider } from 'timeback/vue'
|
|
215
|
+
</script>
|
|
216
|
+
|
|
217
|
+
<template>
|
|
218
|
+
<TimebackProvider>
|
|
219
|
+
<NuxtPage />
|
|
220
|
+
</TimebackProvider>
|
|
221
|
+
</template>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
```vue
|
|
225
|
+
<!-- components/ActivityTracker.vue -->
|
|
226
|
+
<script setup>
|
|
227
|
+
import { SignInButton, useTimeback } from 'timeback/vue'
|
|
228
|
+
import { onMounted, onUnmounted } from 'vue'
|
|
229
|
+
|
|
230
|
+
const timeback = useTimeback()
|
|
231
|
+
let activity
|
|
232
|
+
|
|
233
|
+
onMounted(() => {
|
|
234
|
+
if (timeback.value) {
|
|
235
|
+
activity = timeback.value.activity
|
|
236
|
+
.new({ id: 'lesson-1', name: 'Intro', courseCode: 'MATH-101' })
|
|
237
|
+
.start()
|
|
238
|
+
}
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
onUnmounted(() => activity?.end())
|
|
242
|
+
</script>
|
|
243
|
+
|
|
244
|
+
<template>
|
|
245
|
+
<SignInButton size="lg" />
|
|
246
|
+
</template>
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Svelte
|
|
250
|
+
|
|
251
|
+
```svelte
|
|
252
|
+
<!-- +layout.svelte -->
|
|
253
|
+
<script>
|
|
254
|
+
import { initTimeback } from 'timeback/svelte'
|
|
255
|
+
|
|
256
|
+
initTimeback()
|
|
257
|
+
|
|
258
|
+
let { children } = $props()
|
|
259
|
+
</script>
|
|
260
|
+
|
|
261
|
+
{@render children()}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
```svelte
|
|
265
|
+
<!-- +page.svelte -->
|
|
266
|
+
<script>
|
|
267
|
+
import { onMount, onDestroy } from 'svelte'
|
|
268
|
+
import { SignInButton, timeback } from 'timeback/svelte'
|
|
269
|
+
|
|
270
|
+
let activity
|
|
271
|
+
|
|
272
|
+
onMount(() => {
|
|
273
|
+
if ($timeback) {
|
|
274
|
+
activity = $timeback.activity
|
|
275
|
+
.new({ id: 'lesson-1', name: 'Intro', courseCode: 'MATH-101' })
|
|
276
|
+
.start()
|
|
277
|
+
}
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
onDestroy(() => activity?.end())
|
|
281
|
+
</script>
|
|
282
|
+
|
|
283
|
+
<SignInButton size="lg" />
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Solid
|
|
287
|
+
|
|
288
|
+
```tsx
|
|
289
|
+
// app.tsx
|
|
290
|
+
import { TimebackProvider } from 'timeback/solid'
|
|
291
|
+
|
|
292
|
+
export default function App() {
|
|
293
|
+
return (
|
|
294
|
+
<TimebackProvider>
|
|
295
|
+
<Router root={props => <Suspense>{props.children}</Suspense>}>
|
|
296
|
+
<FileRoutes />
|
|
297
|
+
</Router>
|
|
298
|
+
</TimebackProvider>
|
|
299
|
+
)
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
```tsx
|
|
304
|
+
// components/ActivityTracker.tsx
|
|
305
|
+
import { onCleanup, onMount } from 'solid-js'
|
|
306
|
+
import { SignInButton, useTimeback } from 'timeback/solid'
|
|
307
|
+
|
|
308
|
+
function MyComponent() {
|
|
309
|
+
const timeback = useTimeback()
|
|
310
|
+
let activity
|
|
311
|
+
|
|
312
|
+
onMount(() => {
|
|
313
|
+
if (!timeback) return
|
|
314
|
+
|
|
315
|
+
activity = timeback.activity
|
|
316
|
+
.new({ id: 'lesson-1', name: 'Intro', courseCode: 'MATH-101' })
|
|
317
|
+
.start()
|
|
318
|
+
})
|
|
319
|
+
|
|
320
|
+
onCleanup(() => activity?.end())
|
|
321
|
+
|
|
322
|
+
return <SignInButton size="lg" />
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## Identity Modes
|
|
327
|
+
|
|
328
|
+
### SSO Mode
|
|
329
|
+
|
|
330
|
+
Uses Timeback as the identity provider via OIDC:
|
|
331
|
+
|
|
332
|
+
```typescript
|
|
333
|
+
identity: {
|
|
334
|
+
mode: 'sso',
|
|
335
|
+
clientId: process.env.AWS_COGNITO_CLIENT_ID!,
|
|
336
|
+
clientSecret: process.env.AWS_COGNITO_CLIENT_SECRET!,
|
|
337
|
+
redirectUri: 'http://localhost:3000/api/auth/sso/callback/timeback',
|
|
338
|
+
onCallbackSuccess: ({ user, state, redirect }) => redirect('/'),
|
|
339
|
+
onCallbackError: ({ error, redirect }) => redirect('/?error=sso_failed'),
|
|
340
|
+
getUser: () => getCurrentSession(),
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Custom Mode
|
|
345
|
+
|
|
346
|
+
For apps with existing auth (Clerk, Auth0, Supabase, etc.):
|
|
347
|
+
|
|
348
|
+
```typescript
|
|
349
|
+
identity: {
|
|
350
|
+
mode: 'custom',
|
|
351
|
+
getUser: async (req) => {
|
|
352
|
+
const session = await getSession(req)
|
|
353
|
+
if (!session) return undefined
|
|
354
|
+
return { id: session.userId, email: session.email, name: session.name }
|
|
355
|
+
},
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
## Activity Tracking
|
|
360
|
+
|
|
361
|
+
Activities track time spent on learning content:
|
|
362
|
+
|
|
363
|
+
```typescript
|
|
364
|
+
// Start an activity
|
|
365
|
+
const activity = timeback.activity
|
|
366
|
+
.new({
|
|
367
|
+
id: 'lesson-123',
|
|
368
|
+
name: 'Introduction to Fractions',
|
|
369
|
+
courseCode: 'MATH-101',
|
|
370
|
+
})
|
|
371
|
+
.start()
|
|
372
|
+
|
|
373
|
+
// Pause/resume
|
|
374
|
+
activity.pause()
|
|
375
|
+
activity.resume()
|
|
376
|
+
|
|
377
|
+
// End with metrics
|
|
378
|
+
await activity.end({
|
|
379
|
+
totalQuestions: 10,
|
|
380
|
+
correctQuestions: 8,
|
|
381
|
+
xpEarned: 80,
|
|
382
|
+
masteredUnits: 1,
|
|
383
|
+
})
|
|
13
384
|
```
|
|
14
385
|
|
|
15
|
-
|
|
386
|
+
The SDK automatically sends activity data to your server, which forwards it to the Timeback API.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sign In with Timeback Button
|
|
3
|
+
*
|
|
4
|
+
* A pre-styled button for Timeback SSO authentication.
|
|
5
|
+
* Fully customizable via CSS variables.
|
|
6
|
+
*/
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
/**
|
|
9
|
+
* Props for SignInButton component.
|
|
10
|
+
*/
|
|
11
|
+
export interface SignInButtonProps {
|
|
12
|
+
/** Button text (default: "Sign in with Timeback") */
|
|
13
|
+
children?: React.ReactNode;
|
|
14
|
+
/** Additional CSS class names */
|
|
15
|
+
className?: string;
|
|
16
|
+
/** Inline styles */
|
|
17
|
+
style?: React.CSSProperties;
|
|
18
|
+
/** Disabled state */
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
/** Show loading spinner when clicked */
|
|
21
|
+
showLoading?: boolean;
|
|
22
|
+
/** Called before redirect (can prevent with e.preventDefault()) */
|
|
23
|
+
onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
24
|
+
/** Button variant */
|
|
25
|
+
variant?: 'default' | 'outline' | 'minimal';
|
|
26
|
+
/** Button size */
|
|
27
|
+
size?: 'sm' | 'md' | 'lg';
|
|
28
|
+
/** Show Timeback logo */
|
|
29
|
+
showLogo?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Sign In with Timeback button component.
|
|
33
|
+
*
|
|
34
|
+
* Triggers SSO authentication flow when clicked.
|
|
35
|
+
*
|
|
36
|
+
* @param props - Component props
|
|
37
|
+
* @returns Button element
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```tsx
|
|
41
|
+
* // Basic usage
|
|
42
|
+
* <SignInButton />
|
|
43
|
+
*
|
|
44
|
+
* // Custom text
|
|
45
|
+
* <SignInButton>Continue with Timeback</SignInButton>
|
|
46
|
+
*
|
|
47
|
+
* // Outline variant
|
|
48
|
+
* <SignInButton variant="outline" />
|
|
49
|
+
*
|
|
50
|
+
* // Custom styling via CSS variables
|
|
51
|
+
* <SignInButton
|
|
52
|
+
* style={{
|
|
53
|
+
* '--tb-btn-bg': '#6366f1',
|
|
54
|
+
* '--tb-btn-bg-hover': '#4f46e5',
|
|
55
|
+
* } as React.CSSProperties}
|
|
56
|
+
* />
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function SignInButton(props: SignInButtonProps): React.ReactElement;
|
|
60
|
+
//# sourceMappingURL=SignInButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignInButton.d.ts","sourceRoot":"","sources":["../../../../src/client/adapters/react/SignInButton.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,qDAAqD;IACrD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,wCAAwC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,mEAAmE;IACnE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAA;IAC1D,qBAAqB;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;IAC3C,kBAAkB;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IACzB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;CAClB;AA8MD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,CA4DzE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Client Module
|
|
3
|
+
*
|
|
4
|
+
* React-specific exports for Timeback SDK.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* import { TimebackProvider, useTimeback, SignInButton } from 'timeback/react'
|
|
9
|
+
*
|
|
10
|
+
* function App() {
|
|
11
|
+
* return (
|
|
12
|
+
* <TimebackProvider>
|
|
13
|
+
* <MyComponent />
|
|
14
|
+
* </TimebackProvider>
|
|
15
|
+
* )
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* function MyComponent() {
|
|
19
|
+
* const timeback = useTimeback()
|
|
20
|
+
*
|
|
21
|
+
* const handleSignIn = () => timeback?.auth.signIn()
|
|
22
|
+
*
|
|
23
|
+
* const handleFetchProfile = async () => {
|
|
24
|
+
* const profile = await timeback?.user.fetch()
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* const handleStartActivity = () => {
|
|
28
|
+
* const activity = timeback?.activity.new({ id: 'lesson-1', name: 'Intro', courseCode: 'MATH' })
|
|
29
|
+
* activity?.start()
|
|
30
|
+
* }
|
|
31
|
+
*
|
|
32
|
+
* return <SignInButton />
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export { createClient } from '../../timeback-client';
|
|
37
|
+
export { TimebackClient } from '../../timeback-client.class';
|
|
38
|
+
export { Activity } from '../../lib/activity';
|
|
39
|
+
export { TimebackProvider, useTimeback } from './provider';
|
|
40
|
+
export { SignInButton } from './SignInButton';
|
|
41
|
+
export type { SignInButtonProps } from './SignInButton';
|
|
42
|
+
export type { TimebackUser, ActivityParams, ActivityMetrics } from '../../../shared/types';
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/adapters/react/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAG5D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAG7C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAGvD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA"}
|