@assistant-ui/react 0.7.45 → 0.7.47
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/dist/api/AssistantRuntime.d.ts +1 -0
- package/dist/api/AssistantRuntime.d.ts.map +1 -1
- package/dist/api/AssistantRuntime.js +5 -0
- package/dist/api/AssistantRuntime.js.map +1 -1
- package/dist/api/AssistantRuntime.mjs +5 -0
- package/dist/api/AssistantRuntime.mjs.map +1 -1
- package/dist/api/AttachmentRuntime.d.ts +1 -0
- package/dist/api/AttachmentRuntime.d.ts.map +1 -1
- package/dist/api/AttachmentRuntime.js +5 -0
- package/dist/api/AttachmentRuntime.js.map +1 -1
- package/dist/api/AttachmentRuntime.mjs +5 -0
- package/dist/api/AttachmentRuntime.mjs.map +1 -1
- package/dist/api/ComposerRuntime.d.ts +2 -0
- package/dist/api/ComposerRuntime.d.ts.map +1 -1
- package/dist/api/ComposerRuntime.js +19 -0
- package/dist/api/ComposerRuntime.js.map +1 -1
- package/dist/api/ComposerRuntime.mjs +19 -0
- package/dist/api/ComposerRuntime.mjs.map +1 -1
- package/dist/api/ContentPartRuntime.d.ts +1 -0
- package/dist/api/ContentPartRuntime.d.ts.map +1 -1
- package/dist/api/ContentPartRuntime.js +5 -0
- package/dist/api/ContentPartRuntime.js.map +1 -1
- package/dist/api/ContentPartRuntime.mjs +5 -0
- package/dist/api/ContentPartRuntime.mjs.map +1 -1
- package/dist/api/MessageRuntime.d.ts +1 -0
- package/dist/api/MessageRuntime.d.ts.map +1 -1
- package/dist/api/MessageRuntime.js +13 -0
- package/dist/api/MessageRuntime.js.map +1 -1
- package/dist/api/MessageRuntime.mjs +13 -0
- package/dist/api/MessageRuntime.mjs.map +1 -1
- package/dist/api/ThreadListItemRuntime.d.ts +1 -0
- package/dist/api/ThreadListItemRuntime.d.ts.map +1 -1
- package/dist/api/ThreadListItemRuntime.js +11 -0
- package/dist/api/ThreadListItemRuntime.js.map +1 -1
- package/dist/api/ThreadListItemRuntime.mjs +11 -0
- package/dist/api/ThreadListItemRuntime.mjs.map +1 -1
- package/dist/api/ThreadListRuntime.d.ts +1 -0
- package/dist/api/ThreadListRuntime.d.ts.map +1 -1
- package/dist/api/ThreadListRuntime.js +10 -0
- package/dist/api/ThreadListRuntime.js.map +1 -1
- package/dist/api/ThreadListRuntime.mjs +10 -0
- package/dist/api/ThreadListRuntime.mjs.map +1 -1
- package/dist/api/ThreadRuntime.d.ts +1 -1
- package/dist/api/ThreadRuntime.d.ts.map +1 -1
- package/dist/api/ThreadRuntime.js +14 -3
- package/dist/api/ThreadRuntime.js.map +1 -1
- package/dist/api/ThreadRuntime.mjs +14 -3
- package/dist/api/ThreadRuntime.mjs.map +1 -1
- package/dist/context/providers/AssistantRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/AssistantRuntimeProvider.js +5 -14
- package/dist/context/providers/AssistantRuntimeProvider.js.map +1 -1
- package/dist/context/providers/AssistantRuntimeProvider.mjs +5 -14
- package/dist/context/providers/AssistantRuntimeProvider.mjs.map +1 -1
- package/dist/context/providers/AttachmentRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/AttachmentRuntimeProvider.js +5 -16
- package/dist/context/providers/AttachmentRuntimeProvider.js.map +1 -1
- package/dist/context/providers/AttachmentRuntimeProvider.mjs +6 -21
- package/dist/context/providers/AttachmentRuntimeProvider.mjs.map +1 -1
- package/dist/context/providers/ContentPartRuntimeProvider.d.ts +0 -1
- package/dist/context/providers/ContentPartRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/ContentPartRuntimeProvider.js +5 -15
- package/dist/context/providers/ContentPartRuntimeProvider.js.map +1 -1
- package/dist/context/providers/ContentPartRuntimeProvider.mjs +4 -13
- package/dist/context/providers/ContentPartRuntimeProvider.mjs.map +1 -1
- package/dist/context/providers/MessageRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/MessageRuntimeProvider.js +3 -22
- package/dist/context/providers/MessageRuntimeProvider.js.map +1 -1
- package/dist/context/providers/MessageRuntimeProvider.mjs +3 -22
- package/dist/context/providers/MessageRuntimeProvider.mjs.map +1 -1
- package/dist/context/providers/TextContentPartProvider.d.ts.map +1 -1
- package/dist/context/providers/TextContentPartProvider.js +13 -12
- package/dist/context/providers/TextContentPartProvider.js.map +1 -1
- package/dist/context/providers/TextContentPartProvider.mjs +13 -12
- package/dist/context/providers/TextContentPartProvider.mjs.map +1 -1
- package/dist/context/providers/ThreadListItemRuntimeProvider.d.ts +0 -1
- package/dist/context/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/ThreadListItemRuntimeProvider.js +5 -15
- package/dist/context/providers/ThreadListItemRuntimeProvider.js.map +1 -1
- package/dist/context/providers/ThreadListItemRuntimeProvider.mjs +4 -13
- package/dist/context/providers/ThreadListItemRuntimeProvider.mjs.map +1 -1
- package/dist/context/providers/ThreadRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/ThreadRuntimeProvider.js +5 -24
- package/dist/context/providers/ThreadRuntimeProvider.js.map +1 -1
- package/dist/context/providers/ThreadRuntimeProvider.mjs +6 -25
- package/dist/context/providers/ThreadRuntimeProvider.mjs.map +1 -1
- package/dist/context/react/AssistantContext.d.ts +26 -17
- package/dist/context/react/AssistantContext.d.ts.map +1 -1
- package/dist/context/react/AssistantContext.js +3 -4
- package/dist/context/react/AssistantContext.js.map +1 -1
- package/dist/context/react/AssistantContext.mjs +3 -4
- package/dist/context/react/AssistantContext.mjs.map +1 -1
- package/dist/context/react/AttachmentContext.d.ts +558 -30
- package/dist/context/react/AttachmentContext.d.ts.map +1 -1
- package/dist/context/react/AttachmentContext.js +32 -52
- package/dist/context/react/AttachmentContext.js.map +1 -1
- package/dist/context/react/AttachmentContext.mjs +33 -52
- package/dist/context/react/AttachmentContext.mjs.map +1 -1
- package/dist/context/react/ComposerContext.d.ts +28 -19
- package/dist/context/react/ComposerContext.d.ts.map +1 -1
- package/dist/context/react/ComposerContext.js +2 -19
- package/dist/context/react/ComposerContext.js.map +1 -1
- package/dist/context/react/ComposerContext.mjs +4 -20
- package/dist/context/react/ComposerContext.mjs.map +1 -1
- package/dist/context/react/ContentPartContext.d.ts +22 -16
- package/dist/context/react/ContentPartContext.d.ts.map +1 -1
- package/dist/context/react/ContentPartContext.js +2 -7
- package/dist/context/react/ContentPartContext.js.map +1 -1
- package/dist/context/react/ContentPartContext.mjs +2 -6
- package/dist/context/react/ContentPartContext.mjs.map +1 -1
- package/dist/context/react/MessageContext.d.ts +49 -29
- package/dist/context/react/MessageContext.d.ts.map +1 -1
- package/dist/context/react/MessageContext.js +5 -9
- package/dist/context/react/MessageContext.js.map +1 -1
- package/dist/context/react/MessageContext.mjs +5 -8
- package/dist/context/react/MessageContext.mjs.map +1 -1
- package/dist/context/react/ThreadContext.d.ts +44 -24
- package/dist/context/react/ThreadContext.d.ts.map +1 -1
- package/dist/context/react/ThreadContext.js +5 -9
- package/dist/context/react/ThreadContext.js.map +1 -1
- package/dist/context/react/ThreadContext.mjs +5 -8
- package/dist/context/react/ThreadContext.mjs.map +1 -1
- package/dist/context/react/ThreadListItemContext.d.ts +22 -16
- package/dist/context/react/ThreadListItemContext.d.ts.map +1 -1
- package/dist/context/react/ThreadListItemContext.js +3 -6
- package/dist/context/react/ThreadListItemContext.js.map +1 -1
- package/dist/context/react/ThreadListItemContext.mjs +3 -5
- package/dist/context/react/ThreadListItemContext.mjs.map +1 -1
- package/dist/context/react/index.d.ts +1 -0
- package/dist/context/react/index.d.ts.map +1 -1
- package/dist/context/react/index.js +3 -0
- package/dist/context/react/index.js.map +1 -1
- package/dist/context/react/index.mjs +2 -0
- package/dist/context/react/index.mjs.map +1 -1
- package/dist/context/react/utils/createContextHook.d.ts +3 -8
- package/dist/context/react/utils/createContextHook.d.ts.map +1 -1
- package/dist/context/react/utils/createContextHook.js.map +1 -1
- package/dist/context/react/utils/createContextHook.mjs.map +1 -1
- package/dist/context/react/utils/createStateHookForRuntime.d.ts +31 -0
- package/dist/context/react/utils/createStateHookForRuntime.d.ts.map +1 -0
- package/dist/context/react/utils/createStateHookForRuntime.js +47 -0
- package/dist/context/react/utils/createStateHookForRuntime.js.map +1 -0
- package/dist/context/react/utils/createStateHookForRuntime.mjs +24 -0
- package/dist/context/react/utils/createStateHookForRuntime.mjs.map +1 -0
- package/dist/context/react/utils/ensureBinding.d.ts +2 -0
- package/dist/context/react/utils/ensureBinding.d.ts.map +1 -0
- package/dist/context/react/utils/ensureBinding.js +36 -0
- package/dist/context/react/utils/ensureBinding.js.map +1 -0
- package/dist/context/react/utils/ensureBinding.mjs +11 -0
- package/dist/context/react/utils/ensureBinding.mjs.map +1 -0
- package/dist/context/react/utils/useRuntimeState.d.ts +10 -0
- package/dist/context/react/utils/useRuntimeState.d.ts.map +1 -0
- package/dist/context/react/utils/useRuntimeState.js +48 -0
- package/dist/context/react/utils/useRuntimeState.js.map +1 -0
- package/dist/context/react/utils/useRuntimeState.mjs +22 -0
- package/dist/context/react/utils/useRuntimeState.mjs.map +1 -0
- package/dist/runtimes/adapters/attachment/AttachmentAdapter.d.ts +1 -1
- package/dist/runtimes/adapters/attachment/AttachmentAdapter.d.ts.map +1 -1
- package/dist/runtimes/adapters/attachment/AttachmentAdapter.js.map +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.d.ts +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.d.ts.map +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.js +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.js.map +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.mjs +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.mjs.map +1 -1
- package/dist/runtimes/adapters/thread-history/ThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/runtimes/adapters/thread-history/ThreadHistoryAdapter.js.map +1 -1
- package/dist/runtimes/composer/BaseComposerRuntimeCore.d.ts.map +1 -1
- package/dist/runtimes/composer/BaseComposerRuntimeCore.js +22 -2
- package/dist/runtimes/composer/BaseComposerRuntimeCore.js.map +1 -1
- package/dist/runtimes/composer/BaseComposerRuntimeCore.mjs +22 -2
- package/dist/runtimes/composer/BaseComposerRuntimeCore.mjs.map +1 -1
- package/dist/runtimes/local/useLocalRuntime.d.ts.map +1 -1
- package/dist/runtimes/local/useLocalRuntime.js +4 -0
- package/dist/runtimes/local/useLocalRuntime.js.map +1 -1
- package/dist/runtimes/local/useLocalRuntime.mjs +4 -0
- package/dist/runtimes/local/useLocalRuntime.mjs.map +1 -1
- package/dist/ui/thread-config.d.ts +1 -0
- package/dist/ui/thread-config.d.ts.map +1 -1
- package/dist/ui/thread-config.js.map +1 -1
- package/dist/ui/thread-config.mjs.map +1 -1
- package/dist/ui/thread.d.ts +2 -1
- package/dist/ui/thread.d.ts.map +1 -1
- package/dist/ui/thread.js +15 -2
- package/dist/ui/thread.js.map +1 -1
- package/dist/ui/thread.mjs +15 -2
- package/dist/ui/thread.mjs.map +1 -1
- package/package.json +2 -2
- package/src/api/AssistantRuntime.ts +7 -0
- package/src/api/AttachmentRuntime.ts +6 -0
- package/src/api/ComposerRuntime.ts +21 -0
- package/src/api/ContentPartRuntime.ts +6 -0
- package/src/api/MessageRuntime.ts +15 -0
- package/src/api/ThreadListItemRuntime.ts +12 -0
- package/src/api/ThreadListRuntime.ts +11 -0
- package/src/api/ThreadRuntime.ts +15 -4
- package/src/context/providers/AssistantRuntimeProvider.tsx +5 -17
- package/src/context/providers/AttachmentRuntimeProvider.tsx +6 -24
- package/src/context/providers/ContentPartRuntimeProvider.tsx +4 -14
- package/src/context/providers/MessageRuntimeProvider.tsx +5 -31
- package/src/context/providers/TextContentPartProvider.tsx +26 -22
- package/src/context/providers/ThreadListItemRuntimeProvider.tsx +3 -14
- package/src/context/providers/ThreadRuntimeProvider.tsx +7 -33
- package/src/context/react/AssistantContext.ts +7 -7
- package/src/context/react/AttachmentContext.ts +45 -136
- package/src/context/react/ComposerContext.ts +6 -29
- package/src/context/react/ContentPartContext.ts +3 -8
- package/src/context/react/MessageContext.ts +10 -13
- package/src/context/react/ThreadContext.ts +9 -12
- package/src/context/react/ThreadListItemContext.ts +4 -7
- package/src/context/react/index.ts +2 -0
- package/src/context/react/utils/createContextHook.ts +1 -3
- package/src/context/react/utils/createStateHookForRuntime.ts +80 -0
- package/src/context/react/utils/ensureBinding.ts +45 -0
- package/src/context/react/utils/useRuntimeState.ts +43 -0
- package/src/runtimes/adapters/attachment/AttachmentAdapter.ts +3 -1
- package/src/runtimes/adapters/attachment/CompositeAttachmentAdapter.ts +1 -1
- package/src/runtimes/adapters/thread-history/ThreadHistoryAdapter.ts +1 -0
- package/src/runtimes/composer/BaseComposerRuntimeCore.tsx +24 -2
- package/src/runtimes/local/useLocalRuntime.tsx +5 -0
- package/src/ui/thread-config.tsx +1 -0
- package/src/ui/thread.tsx +14 -3
|
@@ -1,124 +1,24 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { createContext
|
|
3
|
+
import { createContext } from "react";
|
|
4
4
|
import { ReadonlyStore } from "../ReadonlyStore";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
AttachmentRuntime,
|
|
8
|
-
AttachmentState,
|
|
9
|
-
} from "../../api/AttachmentRuntime";
|
|
5
|
+
import { AttachmentRuntime } from "../../api/AttachmentRuntime";
|
|
10
6
|
import { UseBoundStore } from "zustand";
|
|
7
|
+
import { createContextHook } from "./utils/createContextHook";
|
|
8
|
+
import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
|
|
11
9
|
|
|
12
10
|
export type AttachmentContextValue = {
|
|
13
|
-
source: "thread-composer" | "edit-composer" | "message";
|
|
14
|
-
useAttachment: UseBoundStore<ReadonlyStore<AttachmentState>>;
|
|
15
11
|
useAttachmentRuntime: UseBoundStore<ReadonlyStore<AttachmentRuntime>>;
|
|
16
12
|
};
|
|
17
13
|
|
|
18
|
-
type ThreadComposerAttachmentContextValue = {
|
|
19
|
-
source: "thread-composer";
|
|
20
|
-
useAttachment: UseBoundStore<
|
|
21
|
-
ReadonlyStore<AttachmentState & { source: "thread-composer" }>
|
|
22
|
-
>;
|
|
23
|
-
useAttachmentRuntime: UseBoundStore<
|
|
24
|
-
ReadonlyStore<AttachmentRuntime & { type: "thread-composer" }>
|
|
25
|
-
>;
|
|
26
|
-
};
|
|
27
|
-
type EditComposerAttachmentContextValue = {
|
|
28
|
-
source: "edit-composer";
|
|
29
|
-
useAttachment: UseBoundStore<
|
|
30
|
-
ReadonlyStore<AttachmentState & { source: "edit-composer" }>
|
|
31
|
-
>;
|
|
32
|
-
useAttachmentRuntime: UseBoundStore<
|
|
33
|
-
ReadonlyStore<AttachmentRuntime & { type: "edit-composer" }>
|
|
34
|
-
>;
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
type MessageAttachmentContextValue = {
|
|
38
|
-
source: "message";
|
|
39
|
-
useAttachment: UseBoundStore<
|
|
40
|
-
ReadonlyStore<AttachmentState & { source: "message" }>
|
|
41
|
-
>;
|
|
42
|
-
useAttachmentRuntime: UseBoundStore<
|
|
43
|
-
ReadonlyStore<AttachmentRuntime & { type: "message" }>
|
|
44
|
-
>;
|
|
45
|
-
};
|
|
46
|
-
|
|
47
14
|
export const AttachmentContext = createContext<AttachmentContextValue | null>(
|
|
48
15
|
null,
|
|
49
16
|
);
|
|
50
17
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
optional?: boolean | undefined;
|
|
56
|
-
}): AttachmentContextValue | null;
|
|
57
|
-
export function useAttachmentContext(options?: {
|
|
58
|
-
optional?: boolean | undefined;
|
|
59
|
-
}) {
|
|
60
|
-
const context = useContext(AttachmentContext);
|
|
61
|
-
if (!options?.optional && !context)
|
|
62
|
-
throw new Error(
|
|
63
|
-
"This component must be used within a ComposerPrimitive.Attachments or MessagePrimitive.Attachments component.",
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
return context;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function useThreadComposerAttachmentContext(options?: {
|
|
70
|
-
optional?: false | undefined;
|
|
71
|
-
}): ThreadComposerAttachmentContextValue;
|
|
72
|
-
function useThreadComposerAttachmentContext(options?: {
|
|
73
|
-
optional?: boolean | undefined;
|
|
74
|
-
}): ThreadComposerAttachmentContextValue | null;
|
|
75
|
-
function useThreadComposerAttachmentContext(options?: {
|
|
76
|
-
optional?: boolean | undefined;
|
|
77
|
-
}): ThreadComposerAttachmentContextValue | null {
|
|
78
|
-
const context = useAttachmentContext(options);
|
|
79
|
-
if (!context) return null;
|
|
80
|
-
if (context.source !== "thread-composer")
|
|
81
|
-
throw new Error(
|
|
82
|
-
"This component must be used within a thread's ComposerPrimitive.Attachments component.",
|
|
83
|
-
);
|
|
84
|
-
return context as ThreadComposerAttachmentContextValue;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function useEditComposerAttachmentContext(options?: {
|
|
88
|
-
optional?: false | undefined;
|
|
89
|
-
}): EditComposerAttachmentContextValue;
|
|
90
|
-
function useEditComposerAttachmentContext(options?: {
|
|
91
|
-
optional?: boolean | undefined;
|
|
92
|
-
}): EditComposerAttachmentContextValue | null;
|
|
93
|
-
function useEditComposerAttachmentContext(options?: {
|
|
94
|
-
optional?: boolean | undefined;
|
|
95
|
-
}): EditComposerAttachmentContextValue | null {
|
|
96
|
-
const context = useAttachmentContext(options);
|
|
97
|
-
if (!context) return null;
|
|
98
|
-
if (context.source !== "edit-composer")
|
|
99
|
-
throw new Error(
|
|
100
|
-
"This component must be used within a messages's ComposerPrimitive.Attachments component.",
|
|
101
|
-
);
|
|
102
|
-
return context as EditComposerAttachmentContextValue;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function useMessageAttachmentContext(options?: {
|
|
106
|
-
optional?: false | undefined;
|
|
107
|
-
}): MessageAttachmentContextValue;
|
|
108
|
-
function useMessageAttachmentContext(options?: {
|
|
109
|
-
optional?: boolean | undefined;
|
|
110
|
-
}): MessageAttachmentContextValue | null;
|
|
111
|
-
function useMessageAttachmentContext(options?: {
|
|
112
|
-
optional?: boolean | undefined;
|
|
113
|
-
}): MessageAttachmentContextValue | null {
|
|
114
|
-
const context = useAttachmentContext(options);
|
|
115
|
-
if (!context) return null;
|
|
116
|
-
if (context.source !== "message")
|
|
117
|
-
throw new Error(
|
|
118
|
-
"This component must be used within a MessagePrimitive.Attachments component.",
|
|
119
|
-
);
|
|
120
|
-
return context as MessageAttachmentContextValue;
|
|
121
|
-
}
|
|
18
|
+
const useAttachmentContext = createContextHook(
|
|
19
|
+
AttachmentContext,
|
|
20
|
+
"a ComposerPrimitive.Attachments or MessagePrimitive.Attachments component",
|
|
21
|
+
);
|
|
122
22
|
|
|
123
23
|
export function useAttachmentRuntime(options?: {
|
|
124
24
|
optional?: false | undefined;
|
|
@@ -136,58 +36,67 @@ export function useAttachmentRuntime(options?: {
|
|
|
136
36
|
|
|
137
37
|
export function useThreadComposerAttachmentRuntime(options?: {
|
|
138
38
|
optional?: false | undefined;
|
|
139
|
-
}): AttachmentRuntime
|
|
39
|
+
}): AttachmentRuntime<"thread-composer">;
|
|
140
40
|
export function useThreadComposerAttachmentRuntime(options?: {
|
|
141
41
|
optional?: boolean | undefined;
|
|
142
|
-
}): AttachmentRuntime | null;
|
|
42
|
+
}): AttachmentRuntime<"thread-composer"> | null;
|
|
143
43
|
export function useThreadComposerAttachmentRuntime(options?: {
|
|
144
44
|
optional?: boolean | undefined;
|
|
145
|
-
}): AttachmentRuntime | null {
|
|
146
|
-
const attachmentRuntime =
|
|
45
|
+
}): AttachmentRuntime<"thread-composer"> | null {
|
|
46
|
+
const attachmentRuntime = useAttachmentRuntime(options);
|
|
147
47
|
if (!attachmentRuntime) return null;
|
|
148
|
-
|
|
48
|
+
if (attachmentRuntime.source !== "thread-composer")
|
|
49
|
+
throw new Error(
|
|
50
|
+
"This component must be used within a thread's ComposerPrimitive.Attachments component.",
|
|
51
|
+
);
|
|
52
|
+
return attachmentRuntime as AttachmentRuntime<"thread-composer">;
|
|
149
53
|
}
|
|
150
54
|
|
|
151
55
|
export function useEditComposerAttachmentRuntime(options?: {
|
|
152
56
|
optional?: false | undefined;
|
|
153
|
-
}): AttachmentRuntime
|
|
57
|
+
}): AttachmentRuntime<"edit-composer">;
|
|
154
58
|
export function useEditComposerAttachmentRuntime(options?: {
|
|
155
59
|
optional?: boolean | undefined;
|
|
156
|
-
}): AttachmentRuntime | null;
|
|
60
|
+
}): AttachmentRuntime<"edit-composer"> | null;
|
|
157
61
|
export function useEditComposerAttachmentRuntime(options?: {
|
|
158
62
|
optional?: boolean | undefined;
|
|
159
|
-
}): AttachmentRuntime | null {
|
|
160
|
-
const attachmentRuntime =
|
|
63
|
+
}): AttachmentRuntime<"edit-composer"> | null {
|
|
64
|
+
const attachmentRuntime = useAttachmentRuntime(options);
|
|
161
65
|
if (!attachmentRuntime) return null;
|
|
162
|
-
|
|
66
|
+
if (attachmentRuntime.source !== "edit-composer")
|
|
67
|
+
throw new Error(
|
|
68
|
+
"This component must be used within a message's ComposerPrimitive.Attachments component.",
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return attachmentRuntime as AttachmentRuntime<"edit-composer">;
|
|
163
72
|
}
|
|
164
73
|
|
|
165
74
|
export function useMessageAttachmentRuntime(options?: {
|
|
166
75
|
optional?: false | undefined;
|
|
167
|
-
}): AttachmentRuntime
|
|
76
|
+
}): AttachmentRuntime<"message">;
|
|
168
77
|
export function useMessageAttachmentRuntime(options?: {
|
|
169
78
|
optional?: boolean | undefined;
|
|
170
|
-
}): AttachmentRuntime | null;
|
|
79
|
+
}): AttachmentRuntime<"message"> | null;
|
|
171
80
|
export function useMessageAttachmentRuntime(options?: {
|
|
172
81
|
optional?: boolean | undefined;
|
|
173
|
-
}): AttachmentRuntime | null {
|
|
174
|
-
const attachmentRuntime =
|
|
82
|
+
}): AttachmentRuntime<"message"> | null {
|
|
83
|
+
const attachmentRuntime = useAttachmentRuntime(options);
|
|
175
84
|
if (!attachmentRuntime) return null;
|
|
176
|
-
|
|
85
|
+
if (attachmentRuntime.source !== "message")
|
|
86
|
+
throw new Error(
|
|
87
|
+
"This component must be used within a MessagePrimitive.Attachments component.",
|
|
88
|
+
);
|
|
89
|
+
return attachmentRuntime as AttachmentRuntime<"message">;
|
|
177
90
|
}
|
|
178
91
|
|
|
179
|
-
export const
|
|
180
|
-
useAttachmentContext,
|
|
181
|
-
"useAttachment",
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
export const { useAttachment: useThreadComposerAttachment } =
|
|
185
|
-
createContextStoreHook(useThreadComposerAttachmentContext, "useAttachment");
|
|
92
|
+
export const useAttachment = createStateHookForRuntime(useAttachmentRuntime);
|
|
186
93
|
|
|
187
|
-
export const
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
export const
|
|
191
|
-
|
|
192
|
-
|
|
94
|
+
export const useThreadComposerAttachment = createStateHookForRuntime(
|
|
95
|
+
useThreadComposerAttachmentRuntime,
|
|
96
|
+
);
|
|
97
|
+
export const useEditComposerAttachment = createStateHookForRuntime(
|
|
98
|
+
useEditComposerAttachmentRuntime,
|
|
99
|
+
);
|
|
100
|
+
export const useMessageAttachment = createStateHookForRuntime(
|
|
101
|
+
useMessageAttachmentRuntime,
|
|
193
102
|
);
|
|
@@ -1,34 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { createContextStoreHook } from "./utils/createContextStoreHook";
|
|
8
|
-
import { ComposerRuntime, ComposerState } from "../../api/ComposerRuntime";
|
|
9
|
-
import { UseBoundStore } from "zustand";
|
|
10
|
-
|
|
11
|
-
export type ComposerContextValue = {
|
|
12
|
-
useComposer: UseBoundStore<ReadonlyStore<ComposerState>>;
|
|
13
|
-
type: "edit" | "new";
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export const useComposerContext = (): ComposerContextValue => {
|
|
17
|
-
const { useComposer: useThreadComposer } = useThreadContext();
|
|
18
|
-
const { useEditComposer } = useMessageContext({ optional: true }) ?? {};
|
|
19
|
-
return useMemo(
|
|
20
|
-
() => ({
|
|
21
|
-
useComposer: useEditComposer ?? useThreadComposer,
|
|
22
|
-
type: useEditComposer ? ("edit" as const) : ("new" as const),
|
|
23
|
-
}),
|
|
24
|
-
[useEditComposer, useThreadComposer],
|
|
25
|
-
);
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export const { useComposer } = createContextStoreHook(
|
|
29
|
-
useComposerContext,
|
|
30
|
-
"useComposer",
|
|
31
|
-
);
|
|
3
|
+
import { useMessageRuntime } from "./MessageContext";
|
|
4
|
+
import { useThreadRuntime } from "./ThreadContext";
|
|
5
|
+
import { ComposerRuntime } from "../../api/ComposerRuntime";
|
|
6
|
+
import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
|
|
32
7
|
|
|
33
8
|
export function useComposerRuntime(options?: {
|
|
34
9
|
optional?: false | undefined;
|
|
@@ -45,3 +20,5 @@ export function useComposerRuntime(options?: {
|
|
|
45
20
|
? messageRuntime.composer
|
|
46
21
|
: (threadRuntime?.composer ?? null);
|
|
47
22
|
}
|
|
23
|
+
|
|
24
|
+
export const useComposer = createStateHookForRuntime(useComposerRuntime);
|
|
@@ -2,22 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
import { createContext } from "react";
|
|
4
4
|
import { ReadonlyStore } from "../ReadonlyStore";
|
|
5
|
-
import { createContextStoreHook } from "./utils/createContextStoreHook";
|
|
6
5
|
import { createContextHook } from "./utils/createContextHook";
|
|
7
6
|
import { UseBoundStore } from "zustand";
|
|
8
7
|
import { ContentPartRuntime } from "../../api/ContentPartRuntime";
|
|
9
|
-
import {
|
|
8
|
+
import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
|
|
10
9
|
|
|
11
10
|
export type ContentPartContextValue = {
|
|
12
11
|
useContentPartRuntime: UseBoundStore<ReadonlyStore<ContentPartRuntime>>;
|
|
13
|
-
useContentPart: UseBoundStore<ReadonlyStore<ContentPartState>>;
|
|
14
12
|
};
|
|
15
13
|
|
|
16
14
|
export const ContentPartContext = createContext<ContentPartContextValue | null>(
|
|
17
15
|
null,
|
|
18
16
|
);
|
|
19
17
|
|
|
20
|
-
|
|
18
|
+
const useContentPartContext = createContextHook(
|
|
21
19
|
ContentPartContext,
|
|
22
20
|
"a component passed to <MessagePrimitive.Content components={...}>",
|
|
23
21
|
);
|
|
@@ -36,7 +34,4 @@ export function useContentPartRuntime(options?: {
|
|
|
36
34
|
return context.useContentPartRuntime();
|
|
37
35
|
}
|
|
38
36
|
|
|
39
|
-
export const
|
|
40
|
-
useContentPartContext,
|
|
41
|
-
"useContentPart",
|
|
42
|
-
);
|
|
37
|
+
export const useContentPart = createStateHookForRuntime(useContentPartRuntime);
|
|
@@ -7,19 +7,17 @@ import { createContextHook } from "./utils/createContextHook";
|
|
|
7
7
|
import { createContextStoreHook } from "./utils/createContextStoreHook";
|
|
8
8
|
import { UseBoundStore } from "zustand";
|
|
9
9
|
import { MessageRuntime } from "../../api/MessageRuntime";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
10
|
+
import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
|
|
11
|
+
import { EditComposerRuntime } from "../../api";
|
|
12
12
|
|
|
13
13
|
export type MessageContextValue = {
|
|
14
14
|
useMessageRuntime: UseBoundStore<ReadonlyStore<MessageRuntime>>;
|
|
15
|
-
useMessage: UseBoundStore<ReadonlyStore<MessageState>>;
|
|
16
15
|
useMessageUtils: UseBoundStore<ReadonlyStore<MessageUtilsState>>;
|
|
17
|
-
useEditComposer: UseBoundStore<ReadonlyStore<EditComposerState>>;
|
|
18
16
|
};
|
|
19
17
|
|
|
20
18
|
export const MessageContext = createContext<MessageContextValue | null>(null);
|
|
21
19
|
|
|
22
|
-
|
|
20
|
+
const useMessageContext = createContextHook(
|
|
23
21
|
MessageContext,
|
|
24
22
|
"a component passed to <ThreadPrimitive.Messages components={...} />",
|
|
25
23
|
);
|
|
@@ -38,17 +36,16 @@ export function useMessageRuntime(options?: {
|
|
|
38
36
|
return context.useMessageRuntime();
|
|
39
37
|
}
|
|
40
38
|
|
|
41
|
-
export const
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
export const useMessage = createStateHookForRuntime(useMessageRuntime);
|
|
40
|
+
|
|
41
|
+
const useEditComposerRuntime = (opt: {
|
|
42
|
+
optional: boolean | undefined;
|
|
43
|
+
}): EditComposerRuntime | null => useMessageRuntime(opt)?.composer ?? null;
|
|
44
|
+
export const useEditComposer = createStateHookForRuntime(
|
|
45
|
+
useEditComposerRuntime,
|
|
44
46
|
);
|
|
45
47
|
|
|
46
48
|
export const { useMessageUtils, useMessageUtilsStore } = createContextStoreHook(
|
|
47
49
|
useMessageContext,
|
|
48
50
|
"useMessageUtils",
|
|
49
51
|
);
|
|
50
|
-
|
|
51
|
-
export const { useEditComposer } = createContextStoreHook(
|
|
52
|
-
useMessageContext,
|
|
53
|
-
"useEditComposer",
|
|
54
|
-
);
|
|
@@ -7,20 +7,18 @@ import { UseBoundStore } from "zustand";
|
|
|
7
7
|
import { createContextHook } from "./utils/createContextHook";
|
|
8
8
|
import { createContextStoreHook } from "./utils/createContextStoreHook";
|
|
9
9
|
import { ThreadRuntime } from "../../api/ThreadRuntime";
|
|
10
|
-
import { ThreadState } from "../../api/ThreadRuntime";
|
|
11
10
|
import { ModelConfig } from "../../types";
|
|
12
|
-
import {
|
|
11
|
+
import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
|
|
12
|
+
import { ThreadComposerRuntime } from "../../api";
|
|
13
13
|
|
|
14
14
|
export type ThreadContextValue = {
|
|
15
|
-
useThread: UseBoundStore<ReadonlyStore<ThreadState>>;
|
|
16
15
|
useThreadRuntime: UseBoundStore<ReadonlyStore<ThreadRuntime>>;
|
|
17
|
-
useComposer: UseBoundStore<ReadonlyStore<ThreadComposerState>>;
|
|
18
16
|
useViewport: UseBoundStore<ReadonlyStore<ThreadViewportState>>;
|
|
19
17
|
};
|
|
20
18
|
|
|
21
19
|
export const ThreadContext = createContext<ThreadContextValue | null>(null);
|
|
22
20
|
|
|
23
|
-
|
|
21
|
+
const useThreadContext = createContextHook(
|
|
24
22
|
ThreadContext,
|
|
25
23
|
"AssistantRuntimeProvider",
|
|
26
24
|
);
|
|
@@ -37,14 +35,13 @@ export function useThreadRuntime(options?: { optional?: boolean | undefined }) {
|
|
|
37
35
|
return context.useThreadRuntime();
|
|
38
36
|
}
|
|
39
37
|
|
|
40
|
-
export const
|
|
41
|
-
useThreadContext,
|
|
42
|
-
"useThread",
|
|
43
|
-
);
|
|
38
|
+
export const useThread = createStateHookForRuntime(useThreadRuntime);
|
|
44
39
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
const useThreadComposerRuntime = (opt: {
|
|
41
|
+
optional: boolean | undefined;
|
|
42
|
+
}): ThreadComposerRuntime | null => useThreadRuntime(opt)?.composer ?? null;
|
|
43
|
+
export const useThreadComposer = createStateHookForRuntime(
|
|
44
|
+
useThreadComposerRuntime,
|
|
48
45
|
);
|
|
49
46
|
|
|
50
47
|
export const {
|
|
@@ -2,21 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
import { createContext } from "react";
|
|
4
4
|
import { ReadonlyStore } from "../ReadonlyStore";
|
|
5
|
-
import { createContextStoreHook } from "./utils/createContextStoreHook";
|
|
6
5
|
import { createContextHook } from "./utils/createContextHook";
|
|
7
6
|
import { UseBoundStore } from "zustand";
|
|
8
7
|
import { ThreadListItemRuntime } from "../../api/ThreadListItemRuntime";
|
|
9
|
-
import {
|
|
8
|
+
import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
|
|
10
9
|
|
|
11
10
|
export type ThreadListItemContextValue = {
|
|
12
11
|
useThreadListItemRuntime: UseBoundStore<ReadonlyStore<ThreadListItemRuntime>>;
|
|
13
|
-
useThreadListItem: UseBoundStore<ReadonlyStore<ThreadListItemState>>;
|
|
14
12
|
};
|
|
15
13
|
|
|
16
14
|
export const ThreadListItemContext =
|
|
17
15
|
createContext<ThreadListItemContextValue | null>(null);
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
const useThreadListItemContext = createContextHook(
|
|
20
18
|
ThreadListItemContext,
|
|
21
19
|
"a component passed to <ThreadListPrimitive.Items components={...}>",
|
|
22
20
|
);
|
|
@@ -35,7 +33,6 @@ export function useThreadListItemRuntime(options?: {
|
|
|
35
33
|
return context.useThreadListItemRuntime();
|
|
36
34
|
}
|
|
37
35
|
|
|
38
|
-
export const
|
|
39
|
-
|
|
40
|
-
"useThreadListItem",
|
|
36
|
+
export const useThreadListItem = createStateHookForRuntime(
|
|
37
|
+
useThreadListItemRuntime,
|
|
41
38
|
);
|
|
@@ -12,11 +12,9 @@ export function createContextHook<T>(
|
|
|
12
12
|
context: Context<T | null>,
|
|
13
13
|
providerName: string,
|
|
14
14
|
) {
|
|
15
|
-
function useContextHook(options?: { optional?: false | undefined }): T;
|
|
16
15
|
function useContextHook(options?: {
|
|
17
16
|
optional?: boolean | undefined;
|
|
18
|
-
}): T | null
|
|
19
|
-
function useContextHook(options?: { optional?: boolean | undefined }) {
|
|
17
|
+
}): T | null {
|
|
20
18
|
const contextValue = useContext(context);
|
|
21
19
|
if (!options?.optional && !contextValue) {
|
|
22
20
|
throw new Error(`This component must be used within ${providerName}.`);
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SubscribableRuntime,
|
|
3
|
+
useRuntimeStateInternal,
|
|
4
|
+
} from "./useRuntimeState";
|
|
5
|
+
|
|
6
|
+
export function createStateHookForRuntime<TState>(
|
|
7
|
+
useRuntime: (options: {
|
|
8
|
+
optional: boolean | undefined;
|
|
9
|
+
}) => SubscribableRuntime<TState> | null,
|
|
10
|
+
) {
|
|
11
|
+
// empty
|
|
12
|
+
function useStoreHook(): TState;
|
|
13
|
+
|
|
14
|
+
// selector
|
|
15
|
+
function useStoreHook<TSelected>(
|
|
16
|
+
selector: (state: TState) => TSelected,
|
|
17
|
+
): TSelected;
|
|
18
|
+
|
|
19
|
+
// selector?
|
|
20
|
+
function useStoreHook<TSelected>(
|
|
21
|
+
selector: ((state: TState) => TSelected) | undefined,
|
|
22
|
+
): TSelected | TState;
|
|
23
|
+
|
|
24
|
+
// optional=false
|
|
25
|
+
function useStoreHook(options: { optional?: false | undefined }): TState;
|
|
26
|
+
|
|
27
|
+
// optional?
|
|
28
|
+
function useStoreHook(options: {
|
|
29
|
+
optional?: boolean | undefined;
|
|
30
|
+
}): TState | null;
|
|
31
|
+
|
|
32
|
+
// optional=false, selector
|
|
33
|
+
function useStoreHook<TSelected>(options: {
|
|
34
|
+
optional?: false | undefined;
|
|
35
|
+
selector: (state: TState) => TSelected;
|
|
36
|
+
}): TSelected;
|
|
37
|
+
|
|
38
|
+
// optional=false, selector?
|
|
39
|
+
function useStoreHook<TSelected>(options: {
|
|
40
|
+
optional?: false | undefined;
|
|
41
|
+
selector: ((state: TState) => TSelected) | undefined;
|
|
42
|
+
}): TSelected | TState;
|
|
43
|
+
|
|
44
|
+
// optional?, selector
|
|
45
|
+
function useStoreHook<TSelected>(options: {
|
|
46
|
+
optional?: boolean | undefined;
|
|
47
|
+
selector: (state: TState) => TSelected;
|
|
48
|
+
}): TSelected | null;
|
|
49
|
+
|
|
50
|
+
// optional?, selector?
|
|
51
|
+
function useStoreHook<TSelected>(options: {
|
|
52
|
+
optional?: boolean | undefined;
|
|
53
|
+
selector: ((state: TState) => TSelected) | undefined;
|
|
54
|
+
}): TSelected | TState | null;
|
|
55
|
+
|
|
56
|
+
function useStoreHook<TSelected>(
|
|
57
|
+
param?:
|
|
58
|
+
| ((state: TState) => TSelected)
|
|
59
|
+
| {
|
|
60
|
+
optional?: boolean | undefined;
|
|
61
|
+
selector?: ((state: TState) => TSelected) | undefined;
|
|
62
|
+
},
|
|
63
|
+
): TSelected | TState | null {
|
|
64
|
+
let optional = false;
|
|
65
|
+
let selector: ((state: TState) => TSelected) | undefined;
|
|
66
|
+
|
|
67
|
+
if (typeof param === "function") {
|
|
68
|
+
selector = param;
|
|
69
|
+
} else if (param) {
|
|
70
|
+
optional = !!param.optional;
|
|
71
|
+
selector = param.selector;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const store = useRuntime({ optional });
|
|
75
|
+
if (!store) return null;
|
|
76
|
+
return useRuntimeStateInternal(store, selector);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return useStoreHook;
|
|
80
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
type Bindable = {
|
|
2
|
+
__internal_bindMethods?: () => void;
|
|
3
|
+
__isBound?: boolean;
|
|
4
|
+
};
|
|
5
|
+
const debugVerifyPrototype = (
|
|
6
|
+
runtime: Record<string, unknown>,
|
|
7
|
+
prototype: any,
|
|
8
|
+
) => {
|
|
9
|
+
const unboundMethods = Object.getOwnPropertyNames(prototype).filter(
|
|
10
|
+
(methodStr) => {
|
|
11
|
+
const descriptor = Object.getOwnPropertyDescriptor(prototype, methodStr);
|
|
12
|
+
const isMethod = descriptor && typeof descriptor.value === "function";
|
|
13
|
+
if (!isMethod) return false;
|
|
14
|
+
|
|
15
|
+
const methodName = methodStr as keyof typeof runtime | "constructor";
|
|
16
|
+
return (
|
|
17
|
+
isMethod &&
|
|
18
|
+
!methodName.startsWith("_") &&
|
|
19
|
+
methodName !== "constructor" &&
|
|
20
|
+
prototype[methodName] === runtime[methodName]
|
|
21
|
+
);
|
|
22
|
+
},
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
if (unboundMethods.length > 0) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
"The following methods are not bound: " + JSON.stringify(unboundMethods),
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const prototypePrototype = Object.getPrototypeOf(prototype);
|
|
32
|
+
if (prototypePrototype && prototypePrototype !== Object.prototype) {
|
|
33
|
+
debugVerifyPrototype(runtime, prototypePrototype);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
export const ensureBinding = (r: unknown) => {
|
|
37
|
+
const runtime = r as Bindable;
|
|
38
|
+
if (runtime.__isBound) return;
|
|
39
|
+
|
|
40
|
+
runtime.__internal_bindMethods?.();
|
|
41
|
+
runtime.__isBound = true;
|
|
42
|
+
|
|
43
|
+
// @ts-ignore - strip this out in production build
|
|
44
|
+
DEV: debugVerifyPrototype(runtime, Object.getPrototypeOf(runtime));
|
|
45
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { useDebugValue, useSyncExternalStore } from "react";
|
|
2
|
+
import { Unsubscribe } from "../../../types";
|
|
3
|
+
import { ensureBinding } from "./ensureBinding";
|
|
4
|
+
|
|
5
|
+
export type SubscribableRuntime<TState> = {
|
|
6
|
+
getState: () => TState;
|
|
7
|
+
subscribe: (callback: () => void) => Unsubscribe;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export function useRuntimeStateInternal<TState, TSelected>(
|
|
11
|
+
runtime: SubscribableRuntime<TState>,
|
|
12
|
+
selector: ((state: TState) => TSelected) | undefined = identity as any,
|
|
13
|
+
): TSelected | TState {
|
|
14
|
+
const slice = useSyncExternalStore(
|
|
15
|
+
runtime.subscribe,
|
|
16
|
+
() => selector(runtime.getState()),
|
|
17
|
+
() => selector(runtime.getState()),
|
|
18
|
+
);
|
|
19
|
+
useDebugValue(slice);
|
|
20
|
+
return slice;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const identity = <T>(arg: T): T => arg;
|
|
24
|
+
export function useRuntimeState<TState>(
|
|
25
|
+
runtime: SubscribableRuntime<TState>,
|
|
26
|
+
): TState;
|
|
27
|
+
export function useRuntimeState<TState, TSelected>(
|
|
28
|
+
runtime: SubscribableRuntime<TState>,
|
|
29
|
+
selector: (state: TState) => TSelected,
|
|
30
|
+
): TSelected;
|
|
31
|
+
export function useRuntimeState<TState, TSelected>(
|
|
32
|
+
runtime: SubscribableRuntime<TState>,
|
|
33
|
+
selector: ((state: TState) => TSelected) | undefined,
|
|
34
|
+
): TSelected | TState;
|
|
35
|
+
export function useRuntimeState<TState, TSelected>(
|
|
36
|
+
runtime: SubscribableRuntime<TState>,
|
|
37
|
+
selector?: ((state: TState) => TSelected) | undefined,
|
|
38
|
+
): TSelected | TState {
|
|
39
|
+
// ensure that the runtime is bound
|
|
40
|
+
ensureBinding(runtime);
|
|
41
|
+
|
|
42
|
+
return useRuntimeStateInternal(runtime, selector);
|
|
43
|
+
}
|
|
@@ -7,7 +7,9 @@ import {
|
|
|
7
7
|
export type AttachmentAdapter = {
|
|
8
8
|
accept: string;
|
|
9
9
|
|
|
10
|
-
add(state: {
|
|
10
|
+
add(state: {
|
|
11
|
+
file: File;
|
|
12
|
+
}): Promise<PendingAttachment> | AsyncGenerator<PendingAttachment, void>;
|
|
11
13
|
remove(attachment: Attachment): Promise<void>;
|
|
12
14
|
send(attachment: PendingAttachment): Promise<CompleteAttachment>;
|
|
13
15
|
};
|
|
@@ -65,7 +65,7 @@ export class CompositeAttachmentAdapter implements AttachmentAdapter {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
public
|
|
68
|
+
public add(state: { file: File }) {
|
|
69
69
|
for (const adapter of this._adapters) {
|
|
70
70
|
if (fileMatchesAccept(state.file, adapter.accept)) {
|
|
71
71
|
return adapter.add(state);
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
ExportedMessageRepositoryItem,
|
|
4
4
|
} from "../../utils/MessageRepository";
|
|
5
5
|
|
|
6
|
+
// TODO external store - which version to save? how to restore?
|
|
6
7
|
export type ThreadHistoryAdapter = {
|
|
7
8
|
load(): Promise<ExportedMessageRepository>;
|
|
8
9
|
append(item: ExportedMessageRepositoryItem): Promise<void>;
|