@bcrumbs.net/inbox 0.0.60 → 0.0.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/assets/ar/inbox.json +16 -3
  2. package/assets/en/inbox.json +15 -2
  3. package/index.cjs.js +49115 -49417
  4. package/index.esm.js +49119 -49421
  5. package/package.json +4 -4
  6. package/playwright.config.d.ts +9 -0
  7. package/src/app/ai/components/Crumby/CrumbyComposer.d.ts +1 -1
  8. package/src/app/ai/components/playground/Button.d.ts +1 -1
  9. package/src/app/ai/components/playground/ThreadMessages.d.ts +5 -1
  10. package/src/app/ai/components/playground/TooltipIconButton.d.ts +2 -2
  11. package/src/app/auth/components/ClerkForgetPanel.d.ts +6 -0
  12. package/src/app/auth/components/ClerkResetPasswordPanel.d.ts +6 -0
  13. package/src/app/auth/components/ClerkSessionBridge.d.ts +12 -0
  14. package/src/app/auth/components/ClerkSignInPanel.d.ts +2 -0
  15. package/src/app/auth/components/ClerkSignUpPanel.d.ts +2 -0
  16. package/src/app/auth/components/UserAvatar/AccountSettingsDropdown.d.ts +3 -5
  17. package/src/app/auth/components/password-page/PasswordFormView.d.ts +10 -1
  18. package/src/app/auth/config/authProvider.d.ts +12 -0
  19. package/src/app/auth/config/clerkAppearance.d.ts +430 -0
  20. package/src/app/auth/hooks/useRoles.d.ts +1 -0
  21. package/src/app/auth/pages/Auth.style.d.ts +82 -0
  22. package/src/app/auth/pages/CheckAuth.d.ts +7 -4
  23. package/src/app/auth/pages/Forget.d.ts +2 -2
  24. package/src/app/auth/pages/Login.d.ts +2 -3
  25. package/src/app/auth/pages/Login.style.d.ts +1 -0
  26. package/src/app/auth/pages/Password.d.ts +2 -2
  27. package/src/app/auth/pages/Register.d.ts +2 -3
  28. package/src/app/auth/pages/Register.style.d.ts +5 -0
  29. package/src/app/auth/utils/avatar.d.ts +1 -0
  30. package/src/app/auth/utils/clerkTracking.d.ts +9 -0
  31. package/src/app/auth/utils/resetWorkspaceRoleState.d.ts +4 -0
  32. package/src/app/billing/utils/pendingPlanPurchaseStorage.d.ts +6 -6
  33. package/src/app/broadcast/components/BroadcastAnalysisContent.d.ts +3 -1
  34. package/src/app/broadcast/components/BroadcastAnalysisReciepients.d.ts +6 -1
  35. package/src/app/broadcast/components/BroadcastAnalysisReciepientsHeader.d.ts +7 -1
  36. package/src/app/contact/components/ContactFilterOptions.d.ts +4 -1
  37. package/src/app/contact/components/ContactFormFields.d.ts +4 -1
  38. package/src/app/dashboard/components/AgentPerformanceCard.d.ts +2 -1
  39. package/src/app/dashboard/components/BroadcastCampaignProgressCard.d.ts +3 -1
  40. package/src/app/dashboard/components/DashboardExportButton.d.ts +8 -0
  41. package/src/app/dashboard/components/DashboardSections.d.ts +2 -1
  42. package/src/app/dashboard/components/OpenedChatsCard.d.ts +5 -1
  43. package/src/app/dashboard/components/TagPerformanceCard.d.ts +2 -1
  44. package/src/app/dashboard/utils/dashboardReportExports.d.ts +100 -0
  45. package/src/app/generic/components/PhoneDigitsInput.d.ts +7 -0
  46. package/src/app/generic/hooks/useOnlineStatus.d.ts +1 -1
  47. package/src/app/generic/hooks/useResourceColumns.d.ts +3 -1
  48. package/src/app/inbox/components/Chat/ChatHeader.d.ts +2 -0
  49. package/src/app/inbox/components/Chat/NoConvSelected.d.ts +5 -0
  50. package/src/app/inbox/components/Chat/index.d.ts +4 -1
  51. package/src/app/inbox/components/NewDetails/ClientSection.d.ts +2 -1
  52. package/src/app/inbox/components/NewDetails/UserHeader.d.ts +2 -1
  53. package/src/app/inbox/components/NewDetails/index.d.ts +2 -1
  54. package/src/app/inbox/components/Shared/Inbox.d.ts +4 -1
  55. package/src/app/inbox/components/Shared/MobileChatDetailsSlider.d.ts +15 -0
  56. package/src/app/inbox/components/Shared/MobileDetailsSwipeHint.d.ts +9 -0
  57. package/src/app/inbox/components/Shared/MobileMenu.d.ts +2 -1
  58. package/src/app/inbox/hooks/useConvActions.d.ts +1 -0
  59. package/src/app/inbox/hooks/useConversationsPerodicFetch.d.ts +3 -0
  60. package/src/app/inbox/hooks/useStartedTimeAgo.d.ts +5 -0
  61. package/src/app/inbox/utils/convs.d.ts +8 -1
  62. package/src/app/inbox/utils/inboxAssignableAis.d.ts +11 -1
  63. package/src/app/layout/constants/index.d.ts +10 -10
  64. package/src/app/layout/hooks/useCrumbyEnabled.d.ts +18 -0
  65. package/src/app/layout/hooks/useCrumbyUpgradeAction.d.ts +10 -0
  66. package/src/app/managemnet/config/types.d.ts +2 -0
  67. package/src/app/onboarding/utils/onboardingChecklistPersistence.d.ts +18 -0
  68. package/src/app/onboarding/utils/onboardingChecklistStorage.d.ts +10 -1
  69. package/src/app/resources/components/Integrations/Facebook/PagePickerPopup.d.ts +3 -1
  70. package/src/app/subscriptions/components/NewSubscription/OnboardingStepper.d.ts +8 -0
  71. package/src/app/subscriptions/components/NewSubscription/SubscriptionFailed.d.ts +6 -0
  72. package/src/app/subscriptions/components/NewSubscription/SubscriptionName.d.ts +1 -1
  73. package/src/app/subscriptions/components/NewSubscription/SubscriptionSuccess.d.ts +5 -2
  74. package/src/app/subscriptions/components/NewSubscription/WorkspaceStepLayout.d.ts +11 -0
  75. package/src/app/subscriptions/components/Plans/ShowcasePlans.d.ts +3 -1
  76. package/src/app/subscriptions/components/SubscriptionSwitcher/Switcher.d.ts +1 -1
  77. package/src/app/subscriptions/pages/NewSubscription.d.ts +1 -1
  78. package/src/app/subscriptions/utils/estimateUpgradeProration.d.ts +19 -0
  79. package/src/app/subscriptions/utils/newWorkspaceCheckout.d.ts +16 -0
  80. package/src/assets/locales/translations.d.ts +84 -0
  81. package/src/environments/types.d.ts +5 -0
  82. package/src/graphql.autogenerated.d.ts +582 -1
  83. package/src/routes/PrivateRoutes.d.ts +1 -5
  84. package/src/utils/exportCsv.d.ts +8 -0
  85. package/src/utils/textUtils.d.ts +2 -0
  86. package/src/app/broadcast/components/BroadcastTargetingComplianceNotice.d.ts +0 -2
  87. package/src/app/generic/hooks/WithMenuConfig.d.ts +0 -1
  88. package/src/app/layout/components/language/LanguageDropdown.d.ts +0 -9
@@ -0,0 +1,82 @@
1
+ /// <reference types="react" />
2
+ export declare const TEAL = "#16616C";
3
+ export declare const AuthContainer: import("@emotion/styled").StyledComponent<{
4
+ theme?: import("@emotion/react").Theme | undefined;
5
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
6
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
7
+ export declare const AuthFormColumn: import("@emotion/styled").StyledComponent<{
8
+ theme?: import("@emotion/react").Theme | undefined;
9
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
10
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
11
+ export declare const AuthFormContent: import("@emotion/styled").StyledComponent<{
12
+ theme?: import("@emotion/react").Theme | undefined;
13
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
14
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
15
+ /** Tighter stack so the BC logo sits near Clerk's heading (legacy keeps the 48px gap). */
16
+ export declare const ClerkAuthFormColumn: import("@emotion/styled").StyledComponent<{
17
+ theme?: import("@emotion/react").Theme | undefined;
18
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
19
+ } & import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & {
20
+ theme?: import("@emotion/react").Theme | undefined;
21
+ }, {}, {}>;
22
+ /** Clerk v5 draws the card shadow on .cl-cardBox; force it off inside our auth shell. */
23
+ export declare const ClerkAuthFormContent: import("@emotion/styled").StyledComponent<{
24
+ theme?: import("@emotion/react").Theme | undefined;
25
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
26
+ } & import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & {
27
+ theme?: import("@emotion/react").Theme | undefined;
28
+ }, {}, {}>;
29
+ export declare const SigninForm: import("@emotion/styled").StyledComponent<{
30
+ theme?: import("@emotion/react").Theme | undefined;
31
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
32
+ }, import("react").DetailedHTMLProps<import("react").FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>, {}>;
33
+ export declare const PasswordFieldWrapper: import("@emotion/styled").StyledComponent<{
34
+ theme?: import("@emotion/react").Theme | undefined;
35
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
36
+ } & {
37
+ rtl?: boolean | undefined;
38
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
39
+ export declare const ShowPasswordBtn: import("@emotion/styled").StyledComponent<{
40
+ theme?: import("@emotion/react").Theme | undefined;
41
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
42
+ } & {
43
+ rtl?: boolean | undefined;
44
+ }, import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, {}>;
45
+ export declare const SocialButtonsRow: import("@emotion/styled").StyledComponent<{
46
+ theme?: import("@emotion/react").Theme | undefined;
47
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
48
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
49
+ export declare const SocialAuthButton: import("@emotion/styled").StyledComponent<{
50
+ theme?: import("@emotion/react").Theme | undefined;
51
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
52
+ }, import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, {}>;
53
+ export declare const OrDivider: import("@emotion/styled").StyledComponent<{
54
+ theme?: import("@emotion/react").Theme | undefined;
55
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
56
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
57
+ export declare const OptionsRow: import("@emotion/styled").StyledComponent<{
58
+ theme?: import("@emotion/react").Theme | undefined;
59
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
60
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
61
+ export declare const ForgetPasswordLink: import("@emotion/styled").StyledComponent<import("react-router-dom").LinkProps<unknown> & import("react").RefAttributes<HTMLAnchorElement> & {
62
+ theme?: import("@emotion/react").Theme | undefined;
63
+ }, {}, {}>;
64
+ export declare const SignInActions: import("@emotion/styled").StyledComponent<{
65
+ theme?: import("@emotion/react").Theme | undefined;
66
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
67
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
68
+ export declare const SignInButton: import("@emotion/styled").StyledComponent<{
69
+ theme?: import("@emotion/react").Theme | undefined;
70
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
71
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
72
+ export declare const SignUpFooter: import("@emotion/styled").StyledComponent<{
73
+ theme?: import("@emotion/react").Theme | undefined;
74
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
75
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, {}>;
76
+ export declare const SignUpLink: import("@emotion/styled").StyledComponent<import("react-router-dom").LinkProps<unknown> & import("react").RefAttributes<HTMLAnchorElement> & {
77
+ theme?: import("@emotion/react").Theme | undefined;
78
+ }, {}, {}>;
79
+ export declare const HelloCon: import("@emotion/styled").StyledComponent<{
80
+ theme?: import("@emotion/react").Theme | undefined;
81
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
82
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
@@ -1,10 +1,13 @@
1
1
  /**
2
2
  * Public entry from marketing pricing CTAs (?planType=...).
3
3
  * Verifies the session via currentUser, then:
4
- * - authenticated + planType in query → upgrade flow (auto Polar/Stripe checkout)
5
- * - authenticated + no planType → inbox
6
- * - guest + planType → register with planType preserved
7
- * - guest + no planType → login
4
+ * - authenticated + plan intent → upgrade flow (auto Polar/Stripe checkout)
5
+ * - authenticated + no plan intent → inbox
6
+ * - guest + plan intent → register with planType preserved
7
+ * - guest + no plan intent → login
8
+ *
9
+ * The plan intent comes from the query when present, otherwise from the value stored earlier
10
+ * in this tab.
8
11
  */
9
12
  declare const CheckAuth: () => import("@emotion/react/jsx-runtime").JSX.Element;
10
13
  export default CheckAuth;
@@ -6,5 +6,5 @@ export type Props = {
6
6
  error: any;
7
7
  status: any;
8
8
  };
9
- declare const _default: any;
10
- export default _default;
9
+ declare const Forget: (props: Props) => import("@emotion/react/jsx-runtime").JSX.Element;
10
+ export default Forget;
@@ -1,3 +1,2 @@
1
- /// <reference types="react" />
2
- declare const _default: import("react").ComponentClass<{}, any>;
3
- export default _default;
1
+ declare const Login: (props: any) => import("@emotion/react/jsx-runtime").JSX.Element;
2
+ export default Login;
@@ -0,0 +1 @@
1
+ export * from './Auth.style';
@@ -8,5 +8,5 @@ export type Props = {
8
8
  error: any;
9
9
  status: any;
10
10
  };
11
- declare const _default: any;
12
- export default _default;
11
+ declare const Password: (props: Props) => import("@emotion/react/jsx-runtime").JSX.Element;
12
+ export default Password;
@@ -1,3 +1,2 @@
1
- /// <reference types="react" />
2
- declare const _default: import("react").ComponentClass<{}, any>;
3
- export default _default;
1
+ declare const Register: (props: any) => import("@emotion/react/jsx-runtime").JSX.Element;
2
+ export default Register;
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ export declare const FormRow: import("@emotion/styled").StyledComponent<{
3
+ theme?: import("@emotion/react").Theme | undefined;
4
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
5
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
@@ -1 +1,2 @@
1
1
  export declare const getGravatarUrl: (email: string, size?: number) => string;
2
+ export declare const getClientAvatarUrl: (avatarUrl: string | null | undefined, email: string | null | undefined, size?: number) => string;
@@ -0,0 +1,9 @@
1
+ import type { PostHog } from 'posthog-js';
2
+ /** Funnel / UX events captured in the portal for Clerk auth flows. */
3
+ export declare const ClerkTrackingEvents: {
4
+ readonly SignupStarted: "Signup Started";
5
+ readonly ForgetPasswordSuccess: "Forget Password Success";
6
+ readonly ResetPasswordSuccess: "Reset Password Success";
7
+ };
8
+ export declare function captureClerkEvent(posthog: PostHog | null | undefined, eventName: string, properties?: Record<string, string | number | boolean | undefined>): void;
9
+ export declare function identifyClerkUser(posthog: PostHog | null | undefined, userId: string, email?: string): void;
@@ -0,0 +1,4 @@
1
+ /** Stored on userInfo with role so readers can reject a stale workspace role. */
2
+ export declare const ROLE_WORKSPACE_ID_KEY = "roleWorkspaceId";
3
+ /** Drop cached workspace role so the next me fetch drives permissions for the active workspace. */
4
+ export declare function resetWorkspaceRoleState(): void;
@@ -1,10 +1,10 @@
1
1
  import { PlanType } from '../../../graphql.billing.autogenerated';
2
- /** Normalizes landing-page planType query values to billing PlanType. */
3
- export declare function normalizePendingPlanType(raw: string | null | undefined): PlanType | null;
4
2
  export declare function setPendingPlanPurchase(planType: string): void;
5
3
  export declare function getPendingPlanPurchase(): PlanType | null;
6
4
  export declare function clearPendingPlanPurchase(): void;
7
- /** True when the URL search string contains a valid paid planType. */
8
- export declare function hasPlanTypeInSearch(search: string): boolean;
9
- /** Reads planType from a URL search string and persists it when valid. */
10
- export declare function capturePendingPlanFromSearch(search: string): PlanType | null;
5
+ /**
6
+ * Resolves the plan the user intends to buy from the URL first, then from the stored value.
7
+ * A planType found in the URL is persisted, so later steps of the flow keep working once the
8
+ * query param is gone.
9
+ */
10
+ export declare function resolvePendingPlanType(search: string): PlanType | null;
@@ -1,7 +1,9 @@
1
+ import { BroadcastState } from '../../../graphql.autogenerated';
1
2
  interface BroadcastAnalysisContentProps {
2
3
  integrationId: string;
3
4
  templateNameValue: string;
4
5
  loadingBroadcast: boolean;
6
+ broadcastState?: BroadcastState;
5
7
  }
6
- declare const BroadcastAnalysisContent: ({ integrationId, templateNameValue, loadingBroadcast, }: BroadcastAnalysisContentProps) => import("@emotion/react/jsx-runtime").JSX.Element;
8
+ declare const BroadcastAnalysisContent: ({ integrationId, templateNameValue, loadingBroadcast, broadcastState, }: BroadcastAnalysisContentProps) => import("@emotion/react/jsx-runtime").JSX.Element;
7
9
  export default BroadcastAnalysisContent;
@@ -1,3 +1,8 @@
1
1
  import React from 'react';
2
- declare const _default: React.MemoExoticComponent<() => import("@emotion/react/jsx-runtime").JSX.Element>;
2
+ import { BroadcastState } from '../../../graphql.autogenerated';
3
+ interface BroadcastAnalysisReciepientsProps {
4
+ broadcastState?: BroadcastState;
5
+ retryableFailed: number;
6
+ }
7
+ declare const _default: React.MemoExoticComponent<({ broadcastState, retryableFailed, }: BroadcastAnalysisReciepientsProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
3
8
  export default _default;
@@ -15,6 +15,12 @@ interface BroadcastAnalysisReciepientsHeaderProps {
15
15
  /** Workspace delivery report: filter rows by template name substring (server-side). */
16
16
  templateNameQuery?: string;
17
17
  setTemplateNameQuery?: (query: string) => void;
18
+ canRetryFailed?: boolean;
19
+ retryableFailed?: number;
20
+ retryDialogOpen?: boolean;
21
+ onRetryDialogOpenChange?: (open: boolean) => void;
22
+ onRetryFailed?: () => void;
23
+ retryLoading?: boolean;
18
24
  }
19
- declare const _default: React.MemoExoticComponent<({ setSearchQuery, searchQuery, selectedCountry, setSelectedCountry, selectedStage, setSelectedStage, selectedState, setSelectedState, clientStages, onDownloadCsv, templateNameQuery, setTemplateNameQuery, }: BroadcastAnalysisReciepientsHeaderProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
25
+ declare const _default: React.MemoExoticComponent<({ setSearchQuery, searchQuery, selectedCountry, setSelectedCountry, selectedStage, setSelectedStage, selectedState, setSelectedState, clientStages, onDownloadCsv, templateNameQuery, setTemplateNameQuery, canRetryFailed, retryableFailed, retryDialogOpen, onRetryDialogOpenChange, onRetryFailed, retryLoading, }: BroadcastAnalysisReciepientsHeaderProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
20
26
  export default _default;
@@ -1,3 +1,4 @@
1
+ export type ContactStatus = 'active' | 'archived' | 'blocked';
1
2
  interface FilterOptionsProps {
2
3
  setSelectedTags: (tags: string[]) => void;
3
4
  selectedTags: string[];
@@ -5,10 +6,12 @@ interface FilterOptionsProps {
5
6
  selectedStageId: string | undefined;
6
7
  setSelectedAgentId: (agentId: string | undefined) => void;
7
8
  selectedAgentId: string | undefined;
9
+ selectedStatus: ContactStatus;
10
+ setSelectedStatus: (status: ContactStatus) => void;
8
11
  setFilterIsOpen: (isOpen: boolean) => void;
9
12
  onApplyFilters?: () => void;
10
13
  hasAppliedFilters?: boolean;
11
14
  onClearFilters?: () => void;
12
15
  }
13
- declare const FilterOptions: ({ setSelectedTags, selectedTags, setSelectedStageId, selectedStageId, setSelectedAgentId, selectedAgentId, setFilterIsOpen, onApplyFilters, hasAppliedFilters, onClearFilters, }: FilterOptionsProps) => import("@emotion/react/jsx-runtime").JSX.Element;
16
+ declare const FilterOptions: ({ setSelectedTags, selectedTags, setSelectedStageId, selectedStageId, setSelectedAgentId, selectedAgentId, selectedStatus, setSelectedStatus, setFilterIsOpen, onApplyFilters, hasAppliedFilters, onClearFilters, }: FilterOptionsProps) => import("@emotion/react/jsx-runtime").JSX.Element;
14
17
  export default FilterOptions;
@@ -4,6 +4,9 @@ interface ContactFormFieldsProps {
4
4
  isEditMode?: boolean;
5
5
  renderDroplistField?: any;
6
6
  clientStages?: Tag[];
7
+ phoneValue?: string;
8
+ onPhoneChange?: (value: string) => void;
9
+ phoneFieldError?: string;
7
10
  }
8
- declare const ContactFormFields: ({ renderField, renderDroplistField, isEditMode, clientStages, }: ContactFormFieldsProps) => import("@emotion/react/jsx-runtime").JSX.Element;
11
+ declare const ContactFormFields: ({ renderField, renderDroplistField, isEditMode, clientStages, phoneValue, onPhoneChange, phoneFieldError, }: ContactFormFieldsProps) => import("@emotion/react/jsx-runtime").JSX.Element;
9
12
  export default ContactFormFields;
@@ -4,6 +4,7 @@ interface AgentPerformanceCardProps {
4
4
  data?: AgentReportNode[];
5
5
  agentsData?: Agent[];
6
6
  loading?: boolean;
7
+ startDate: string;
7
8
  }
8
- declare const AgentPerformanceCard: ({ data, agentsData, loading }: AgentPerformanceCardProps) => import("@emotion/react/jsx-runtime").JSX.Element;
9
+ declare const AgentPerformanceCard: ({ data, agentsData, loading, startDate }: AgentPerformanceCardProps) => import("@emotion/react/jsx-runtime").JSX.Element;
9
10
  export default AgentPerformanceCard;
@@ -5,6 +5,8 @@ interface BroadcastCampaignProgressCardProps {
5
5
  completedChange: number;
6
6
  failedChange: number;
7
7
  barData: NewBarChartDataItem[];
8
+ startDate: string;
9
+ endDate: string;
8
10
  }
9
- declare const BroadcastCampaignProgressCard: ({ completed, failed, completedChange, failedChange, barData, }: BroadcastCampaignProgressCardProps) => import("@emotion/react/jsx-runtime").JSX.Element;
11
+ declare const BroadcastCampaignProgressCard: ({ completed, failed, completedChange, failedChange, barData, startDate, endDate, }: BroadcastCampaignProgressCardProps) => import("@emotion/react/jsx-runtime").JSX.Element;
10
12
  export default BroadcastCampaignProgressCard;
@@ -0,0 +1,8 @@
1
+ interface DashboardExportButtonProps {
2
+ onClick: () => void;
3
+ disabled?: boolean;
4
+ 'aria-label'?: string;
5
+ }
6
+ /** Compact CSV export control for dashboard report cards. */
7
+ export declare function DashboardExportButton({ onClick, disabled, 'aria-label': ariaLabel }: DashboardExportButtonProps): import("@emotion/react/jsx-runtime").JSX.Element;
8
+ export default DashboardExportButton;
@@ -19,10 +19,11 @@ interface DashboardSectionsProps {
19
19
  assignedConversations?: number;
20
20
  unassignedConversations?: number;
21
21
  liveConvs?: Conversation[] | null;
22
+ periodFilteredLiveConvs?: Conversation[];
22
23
  startDate: string;
23
24
  endDate: string;
24
25
  selectedPeriod: string;
25
26
  reportNodes: ReportNode[];
26
27
  }
27
- declare const _default: React.MemoExoticComponent<({ agentsData, allAgentsData, agentsReportData, agentsLoading, agentsReportLoading, convTagsReportData, convTagsReportLoading, totalMessages, convsLoading, integrationId, agentIds, assignedConversations, unassignedConversations, liveConvs, startDate, endDate, selectedPeriod, reportNodes, }: DashboardSectionsProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
28
+ declare const _default: React.MemoExoticComponent<({ agentsData, allAgentsData, agentsReportData, agentsLoading, agentsReportLoading, convTagsReportData, convTagsReportLoading, totalMessages, convsLoading, integrationId, agentIds, assignedConversations, unassignedConversations, liveConvs, periodFilteredLiveConvs, startDate, endDate, selectedPeriod, reportNodes, }: DashboardSectionsProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
28
29
  export default _default;
@@ -1,9 +1,13 @@
1
+ import { Conversation } from '../../../graphql.autogenerated';
1
2
  export interface AllChatsCardProps {
2
3
  totalMessages?: number;
3
4
  assignedConversations?: number;
4
5
  unassignedConversations?: number;
5
6
  selectedPeriod?: string;
6
7
  loading?: boolean;
8
+ conversations?: Pick<Conversation, 'createdAt' | 'assigneeId'>[];
9
+ startDate?: string;
10
+ endDate?: string;
7
11
  }
8
- declare const OpenedChatsCard: ({ totalMessages, assignedConversations, unassignedConversations, selectedPeriod, loading, }: AllChatsCardProps) => import("@emotion/react/jsx-runtime").JSX.Element;
12
+ declare const OpenedChatsCard: ({ totalMessages, assignedConversations, unassignedConversations, selectedPeriod, loading, conversations, startDate, endDate, }: AllChatsCardProps) => import("@emotion/react/jsx-runtime").JSX.Element;
9
13
  export default OpenedChatsCard;
@@ -3,6 +3,7 @@ type ConvTagReportNode = NonNullable<ConvTagsReportQuery['convTagsReport']['node
3
3
  interface TagPerformanceCardProps {
4
4
  data?: ConvTagReportNode[];
5
5
  loading?: boolean;
6
+ startDate: string;
6
7
  }
7
- declare const TagPerformanceCard: ({ data, loading }: TagPerformanceCardProps) => import("@emotion/react/jsx-runtime").JSX.Element;
8
+ declare const TagPerformanceCard: ({ data, loading, startDate }: TagPerformanceCardProps) => import("@emotion/react/jsx-runtime").JSX.Element;
8
9
  export default TagPerformanceCard;
@@ -0,0 +1,100 @@
1
+ import { BroadcastReportFragment, Conversation } from '../../../graphql.autogenerated';
2
+ import { CsvCell } from '../../../utils/exportCsv';
3
+ export type DashboardExportReportKey = 'opened_chats' | 'conversation_analytics' | 'agent_performance' | 'tag_performance' | 'broadcast_recipients' | 'campaign_progress' | 'status_distribution';
4
+ export declare function dashboardExportFilename(reportKey: DashboardExportReportKey, startDate: string): string;
5
+ /** Matches ticket examples: "21 sec", "4m 30s", "2h 05m". */
6
+ export declare function formatExportDuration(seconds: number): string;
7
+ export interface OpenedChatsExportLabels {
8
+ date: string;
9
+ openedConversations: string;
10
+ assigned: string;
11
+ unassigned: string;
12
+ total: string;
13
+ }
14
+ export declare function buildOpenedChatsExportRows(conversations: Pick<Conversation, 'createdAt' | 'assigneeId'>[], startDate: string, endDate: string): CsvCell[][];
15
+ export declare function exportOpenedChatsCsv(conversations: Pick<Conversation, 'createdAt' | 'assigneeId'>[], startDate: string, endDate: string, labels: OpenedChatsExportLabels): void;
16
+ export interface ConversationAnalyticsExportLabels {
17
+ date: string;
18
+ conversations: string;
19
+ }
20
+ export declare function buildConversationAnalyticsExportRows(reportNodes: {
21
+ createdAt: string;
22
+ conversationCount?: number | null;
23
+ }[], startDate: string, endDate: string): CsvCell[][];
24
+ export declare function exportConversationAnalyticsCsv(reportNodes: {
25
+ createdAt: string;
26
+ conversationCount?: number | null;
27
+ }[], startDate: string, endDate: string, labels: ConversationAnalyticsExportLabels): void;
28
+ export interface AgentPerformanceExportRow {
29
+ agentName: string;
30
+ conversationCount: number;
31
+ newClientConvCount: number;
32
+ agentMessagesCount: number;
33
+ clientMessageCount: number;
34
+ avgFirstResponseTime: number;
35
+ avgConversationTime: number;
36
+ }
37
+ export interface AgentPerformanceExportLabels {
38
+ agent: string;
39
+ closed: string;
40
+ uniqueClosed: string;
41
+ messagesSent: string;
42
+ messagesReceived: string;
43
+ avgResponseTime: string;
44
+ handleTime: string;
45
+ }
46
+ export declare function buildAgentPerformanceExportRows(rows: AgentPerformanceExportRow[]): CsvCell[][];
47
+ export declare function exportAgentPerformanceCsv(rows: AgentPerformanceExportRow[], startDate: string, labels: AgentPerformanceExportLabels): void;
48
+ export interface TagPerformanceExportRow {
49
+ tagName: string;
50
+ conversationCount: number;
51
+ newClientConvCount: number;
52
+ agentMessagesCount: number;
53
+ clientMessageCount: number;
54
+ avgFirstResponseTime: number;
55
+ avgConversationTime: number;
56
+ }
57
+ export interface TagPerformanceExportLabels {
58
+ tag: string;
59
+ closed: string;
60
+ uniqueClosed: string;
61
+ messagesSent: string;
62
+ messagesReceived: string;
63
+ avgResponseTime: string;
64
+ handleTime: string;
65
+ }
66
+ export declare function buildTagPerformanceExportRows(rows: TagPerformanceExportRow[]): CsvCell[][];
67
+ export declare function exportTagPerformanceCsv(rows: TagPerformanceExportRow[], startDate: string, labels: TagPerformanceExportLabels): void;
68
+ export interface RecipientsExportLabels {
69
+ date: string;
70
+ successful: string;
71
+ failed: string;
72
+ totalRecipients: string;
73
+ successRate: string;
74
+ }
75
+ export declare function buildRecipientsExportRows(reportNodes: BroadcastReportFragment[], startDate: string, endDate: string): CsvCell[][];
76
+ export declare function exportRecipientsCsv(reportNodes: BroadcastReportFragment[], startDate: string, endDate: string, labels: RecipientsExportLabels): void;
77
+ export interface CampaignProgressExportLabels {
78
+ date: string;
79
+ successfulCampaigns: string;
80
+ failedCampaigns: string;
81
+ }
82
+ export declare function buildCampaignProgressExportRows(dailyBars: {
83
+ successful?: number;
84
+ failed?: number;
85
+ }[], startDate: string, endDate: string): CsvCell[][];
86
+ export declare function exportCampaignProgressCsv(dailyBars: {
87
+ successful?: number;
88
+ failed?: number;
89
+ }[], startDate: string, endDate: string, labels: CampaignProgressExportLabels): void;
90
+ export interface StatusDistributionExportItem {
91
+ status: string;
92
+ count: number;
93
+ }
94
+ export interface StatusDistributionExportLabels {
95
+ status: string;
96
+ count: string;
97
+ percentage: string;
98
+ }
99
+ export declare function buildStatusDistributionExportRows(items: StatusDistributionExportItem[]): CsvCell[][];
100
+ export declare function exportStatusDistributionCsv(items: StatusDistributionExportItem[], startDate: string, labels: StatusDistributionExportLabels): void;
@@ -0,0 +1,7 @@
1
+ import type { InputHTMLAttributes } from 'react';
2
+ export interface PhoneDigitsInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'type'> {
3
+ value: string;
4
+ onChange: (value: string) => void;
5
+ }
6
+ declare const PhoneDigitsInput: ({ value, onChange, onKeyDown, ...props }: PhoneDigitsInputProps) => import("@emotion/react/jsx-runtime").JSX.Element;
7
+ export default PhoneDigitsInput;
@@ -1,5 +1,5 @@
1
1
  export declare function useOnlineStatus(): {
2
2
  isOnline: boolean;
3
- networkStatus: "online" | "offline" | "checking";
3
+ networkStatus: "offline" | "online" | "checking";
4
4
  isChecking: boolean;
5
5
  };
@@ -12,12 +12,14 @@ interface GetResourceColumnsParams {
12
12
  handleDeleteResource?: (row: CellContext<any, any>) => void;
13
13
  handleArchiveResource?: (row: CellContext<any, any>) => void;
14
14
  handleUnArchiveResource?: (row: CellContext<any, any>) => void;
15
+ handleBlockResource?: (row: CellContext<any, any>) => void;
16
+ handleUnBlockResource?: (row: CellContext<any, any>) => void;
15
17
  currentSortField?: string;
16
18
  currentSortDirection?: 'asc' | 'desc';
17
19
  /** 🔹 NEW: custom cell renderers by field name */
18
20
  customCells?: Record<string, (info: CellContext<any, any>) => React.ReactNode>;
19
21
  }
20
- export declare const useResourceColumns: ({ resourceDef, onSortChange, customHeaderProps, customRowProps, otherActions, handlePatchResource, handleArchiveResource, handleUnArchiveResource, handleDeleteResource, currentSortField, currentSortDirection, customCells, }: GetResourceColumnsParams) => {
22
+ export declare const useResourceColumns: ({ resourceDef, onSortChange, customHeaderProps, customRowProps, otherActions, handlePatchResource, handleArchiveResource, handleUnArchiveResource, handleBlockResource, handleUnBlockResource, handleDeleteResource, currentSortField, currentSortDirection, customCells, }: GetResourceColumnsParams) => {
21
23
  columns: CustomColumn[];
22
24
  actions: TableAction[];
23
25
  };
@@ -12,6 +12,8 @@ interface Props {
12
12
  showOlderMessagesButton?: boolean;
13
13
  isLoadingOlderMessages?: boolean;
14
14
  onLoadOlderMessages?: () => void;
15
+ /** Mobile: return to conversation list (shown before the search icon). */
16
+ onBack?: () => void;
15
17
  }
16
18
  export declare const HeaderContainer: import("@emotion/styled").StyledComponent<import("@bcrumbs.net/bc-ui").HorizontalLayoutProps & {
17
19
  children?: React.ReactNode;
@@ -3,6 +3,11 @@ interface NoConvSelectedProps {
3
3
  convsLength: number;
4
4
  loadingConvs: boolean;
5
5
  handleStartConversation?: () => void;
6
+ hasInboxAccess?: boolean;
7
+ /** Parent already resolved that there are no channels; skip integrations query. */
8
+ forceNoChannels?: boolean;
9
+ /** Parent is still resolving channel state; show loading and skip integrations query. */
10
+ resolvingChannels?: boolean;
6
11
  }
7
12
  declare const NoConvSelected: React.FC<NoConvSelectedProps>;
8
13
  export default NoConvSelected;
@@ -17,6 +17,9 @@ interface Props {
17
17
  showHeader?: boolean;
18
18
  /** Auth user type (e.g. apiKey). Passed by embedded inbox; omit in portal inbox. */
19
19
  userType?: string;
20
+ hasInboxAccess?: boolean;
21
+ /** Mobile: navigate back to the conversation list from the chat header. */
22
+ onBackToList?: () => void;
20
23
  }
21
- declare const Chat: ({ selectedConv, onConvEnd, agents, logo, rtl, convsLength, loadingConvs, handleStartConversation, showNoResults, onContactMessage, onContactAddContact, showHeader, userType, }: Props) => import("@emotion/react/jsx-runtime").JSX.Element;
24
+ declare const Chat: ({ selectedConv, onConvEnd, agents, logo, rtl, convsLength, loadingConvs, handleStartConversation, showNoResults, onContactMessage, onContactAddContact, showHeader, userType, hasInboxAccess, onBackToList, }: Props) => import("@emotion/react/jsx-runtime").JSX.Element;
22
25
  export default Chat;
@@ -5,6 +5,7 @@ interface ClientSectionProps {
5
5
  conversationTags: Tag[];
6
6
  tagsLoading: boolean;
7
7
  refetchTags: () => void;
8
+ onBackToList?: () => void;
8
9
  }
9
- declare const ClientSection: ({ conv, clientTags, conversationTags, tagsLoading, refetchTags, }: ClientSectionProps) => import("@emotion/react/jsx-runtime").JSX.Element;
10
+ declare const ClientSection: ({ conv, clientTags, conversationTags, tagsLoading, refetchTags, onBackToList, }: ClientSectionProps) => import("@emotion/react/jsx-runtime").JSX.Element;
10
11
  export default ClientSection;
@@ -2,6 +2,7 @@ import { ClientQuery } from '../../../../graphql.autogenerated';
2
2
  interface UserHeaderProps {
3
3
  clientData: ClientQuery['client'] | undefined;
4
4
  setEditMode: (editMode: boolean) => void;
5
+ onBackToList?: () => void;
5
6
  }
6
- declare const UserHeader: ({ clientData, setEditMode }: UserHeaderProps) => import("@emotion/react/jsx-runtime").JSX.Element;
7
+ declare const UserHeader: ({ clientData, setEditMode, onBackToList }: UserHeaderProps) => import("@emotion/react/jsx-runtime").JSX.Element;
7
8
  export default UserHeader;
@@ -11,6 +11,7 @@ interface Props {
11
11
  convStages: Tag[];
12
12
  onUpdate?: () => void;
13
13
  clientSectionPlaceholder?: React.ReactNode;
14
+ onBackToList?: () => void;
14
15
  }
15
- declare const NewDetails: ({ conv, clientTags, conversationTags, tagsLoading, refetchTags, agents, aiAgents, convStages, onUpdate, clientSectionPlaceholder, }: Props) => import("@emotion/react/jsx-runtime").JSX.Element;
16
+ declare const NewDetails: ({ conv, clientTags, conversationTags, tagsLoading, refetchTags, agents, aiAgents, convStages, onUpdate, clientSectionPlaceholder, onBackToList, }: Props) => import("@emotion/react/jsx-runtime").JSX.Element;
16
17
  export default NewDetails;
@@ -13,8 +13,11 @@ export declare const MobileContent: import("@emotion/styled").StyledComponent<{
13
13
  } & {
14
14
  $reserveBottomNavSpace?: boolean | undefined;
15
15
  }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
16
- export declare const InboxNoSelectionContainer: ({ convsLength, loadingConvs, handleStartConversation, }: {
16
+ export declare const InboxNoSelectionContainer: ({ convsLength, loadingConvs, handleStartConversation, hasInboxAccess, forceNoChannels, resolvingChannels, }: {
17
17
  convsLength?: number;
18
18
  loadingConvs?: boolean;
19
19
  handleStartConversation?: () => void;
20
+ hasInboxAccess?: boolean;
21
+ forceNoChannels?: boolean;
22
+ resolvingChannels?: boolean;
20
23
  }) => import("@emotion/react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { ReactNode } from 'react';
2
+ type MobileChatDetailsSliderProps = {
3
+ showDetails: boolean;
4
+ onShowDetailsChange: (showDetails: boolean) => void;
5
+ rtl?: boolean;
6
+ chat: ReactNode;
7
+ details: ReactNode;
8
+ };
9
+ /**
10
+ * Side-by-side chat/details pager with follow-the-finger drag.
11
+ * Pane order is always [chat | details] in physical LTR space.
12
+ * Edge chevron buttons remain for one-tap navigation.
13
+ */
14
+ export declare const MobileChatDetailsSlider: ({ showDetails, onShowDetailsChange, rtl, chat, details, }: MobileChatDetailsSliderProps) => import("@emotion/react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,9 @@
1
+ type MobileDetailsSwipeHintProps = {
2
+ rtl?: boolean;
3
+ onClick: () => void;
4
+ /** `toDetails` sits on the trailing edge; `toChat` on the leading edge. */
5
+ direction?: 'toDetails' | 'toChat';
6
+ };
7
+ /** Edge affordance for mobile chat ↔ details swipe navigation. */
8
+ export declare const MobileDetailsSwipeHint: ({ onClick, direction, }: MobileDetailsSwipeHintProps) => import("@emotion/react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -3,6 +3,7 @@ export type { MobileViews };
3
3
  type MobileMenuProps = {
4
4
  activePage: MobileViews;
5
5
  setActivePage: (page: MobileViews) => void;
6
+ /** @deprecated Details is opened via swipe; kept for call-site compatibility. */
6
7
  hideDetails?: boolean;
7
8
  };
8
- export declare const MobileMenu: ({ activePage, setActivePage, hideDetails }: MobileMenuProps) => import("@emotion/react/jsx-runtime").JSX.Element;
9
+ export declare const MobileMenu: ({ activePage, setActivePage }: MobileMenuProps) => import("@emotion/react/jsx-runtime").JSX.Element;
@@ -12,5 +12,6 @@ interface ConvActionsProps {
12
12
  }
13
13
  declare const useConvActions: ({ conv, handleChangeStage, handleAssignAgent, agents, convStages, myAgent, onConvEnd, aiAgents, }: ConvActionsProps) => {
14
14
  DropdownActions: ActionItem[];
15
+ CrumbyUpgradeDialog: import("@emotion/react/jsx-runtime").JSX.Element;
15
16
  };
16
17
  export default useConvActions;
@@ -22,6 +22,8 @@ declare function useConversationsPeriodicFetch(selectedConvId?: string, onSelect
22
22
  ratingFlowInProgress?: boolean | null | undefined;
23
23
  broadcastId?: string | null | undefined;
24
24
  broadcastName?: string | null | undefined;
25
+ sourceType?: string | null | undefined;
26
+ sourceUrl?: string | null | undefined;
25
27
  integrationSwitches?: {
26
28
  __typename?: "ConvIntegrationSwitch" | undefined;
27
29
  fromIntegrationId: string;
@@ -57,6 +59,7 @@ declare function useConversationsPeriodicFetch(selectedConvId?: string, onSelect
57
59
  surname?: string | null | undefined;
58
60
  code?: string | null | undefined;
59
61
  phone?: string | null | undefined;
62
+ avatarUrl?: string | null | undefined;
60
63
  isDeleted: boolean;
61
64
  } | null | undefined;
62
65
  assignees?: ({
@@ -0,0 +1,5 @@
1
+ type StartedTimeAgoTranslation = (key: string, options?: {
2
+ count?: number;
3
+ }) => string;
4
+ export declare function useStartedTimeAgo(createdAt: string, t: StartedTimeAgoTranslation): string;
5
+ export {};