Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/(authenticated)/calendar/[eventID]/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ export const updateAttendeeStatus = wrapServerAction(
if (status === "attending" || status === "maybe_attending") {
const slackUser = me.identities.find((x) => x.provider == "slack");
if (slackUser && evt.slack_channel_id) {
const slackApp = await slackApiConnection();
const slackApp = slackApiConnection();

const channel_info = await slackApp.client.conversations.info({
channel: evt.slack_channel_id,
Expand Down
4 changes: 1 addition & 3 deletions app/(authenticated)/calendar/[eventID]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -201,9 +201,7 @@ async function SlackBanner(props: { event: EventObjectType }) {
return null;
}

const channelInfo = await (
await slackApiConnection()
).client.conversations.info({
const channelInfo = await slackApiConnection().client.conversations.info({
channel: props.event.slack_channel_id,
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ export const signUpToRole = wrapServerAction(
if (isSlackEnabled) {
const slackUser = me.identities.find((i) => i.provider === "slack");
if (slackUser && sheet.events.slack_channel_id) {
const slackApp = await slackApiConnection();
const slackApp = slackApiConnection();

const channel_info = await slackApp.client.conversations.info({
channel: sheet.events.slack_channel_id,
Expand Down
4 changes: 2 additions & 2 deletions app/(authenticated)/calendar/new/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { getCurrentUser } from "@/lib/auth/server";
import slackApiConnection, {
isSlackEnabled,
} from "@/lib/slack/slackApiConnection";
import { ConversationsInfoResponse } from "@slack/web-api/dist/response/ConversationsInfoResponse";
import { ConversationsInfoResponse } from "@slack/web-api/dist/types/response/ConversationsInfoResponse";
import * as Calendar from "@/features/calendar";
import { revalidatePath } from "next/cache";
import { env } from "process";
Expand All @@ -26,7 +26,7 @@ export const createEvent = wrapServerAction(
const me = await getCurrentUser();
let slackApp: App | null = null;
if (isSlackEnabled) {
slackApp = await slackApiConnection();
slackApp = slackApiConnection();
}
const payload = schema.safeParse(data);
if (!payload.success) {
Expand Down
4 changes: 2 additions & 2 deletions app/(authenticated)/calendar/new/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import slackApiConnection, {
import { SlackChannelsProvider } from "@/components/slack/SlackChannelsProvider";
import { SlackEnabledProvider } from "@/components/slack/SlackEnabledProvider";
import { App } from "@slack/bolt";
import { Channel } from "@slack/web-api/dist/response/ConversationsListResponse";
import { Channel } from "@slack/web-api/dist/types/response/ConversationsListResponse";
import { env } from "@/lib/env";
import { createEvent } from "./actions";
import { PageInfo } from "@/components/PageInfo";
Expand All @@ -21,7 +21,7 @@ async function getSlackChannels(): Promise<Channel[]> {
let slackApp: App | null = null;

if (isSlackEnabled) {
slackApp = await slackApiConnection();
slackApp = slackApiConnection();
const slackChannels = await slackApp.client.conversations.list({
team_id: env.SLACK_TEAM_ID,
types: "public_channel",
Expand Down
4 changes: 2 additions & 2 deletions components/slack/SlackChannelName.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import slackApiConnection, {
isSlackEnabled,
} from "@/lib/slack/slackApiConnection";
import { Text } from "@mantine/core";
import { ConversationsInfoResponse } from "@slack/web-api/dist/response";
import { ConversationsInfoResponse } from "@slack/web-api/dist/types/response";

export default async function SlackChannelName({
slackChannelID,
Expand All @@ -11,7 +11,7 @@ export default async function SlackChannelName({
}) {
let eventChannelInfo: ConversationsInfoResponse | null = null;
if (isSlackEnabled) {
const slackApp = await slackApiConnection();
const slackApp = slackApiConnection();
if (slackChannelID) {
eventChannelInfo = await slackApp.client.conversations.info({
channel: slackChannelID,
Expand Down
2 changes: 1 addition & 1 deletion components/slack/SlackChannelsProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"use client";

import invariant from "@/lib/invariant";
import { Channel } from "@slack/web-api/dist/response/ConversationsListResponse";
import { Channel } from "@slack/web-api/dist/types/response/ConversationsListResponse";
import { createContext, useContext } from "react";

const SlackChannelContext = createContext<Promise<Channel[]> | null>(null);
Expand Down
2 changes: 1 addition & 1 deletion components/slack/SlackUserInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export default async function SlackUserInfo({
let slackApp: App | null = null;

if (isSlackEnabled) {
slackApp = await slackApiConnection();
slackApp = slackApiConnection();
const slack_user = await slackApp.client.users.profile.get({
user: slack_user_id,
});
Expand Down
2 changes: 1 addition & 1 deletion features/calendar/check_with_tech.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export async function postCheckWithTech(
memo: string,
type: "check" | "help",
) {
const slack = await slackApiConnection();
const slack = slackApiConnection();
const event = await getEvent(eventID);
if (!event) {
throw new Error("Event not found");
Expand Down
10 changes: 5 additions & 5 deletions features/calendar/check_with_tech_actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ import {
ButtonAction,
SlackViewMiddlewareArgs,
ViewSubmitAction,
} from "@slack/bolt";
import {
ContextBlock,
Block,
SectionBlock,
RichTextBlock,
} from "@slack/bolt";
} from "@slack/types/dist/block-kit/blocks";
import dayjs from "dayjs";
import { env } from "@/lib/env";
import { z } from "zod";
Expand Down Expand Up @@ -56,7 +56,7 @@ export async function handleSlackAction(data: SlackActionMiddlewareArgs) {
},
});

const api = await slackApiConnection();
const api = slackApiConnection();

if (!actor) {
await api.client.chat.postEphemeral({
Expand Down Expand Up @@ -450,7 +450,7 @@ export async function _sendCWTFollowUpAndUpdateMessage(
env.SLACK_CHECK_WITH_TECH_CHANNEL,
"SLACK_CHECK_WITH_TECH_CHANNEL not set",
);
const api = await slackApiConnection();
const api = slackApiConnection();

// First update the existing channel message, then DM the requestor if
// they have a linked Slack account.
Expand Down
4 changes: 2 additions & 2 deletions features/userFeedback/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import invariant from "@/lib/invariant";
import slackApiConnection, {
isSlackEnabled,
} from "@/lib/slack/slackApiConnection";
import { KnownBlock } from "@slack/bolt";
import { KnownBlock } from "@slack/types/dist/block-kit/blocks";

export async function submit(
type: "bug" | "feature",
Expand All @@ -30,7 +30,7 @@ export async function submit(
};
}

const slack = await slackApiConnection();
const slack = slackApiConnection();
const me = await getCurrentUser();
const slackIdentity = me.identities.find((x) => x.provider === "slack");
const blocks: KnownBlock[] = [
Expand Down
2 changes: 1 addition & 1 deletion lib/auth/slack/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export type SlackTokenJson = {

export async function getSlackUserInfo(code: string) {
invariant(isSlackEnabled, "Slack is not enabled");
const slackApp = await slackApiConnection();
const slackApp = slackApiConnection();
const tokenResponse = await slackApp.client.openid.connect.token({
client_id: env.SLACK_CLIENT_ID || "",
client_secret: env.SLACK_CLIENT_SECRET || "",
Expand Down
52 changes: 33 additions & 19 deletions lib/slack/slackApiConnection.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,45 @@
import { App } from "@slack/bolt";
import { env } from "../env";
import invariant from "../invariant";

declare global {
var slack: App | undefined; // This must be a `var` and not a `let / const`
}

export const isSlackEnabled = env.SLACK_ENABLED === "true";

async function slackApiConnection() {
if (!isSlackEnabled) {
throw new Error("Slack is not enabled");
}
if (!global.slack) {
global.slack = new App({
token: env.SLACK_BOT_TOKEN,
signingSecret: env.SLACK_SIGNING_SECRET,
socketMode: env.SLACK_DISABLE_SOCKET_MODE !== "true",
port: 0, // We never want it to listen on a port
appToken: env.SLACK_APP_TOKEN,
redirectUri: `${env.PUBLIC_URL}/login/slack/callback`,
installerOptions: {
redirectUriPath: "/login/slack/callback",
},
});
}

return global.slack;
function slackApiConnection(): App {
invariant(
isSlackEnabled,
"slackApiConnection was called but slack is not enabled on this instance",
);
invariant(
(globalThis as unknown as { slackApp: App | undefined }).slackApp,
"A global slack app has not been initialised",
);

return (globalThis as unknown as { slackApp: App }).slackApp;
}

export function createSlackApp(): App {
invariant(
(globalThis as unknown as { slackApp: App | undefined }).slackApp,
"createSlackApp was called but a global app already exists",
);

(globalThis as unknown as { slackApp: App }).slackApp = new App({
token: env.SLACK_BOT_TOKEN,
signingSecret: env.SLACK_SIGNING_SECRET,
socketMode: env.SLACK_DISABLE_SOCKET_MODE !== "true",
port: 0, // We never want it to listen on a port
appToken: env.SLACK_APP_TOKEN,
redirectUri: `${env.PUBLIC_URL}/login/slack/callback`,
installerOptions: {
redirectUriPath: "/login/slack/callback",
},
});

return (globalThis as unknown as { slackApp: App }).slackApp;
}

export default slackApiConnection;
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
"@mux/mux-video-react": "^0.11.4",
"@prisma/client": "^5.21.1",
"@sentry/nextjs": "^8.28.0",
"@slack/bolt": "^3.21.4",
"@slack/bolt": "^4.0.0",
"@tanstack/react-query": "^5.51.23",
"@trpc/server": "^10.33.1",
"@types/async": "^3.2.20",
Expand Down
3 changes: 2 additions & 1 deletion server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Server } from "socket.io";
import { authenticateSocket } from "./auth";
import { env, validateEnv } from "../lib/env.js";
import slackApiConnection, {
createSlackApp,
isSlackEnabled,
} from "../lib/slack/slackApiConnection";
import { App } from "@slack/bolt";
Expand All @@ -29,7 +30,7 @@ app.prepare().then(async () => {
let slackApp: App | undefined;

if (isSlackEnabled) {
slackApp = await slackApiConnection();
slackApp = createSlackApp();

await setupActionHandlers(slackApp);
}
Expand Down
Loading