diff --git a/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx b/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx index 2bd3ef13..cdbe5f0e 100644 --- a/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx +++ b/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx @@ -46,7 +46,7 @@ import IdpTypeBadge from "@app/components/IdpTypeBadge"; import { useTranslations } from "next-intl"; import { AxiosResponse } from "axios"; import { ListRolesResponse } from "@server/routers/role"; -import AutoProvisionConfigWidget from "@app/components/private/AutoProvisionConfigWidget"; +import AutoProvisionConfigWidget from "@app/components/AutoProvisionConfigWidget"; export default function GeneralPage() { const { env } = useEnvContext(); diff --git a/src/app/[orgId]/settings/(private)/idp/create/page.tsx b/src/app/[orgId]/settings/(private)/idp/create/page.tsx index 2f248077..6bae6075 100644 --- a/src/app/[orgId]/settings/(private)/idp/create/page.tsx +++ b/src/app/[orgId]/settings/(private)/idp/create/page.tsx @@ -1,6 +1,6 @@ "use client"; -import AutoProvisionConfigWidget from "@app/components/private/AutoProvisionConfigWidget"; +import AutoProvisionConfigWidget from "@app/components/AutoProvisionConfigWidget"; import { SettingsContainer, SettingsSection, diff --git a/src/app/[orgId]/settings/(private)/idp/page.tsx b/src/app/[orgId]/settings/(private)/idp/page.tsx index f8d888c0..7ff12d64 100644 --- a/src/app/[orgId]/settings/(private)/idp/page.tsx +++ b/src/app/[orgId]/settings/(private)/idp/page.tsx @@ -2,7 +2,7 @@ import { internal } from "@app/lib/api"; import { authCookieHeader } from "@app/lib/api/cookies"; import { AxiosResponse } from "axios"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; -import IdpTable, { IdpRow } from "@app/components/private/OrgIdpTable"; +import IdpTable, { IdpRow } from "@app/components/OrgIdpTable"; import { getTranslations } from "next-intl/server"; import { PaidFeaturesAlert } from "@app/components/PaidFeaturesAlert"; diff --git a/src/app/[orgId]/settings/(private)/remote-exit-nodes/[remoteExitNodeId]/credentials/page.tsx b/src/app/[orgId]/settings/(private)/remote-exit-nodes/[remoteExitNodeId]/credentials/page.tsx index 2fa2b753..7ee84129 100644 --- a/src/app/[orgId]/settings/(private)/remote-exit-nodes/[remoteExitNodeId]/credentials/page.tsx +++ b/src/app/[orgId]/settings/(private)/remote-exit-nodes/[remoteExitNodeId]/credentials/page.tsx @@ -23,9 +23,6 @@ import { } from "@server/routers/remoteExitNode/types"; import { useRemoteExitNodeContext } from "@app/hooks/useRemoteExitNodeContext"; import ConfirmDeleteDialog from "@app/components/ConfirmDeleteDialog"; -import { useSubscriptionStatusContext } from "@app/hooks/useSubscriptionStatusContext"; -import { useLicenseStatusContext } from "@app/hooks/useLicenseStatusContext"; -import { build } from "@server/build"; import { InfoSection, InfoSectionContent, @@ -36,6 +33,8 @@ import CopyToClipboard from "@app/components/CopyToClipboard"; import { Alert, AlertDescription, AlertTitle } from "@app/components/ui/alert"; import { InfoIcon } from "lucide-react"; import { PaidFeaturesAlert } from "@app/components/PaidFeaturesAlert"; +import { usePaidStatus } from "@app/hooks/usePaidStatus"; +import { tierMatrix } from "@server/lib/billing/tierMatrix"; export default function CredentialsPage() { const { env } = useEnvContext(); @@ -45,6 +44,8 @@ export default function CredentialsPage() { const t = useTranslations(); const { remoteExitNode } = useRemoteExitNodeContext(); + const { isPaidUser } = usePaidStatus(); + const [modalOpen, setModalOpen] = useState(false); const [credentials, setCredentials] = useState(null); @@ -57,16 +58,6 @@ export default function CredentialsPage() { const [showCredentialsAlert, setShowCredentialsAlert] = useState(false); const [shouldDisconnect, setShouldDisconnect] = useState(true); - const { licenseStatus, isUnlocked } = useLicenseStatusContext(); - const subscription = useSubscriptionStatusContext(); - - const isSecurityFeatureDisabled = () => { - const isEnterpriseNotLicensed = build === "enterprise" && !isUnlocked(); - const isSaasNotSubscribed = - build === "saas" && !subscription?.isSubscribed(); - return isEnterpriseNotLicensed || isSaasNotSubscribed; - }; - const handleConfirmRegenerate = async () => { try { const response = await api.get< @@ -203,7 +194,7 @@ export default function CredentialsPage() { setShouldDisconnect(false); setModalOpen(true); }} - disabled={isSecurityFeatureDisabled()} + disabled={isPaidUser(tierMatrix.rotateCredentials)} > {t("regenerateCredentialsButton")} @@ -212,7 +203,7 @@ export default function CredentialsPage() { setShouldDisconnect(true); setModalOpen(true); }} - disabled={isSecurityFeatureDisabled()} + disabled={isPaidUser(tierMatrix.rotateCredentials)} > {t("remoteExitNodeRegenerateAndDisconnect")} diff --git a/src/app/[orgId]/settings/access/users/create/page.tsx b/src/app/[orgId]/settings/access/users/create/page.tsx index 7d8ad2cd..08737f5e 100644 --- a/src/app/[orgId]/settings/access/users/create/page.tsx +++ b/src/app/[orgId]/settings/access/users/create/page.tsx @@ -47,7 +47,8 @@ import { ListIdpsResponse } from "@server/routers/idp"; import { useTranslations } from "next-intl"; import { build } from "@server/build"; import Image from "next/image"; -import { useSubscriptionStatusContext } from "@app/hooks/useSubscriptionStatusContext"; +import { usePaidStatus } from "@app/hooks/usePaidStatus"; +import { tierMatrix } from "@server/lib/billing/tierMatrix"; type UserType = "internal" | "oidc"; @@ -75,7 +76,7 @@ export default function Page() { const api = createApiClient({ env }); const t = useTranslations(); - const subscription = useSubscriptionStatusContext(); + const { hasSaasSubscription } = usePaidStatus(); const [selectedOption, setSelectedOption] = useState( "internal" @@ -237,7 +238,7 @@ export default function Page() { } async function fetchIdps() { - if (build === "saas" && !subscription?.subscribed) { + if (build === "saas" && !hasSaasSubscription(tierMatrix.orgOidc)) { return; } diff --git a/src/app/[orgId]/settings/clients/machine/[niceId]/credentials/page.tsx b/src/app/[orgId]/settings/clients/machine/[niceId]/credentials/page.tsx index 024f4cd7..17c958ce 100644 --- a/src/app/[orgId]/settings/clients/machine/[niceId]/credentials/page.tsx +++ b/src/app/[orgId]/settings/clients/machine/[niceId]/credentials/page.tsx @@ -19,9 +19,6 @@ import { useTranslations } from "next-intl"; import { PickClientDefaultsResponse } from "@server/routers/client"; import { useClientContext } from "@app/hooks/useClientContext"; import ConfirmDeleteDialog from "@app/components/ConfirmDeleteDialog"; -import { useLicenseStatusContext } from "@app/hooks/useLicenseStatusContext"; -import { useSubscriptionStatusContext } from "@app/hooks/useSubscriptionStatusContext"; -import { build } from "@server/build"; import { InfoSection, InfoSectionContent, @@ -33,6 +30,8 @@ import { Alert, AlertDescription, AlertTitle } from "@app/components/ui/alert"; import { InfoIcon } from "lucide-react"; import { PaidFeaturesAlert } from "@app/components/PaidFeaturesAlert"; import { OlmInstallCommands } from "@app/components/olm-install-commands"; +import { usePaidStatus } from "@app/hooks/usePaidStatus"; +import { tierMatrix } from "@server/lib/billing/tierMatrix"; export default function CredentialsPage() { const { env } = useEnvContext(); @@ -54,17 +53,7 @@ export default function CredentialsPage() { const [showCredentialsAlert, setShowCredentialsAlert] = useState(false); const [shouldDisconnect, setShouldDisconnect] = useState(true); - const { licenseStatus, isUnlocked } = useLicenseStatusContext(); - const subscription = useSubscriptionStatusContext(); - - const isSecurityFeatureDisabled = () => { - const isEnterpriseNotLicensed = build === "enterprise" && !isUnlocked(); - const isSaasNotSubscribed = - build === "saas" && !subscription?.isSubscribed(); - return ( - isEnterpriseNotLicensed || isSaasNotSubscribed || build === "oss" - ); - }; + const { isPaidUser } = usePaidStatus(); const handleConfirmRegenerate = async () => { try { @@ -191,7 +180,7 @@ export default function CredentialsPage() { setShouldDisconnect(false); setModalOpen(true); }} - disabled={isSecurityFeatureDisabled()} + disabled={isPaidUser(tierMatrix.rotateCredentials)} > {t("regenerateCredentialsButton")} @@ -200,7 +189,7 @@ export default function CredentialsPage() { setShouldDisconnect(true); setModalOpen(true); }} - disabled={isSecurityFeatureDisabled()} + disabled={isPaidUser(tierMatrix.rotateCredentials)} > {t("clientRegenerateAndDisconnect")} diff --git a/src/app/[orgId]/settings/general/auth-page/page.tsx b/src/app/[orgId]/settings/general/auth-page/page.tsx index 9ffa8e04..0bd48286 100644 --- a/src/app/[orgId]/settings/general/auth-page/page.tsx +++ b/src/app/[orgId]/settings/general/auth-page/page.tsx @@ -1,5 +1,5 @@ import AuthPageBrandingForm from "@app/components/AuthPageBrandingForm"; -import AuthPageSettings from "@app/components/private/AuthPageSettings"; +import AuthPageSettings from "@app/components/AuthPageSettings"; import { SettingsContainer } from "@app/components/Settings"; import { internal } from "@app/lib/api"; import { authCookieHeader } from "@app/lib/api/cookies"; diff --git a/src/app/[orgId]/settings/logs/access/page.tsx b/src/app/[orgId]/settings/logs/access/page.tsx index 6da993ba..13f31952 100644 --- a/src/app/[orgId]/settings/logs/access/page.tsx +++ b/src/app/[orgId]/settings/logs/access/page.tsx @@ -13,14 +13,13 @@ import { ArrowUpRight, Key, User } from "lucide-react"; import Link from "next/link"; import { ColumnFilter } from "@app/components/ColumnFilter"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; -import { useSubscriptionStatusContext } from "@app/hooks/useSubscriptionStatusContext"; -import { useLicenseStatusContext } from "@app/hooks/useLicenseStatusContext"; import { build } from "@server/build"; -import { Alert, AlertDescription } from "@app/components/ui/alert"; import { getSevenDaysAgo } from "@app/lib/getSevenDaysAgo"; import axios from "axios"; import { useStoredPageSize } from "@app/hooks/useStoredPageSize"; import { PaidFeaturesAlert } from "@app/components/PaidFeaturesAlert"; +import { usePaidStatus } from "@app/hooks/usePaidStatus"; +import { tierMatrix } from "@server/lib/billing/tierMatrix"; export default function GeneralPage() { const router = useRouter(); @@ -28,8 +27,8 @@ export default function GeneralPage() { const api = createApiClient(useEnvContext()); const t = useTranslations(); const { orgId } = useParams(); - const subscription = useSubscriptionStatusContext(); - const { isUnlocked } = useLicenseStatusContext(); + + const { isPaidUser } = usePaidStatus(); const [rows, setRows] = useState([]); const [isRefreshing, setIsRefreshing] = useState(false); @@ -208,11 +207,7 @@ export default function GeneralPage() { } ) => { console.log("Date range changed:", { startDate, endDate, page, size }); - if ( - (build == "saas" && !subscription?.subscribed) || - (build == "enterprise" && !isUnlocked()) || - build === "oss" - ) { + if (!isPaidUser(tierMatrix.accessLogs) || build === "oss") { console.log( "Access denied: subscription inactive or license locked" ); @@ -642,11 +637,7 @@ export default function GeneralPage() { // Row expansion props expandable={true} renderExpandedRow={renderExpandedRow} - disabled={ - (build == "saas" && !subscription?.subscribed) || - (build == "enterprise" && !isUnlocked()) || - build === "oss" - } + disabled={!isPaidUser(tierMatrix.accessLogs) || build === "oss"} /> ); diff --git a/src/app/[orgId]/settings/logs/action/page.tsx b/src/app/[orgId]/settings/logs/action/page.tsx index 040a1920..515fd2b9 100644 --- a/src/app/[orgId]/settings/logs/action/page.tsx +++ b/src/app/[orgId]/settings/logs/action/page.tsx @@ -4,15 +4,14 @@ import { DateTimeValue } from "@app/components/DateTimePicker"; import { LogDataTable } from "@app/components/LogDataTable"; import { PaidFeaturesAlert } from "@app/components/PaidFeaturesAlert"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; -import { Alert, AlertDescription } from "@app/components/ui/alert"; import { useEnvContext } from "@app/hooks/useEnvContext"; -import { useLicenseStatusContext } from "@app/hooks/useLicenseStatusContext"; +import { usePaidStatus } from "@app/hooks/usePaidStatus"; import { useStoredPageSize } from "@app/hooks/useStoredPageSize"; -import { useSubscriptionStatusContext } from "@app/hooks/useSubscriptionStatusContext"; import { toast } from "@app/hooks/useToast"; import { createApiClient } from "@app/lib/api"; import { getSevenDaysAgo } from "@app/lib/getSevenDaysAgo"; import { build } from "@server/build"; +import { tierMatrix } from "@server/lib/billing/tierMatrix"; import { ColumnDef } from "@tanstack/react-table"; import axios from "axios"; import { Key, User } from "lucide-react"; @@ -26,8 +25,8 @@ export default function GeneralPage() { const t = useTranslations(); const { orgId } = useParams(); const searchParams = useSearchParams(); - const subscription = useSubscriptionStatusContext(); - const { isUnlocked } = useLicenseStatusContext(); + + const { isPaidUser } = usePaidStatus(); const [rows, setRows] = useState([]); const [isRefreshing, setIsRefreshing] = useState(false); @@ -195,10 +194,7 @@ export default function GeneralPage() { } ) => { console.log("Date range changed:", { startDate, endDate, page, size }); - if ( - (build == "saas" && !subscription?.subscribed) || - (build == "enterprise" && !isUnlocked()) - ) { + if (!isPaidUser(tierMatrix.actionLogs)) { console.log( "Access denied: subscription inactive or license locked" ); @@ -496,11 +492,7 @@ export default function GeneralPage() { // Row expansion props expandable={true} renderExpandedRow={renderExpandedRow} - disabled={ - (build == "saas" && !subscription?.subscribed) || - (build == "enterprise" && !isUnlocked()) || - build === "oss" - } + disabled={!isPaidUser(tierMatrix.actionLogs) || build === "oss"} /> ); diff --git a/src/app/[orgId]/settings/logs/page.tsx b/src/app/[orgId]/settings/logs/page.tsx index 45b5a7de..d9663e72 100644 --- a/src/app/[orgId]/settings/logs/page.tsx +++ b/src/app/[orgId]/settings/logs/page.tsx @@ -1,54 +1,3 @@ -"use client"; -import ConfirmDeleteDialog from "@app/components/ConfirmDeleteDialog"; -import AuthPageSettings, { - AuthPageSettingsRef -} from "@app/components/private/AuthPageSettings"; - -import { Button } from "@app/components/ui/button"; -import { useOrgContext } from "@app/hooks/useOrgContext"; -import { userOrgUserContext } from "@app/hooks/useOrgUserContext"; -import { toast } from "@app/hooks/useToast"; -import { useState, useRef } from "react"; -import { - Form, - FormControl, - FormDescription, - FormField, - FormItem, - FormLabel, - FormMessage -} from "@/components/ui/form"; -import { Input } from "@/components/ui/input"; - -import { z } from "zod"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { createApiClient } from "@app/lib/api"; -import { useEnvContext } from "@app/hooks/useEnvContext"; -import { formatAxiosError } from "@app/lib/api"; -import { AxiosResponse } from "axios"; -import { DeleteOrgResponse, ListUserOrgsResponse } from "@server/routers/org"; -import { useRouter } from "next/navigation"; -import { - SettingsContainer, - SettingsSection, - SettingsSectionHeader, - SettingsSectionTitle, - SettingsSectionDescription, - SettingsSectionBody, - SettingsSectionForm, - SettingsSectionFooter -} from "@app/components/Settings"; -import { useUserContext } from "@app/hooks/useUserContext"; -import { useTranslations } from "next-intl"; -import { build } from "@server/build"; - export default function GeneralPage() { - const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); - const router = useRouter(); - const api = createApiClient(useEnvContext()); - const t = useTranslations(); - const { env } = useEnvContext(); - - return

dfas

; + return null; } diff --git a/src/app/[orgId]/settings/resources/proxy/[niceId]/general/page.tsx b/src/app/[orgId]/settings/resources/proxy/[niceId]/general/page.tsx index 1ed8eb17..303b3c46 100644 --- a/src/app/[orgId]/settings/resources/proxy/[niceId]/general/page.tsx +++ b/src/app/[orgId]/settings/resources/proxy/[niceId]/general/page.tsx @@ -50,9 +50,6 @@ import { useActionState, useMemo, useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import z from "zod"; -import { build } from "@server/build"; -import { useLicenseStatusContext } from "@app/hooks/useLicenseStatusContext"; -import { useSubscriptionStatusContext } from "@app/hooks/useSubscriptionStatusContext"; import { Alert, AlertDescription } from "@app/components/ui/alert"; import { RadioGroup, RadioGroupItem } from "@app/components/ui/radio-group"; import { @@ -64,6 +61,7 @@ import { PaidFeaturesAlert } from "@app/components/PaidFeaturesAlert"; import { GetResourceResponse } from "@server/routers/resource/getResource"; import type { ResourceContextType } from "@app/contexts/resourceContext"; import { usePaidStatus } from "@app/hooks/usePaidStatus"; +import { tierMatrix } from "@server/lib/billing/tierMatrix"; type MaintenanceSectionFormProps = { resource: GetResourceResponse; @@ -77,8 +75,6 @@ function MaintenanceSectionForm({ const { env } = useEnvContext(); const t = useTranslations(); const api = createApiClient({ env }); - const { isUnlocked } = useLicenseStatusContext(); - const subscription = useSubscriptionStatusContext(); const { isPaidUser } = usePaidStatus(); const MaintenanceFormSchema = z.object({ @@ -159,15 +155,6 @@ function MaintenanceSectionForm({ } } - const isSecurityFeatureDisabled = () => { - const isEnterpriseNotLicensed = build === "enterprise" && !isUnlocked(); - const isSaasNotSubscribed = - build === "saas" && !subscription?.isSubscribed(); - return ( - isEnterpriseNotLicensed || isSaasNotSubscribed || build === "oss" - ); - }; - if (!resource.http) { return null; } @@ -197,7 +184,7 @@ function MaintenanceSectionForm({ name="maintenanceModeEnabled" render={({ field }) => { const isDisabled = - isSecurityFeatureDisabled() || + isPaidUser(tierMatrix.maintencePage) || resource.http === false; return ( @@ -264,7 +251,7 @@ function MaintenanceSectionForm({ defaultValue={ field.value } - disabled={isSecurityFeatureDisabled()} + disabled={isPaidUser(tierMatrix.maintencePage)} className="flex flex-col space-y-1" > @@ -337,7 +324,7 @@ function MaintenanceSectionForm({ @@ -363,7 +350,7 @@ function MaintenanceSectionForm({