Skip to content

Commit 6092cd5

Browse files
authored
feat: hide slack behind feature flag (#1011)
* feat: hide slack behind feature flag * feat: remove log * feat: fix comments * feat: add slack redirect uri
1 parent c7a7d52 commit 6092cd5

File tree

3 files changed

+38
-18
lines changed

3 files changed

+38
-18
lines changed

frontend/app/project/[projectId]/settings/page.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { getServerSession } from "next-auth";
55
import Settings from "@/components/settings/settings";
66
import { getApiKeys } from "@/lib/actions/project-api-keys";
77
import { authOptions } from "@/lib/auth";
8+
import { Feature, isFeatureEnabled } from "@/lib/features/features";
89

910
export const metadata: Metadata = {
1011
title: "Settings",
@@ -19,14 +20,14 @@ export default async function ApiKeysPage(props: { params: Promise<{ projectId:
1920
}
2021

2122
const apiKeys = await getApiKeys({ projectId: params.projectId });
23+
const isSlackEnabled = isFeatureEnabled(Feature.SLACK);
2224

2325
return (
24-
<>
25-
<Settings
26-
slackClientId={process.env.SLACK_CLIENT_ID}
27-
slackRedirectUri={process.env.SLACK_REDIRECT_URL}
28-
apiKeys={apiKeys}
29-
/>
30-
</>
26+
<Settings
27+
isSlackEnabled={isSlackEnabled}
28+
slackClientId={process.env.SLACK_CLIENT_ID}
29+
slackRedirectUri={process.env.SLACK_REDIRECT_URL}
30+
apiKeys={apiKeys}
31+
/>
3132
);
3233
}

frontend/components/settings/settings.tsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import TraceSummarySettings from "./trace-summary-settings";
2828

2929
interface SettingsProps {
3030
apiKeys: ProjectApiKey[];
31+
isSlackEnabled: boolean;
3132
slackClientId?: string;
3233
slackRedirectUri?: string;
3334
}
@@ -44,7 +45,7 @@ const tabs: { id: SettingsTab; label: string; icon: ReactNode }[] = [
4445

4546
const sidebarStyle = { "--sidebar-width": "auto" } as CSSProperties;
4647

47-
export default function Settings({ apiKeys, slackClientId, slackRedirectUri }: SettingsProps) {
48+
export default function Settings({ apiKeys, isSlackEnabled, slackClientId, slackRedirectUri }: SettingsProps) {
4849
const searchParams = useSearchParams();
4950
const [activeTab, setActiveTab] = useState<SettingsTab>((searchParams.get("tab") as SettingsTab) || "general");
5051
const pathName = usePathname();
@@ -57,9 +58,9 @@ export default function Settings({ apiKeys, slackClientId, slackRedirectUri }: S
5758
if (t.id === "trace-summary" && workspace?.tierName === "Free") {
5859
return false;
5960
}
60-
return !(t.id === "integrations" && workspace?.tierName !== "Pro");
61+
return !(t.id === "integrations" && (workspace?.tierName !== "Pro" || !isSlackEnabled));
6162
}),
62-
[workspace]
63+
[workspace, isSlackEnabled]
6364
);
6465

6566
const renderContent = () => {
@@ -79,9 +80,15 @@ export default function Settings({ apiKeys, slackClientId, slackRedirectUri }: S
7980
case "provider-api-keys":
8081
return <ProviderApiKeys />;
8182
case "trace-summary":
82-
return <TraceSummarySettings />;
83+
if (workspace?.tierName !== "Free") {
84+
return <TraceSummarySettings />;
85+
}
86+
return null;
8387
case "integrations":
84-
return <Integrations slackClientId={slackClientId} slackRedirectUri={slackRedirectUri} />;
88+
if (workspace?.tierName === "Pro" && isSlackEnabled) {
89+
return <Integrations slackClientId={slackClientId} slackRedirectUri={slackRedirectUri} />;
90+
}
91+
return null;
8592
}
8693
};
8794

frontend/lib/features/features.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ export const enum Feature {
1010
LOCAL_DB = "LOCAL_DB",
1111
FULL_BUILD = "FULL_BUILD",
1212
SUBSCRIPTION = "SUBSCRIPTION",
13-
LANDING = "LANDING"
13+
SLACK = "SLACK",
14+
LANDING = "LANDING",
1415
}
1516

1617
// right now all managed-version features are disabled in local environment
@@ -32,7 +33,11 @@ export const isFeatureEnabled = (feature: Feature) => {
3233
}
3334

3435
if (feature === Feature.AZURE_AUTH) {
35-
return !!process.env.AUTH_AZURE_AD_CLIENT_ID && !!process.env.AUTH_AZURE_AD_CLIENT_SECRET && !!process.env.AUTH_AZURE_AD_TENANT_ID;
36+
return (
37+
!!process.env.AUTH_AZURE_AD_CLIENT_ID &&
38+
!!process.env.AUTH_AZURE_AD_CLIENT_SECRET &&
39+
!!process.env.AUTH_AZURE_AD_TENANT_ID
40+
);
3641
}
3742

3843
if (feature === Feature.FULL_BUILD) {
@@ -44,15 +49,22 @@ export const isFeatureEnabled = (feature: Feature) => {
4449
}
4550

4651
if (feature === Feature.SUBSCRIPTION) {
47-
return (
48-
process.env.ENVIRONMENT === "PRODUCTION" &&
49-
!!process.env.STRIPE_SECRET_KEY
50-
);
52+
return process.env.ENVIRONMENT === "PRODUCTION" && !!process.env.STRIPE_SECRET_KEY;
5153
}
5254

5355
if (feature === Feature.SEND_EMAIL) {
5456
return !!process.env.RESEND_API_KEY;
5557
}
5658

59+
if (feature === Feature.SLACK) {
60+
return (
61+
process.env.ENVIRONMENT === "PRODUCTION" &&
62+
!!process.env.SLACK_CLIENT_ID &&
63+
!!process.env.SLACK_CLIENT_SECRET &&
64+
!!process.env.SLACK_SIGNING_SECRET &&
65+
!!process.env.SLACK_REDIRECT_URL
66+
);
67+
}
68+
5769
return process.env.ENVIRONMENT === "PRODUCTION";
5870
};

0 commit comments

Comments
 (0)