@protobase/ui 0.62.1 → 0.62.2

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 (60) hide show
  1. package/dist/app/app.js +6 -1
  2. package/dist/app/current-address.d.ts +1 -0
  3. package/dist/app/current-address.js +2 -1
  4. package/dist/calls/call-check.js +78 -0
  5. package/dist/calls/call-controls.js +50 -0
  6. package/dist/calls/call-layout.js +31 -0
  7. package/dist/calls/call-mark.d.ts +13 -0
  8. package/dist/calls/call-mark.js +57 -0
  9. package/dist/calls/call-message.js +25 -0
  10. package/dist/calls/call-people.js +46 -0
  11. package/dist/calls/call-rings.js +78 -0
  12. package/dist/calls/call-stage.js +111 -0
  13. package/dist/calls/call-tile.js +60 -0
  14. package/dist/calls/call-view.d.ts +20 -0
  15. package/dist/calls/call-view.js +88 -0
  16. package/dist/calls/devices.js +55 -0
  17. package/dist/calls/messages.js +76 -0
  18. package/dist/calls/record-call.d.ts +12 -0
  19. package/dist/calls/record-call.js +18 -0
  20. package/dist/calls/ring-tone.js +35 -0
  21. package/dist/calls/ringing.js +16 -0
  22. package/dist/calls/track-media.js +36 -0
  23. package/dist/calls/use-audio-levels.js +43 -0
  24. package/dist/calls/use-call-session.js +157 -0
  25. package/dist/calls/use-record-call-address.d.ts +17 -0
  26. package/dist/calls/use-record-call-address.js +30 -0
  27. package/dist/calls/use-record-calls.d.ts +172 -0
  28. package/dist/calls/use-record-calls.js +43 -0
  29. package/dist/calls/use-rings.js +52 -0
  30. package/dist/calls/use-width.js +18 -0
  31. package/dist/data/api-provider.d.ts +8 -0
  32. package/dist/data/meta-data.d.ts +2 -0
  33. package/dist/data/query-keys.js +8 -0
  34. package/dist/data/use-meta.js +1 -0
  35. package/dist/index.d.ts +6 -1
  36. package/dist/index.js +6 -1
  37. package/dist/package.js +1 -1
  38. package/dist/primitives/route-link.d.ts +13 -1
  39. package/dist/shell/assets/app-i5V50MJx.js +9 -0
  40. package/dist/shell/assets/calls-DwVdIhNM.js +2 -0
  41. package/dist/shell/assets/index-BgcF_WZ0.css +2 -0
  42. package/dist/shell/assets/{index-CphPkbp2.js → index-jTcckwc-.js} +2 -2
  43. package/dist/shell/assets/{records-map-BVL8Bz3b.js → records-map-idUZ9NK2.js} +2 -2
  44. package/dist/shell/assets/shared-protobase-ui-55TVcKm3.js +2 -0
  45. package/dist/shell/index.html +4 -4
  46. package/dist/shell/protobase.shell.json +2 -2
  47. package/dist/shell/protobase.sw.js +2 -2
  48. package/dist/shell-source-maps/assets/app-i5V50MJx.js.map +1 -0
  49. package/dist/shell-source-maps/assets/calls-DwVdIhNM.js.map +1 -0
  50. package/dist/shell-source-maps/assets/{index-CphPkbp2.js.map → index-jTcckwc-.js.map} +1 -1
  51. package/dist/shell-source-maps/assets/{records-map-BVL8Bz3b.js.map → records-map-idUZ9NK2.js.map} +1 -1
  52. package/dist/shell-source-maps/assets/shared-protobase-ui-55TVcKm3.js.map +1 -0
  53. package/dist/toasts/toast-provider.js +3 -1
  54. package/dist/toasts/toast.js +6 -4
  55. package/package.json +4 -4
  56. package/dist/shell/assets/app-C-udyrvj.js +0 -9
  57. package/dist/shell/assets/index-Iii7afo2.css +0 -2
  58. package/dist/shell/assets/shared-protobase-ui-CmaYdEFn.js +0 -2
  59. package/dist/shell-source-maps/assets/app-C-udyrvj.js.map +0 -1
  60. package/dist/shell-source-maps/assets/shared-protobase-ui-CmaYdEFn.js.map +0 -1
@@ -0,0 +1,172 @@
1
+ import { RecordCall } from "@protobase/client";
2
+ //#region src/calls/use-record-calls.d.ts
3
+ /**
4
+ * A record's latest calls, the one going on first, kept current over the record's channel, on the one socket the page
5
+ * shares for every channel it holds: the server sends the calls there whenever they change, so following a record's
6
+ * calls opens no connection of its own on a page that holds a channel already. Read again whenever the channel joins,
7
+ * as after a lost connection.
8
+ */
9
+ export declare const useRecordCalls: (resource: string, recordKey: string) => {
10
+ ongoing: RecordCall | undefined;
11
+ data: RecordCall[];
12
+ error: Error;
13
+ isError: true;
14
+ isPending: false;
15
+ isLoading: false;
16
+ isLoadingError: false;
17
+ isRefetchError: true;
18
+ isSuccess: false;
19
+ isPlaceholderData: false;
20
+ status: "error";
21
+ dataUpdatedAt: number;
22
+ errorUpdatedAt: number;
23
+ failureCount: number;
24
+ failureReason: Error | null;
25
+ errorUpdateCount: number;
26
+ isFetched: boolean;
27
+ isFetchedAfterMount: boolean;
28
+ isFetching: boolean;
29
+ isInitialLoading: boolean;
30
+ isPaused: boolean;
31
+ isRefetching: boolean;
32
+ isStale: boolean;
33
+ isEnabled: boolean;
34
+ refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<RecordCall[], Error>>;
35
+ fetchStatus: import("@tanstack/react-query").FetchStatus;
36
+ } | {
37
+ ongoing: RecordCall | undefined;
38
+ data: RecordCall[];
39
+ error: null;
40
+ isError: false;
41
+ isPending: false;
42
+ isLoading: false;
43
+ isLoadingError: false;
44
+ isRefetchError: false;
45
+ isSuccess: true;
46
+ isPlaceholderData: false;
47
+ status: "success";
48
+ dataUpdatedAt: number;
49
+ errorUpdatedAt: number;
50
+ failureCount: number;
51
+ failureReason: Error | null;
52
+ errorUpdateCount: number;
53
+ isFetched: boolean;
54
+ isFetchedAfterMount: boolean;
55
+ isFetching: boolean;
56
+ isInitialLoading: boolean;
57
+ isPaused: boolean;
58
+ isRefetching: boolean;
59
+ isStale: boolean;
60
+ isEnabled: boolean;
61
+ refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<RecordCall[], Error>>;
62
+ fetchStatus: import("@tanstack/react-query").FetchStatus;
63
+ } | {
64
+ ongoing: RecordCall | undefined;
65
+ data: undefined;
66
+ error: Error;
67
+ isError: true;
68
+ isPending: false;
69
+ isLoading: false;
70
+ isLoadingError: true;
71
+ isRefetchError: false;
72
+ isSuccess: false;
73
+ isPlaceholderData: false;
74
+ status: "error";
75
+ dataUpdatedAt: number;
76
+ errorUpdatedAt: number;
77
+ failureCount: number;
78
+ failureReason: Error | null;
79
+ errorUpdateCount: number;
80
+ isFetched: boolean;
81
+ isFetchedAfterMount: boolean;
82
+ isFetching: boolean;
83
+ isInitialLoading: boolean;
84
+ isPaused: boolean;
85
+ isRefetching: boolean;
86
+ isStale: boolean;
87
+ isEnabled: boolean;
88
+ refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<RecordCall[], Error>>;
89
+ fetchStatus: import("@tanstack/react-query").FetchStatus;
90
+ } | {
91
+ ongoing: RecordCall | undefined;
92
+ data: undefined;
93
+ error: null;
94
+ isError: false;
95
+ isPending: true;
96
+ isLoading: true;
97
+ isLoadingError: false;
98
+ isRefetchError: false;
99
+ isSuccess: false;
100
+ isPlaceholderData: false;
101
+ status: "pending";
102
+ dataUpdatedAt: number;
103
+ errorUpdatedAt: number;
104
+ failureCount: number;
105
+ failureReason: Error | null;
106
+ errorUpdateCount: number;
107
+ isFetched: boolean;
108
+ isFetchedAfterMount: boolean;
109
+ isFetching: boolean;
110
+ isInitialLoading: boolean;
111
+ isPaused: boolean;
112
+ isRefetching: boolean;
113
+ isStale: boolean;
114
+ isEnabled: boolean;
115
+ refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<RecordCall[], Error>>;
116
+ fetchStatus: import("@tanstack/react-query").FetchStatus;
117
+ } | {
118
+ ongoing: RecordCall | undefined;
119
+ data: undefined;
120
+ error: null;
121
+ isError: false;
122
+ isPending: true;
123
+ isLoadingError: false;
124
+ isRefetchError: false;
125
+ isSuccess: false;
126
+ isPlaceholderData: false;
127
+ status: "pending";
128
+ dataUpdatedAt: number;
129
+ errorUpdatedAt: number;
130
+ failureCount: number;
131
+ failureReason: Error | null;
132
+ errorUpdateCount: number;
133
+ isFetched: boolean;
134
+ isFetchedAfterMount: boolean;
135
+ isFetching: boolean;
136
+ isLoading: boolean;
137
+ isInitialLoading: boolean;
138
+ isPaused: boolean;
139
+ isRefetching: boolean;
140
+ isStale: boolean;
141
+ isEnabled: boolean;
142
+ refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<RecordCall[], Error>>;
143
+ fetchStatus: import("@tanstack/react-query").FetchStatus;
144
+ } | {
145
+ ongoing: RecordCall | undefined;
146
+ data: RecordCall[];
147
+ isError: false;
148
+ error: null;
149
+ isPending: false;
150
+ isLoading: false;
151
+ isLoadingError: false;
152
+ isRefetchError: false;
153
+ isSuccess: true;
154
+ isPlaceholderData: true;
155
+ status: "success";
156
+ dataUpdatedAt: number;
157
+ errorUpdatedAt: number;
158
+ failureCount: number;
159
+ failureReason: Error | null;
160
+ errorUpdateCount: number;
161
+ isFetched: boolean;
162
+ isFetchedAfterMount: boolean;
163
+ isFetching: boolean;
164
+ isInitialLoading: boolean;
165
+ isPaused: boolean;
166
+ isRefetching: boolean;
167
+ isStale: boolean;
168
+ isEnabled: boolean;
169
+ refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<RecordCall[], Error>>;
170
+ fetchStatus: import("@tanstack/react-query").FetchStatus;
171
+ };
172
+ //#endregion
@@ -0,0 +1,43 @@
1
+ import { keys } from "../data/query-keys.js";
2
+ import { useClient } from "../data/api-provider.js";
3
+ import { useEffect } from "react";
4
+ import { callsChannelEvent } from "@protobase/schema/internal";
5
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
6
+ //#region src/calls/use-record-calls.ts
7
+ /**
8
+ * A record's latest calls, the one going on first, kept current over the record's channel, on the one socket the page
9
+ * shares for every channel it holds: the server sends the calls there whenever they change, so following a record's
10
+ * calls opens no connection of its own on a page that holds a channel already. Read again whenever the channel joins,
11
+ * as after a lost connection.
12
+ */
13
+ const useRecordCalls = (resource, recordKey) => {
14
+ const client = useClient();
15
+ const queryClient = useQueryClient();
16
+ const key = keys.recordCalls(resource, recordKey);
17
+ const query = useQuery({
18
+ queryKey: key,
19
+ queryFn: () => client.calls(resource, recordKey)
20
+ });
21
+ useEffect(() => {
22
+ const queryKey = keys.recordCalls(resource, recordKey);
23
+ const channel = client.channel(resource, recordKey);
24
+ const offCalls = channel.on(callsChannelEvent, (message) => message.server && queryClient.setQueryData(queryKey, message.payload.items));
25
+ const offStatus = channel.onStatus((status) => status.state === "joined" && void queryClient.invalidateQueries({ queryKey }));
26
+ return () => {
27
+ offCalls();
28
+ offStatus();
29
+ channel.leave();
30
+ };
31
+ }, [
32
+ client,
33
+ queryClient,
34
+ resource,
35
+ recordKey
36
+ ]);
37
+ return {
38
+ ...query,
39
+ ongoing: query.data?.find((call) => call.ended_at === null)
40
+ };
41
+ };
42
+ //#endregion
43
+ export { useRecordCalls };
@@ -0,0 +1,52 @@
1
+ import { keys } from "../data/query-keys.js";
2
+ import { useClient } from "../data/api-provider.js";
3
+ import { ringingAt, ringsUntil } from "./ringing.js";
4
+ import { useCallback, useEffect, useState } from "react";
5
+ import { ringNotice } from "@protobase/schema/internal";
6
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
7
+ //#region src/calls/use-rings.ts
8
+ /**
9
+ * The calls ringing the signed-in user now, while `enabled`: read on load, and again whenever the live stream the page
10
+ * already holds says they changed, as when the user answers on another device, declines or the call ends; each stops
11
+ * by itself once its time is up. `decline` stops one on every page of theirs, `hide` only on this one.
12
+ */
13
+ const useRings = (enabled) => {
14
+ const client = useClient();
15
+ const queryClient = useQueryClient();
16
+ const query = useQuery({
17
+ queryKey: keys.rings,
18
+ queryFn: async () => ringsUntil(await client.rings.list(), Date.now()),
19
+ enabled
20
+ });
21
+ useEffect(() => {
22
+ if (!enabled) return;
23
+ const again = () => void queryClient.invalidateQueries({ queryKey: keys.rings });
24
+ return client.live({
25
+ onChanges: (changes) => changes.some((change) => change.resource === ringNotice) && again(),
26
+ onResync: again
27
+ });
28
+ }, [
29
+ client,
30
+ queryClient,
31
+ enabled
32
+ ]);
33
+ const [now, setNow] = useState(() => Date.now());
34
+ const { ringing, next } = ringingAt(query.data ?? [], Math.max(now, query.dataUpdatedAt));
35
+ useEffect(() => {
36
+ if (next === void 0) return;
37
+ const timer = setTimeout(() => setNow(Date.now()), Math.max(0, next - Date.now()));
38
+ return () => clearTimeout(timer);
39
+ }, [next]);
40
+ const hide = useCallback((call) => queryClient.setQueryData(keys.rings, (rings) => rings?.filter((ring) => ring.call !== call)), [queryClient]);
41
+ return {
42
+ ringing,
43
+ decline: useMutation({
44
+ mutationFn: (call) => client.rings.decline(call),
45
+ onMutate: hide,
46
+ onSettled: () => queryClient.invalidateQueries({ queryKey: keys.rings })
47
+ }).mutate,
48
+ hide
49
+ };
50
+ };
51
+ //#endregion
52
+ export { useRings };
@@ -0,0 +1,18 @@
1
+ import { useCallback, useState } from "react";
2
+ //#region src/calls/use-width.ts
3
+ /** The width of the element the returned ref is put on, followed as it changes; 0 until it is drawn. */
4
+ const useWidth = () => {
5
+ const [width, setWidth] = useState(0);
6
+ return {
7
+ ref: useCallback((element) => {
8
+ if (!element) return;
9
+ setWidth(element.clientWidth);
10
+ const observer = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));
11
+ observer.observe(element);
12
+ return () => observer.disconnect();
13
+ }, []),
14
+ width
15
+ };
16
+ };
17
+ //#endregion
18
+ export { useWidth };
@@ -79,6 +79,10 @@ export declare const useClient: () => {
79
79
  };
80
80
  calls: (resource: import("@protobase/client").ResourceRef, key: import("@protobase/schema").KeyValue | readonly import("@protobase/schema").KeyValue[]) => Promise<import("@protobase/client").RecordCall[]>;
81
81
  watchCalls: (resource: import("@protobase/client").ResourceRef, key: import("@protobase/schema").KeyValue | readonly import("@protobase/schema").KeyValue[], handlers: import("@protobase/client").RecordCallsHandlers) => () => void;
82
+ rings: {
83
+ list: () => Promise<import("@protobase/client").CallRing[]>;
84
+ decline: (call: string) => Promise<void>;
85
+ };
82
86
  };
83
87
  /**
84
88
  * The client of the API that serves `resource`: a source's for a resource the app draws from one, the app's own
@@ -160,6 +164,10 @@ export declare const useResourceClient: (resource: string) => {
160
164
  };
161
165
  calls: (resource: import("@protobase/client").ResourceRef, key: import("@protobase/schema").KeyValue | readonly import("@protobase/schema").KeyValue[]) => Promise<import("@protobase/client").RecordCall[]>;
162
166
  watchCalls: (resource: import("@protobase/client").ResourceRef, key: import("@protobase/schema").KeyValue | readonly import("@protobase/schema").KeyValue[], handlers: import("@protobase/client").RecordCallsHandlers) => () => void;
167
+ rings: {
168
+ list: () => Promise<import("@protobase/client").CallRing[]>;
169
+ decline: (call: string) => Promise<void>;
170
+ };
163
171
  };
164
172
  export type ApiProviderProps = {
165
173
  /** Defaults to `/api/v1` on the current origin. */
@@ -52,6 +52,8 @@ export type MetaData = {
52
52
  bell?: boolean;
53
53
  /** Whether people set their own status and see those they share an organization with (see `useStatuses`). */
54
54
  status?: boolean;
55
+ /** Whether the app has calls, which ring people on any page they have open (see `CallRings`). */
56
+ calls?: boolean;
55
57
  /** The language the app's screens are in for everyone, when it sets one (see `AppLocale`). */
56
58
  locale?: Locale;
57
59
  /** The hosts besides the app's own whose images are drawn with the page's referrer (see `FileImage`). */
@@ -172,6 +172,14 @@ const keys = {
172
172
  userId,
173
173
  "own"
174
174
  ],
175
+ /** The calls ringing the signed-in user (`useRings`). */
176
+ rings: ["call-rings"],
177
+ /** A record's calls, as its call mark shows them (`useRecordCalls`). */
178
+ recordCalls: (resource, key) => [
179
+ "record-calls",
180
+ resource,
181
+ key
182
+ ],
175
183
  /** A public form, as `/-/forms/<name>` draws it. */
176
184
  publicForm: (name) => ["public-form", name]
177
185
  };
@@ -46,6 +46,7 @@ const useMeta = () => {
46
46
  ...result.meta.maps && { maps: result.meta.maps },
47
47
  ...result.meta.notifications?.bell && { bell: true },
48
48
  ...result.meta.status && { status: true },
49
+ ...result.meta.calls && { calls: true },
49
50
  ...result.meta.locale && { locale: result.meta.locale },
50
51
  ...result.meta.files && { files: result.meta.files },
51
52
  ...result.meta.plugins && { plugins: result.meta.plugins },
package/dist/index.d.ts CHANGED
@@ -34,6 +34,11 @@ import { PushState } from "./notifications/push/web-push.js";
34
34
  import { SignedInUser, useSignedInUser } from "./auth/use-signed-in-user.js";
35
35
  import { Member, MembersResult, useMembers } from "./people/use-members.js";
36
36
  import { statusRefreshMs, useOwnStatus, useStatuses } from "./status/use-statuses.js";
37
+ import { CallView, CallViewProps } from "./calls/call-view.js";
38
+ import { RecordCall, RecordCallProps } from "./calls/record-call.js";
39
+ import { CallMark, CallMarkProps } from "./calls/call-mark.js";
40
+ import { useRecordCalls } from "./calls/use-record-calls.js";
41
+ import { useRecordCallAddress } from "./calls/use-record-call-address.js";
37
42
  import { usePushNotifications } from "./notifications/push/use-push-notifications.js";
38
43
  import { useInbox, useMarkNotificationsRead, useUnreadNotifications } from "./notifications/bell/use-inbox.js";
39
44
  import { SignInPrompt, SignInPromptProps } from "./auth/sign-in-prompt.js";
@@ -87,4 +92,4 @@ import { Section } from "./record-view/section.js";
87
92
  import { Form, FormProps } from "./app/create/form.js";
88
93
  import { RecordPicker, RecordPickerProps } from "./app/record-picker.js";
89
94
  import { Spinner } from "./primitives/spinner.js";
90
- export { ActionCard, type ActionCardProps, type ActionContext, type ActionHandler, ActionInputError, type ActionInputProps, ApiProvider, type ApiProviderProps, App, AppLink, type AppProps, AssistantDock, type AssistantDockProps, AuthLayout, type AuthLayoutProps, AvailabilityMark, type BackendData, type BackendRefresh, type BeforeSignInProps, type BoardDrop, type BoardDropContext, type BoardDropUndo, type BoardDropWrite, Button, type ButtonProps, type CardAction, type CardTone, Carousel, type CarouselImage, type CarouselProps, type ChatAuthor, ChatDivider, type ChatDividerProps, ChatMessage, type ChatMessageProps, ChatThread, type ChatThreadProps, type ChoiceOption, Choices, type ChoicesProps, CodeForm, type CodeFormProps, CompactTable, type CompactTableProps, Composer, type ComposerProps, type CurrentAddress, Dialog, type DialogProps, type DiffLine, DiffView, type DiffViewProps, type Drop, type DropRule, Field, FieldList, type FieldProps, type FieldWidget, type FieldWidgetEditorProps, type FieldWidgetProps, Form, type FormProps, Input, type InputProps, type LayoutRecord, type ListAddress, type ListChange, type ListDisplay, type ListDisplayRow, LogoMark, Markdown, type MarkdownContentProps as MarkdownProps, type MarksHook, type Member, type MembersResult, MentionBox, type MentionBoxProps, type MentionDraft, MentionedText, MenuSelect, type MenuSelectProps, type MetaData, OtpInput, type OtpInputProps, PartView, type PeopleSearch, type PickedUser, type PluginInfo, type Presence, type PresenceHook, type ProjectUi, type PushState, type RecordCardProps, RecordLink, type RecordMark, RecordPicker, type RecordPickerProps, ResendCodeButton, type ResendCodeButtonProps, ResponsiveDialog, type ResponsiveDialogProps, Section, Segmented, type SegmentedOption, type SegmentedProps, type ShellLogoProps, SidePanel, type SidePanelProps, SignInPrompt, type SignInPromptProps, type SignedInUser, Spinner, StatusMark, type StatusMarkProps, type Step, StepList, type StepState, Textarea, type TextareaProps, type TitleReader, type TitleRule, allowDelayMs, buttonClass, chatDayLabel, definePlugin, defineUi, diffStats, emptyDraft, isConflict, isFramed, mentionedIds, mergeUi, parseDiff, pluginApi, protobaseVersion, sameChatDay, statusRefreshMs, uiFromModule, useApiToken, useAppAddress, useArmedAfterFocus, useAssistant, useAssistantClient, useBackendData, useClient, useFacets, useFieldControl, useGuardedPress, useHistogram, useInbox, useLayoutRecord, useList, useListDisplay, useMarkNotificationsRead, useMembers, useMeta, useOwnStatus, usePlugin, usePresence, usePushNotifications, useRecord, useResourceClient, useSeries, useSignedInUser, useStatuses, useUnreadNotifications, useUpdateRecord };
95
+ export { ActionCard, type ActionCardProps, type ActionContext, type ActionHandler, ActionInputError, type ActionInputProps, ApiProvider, type ApiProviderProps, App, AppLink, type AppProps, AssistantDock, type AssistantDockProps, AuthLayout, type AuthLayoutProps, AvailabilityMark, type BackendData, type BackendRefresh, type BeforeSignInProps, type BoardDrop, type BoardDropContext, type BoardDropUndo, type BoardDropWrite, Button, type ButtonProps, CallMark, type CallMarkProps, CallView, type CallViewProps, type CardAction, type CardTone, Carousel, type CarouselImage, type CarouselProps, type ChatAuthor, ChatDivider, type ChatDividerProps, ChatMessage, type ChatMessageProps, ChatThread, type ChatThreadProps, type ChoiceOption, Choices, type ChoicesProps, CodeForm, type CodeFormProps, CompactTable, type CompactTableProps, Composer, type ComposerProps, type CurrentAddress, Dialog, type DialogProps, type DiffLine, DiffView, type DiffViewProps, type Drop, type DropRule, Field, FieldList, type FieldProps, type FieldWidget, type FieldWidgetEditorProps, type FieldWidgetProps, Form, type FormProps, Input, type InputProps, type LayoutRecord, type ListAddress, type ListChange, type ListDisplay, type ListDisplayRow, LogoMark, Markdown, type MarkdownContentProps as MarkdownProps, type MarksHook, type Member, type MembersResult, MentionBox, type MentionBoxProps, type MentionDraft, MentionedText, MenuSelect, type MenuSelectProps, type MetaData, OtpInput, type OtpInputProps, PartView, type PeopleSearch, type PickedUser, type PluginInfo, type Presence, type PresenceHook, type ProjectUi, type PushState, RecordCall, type RecordCallProps, type RecordCardProps, RecordLink, type RecordMark, RecordPicker, type RecordPickerProps, ResendCodeButton, type ResendCodeButtonProps, ResponsiveDialog, type ResponsiveDialogProps, Section, Segmented, type SegmentedOption, type SegmentedProps, type ShellLogoProps, SidePanel, type SidePanelProps, SignInPrompt, type SignInPromptProps, type SignedInUser, Spinner, StatusMark, type StatusMarkProps, type Step, StepList, type StepState, Textarea, type TextareaProps, type TitleReader, type TitleRule, allowDelayMs, buttonClass, chatDayLabel, definePlugin, defineUi, diffStats, emptyDraft, isConflict, isFramed, mentionedIds, mergeUi, parseDiff, pluginApi, protobaseVersion, sameChatDay, statusRefreshMs, uiFromModule, useApiToken, useAppAddress, useArmedAfterFocus, useAssistant, useAssistantClient, useBackendData, useClient, useFacets, useFieldControl, useGuardedPress, useHistogram, useInbox, useLayoutRecord, useList, useListDisplay, useMarkNotificationsRead, useMembers, useMeta, useOwnStatus, usePlugin, usePresence, usePushNotifications, useRecord, useRecordCallAddress, useRecordCalls, useResourceClient, useSeries, useSignedInUser, useStatuses, useUnreadNotifications, useUpdateRecord };
package/dist/index.js CHANGED
@@ -63,7 +63,12 @@ import { isConflict, useUpdateRecord } from "./data/use-update-record.js";
63
63
  import { App } from "./app/app.js";
64
64
  import { RecordLink } from "./app/displays/record-link.js";
65
65
  import { useSignedInUser } from "./auth/use-signed-in-user.js";
66
+ import { CallView } from "./calls/call-view.js";
67
+ import { useRecordCallAddress } from "./calls/use-record-call-address.js";
68
+ import { RecordCall } from "./calls/record-call.js";
69
+ import { useRecordCalls } from "./calls/use-record-calls.js";
70
+ import { CallMark } from "./calls/call-mark.js";
66
71
  import { Carousel } from "./carousel/carousel.js";
67
72
  import { Choices } from "./primitives/choices.js";
68
73
  import { RecordPicker } from "./app/record-picker.js";
69
- export { ActionCard, ActionInputError, ApiProvider, App, AppLink, AssistantDock, AuthLayout, AvailabilityMark, Button, Carousel, ChatDivider, ChatMessage, ChatThread, Choices, CodeForm, CompactTable, Composer, Dialog, DiffView, Field, FieldList, Form, Input, LogoMark, Markdown, MentionBox, MentionedText, MenuSelect, OtpInput, PartView, RecordLink, RecordPicker, ResendCodeButton, ResponsiveDialog, Section, Segmented, SidePanel, SignInPrompt, Spinner, StatusMark, StepList, Textarea, allowDelayMs, buttonClass, chatDayLabel, definePlugin, defineUi, diffStats, emptyDraft, isConflict, isFramed, mentionedIds, mergeUi, parseDiff, pluginApi, protobaseVersion, sameChatDay, statusRefreshMs, uiFromModule, useApiToken, useAppAddress, useArmedAfterFocus, useAssistant, useAssistantClient, useBackendData, useClient, useFacets, useFieldControl, useGuardedPress, useHistogram, useInbox, useLayoutRecord, useList, useListDisplay, useMarkNotificationsRead, useMembers, useMeta, useOwnStatus, usePlugin, usePresence, usePushNotifications, useRecord, useResourceClient, useSeries, useSignedInUser, useStatuses, useUnreadNotifications, useUpdateRecord };
74
+ export { ActionCard, ActionInputError, ApiProvider, App, AppLink, AssistantDock, AuthLayout, AvailabilityMark, Button, CallMark, CallView, Carousel, ChatDivider, ChatMessage, ChatThread, Choices, CodeForm, CompactTable, Composer, Dialog, DiffView, Field, FieldList, Form, Input, LogoMark, Markdown, MentionBox, MentionedText, MenuSelect, OtpInput, PartView, RecordCall, RecordLink, RecordPicker, ResendCodeButton, ResponsiveDialog, Section, Segmented, SidePanel, SignInPrompt, Spinner, StatusMark, StepList, Textarea, allowDelayMs, buttonClass, chatDayLabel, definePlugin, defineUi, diffStats, emptyDraft, isConflict, isFramed, mentionedIds, mergeUi, parseDiff, pluginApi, protobaseVersion, sameChatDay, statusRefreshMs, uiFromModule, useApiToken, useAppAddress, useArmedAfterFocus, useAssistant, useAssistantClient, useBackendData, useClient, useFacets, useFieldControl, useGuardedPress, useHistogram, useInbox, useLayoutRecord, useList, useListDisplay, useMarkNotificationsRead, useMembers, useMeta, useOwnStatus, usePlugin, usePresence, usePushNotifications, useRecord, useRecordCallAddress, useRecordCalls, useResourceClient, useSeries, useSignedInUser, useStatuses, useUnreadNotifications, useUpdateRecord };
package/dist/package.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "0.62.1";
2
+ var version = "0.62.2";
3
3
  var protobase = { "pluginApi": 1 };
4
4
  //#endregion
5
5
  export { protobase, version };
@@ -1 +1,13 @@
1
- import { AnchorHTMLAttributes } from "react";
1
+ import { AnchorHTMLAttributes } from "react";
2
+ //#region src/primitives/route-link.d.ts
3
+ /**
4
+ * Where a link goes: the `href` the browser shows and opens, and how the app follows it in place. One without
5
+ * `onFollow`, a page outside the app, the browser follows itself, in a new tab without the app's window or address
6
+ * with `newTab`.
7
+ */
8
+ export type RouteTarget = {
9
+ href: string;
10
+ onFollow?: () => void;
11
+ newTab?: boolean;
12
+ };
13
+ //#endregion