{"version":3,"file":"CopilotChatConfigurationProvider.mjs","names":[],"sources":["../../src/providers/CopilotChatConfigurationProvider.tsx"],"sourcesContent":["import React, {\n  createContext,\n  useCallback,\n  useContext,\n  ReactNode,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport { DEFAULT_AGENT_ID, randomUUID } from \"@copilotkitnext/shared\";\n\n// Default labels\nexport const CopilotChatDefaultLabels = {\n  chatInputPlaceholder: \"Type a message...\",\n  chatInputToolbarStartTranscribeButtonLabel: \"Transcribe\",\n  chatInputToolbarCancelTranscribeButtonLabel: \"Cancel\",\n  chatInputToolbarFinishTranscribeButtonLabel: \"Finish\",\n  chatInputToolbarAddButtonLabel: \"Add photos or files\",\n  chatInputToolbarToolsButtonLabel: \"Tools\",\n  assistantMessageToolbarCopyCodeLabel: \"Copy\",\n  assistantMessageToolbarCopyCodeCopiedLabel: \"Copied\",\n  assistantMessageToolbarCopyMessageLabel: \"Copy\",\n  assistantMessageToolbarThumbsUpLabel: \"Good response\",\n  assistantMessageToolbarThumbsDownLabel: \"Bad response\",\n  assistantMessageToolbarReadAloudLabel: \"Read aloud\",\n  assistantMessageToolbarRegenerateLabel: \"Regenerate\",\n  userMessageToolbarCopyMessageLabel: \"Copy\",\n  userMessageToolbarEditMessageLabel: \"Edit\",\n  chatDisclaimerText:\n    \"AI can make mistakes. Please verify important information.\",\n  chatToggleOpenLabel: \"Open chat\",\n  chatToggleCloseLabel: \"Close chat\",\n  modalHeaderTitle: \"CopilotKit Chat\",\n  welcomeMessageText: \"How can I help you today?\",\n};\n\nexport type CopilotChatLabels = typeof CopilotChatDefaultLabels;\n\n// Define the full configuration interface\nexport interface CopilotChatConfigurationValue {\n  labels: CopilotChatLabels;\n  agentId: string;\n  threadId: string;\n  isModalOpen: boolean;\n  setModalOpen: (open: boolean) => void;\n}\n\n// Create the configuration context\nconst CopilotChatConfiguration =\n  createContext<CopilotChatConfigurationValue | null>(null);\n\n// Provider props interface\nexport interface CopilotChatConfigurationProviderProps {\n  children: ReactNode;\n  labels?: Partial<CopilotChatLabels>;\n  agentId?: string;\n  threadId?: string;\n  isModalDefaultOpen?: boolean;\n}\n\n// Provider component\nexport const CopilotChatConfigurationProvider: React.FC<\n  CopilotChatConfigurationProviderProps\n> = ({ children, labels, agentId, threadId, isModalDefaultOpen }) => {\n  const parentConfig = useContext(CopilotChatConfiguration);\n\n  const mergedLabels: CopilotChatLabels = useMemo(\n    () => ({\n      ...CopilotChatDefaultLabels,\n      ...(parentConfig?.labels ?? {}),\n      ...(labels ?? {}),\n    }),\n    [labels, parentConfig?.labels],\n  );\n\n  const resolvedAgentId = agentId ?? parentConfig?.agentId ?? DEFAULT_AGENT_ID;\n\n  const resolvedThreadId = useMemo(() => {\n    if (threadId) {\n      return threadId;\n    }\n    if (parentConfig?.threadId) {\n      return parentConfig.threadId;\n    }\n    return randomUUID();\n  }, [threadId, parentConfig?.threadId]);\n\n  const resolvedDefaultOpen = isModalDefaultOpen ?? true;\n\n  const [internalModalOpen, setInternalModalOpen] =\n    useState<boolean>(resolvedDefaultOpen);\n\n  const hasExplicitDefault = isModalDefaultOpen !== undefined;\n\n  // When this provider owns its modal state, wrap the setter so that changes\n  // propagate upward to any ancestor provider. This allows an outer\n  // CopilotChatConfigurationProvider (e.g. a user's layout-level provider) to\n  // observe open/close events that originate deep in the tree — fixing the\n  // \"outer hook always returns true\" regression (CPK-7152 Behavior B).\n  const setAndSync = useCallback(\n    (open: boolean) => {\n      setInternalModalOpen(open);\n      parentConfig?.setModalOpen(open);\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [parentConfig?.setModalOpen],\n  );\n\n  // Sync parent → child: when an ancestor's modal state is changed externally\n  // (e.g. the user calls setModalOpen from an outer hook), reflect that change\n  // in our own state so the sidebar/popup responds accordingly.\n  // Skip the initial mount so that our own isModalDefaultOpen is respected and\n  // not immediately overwritten by the parent's current value.\n  const isMounted = useRef(false);\n  useEffect(() => {\n    if (!hasExplicitDefault) return;\n    if (!isMounted.current) {\n      isMounted.current = true;\n      return;\n    }\n    if (parentConfig?.isModalOpen === undefined) return;\n    setInternalModalOpen(parentConfig.isModalOpen);\n  }, [parentConfig?.isModalOpen, hasExplicitDefault]);\n\n  const resolvedIsModalOpen = hasExplicitDefault\n    ? internalModalOpen\n    : (parentConfig?.isModalOpen ?? internalModalOpen);\n  const resolvedSetModalOpen = hasExplicitDefault\n    ? setAndSync\n    : (parentConfig?.setModalOpen ?? setInternalModalOpen);\n\n  const configurationValue: CopilotChatConfigurationValue = useMemo(\n    () => ({\n      labels: mergedLabels,\n      agentId: resolvedAgentId,\n      threadId: resolvedThreadId,\n      isModalOpen: resolvedIsModalOpen,\n      setModalOpen: resolvedSetModalOpen,\n    }),\n    [\n      mergedLabels,\n      resolvedAgentId,\n      resolvedThreadId,\n      resolvedIsModalOpen,\n      resolvedSetModalOpen,\n    ],\n  );\n\n  return (\n    <CopilotChatConfiguration.Provider value={configurationValue}>\n      {children}\n    </CopilotChatConfiguration.Provider>\n  );\n};\n\n// Hook to use the full configuration\nexport const useCopilotChatConfiguration =\n  (): CopilotChatConfigurationValue | null => {\n    const configuration = useContext(CopilotChatConfiguration);\n    return configuration;\n  };\n"],"mappings":";;;;;AAaA,MAAa,2BAA2B;CACtC,sBAAsB;CACtB,4CAA4C;CAC5C,6CAA6C;CAC7C,6CAA6C;CAC7C,gCAAgC;CAChC,kCAAkC;CAClC,sCAAsC;CACtC,4CAA4C;CAC5C,yCAAyC;CACzC,sCAAsC;CACtC,wCAAwC;CACxC,uCAAuC;CACvC,wCAAwC;CACxC,oCAAoC;CACpC,oCAAoC;CACpC,oBACE;CACF,qBAAqB;CACrB,sBAAsB;CACtB,kBAAkB;CAClB,oBAAoB;CACrB;AAcD,MAAM,2BACJ,cAAoD,KAAK;AAY3D,MAAa,oCAER,EAAE,UAAU,QAAQ,SAAS,UAAU,yBAAyB;CACnE,MAAM,eAAe,WAAW,yBAAyB;CAEzD,MAAM,eAAkC,eAC/B;EACL,GAAG;EACH,GAAI,cAAc,UAAU,EAAE;EAC9B,GAAI,UAAU,EAAE;EACjB,GACD,CAAC,QAAQ,cAAc,OAAO,CAC/B;CAED,MAAM,kBAAkB,WAAW,cAAc,WAAW;CAE5D,MAAM,mBAAmB,cAAc;AACrC,MAAI,SACF,QAAO;AAET,MAAI,cAAc,SAChB,QAAO,aAAa;AAEtB,SAAO,YAAY;IAClB,CAAC,UAAU,cAAc,SAAS,CAAC;CAItC,MAAM,CAAC,mBAAmB,wBACxB,SAH0B,sBAAsB,KAGV;CAExC,MAAM,qBAAqB,uBAAuB;CAOlD,MAAM,aAAa,aAChB,SAAkB;AACjB,uBAAqB,KAAK;AAC1B,gBAAc,aAAa,KAAK;IAGlC,CAAC,cAAc,aAAa,CAC7B;CAOD,MAAM,YAAY,OAAO,MAAM;AAC/B,iBAAgB;AACd,MAAI,CAAC,mBAAoB;AACzB,MAAI,CAAC,UAAU,SAAS;AACtB,aAAU,UAAU;AACpB;;AAEF,MAAI,cAAc,gBAAgB,OAAW;AAC7C,uBAAqB,aAAa,YAAY;IAC7C,CAAC,cAAc,aAAa,mBAAmB,CAAC;CAEnD,MAAM,sBAAsB,qBACxB,oBACC,cAAc,eAAe;CAClC,MAAM,uBAAuB,qBACzB,aACC,cAAc,gBAAgB;CAEnC,MAAM,qBAAoD,eACjD;EACL,QAAQ;EACR,SAAS;EACT,UAAU;EACV,aAAa;EACb,cAAc;EACf,GACD;EACE;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,oBAAC,yBAAyB;EAAS,OAAO;EACvC;GACiC;;AAKxC,MAAa,oCACiC;AAE1C,QADsB,WAAW,yBAAyB"}