@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
@@ -26,6 +26,9 @@ interface BuildAgentsMenuOptions {
26
26
  assignableAis?: Ai[];
27
27
  onAssignableAiSelect?: (aiId: string) => void;
28
28
  onUnassigneeSelect?: () => void;
29
+ /** When false, Crumby is shown locked with an Upgrade CTA */
30
+ isCrumbyEnabled?: boolean;
31
+ onCrumbyUpgrade?: () => void;
29
32
  t: any;
30
33
  includeAllOption?: boolean;
31
34
  onAllSelect?: () => void;
@@ -45,9 +48,13 @@ export declare function getLastMessage(messages: Maybe<Message[]> | undefined, f
45
48
  export declare function hashStatuses(messages?: Maybe<Message[]> | null): string;
46
49
  export declare function isOutside24HourWindow(message: Message | null | undefined): boolean;
47
50
  export declare function formatSeconds(value: number): string;
51
+ type StartedTimeAgoTranslation = (key: string, options?: {
52
+ count?: number;
53
+ }) => string;
54
+ export declare function formatStartedTimeAgo(createdAt: string, t: StartedTimeAgoTranslation): string;
48
55
  export declare const getMessageStatusIcon: (message: Message | null | undefined) => import("@emotion/react/jsx-runtime").JSX.Element | null;
49
56
  export declare const getDisplayName: (clientData: ClientQuery['client'] | undefined) => string;
50
- export declare const buildAgentsMenu: ({ agents, myAgent, selectedAgentId, selectedAiId, onAgentSelect, assignableAis, onAssignableAiSelect, onUnassigneeSelect, t, includeAllOption, onAllSelect, addSeparatorAtLast, counts, showAllAgents, }: BuildAgentsMenuOptions) => ActionItem[];
57
+ export declare const buildAgentsMenu: ({ agents, myAgent, selectedAgentId, selectedAiId, onAgentSelect, assignableAis, onAssignableAiSelect, onUnassigneeSelect, isCrumbyEnabled, onCrumbyUpgrade, t, includeAllOption, onAllSelect, addSeparatorAtLast, counts, showAllAgents, }: BuildAgentsMenuOptions) => ActionItem[];
51
58
  export declare const buildLifeCycleMenu: ({ convStages, selectedStageId, onStageSelect, t, addSeparatorAtLast, }: BuildLifeCycleMenuOptions) => ActionItem[];
52
59
  interface BuildTagsMenuOptions {
53
60
  conversationTags: Tag[];
@@ -1,10 +1,20 @@
1
1
  import { Ai } from '../../../graphql.autogenerated';
2
2
  /** Stored name for the primary Crumby assistant record */
3
3
  export declare const CRUMBY_AI_RECORD_NAME = "Crumby AI";
4
+ /** Placeholder id used when Crumby is shown as a locked upgrade option */
5
+ export declare const CRUMBY_UPGRADE_PLACEHOLDER_ID = "__crumby_upgrade__";
6
+ export declare const isCrumbyAi: (ai: Pick<Ai, 'name' | 'type'> | undefined | null) => boolean;
7
+ export declare const createCrumbyUpgradePlaceholder: () => Ai;
4
8
  /** Primary Crumby assistant rows first, then remaining AIs by name */
5
9
  export declare function sortInboxAssignableAis(ais: Ai[]): Ai[];
6
10
  /**
7
11
  * Workspace AIs users may assign or filter by in the inbox.
8
- * Excludes internal assistants and hides Crumby when the feature flag is off.
12
+ * Excludes internal assistants. When Crumby is not plan-enabled, it is omitted
13
+ * from filters; assign menus inject a locked upgrade entry separately.
9
14
  */
10
15
  export declare function getInboxAssignableAis(aiAgents: Ai[] | undefined, isCrumbyEnabled: boolean): Ai[];
16
+ /**
17
+ * Assign-menu list: always includes Crumby. When the feature is locked, uses an
18
+ * existing Crumby record if present, otherwise a non-assignable placeholder.
19
+ */
20
+ export declare function getInboxAssignableAisForMenu(aiAgents: Ai[] | undefined, isCrumbyEnabled: boolean, existingCrumby?: Ai | null): Ai[];
@@ -8,8 +8,18 @@ export declare const BCMainNavigation: {
8
8
  action: string;
9
9
  description: string;
10
10
  tags: string[];
11
+ requiredPermissions: Permission[];
11
12
  subMenu?: undefined;
13
+ } | {
14
+ label: string;
15
+ title: string;
16
+ icon: import("@emotion/react/jsx-runtime").JSX.Element;
17
+ link: string;
18
+ action: string;
19
+ description: string;
20
+ tags: string[];
12
21
  requiredPermissions?: undefined;
22
+ subMenu?: undefined;
13
23
  } | {
14
24
  label: string;
15
25
  title: string;
@@ -38,16 +48,6 @@ export declare const BCMainNavigation: {
38
48
  }[];
39
49
  tags: string[];
40
50
  requiredPermissions: Permission[];
41
- } | {
42
- label: string;
43
- title: string;
44
- icon: import("@emotion/react/jsx-runtime").JSX.Element;
45
- link: string;
46
- action: string;
47
- description: string;
48
- tags: string[];
49
- requiredPermissions: Permission[];
50
- subMenu?: undefined;
51
51
  })[];
52
52
  leftBottomLinks: {
53
53
  label: string;
@@ -1 +1,19 @@
1
+ /**
2
+ * Whether the workspace has the paid AI features enabled: the AI tab (Playground,
3
+ * Sources), conversation assignment to Crumby, and the AI-specific onboarding steps.
4
+ * Gated by the plan's `aiEnabled` flag (or a feature-flag override).
5
+ *
6
+ * NOTE: This does NOT gate the Crumby assistant chat widget — that is available on
7
+ * all plans (including free) via `useCrumbyAssistantEnabled`.
8
+ */
1
9
  export declare const useCrumbyEnabled: () => boolean;
10
+ /**
11
+ * Whether the Crumby assistant chat widget should be shown. The assistant is available
12
+ * on every plan, including free — unlike the paid AI features gated by `useCrumbyEnabled`.
13
+ *
14
+ * Returns a constant `true` for now (no rule). It is kept as a hook to act as the single
15
+ * seam for future gating — e.g. a kill switch (feature flag / PostHog), a whitelabel with
16
+ * no AI, or a backend "assistant enabled" flag — so only this hook changes, not every call
17
+ * site. It also keeps the call site readable and symmetric with `useCrumbyEnabled`.
18
+ */
19
+ export declare const useCrumbyAssistantEnabled: () => boolean;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared upgrade CTA for Crumby when the plan/feature flag does not enable AI.
3
+ * Owners/admins go to the workspace upgrade page; others see a contact-admin dialog.
4
+ */
5
+ export declare const useCrumbyUpgradeAction: () => {
6
+ isCrumbyEnabled: boolean;
7
+ canManageUpgrade: boolean;
8
+ requestCrumbyUpgrade: any;
9
+ CrumbyUpgradeDialog: import("@emotion/react/jsx-runtime").JSX.Element;
10
+ };
@@ -62,5 +62,7 @@ export interface ResourceDefinition<T> {
62
62
  unDeleteMutation?: Omit<BackendMutationDefinition<T>, 'fields'>;
63
63
  archiveMutation?: Omit<BackendMutationDefinition<T>, 'fields'>;
64
64
  unArchiveMutation?: Omit<BackendMutationDefinition<T>, 'fields'>;
65
+ blockMutation?: Omit<BackendMutationDefinition<T>, 'fields'>;
66
+ unBlockMutation?: Omit<BackendMutationDefinition<T>, 'fields'>;
65
67
  client?: Apollo.ApolloClient<Apollo.NormalizedCacheObject>;
66
68
  }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Durable persistence for onboarding checklist data (state + dismissed flag).
3
+ *
4
+ * Backed by cookies on purpose: logout runs `auth.clearAllAppStorage()` which wipes
5
+ * localStorage/sessionStorage but NOT cookies, so progress and the "finished" flag
6
+ * survive a logout → login cycle (same browser).
7
+ *
8
+ * This is a temporary stand-in for a backend-owned onboarding record. When the backend
9
+ * returns the flag + progress, swap the implementation of `onboardingChecklistStore`
10
+ * (or its call sites) for the server-backed read/writes — the get/set/remove shape
11
+ * matches the localStorage util so the change stays local.
12
+ */
13
+ /** Cookie-backed store mirroring the localStorage util's get/set/remove shape. */
14
+ export declare const onboardingChecklistStore: {
15
+ get(key: string): unknown;
16
+ set(key: string, value: unknown): void;
17
+ remove(key: string): void;
18
+ };
@@ -15,7 +15,8 @@ export declare function getOnboardingChecklistStorageKey(userId: string | number
15
15
  /** Pre-workspace-scoping key: showcase_onboarding_checklist_{userId} */
16
16
  export declare function getLegacyOnboardingChecklistStorageKey(userId: string | number): string;
17
17
  /**
18
- * Load checklist for user + workspace. Migrates legacy user-only (and empty-workspace) keys once.
18
+ * Load checklist for user + workspace from the durable (cookie) store. Migrates the older
19
+ * localStorage keys (scoped, legacy user-only, empty-workspace) into the cookie store once.
19
20
  * Returns null when workspace context is not available.
20
21
  */
21
22
  export declare function loadOnboardingChecklistState(userId: string | number, workspaceId?: string | number | null): OnboardingChecklistState | null;
@@ -25,6 +26,14 @@ export declare function loadOnboardingChecklistState(userId: string | number, wo
25
26
  * first load and creates the checklist scoped to whichever workspace the user landed in.
26
27
  */
27
28
  export declare function getOnboardingChecklistPendingKey(userId: string | number): string;
29
+ /**
30
+ * Persisted "user finished / dismissed onboarding for this workspace" marker.
31
+ * Unlike the checklist key (which is removed on finish), this survives so that a later
32
+ * logout → login does not recreate a fresh checklist for a workspace already onboarded.
33
+ */
34
+ export declare function getOnboardingChecklistDismissedKey(userId: string | number, workspaceId?: string | number | null): string;
35
+ export declare function isOnboardingChecklistDismissed(userId: string | number, workspaceId?: string | number | null): boolean;
36
+ export declare function markOnboardingChecklistDismissed(userId: string | number, workspaceId?: string | number | null): void;
28
37
  /** One-shot: open checklist popover after sign-in (session tab only). */
29
38
  export declare const ONBOARDING_CHECKLIST_SESSION_AUTOPEN_KEY = "showcase_onboarding_checklist_session_autopen";
30
39
  export declare function clearOnboardingChecklistSessionAutopen(): void;
@@ -1,8 +1,10 @@
1
1
  import { IntegrationWithSecrets } from '../../../../../graphql.autogenerated';
2
2
  import { FBPage } from '../../../hooks/useFBPagesHook';
3
- export declare function PagePickerPopup({ onClose, setInitialValues, pages, rtl, }: {
3
+ export declare function PagePickerPopup({ onClose, setInitialValues, pages, userAccessToken, rtl, }: {
4
4
  onClose: () => void;
5
5
  setInitialValues: (initialResource: Partial<IntegrationWithSecrets>) => void;
6
6
  pages: FBPage[];
7
+ /** Short-lived Facebook user token; exchanged server-side for a long-lived page token. */
8
+ userAccessToken: string;
7
9
  rtl?: boolean;
8
10
  }): import("@emotion/react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ export type OnboardingStepStatus = 'complete' | 'active' | 'upcoming';
2
+ export type OnboardingStepKey = 'registration' | 'workspace' | 'checkout';
3
+ type OnboardingStepperProps = {
4
+ /** Status per step; defaults to registration complete, workspace active, checkout upcoming. */
5
+ statuses?: Partial<Record<OnboardingStepKey, OnboardingStepStatus>>;
6
+ };
7
+ export declare const OnboardingStepper: ({ statuses }: OnboardingStepperProps) => import("@emotion/react/jsx-runtime").JSX.Element;
8
+ export default OnboardingStepper;
@@ -0,0 +1,6 @@
1
+ type SubscriptionFailedProps = {
2
+ loading?: boolean;
3
+ onRetry: () => void;
4
+ };
5
+ export declare const SubscriptionFailed: ({ loading, onRetry }: SubscriptionFailedProps) => import("@emotion/react/jsx-runtime").JSX.Element;
6
+ export default SubscriptionFailed;
@@ -1,5 +1,5 @@
1
1
  type SubscriptionNameProps = {
2
- onSubmit: (companyName: any) => void;
2
+ onSubmit: (companyName: string) => void;
3
3
  };
4
4
  export declare const SubscriptionName: (props: SubscriptionNameProps) => import("@emotion/react/jsx-runtime").JSX.Element;
5
5
  export default SubscriptionName;
@@ -1,5 +1,8 @@
1
1
  type SubscriptionSuccessProps = {
2
- sessionId?: string;
2
+ /** Workspace that was created/paid for; activated before navigating to the inbox. */
3
+ workspaceId?: number;
4
+ /** When false, copy reflects activation without a payment (free plan). */
5
+ paid?: boolean;
3
6
  };
4
- export declare const SubscriptionSuccess: ({ sessionId, }: SubscriptionSuccessProps) => import("@emotion/react/jsx-runtime").JSX.Element;
7
+ export declare const SubscriptionSuccess: ({ workspaceId, paid }: SubscriptionSuccessProps) => import("@emotion/react/jsx-runtime").JSX.Element;
5
8
  export default SubscriptionSuccess;
@@ -0,0 +1,11 @@
1
+ import { ReactNode } from 'react';
2
+ import { OnboardingStepKey, OnboardingStepStatus } from './OnboardingStepper';
3
+ type WorkspaceStepLayoutProps = {
4
+ statuses?: Partial<Record<OnboardingStepKey, OnboardingStepStatus>>;
5
+ illustration: string;
6
+ title: string;
7
+ subtitle?: string;
8
+ children?: ReactNode;
9
+ };
10
+ export declare const WorkspaceStepLayout: ({ statuses, illustration, title, subtitle, children, }: WorkspaceStepLayoutProps) => import("@emotion/react/jsx-runtime").JSX.Element;
11
+ export default WorkspaceStepLayout;
@@ -10,6 +10,8 @@ type ShowcasePlansProps = {
10
10
  selectingPlan?: boolean;
11
11
  processing?: boolean;
12
12
  loadingPlanType?: PlanType | null;
13
+ /** Force the Crumby AI plan toggle on (e.g. deep-link from upgrade CTA). */
14
+ defaultIncludeAi?: boolean;
13
15
  };
14
- export declare const ShowcasePlans: ({ onPlanPicked, disableFreePlan, currentPlanType, currentTerm, selectingPlan, processing, loadingPlanType, }: ShowcasePlansProps) => import("@emotion/react/jsx-runtime").JSX.Element;
16
+ export declare const ShowcasePlans: ({ onPlanPicked, disableFreePlan, currentPlanType, currentTerm, selectingPlan, processing, loadingPlanType, defaultIncludeAi, }: ShowcasePlansProps) => import("@emotion/react/jsx-runtime").JSX.Element;
15
17
  export default ShowcasePlans;
@@ -17,4 +17,4 @@ export type SwitcherProps = {
17
17
  compact?: boolean;
18
18
  workspaceLogo?: React.ReactNode;
19
19
  };
20
- export declare function Switcher({ items, title, headerItems, footerItems, width, name, maxVisibleItems, addPlanWord, isLoading, plan, onDropdownStateChange, compact, workspaceLogo, }: SwitcherProps): import("@emotion/react/jsx-runtime").JSX.Element;
20
+ export declare function Switcher({ items, title, footerItems, width, name, addPlanWord, isLoading, plan, onDropdownStateChange, compact, workspaceLogo, }: SwitcherProps): import("@emotion/react/jsx-runtime").JSX.Element;
@@ -3,6 +3,6 @@ export type Props = {
3
3
  history: any;
4
4
  router: any;
5
5
  };
6
- export declare const NewSubscription: ({ router, }: Props) => import("@emotion/react/jsx-runtime").JSX.Element;
6
+ export declare const NewSubscription: ({ router }: Props) => import("@emotion/react/jsx-runtime").JSX.Element;
7
7
  declare const _default: any;
8
8
  export default _default;
@@ -0,0 +1,19 @@
1
+ import { PlanType, Term } from '../../../graphql.billing.autogenerated';
2
+ export type UpgradeProrationEstimate = {
3
+ newPlanPrice: number;
4
+ remainingValue: number;
5
+ chargeAmount: number;
6
+ remainingDays: number;
7
+ };
8
+ /**
9
+ * Estimates Polar-style mid-cycle upgrade charge:
10
+ * (newPeriodPrice − currentPeriodPrice) × remainingFraction, floored at 0.
11
+ */
12
+ export declare function estimateUpgradeProration(params: {
13
+ currentPlanType: PlanType;
14
+ currentTerm: Term;
15
+ targetPlanType: PlanType;
16
+ targetTerm: Term;
17
+ startDate?: string | null;
18
+ endDate?: string | null;
19
+ }): UpgradeProrationEstimate | null;
@@ -0,0 +1,16 @@
1
+ import { PlanType } from '../../../graphql.billing.autogenerated';
2
+ /**
3
+ * Marker written right before redirecting to a hosted checkout (Polar/Stripe) from the
4
+ * new-workspace onboarding flow. Because the backend always returns hosted checkouts to
5
+ * `/billing/done`, the done page reads this per-tab marker to tell a new-workspace checkout
6
+ * apart from a normal upgrade, then routes the user back into the workspace stepper flow.
7
+ * It also remembers the plan so the failed screen can retry the same checkout.
8
+ */
9
+ export declare const NEW_WORKSPACE_PENDING_CHECKOUT_KEY = "bc_new_workspace_pending_checkout";
10
+ export type PendingCheckout = {
11
+ workspaceId: number;
12
+ planType: PlanType;
13
+ };
14
+ export declare function storePendingCheckout(value: PendingCheckout): void;
15
+ export declare function readPendingCheckout(): PendingCheckout | null;
16
+ export declare function clearPendingCheckout(): void;
@@ -22,10 +22,19 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
22
22
  auth: {
23
23
  e_mail: string;
24
24
  password: string;
25
+ signInTo: string;
26
+ signUpTo: string;
27
+ signUpSubtitle: string;
28
+ signUpGoogle: string;
29
+ signUpFacebook: string;
30
+ registerPanelTitle: string;
31
+ registerPanelDescription: string;
25
32
  welcomeToBC: string;
33
+ welcomeBackDescription: string;
26
34
  getStarted: string;
27
35
  keepMeSignedIn: string;
28
36
  forgetPassword: string;
37
+ or: string;
29
38
  login: string;
30
39
  register: string;
31
40
  loginFailed: string;
@@ -41,6 +50,8 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
41
50
  forgetToSendEmail: string;
42
51
  forgetTitle: string;
43
52
  forgetPrompt: string;
53
+ verificationCode: string;
54
+ verificationCodePlaceholder: string;
44
55
  getStartedBtn: string;
45
56
  continue: string;
46
57
  dontHaveAnAccount: string;
@@ -162,6 +173,24 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
162
173
  gravatarTooltip: string;
163
174
  terms: string;
164
175
  };
176
+ newWorkspaceFlow: {
177
+ steps: {
178
+ registration: string;
179
+ workspace: string;
180
+ checkout: string;
181
+ };
182
+ createTitle: string;
183
+ createSubtitle: string;
184
+ namePlaceholder: string;
185
+ createButton: string;
186
+ successTitle: string;
187
+ successSubtitle: string;
188
+ successSubtitleFree: string;
189
+ goToInbox: string;
190
+ failedTitle: string;
191
+ failedSubtitle: string;
192
+ tryAgain: string;
193
+ };
165
194
  subscriptions: {
166
195
  planName: string;
167
196
  subscriptions: string;
@@ -421,6 +450,9 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
421
450
  emptyMessagePreviewTitle: string;
422
451
  emptyMessagePreviewSubtitle: string;
423
452
  templateSelection: string;
453
+ templateLanguageMissing: string;
454
+ messageParametersMissing: string;
455
+ completeRequiredFields: string;
424
456
  messageParameters: string;
425
457
  analysis: {
426
458
  deliveryRate: string;
@@ -448,6 +480,14 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
448
480
  openBroadcastReport: string;
449
481
  messageSentAt: string;
450
482
  template: string;
483
+ retryFailed: string;
484
+ retryFailedDialogTitle: string;
485
+ retryFailedDialogDescription: string;
486
+ retryFailedConfirm: string;
487
+ retryFailedSuccessTitle: string;
488
+ retryFailedSuccessDescription: string;
489
+ retryFailedErrorTitle: string;
490
+ retryFailedErrorDescription: string;
451
491
  };
452
492
  recipientsReport: {
453
493
  pageTitle: string;
@@ -456,6 +496,7 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
456
496
  templateNameFilter: string;
457
497
  noRowsToExport: string;
458
498
  };
499
+ launch: string;
459
500
  };
460
501
  resources: {
461
502
  loginToFB: string;
@@ -524,8 +565,10 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
524
565
  modify: string;
525
566
  removeItem: string;
526
567
  archivingResource: string;
568
+ blockingResource: string;
527
569
  removingConfirmation: string;
528
570
  archivingConfirmation: string;
571
+ blockingConfirmation: string;
529
572
  launchingConfirmation: string;
530
573
  name: string;
531
574
  surname: string;
@@ -566,6 +609,7 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
566
609
  messageUpdated: string;
567
610
  endingConv: string;
568
611
  newConv: string;
612
+ conversationAssigned: string;
569
613
  newClient: string;
570
614
  clientUpdated: string;
571
615
  broadcast: string;
@@ -651,6 +695,23 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
651
695
  selectAll: string;
652
696
  clearAll: string;
653
697
  reports: string;
698
+ export: {
699
+ csv: string;
700
+ columns: {
701
+ date: string;
702
+ openedConversations: string;
703
+ conversations: string;
704
+ messagesReceived: string;
705
+ avgResponseTime: string;
706
+ successful: string;
707
+ totalRecipients: string;
708
+ successfulCampaigns: string;
709
+ failedCampaigns: string;
710
+ status: string;
711
+ count: string;
712
+ percentage: string;
713
+ };
714
+ };
654
715
  broadcast: {
655
716
  title: string;
656
717
  period: {
@@ -786,6 +847,8 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
786
847
  delete: string;
787
848
  submit: string;
788
849
  archive: string;
850
+ block: string;
851
+ unblock: string;
789
852
  close: string;
790
853
  date: string;
791
854
  time: string;
@@ -891,13 +954,19 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
891
954
  contactDeleteTitle: string;
892
955
  contactArchiveTitle: string;
893
956
  contactUnarchiveTitle: string;
957
+ contactBlockTitle: string;
958
+ contactUnblockTitle: string;
894
959
  unarchive: string;
895
960
  exportingClients: string;
896
961
  exportCompleted: string;
897
962
  exportFailed: string;
898
963
  noContactsToExport: string;
899
964
  selectedLifecycle: string;
965
+ active: string;
900
966
  archived: string;
967
+ blacklisted: string;
968
+ contactStatus: string;
969
+ blocked: string;
901
970
  };
902
971
  management: {
903
972
  title: string;
@@ -1102,6 +1171,10 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
1102
1171
  customExternalId: string;
1103
1172
  customExternalIdPlaceholder: string;
1104
1173
  gupshupChannelDescription: string;
1174
+ gupshupPartnerId: string;
1175
+ gupshupPartnerIdNote: string;
1176
+ gupshupPartnerIdCopied: string;
1177
+ gupshupPartnerIdCopyFailed: string;
1105
1178
  gupshupDisplayPhoneNumber: string;
1106
1179
  gupshupDisplayPhoneNumberPlaceholder: string;
1107
1180
  gupshupAccessToken: string;
@@ -1123,6 +1196,10 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
1123
1196
  integrationIdCopyFailed: string;
1124
1197
  rating: string;
1125
1198
  ratingDescription: string;
1199
+ sendOnly: string;
1200
+ sendOnlyDescription: string;
1201
+ sendOnlyMessage: string;
1202
+ sendOnlyMessagePlaceholder: string;
1126
1203
  };
1127
1204
  crumby: {
1128
1205
  title: string;
@@ -1139,6 +1216,11 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
1139
1216
  test_numbers: string;
1140
1217
  suggested_qs: string;
1141
1218
  crumby_settings: string;
1219
+ upgrade: {
1220
+ cta: string;
1221
+ contactAdminTitle: string;
1222
+ contactAdminDescription: string;
1223
+ };
1142
1224
  playground: {
1143
1225
  welcomeMessage: string;
1144
1226
  askTheAIToAnalyzeYourData: string;
@@ -1335,6 +1417,8 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
1335
1417
  delete_confirmation: string;
1336
1418
  archive_confirmation: string;
1337
1419
  unarchive_confirmation: string;
1420
+ block_confirmation: string;
1421
+ unblock_confirmation: string;
1338
1422
  };
1339
1423
  send: string;
1340
1424
  }>, current?: string) => void;
@@ -1,4 +1,5 @@
1
1
  export type PaymentProvider = 'stripe' | 'polar' | 'none';
2
+ export type AuthProvider = 'clerk' | 'legacy';
2
3
  export type Environment = {
3
4
  production: boolean;
4
5
  enablePaidPlans: boolean;
@@ -17,4 +18,8 @@ export type Environment = {
17
18
  partner?: string;
18
19
  turnstileSiteKey?: string;
19
20
  stripeKey?: string;
21
+ /** When 'clerk', login/register use Clerk UI. Defaults to legacy DConfig forms. */
22
+ authProvider?: AuthProvider;
23
+ /** Required when authProvider is 'clerk'. Publishable key only — never the secret. */
24
+ clerkPublishableKey?: string;
20
25
  };