chore: remove Intercom integration and chat support components (#8875)

Intercom is no longer used. This removes all related frontend components,
hooks, custom events, API config, types, and i18n keys.
This commit is contained in:
sriram veeraghanta 2026-04-10 00:16:45 +05:30 committed by GitHub
parent e6b9d4c9ba
commit c21d2c6fb3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
28 changed files with 3 additions and 240 deletions

View file

@ -16,8 +16,6 @@ import { Input, ToggleSwitch } from "@plane/ui";
import { ControllerInput } from "@/components/common/controller-input";
// hooks
import { useInstance } from "@/hooks/store";
// components
import { IntercomConfig } from "./intercom";
export interface IGeneralConfigurationForm {
instance: IInstance;
@ -27,14 +25,13 @@ export interface IGeneralConfigurationForm {
export const GeneralConfigurationForm = observer(function GeneralConfigurationForm(props: IGeneralConfigurationForm) {
const { instance, instanceAdmins } = props;
// hooks
const { instanceConfigurations, updateInstanceInfo, updateInstanceConfigurations } = useInstance();
const { updateInstanceInfo } = useInstance();
// form data
const {
handleSubmit,
control,
formState: { errors, isSubmitting },
watch,
} = useForm<Partial<IInstance>>({
defaultValues: {
instance_name: instance?.instance_name,
@ -45,17 +42,6 @@ export const GeneralConfigurationForm = observer(function GeneralConfigurationFo
const onSubmit = async (formData: Partial<IInstance>) => {
const payload: Partial<IInstance> = { ...formData };
// update the intercom configuration
const isIntercomEnabled =
instanceConfigurations?.find((config) => config.key === "IS_INTERCOM_ENABLED")?.value === "1";
if (!payload.is_telemetry_enabled && isIntercomEnabled) {
try {
await updateInstanceConfigurations({ IS_INTERCOM_ENABLED: "0" });
} catch (error) {
console.error(error);
}
}
await updateInstanceInfo(payload)
.then(() =>
setToast({
@ -112,8 +98,7 @@ export const GeneralConfigurationForm = observer(function GeneralConfigurationFo
</div>
<div className="space-y-6">
<div className="border-b border-subtle pb-1.5 text-16 font-medium text-primary">Chat + telemetry</div>
<IntercomConfig isTelemetryEnabled={watch("is_telemetry_enabled") ?? false} />
<div className="border-b border-subtle pb-1.5 text-16 font-medium text-primary">Telemetry</div>
<div className="flex items-center gap-14">
<div className="flex grow items-center gap-4">
<div className="shrink-0">

View file

@ -1,86 +0,0 @@
/**
* Copyright (c) 2023-present Plane Software, Inc. and contributors
* SPDX-License-Identifier: AGPL-3.0-only
* See the LICENSE file for details.
*/
import { useState } from "react";
import { observer } from "mobx-react";
import useSWR from "swr";
import { MessageSquare } from "lucide-react";
import type { IFormattedInstanceConfiguration } from "@plane/types";
import { ToggleSwitch } from "@plane/ui";
// hooks
import { useInstance } from "@/hooks/store";
type TIntercomConfig = {
isTelemetryEnabled: boolean;
};
export const IntercomConfig = observer(function IntercomConfig(props: TIntercomConfig) {
const { isTelemetryEnabled } = props;
// hooks
const { instanceConfigurations, updateInstanceConfigurations, fetchInstanceConfigurations } = useInstance();
// states
const [isSubmitting, setIsSubmitting] = useState<boolean>(false);
// derived values
const isIntercomEnabled = isTelemetryEnabled
? instanceConfigurations
? instanceConfigurations?.find((config) => config.key === "IS_INTERCOM_ENABLED")?.value === "1"
? true
: false
: undefined
: false;
const { isLoading } = useSWR(isTelemetryEnabled ? "INSTANCE_CONFIGURATIONS" : null, () =>
isTelemetryEnabled ? fetchInstanceConfigurations() : null
);
const initialLoader = isLoading && isIntercomEnabled === undefined;
const submitInstanceConfigurations = async (payload: Partial<IFormattedInstanceConfiguration>) => {
try {
await updateInstanceConfigurations(payload);
} catch (error) {
console.error(error);
} finally {
setIsSubmitting(false);
}
};
const enableIntercomConfig = () => {
void submitInstanceConfigurations({ IS_INTERCOM_ENABLED: isIntercomEnabled ? "0" : "1" });
};
return (
<>
<div className="flex items-center gap-14">
<div className="flex grow items-center gap-4">
<div className="shrink-0">
<div className="flex size-11 items-center justify-center rounded-lg bg-layer-1">
<MessageSquare className="size-5 p-0.5 text-tertiary" />
</div>
</div>
<div className="grow">
<div className="text-13 leading-5 font-medium text-primary">Chat with us</div>
<div className="text-11 leading-5 font-regular text-tertiary">
Let your users chat with us via Intercom or another service. Toggling Telemetry off turns this off
automatically.
</div>
</div>
<div className="ml-auto">
<ToggleSwitch
value={isIntercomEnabled ? true : false}
onChange={enableIntercomConfig}
size="sm"
disabled={!isTelemetryEnabled || isSubmitting || initialLoader}
/>
</div>
</div>
</div>
</>
);
});

View file

@ -63,8 +63,6 @@ class InstanceEndpoint(BaseAPIView):
POSTHOG_HOST,
UNSPLASH_ACCESS_KEY,
LLM_API_KEY,
IS_INTERCOM_ENABLED,
INTERCOM_APP_ID,
) = get_configuration_value(
[
{
@ -124,15 +122,6 @@ class InstanceEndpoint(BaseAPIView):
"key": "LLM_API_KEY",
"default": os.environ.get("LLM_API_KEY", ""),
},
# Intercom settings
{
"key": "IS_INTERCOM_ENABLED",
"default": os.environ.get("IS_INTERCOM_ENABLED", "1"),
},
{
"key": "INTERCOM_APP_ID",
"default": os.environ.get("INTERCOM_APP_ID", ""),
},
]
)
@ -169,10 +158,6 @@ class InstanceEndpoint(BaseAPIView):
# is smtp configured
data["is_smtp_configured"] = bool(EMAIL_HOST)
# Intercom settings
data["is_intercom_enabled"] = IS_INTERCOM_ENABLED == "1"
data["intercom_app_id"] = INTERCOM_APP_ID
# Base URL
data["admin_base_url"] = settings.ADMIN_BASE_URL
data["space_base_url"] = settings.SPACE_BASE_URL

View file

@ -232,21 +232,6 @@ unsplash_config_variables = [
},
]
intercom_config_variables = [
{
"key": "IS_INTERCOM_ENABLED",
"value": os.environ.get("IS_INTERCOM_ENABLED", "1"),
"category": "INTERCOM",
"is_encrypted": False,
},
{
"key": "INTERCOM_APP_ID",
"value": os.environ.get("INTERCOM_APP_ID", ""),
"category": "INTERCOM",
"is_encrypted": False,
},
]
core_config_variables = [
*authentication_config_variables,
*workspace_management_config_variables,
@ -257,5 +242,4 @@ core_config_variables = [
*smtp_config_variables,
*llm_config_variables,
*unsplash_config_variables,
*intercom_config_variables,
]

View file

@ -9,7 +9,6 @@ import { FileText, GithubIcon, MessageSquare, Rocket } from "lucide-react";
import type { TPowerKCommandConfig } from "@/components/power-k/core/types";
// hooks
import { usePowerK } from "@/hooks/store/use-power-k";
import { useChatSupport } from "@/hooks/use-chat-support";
/**
* Help commands - Help related commands
@ -17,7 +16,6 @@ import { useChatSupport } from "@/hooks/use-chat-support";
export const usePowerKHelpCommands = (): TPowerKCommandConfig[] => {
// store
const { toggleShortcutsListModal } = usePowerK();
const { isEnabled: isChatSupportEnabled, openChatSupport } = useChatSupport();
return [
{
@ -71,16 +69,5 @@ export const usePowerKHelpCommands = (): TPowerKCommandConfig[] => {
isVisible: () => true,
closeOnSelect: true,
},
{
id: "chat_with_us",
type: "action",
group: "help",
i18n_title: "power_k.help_actions.chat_with_us",
icon: MessageSquare,
action: () => openChatSupport(),
isEnabled: () => isChatSupportEnabled,
isVisible: () => isChatSupportEnabled,
closeOnSelect: true,
},
];
};

View file

@ -6,7 +6,7 @@
import React, { useState } from "react";
import { observer } from "mobx-react";
import { HelpCircle, MessagesSquare, User } from "lucide-react";
import { HelpCircle, User } from "lucide-react";
import { useTranslation } from "@plane/i18n";
import { PageIcon } from "@plane/propel/icons";
// ui
@ -16,7 +16,6 @@ import { ProductUpdatesModal } from "@/components/global";
import { AppSidebarItem } from "@/components/sidebar/sidebar-item";
// hooks
import { usePowerK } from "@/hooks/store/use-power-k";
import { useChatSupport } from "@/hooks/use-chat-support";
// plane web components
import { PlaneVersionNumber } from "@/plane-web/components/global";
@ -24,7 +23,6 @@ export const HelpMenuRoot = observer(function HelpMenuRoot() {
// store hooks
const { t } = useTranslation();
const { toggleShortcutsListModal } = usePowerK();
const { openChatSupport, isEnabled: isChatSupportEnabled } = useChatSupport();
// states
const [isNeedHelpOpen, setIsNeedHelpOpen] = useState(false);
const [isProductUpdatesModalOpen, setProductUpdatesModalOpen] = useState(false);
@ -56,18 +54,6 @@ export const HelpMenuRoot = observer(function HelpMenuRoot() {
<span className="text-11">{t("documentation")}</span>
</div>
</CustomMenu.MenuItem>
{isChatSupportEnabled && (
<CustomMenu.MenuItem>
<button
type="button"
onClick={openChatSupport}
className="flex w-full items-center gap-x-2 rounded-sm text-11 hover:bg-layer-1"
>
<MessagesSquare className="h-3.5 w-3.5 text-secondary" />
<span className="text-11">{t("message_support")}</span>
</button>
</CustomMenu.MenuItem>
)}
<CustomMenu.MenuItem onClick={() => window.open("mailto:sales@plane.so", "_blank")}>
<div className="flex items-center gap-x-2 rounded-sm text-11">
<User className="h-3.5 w-3.5 text-secondary" size={14} />

View file

@ -1,19 +0,0 @@
/**
* Copyright (c) 2023-present Plane Software, Inc. and contributors
* SPDX-License-Identifier: AGPL-3.0-only
* See the LICENSE file for details.
*/
type ChatSupportType = "open";
type ChatSupportEventType = `chat-support:${ChatSupportType}`;
export const CHAT_SUPPORT_EVENTS = {
open: "chat-support:open",
} satisfies Record<ChatSupportType, ChatSupportEventType>;
export class ChatSupportEvent extends CustomEvent<ChatSupportType> {
constructor(type: ChatSupportType) {
super(CHAT_SUPPORT_EVENTS[type]);
}
}

View file

@ -1,31 +0,0 @@
/**
* Copyright (c) 2023-present Plane Software, Inc. and contributors
* SPDX-License-Identifier: AGPL-3.0-only
* See the LICENSE file for details.
*/
import { useCallback } from "react";
// custom events
import { ChatSupportEvent } from "@/custom-events/chat-support";
// hooks
import { useInstance } from "@/hooks/store/use-instance";
import { useUser } from "@/hooks/store/user";
export interface IUseChatSupport {
openChatSupport: () => void;
isEnabled: boolean;
}
export const useChatSupport = (): IUseChatSupport => {
const { data: user } = useUser();
const { config } = useInstance();
// derived values
const isEnabled = Boolean(user && config?.is_intercom_enabled && config?.intercom_app_id);
const openChatSupport = useCallback(() => {
if (!isEnabled) return;
window.dispatchEvent(new ChatSupportEvent("open"));
}, [isEnabled]);
return { openChatSupport, isEnabled };
};

View file

@ -395,7 +395,6 @@ export default {
time_tracking_description: "Zaznamenávejte čas strávený na pracovních položkách a projektech.",
work_management_description: "Spravujte svou práci a projekty snadno.",
documentation: "Dokumentace",
message_support: "Kontaktovat podporu",
contact_sales: "Kontaktovat prodej",
hyper_mode: "Hyper režim",
keyboard_shortcuts: "Klávesové zkratky",

View file

@ -406,7 +406,6 @@ export default {
time_tracking_description: "Erfassen Sie die auf Arbeitselemente und Projekte verwendete Zeit.",
work_management_description: "Verwalten Sie Ihre Arbeit und Projekte mühelos.",
documentation: "Dokumentation",
message_support: "Support kontaktieren",
contact_sales: "Vertrieb kontaktieren",
hyper_mode: "Hyper-Modus",
keyboard_shortcuts: "Tastaturkürzel",

View file

@ -229,7 +229,6 @@ export default {
time_tracking_description: "Log time spent on work items and projects.",
work_management_description: "Manage your work and projects with ease.",
documentation: "Documentation",
message_support: "Message support",
contact_sales: "Contact sales",
hyper_mode: "Hyper Mode",
keyboard_shortcuts: "Keyboard shortcuts",
@ -2697,7 +2696,6 @@ export default {
open_plane_documentation: "Open Plane documentation",
join_forum: "Join our Forum",
report_bug: "Report a bug",
chat_with_us: "Chat with us",
},
page_placeholders: {
default: "Type a command or search",

View file

@ -406,7 +406,6 @@ export default {
time_tracking_description: "Registra el tiempo dedicado a elementos de trabajo y proyectos.",
work_management_description: "Gestiona tu trabajo y proyectos con facilidad.",
documentation: "Documentación",
message_support: "Mensaje al soporte",
contact_sales: "Contactar ventas",
hyper_mode: "Modo Hyper",
keyboard_shortcuts: "Atajos de teclado",

View file

@ -402,7 +402,6 @@ export default {
time_tracking_description: "Enregistrez le temps passé sur les éléments de travail et les projets.",
work_management_description: "Gérez votre travail et vos projets facilement.",
documentation: "Documentation",
message_support: "Contacter le support",
contact_sales: "Contacter les ventes",
hyper_mode: "Mode Hyper",
keyboard_shortcuts: "Raccourcis clavier",

View file

@ -398,7 +398,6 @@ export default {
time_tracking_description: "Catat waktu yang dihabiskan untuk item kerja dan proyek.",
work_management_description: "Kelola pekerjaan dan proyek Anda dengan mudah.",
documentation: "Dokumentasi",
message_support: "Pesan dukungan",
contact_sales: "Hubungi penjualan",
hyper_mode: "Mode Hyper",
keyboard_shortcuts: "Pintasan keyboard",

View file

@ -400,7 +400,6 @@ export default {
time_tracking_description: "Registra il tempo trascorso su elementi di lavoro e progetti.",
work_management_description: "Gestisci il tuo lavoro e i tuoi progetti con facilità.",
documentation: "Documentazione",
message_support: "Contatta il supporto",
contact_sales: "Contatta le vendite",
hyper_mode: "Modalità Hyper",
keyboard_shortcuts: "Scorciatoie da tastiera",

View file

@ -395,7 +395,6 @@ export default {
time_tracking_description: "作業項目やプロジェクトに費やした時間を記録します。",
work_management_description: "作業とプロジェクトを簡単に管理します。",
documentation: "ドキュメント",
message_support: "サポートにメッセージ",
contact_sales: "営業に問い合わせ",
hyper_mode: "Hyper Mode",
keyboard_shortcuts: "キーボードショートカット",

View file

@ -390,7 +390,6 @@ export default {
time_tracking_description: "작업 항목 및 프로젝트에 소요된 시간을 기록하세요.",
work_management_description: "작업 및 프로젝트를 쉽게 관리합니다.",
documentation: "문서",
message_support: "지원 메시지",
contact_sales: "영업 문의",
hyper_mode: "하이퍼 모드",
keyboard_shortcuts: "키보드 단축키",

View file

@ -393,7 +393,6 @@ export default {
time_tracking_description: "Rejestruj czas spędzony na elementach pracy i projektach.",
work_management_description: "Łatwo zarządzaj swoją pracą i projektami.",
documentation: "Dokumentacja",
message_support: "Skontaktuj się z pomocą",
contact_sales: "Skontaktuj się z działem sprzedaży",
hyper_mode: "Tryb Hyper",
keyboard_shortcuts: "Skróty klawiaturowe",

View file

@ -402,7 +402,6 @@ export default {
time_tracking_description: "Registre o tempo gasto em itens de trabalho e projetos.",
work_management_description: "Gerencie seu trabalho e projetos com facilidade.",
documentation: "Documentação",
message_support: "Suporte por mensagem",
contact_sales: "Contatar vendas",
hyper_mode: "Modo Hyper",
keyboard_shortcuts: "Atalhos do teclado",

View file

@ -399,7 +399,6 @@ export default {
time_tracking_description: "Înregistrează timpul petrecut pe activități și proiecte.",
work_management_description: "Gestionează-ți munca și proiectele cu ușurință.",
documentation: "Documentație",
message_support: "Trimite mesaj la suport",
contact_sales: "Contactează vânzările",
hyper_mode: "Mod Hyper",
keyboard_shortcuts: "Scurtături tastatură",

View file

@ -402,7 +402,6 @@ export default {
time_tracking_description: "Записывайте время, потраченное на рабочие элементы и проекты.",
work_management_description: "Управление рабочими элементами и проектами",
documentation: "Документация",
message_support: "Написать в поддержку",
contact_sales: "Связаться с отделом продаж",
hyper_mode: "Гиперрежим",
keyboard_shortcuts: "Горячие клавиши",
@ -2869,7 +2868,6 @@ export default {
open_plane_documentation: "Открыть документацию Plane",
join_forum: "Присоединиться к Forum",
report_bug: "Сообщить об ошибке",
chat_with_us: "Написать нам",
},
page_placeholders: {
default: "Введите команду или поиск",

View file

@ -395,7 +395,6 @@ export default {
time_tracking_description: "Zaznamenajte čas strávený na pracovných položkách a projektoch.",
work_management_description: "Spravujte svoju prácu a projekty jednoducho.",
documentation: "Dokumentácia",
message_support: "Kontaktovať podporu",
contact_sales: "Kontaktovať predaj",
hyper_mode: "Hyper režim",
keyboard_shortcuts: "Klávesové skratky",

View file

@ -396,7 +396,6 @@ export default {
time_tracking_description: "İş öğeleri ve projelerde harcanan zamanı kaydedin.",
work_management_description: "İşlerinizi ve projelerinizi kolayca yönetin.",
documentation: "Dokümantasyon",
message_support: "Destekle iletişim",
contact_sales: "Satış Ekibiyle İletişim",
hyper_mode: "Hiper Mod",
keyboard_shortcuts: "Klavye Kısayolları",

View file

@ -402,7 +402,6 @@ export default {
time_tracking_description: "Фіксуйте час, витрачений на робочі одиниці та проєкти.",
work_management_description: "Зручно керуйте своєю роботою та проєктами.",
documentation: "Документація",
message_support: "Звернутися в підтримку",
contact_sales: "Зв’язатися з відділом продажів",
hyper_mode: "Гіпер-режим",
keyboard_shortcuts: "Гарячі клавіші",
@ -2861,7 +2860,6 @@ export default {
open_plane_documentation: "Відкрити документацію Plane",
join_forum: "Приєднатися до Forum",
report_bug: "Повідомити про помилку",
chat_with_us: "Написати нам",
},
page_placeholders: {
default: "Введіть команду або виконайте пошук",

View file

@ -399,7 +399,6 @@ export default {
time_tracking_description: "Ghi lại thời gian dành cho các mục công việc và dự án.",
work_management_description: "Quản lý công việc và dự án của bạn một cách dễ dàng.",
documentation: "Tài liệu",
message_support: "Liên hệ hỗ trợ",
contact_sales: "Liên hệ bộ phận bán hàng",
hyper_mode: "Chế độ siêu tốc",
keyboard_shortcuts: "Phím tắt",

View file

@ -385,7 +385,6 @@ export default {
time_tracking_description: "记录在工作项和项目上花费的时间。",
work_management_description: "轻松管理您的工作和项目。",
documentation: "文档",
message_support: "联系支持",
contact_sales: "联系销售",
hyper_mode: "超级模式",
keyboard_shortcuts: "键盘快捷键",

View file

@ -384,7 +384,6 @@ export default {
time_tracking_description: "記錄在工作事項和專案上花費的時間。",
work_management_description: "輕鬆管理您的工作和專案。",
documentation: "文件",
message_support: "聯絡支援",
contact_sales: "聯絡業務",
hyper_mode: "極速模式",
keyboard_shortcuts: "鍵盤快速鍵",

View file

@ -65,9 +65,6 @@ export interface IInstanceConfig {
space_base_url: string | undefined;
admin_base_url: string | undefined;
is_self_managed: boolean;
// intercom
is_intercom_enabled: boolean;
intercom_app_id: string | undefined;
instance_changelog_url?: string;
}
@ -83,14 +80,11 @@ export interface IInstanceAdmin {
user_detail: IUserLite;
}
export type TInstanceIntercomConfigurationKeys = "IS_INTERCOM_ENABLED" | "INTERCOM_APP_ID";
export type TInstanceConfigurationKeys =
| TInstanceAIConfigurationKeys
| TInstanceEmailConfigurationKeys
| TInstanceImageConfigurationKeys
| TInstanceAuthenticationKeys
| TInstanceIntercomConfigurationKeys
| TInstanceWorkspaceConfigurationKeys;
export interface IInstanceConfiguration {