From 1a57d3e0383be5dff0f2f06acbb0f6737301ebef Mon Sep 17 00:00:00 2001 From: Saurabh Kumar <70131915+Saurabhkmr98@users.noreply.github.com> Date: Thu, 13 Feb 2025 15:19:37 +0530 Subject: [PATCH] [SILO] - add pat token error handling in importer form (#2485) * add pat token error handling in importer form * remove console logs --- .../src/locales/en/translations-extended.json | 3 +- .../src/locales/es/translations-extended.json | 3 +- .../src/locales/fr/translations-extended.json | 3 +- .../src/locales/ja/translations-extended.json | 3 +- .../locales/zh-CN/translations-extended.json | 3 +- .../authentication/personal-access-token.tsx | 27 +++++++++++--- .../authentication/personal-access-token.tsx | 28 ++++++++++++--- .../authentication/personal-access-token.tsx | 36 +++++++++++++------ .../authentication/personal-access-token.tsx | 28 ++++++++++++--- .../components/importers/ui/error-banner.tsx | 17 +++++++++ web/ee/components/importers/ui/index.ts | 1 + web/ee/types/importers/root.ts | 6 ++++ 12 files changed, 128 insertions(+), 30 deletions(-) create mode 100644 web/ee/components/importers/ui/error-banner.tsx diff --git a/packages/i18n/src/locales/en/translations-extended.json b/packages/i18n/src/locales/en/translations-extended.json index 7923b91c19..36a2da1937 100644 --- a/packages/i18n/src/locales/en/translations-extended.json +++ b/packages/i18n/src/locales/en/translations-extended.json @@ -689,7 +689,8 @@ "add_seat_msg_free_trial": "You're trying to import {additionalUserCount} non-registered users and you've only {currentWorkspaceSubscriptionAvailableSeats} seats available in current plan. To continue importing upgrade now.", "add_seat_msg_paid": "You're trying to import {additionalUserCount} non-registered users and you've only {currentWorkspaceSubscriptionAvailableSeats} seats available in current plan. To continue importing buy atleast {extraSeatRequired} extra seats.", "skip_user_import_title": "Skip importing User data", - "skip_user_import_description": "Skipping user import will result in work items, comments, and other data from {serviceName} being created by the user performing the migration in Plane. You can still manually add users later." + "skip_user_import_description": "Skipping user import will result in work items, comments, and other data from {serviceName} being created by the user performing the migration in Plane. You can still manually add users later.", + "invalid_pat": "Invalid Personal Access Token" }, "integrations": { diff --git a/packages/i18n/src/locales/es/translations-extended.json b/packages/i18n/src/locales/es/translations-extended.json index 8f987343b2..fdcc8f13a3 100644 --- a/packages/i18n/src/locales/es/translations-extended.json +++ b/packages/i18n/src/locales/es/translations-extended.json @@ -696,7 +696,8 @@ "add_seat_msg_free_trial": "Estás intentando importar {additionalUserCount} usuarios no registrados y solo tienes {currentWorkspaceSubscriptionAvailableSeats} asientos disponibles en el plan actual. Para continuar importando, actualiza ahora.", "add_seat_msg_paid": "Estás intentando importar {additionalUserCount} usuarios no registrados y solo tienes {currentWorkspaceSubscriptionAvailableSeats} asientos disponibles en el plan actual. Para continuar importando, compra al menos {extraSeatRequired} asientos adicionales.", "skip_user_import_title": "Omitir importación de datos de usuario", - "skip_user_import_description": "Omitir la importación de usuarios resultará en que los elementos de trabajo, comentarios y otros datos de {serviceName} sean creados por el usuario que realiza la migración en Plane. Aún puedes agregar usuarios manualmente más tarde." + "skip_user_import_description": "Omitir la importación de usuarios resultará en que los elementos de trabajo, comentarios y otros datos de {serviceName} sean creados por el usuario que realiza la migración en Plane. Aún puedes agregar usuarios manualmente más tarde.", + "invalid_pat": "Token de acceso personal inválido" }, "integrations": { diff --git a/packages/i18n/src/locales/fr/translations-extended.json b/packages/i18n/src/locales/fr/translations-extended.json index bc3964b440..4f924b9283 100644 --- a/packages/i18n/src/locales/fr/translations-extended.json +++ b/packages/i18n/src/locales/fr/translations-extended.json @@ -696,7 +696,8 @@ "add_seat_msg_free_trial": "Vous essayez d'importer {additionalUserCount} utilisateurs non enregistrés et vous n'avez que {currentWorkspaceSubscriptionAvailableSeats} sièges disponibles dans le plan actuel. Pour continuer l'importation, passez à la version supérieure maintenant.", "add_seat_msg_paid": "Vous essayez d'importer {additionalUserCount} utilisateurs non enregistrés et vous n'avez que {currentWorkspaceSubscriptionAvailableSeats} sièges disponibles dans le plan actuel. Pour continuer l'importation, achetez au moins {extraSeatRequired} sièges supplémentaires.", "skip_user_import_title": "Ignorer l'importation des données utilisateur", - "skip_user_import_description": "Ignorer l'importation des utilisateurs entraînera la création des éléments de travail, commentaires et autres données de {serviceName} par l'utilisateur effectuant la migration dans Plane. Vous pourrez toujours ajouter manuellement des utilisateurs plus tard." + "skip_user_import_description": "Ignorer l'importation des utilisateurs entraînera la création des éléments de travail, commentaires et autres données de {serviceName} par l'utilisateur effectuant la migration dans Plane. Vous pourrez toujours ajouter manuellement des utilisateurs plus tard.", + "invalid_pat": "Token de connexion personnel invalide" }, "integrations": { diff --git a/packages/i18n/src/locales/ja/translations-extended.json b/packages/i18n/src/locales/ja/translations-extended.json index 9b8d398e92..ce869ef6ad 100644 --- a/packages/i18n/src/locales/ja/translations-extended.json +++ b/packages/i18n/src/locales/ja/translations-extended.json @@ -696,7 +696,8 @@ "add_seat_msg_free_trial": "未登録の{additionalUserCount}人のユーザーをインポートしようとしていますが、現在のプランでは{currentWorkspaceSubscriptionAvailableSeats}席しか利用できません。インポートを続けるにはアップグレードしてください。", "add_seat_msg_paid": "未登録の{additionalUserCount}人のユーザーをインポートしようとしていますが、現在のプランでは{currentWorkspaceSubscriptionAvailableSeats}席しか利用できません。インポートを続けるには少なくとも{extraSeatRequired}席追加購入してください。", "skip_user_import_title": "ユーザーデータのインポートをスキップ", - "skip_user_import_description": "ユーザーのインポートをスキップすると、{serviceName}からの作業項目、コメント、その他のデータはPlaneで移行を実行しているユーザーによって作成されます。後でユーザーを手動で追加することもできます。" + "skip_user_import_description": "ユーザーのインポートをスキップすると、{serviceName}からの作業項目、コメント、その他のデータはPlaneで移行を実行しているユーザーによって作成されます。後でユーザーを手動で追加することもできます。", + "invalid_pat": "無効な個人アクセストークン" }, "integrations": { diff --git a/packages/i18n/src/locales/zh-CN/translations-extended.json b/packages/i18n/src/locales/zh-CN/translations-extended.json index d6dc82b4c3..c09b391b91 100644 --- a/packages/i18n/src/locales/zh-CN/translations-extended.json +++ b/packages/i18n/src/locales/zh-CN/translations-extended.json @@ -696,7 +696,8 @@ "add_seat_msg_free_trial": "您正在尝试导入 {additionalUserCount} 个未注册用户,但当前计划中只有 {currentWorkspaceSubscriptionAvailableSeats} 个席位可用。要继续导入,请立即升级。", "add_seat_msg_paid": "您正在尝试导入 {additionalUserCount} 个未注册用户,但当前计划中只有 {currentWorkspaceSubscriptionAvailableSeats} 个席位可用。要继续导入,请至少购买 {extraSeatRequired} 个额外席位。", "skip_user_import_title": "跳过导入用户数据", - "skip_user_import_description": "跳过用户导入将导致工作项、评论和来自 {serviceName} 的其他数据由在 Plane 中执行迁移的用户创建。您以后仍可以手动添加用户。" + "skip_user_import_description": "跳过用户导入将导致工作项、评论和来自 {serviceName} 的其他数据由在 Plane 中执行迁移的用户创建。您以后仍可以手动添加用户。", + "invalid_pat": "无效的个人访问令牌" }, "integrations": { diff --git a/web/ee/components/importers/asana/authentication/personal-access-token.tsx b/web/ee/components/importers/asana/authentication/personal-access-token.tsx index 4fcd5b2b61..ef1e6f55a5 100644 --- a/web/ee/components/importers/asana/authentication/personal-access-token.tsx +++ b/web/ee/components/importers/asana/authentication/personal-access-token.tsx @@ -10,6 +10,8 @@ import { AuthFormInput, TAuthFormInputFormField } from "@/plane-web/silo/ui/auth // plane web types import { TAsanaPATFormFields } from "@/plane-web/types/importers/asana"; import { useTranslation } from "@plane/i18n"; +import { TImporterPATError } from "@/plane-web/types"; +import ErrorBanner from "../../ui/error-banner"; export const PersonalAccessTokenAuth: FC = observer(() => { // hooks @@ -22,6 +24,18 @@ export const PersonalAccessTokenAuth: FC = observer(() => { const [formData, setFormData] = useState({ personalAccessToken: "", }); + const [patError, setPatError] = useState({ + showPATError: false, + message: "", + }); + + const togglePATError = (flag: boolean) => { + setPatError((prev) => ({ ...prev, showPATError: flag })); + }; + + const updatePATError = (message: string) => { + setPatError((prev) => ({ ...prev, message })); + }; // handlers const handleFormData = (key: T, value: TAsanaPATFormFields[T]) => { @@ -38,11 +52,9 @@ export const PersonalAccessTokenAuth: FC = observer(() => { setIsLoading(true); await authWithPAT(formData); } catch (error: any) { - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: error?.message?.toString() || "Something went wrong while authorizing Asana", - }); + const { message } = error as { message: string }; + updatePATError(message || "Something went wrong while authorizing Jira"); + togglePATError(true); } finally { setIsLoading(false); } @@ -84,6 +96,11 @@ export const PersonalAccessTokenAuth: FC = observer(() => {

+ { + patError.showPATError && ( + { togglePATError(false) }} /> + ) + }
{asanaPatFormFields.map((field) => ( { // hooks @@ -28,6 +30,19 @@ export const PersonalAccessTokenAuth: FC = observer(() => { hostname: "", }); + const [patError, setPatError] = useState({ + showPATError: false, + message: "", + }); + + const togglePATError = (flag: boolean) => { + setPatError((prev) => ({ ...prev, showPATError: flag })); + }; + + const updatePATError = (message: string) => { + setPatError((prev) => ({ ...prev, message })); + }; + // handlers const handleFormData = (key: T, value: TJiraPATFormFields[T]) => { setFormData((prev) => ({ ...prev, [key]: value })); @@ -47,11 +62,9 @@ export const PersonalAccessTokenAuth: FC = observer(() => { formData.hostname = stripTrailingSlash(formData.hostname); await authWithPAT(formData); } catch (error) { - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: error?.toString() || "Something went wrong while authorizing Jira", - }); + const { message } = error as { message: string }; + updatePATError(message || "Something went wrong while authorizing Jira"); + togglePATError(true); } finally { setIsLoading(false); } @@ -113,6 +126,11 @@ export const PersonalAccessTokenAuth: FC = observer(() => {

+ { + patError.showPATError && ( + { togglePATError(false) }} /> + ) + }
{jiraPatFormFields.map((field) => ( { // hooks @@ -19,7 +20,7 @@ export const PersonalAccessTokenAuth: FC = observer(() => { auth: { authWithPAT }, } = useJiraImporter(); - const {t} = useTranslation(); + const { t } = useTranslation(); // states const [isLoading, setIsLoading] = useState(false); const [formData, setFormData] = useState({ @@ -27,6 +28,18 @@ export const PersonalAccessTokenAuth: FC = observer(() => { userEmail: "", hostname: "", }); + const [patError, setPatError] = useState({ + showPATError: false, + message: "", + }); + + const togglePATError = (flag: boolean) => { + setPatError((prev) => ({ ...prev, showPATError: flag })); + }; + + const updatePATError = (message: string) => { + setPatError((prev) => ({ ...prev, message })); + }; // handlers const handleFormData = (key: T, value: TJiraPATFormFields[T]) => { @@ -47,11 +60,9 @@ export const PersonalAccessTokenAuth: FC = observer(() => { formData.hostname = stripTrailingSlash(formData.hostname); await authWithPAT(formData); } catch (error) { - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: error?.toString() || "Something went wrong while authorizing Jira", - }); + const { message } = error as { message: string }; + updatePATError(message || "Something went wrong while authorizing Jira"); + togglePATError(true); } finally { setIsLoading(false); } @@ -75,7 +86,7 @@ export const PersonalAccessTokenAuth: FC = observer(() => { className="text-custom-primary-100 hover:underline" rel="noreferrer" > - {" "} {t("jira_importer.atlassian_security_settings")} + {" "} {t("jira_importer.atlassian_security_settings")} ), @@ -109,10 +120,15 @@ export const PersonalAccessTokenAuth: FC = observer(() => {

Jira to Plane {t("importers.migration_assistant")}

- {t("importers.migration_assistant_description", { "serviceName": "Jira" })} + {t("importers.migration_assistant_description", { "serviceName": "Jira" })}

+ { + patError.showPATError && ( + { togglePATError(false) }} /> + ) + }
{jiraPatFormFields.map((field) => ( { // hooks @@ -24,6 +26,19 @@ export const PersonalAccessTokenAuth: FC = observer(() => { personalAccessToken: "", }); + const [patError, setPatError] = useState({ + showPATError: false, + message: "", + }); + + const togglePATError = (flag: boolean) => { + setPatError((prev) => ({ ...prev, showPATError: flag })); + }; + + const updatePATError = (message: string) => { + setPatError((prev) => ({ ...prev, message })); + }; + // handlers const handleFormData = (key: T, value: TLinearPATFormFields[T]) => { setFormData((prev) => ({ ...prev, [key]: value })); @@ -40,11 +55,9 @@ export const PersonalAccessTokenAuth: FC = observer(() => { setIsLoading(true); await authWithPAT(formData); } catch (error) { - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: error?.toString() || "Something went wrong while authorizing Linear", - }); + const { message } = error as { message: string }; + updatePATError(message || "Something went wrong while authorizing Jira"); + togglePATError(true); } finally { setIsLoading(false); } @@ -86,6 +99,11 @@ export const PersonalAccessTokenAuth: FC = observer(() => {

+ { + patError.showPATError && ( + { togglePATError(false) }} /> + ) + } {linearPatFormFields.map((field) => ( void }) { + return (
+ + {message} + + +
) +} \ No newline at end of file diff --git a/web/ee/components/importers/ui/index.ts b/web/ee/components/importers/ui/index.ts index 3aba9c6478..18799cb523 100644 --- a/web/ee/components/importers/ui/index.ts +++ b/web/ee/components/importers/ui/index.ts @@ -2,3 +2,4 @@ export * from "./stepper"; export * from "./dropdown"; export * from "./add-seats-alert-banner" export * from "./skip-user-import-toggle" +export * from "./error-banner" \ No newline at end of file diff --git a/web/ee/types/importers/root.ts b/web/ee/types/importers/root.ts index c210e75ad3..88e10ebbaa 100644 --- a/web/ee/types/importers/root.ts +++ b/web/ee/types/importers/root.ts @@ -18,3 +18,9 @@ export type TPlanePriorityData = { key: TPlanePriority; label: string; }; + + +export type TImporterPATError = { + showPATError: boolean; + message: string; +} \ No newline at end of file