@copilotkit/react-textarea 0.19.0-alpha.9 → 0.19.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.
- package/.turbo/turbo-build.log +298 -298
- package/CHANGELOG.md +28 -0
- package/dist/chunk-2NURR2DX.mjs +47 -0
- package/dist/chunk-2NURR2DX.mjs.map +1 -0
- package/dist/chunk-3TK2VELX.mjs +202 -0
- package/dist/chunk-3TK2VELX.mjs.map +1 -0
- package/dist/chunk-47JRPWI3.mjs +257 -0
- package/dist/chunk-47JRPWI3.mjs.map +1 -0
- package/dist/chunk-4S5ZJH3I.mjs +18 -0
- package/dist/chunk-4S5ZJH3I.mjs.map +1 -0
- package/dist/chunk-5EJ5XOGP.mjs +22 -0
- package/dist/chunk-5EJ5XOGP.mjs.map +1 -0
- package/dist/chunk-5FO6ISW4.mjs +3 -0
- package/dist/chunk-5FO6ISW4.mjs.map +1 -0
- package/dist/chunk-66BDXIX4.mjs +76 -0
- package/dist/chunk-66BDXIX4.mjs.map +1 -0
- package/dist/chunk-7QWJ3OV7.mjs +108 -0
- package/dist/chunk-7QWJ3OV7.mjs.map +1 -0
- package/dist/chunk-BBKDE7YT.mjs +19 -0
- package/dist/chunk-BBKDE7YT.mjs.map +1 -0
- package/dist/chunk-CSGFJU3L.mjs +65 -0
- package/dist/chunk-CSGFJU3L.mjs.map +1 -0
- package/dist/chunk-DE5K76I2.mjs +3 -0
- package/dist/chunk-DE5K76I2.mjs.map +1 -0
- package/dist/chunk-F3MHL6ZY.mjs +25 -0
- package/dist/chunk-F3MHL6ZY.mjs.map +1 -0
- package/dist/chunk-FN7GDKKG.mjs +29 -0
- package/dist/chunk-FN7GDKKG.mjs.map +1 -0
- package/dist/chunk-H4VKQGVU.mjs +3 -0
- package/dist/chunk-H4VKQGVU.mjs.map +1 -0
- package/dist/chunk-HRTFMM7P.mjs +82 -0
- package/dist/chunk-HRTFMM7P.mjs.map +1 -0
- package/dist/chunk-IU3WTXLQ.mjs +3 -0
- package/dist/chunk-IU3WTXLQ.mjs.map +1 -0
- package/dist/chunk-IXJ2HCOA.mjs +101 -0
- package/dist/chunk-IXJ2HCOA.mjs.map +1 -0
- package/dist/chunk-JAFCXEPU.mjs +10 -0
- package/dist/chunk-JAFCXEPU.mjs.map +1 -0
- package/dist/chunk-JHTAOLEW.mjs +63 -0
- package/dist/chunk-JHTAOLEW.mjs.map +1 -0
- package/dist/chunk-K2AVA67P.mjs +57 -0
- package/dist/chunk-K2AVA67P.mjs.map +1 -0
- package/dist/chunk-KCHYD3EB.mjs +107 -0
- package/dist/chunk-KCHYD3EB.mjs.map +1 -0
- package/dist/chunk-KGKLUWKW.mjs +47 -0
- package/dist/chunk-KGKLUWKW.mjs.map +1 -0
- package/dist/chunk-KIRROE2K.mjs +37 -0
- package/dist/chunk-KIRROE2K.mjs.map +1 -0
- package/dist/chunk-L6DZHWEL.mjs +76 -0
- package/dist/chunk-L6DZHWEL.mjs.map +1 -0
- package/dist/chunk-L7VVZH4Q.mjs +3 -0
- package/dist/chunk-L7VVZH4Q.mjs.map +1 -0
- package/dist/chunk-LNAIMEB2.mjs +34 -0
- package/dist/chunk-LNAIMEB2.mjs.map +1 -0
- package/dist/chunk-MMVDU6DF.mjs +3 -0
- package/dist/chunk-MMVDU6DF.mjs.map +1 -0
- package/dist/chunk-MPME5BW2.mjs +59 -0
- package/dist/chunk-MPME5BW2.mjs.map +1 -0
- package/dist/chunk-MRXNTQOX.mjs +55 -0
- package/dist/chunk-MRXNTQOX.mjs.map +1 -0
- package/dist/chunk-ND5PXTAW.mjs +17 -0
- package/dist/chunk-ND5PXTAW.mjs.map +1 -0
- package/dist/chunk-NKW5OU2S.mjs +33 -0
- package/dist/chunk-NKW5OU2S.mjs.map +1 -0
- package/dist/chunk-O5OWT5GE.mjs +114 -0
- package/dist/chunk-O5OWT5GE.mjs.map +1 -0
- package/dist/chunk-OD7ZMOVE.mjs +45 -0
- package/dist/chunk-OD7ZMOVE.mjs.map +1 -0
- package/dist/chunk-OELUUJZY.mjs +16 -0
- package/dist/chunk-OELUUJZY.mjs.map +1 -0
- package/dist/chunk-OXPXFYUG.mjs +111 -0
- package/dist/chunk-OXPXFYUG.mjs.map +1 -0
- package/dist/chunk-QNJ6MXJ2.mjs +21 -0
- package/dist/chunk-QNJ6MXJ2.mjs.map +1 -0
- package/dist/chunk-RDHPSSHJ.mjs +44 -0
- package/dist/chunk-RDHPSSHJ.mjs.map +1 -0
- package/dist/chunk-RQHOUUXQ.mjs +29 -0
- package/dist/chunk-RQHOUUXQ.mjs.map +1 -0
- package/dist/chunk-S6JUGJK2.mjs +13 -0
- package/dist/chunk-S6JUGJK2.mjs.map +1 -0
- package/dist/chunk-UHD44NC5.mjs +101 -0
- package/dist/chunk-UHD44NC5.mjs.map +1 -0
- package/dist/chunk-WADHCMPK.mjs +3 -0
- package/dist/chunk-WADHCMPK.mjs.map +1 -0
- package/dist/chunk-WJHSY5T6.mjs +3 -0
- package/dist/chunk-WJHSY5T6.mjs.map +1 -0
- package/dist/chunk-WJYQWL4I.mjs +27 -0
- package/dist/chunk-WJYQWL4I.mjs.map +1 -0
- package/dist/chunk-XA7M72ZO.mjs +106 -0
- package/dist/chunk-XA7M72ZO.mjs.map +1 -0
- package/dist/chunk-XHUMROEY.mjs +91 -0
- package/dist/chunk-XHUMROEY.mjs.map +1 -0
- package/dist/chunk-YQU7WG7T.mjs +83 -0
- package/dist/chunk-YQU7WG7T.mjs.map +1 -0
- package/dist/chunk-YTOPHPSG.mjs +45 -0
- package/dist/chunk-YTOPHPSG.mjs.map +1 -0
- package/dist/chunk-YW3REYX6.mjs +23 -0
- package/dist/chunk-YW3REYX6.mjs.map +1 -0
- package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +34 -1734
- package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/render-element.mjs +3 -52
- package/dist/components/base-copilot-textarea/render-element.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/render-placeholder.mjs +3 -46
- package/dist/components/base-copilot-textarea/render-placeholder.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +4 -86
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/use-add-branding-css.mjs +3 -57
- package/dist/components/base-copilot-textarea/use-add-branding-css.mjs.map +1 -1
- package/dist/components/copilot-textarea/copilot-textarea.mjs +46 -2202
- package/dist/components/copilot-textarea/copilot-textarea.mjs.map +1 -1
- package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +3 -22
- package/dist/components/hovering-toolbar/hovering-editor-provider.mjs.map +1 -1
- package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +3 -125
- package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs.map +1 -1
- package/dist/components/hovering-toolbar/hovering-toolbar.mjs +17 -877
- package/dist/components/hovering-toolbar/hovering-toolbar.mjs.map +1 -1
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs +11 -577
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs.map +1 -1
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +12 -592
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs.map +1 -1
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +13 -592
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs.map +1 -1
- package/dist/components/index.mjs +47 -2203
- package/dist/components/index.mjs.map +1 -1
- package/dist/components/manual-ui/chip-with-icon.mjs +6 -5
- package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -1
- package/dist/components/source-search-box/source-search-box.mjs +6 -209
- package/dist/components/source-search-box/source-search-box.mjs.map +1 -1
- package/dist/components/ui/button.mjs +4 -88
- package/dist/components/ui/button.mjs.map +1 -1
- package/dist/components/ui/card.mjs +7 -53
- package/dist/components/ui/card.mjs.map +1 -1
- package/dist/components/ui/command.mjs +5 -266
- package/dist/components/ui/command.mjs.map +1 -1
- package/dist/components/ui/dialog.mjs +4 -164
- package/dist/components/ui/dialog.mjs.map +1 -1
- package/dist/components/ui/label.mjs +4 -63
- package/dist/components/ui/label.mjs.map +1 -1
- package/dist/components/ui/separator.mjs +8 -50
- package/dist/components/ui/separator.mjs.map +1 -1
- package/dist/components/ui/textarea.mjs +7 -48
- package/dist/components/ui/textarea.mjs.map +1 -1
- package/dist/context/index.mjs +2 -0
- package/dist/context/index.mjs.map +1 -1
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +6 -168
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs.map +1 -1
- package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs +4 -168
- package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs.map +1 -1
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +5 -155
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs.map +1 -1
- package/dist/hooks/index.mjs +2 -0
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +14 -145
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs.map +1 -1
- package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +14 -199
- package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs.map +1 -1
- package/dist/hooks/misc/use-autosize-textarea.mjs +3 -15
- package/dist/hooks/misc/use-autosize-textarea.mjs.map +1 -1
- package/dist/index.mjs +49 -2206
- package/dist/index.mjs.map +1 -1
- package/dist/lib/debouncer.mjs +3 -51
- package/dist/lib/debouncer.mjs.map +1 -1
- package/dist/lib/editor-to-text.mjs +3 -43
- package/dist/lib/editor-to-text.mjs.map +1 -1
- package/dist/lib/get-text-around-cursor.mjs +3 -109
- package/dist/lib/get-text-around-cursor.mjs.map +1 -1
- package/dist/lib/retry.mjs +3 -17
- package/dist/lib/retry.mjs.map +1 -1
- package/dist/lib/slatejs-edits/add-autocompletions.mjs +3 -25
- package/dist/lib/slatejs-edits/add-autocompletions.mjs.map +1 -1
- package/dist/lib/slatejs-edits/clear-autocompletions.mjs +3 -23
- package/dist/lib/slatejs-edits/clear-autocompletions.mjs.map +1 -1
- package/dist/lib/slatejs-edits/replace-text.mjs +3 -27
- package/dist/lib/slatejs-edits/replace-text.mjs.map +1 -1
- package/dist/lib/slatejs-edits/with-partial-history.mjs +3 -106
- package/dist/lib/slatejs-edits/with-partial-history.mjs.map +1 -1
- package/dist/lib/stream-promise-flatten.mjs +3 -47
- package/dist/lib/stream-promise-flatten.mjs.map +1 -1
- package/dist/lib/utils.mjs +3 -71
- package/dist/lib/utils.mjs.map +1 -1
- package/dist/lib/utils.test.mjs +1 -0
- package/dist/lib/utils.test.mjs.map +1 -1
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs +2 -0
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs.map +1 -1
- package/dist/types/autosuggestions-config/autosuggestions-config.mjs +8 -254
- package/dist/types/autosuggestions-config/autosuggestions-config.mjs.map +1 -1
- package/dist/types/autosuggestions-config/editing-api-config.mjs +3 -83
- package/dist/types/autosuggestions-config/editing-api-config.mjs.map +1 -1
- package/dist/types/autosuggestions-config/index.mjs +10 -310
- package/dist/types/autosuggestions-config/index.mjs.map +1 -1
- package/dist/types/autosuggestions-config/insertions-api-config.mjs +3 -77
- package/dist/types/autosuggestions-config/insertions-api-config.mjs.map +1 -1
- package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs +3 -77
- package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs.map +1 -1
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs +2 -0
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs.map +1 -1
- package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs +2 -0
- package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs.map +1 -1
- package/dist/types/autosuggestions-config/suggestions-api-config.mjs +3 -64
- package/dist/types/autosuggestions-config/suggestions-api-config.mjs.map +1 -1
- package/dist/types/base/autosuggestion-state.mjs +2 -0
- package/dist/types/base/autosuggestion-state.mjs.map +1 -1
- package/dist/types/base/autosuggestions-bare-function.mjs +2 -0
- package/dist/types/base/autosuggestions-bare-function.mjs.map +1 -1
- package/dist/types/base/base-autosuggestions-config.mjs +3 -12
- package/dist/types/base/base-autosuggestions-config.mjs.map +1 -1
- package/dist/types/base/base-copilot-textarea-props.mjs +2 -0
- package/dist/types/base/base-copilot-textarea-props.mjs.map +1 -1
- package/dist/types/base/custom-editor.mjs +2 -0
- package/dist/types/base/custom-editor.mjs.map +1 -1
- package/dist/types/base/editor-autocomplete-state.mjs +4 -17
- package/dist/types/base/editor-autocomplete-state.mjs.map +1 -1
- package/dist/types/base/index.mjs +4 -12
- package/dist/types/base/index.mjs.map +1 -1
- package/dist/types/html-copilot-textarea-element.mjs +2 -0
- package/dist/types/html-copilot-textarea-element.mjs.map +1 -1
- package/dist/types/index.mjs +12 -311
- package/dist/types/index.mjs.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# ui
|
|
2
2
|
|
|
3
|
+
## 0.19.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 1b330b5: out of beta: centralized api, textarea insertions/edits
|
|
8
|
+
- e4ce3ab: textarea edits mvp
|
|
9
|
+
- 9e201c5: textarea insertions deletions etc
|
|
10
|
+
- 7f8d531: package json
|
|
11
|
+
- 96f5630: react-ui missing declaration
|
|
12
|
+
- c13ffcb: minor bugfix
|
|
13
|
+
- e4fe6a5: copilot textarea documents - provide with code skeleton
|
|
14
|
+
- 8e9f9b1: api endpoint centralization
|
|
15
|
+
- 5829585: beta bump
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- 12407db: rebase master
|
|
20
|
+
- 939454e: prettify
|
|
21
|
+
- Updated dependencies [1b330b5]
|
|
22
|
+
- Updated dependencies [e4ce3ab]
|
|
23
|
+
- Updated dependencies [9e201c5]
|
|
24
|
+
- Updated dependencies [c13ffcb]
|
|
25
|
+
- Updated dependencies [12407db]
|
|
26
|
+
- Updated dependencies [e4fe6a5]
|
|
27
|
+
- Updated dependencies [8e9f9b1]
|
|
28
|
+
- Updated dependencies [939454e]
|
|
29
|
+
- @copilotkit/react-core@0.8.0
|
|
30
|
+
|
|
3
31
|
## 0.19.0-alpha.9
|
|
4
32
|
|
|
5
33
|
### Minor Changes
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { cn } from './chunk-KGKLUWKW.mjs';
|
|
2
|
+
import { __objRest, __spreadValues } from './chunk-MRXNTQOX.mjs';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
import { jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var buttonVariants = cva(
|
|
9
|
+
"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
10
|
+
{
|
|
11
|
+
variants: {
|
|
12
|
+
variant: {
|
|
13
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
14
|
+
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
15
|
+
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
|
|
16
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
17
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
18
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
19
|
+
},
|
|
20
|
+
size: {
|
|
21
|
+
default: "h-10 px-4 py-2",
|
|
22
|
+
sm: "h-9 rounded-md px-3",
|
|
23
|
+
lg: "h-11 rounded-md px-8",
|
|
24
|
+
icon: "h-10 w-10"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
defaultVariants: {
|
|
28
|
+
variant: "default",
|
|
29
|
+
size: "default"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
var Button = React.forwardRef(
|
|
34
|
+
(_a, ref) => {
|
|
35
|
+
var _b = _a, { className, variant, size, asChild = false } = _b, props = __objRest(_b, ["className", "variant", "size", "asChild"]);
|
|
36
|
+
const Comp = asChild ? Slot : "button";
|
|
37
|
+
return /* @__PURE__ */ jsx(Comp, __spreadValues({
|
|
38
|
+
className: cn(buttonVariants({ variant, size, className })),
|
|
39
|
+
ref
|
|
40
|
+
}, props));
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
Button.displayName = "Button";
|
|
44
|
+
|
|
45
|
+
export { Button, buttonVariants };
|
|
46
|
+
//# sourceMappingURL=out.js.map
|
|
47
|
+
//# sourceMappingURL=chunk-2NURR2DX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/button.tsx"],"names":[],"mappings":";;;;;;;;;AAAA,YAAY,WAAW;AACvB,SAAS,YAAY;AACrB,SAAS,WAA8B;AA2CjC;AAvCN,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAQA,IAAM,SAAe;AAAA,EACnB,CAAC,IAAyD,QAAQ;AAAjE,iBAAE,aAAW,SAAS,MAAM,UAAU,MA1CzC,IA0CG,IAAgD,kBAAhD,IAAgD,CAA9C,aAAW,WAAS,QAAM;AAC3B,UAAM,OAAO,UAAU,OAAO;AAC9B,WACE,oBAAC;AAAA,MACC,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,MAC1D;AAAA,OACI,MACN;AAAA,EAEJ;AACF;AACA,OAAO,cAAc","sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n"]}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { useCopilotTextareaEditor } from './chunk-CSGFJU3L.mjs';
|
|
2
|
+
import { usePopulateCopilotTextareaRef } from './chunk-YQU7WG7T.mjs';
|
|
3
|
+
import { addAutocompletionsToEditor } from './chunk-WJYQWL4I.mjs';
|
|
4
|
+
import { clearAutocompletionsFromEditor } from './chunk-F3MHL6ZY.mjs';
|
|
5
|
+
import { replaceEditorText } from './chunk-RQHOUUXQ.mjs';
|
|
6
|
+
import { useAutosuggestions } from './chunk-UHD44NC5.mjs';
|
|
7
|
+
import { TrackerTextEditedSinceLastCursorMovement } from './chunk-OD7ZMOVE.mjs';
|
|
8
|
+
import { useAddBrandingCss } from './chunk-MPME5BW2.mjs';
|
|
9
|
+
import { HoveringToolbar } from './chunk-7QWJ3OV7.mjs';
|
|
10
|
+
import { useHoveringEditorContext, HoveringEditorProvider } from './chunk-YW3REYX6.mjs';
|
|
11
|
+
import { defaultBaseAutosuggestionsConfig } from './chunk-S6JUGJK2.mjs';
|
|
12
|
+
import { makeRenderElementFunction } from './chunk-LNAIMEB2.mjs';
|
|
13
|
+
import { makeRenderPlaceholderFunction } from './chunk-OELUUJZY.mjs';
|
|
14
|
+
import { getTextAroundCollapsedCursor, getFullEditorTextWithNewlines } from './chunk-IXJ2HCOA.mjs';
|
|
15
|
+
import { __spreadValues, __objRest, __spreadProps } from './chunk-MRXNTQOX.mjs';
|
|
16
|
+
import React, { useMemo, useState, useCallback, useEffect } from 'react';
|
|
17
|
+
import { Editor } from 'slate';
|
|
18
|
+
import { Slate, Editable } from 'slate-react';
|
|
19
|
+
import { twMerge } from 'tailwind-merge';
|
|
20
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
21
|
+
|
|
22
|
+
var BaseCopilotTextareaWithHoveringContext = React.forwardRef(
|
|
23
|
+
(props, ref) => {
|
|
24
|
+
const autosuggestionsConfig = __spreadValues(__spreadValues({}, defaultBaseAutosuggestionsConfig), props.baseAutosuggestionsConfig);
|
|
25
|
+
const valueOnInitialRender = useMemo(() => {
|
|
26
|
+
var _a2;
|
|
27
|
+
return (_a2 = props.value) != null ? _a2 : "";
|
|
28
|
+
}, []);
|
|
29
|
+
const [lastKnownFullEditorText, setLastKnownFullEditorText] = useState(valueOnInitialRender);
|
|
30
|
+
const [cursorMovedSinceLastTextChange, setCursorMovedSinceLastTextChange] = useState(false);
|
|
31
|
+
const initialValue = useMemo(() => {
|
|
32
|
+
return [
|
|
33
|
+
{
|
|
34
|
+
type: "paragraph",
|
|
35
|
+
children: [{ text: valueOnInitialRender }]
|
|
36
|
+
}
|
|
37
|
+
];
|
|
38
|
+
}, [valueOnInitialRender]);
|
|
39
|
+
const editor = useCopilotTextareaEditor();
|
|
40
|
+
const {
|
|
41
|
+
isDisplayed: hoveringEditorIsDisplayed,
|
|
42
|
+
setIsDisplayed: setHoveringEditorIsDisplayed
|
|
43
|
+
} = useHoveringEditorContext();
|
|
44
|
+
const insertText = useCallback(
|
|
45
|
+
(autosuggestion) => {
|
|
46
|
+
Editor.insertText(editor, autosuggestion.text, {
|
|
47
|
+
at: autosuggestion.point
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
[editor]
|
|
51
|
+
);
|
|
52
|
+
const {
|
|
53
|
+
currentAutocompleteSuggestion,
|
|
54
|
+
onChangeHandler: onChangeHandlerForAutocomplete,
|
|
55
|
+
onKeyDownHandler: onKeyDownHandlerForAutocomplete
|
|
56
|
+
} = useAutosuggestions(
|
|
57
|
+
autosuggestionsConfig.debounceTime,
|
|
58
|
+
autosuggestionsConfig.acceptAutosuggestionKey,
|
|
59
|
+
autosuggestionsConfig.apiConfig.autosuggestionsFunction,
|
|
60
|
+
insertText,
|
|
61
|
+
autosuggestionsConfig.disableWhenEmpty,
|
|
62
|
+
autosuggestionsConfig.disabled || hoveringEditorIsDisplayed || cursorMovedSinceLastTextChange && autosuggestionsConfig.temporarilyDisableWhenMovingCursorWithoutChangingText
|
|
63
|
+
);
|
|
64
|
+
const onKeyDownHandlerForHoveringEditor = useCallback(
|
|
65
|
+
(event) => {
|
|
66
|
+
if (event.key === "k" && event.metaKey) {
|
|
67
|
+
event.preventDefault();
|
|
68
|
+
setHoveringEditorIsDisplayed(!hoveringEditorIsDisplayed);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
[hoveringEditorIsDisplayed, setHoveringEditorIsDisplayed]
|
|
72
|
+
);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
clearAutocompletionsFromEditor(editor);
|
|
75
|
+
if (currentAutocompleteSuggestion) {
|
|
76
|
+
addAutocompletionsToEditor(
|
|
77
|
+
editor,
|
|
78
|
+
currentAutocompleteSuggestion.text,
|
|
79
|
+
currentAutocompleteSuggestion.point
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
}, [currentAutocompleteSuggestion]);
|
|
83
|
+
const suggestionStyleAugmented = useMemo(() => {
|
|
84
|
+
return __spreadValues({
|
|
85
|
+
fontStyle: "italic",
|
|
86
|
+
color: "gray"
|
|
87
|
+
}, props.suggestionsStyle);
|
|
88
|
+
}, [props.suggestionsStyle]);
|
|
89
|
+
const renderElementMemoized = useMemo(() => {
|
|
90
|
+
return makeRenderElementFunction(suggestionStyleAugmented);
|
|
91
|
+
}, [suggestionStyleAugmented]);
|
|
92
|
+
const renderPlaceholderMemoized = useMemo(() => {
|
|
93
|
+
const placeholderStyleSlatejsOverrides = {
|
|
94
|
+
top: void 0
|
|
95
|
+
};
|
|
96
|
+
const placeholderStyleAugmented = __spreadValues(__spreadValues({}, placeholderStyleSlatejsOverrides), props.placeholderStyle);
|
|
97
|
+
return makeRenderPlaceholderFunction(placeholderStyleAugmented);
|
|
98
|
+
}, [props.placeholderStyle]);
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
var _a2, _b;
|
|
101
|
+
if (props.value === lastKnownFullEditorText) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
setLastKnownFullEditorText((_a2 = props.value) != null ? _a2 : "");
|
|
105
|
+
replaceEditorText(editor, (_b = props.value) != null ? _b : "");
|
|
106
|
+
}, [props.value]);
|
|
107
|
+
const _a = props, {
|
|
108
|
+
placeholderStyle,
|
|
109
|
+
value,
|
|
110
|
+
onValueChange,
|
|
111
|
+
baseAutosuggestionsConfig: autosuggestionsConfigFromProps,
|
|
112
|
+
className,
|
|
113
|
+
onChange,
|
|
114
|
+
onKeyDown,
|
|
115
|
+
disableBranding
|
|
116
|
+
} = _a, propsToForward = __objRest(_a, [
|
|
117
|
+
"placeholderStyle",
|
|
118
|
+
"value",
|
|
119
|
+
"onValueChange",
|
|
120
|
+
"baseAutosuggestionsConfig",
|
|
121
|
+
"className",
|
|
122
|
+
"onChange",
|
|
123
|
+
"onKeyDown",
|
|
124
|
+
"disableBranding"
|
|
125
|
+
]);
|
|
126
|
+
useAddBrandingCss(suggestionStyleAugmented, disableBranding);
|
|
127
|
+
usePopulateCopilotTextareaRef(editor, ref);
|
|
128
|
+
const moddedClassName = (() => {
|
|
129
|
+
const baseClassName = "copilot-textarea";
|
|
130
|
+
const brandingClass = disableBranding ? "no-branding" : "with-branding";
|
|
131
|
+
const defaultTailwindClassName = "bg-white overflow-y-auto resize-y";
|
|
132
|
+
const mergedClassName = twMerge(
|
|
133
|
+
defaultTailwindClassName,
|
|
134
|
+
className != null ? className : ""
|
|
135
|
+
);
|
|
136
|
+
return `${baseClassName} ${brandingClass} ${mergedClassName}`;
|
|
137
|
+
})();
|
|
138
|
+
return /* @__PURE__ */ jsxs(Slate, {
|
|
139
|
+
editor,
|
|
140
|
+
initialValue,
|
|
141
|
+
onChange: (value2) => {
|
|
142
|
+
var _a2, _b;
|
|
143
|
+
const newEditorState = getTextAroundCollapsedCursor(editor);
|
|
144
|
+
const fullEditorText = newEditorState ? newEditorState.textBeforeCursor + newEditorState.textAfterCursor : getFullEditorTextWithNewlines(editor);
|
|
145
|
+
setLastKnownFullEditorText((prev) => {
|
|
146
|
+
if (prev !== fullEditorText) {
|
|
147
|
+
setCursorMovedSinceLastTextChange(false);
|
|
148
|
+
}
|
|
149
|
+
return fullEditorText;
|
|
150
|
+
});
|
|
151
|
+
onChangeHandlerForAutocomplete(newEditorState);
|
|
152
|
+
(_a2 = props.onValueChange) == null ? void 0 : _a2.call(props, fullEditorText);
|
|
153
|
+
(_b = props.onChange) == null ? void 0 : _b.call(props, makeSemiFakeReactTextAreaEvent(fullEditorText));
|
|
154
|
+
},
|
|
155
|
+
children: [
|
|
156
|
+
/* @__PURE__ */ jsx(TrackerTextEditedSinceLastCursorMovement, {
|
|
157
|
+
setCursorMovedSinceLastTextChange
|
|
158
|
+
}),
|
|
159
|
+
/* @__PURE__ */ jsx(HoveringToolbar, {
|
|
160
|
+
apiConfig: autosuggestionsConfig.apiConfig,
|
|
161
|
+
contextCategories: autosuggestionsConfig.contextCategories
|
|
162
|
+
}),
|
|
163
|
+
/* @__PURE__ */ jsx(Editable, __spreadValues({
|
|
164
|
+
renderElement: renderElementMemoized,
|
|
165
|
+
renderPlaceholder: renderPlaceholderMemoized,
|
|
166
|
+
onKeyDown: (event) => {
|
|
167
|
+
var _a2;
|
|
168
|
+
onKeyDownHandlerForHoveringEditor(event);
|
|
169
|
+
onKeyDownHandlerForAutocomplete(event);
|
|
170
|
+
(_a2 = props.onKeyDown) == null ? void 0 : _a2.call(props, event);
|
|
171
|
+
},
|
|
172
|
+
className: moddedClassName
|
|
173
|
+
}, propsToForward))
|
|
174
|
+
]
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
);
|
|
178
|
+
function makeSemiFakeReactTextAreaEvent(currentText) {
|
|
179
|
+
return {
|
|
180
|
+
target: {
|
|
181
|
+
value: currentText,
|
|
182
|
+
type: "copilot-textarea"
|
|
183
|
+
},
|
|
184
|
+
currentTarget: {
|
|
185
|
+
value: currentText,
|
|
186
|
+
type: "copilot-textarea"
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
var BaseCopilotTextarea = React.forwardRef(
|
|
191
|
+
(props, ref) => {
|
|
192
|
+
return /* @__PURE__ */ jsx(HoveringEditorProvider, {
|
|
193
|
+
children: /* @__PURE__ */ jsx(BaseCopilotTextareaWithHoveringContext, __spreadProps(__spreadValues({}, props), {
|
|
194
|
+
ref
|
|
195
|
+
}))
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
export { BaseCopilotTextarea };
|
|
201
|
+
//# sourceMappingURL=out.js.map
|
|
202
|
+
//# sourceMappingURL=chunk-3TK2VELX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/base-copilot-textarea/base-copilot-textarea.tsx"],"names":["_a","value"],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Descendant, Editor } from \"slate\";\nimport { Editable, Slate } from \"slate-react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useAutosuggestions } from \"../../hooks/base-copilot-textarea-implementation/use-autosuggestions\";\nimport { useCopilotTextareaEditor } from \"../../hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor\";\nimport { usePopulateCopilotTextareaRef } from \"../../hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref\";\nimport {\n getFullEditorTextWithNewlines,\n getTextAroundCollapsedCursor,\n} from \"../../lib/get-text-around-cursor\";\nimport { addAutocompletionsToEditor } from \"../../lib/slatejs-edits/add-autocompletions\";\nimport { clearAutocompletionsFromEditor } from \"../../lib/slatejs-edits/clear-autocompletions\";\nimport { replaceEditorText } from \"../../lib/slatejs-edits/replace-text\";\nimport {\n BaseAutosuggestionsConfig,\n defaultBaseAutosuggestionsConfig,\n} from \"../../types/base\";\nimport { AutosuggestionState } from \"../../types/base/autosuggestion-state\";\nimport { BaseCopilotTextareaProps } from \"../../types/base/base-copilot-textarea-props\";\nimport \"./base-copilot-textarea.css\";\nimport { HoveringToolbar } from \"../hovering-toolbar/hovering-toolbar\";\nimport { makeRenderElementFunction } from \"./render-element\";\nimport { makeRenderPlaceholderFunction } from \"./render-placeholder\";\nimport { useAddBrandingCss } from \"./use-add-branding-css\";\nimport {\n HoveringEditorProvider,\n useHoveringEditorContext,\n} from \"../hovering-toolbar/hovering-editor-provider\";\nimport { EditorAutocompleteState } from \"../../types/base/editor-autocomplete-state\";\nimport { TrackerTextEditedSinceLastCursorMovement } from \"./track-cursor-moved-since-last-text-change\";\n\nexport interface HTMLCopilotTextAreaElement extends HTMLElement {\n value: string;\n focus: () => void;\n blur: () => void;\n}\n\nconst BaseCopilotTextareaWithHoveringContext = React.forwardRef(\n (\n props: BaseCopilotTextareaProps,\n ref: React.Ref<HTMLCopilotTextAreaElement>\n ): JSX.Element => {\n const autosuggestionsConfig: BaseAutosuggestionsConfig = {\n ...defaultBaseAutosuggestionsConfig,\n ...props.baseAutosuggestionsConfig,\n };\n\n const valueOnInitialRender = useMemo(() => props.value ?? \"\", []);\n const [lastKnownFullEditorText, setLastKnownFullEditorText] =\n useState(valueOnInitialRender);\n const [cursorMovedSinceLastTextChange, setCursorMovedSinceLastTextChange] =\n useState(false);\n\n // // When the editor text changes, we want to reset the `textEditedSinceLastCursorMovement` state.\n // useEffect(() => {\n // setCursorMovedSinceLastTextChange(false);\n // }, [lastKnownFullEditorText]);\n\n const initialValue: Descendant[] = useMemo(() => {\n return [\n {\n type: \"paragraph\",\n children: [{ text: valueOnInitialRender }],\n },\n ];\n }, [valueOnInitialRender]);\n\n const editor = useCopilotTextareaEditor();\n\n const {\n isDisplayed: hoveringEditorIsDisplayed,\n setIsDisplayed: setHoveringEditorIsDisplayed,\n } = useHoveringEditorContext();\n\n const insertText = useCallback(\n (autosuggestion: AutosuggestionState) => {\n Editor.insertText(editor, autosuggestion.text, {\n at: autosuggestion.point,\n });\n },\n [editor]\n );\n\n const {\n currentAutocompleteSuggestion,\n onChangeHandler: onChangeHandlerForAutocomplete,\n onKeyDownHandler: onKeyDownHandlerForAutocomplete,\n } = useAutosuggestions(\n autosuggestionsConfig.debounceTime,\n autosuggestionsConfig.acceptAutosuggestionKey,\n autosuggestionsConfig.apiConfig.autosuggestionsFunction,\n insertText,\n autosuggestionsConfig.disableWhenEmpty,\n autosuggestionsConfig.disabled ||\n hoveringEditorIsDisplayed || // disable autosuggestions when the hovering editor is displayed\n (cursorMovedSinceLastTextChange &&\n autosuggestionsConfig.temporarilyDisableWhenMovingCursorWithoutChangingText) // disable autosuggestions when the cursor has moved since the last text change\n );\n const onKeyDownHandlerForHoveringEditor = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n // if command-k, toggle the hovering editor\n if (event.key === \"k\" && event.metaKey) {\n event.preventDefault();\n setHoveringEditorIsDisplayed(!hoveringEditorIsDisplayed);\n }\n },\n [hoveringEditorIsDisplayed, setHoveringEditorIsDisplayed]\n );\n\n // sync autosuggestions state with the editor\n useEffect(() => {\n clearAutocompletionsFromEditor(editor);\n if (currentAutocompleteSuggestion) {\n addAutocompletionsToEditor(\n editor,\n currentAutocompleteSuggestion.text,\n currentAutocompleteSuggestion.point\n );\n }\n }, [currentAutocompleteSuggestion]);\n\n const suggestionStyleAugmented: React.CSSProperties = useMemo(() => {\n return {\n fontStyle: \"italic\",\n color: \"gray\",\n ...props.suggestionsStyle,\n };\n }, [props.suggestionsStyle]);\n\n const renderElementMemoized = useMemo(() => {\n return makeRenderElementFunction(suggestionStyleAugmented);\n }, [suggestionStyleAugmented]);\n\n const renderPlaceholderMemoized = useMemo(() => {\n // For some reason slateJS specifies a top value of 0, which makes for strange styling. We override this here.\n const placeholderStyleSlatejsOverrides: React.CSSProperties = {\n top: undefined,\n };\n\n const placeholderStyleAugmented: React.CSSProperties = {\n ...placeholderStyleSlatejsOverrides,\n ...props.placeholderStyle,\n };\n\n return makeRenderPlaceholderFunction(placeholderStyleAugmented);\n }, [props.placeholderStyle]);\n\n // update the editor text, but only when the value changes from outside the component\n useEffect(() => {\n if (props.value === lastKnownFullEditorText) {\n return;\n }\n\n setLastKnownFullEditorText(props.value ?? \"\");\n replaceEditorText(editor, props.value ?? \"\");\n }, [props.value]);\n\n // separate into TextareaHTMLAttributes<HTMLDivElement> and CopilotTextareaProps\n const {\n placeholderStyle,\n value,\n onValueChange,\n baseAutosuggestionsConfig: autosuggestionsConfigFromProps,\n className,\n onChange,\n onKeyDown,\n disableBranding,\n ...propsToForward\n } = props;\n\n useAddBrandingCss(suggestionStyleAugmented, disableBranding);\n usePopulateCopilotTextareaRef(editor, ref);\n\n const moddedClassName = (() => {\n const baseClassName = \"copilot-textarea\";\n const brandingClass = disableBranding ? \"no-branding\" : \"with-branding\";\n const defaultTailwindClassName = \"bg-white overflow-y-auto resize-y\";\n const mergedClassName = twMerge(\n defaultTailwindClassName,\n className ?? \"\"\n );\n return `${baseClassName} ${brandingClass} ${mergedClassName}`;\n })();\n\n return (\n <Slate\n editor={editor}\n initialValue={initialValue}\n onChange={(value) => {\n const newEditorState = getTextAroundCollapsedCursor(editor);\n\n const fullEditorText = newEditorState\n ? newEditorState.textBeforeCursor + newEditorState.textAfterCursor\n : getFullEditorTextWithNewlines(editor); // we don't double-parse the editor. When `newEditorState` is null, we didn't parse the editor yet.\n\n setLastKnownFullEditorText((prev) => {\n if (prev !== fullEditorText) {\n setCursorMovedSinceLastTextChange(false);\n }\n return fullEditorText;\n });\n onChangeHandlerForAutocomplete(newEditorState);\n\n props.onValueChange?.(fullEditorText);\n props.onChange?.(makeSemiFakeReactTextAreaEvent(fullEditorText));\n }}\n >\n <TrackerTextEditedSinceLastCursorMovement\n setCursorMovedSinceLastTextChange={setCursorMovedSinceLastTextChange}\n />\n <HoveringToolbar\n apiConfig={autosuggestionsConfig.apiConfig}\n contextCategories={autosuggestionsConfig.contextCategories}\n />\n <Editable\n renderElement={renderElementMemoized}\n renderPlaceholder={renderPlaceholderMemoized}\n onKeyDown={(event) => {\n onKeyDownHandlerForHoveringEditor(event); // forward the event for internal use\n onKeyDownHandlerForAutocomplete(event); // forward the event for internal use\n props.onKeyDown?.(event); // forward the event for external use\n }}\n className={moddedClassName}\n {...propsToForward}\n />\n </Slate>\n );\n }\n);\n\n// Consumers of <textarea> expect a `onChange: (React.ChangeEvent<HTMLTextAreaElement>) => void` event handler to be passed in.\n// This is *extremely* common, and we want to support it.\n//\n// We can't support the full functionality, but in 99% of cases, the consumer only cares about the `event.target.value` property --\n// that's how they get the new value of the textarea.\n//\n// So, the tradeoff we are making is minimizing compiler complaint, with a small chance of runtime error.\n// The alternative would be defining a different onChange entrypoint (we actually do have that in `onValueChange`),\n// And starting to explain subtleties to users the moment they try to use the component for the first time for very basic functionality.\n//\n// If this proves problematic, we can always revisit this decision.\nfunction makeSemiFakeReactTextAreaEvent(\n currentText: string\n): React.ChangeEvent<HTMLTextAreaElement> {\n return {\n target: {\n value: currentText,\n type: \"copilot-textarea\",\n },\n currentTarget: {\n value: currentText,\n type: \"copilot-textarea\",\n },\n } as React.ChangeEvent<HTMLTextAreaElement>;\n}\n\nexport const BaseCopilotTextarea = React.forwardRef(\n (\n props: BaseCopilotTextareaProps,\n ref: React.Ref<HTMLCopilotTextAreaElement>\n ): JSX.Element => {\n return (\n <HoveringEditorProvider>\n <BaseCopilotTextareaWithHoveringContext {...props} ref={ref} />\n </HoveringEditorProvider>\n );\n }\n);\n"]}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { use_autosize_textarea_default } from './chunk-ND5PXTAW.mjs';
|
|
2
|
+
import { Button } from './chunk-2NURR2DX.mjs';
|
|
3
|
+
import { Label } from './chunk-5EJ5XOGP.mjs';
|
|
4
|
+
import { SourceSearchBox } from './chunk-L6DZHWEL.mjs';
|
|
5
|
+
import { streamPromiseFlatten } from './chunk-FN7GDKKG.mjs';
|
|
6
|
+
import { __async } from './chunk-MRXNTQOX.mjs';
|
|
7
|
+
import { useContext, useState, useRef, useEffect } from 'react';
|
|
8
|
+
import Chip from '@mui/material/Chip';
|
|
9
|
+
import Avatar from '@mui/material/Avatar';
|
|
10
|
+
import { CopilotContext } from '@copilotkit/react-core';
|
|
11
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
12
|
+
|
|
13
|
+
var HoveringInsertionPromptBoxCore = ({
|
|
14
|
+
performInsertion,
|
|
15
|
+
state,
|
|
16
|
+
insertionOrEditingFunction,
|
|
17
|
+
contextCategories
|
|
18
|
+
}) => {
|
|
19
|
+
const { getDocumentsContext } = useContext(CopilotContext);
|
|
20
|
+
const [editSuggestion, setEditSuggestion] = useState("");
|
|
21
|
+
const [suggestionIsLoading, setSuggestionIsLoading] = useState(false);
|
|
22
|
+
const [adjustmentPrompt, setAdjustmentPrompt] = useState("");
|
|
23
|
+
const [generatingSuggestion, setGeneratingSuggestion] = useState(null);
|
|
24
|
+
const adjustmentTextAreaRef = useRef(null);
|
|
25
|
+
const suggestionTextAreaRef = useRef(null);
|
|
26
|
+
const [filePointers, setFilePointers] = useState([]);
|
|
27
|
+
const [suggestedFiles, setSuggestedFiles] = useState([]);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
setSuggestedFiles(getDocumentsContext(contextCategories));
|
|
30
|
+
}, [contextCategories, getDocumentsContext]);
|
|
31
|
+
use_autosize_textarea_default(suggestionTextAreaRef, editSuggestion || "");
|
|
32
|
+
use_autosize_textarea_default(adjustmentTextAreaRef, adjustmentPrompt || "");
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
var _a;
|
|
35
|
+
(_a = adjustmentTextAreaRef.current) == null ? void 0 : _a.focus();
|
|
36
|
+
}, []);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (!generatingSuggestion) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (generatingSuggestion.locked) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
setEditSuggestion("");
|
|
45
|
+
const reader = generatingSuggestion.getReader();
|
|
46
|
+
const read = () => __async(void 0, null, function* () {
|
|
47
|
+
setSuggestionIsLoading(true);
|
|
48
|
+
while (true) {
|
|
49
|
+
const { done, value } = yield reader.read();
|
|
50
|
+
if (done) {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
setEditSuggestion((prev) => {
|
|
54
|
+
const newSuggestion = prev + value;
|
|
55
|
+
if (suggestionTextAreaRef.current) {
|
|
56
|
+
suggestionTextAreaRef.current.scrollTop = suggestionTextAreaRef.current.scrollHeight;
|
|
57
|
+
}
|
|
58
|
+
return newSuggestion;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
setSuggestionIsLoading(false);
|
|
62
|
+
});
|
|
63
|
+
read();
|
|
64
|
+
return () => {
|
|
65
|
+
const releaseLockIfNotClosed = () => __async(void 0, null, function* () {
|
|
66
|
+
try {
|
|
67
|
+
yield reader.closed;
|
|
68
|
+
} catch (e) {
|
|
69
|
+
reader.releaseLock();
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
releaseLockIfNotClosed();
|
|
73
|
+
};
|
|
74
|
+
}, [generatingSuggestion]);
|
|
75
|
+
const begingGeneratingAdjustment = () => __async(void 0, null, function* () {
|
|
76
|
+
if (!adjustmentPrompt.trim()) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
let editorState = state.editorState;
|
|
80
|
+
if (editSuggestion !== "") {
|
|
81
|
+
editorState.selectedText = editSuggestion;
|
|
82
|
+
}
|
|
83
|
+
const adjustmentSuggestionTextStreamPromise = insertionOrEditingFunction(
|
|
84
|
+
editorState,
|
|
85
|
+
adjustmentPrompt,
|
|
86
|
+
new AbortController().signal
|
|
87
|
+
);
|
|
88
|
+
const adjustmentSuggestionTextStream = streamPromiseFlatten(
|
|
89
|
+
adjustmentSuggestionTextStreamPromise
|
|
90
|
+
);
|
|
91
|
+
setGeneratingSuggestion(adjustmentSuggestionTextStream);
|
|
92
|
+
});
|
|
93
|
+
const isLoading = suggestionIsLoading;
|
|
94
|
+
const textToEdit = editSuggestion || state.editorState.selectedText;
|
|
95
|
+
const adjustmentLabel = textToEdit === "" ? "Describe the text you want to insert" : "Describe adjustments to the suggested text";
|
|
96
|
+
const placeholder = textToEdit === "" ? "e.g. 'summarize the client's top 3 pain-points from @CallTranscript'" : "e.g. 'make it more formal', 'be more specific', ...";
|
|
97
|
+
const AdjustmentPromptComponent = /* @__PURE__ */ jsxs(Fragment, {
|
|
98
|
+
children: [
|
|
99
|
+
/* @__PURE__ */ jsx(Label, {
|
|
100
|
+
className: "",
|
|
101
|
+
children: adjustmentLabel
|
|
102
|
+
}),
|
|
103
|
+
/* @__PURE__ */ jsxs("div", {
|
|
104
|
+
className: "relative w-full flex items-center",
|
|
105
|
+
children: [
|
|
106
|
+
/* @__PURE__ */ jsx("textarea", {
|
|
107
|
+
disabled: suggestionIsLoading,
|
|
108
|
+
ref: adjustmentTextAreaRef,
|
|
109
|
+
value: adjustmentPrompt,
|
|
110
|
+
onChange: (e) => setAdjustmentPrompt(e.target.value),
|
|
111
|
+
onKeyDown: (e) => {
|
|
112
|
+
if (e.key === "Enter" && e.shiftKey) {
|
|
113
|
+
e.preventDefault();
|
|
114
|
+
setAdjustmentPrompt(adjustmentPrompt + "\n");
|
|
115
|
+
} else if (e.key === "Enter") {
|
|
116
|
+
e.preventDefault();
|
|
117
|
+
begingGeneratingAdjustment();
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
placeholder,
|
|
121
|
+
style: { minHeight: "3rem" },
|
|
122
|
+
className: "w-full bg-slate-100 h-auto h-min-14 text-sm p-2 rounded-md resize-none overflow-visible focus:outline-none focus:ring-0 focus:border-non pr-[3rem]",
|
|
123
|
+
rows: 1
|
|
124
|
+
}),
|
|
125
|
+
/* @__PURE__ */ jsx("button", {
|
|
126
|
+
onClick: begingGeneratingAdjustment,
|
|
127
|
+
className: "absolute right-2 bg-blue-500 text-white w-8 h-8 rounded-full flex items-center justify-center",
|
|
128
|
+
children: /* @__PURE__ */ jsx("i", {
|
|
129
|
+
className: "material-icons",
|
|
130
|
+
children: "arrow_forward"
|
|
131
|
+
})
|
|
132
|
+
})
|
|
133
|
+
]
|
|
134
|
+
})
|
|
135
|
+
]
|
|
136
|
+
});
|
|
137
|
+
const SuggestionComponent = /* @__PURE__ */ jsxs(Fragment, {
|
|
138
|
+
children: [
|
|
139
|
+
/* @__PURE__ */ jsxs("div", {
|
|
140
|
+
className: "flex justify-between items-end w-full",
|
|
141
|
+
children: [
|
|
142
|
+
/* @__PURE__ */ jsx(Label, {
|
|
143
|
+
className: "mt-4",
|
|
144
|
+
children: "Suggested:"
|
|
145
|
+
}),
|
|
146
|
+
/* @__PURE__ */ jsx("div", {
|
|
147
|
+
className: "ml-auto",
|
|
148
|
+
children: isLoading && /* @__PURE__ */ jsx("div", {
|
|
149
|
+
className: "flex justify-center items-center",
|
|
150
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
151
|
+
className: "inline-block h-4 w-4 animate-spin rounded-full border-4 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]",
|
|
152
|
+
role: "status",
|
|
153
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
154
|
+
className: "!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]",
|
|
155
|
+
children: "Loading..."
|
|
156
|
+
})
|
|
157
|
+
})
|
|
158
|
+
})
|
|
159
|
+
})
|
|
160
|
+
]
|
|
161
|
+
}),
|
|
162
|
+
/* @__PURE__ */ jsx("textarea", {
|
|
163
|
+
ref: suggestionTextAreaRef,
|
|
164
|
+
value: editSuggestion,
|
|
165
|
+
disabled: suggestionIsLoading,
|
|
166
|
+
onChange: (e) => setEditSuggestion(e.target.value),
|
|
167
|
+
className: "w-full text-base p-2 border border-gray-300 rounded-md resize-none bg-green-50",
|
|
168
|
+
style: { overflow: "auto", maxHeight: "10em" }
|
|
169
|
+
})
|
|
170
|
+
]
|
|
171
|
+
});
|
|
172
|
+
const SubmitComponent = /* @__PURE__ */ jsx("div", {
|
|
173
|
+
className: "flex w-full gap-4 justify-start",
|
|
174
|
+
children: /* @__PURE__ */ jsxs(Button, {
|
|
175
|
+
className: " bg-green-700 text-white",
|
|
176
|
+
onClick: () => {
|
|
177
|
+
performInsertion(editSuggestion);
|
|
178
|
+
},
|
|
179
|
+
children: [
|
|
180
|
+
"Insert ",
|
|
181
|
+
/* @__PURE__ */ jsx("i", {
|
|
182
|
+
className: "material-icons",
|
|
183
|
+
children: "check"
|
|
184
|
+
})
|
|
185
|
+
]
|
|
186
|
+
})
|
|
187
|
+
});
|
|
188
|
+
const sourceSearchCandidate = adjustmentPrompt.split(" ").pop();
|
|
189
|
+
const sourceSearchWord = (sourceSearchCandidate == null ? void 0 : sourceSearchCandidate.startsWith("@")) ? sourceSearchCandidate.slice(1) : void 0;
|
|
190
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
191
|
+
className: "w-full flex flex-col items-start relative gap-2",
|
|
192
|
+
children: [
|
|
193
|
+
AdjustmentPromptComponent,
|
|
194
|
+
filePointers.length > 0 && /* @__PURE__ */ jsx(IncludedFilesPreview, {
|
|
195
|
+
includedFiles: filePointers,
|
|
196
|
+
setIncludedFiles: setFilePointers
|
|
197
|
+
}),
|
|
198
|
+
sourceSearchWord !== void 0 && /* @__PURE__ */ jsx(SourceSearchBox, {
|
|
199
|
+
searchTerm: sourceSearchWord,
|
|
200
|
+
suggestedFiles,
|
|
201
|
+
onSelectedFile: (filePointer) => {
|
|
202
|
+
var _a;
|
|
203
|
+
setAdjustmentPrompt(
|
|
204
|
+
adjustmentPrompt.replace(new RegExp(`@${sourceSearchWord}$`), "")
|
|
205
|
+
);
|
|
206
|
+
setFilePointers((prev) => [...prev, filePointer]);
|
|
207
|
+
(_a = adjustmentTextAreaRef.current) == null ? void 0 : _a.focus();
|
|
208
|
+
}
|
|
209
|
+
}),
|
|
210
|
+
generatingSuggestion ? SuggestionComponent : null,
|
|
211
|
+
generatingSuggestion ? SubmitComponent : null
|
|
212
|
+
]
|
|
213
|
+
});
|
|
214
|
+
};
|
|
215
|
+
var IncludedFilesPreview = ({
|
|
216
|
+
includedFiles,
|
|
217
|
+
setIncludedFiles
|
|
218
|
+
}) => {
|
|
219
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
220
|
+
className: "flex flex-col gap-2 mt-2",
|
|
221
|
+
children: [
|
|
222
|
+
/* @__PURE__ */ jsx(Label, {
|
|
223
|
+
className: "",
|
|
224
|
+
children: "Included context:"
|
|
225
|
+
}),
|
|
226
|
+
/* @__PURE__ */ jsx("div", {
|
|
227
|
+
className: "flex flex-wrap gap-2",
|
|
228
|
+
children: includedFiles.map((filePointer, index) => {
|
|
229
|
+
return /* @__PURE__ */ jsx(FileChipPreview, {
|
|
230
|
+
filePointer,
|
|
231
|
+
onDelete: () => {
|
|
232
|
+
setIncludedFiles(
|
|
233
|
+
(prev) => prev.filter((fp) => fp !== filePointer)
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
}, `file-${filePointer.sourceApplication}.${filePointer.name}`);
|
|
237
|
+
})
|
|
238
|
+
})
|
|
239
|
+
]
|
|
240
|
+
});
|
|
241
|
+
};
|
|
242
|
+
var FileChipPreview = ({
|
|
243
|
+
filePointer,
|
|
244
|
+
onDelete
|
|
245
|
+
}) => {
|
|
246
|
+
return /* @__PURE__ */ jsx(Chip, {
|
|
247
|
+
label: filePointer.name,
|
|
248
|
+
onDelete,
|
|
249
|
+
avatar: /* @__PURE__ */ jsx(Avatar, {
|
|
250
|
+
sx: { backgroundColor: "transparent" }
|
|
251
|
+
})
|
|
252
|
+
});
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
export { FileChipPreview, HoveringInsertionPromptBoxCore, IncludedFilesPreview };
|
|
256
|
+
//# sourceMappingURL=out.js.map
|
|
257
|
+
//# sourceMappingURL=chunk-47JRPWI3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.tsx"],"names":[],"mappings":"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","sourcesContent":["import useAutosizeTextArea from \"../../../hooks/misc/use-autosize-textarea\";\nimport { MinimalChatGPTMessage } from \"../../../types\";\nimport {\n EditingEditorState,\n Generator_InsertionOrEditingSuggestion,\n} from \"../../../types/base/autosuggestions-bare-function\";\nimport { SourceSearchBox } from \"../../source-search-box/source-search-box\";\nimport { DocumentPointer } from \"@copilotkit/react-core\";\nimport { Button } from \"../../ui/button\";\nimport { Label } from \"../../ui/label\";\nimport React, { useContext, useEffect, useRef, useState } from \"react\";\n\nimport Chip from \"@mui/material/Chip\";\nimport Avatar from \"@mui/material/Avatar\";\nimport { streamPromiseFlatten } from \"../../../lib/stream-promise-flatten\";\nimport { CopilotContext } from \"@copilotkit/react-core\";\n\nexport type SuggestionState = {\n editorState: EditingEditorState;\n};\n\nexport interface HoveringInsertionPromptBoxCoreProps {\n state: SuggestionState;\n performInsertion: (insertedText: string) => void;\n insertionOrEditingFunction: Generator_InsertionOrEditingSuggestion;\n contextCategories: string[];\n}\n\nexport const HoveringInsertionPromptBoxCore: React.FC<\n HoveringInsertionPromptBoxCoreProps\n> = ({\n performInsertion,\n state,\n insertionOrEditingFunction,\n contextCategories,\n}) => {\n const { getDocumentsContext } = useContext(CopilotContext);\n\n const [editSuggestion, setEditSuggestion] = useState<string>(\"\");\n const [suggestionIsLoading, setSuggestionIsLoading] =\n useState<boolean>(false);\n\n const [adjustmentPrompt, setAdjustmentPrompt] = useState<string>(\"\");\n\n const [generatingSuggestion, setGeneratingSuggestion] =\n useState<ReadableStream<string> | null>(null);\n\n const adjustmentTextAreaRef = useRef<HTMLTextAreaElement>(null);\n const suggestionTextAreaRef = useRef<HTMLTextAreaElement>(null);\n\n const [filePointers, setFilePointers] = useState<DocumentPointer[]>([]);\n\n const [suggestedFiles, setSuggestedFiles] = useState<DocumentPointer[]>([]);\n useEffect(() => {\n setSuggestedFiles(getDocumentsContext(contextCategories));\n }, [contextCategories, getDocumentsContext]);\n\n useAutosizeTextArea(suggestionTextAreaRef, editSuggestion || \"\");\n useAutosizeTextArea(adjustmentTextAreaRef, adjustmentPrompt || \"\");\n\n // initially focus on the adjustment prompt text area\n useEffect(() => {\n adjustmentTextAreaRef.current?.focus();\n }, []);\n\n // continuously read the generating suggestion stream and update the edit suggestion\n useEffect(() => {\n // if no generating suggestion, do nothing\n if (!generatingSuggestion) {\n return;\n }\n\n // Check if the stream is already locked (i.e. already reading from it)\n if (generatingSuggestion.locked) {\n return;\n }\n\n // reset the edit suggestion\n setEditSuggestion(\"\");\n\n // read the generating suggestion stream and continuously update the edit suggestion\n const reader = generatingSuggestion.getReader();\n\n const read = async () => {\n setSuggestionIsLoading(true);\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n setEditSuggestion((prev) => {\n const newSuggestion = prev + value;\n\n // Scroll to the bottom of the textarea. We call this here to make sure scroll-to-bottom is synchronous with the state update.\n if (suggestionTextAreaRef.current) {\n suggestionTextAreaRef.current.scrollTop =\n suggestionTextAreaRef.current.scrollHeight;\n }\n return newSuggestion;\n });\n }\n\n setSuggestionIsLoading(false);\n };\n read();\n\n return () => {\n const releaseLockIfNotClosed = async () => {\n try {\n await reader.closed;\n } catch {\n reader.releaseLock();\n }\n };\n\n releaseLockIfNotClosed();\n };\n }, [generatingSuggestion]);\n\n // when the adjustment prompt changes, reset the edit suggestion\n const begingGeneratingAdjustment = async () => {\n // don't generate text if the prompt is empty\n if (!adjustmentPrompt.trim()) {\n return;\n }\n\n // if the current edit suggestion is not empty, then use it as the selected text instead of the editor state's selected text\n let editorState = state.editorState;\n if (editSuggestion !== \"\") {\n editorState.selectedText = editSuggestion;\n }\n\n const adjustmentSuggestionTextStreamPromise = insertionOrEditingFunction(\n editorState,\n adjustmentPrompt,\n new AbortController().signal\n );\n const adjustmentSuggestionTextStream = streamPromiseFlatten(\n adjustmentSuggestionTextStreamPromise\n );\n\n setGeneratingSuggestion(adjustmentSuggestionTextStream);\n };\n\n const isLoading = suggestionIsLoading;\n\n const textToEdit = editSuggestion || state.editorState.selectedText;\n const adjustmentLabel =\n textToEdit === \"\"\n ? \"Describe the text you want to insert\"\n : \"Describe adjustments to the suggested text\";\n const placeholder =\n textToEdit === \"\"\n ? \"e.g. 'summarize the client's top 3 pain-points from @CallTranscript'\"\n : \"e.g. 'make it more formal', 'be more specific', ...\";\n\n const AdjustmentPromptComponent = (\n <>\n <Label className=\"\">{adjustmentLabel}</Label>\n <div className=\"relative w-full flex items-center\">\n <textarea\n disabled={suggestionIsLoading}\n ref={adjustmentTextAreaRef}\n value={adjustmentPrompt}\n onChange={(e) => setAdjustmentPrompt(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && e.shiftKey) {\n e.preventDefault();\n setAdjustmentPrompt(adjustmentPrompt + \"\\n\");\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n begingGeneratingAdjustment();\n }\n }}\n placeholder={placeholder}\n style={{ minHeight: \"3rem\" }}\n className=\"w-full bg-slate-100 h-auto h-min-14 text-sm p-2 rounded-md resize-none overflow-visible focus:outline-none focus:ring-0 focus:border-non pr-[3rem]\"\n rows={1}\n />\n <button\n onClick={begingGeneratingAdjustment}\n className=\"absolute right-2 bg-blue-500 text-white w-8 h-8 rounded-full flex items-center justify-center\"\n >\n <i className=\"material-icons\">arrow_forward</i>\n </button>\n </div>\n </>\n );\n\n const SuggestionComponent = (\n <>\n <div className=\"flex justify-between items-end w-full\">\n <Label className=\"mt-4\">Suggested:</Label>\n <div className=\"ml-auto\">\n {isLoading && (\n <div className=\"flex justify-center items-center\">\n <div\n className=\"inline-block h-4 w-4 animate-spin rounded-full border-4 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]\"\n role=\"status\"\n >\n <span className=\"!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]\">\n Loading...\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n <textarea\n ref={suggestionTextAreaRef}\n value={editSuggestion}\n disabled={suggestionIsLoading}\n onChange={(e) => setEditSuggestion(e.target.value)}\n className=\"w-full text-base p-2 border border-gray-300 rounded-md resize-none bg-green-50\"\n style={{ overflow: \"auto\", maxHeight: \"10em\" }}\n />\n </>\n );\n\n const SubmitComponent = (\n <div className=\"flex w-full gap-4 justify-start\">\n <Button\n className=\" bg-green-700 text-white\"\n onClick={() => {\n performInsertion(editSuggestion);\n }}\n >\n Insert <i className=\"material-icons\">check</i>\n </Button>\n </div>\n );\n\n // show source search if the last word in the adjustment prompt BEGINS with an @\n const sourceSearchCandidate = adjustmentPrompt.split(\" \").pop();\n // if the candidate is @someCandidate, then 'someCandidate', otherwise undefined\n const sourceSearchWord = sourceSearchCandidate?.startsWith(\"@\")\n ? sourceSearchCandidate.slice(1)\n : undefined;\n\n return (\n <div className=\"w-full flex flex-col items-start relative gap-2\">\n {AdjustmentPromptComponent}\n {filePointers.length > 0 && (\n <IncludedFilesPreview\n includedFiles={filePointers}\n setIncludedFiles={setFilePointers}\n />\n )}\n {sourceSearchWord !== undefined && (\n <SourceSearchBox\n searchTerm={sourceSearchWord}\n suggestedFiles={suggestedFiles}\n onSelectedFile={(filePointer) => {\n setAdjustmentPrompt(\n adjustmentPrompt.replace(new RegExp(`@${sourceSearchWord}$`), \"\")\n );\n setFilePointers((prev) => [...prev, filePointer]);\n\n // focus back on the adjustment prompt, and move the cursor to the end\n adjustmentTextAreaRef.current?.focus();\n }}\n />\n )}\n {generatingSuggestion ? SuggestionComponent : null}\n {generatingSuggestion ? SubmitComponent : null}\n </div>\n );\n};\n\ninterface IncludedFilesPreviewProps {\n includedFiles: DocumentPointer[];\n setIncludedFiles: React.Dispatch<React.SetStateAction<DocumentPointer[]>>;\n}\n\nexport const IncludedFilesPreview: React.FC<IncludedFilesPreviewProps> = ({\n includedFiles,\n setIncludedFiles,\n}) => {\n return (\n <div className=\"flex flex-col gap-2 mt-2\">\n <Label className=\"\">Included context:</Label>\n <div className=\"flex flex-wrap gap-2\">\n {includedFiles.map((filePointer, index) => {\n return (\n <FileChipPreview\n key={`file-${filePointer.sourceApplication}.${filePointer.name}`}\n filePointer={filePointer}\n onDelete={() => {\n setIncludedFiles((prev) =>\n prev.filter((fp) => fp !== filePointer)\n );\n }}\n />\n );\n })}\n </div>\n </div>\n );\n};\n\nexport interface FileChipPreviewProp {\n filePointer: DocumentPointer;\n onDelete: () => void;\n}\n\nexport const FileChipPreview: React.FC<FileChipPreviewProp> = ({\n filePointer,\n onDelete,\n}) => {\n return (\n <Chip\n label={filePointer.name}\n onDelete={onDelete}\n avatar={<Avatar sx={{ backgroundColor: \"transparent\" }}></Avatar>}\n />\n );\n};\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// src/lib/retry.tsx
|
|
2
|
+
function retry(fn, retriesLeft = 2, interval = 200, backoff = 1.5) {
|
|
3
|
+
return new Promise((resolve, reject) => {
|
|
4
|
+
fn().then(resolve).catch((error) => {
|
|
5
|
+
if (retriesLeft === 1) {
|
|
6
|
+
reject(error);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
setTimeout(() => {
|
|
10
|
+
retry(fn, retriesLeft - 1, interval * backoff, backoff).then(resolve).catch(reject);
|
|
11
|
+
}, interval);
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { retry };
|
|
17
|
+
//# sourceMappingURL=out.js.map
|
|
18
|
+
//# sourceMappingURL=chunk-4S5ZJH3I.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/retry.tsx"],"names":[],"mappings":";AAAO,SAAS,MACd,IACA,cAAsB,GACtB,WAAmB,KACnB,UAAkB,KACN;AACZ,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,OAAG,EACA,KAAK,OAAO,EACZ,MAAM,CAAC,UAAU;AAChB,UAAI,gBAAgB,GAAG;AACrB,eAAO,KAAK;AACZ;AAAA,MACF;AAEA,iBAAW,MAAM;AACf,cAAM,IAAI,cAAc,GAAG,WAAW,SAAS,OAAO,EACnD,KAAK,OAAO,EACZ,MAAM,MAAM;AAAA,MACjB,GAAG,QAAQ;AAAA,IACb,CAAC;AAAA,EACL,CAAC;AACH","sourcesContent":["export function retry<T>(\n fn: () => Promise<T>,\n retriesLeft: number = 2,\n interval: number = 200,\n backoff: number = 1.5\n): Promise<T> {\n return new Promise((resolve, reject) => {\n fn()\n .then(resolve)\n .catch((error) => {\n if (retriesLeft === 1) {\n reject(error);\n return;\n }\n\n setTimeout(() => {\n retry(fn, retriesLeft - 1, interval * backoff, backoff)\n .then(resolve)\n .catch(reject);\n }, interval);\n });\n });\n}\n"]}
|