tweaked ui

This commit is contained in:
Dhruwang
2026-02-10 16:22:03 +05:30
parent 504a059af5
commit e6d02df599
18 changed files with 74 additions and 89 deletions

View File

@@ -1,45 +1,40 @@
"use client";
import { CheckIcon, RotateCcwIcon } from "lucide-react";
import { RotateCcwIcon } from "lucide-react";
import { useRouter } from "next/navigation";
import { useState } from "react";
import toast from "react-hot-toast";
import { useTranslation } from "react-i18next";
import { recheckLicenseAction } from "@/modules/ee/license-check/actions";
import { Badge } from "@/modules/ui/components/badge";
import { Button } from "@/modules/ui/components/button";
import { SettingsCard } from "../../../components/SettingsCard";
type LicenseStatus = "active" | "expired" | "unreachable" | "no-license";
interface RecheckButtonProps {
onClick: () => void;
disabled: boolean;
recheckingLabel: string;
recheckLabel: string;
}
const RecheckButton = ({ onClick, disabled, recheckingLabel, recheckLabel }: RecheckButtonProps) => (
<Button variant="outline" size="sm" onClick={onClick} disabled={disabled} className="bg-white">
{disabled ? (
<>
<RotateCcwIcon className="mr-2 h-4 w-4 animate-spin" />
{recheckingLabel}
</>
) : (
<>
<RotateCcwIcon className="mr-2 h-4 w-4" />
{recheckLabel}
</>
)}
</Button>
);
interface EnterpriseLicenseStatusProps {
active: boolean;
status: LicenseStatus;
environmentId: string;
}
export const EnterpriseLicenseStatus = ({ active, status, environmentId }: EnterpriseLicenseStatusProps) => {
const getBadgeConfig = (
status: LicenseStatus
): { type: "success" | "error" | "warning" | "gray"; labelKey: string } => {
switch (status) {
case "active":
return { type: "success", labelKey: "environments.settings.enterprise.license_status_active" };
case "expired":
return { type: "error", labelKey: "environments.settings.enterprise.license_status_expired" };
case "unreachable":
return { type: "warning", labelKey: "environments.settings.enterprise.license_status_unreachable" };
case "no-license":
return { type: "gray", labelKey: "environments.settings.enterprise.license_status_no_license" };
default:
return { type: "gray", labelKey: "environments.settings.enterprise.license_status" };
}
};
export const EnterpriseLicenseStatus = ({ status, environmentId }: EnterpriseLicenseStatusProps) => {
const { t } = useTranslation();
const router = useRouter();
const [isRechecking, setIsRechecking] = useState(false);
@@ -72,68 +67,44 @@ export const EnterpriseLicenseStatus = ({ active, status, environmentId }: Enter
}
};
const getStatusLabel = () => {
switch (status) {
case "active":
return t("environments.settings.enterprise.license_status_active");
case "expired":
return t("environments.settings.enterprise.license_status_expired");
case "unreachable":
return t("environments.settings.enterprise.license_status_unreachable");
case "no-license":
return t("environments.settings.enterprise.license_status_no_license");
default:
return status;
}
};
const isActive = active && status === "active";
const badgeConfig = getBadgeConfig(status);
return (
<div>
<div className="mt-8 max-w-4xl rounded-lg border border-slate-300 bg-slate-100 shadow-sm">
<div className="space-y-4 p-8">
<div className="flex items-center justify-between">
{isActive ? (
<div className="flex items-center gap-x-2">
<div className="rounded-full border border-green-300 bg-green-100 p-0.5 dark:bg-green-800">
<CheckIcon className="h-5 w-5 p-0.5 text-green-500 dark:text-green-400" />
</div>
<p className="text-slate-800">
{t(
"environments.settings.enterprise.your_enterprise_license_is_active_all_features_unlocked"
)}
</p>
</div>
<SettingsCard
title={t("environments.settings.enterprise.license_status")}
description={t("environments.settings.enterprise.license_status_description")}>
<div className="flex flex-col gap-4">
<div className="flex flex-wrap items-center justify-between gap-3">
<Badge type={badgeConfig.type} text={t(badgeConfig.labelKey)} size="normal" />
<Button
type="button"
variant="outline"
size="sm"
onClick={handleRecheck}
disabled={isRechecking}
className="shrink-0">
{isRechecking ? (
<>
<RotateCcwIcon className="mr-2 h-4 w-4 animate-spin" />
{t("environments.settings.enterprise.rechecking")}
</>
) : (
<div>
<h3 className="text-lg font-semibold text-slate-800">
{t("environments.settings.enterprise.license_status")}
</h3>
<p className="mt-1 text-sm text-slate-600">{getStatusLabel()}</p>
</div>
<>
<RotateCcwIcon className="mr-2 h-4 w-4" />
{t("environments.settings.enterprise.recheck_license")}
</>
)}
<RecheckButton
onClick={handleRecheck}
disabled={isRechecking}
recheckingLabel={t("environments.settings.enterprise.rechecking")}
recheckLabel={t("environments.settings.enterprise.recheck_license")}
/>
</div>
<div className="mt-4 space-y-2 border-t border-slate-200 pt-4">
<div className="flex items-center justify-between text-sm">
<span className="text-slate-600">{t("environments.settings.enterprise.license_status")}:</span>
<span className="font-medium text-slate-800">{getStatusLabel()}</span>
</div>
</div>
<p className="text-sm text-slate-500">
{t("environments.settings.enterprise.questions_please_reach_out_to")}{" "}
<a className="font-semibold underline" href="mailto:hola@formbricks.com">
hola@formbricks.com
</a>
</p>
</Button>
</div>
<p className="border-t border-slate-100 pt-4 text-sm text-slate-500">
{t("environments.settings.enterprise.questions_please_reach_out_to")}{" "}
<a
className="font-medium text-slate-700 underline hover:text-slate-900"
href="mailto:hola@formbricks.com">
hola@formbricks.com
</a>
</p>
</div>
</div>
</SettingsCard>
);
};

View File

@@ -94,7 +94,6 @@ const Page = async (props) => {
</PageHeader>
{hasLicense ? (
<EnterpriseLicenseStatus
active={licenseState.active}
status={licenseState.status}
environmentId={params.environmentId}
/>

View File

@@ -899,6 +899,7 @@ checksums:
environments/settings/enterprise/keep_full_control_over_your_data_privacy_and_security: 43aa041cc3e2b2fdd35d2d34659a6b7a
environments/settings/enterprise/license_status: f6f85c59074ca2455321bd5288d94be8
environments/settings/enterprise/license_status_active: 3e1ec025c4a50830bbb9ad57a176630a
environments/settings/enterprise/license_status_description: 828e4527f606471cd8cf58b55ff824f6
environments/settings/enterprise/license_status_expired: 63b27cccba4ab2143e0f5f3d46e4168a
environments/settings/enterprise/license_status_no_license: dbffdac22aeaff8ef85335dc47ceefc3
environments/settings/enterprise/license_status_unreachable: 202b110dab099f1167b13c326349e570

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "Behalte die volle Kontrolle über deine Daten, Privatsphäre und Sicherheit.",
"license_status": "Lizenzstatus",
"license_status_active": "Aktiv",
"license_status_description": "Status deiner Enterprise-Lizenz.",
"license_status_expired": "Abgelaufen",
"license_status_no_license": "Keine Lizenz",
"license_status_unreachable": "Nicht erreichbar",

View File

@@ -961,6 +961,7 @@
"license_status_expired": "Expired",
"license_status_no_license": "No License",
"license_status_unreachable": "Unreachable",
"license_status_description": "Status of your enterprise license.",
"no_call_needed_no_strings_attached_request_a_free_30_day_trial_license_to_test_all_features_by_filling_out_this_form": "No call needed, no strings attached: Request a free 30-day trial license to test all features by filling out this form:",
"no_credit_card_no_sales_call_just_test_it": "No credit card. No sales call. Just test it :)",
"on_request": "On request",
@@ -3105,4 +3106,4 @@
"usability_rating_description": "Measure perceived usability by asking users to rate their experience with your product using a standardized 10-question survey.",
"usability_score_name": "System Usability Score (SUS)"
}
}
}

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "Mantén el control total sobre la privacidad y seguridad de tus datos.",
"license_status": "Estado de la licencia",
"license_status_active": "Activa",
"license_status_description": "Estado de tu licencia enterprise.",
"license_status_expired": "Caducada",
"license_status_no_license": "Sin licencia",
"license_status_unreachable": "Inaccesible",

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "Gardez un contrôle total sur la confidentialité et la sécurité de vos données.",
"license_status": "Statut de la licence",
"license_status_active": "Active",
"license_status_description": "Statut de votre licence entreprise.",
"license_status_expired": "Expirée",
"license_status_no_license": "Aucune licence",
"license_status_unreachable": "Inaccessible",

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "Az adatvédelem és biztonság fölötti rendelkezés teljes kézben tartása.",
"license_status": "Licenc állapota",
"license_status_active": "Aktív",
"license_status_description": "A vállalati licenced állapota.",
"license_status_expired": "Lejárt",
"license_status_no_license": "Nincs licenc",
"license_status_unreachable": "Nem elérhető",

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "データのプライバシーとセキュリティを完全に制御できます。",
"license_status": "ライセンスステータス",
"license_status_active": "有効",
"license_status_description": "エンタープライズライセンスのステータス。",
"license_status_expired": "期限切れ",
"license_status_no_license": "ライセンスなし",
"license_status_unreachable": "接続不可",

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "Houd de volledige controle over de privacy en beveiliging van uw gegevens.",
"license_status": "Licentiestatus",
"license_status_active": "Actief",
"license_status_description": "Status van je enterprise-licentie.",
"license_status_expired": "Verlopen",
"license_status_no_license": "Geen licentie",
"license_status_unreachable": "Niet bereikbaar",

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "Mantenha controle total sobre a privacidade e segurança dos seus dados.",
"license_status": "Status da licença",
"license_status_active": "Ativa",
"license_status_description": "Status da sua licença enterprise.",
"license_status_expired": "Expirada",
"license_status_no_license": "Sem licença",
"license_status_unreachable": "Inacessível",

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "Mantenha controlo total sobre a privacidade e segurança dos seus dados.",
"license_status": "Estado da licença",
"license_status_active": "Ativa",
"license_status_description": "Estado da sua licença empresarial.",
"license_status_expired": "Expirada",
"license_status_no_license": "Sem licença",
"license_status_unreachable": "Inacessível",

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "Mențineți controlul complet asupra confidențialității și securității datelor dumneavoastră.",
"license_status": "Stare licență",
"license_status_active": "Activă",
"license_status_description": "Starea licenței tale enterprise.",
"license_status_expired": "Expirată",
"license_status_no_license": "Fără licență",
"license_status_unreachable": "Indisponibilă",

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "Полный контроль над конфиденциальностью и безопасностью ваших данных.",
"license_status": "Статус лицензии",
"license_status_active": "Активна",
"license_status_description": "Статус вашей корпоративной лицензии.",
"license_status_expired": "Срок действия истёк",
"license_status_no_license": "Нет лицензии",
"license_status_unreachable": "Недоступна",

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "Behåll full kontroll över din datasekretess och säkerhet.",
"license_status": "Licensstatus",
"license_status_active": "Aktiv",
"license_status_description": "Status för din företagslicens.",
"license_status_expired": "Utgången",
"license_status_no_license": "Ingen licens",
"license_status_unreachable": "Otillgänglig",

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "保持 对 您 的 数据 隐私 和 安全 的 完全 控制。",
"license_status": "许可证状态",
"license_status_active": "已激活",
"license_status_description": "你的企业许可证状态。",
"license_status_expired": "已过期",
"license_status_no_license": "无许可证",
"license_status_unreachable": "无法访问",

View File

@@ -958,6 +958,7 @@
"keep_full_control_over_your_data_privacy_and_security": "完全掌控您的資料隱私權和安全性。",
"license_status": "授權狀態",
"license_status_active": "有效",
"license_status_description": "你的企業授權狀態。",
"license_status_expired": "已過期",
"license_status_no_license": "無授權",
"license_status_unreachable": "無法連線",

View File

@@ -31,7 +31,7 @@ const CONFIG = {
ENDPOINT:
env.ENVIRONMENT === "staging"
? "https://staging.ee.formbricks.com/api/licenses/check"
: "https://ee.formbricks.com/api/licenses/check",
: "http://localhost:3001/api/licenses/check",
// ENDPOINT: "https://localhost:8080/api/licenses/check",
TIMEOUT_MS: 5000,
},
@@ -195,7 +195,7 @@ const getPreviousResult = async (): Promise<TPreviousResult> => {
.finally(() => {
getPreviousResultPromise = null;
})
.catch(() => {});
.catch(() => { });
return getPreviousResultPromise;
};
@@ -448,7 +448,7 @@ export const fetchLicense = async (): Promise<TEnterpriseLicenseDetails | null>
.finally(() => {
fetchLicensePromise = null;
})
.catch(() => {});
.catch(() => { });
return fetchLicensePromise;
};
@@ -569,7 +569,7 @@ export const getEnterpriseLicense = reactCache(async (): Promise<TEnterpriseLice
.finally(() => {
getEnterpriseLicensePromise = null;
})
.catch(() => {});
.catch(() => { });
return getEnterpriseLicensePromise;
});