@freeappstore/sdk 0.12.0 → 0.13.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.
Files changed (59) hide show
  1. package/README.md +5 -1
  2. package/dist/email.d.ts.map +1 -1
  3. package/dist/email.js.map +1 -1
  4. package/dist/friends.d.ts +57 -0
  5. package/dist/friends.d.ts.map +1 -0
  6. package/dist/friends.js +133 -0
  7. package/dist/friends.js.map +1 -0
  8. package/dist/hooks.d.ts +18 -0
  9. package/dist/hooks.d.ts.map +1 -1
  10. package/dist/hooks.js +28 -1
  11. package/dist/hooks.js.map +1 -1
  12. package/dist/index.d.ts +9 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +7 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/keys.d.ts.map +1 -1
  17. package/dist/keys.js.map +1 -1
  18. package/dist/logger.d.ts.map +1 -1
  19. package/dist/logger.js +17 -7
  20. package/dist/logger.js.map +1 -1
  21. package/dist/roles.d.ts.map +1 -1
  22. package/dist/roles.js +6 -2
  23. package/dist/roles.js.map +1 -1
  24. package/dist/rooms.d.ts +9 -1
  25. package/dist/rooms.d.ts.map +1 -1
  26. package/dist/rooms.js +39 -13
  27. package/dist/rooms.js.map +1 -1
  28. package/dist/ui/components.d.ts +28 -4
  29. package/dist/ui/components.d.ts.map +1 -1
  30. package/dist/ui/components.js +338 -32
  31. package/dist/ui/components.js.map +1 -1
  32. package/dist/ui/core.d.ts.map +1 -1
  33. package/dist/ui/core.js +1 -1
  34. package/dist/ui/core.js.map +1 -1
  35. package/dist/ui/friends.d.ts +19 -0
  36. package/dist/ui/friends.d.ts.map +1 -0
  37. package/dist/ui/friends.js +191 -0
  38. package/dist/ui/friends.js.map +1 -0
  39. package/dist/ui/index.d.ts +9 -5
  40. package/dist/ui/index.d.ts.map +1 -1
  41. package/dist/ui/index.js +5 -3
  42. package/dist/ui/index.js.map +1 -1
  43. package/dist/ui/layout.d.ts +2 -2
  44. package/dist/ui/layout.d.ts.map +1 -1
  45. package/dist/ui/layout.js +96 -23
  46. package/dist/ui/layout.js.map +1 -1
  47. package/dist/ui/voice.d.ts +22 -0
  48. package/dist/ui/voice.d.ts.map +1 -0
  49. package/dist/ui/voice.js +64 -0
  50. package/dist/ui/voice.js.map +1 -0
  51. package/dist/voice.d.ts +10 -0
  52. package/dist/voice.d.ts.map +1 -0
  53. package/dist/voice.js +97 -0
  54. package/dist/voice.js.map +1 -0
  55. package/dist/webhooks.d.ts +42 -0
  56. package/dist/webhooks.d.ts.map +1 -0
  57. package/dist/webhooks.js +58 -0
  58. package/dist/webhooks.js.map +1 -0
  59. package/package.json +1 -1
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import {} from 'react';
3
+ /** Microphone toggle button. Shows red when listening. Hidden when unsupported. */
4
+ export function VoiceButton({ voice, disabled = false, size = 32 }) {
5
+ if (!voice.isSupported)
6
+ return null;
7
+ const iconSize = Math.round(size * 0.5);
8
+ return (_jsx("button", { type: "button", onClick: voice.toggle, disabled: disabled, title: voice.isListening ? 'Stop listening' : 'Voice input', style: {
9
+ width: size,
10
+ height: size,
11
+ borderRadius: '50%',
12
+ border: 'none',
13
+ display: 'flex',
14
+ alignItems: 'center',
15
+ justifyContent: 'center',
16
+ cursor: disabled ? 'default' : 'pointer',
17
+ opacity: disabled ? 0.4 : 1,
18
+ background: voice.isListening ? '#fecaca' : 'var(--surface, #f8fafc)',
19
+ color: voice.isListening ? '#dc2626' : 'var(--muted, #64748b)',
20
+ fontFamily: 'inherit',
21
+ flexShrink: 0,
22
+ }, children: voice.isListening ? (_jsx(StopIcon, { size: iconSize })) : (_jsx(MicIcon, { size: iconSize })) }));
23
+ }
24
+ function MicIcon({ size }) {
25
+ return (_jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "9", y: "1", width: "6", height: "12", rx: "3" }), _jsx("path", { d: "M5 10a7 7 0 0 0 14 0" }), _jsx("line", { x1: "12", y1: "17", x2: "12", y2: "21" }), _jsx("line", { x1: "8", y1: "21", x2: "16", y2: "21" })] }));
26
+ }
27
+ function StopIcon({ size }) {
28
+ return (_jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("rect", { x: "4", y: "4", width: "16", height: "16", rx: "2" }) }));
29
+ }
30
+ /** Textarea with integrated voice button. Shows interim transcript while listening. */
31
+ export function VoiceTextArea({ value, onChange, voice, placeholder = 'Type or speak...', disabled = false, rows = 3, onSubmit, style: extraStyle, }) {
32
+ // Show interim transcript appended to real value, but never write it
33
+ // back via onChange — that would double-insert when onResult fires.
34
+ const displayValue = voice.isListening && voice.transcript
35
+ ? value + (value ? ' ' : '') + voice.transcript
36
+ : value;
37
+ const displayPlaceholder = voice.isListening ? 'Listening...' : placeholder;
38
+ return (_jsxs("div", { style: { position: 'relative', ...extraStyle }, children: [_jsx("textarea", { value: displayValue, onChange: (e) => {
39
+ // While listening, ignore onChange — the displayed value includes
40
+ // interim transcript that shouldn't be committed to state.
41
+ if (!voice.isListening)
42
+ onChange(e.currentTarget.value);
43
+ }, placeholder: displayPlaceholder, disabled: disabled, readOnly: voice.isListening, rows: rows, onKeyDown: (e) => {
44
+ if (e.key === 'Enter' && !e.shiftKey && onSubmit) {
45
+ e.preventDefault();
46
+ onSubmit();
47
+ }
48
+ }, style: {
49
+ width: '100%',
50
+ padding: voice.isSupported ? '0.75rem 3rem 0.75rem 0.75rem' : '0.75rem',
51
+ borderRadius: 'var(--radius, 0.75rem)',
52
+ border: voice.isListening
53
+ ? '2px solid #dc2626'
54
+ : '1px solid var(--border, #e2e8f0)',
55
+ background: 'var(--surface, #ffffff)',
56
+ color: 'var(--ink, #1e293b)',
57
+ fontSize: '0.9rem',
58
+ fontFamily: 'inherit',
59
+ resize: 'vertical',
60
+ outline: 'none',
61
+ boxSizing: 'border-box',
62
+ } }), voice.isSupported && (_jsx("div", { style: { position: 'absolute', right: 8, bottom: 8 }, children: _jsx(VoiceButton, { voice: voice, disabled: disabled }) }))] }));
63
+ }
64
+ //# sourceMappingURL=voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.js","sourceRoot":"","sources":["../../src/ui/voice.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface UseVoiceInputReturn {
2
+ isListening: boolean;
3
+ isSupported: boolean;
4
+ transcript: string;
5
+ start: () => void;
6
+ stop: () => void;
7
+ toggle: () => void;
8
+ }
9
+ export declare function useVoiceInput(onResult?: (text: string) => void): UseVoiceInputReturn;
10
+ //# sourceMappingURL=voice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../src/voice.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAuBD,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,mBAAmB,CAiFpF"}
package/dist/voice.js ADDED
@@ -0,0 +1,97 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ function getSpeechRecognitionCtor() {
3
+ if (typeof window === 'undefined')
4
+ return null;
5
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
+ return window.SpeechRecognition || window.webkitSpeechRecognition || null;
7
+ }
8
+ /**
9
+ * Hook for browser-native speech-to-text via the Web Speech API.
10
+ * Returns a transcript that accumulates while listening. Call start/stop
11
+ * or toggle to control. Falls back gracefully — isSupported is false on
12
+ * browsers without SpeechRecognition (Firefox, some WebViews).
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const voice = useVoiceInput((text) => setMessage(prev => prev + ' ' + text))
17
+ * <button onClick={voice.toggle}>{voice.isListening ? 'Stop' : 'Mic'}</button>
18
+ * ```
19
+ */
20
+ // Evaluate once at module load — SpeechRecognition availability doesn't change at runtime.
21
+ const speechSupported = !!getSpeechRecognitionCtor();
22
+ export function useVoiceInput(onResult) {
23
+ const [isListening, setIsListening] = useState(false);
24
+ const [transcript, setTranscript] = useState('');
25
+ const recognitionRef = useRef(null);
26
+ const onResultRef = useRef(onResult);
27
+ onResultRef.current = onResult;
28
+ const isSupported = speechSupported;
29
+ useEffect(() => {
30
+ const Ctor = getSpeechRecognitionCtor();
31
+ if (!Ctor)
32
+ return;
33
+ const recognition = new Ctor();
34
+ recognition.continuous = true;
35
+ recognition.interimResults = true;
36
+ recognition.lang = 'en-US';
37
+ let finalTranscript = '';
38
+ recognition.onresult = (event) => {
39
+ let interim = '';
40
+ for (let i = event.resultIndex; i < event.results.length; i++) {
41
+ const result = event.results[i];
42
+ if (result.isFinal) {
43
+ finalTranscript += result[0].transcript;
44
+ }
45
+ else {
46
+ interim += result[0].transcript;
47
+ }
48
+ }
49
+ setTranscript(finalTranscript + interim);
50
+ };
51
+ recognition.onend = () => {
52
+ setIsListening(false);
53
+ if (finalTranscript.trim() && onResultRef.current) {
54
+ onResultRef.current(finalTranscript.trim());
55
+ }
56
+ finalTranscript = '';
57
+ setTranscript('');
58
+ };
59
+ recognition.onerror = (event) => {
60
+ if (event.error !== 'aborted' && event.error !== 'no-speech') {
61
+ console.warn('Speech recognition error:', event.error);
62
+ }
63
+ setIsListening(false);
64
+ };
65
+ recognitionRef.current = recognition;
66
+ return () => {
67
+ recognition.abort();
68
+ };
69
+ }, []);
70
+ const start = useCallback(() => {
71
+ if (!recognitionRef.current || isListening)
72
+ return;
73
+ setTranscript('');
74
+ try {
75
+ recognitionRef.current.start();
76
+ setIsListening(true);
77
+ }
78
+ catch {
79
+ // Already started
80
+ }
81
+ }, [isListening]);
82
+ const stop = useCallback(() => {
83
+ if (!recognitionRef.current || !isListening)
84
+ return;
85
+ recognitionRef.current.stop();
86
+ }, [isListening]);
87
+ const toggle = useCallback(() => {
88
+ if (isListening) {
89
+ stop();
90
+ }
91
+ else {
92
+ start();
93
+ }
94
+ }, [isListening, start, stop]);
95
+ return { isListening, isSupported, transcript, start, stop, toggle };
96
+ }
97
+ //# sourceMappingURL=voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.js","sourceRoot":"","sources":["../src/voice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { Auth } from './auth.js';
2
+ /**
3
+ * Outbound webhook management. Devs register URLs to receive HTTP POST
4
+ * when events fire (user.first_visit, kv.changed, collection.created, etc.).
5
+ *
6
+ * The platform signs each delivery with HMAC-SHA256 using a per-webhook
7
+ * secret (returned at registration time). Receivers verify the signature
8
+ * via the X-FAS-Signature header.
9
+ */
10
+ export interface Webhook {
11
+ id: string;
12
+ event: string;
13
+ url: string;
14
+ active: number;
15
+ created_at: number;
16
+ }
17
+ export interface WebhookTestResult {
18
+ status: number;
19
+ body: string;
20
+ }
21
+ export declare class Webhooks {
22
+ private readonly appId;
23
+ private readonly apiBase;
24
+ private readonly auth;
25
+ constructor(appId: string, apiBase: string, auth: Auth);
26
+ private headers;
27
+ /** List all webhooks for this app + supported events. */
28
+ list(): Promise<{
29
+ webhooks: Webhook[];
30
+ supported_events: string[];
31
+ }>;
32
+ /** Register a new webhook. Returns the webhook ID and signing secret. */
33
+ create(event: string, url: string): Promise<{
34
+ id: string;
35
+ secret: string;
36
+ }>;
37
+ /** Delete a webhook by ID. */
38
+ delete(id: string): Promise<void>;
39
+ /** Send a test event to a webhook. Returns the HTTP status and response body. */
40
+ test(id: string): Promise<WebhookTestResult>;
41
+ }
42
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;GAOG;AAEH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,QAAQ;IAEjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAG7B,OAAO,CAAC,OAAO;IAMf,yDAAyD;IACnD,IAAI,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAQ1E,yEAAyE;IACnE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAajF,8BAA8B;IACxB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvC,iFAAiF;IAC3E,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAQnD"}
@@ -0,0 +1,58 @@
1
+ export class Webhooks {
2
+ appId;
3
+ apiBase;
4
+ auth;
5
+ constructor(appId, apiBase, auth) {
6
+ this.appId = appId;
7
+ this.apiBase = apiBase;
8
+ this.auth = auth;
9
+ }
10
+ headers() {
11
+ const h = { 'Content-Type': 'application/json' };
12
+ if (this.auth.token)
13
+ h.Authorization = `Bearer ${this.auth.token}`;
14
+ return h;
15
+ }
16
+ /** List all webhooks for this app + supported events. */
17
+ async list() {
18
+ const res = await fetch(`${this.apiBase}/v1/apps/${this.appId}/webhooks`, {
19
+ headers: this.headers(),
20
+ });
21
+ if (!res.ok)
22
+ throw new Error(`webhooks.list failed: ${res.status}`);
23
+ return res.json();
24
+ }
25
+ /** Register a new webhook. Returns the webhook ID and signing secret. */
26
+ async create(event, url) {
27
+ const res = await fetch(`${this.apiBase}/v1/apps/${this.appId}/webhooks`, {
28
+ method: 'POST',
29
+ headers: this.headers(),
30
+ body: JSON.stringify({ event, url }),
31
+ });
32
+ if (!res.ok) {
33
+ const data = (await res.json().catch(() => ({})));
34
+ throw new Error(`webhooks.create failed: ${data.error ?? res.statusText}`);
35
+ }
36
+ return res.json();
37
+ }
38
+ /** Delete a webhook by ID. */
39
+ async delete(id) {
40
+ const res = await fetch(`${this.apiBase}/v1/apps/${this.appId}/webhooks/${id}`, {
41
+ method: 'DELETE',
42
+ headers: this.headers(),
43
+ });
44
+ if (!res.ok)
45
+ throw new Error(`webhooks.delete failed: ${res.status}`);
46
+ }
47
+ /** Send a test event to a webhook. Returns the HTTP status and response body. */
48
+ async test(id) {
49
+ const res = await fetch(`${this.apiBase}/v1/apps/${this.appId}/webhooks/${id}/test`, {
50
+ method: 'POST',
51
+ headers: this.headers(),
52
+ });
53
+ if (!res.ok)
54
+ throw new Error(`webhooks.test failed: ${res.status}`);
55
+ return res.json();
56
+ }
57
+ }
58
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"AAwBA,MAAM,OAAO,QAAQ;IAEA;IACA;IACA;IAHnB,YACmB,KAAa,EACb,OAAe,EACf,IAAU;QAFV,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAM;IAC1B,CAAC;IAEI,OAAO;QACb,MAAM,CAAC,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QACzE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,CAAC,CAAC,aAAa,GAAG,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACnE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,IAAI,CAAC,KAAK,WAAW,EAAE;YACxE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC,IAAI,EAAkE,CAAC;IACpF,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,GAAW;QACrC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,IAAI,CAAC,KAAK,WAAW,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;YACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;SACrC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAuB,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAA6C,CAAC;IAC/D,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,IAAI,CAAC,KAAK,aAAa,EAAE,EAAE,EAAE;YAC9E,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,IAAI,CAAC,EAAU;QACnB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,IAAI,CAAC,KAAK,aAAa,EAAE,OAAO,EAAE;YACnF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC,IAAI,EAAgC,CAAC;IAClD,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freeappstore/sdk",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "Browser SDK for apps on freeappstore.online — auth, per-user KV, shared counters, document collections, real-time rooms, API proxy, user API key vault, RBAC roles, React hooks, and 18 UI components.",
5
5
  "license": "MIT",
6
6
  "type": "module",