@super_studio/ecforce-ai-agent-react 0.5.1 → 0.5.3

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.
@@ -2,6 +2,8 @@ import type { MCP } from "./provider/use-chatbot-frame-handler";
2
2
  export type ChatbotFrameProps = {
3
3
  /** 管理画面上のエージェントID */
4
4
  agentId: string;
5
+ /** 初期化時のチャットID */
6
+ initialChatId?: string;
5
7
  /** エージェントにつなげるMCPの情報 */
6
8
  mcps?: MCP[];
7
9
  /** アプリ名のメタデータ */
@@ -27,7 +29,7 @@ export type ChatbotFrameProps = {
27
29
  url?: string;
28
30
  className?: string;
29
31
  };
30
- export declare function ChatbotFrame({ agentId, appName, mcps, getSession, enabled, url, className, }: ChatbotFrameProps): import("react/jsx-runtime").JSX.Element;
32
+ export declare function ChatbotFrame({ agentId, appName, initialChatId, mcps, getSession, enabled, url, className, }: ChatbotFrameProps): import("react/jsx-runtime").JSX.Element;
31
33
  export type SessionData = {
32
34
  sessionId: string;
33
35
  token: string;
@@ -1 +1 @@
1
- {"version":3,"file":"chatbot-frame.d.ts","sourceRoot":"","sources":["../../src/components/chatbot-frame.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,sCAAsC,CAAC;AAEhE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,iBAAiB;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,OAAO,EACP,IAAI,EACJ,UAAU,EACV,OAAc,EACd,GAAG,EACH,SAAS,GACV,EAAE,iBAAiB,2CA4EnB;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;CACzC,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE,eAAe,sBAuCzD"}
1
+ {"version":3,"file":"chatbot-frame.d.ts","sourceRoot":"","sources":["../../src/components/chatbot-frame.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,sCAAsC,CAAC;AAEhE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,iBAAiB;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,OAAO,EACP,aAAa,EACb,IAAI,EACJ,UAAU,EACV,OAAc,EACd,GAAG,EACH,SAAS,GACV,EAAE,iBAAiB,2CAgFnB;AAoBD,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;CACzC,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE,eAAe,sBAuCzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"chatbot-sheet.d.ts","sourceRoot":"","sources":["../../src/components/chatbot-sheet.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAUvE,KAAK,iBAAiB,GAAG,iBAAiB,GAAG;IAC3C,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAClC,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,2CAoBvE"}
1
+ {"version":3,"file":"chatbot-sheet.d.ts","sourceRoot":"","sources":["../../src/components/chatbot-sheet.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAWvE,KAAK,iBAAiB,GAAG,iBAAiB,GAAG;IAC3C,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAClC,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,2CA0BvE"}
@@ -0,0 +1,13 @@
1
+ import * as React from "react";
2
+ type LottieAiIconProps = {
3
+ src: string;
4
+ width?: number;
5
+ height?: number;
6
+ loop?: boolean;
7
+ autoplay?: boolean;
8
+ hover?: boolean;
9
+ fallback?: React.ReactNode;
10
+ };
11
+ export declare function LottieAiIcon({ src, width, height, loop, autoplay, hover, fallback, }: LottieAiIconProps): import("react/jsx-runtime").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=lottie-ai-icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lottie-ai-icon.d.ts","sourceRoot":"","sources":["../../src/components/lottie-ai-icon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,KAAK,iBAAiB,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,GAAG,EACH,KAAU,EACV,MAAW,EACX,IAAW,EACX,QAAgB,EAChB,KAAa,EACb,QAAQ,GACT,EAAE,iBAAiB,2CAoDnB"}
@@ -35,4 +35,4 @@ type ChatbotProviderProps = {
35
35
  };
36
36
  export declare function ChatbotProvider({ children }: ChatbotProviderProps): import("react/jsx-runtime").JSX.Element;
37
37
  export {};
38
- //# sourceMappingURL=chatbot-proivder.d.ts.map
38
+ //# sourceMappingURL=chatbot-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatbot-proivder.d.ts","sourceRoot":"","sources":["../../../src/components/provider/chatbot-proivder.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,GAAG,EACT,MAAM,6BAA6B,CAAC;AAGrC,KAAK,kBAAkB,GAAG;IACxB,gCAAgC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,iBAAiB;IACjB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,sBAAsB;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,mBAAmB;IACnB,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,kBAAkB;IAClB,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACjC,aAAa;IACb,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC/B,cAAc;IACd,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mBAAmB;IACnB,eAAe,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3D,CAAC;AAMF,wBAAgB,UAAU,uBAMzB;AAED,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAkCjE"}
1
+ {"version":3,"file":"chatbot-provider.d.ts","sourceRoot":"","sources":["../../../src/components/provider/chatbot-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,GAAG,EACT,MAAM,6BAA6B,CAAC;AAGrC,KAAK,kBAAkB,GAAG;IACxB,gCAAgC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,iBAAiB;IACjB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,sBAAsB;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,mBAAmB;IACnB,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,kBAAkB;IAClB,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACjC,aAAa;IACb,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC/B,cAAc;IACd,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mBAAmB;IACnB,eAAe,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3D,CAAC;AAMF,wBAAgB,UAAU,uBAMzB;AAED,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAkCjE"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from "./components/provider/chatbot-proivder";
1
+ export * from "./components/provider/chatbot-provider";
2
2
  export * from "./components/chatbot-frame";
3
3
  export * from "./components/chatbot-sheet";
4
4
  export * from "./components/sheet";
package/dist/index.js CHANGED
@@ -31,8 +31,8 @@ var __objRest = (source, exclude) => {
31
31
  return target;
32
32
  };
33
33
 
34
- // src/components/provider/chatbot-proivder.tsx
35
- var _react = require('react'); var React5 = _interopRequireWildcard(_react);
34
+ // src/components/provider/chatbot-provider.tsx
35
+ var _react = require('react'); var React5 = _interopRequireWildcard(_react); var React6 = _interopRequireWildcard(_react);
36
36
 
37
37
  // src/components/provider/use-chatbot-frame-handler.tsx
38
38
 
@@ -144,7 +144,7 @@ function useChatbotWindowStates() {
144
144
  return { hasOpened, open, isExpanded, setOpen, setIsExpanded };
145
145
  }
146
146
 
147
- // src/components/provider/chatbot-proivder.tsx
147
+ // src/components/provider/chatbot-provider.tsx
148
148
  var _jsxruntime = require('react/jsx-runtime');
149
149
  var ChatbotContext = React5.default.createContext(
150
150
  void 0
@@ -191,13 +191,14 @@ function ChatbotProvider({ children }) {
191
191
 
192
192
 
193
193
  // src/lib/constants.ts
194
- var PROD_CHATBOT_URL = "https://ecforce-ai-agent.vercel.app";
194
+ var PROD_CHATBOT_URL = "https://agent.ec-force.com";
195
195
 
196
196
  // src/components/chatbot-frame.tsx
197
197
 
198
198
  function ChatbotFrame({
199
199
  agentId,
200
200
  appName,
201
+ initialChatId,
201
202
  mcps,
202
203
  getSession,
203
204
  enabled = true,
@@ -205,7 +206,7 @@ function ChatbotFrame({
205
206
  className
206
207
  }) {
207
208
  var _a;
208
- const chatbotUrl = (_a = url != null ? url : process.env.CHATBOT_URL) != null ? _a : PROD_CHATBOT_URL;
209
+ const baseUrl = (_a = url != null ? url : process.env.CHATBOT_URL) != null ? _a : PROD_CHATBOT_URL;
209
210
  const { setIframeEl } = useChatbot();
210
211
  const { init, setMcps, setAppName, setSessionToken, isReady } = useChatbot();
211
212
  const sentInitRef = React5.default.useRef(false);
@@ -250,7 +251,11 @@ function ChatbotFrame({
250
251
  "iframe",
251
252
  {
252
253
  ref: setIframeEl,
253
- src: `${chatbotUrl}/embed/${agentId}`,
254
+ src: buildIframeUrl({
255
+ baseUrl,
256
+ agentId,
257
+ initialChatId
258
+ }),
254
259
  className,
255
260
  allow: "clipboard-write",
256
261
  style: {
@@ -260,6 +265,17 @@ function ChatbotFrame({
260
265
  }
261
266
  );
262
267
  }
268
+ function buildIframeUrl({
269
+ baseUrl,
270
+ agentId,
271
+ initialChatId
272
+ }) {
273
+ const url = new URL(`/embed/${agentId}`, baseUrl);
274
+ if (initialChatId) {
275
+ url.searchParams.set("initialChatId", initialChatId);
276
+ }
277
+ return url.toString();
278
+ }
263
279
  function useSession({ getSession }) {
264
280
  const { setSessionToken } = useChatbot();
265
281
  const [session, setSession] = React5.default.useState();
@@ -294,6 +310,62 @@ function useSession({ getSession }) {
294
310
  // src/components/chatbot-sheet.tsx
295
311
 
296
312
 
313
+ // src/components/lottie-ai-icon.tsx
314
+
315
+
316
+ function LottieAiIcon({
317
+ src,
318
+ width = 18,
319
+ height = 18,
320
+ loop = true,
321
+ autoplay = false,
322
+ hover = false,
323
+ fallback
324
+ }) {
325
+ const containerRef = React5.useRef(null);
326
+ const [ready, setReady] = React5.useState(false);
327
+ React5.useEffect(() => {
328
+ if (typeof window === "undefined") return;
329
+ const existing = document.querySelector("script[data-dotlottie-player]");
330
+ if (!existing) {
331
+ const scriptEl = document.createElement("script");
332
+ scriptEl.type = "module";
333
+ scriptEl.async = true;
334
+ scriptEl.src = "https://unpkg.com/@dotlottie/player-component@latest/dist/dotlottie-player.js";
335
+ scriptEl.setAttribute("data-dotlottie-player", "true");
336
+ scriptEl.onload = () => setReady(true);
337
+ scriptEl.onerror = () => setReady(false);
338
+ document.head.appendChild(scriptEl);
339
+ } else {
340
+ setReady(true);
341
+ }
342
+ }, []);
343
+ React5.useEffect(() => {
344
+ if (!ready || !containerRef.current) return;
345
+ const container = containerRef.current;
346
+ container.innerHTML = "";
347
+ const player = document.createElement("dotlottie-player");
348
+ player.setAttribute("src", src);
349
+ player.setAttribute("style", `width:${width}px;height:${height}px`);
350
+ if (loop) player.setAttribute("loop", "");
351
+ if (autoplay) player.setAttribute("autoplay", "");
352
+ if (hover) player.setAttribute("hover", "");
353
+ container.appendChild(player);
354
+ return () => {
355
+ container.innerHTML = "";
356
+ };
357
+ }, [ready, src, width, height, loop, autoplay, hover]);
358
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref: containerRef, "aria-hidden": "true", children: !ready && (fallback != null ? fallback : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
359
+ "svg",
360
+ {
361
+ width,
362
+ height,
363
+ viewBox: "0 0 24 24",
364
+ fill: "currentColor"
365
+ }
366
+ )) });
367
+ }
368
+
297
369
  // src/components/sheet.tsx
298
370
  var _reactdialog = require('@radix-ui/react-dialog'); var SheetPrimitive = _interopRequireWildcard(_reactdialog);
299
371
 
@@ -311,7 +383,7 @@ function Sheet(_a) {
311
383
  }, props)
312
384
  );
313
385
  }
314
- var SheetTrigger = React5.forwardRef((_a, ref) => {
386
+ var SheetTrigger = React6.forwardRef((_a, ref) => {
315
387
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
316
388
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
317
389
  SheetPrimitive.Trigger,
@@ -323,7 +395,7 @@ var SheetTrigger = React5.forwardRef((_a, ref) => {
323
395
  );
324
396
  });
325
397
  SheetTrigger.displayName = SheetPrimitive.Trigger.displayName;
326
- var SheetClose = React5.forwardRef((_a, ref) => {
398
+ var SheetClose = React6.forwardRef((_a, ref) => {
327
399
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
328
400
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
329
401
  SheetPrimitive.Close,
@@ -339,7 +411,7 @@ function SheetPortal(_a) {
339
411
  var props = __objRest(_a, []);
340
412
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SheetPrimitive.Portal, __spreadValues({ "data-slot": "sheet-portal" }, props));
341
413
  }
342
- var SheetContent = React5.forwardRef((_a, ref) => {
414
+ var SheetContent = React6.forwardRef((_a, ref) => {
343
415
  var _b = _a, { className, children, style } = _b, props = __objRest(_b, ["className", "children", "style"]);
344
416
  const { isExpanded, open, hasOpened } = useChatbot();
345
417
  const width = isExpanded ? "848px" : "400px";
@@ -363,7 +435,7 @@ var SheetContent = React5.forwardRef((_a, ref) => {
363
435
  ) });
364
436
  });
365
437
  SheetContent.displayName = SheetPrimitive.Content.displayName;
366
- var SheetHeader = React5.forwardRef((_a, ref) => {
438
+ var SheetHeader = React6.forwardRef((_a, ref) => {
367
439
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
368
440
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
369
441
  "div",
@@ -375,7 +447,7 @@ var SheetHeader = React5.forwardRef((_a, ref) => {
375
447
  );
376
448
  });
377
449
  SheetHeader.displayName = "SheetHeader";
378
- var SheetFooter = React5.forwardRef((_a, ref) => {
450
+ var SheetFooter = React6.forwardRef((_a, ref) => {
379
451
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
380
452
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
381
453
  "div",
@@ -387,7 +459,7 @@ var SheetFooter = React5.forwardRef((_a, ref) => {
387
459
  );
388
460
  });
389
461
  SheetFooter.displayName = "SheetFooter";
390
- var SheetTitle = React5.forwardRef((_a, ref) => {
462
+ var SheetTitle = React6.forwardRef((_a, ref) => {
391
463
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
392
464
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
393
465
  SheetPrimitive.Title,
@@ -399,7 +471,7 @@ var SheetTitle = React5.forwardRef((_a, ref) => {
399
471
  );
400
472
  });
401
473
  SheetTitle.displayName = SheetPrimitive.Title.displayName;
402
- var SheetDescription = React5.forwardRef((_a, ref) => {
474
+ var SheetDescription = React6.forwardRef((_a, ref) => {
403
475
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
404
476
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
405
477
  SheetPrimitive.Description,
@@ -486,7 +558,16 @@ function ChatbotSheet(_a) {
486
558
  side: "top",
487
559
  align: "end",
488
560
  content: "AI\u306B\u8CEA\u554F\u3057\u3066\u307F\u307E\u3057\u3087\u3046",
489
- trigger: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SheetTrigger, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, EcforceAiIcon, {}) })
561
+ trigger: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SheetTrigger, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
562
+ LottieAiIcon,
563
+ {
564
+ src: `${PROD_CHATBOT_URL}/animations/ai-icon.v1.lottie`,
565
+ width: 20,
566
+ height: 20,
567
+ autoplay: true,
568
+ loop: true
569
+ }
570
+ ) })
490
571
  }
491
572
  ),
492
573
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, SheetContent, { style: sheetStyle, children: [
@@ -496,26 +577,6 @@ function ChatbotSheet(_a) {
496
577
  ] })
497
578
  ] });
498
579
  }
499
- function EcforceAiIcon() {
500
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
501
- "svg",
502
- {
503
- width: "18",
504
- height: "18",
505
- viewBox: "0 0 24 24",
506
- xmlns: "http://www.w3.org/2000/svg",
507
- fill: "currentColor",
508
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
509
- "path",
510
- {
511
- fillRule: "evenodd",
512
- clipRule: "evenodd",
513
- d: "M9.2 13.704s3.7-.812 4.325-3.74c.624-2.93.76-3.364 1.112-3.364.352 0 .42.309.5.618.08.309.51 2.276.613 2.745.102.47.783 2.93 3.712 3.616 2.93.686 3.338.697 3.338 1.12 0 .459-2.361.859-3.338 1.122-.976.263-3.042 1.007-3.587 3.49-.534 2.482-.681 3.489-1.238 3.489-.556 0-.545-.584-.613-.87-.068-.286-.34-1.819-.5-2.494-.147-.675-1.044-2.837-2.962-3.363-1.93-.527-3.962-.847-3.962-1.373s2.134-.824 2.6-.995ZM2.462 4.613s1.785-.39 2.08-1.798c.296-1.409.365-1.615.535-1.615.17 0 .205.149.239.298s.25 1.088.296 1.317c.045.229.375 1.409 1.785 1.74 1.41.333 1.603.333 1.603.54 0 .217-1.137.412-1.603.538-.466.126-1.467.48-1.729 1.683C5.407 8.507 5.338 9 5.078 9c-.262 0-.262-.286-.296-.424-.035-.137-.16-.882-.24-1.202-.079-.321-.5-1.363-1.432-1.615-.932-.252-1.91-.413-1.91-.665 0-.252 1.023-.4 1.25-.48h.012Z"
514
- }
515
- )
516
- }
517
- );
518
- }
519
580
 
520
581
 
521
582
 
package/dist/index.mjs CHANGED
@@ -31,7 +31,7 @@ var __objRest = (source, exclude) => {
31
31
  return target;
32
32
  };
33
33
 
34
- // src/components/provider/chatbot-proivder.tsx
34
+ // src/components/provider/chatbot-provider.tsx
35
35
  import React3 from "react";
36
36
 
37
37
  // src/components/provider/use-chatbot-frame-handler.tsx
@@ -144,7 +144,7 @@ function useChatbotWindowStates() {
144
144
  return { hasOpened, open, isExpanded, setOpen, setIsExpanded };
145
145
  }
146
146
 
147
- // src/components/provider/chatbot-proivder.tsx
147
+ // src/components/provider/chatbot-provider.tsx
148
148
  import { jsx } from "react/jsx-runtime";
149
149
  var ChatbotContext = React3.createContext(
150
150
  void 0
@@ -191,13 +191,14 @@ function ChatbotProvider({ children }) {
191
191
  import React4 from "react";
192
192
 
193
193
  // src/lib/constants.ts
194
- var PROD_CHATBOT_URL = "https://ecforce-ai-agent.vercel.app";
194
+ var PROD_CHATBOT_URL = "https://agent.ec-force.com";
195
195
 
196
196
  // src/components/chatbot-frame.tsx
197
197
  import { jsx as jsx2 } from "react/jsx-runtime";
198
198
  function ChatbotFrame({
199
199
  agentId,
200
200
  appName,
201
+ initialChatId,
201
202
  mcps,
202
203
  getSession,
203
204
  enabled = true,
@@ -205,7 +206,7 @@ function ChatbotFrame({
205
206
  className
206
207
  }) {
207
208
  var _a;
208
- const chatbotUrl = (_a = url != null ? url : process.env.CHATBOT_URL) != null ? _a : PROD_CHATBOT_URL;
209
+ const baseUrl = (_a = url != null ? url : process.env.CHATBOT_URL) != null ? _a : PROD_CHATBOT_URL;
209
210
  const { setIframeEl } = useChatbot();
210
211
  const { init, setMcps, setAppName, setSessionToken, isReady } = useChatbot();
211
212
  const sentInitRef = React4.useRef(false);
@@ -250,7 +251,11 @@ function ChatbotFrame({
250
251
  "iframe",
251
252
  {
252
253
  ref: setIframeEl,
253
- src: `${chatbotUrl}/embed/${agentId}`,
254
+ src: buildIframeUrl({
255
+ baseUrl,
256
+ agentId,
257
+ initialChatId
258
+ }),
254
259
  className,
255
260
  allow: "clipboard-write",
256
261
  style: {
@@ -260,6 +265,17 @@ function ChatbotFrame({
260
265
  }
261
266
  );
262
267
  }
268
+ function buildIframeUrl({
269
+ baseUrl,
270
+ agentId,
271
+ initialChatId
272
+ }) {
273
+ const url = new URL(`/embed/${agentId}`, baseUrl);
274
+ if (initialChatId) {
275
+ url.searchParams.set("initialChatId", initialChatId);
276
+ }
277
+ return url.toString();
278
+ }
263
279
  function useSession({ getSession }) {
264
280
  const { setSessionToken } = useChatbot();
265
281
  const [session, setSession] = React4.useState();
@@ -294,14 +310,70 @@ function useSession({ getSession }) {
294
310
  // src/components/chatbot-sheet.tsx
295
311
  import "react";
296
312
 
297
- // src/components/sheet.tsx
298
- import * as SheetPrimitive from "@radix-ui/react-dialog";
313
+ // src/components/lottie-ai-icon.tsx
299
314
  import * as React5 from "react";
300
315
  import { jsx as jsx3 } from "react/jsx-runtime";
316
+ function LottieAiIcon({
317
+ src,
318
+ width = 18,
319
+ height = 18,
320
+ loop = true,
321
+ autoplay = false,
322
+ hover = false,
323
+ fallback
324
+ }) {
325
+ const containerRef = React5.useRef(null);
326
+ const [ready, setReady] = React5.useState(false);
327
+ React5.useEffect(() => {
328
+ if (typeof window === "undefined") return;
329
+ const existing = document.querySelector("script[data-dotlottie-player]");
330
+ if (!existing) {
331
+ const scriptEl = document.createElement("script");
332
+ scriptEl.type = "module";
333
+ scriptEl.async = true;
334
+ scriptEl.src = "https://unpkg.com/@dotlottie/player-component@latest/dist/dotlottie-player.js";
335
+ scriptEl.setAttribute("data-dotlottie-player", "true");
336
+ scriptEl.onload = () => setReady(true);
337
+ scriptEl.onerror = () => setReady(false);
338
+ document.head.appendChild(scriptEl);
339
+ } else {
340
+ setReady(true);
341
+ }
342
+ }, []);
343
+ React5.useEffect(() => {
344
+ if (!ready || !containerRef.current) return;
345
+ const container = containerRef.current;
346
+ container.innerHTML = "";
347
+ const player = document.createElement("dotlottie-player");
348
+ player.setAttribute("src", src);
349
+ player.setAttribute("style", `width:${width}px;height:${height}px`);
350
+ if (loop) player.setAttribute("loop", "");
351
+ if (autoplay) player.setAttribute("autoplay", "");
352
+ if (hover) player.setAttribute("hover", "");
353
+ container.appendChild(player);
354
+ return () => {
355
+ container.innerHTML = "";
356
+ };
357
+ }, [ready, src, width, height, loop, autoplay, hover]);
358
+ return /* @__PURE__ */ jsx3("div", { ref: containerRef, "aria-hidden": "true", children: !ready && (fallback != null ? fallback : /* @__PURE__ */ jsx3(
359
+ "svg",
360
+ {
361
+ width,
362
+ height,
363
+ viewBox: "0 0 24 24",
364
+ fill: "currentColor"
365
+ }
366
+ )) });
367
+ }
368
+
369
+ // src/components/sheet.tsx
370
+ import * as SheetPrimitive from "@radix-ui/react-dialog";
371
+ import * as React6 from "react";
372
+ import { jsx as jsx4 } from "react/jsx-runtime";
301
373
  function Sheet(_a) {
302
374
  var props = __objRest(_a, []);
303
375
  const { open, setOpen } = useChatbot();
304
- return /* @__PURE__ */ jsx3(
376
+ return /* @__PURE__ */ jsx4(
305
377
  SheetPrimitive.Root,
306
378
  __spreadValues({
307
379
  "data-slot": "sheet",
@@ -311,9 +383,9 @@ function Sheet(_a) {
311
383
  }, props)
312
384
  );
313
385
  }
314
- var SheetTrigger = React5.forwardRef((_a, ref) => {
386
+ var SheetTrigger = React6.forwardRef((_a, ref) => {
315
387
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
316
- return /* @__PURE__ */ jsx3(
388
+ return /* @__PURE__ */ jsx4(
317
389
  SheetPrimitive.Trigger,
318
390
  __spreadValues({
319
391
  ref,
@@ -323,9 +395,9 @@ var SheetTrigger = React5.forwardRef((_a, ref) => {
323
395
  );
324
396
  });
325
397
  SheetTrigger.displayName = SheetPrimitive.Trigger.displayName;
326
- var SheetClose = React5.forwardRef((_a, ref) => {
398
+ var SheetClose = React6.forwardRef((_a, ref) => {
327
399
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
328
- return /* @__PURE__ */ jsx3(
400
+ return /* @__PURE__ */ jsx4(
329
401
  SheetPrimitive.Close,
330
402
  __spreadValues({
331
403
  ref,
@@ -337,9 +409,9 @@ var SheetClose = React5.forwardRef((_a, ref) => {
337
409
  SheetClose.displayName = SheetPrimitive.Close.displayName;
338
410
  function SheetPortal(_a) {
339
411
  var props = __objRest(_a, []);
340
- return /* @__PURE__ */ jsx3(SheetPrimitive.Portal, __spreadValues({ "data-slot": "sheet-portal" }, props));
412
+ return /* @__PURE__ */ jsx4(SheetPrimitive.Portal, __spreadValues({ "data-slot": "sheet-portal" }, props));
341
413
  }
342
- var SheetContent = React5.forwardRef((_a, ref) => {
414
+ var SheetContent = React6.forwardRef((_a, ref) => {
343
415
  var _b = _a, { className, children, style } = _b, props = __objRest(_b, ["className", "children", "style"]);
344
416
  const { isExpanded, open, hasOpened } = useChatbot();
345
417
  const width = isExpanded ? "848px" : "400px";
@@ -348,7 +420,7 @@ var SheetContent = React5.forwardRef((_a, ref) => {
348
420
  "--sheet-width": width,
349
421
  transform: `translateX(${translateX})`
350
422
  }, style);
351
- return /* @__PURE__ */ jsx3(SheetPortal, { forceMount: hasOpened || void 0, children: /* @__PURE__ */ jsx3(
423
+ return /* @__PURE__ */ jsx4(SheetPortal, { forceMount: hasOpened || void 0, children: /* @__PURE__ */ jsx4(
352
424
  SheetPrimitive.Content,
353
425
  __spreadProps(__spreadValues({
354
426
  ref,
@@ -363,9 +435,9 @@ var SheetContent = React5.forwardRef((_a, ref) => {
363
435
  ) });
364
436
  });
365
437
  SheetContent.displayName = SheetPrimitive.Content.displayName;
366
- var SheetHeader = React5.forwardRef((_a, ref) => {
438
+ var SheetHeader = React6.forwardRef((_a, ref) => {
367
439
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
368
- return /* @__PURE__ */ jsx3(
440
+ return /* @__PURE__ */ jsx4(
369
441
  "div",
370
442
  __spreadValues({
371
443
  ref,
@@ -375,9 +447,9 @@ var SheetHeader = React5.forwardRef((_a, ref) => {
375
447
  );
376
448
  });
377
449
  SheetHeader.displayName = "SheetHeader";
378
- var SheetFooter = React5.forwardRef((_a, ref) => {
450
+ var SheetFooter = React6.forwardRef((_a, ref) => {
379
451
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
380
- return /* @__PURE__ */ jsx3(
452
+ return /* @__PURE__ */ jsx4(
381
453
  "div",
382
454
  __spreadValues({
383
455
  ref,
@@ -387,9 +459,9 @@ var SheetFooter = React5.forwardRef((_a, ref) => {
387
459
  );
388
460
  });
389
461
  SheetFooter.displayName = "SheetFooter";
390
- var SheetTitle = React5.forwardRef((_a, ref) => {
462
+ var SheetTitle = React6.forwardRef((_a, ref) => {
391
463
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
392
- return /* @__PURE__ */ jsx3(
464
+ return /* @__PURE__ */ jsx4(
393
465
  SheetPrimitive.Title,
394
466
  __spreadValues({
395
467
  ref,
@@ -399,9 +471,9 @@ var SheetTitle = React5.forwardRef((_a, ref) => {
399
471
  );
400
472
  });
401
473
  SheetTitle.displayName = SheetPrimitive.Title.displayName;
402
- var SheetDescription = React5.forwardRef((_a, ref) => {
474
+ var SheetDescription = React6.forwardRef((_a, ref) => {
403
475
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
404
- return /* @__PURE__ */ jsx3(
476
+ return /* @__PURE__ */ jsx4(
405
477
  SheetPrimitive.Description,
406
478
  __spreadValues({
407
479
  ref,
@@ -421,7 +493,7 @@ import {
421
493
  Root as Root2,
422
494
  Trigger as Trigger2
423
495
  } from "@radix-ui/react-tooltip";
424
- import { jsx as jsx4, jsxs } from "react/jsx-runtime";
496
+ import { jsx as jsx5, jsxs } from "react/jsx-runtime";
425
497
  function Tooltip({
426
498
  content,
427
499
  trigger,
@@ -437,13 +509,13 @@ function Tooltip({
437
509
  arrowClassName,
438
510
  keepTooltipOpen
439
511
  }) {
440
- return /* @__PURE__ */ jsx4(
512
+ return /* @__PURE__ */ jsx5(
441
513
  Provider,
442
514
  {
443
515
  delayDuration: delayDuration != null ? delayDuration : 200,
444
516
  skipDelayDuration: skipDelayDuration != null ? skipDelayDuration : 200,
445
517
  children: /* @__PURE__ */ jsxs(Root2, { open: disabled ? false : open, children: [
446
- /* @__PURE__ */ jsx4(
518
+ /* @__PURE__ */ jsx5(
447
519
  Trigger2,
448
520
  {
449
521
  onClick: keepTooltipOpen ? (event) => {
@@ -453,7 +525,7 @@ function Tooltip({
453
525
  children: trigger
454
526
  }
455
527
  ),
456
- /* @__PURE__ */ jsx4(Portal2, { children: /* @__PURE__ */ jsxs(
528
+ /* @__PURE__ */ jsx5(Portal2, { children: /* @__PURE__ */ jsxs(
457
529
  Content2,
458
530
  {
459
531
  className: `tooltip-content ${className || ""}`,
@@ -465,7 +537,7 @@ function Tooltip({
465
537
  event.preventDefault();
466
538
  } : void 0,
467
539
  children: [
468
- /* @__PURE__ */ jsx4(Arrow, { className: arrowClassName }),
540
+ /* @__PURE__ */ jsx5(Arrow, { className: arrowClassName }),
469
541
  content
470
542
  ]
471
543
  }
@@ -476,46 +548,35 @@ function Tooltip({
476
548
  }
477
549
 
478
550
  // src/components/chatbot-sheet.tsx
479
- import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
551
+ import { jsx as jsx6, jsxs as jsxs2 } from "react/jsx-runtime";
480
552
  function ChatbotSheet(_a) {
481
553
  var _b = _a, { sheetStyle } = _b, props = __objRest(_b, ["sheetStyle"]);
482
554
  return /* @__PURE__ */ jsxs2(Sheet, { children: [
483
- /* @__PURE__ */ jsx5(
555
+ /* @__PURE__ */ jsx6(
484
556
  Tooltip,
485
557
  {
486
558
  side: "top",
487
559
  align: "end",
488
560
  content: "AI\u306B\u8CEA\u554F\u3057\u3066\u307F\u307E\u3057\u3087\u3046",
489
- trigger: /* @__PURE__ */ jsx5(SheetTrigger, { children: /* @__PURE__ */ jsx5(EcforceAiIcon, {}) })
561
+ trigger: /* @__PURE__ */ jsx6(SheetTrigger, { children: /* @__PURE__ */ jsx6(
562
+ LottieAiIcon,
563
+ {
564
+ src: `${PROD_CHATBOT_URL}/animations/ai-icon.v1.lottie`,
565
+ width: 20,
566
+ height: 20,
567
+ autoplay: true,
568
+ loop: true
569
+ }
570
+ ) })
490
571
  }
491
572
  ),
492
573
  /* @__PURE__ */ jsxs2(SheetContent, { style: sheetStyle, children: [
493
- /* @__PURE__ */ jsx5(SheetTitle, { children: "AI\u306B\u8CEA\u554F\u3057\u3066\u307F\u307E\u3057\u3087\u3046" }),
494
- /* @__PURE__ */ jsx5(SheetDescription, { children: "AI\u306B\u8CEA\u554F\u3057\u3066\u307F\u307E\u3057\u3087\u3046" }),
495
- /* @__PURE__ */ jsx5(ChatbotFrame, __spreadValues({}, props))
574
+ /* @__PURE__ */ jsx6(SheetTitle, { children: "AI\u306B\u8CEA\u554F\u3057\u3066\u307F\u307E\u3057\u3087\u3046" }),
575
+ /* @__PURE__ */ jsx6(SheetDescription, { children: "AI\u306B\u8CEA\u554F\u3057\u3066\u307F\u307E\u3057\u3087\u3046" }),
576
+ /* @__PURE__ */ jsx6(ChatbotFrame, __spreadValues({}, props))
496
577
  ] })
497
578
  ] });
498
579
  }
499
- function EcforceAiIcon() {
500
- return /* @__PURE__ */ jsx5(
501
- "svg",
502
- {
503
- width: "18",
504
- height: "18",
505
- viewBox: "0 0 24 24",
506
- xmlns: "http://www.w3.org/2000/svg",
507
- fill: "currentColor",
508
- children: /* @__PURE__ */ jsx5(
509
- "path",
510
- {
511
- fillRule: "evenodd",
512
- clipRule: "evenodd",
513
- d: "M9.2 13.704s3.7-.812 4.325-3.74c.624-2.93.76-3.364 1.112-3.364.352 0 .42.309.5.618.08.309.51 2.276.613 2.745.102.47.783 2.93 3.712 3.616 2.93.686 3.338.697 3.338 1.12 0 .459-2.361.859-3.338 1.122-.976.263-3.042 1.007-3.587 3.49-.534 2.482-.681 3.489-1.238 3.489-.556 0-.545-.584-.613-.87-.068-.286-.34-1.819-.5-2.494-.147-.675-1.044-2.837-2.962-3.363-1.93-.527-3.962-.847-3.962-1.373s2.134-.824 2.6-.995ZM2.462 4.613s1.785-.39 2.08-1.798c.296-1.409.365-1.615.535-1.615.17 0 .205.149.239.298s.25 1.088.296 1.317c.045.229.375 1.409 1.785 1.74 1.41.333 1.603.333 1.603.54 0 .217-1.137.412-1.603.538-.466.126-1.467.48-1.729 1.683C5.407 8.507 5.338 9 5.078 9c-.262 0-.262-.286-.296-.424-.035-.137-.16-.882-.24-1.202-.079-.321-.5-1.363-1.432-1.615-.932-.252-1.91-.413-1.91-.665 0-.252 1.023-.4 1.25-.48h.012Z"
514
- }
515
- )
516
- }
517
- );
518
- }
519
580
  export {
520
581
  ChatbotFrame,
521
582
  ChatbotProvider,
@@ -1,2 +1,2 @@
1
- export declare const PROD_CHATBOT_URL = "https://ecforce-ai-agent.vercel.app";
1
+ export declare const PROD_CHATBOT_URL = "https://agent.ec-force.com";
2
2
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,wCAAwC,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,+BAA+B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@super_studio/ecforce-ai-agent-react",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
@@ -1,11 +1,13 @@
1
1
  import React from "react";
2
2
  import { PROD_CHATBOT_URL } from "../lib/constants";
3
- import { useChatbot } from "./provider/chatbot-proivder";
3
+ import { useChatbot } from "./provider/chatbot-provider";
4
4
  import type { MCP } from "./provider/use-chatbot-frame-handler";
5
5
 
6
6
  export type ChatbotFrameProps = {
7
7
  /** 管理画面上のエージェントID */
8
8
  agentId: string;
9
+ /** 初期化時のチャットID */
10
+ initialChatId?: string;
9
11
  /** エージェントにつなげるMCPの情報 */
10
12
  mcps?: MCP[];
11
13
  /** アプリ名のメタデータ */
@@ -35,13 +37,14 @@ export type ChatbotFrameProps = {
35
37
  export function ChatbotFrame({
36
38
  agentId,
37
39
  appName,
40
+ initialChatId,
38
41
  mcps,
39
42
  getSession,
40
43
  enabled = true,
41
44
  url,
42
45
  className,
43
46
  }: ChatbotFrameProps) {
44
- const chatbotUrl = url ?? process.env.CHATBOT_URL ?? PROD_CHATBOT_URL;
47
+ const baseUrl = url ?? process.env.CHATBOT_URL ?? PROD_CHATBOT_URL;
45
48
  const { setIframeEl } = useChatbot();
46
49
  const { init, setMcps, setAppName, setSessionToken, isReady } = useChatbot();
47
50
  const sentInitRef = React.useRef(false);
@@ -107,7 +110,11 @@ export function ChatbotFrame({
107
110
  return (
108
111
  <iframe
109
112
  ref={setIframeEl}
110
- src={`${chatbotUrl}/embed/${agentId}`}
113
+ src={buildIframeUrl({
114
+ baseUrl,
115
+ agentId,
116
+ initialChatId,
117
+ })}
111
118
  className={className}
112
119
  allow="clipboard-write"
113
120
  style={{
@@ -118,6 +125,24 @@ export function ChatbotFrame({
118
125
  );
119
126
  }
120
127
 
128
+ function buildIframeUrl({
129
+ baseUrl,
130
+ agentId,
131
+ initialChatId,
132
+ }: {
133
+ baseUrl: string;
134
+ agentId: string;
135
+ initialChatId?: string;
136
+ }) {
137
+ const url = new URL(`/embed/${agentId}`, baseUrl);
138
+
139
+ if (initialChatId) {
140
+ url.searchParams.set("initialChatId", initialChatId);
141
+ }
142
+
143
+ return url.toString();
144
+ }
145
+
121
146
  export type SessionData = {
122
147
  sessionId: string;
123
148
  token: string;
@@ -1,5 +1,7 @@
1
1
  import React from "react";
2
+ import { PROD_CHATBOT_URL } from "@/lib/constants";
2
3
  import { ChatbotFrame, type ChatbotFrameProps } from "./chatbot-frame";
4
+ import { LottieAiIcon } from "./lottie-ai-icon";
3
5
  import {
4
6
  Sheet,
5
7
  SheetContent,
@@ -22,7 +24,13 @@ export function ChatbotSheet({ sheetStyle, ...props }: ChatbotSheetProps) {
22
24
  content="AIに質問してみましょう"
23
25
  trigger={
24
26
  <SheetTrigger>
25
- <EcforceAiIcon />
27
+ <LottieAiIcon
28
+ src={`${PROD_CHATBOT_URL}/animations/ai-icon.v1.lottie`}
29
+ width={20}
30
+ height={20}
31
+ autoplay
32
+ loop
33
+ />
26
34
  </SheetTrigger>
27
35
  }
28
36
  />
@@ -34,21 +42,3 @@ export function ChatbotSheet({ sheetStyle, ...props }: ChatbotSheetProps) {
34
42
  </Sheet>
35
43
  );
36
44
  }
37
-
38
- function EcforceAiIcon() {
39
- return (
40
- <svg
41
- width="18"
42
- height="18"
43
- viewBox="0 0 24 24"
44
- xmlns="http://www.w3.org/2000/svg"
45
- fill="currentColor"
46
- >
47
- <path
48
- fillRule="evenodd"
49
- clipRule="evenodd"
50
- d="M9.2 13.704s3.7-.812 4.325-3.74c.624-2.93.76-3.364 1.112-3.364.352 0 .42.309.5.618.08.309.51 2.276.613 2.745.102.47.783 2.93 3.712 3.616 2.93.686 3.338.697 3.338 1.12 0 .459-2.361.859-3.338 1.122-.976.263-3.042 1.007-3.587 3.49-.534 2.482-.681 3.489-1.238 3.489-.556 0-.545-.584-.613-.87-.068-.286-.34-1.819-.5-2.494-.147-.675-1.044-2.837-2.962-3.363-1.93-.527-3.962-.847-3.962-1.373s2.134-.824 2.6-.995ZM2.462 4.613s1.785-.39 2.08-1.798c.296-1.409.365-1.615.535-1.615.17 0 .205.149.239.298s.25 1.088.296 1.317c.045.229.375 1.409 1.785 1.74 1.41.333 1.603.333 1.603.54 0 .217-1.137.412-1.603.538-.466.126-1.467.48-1.729 1.683C5.407 8.507 5.338 9 5.078 9c-.262 0-.262-.286-.296-.424-.035-.137-.16-.882-.24-1.202-.079-.321-.5-1.363-1.432-1.615-.932-.252-1.91-.413-1.91-.665 0-.252 1.023-.4 1.25-.48h.012Z"
51
- />
52
- </svg>
53
- );
54
- }
@@ -0,0 +1,73 @@
1
+ import * as React from "react";
2
+
3
+ type LottieAiIconProps = {
4
+ src: string;
5
+ width?: number;
6
+ height?: number;
7
+ loop?: boolean;
8
+ autoplay?: boolean;
9
+ hover?: boolean;
10
+ fallback?: React.ReactNode;
11
+ };
12
+
13
+ export function LottieAiIcon({
14
+ src,
15
+ width = 18,
16
+ height = 18,
17
+ loop = true,
18
+ autoplay = false,
19
+ hover = false,
20
+ fallback,
21
+ }: LottieAiIconProps) {
22
+ const containerRef = React.useRef<HTMLDivElement>(null);
23
+ const [ready, setReady] = React.useState(false);
24
+
25
+ React.useEffect(() => {
26
+ if (typeof window === "undefined") return;
27
+
28
+ const existing = document.querySelector("script[data-dotlottie-player]");
29
+ if (!existing) {
30
+ const scriptEl = document.createElement("script");
31
+ scriptEl.type = "module";
32
+ scriptEl.async = true;
33
+ scriptEl.src =
34
+ "https://unpkg.com/@dotlottie/player-component@latest/dist/dotlottie-player.js";
35
+ scriptEl.setAttribute("data-dotlottie-player", "true");
36
+ scriptEl.onload = () => setReady(true);
37
+ scriptEl.onerror = () => setReady(false);
38
+ document.head.appendChild(scriptEl);
39
+ } else {
40
+ setReady(true);
41
+ }
42
+ }, []);
43
+
44
+ React.useEffect(() => {
45
+ if (!ready || !containerRef.current) return;
46
+ const container = containerRef.current;
47
+ container.innerHTML = "";
48
+ const player = document.createElement("dotlottie-player");
49
+ player.setAttribute("src", src);
50
+ player.setAttribute("style", `width:${width}px;height:${height}px`);
51
+ if (loop) player.setAttribute("loop", "");
52
+ if (autoplay) player.setAttribute("autoplay", "");
53
+ if (hover) player.setAttribute("hover", "");
54
+ container.appendChild(player);
55
+ return () => {
56
+ container.innerHTML = "";
57
+ };
58
+ }, [ready, src, width, height, loop, autoplay, hover]);
59
+
60
+ return (
61
+ <div ref={containerRef} aria-hidden="true">
62
+ {!ready &&
63
+ (fallback ?? (
64
+ <svg
65
+ width={width}
66
+ height={height}
67
+ viewBox="0 0 24 24"
68
+ fill="currentColor"
69
+ />
70
+ ))}
71
+ </div>
72
+ );
73
+ }
@@ -1,6 +1,6 @@
1
1
  import * as SheetPrimitive from "@radix-ui/react-dialog";
2
2
  import * as React from "react";
3
- import { useChatbot } from "./provider/chatbot-proivder";
3
+ import { useChatbot } from "./provider/chatbot-provider";
4
4
 
5
5
  function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {
6
6
  const { open, setOpen } = useChatbot();
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from "./components/provider/chatbot-proivder";
1
+ export * from "./components/provider/chatbot-provider";
2
2
  export * from "./components/chatbot-frame";
3
3
  export * from "./components/chatbot-sheet";
4
4
  export * from "./components/sheet";
@@ -1 +1 @@
1
- export const PROD_CHATBOT_URL = "https://ecforce-ai-agent.vercel.app";
1
+ export const PROD_CHATBOT_URL = "https://agent.ec-force.com";