mirror of
https://github.com/formbricks/formbricks.git
synced 2026-02-11 03:09:15 -06:00
tweaked ui
This commit is contained in:
@@ -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>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -94,7 +94,6 @@ const Page = async (props) => {
|
||||
</PageHeader>
|
||||
{hasLicense ? (
|
||||
<EnterpriseLicenseStatus
|
||||
active={licenseState.active}
|
||||
status={licenseState.status}
|
||||
environmentId={params.environmentId}
|
||||
/>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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ő",
|
||||
|
||||
@@ -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": "接続不可",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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ă",
|
||||
|
||||
@@ -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": "Недоступна",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "无法访问",
|
||||
|
||||
@@ -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": "無法連線",
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user