pull/2022/head
zomars 2022-02-21 16:51:46 -07:00
parent 73381dbb93
commit 5d2fbe4629
4 changed files with 47 additions and 166 deletions

View File

@ -12,7 +12,7 @@
*/
export type App = {
installed: boolean;
type: `${string}_calendar` | `${string}_payment` | `${string}_video`;
type: `${string}_calendar` | `${string}_payment` | `${string}_video` | `${string}_web3`;
title: string;
name: string;
description: string;

View File

@ -44,7 +44,14 @@ export type AppMeta = ReturnType<typeof getApps>;
export function hasIntegration(apps: AppMeta, type: string): boolean {
return !!apps.find(
(app) => app.type === type && !!app.installed && (type === "daily_video" || app.credentials.length > 0)
(app) =>
app.type === type &&
!!app.installed &&
/* TODO: find a better way to do this */
(type === "daily_video" ||
type === "jitsi_video" ||
type === "huddle01_video" ||
app.credentials.length > 0)
);
}
export function hasIntegrationInstalled(type: App["type"]): boolean {

View File

@ -1,164 +0,0 @@
import { Prisma } from "@prisma/client";
import _ from "lodash";
import { validJson } from "@lib/jsonUtils";
const credentialData = Prisma.validator<Prisma.CredentialArgs>()({
select: { id: true, type: true },
});
type CredentialData = Prisma.CredentialGetPayload<typeof credentialData>;
export type Integration = {
installed: boolean;
type:
| "google_calendar"
| "office365_calendar"
| "zoom_video"
| "daily_video"
| "tandem_video"
| "caldav_calendar"
| "apple_calendar"
| "stripe_payment"
| "jitsi_video"
| "huddle01_video"
| "metamask_web3";
title: string;
imageSrc: string;
description: string;
variant: "calendar" | "conferencing" | "payment" | "web3";
};
export const ALL_INTEGRATIONS = [
{
installed: !!(process.env.GOOGLE_API_CREDENTIALS && validJson(process.env.GOOGLE_API_CREDENTIALS)),
type: "google_calendar",
title: "Google Calendar",
imageSrc: "integrations/google-calendar.svg",
description: "For personal and business calendars",
variant: "calendar",
},
{
installed: !!(process.env.MS_GRAPH_CLIENT_ID && process.env.MS_GRAPH_CLIENT_SECRET),
type: "office365_calendar",
title: "Office 365 / Outlook.com Calendar",
imageSrc: "integrations/outlook.svg",
description: "For personal and business calendars",
variant: "calendar",
},
{
installed: !!(process.env.ZOOM_CLIENT_ID && process.env.ZOOM_CLIENT_SECRET),
type: "zoom_video",
title: "Zoom",
imageSrc: "integrations/zoom.svg",
description: "Video Conferencing",
variant: "conferencing",
},
{
installed: !!process.env.DAILY_API_KEY,
type: "daily_video",
title: "Daily.co Video",
imageSrc: "integrations/daily.svg",
description: "Video Conferencing",
variant: "conferencing",
},
{
installed: true,
type: "jitsi_video",
title: "Jitsi Meet",
imageSrc: "integrations/jitsi.svg",
description: "Video Conferencing",
variant: "conferencing",
},
{
installed: true,
type: "huddle01_video",
title: "Huddle01",
imageSrc: "integrations/huddle.svg",
description: "Video Conferencing",
variant: "conferencing",
},
{
installed: !!(process.env.TANDEM_CLIENT_ID && process.env.TANDEM_CLIENT_SECRET),
type: "tandem_video",
title: "Tandem Video",
imageSrc: "integrations/tandem.svg",
description: "Virtual Office | Video Conferencing",
variant: "conferencing",
},
{
installed: true,
type: "caldav_calendar",
title: "CalDav Server",
imageSrc: "integrations/caldav.svg",
description: "For personal and business calendars",
variant: "calendar",
},
{
installed: true,
type: "apple_calendar",
title: "Apple Calendar",
imageSrc: "integrations/apple-calendar.svg",
description: "For personal and business calendars",
variant: "calendar",
},
{
installed: !!(
process.env.STRIPE_CLIENT_ID &&
process.env.NEXT_PUBLIC_STRIPE_PUBLIC_KEY &&
process.env.STRIPE_PRIVATE_KEY
),
type: "stripe_payment",
title: "Stripe",
imageSrc: "integrations/stripe.svg",
description: "Collect payments",
variant: "payment",
},
{
installed: true,
type: "metamask_web3",
title: "Metamask",
imageSrc: "integrations/apple-calendar.svg",
description: "For personal and business calendars",
variant: "web3",
},
] as Integration[];
function getIntegrations(userCredentials: CredentialData[]) {
const integrations = ALL_INTEGRATIONS.map((integration) => {
const credentials = userCredentials
.filter((credential) => credential.type === integration.type)
.map((credential) => _.pick(credential, ["id", "type"])); // ensure we don't leak `key` to frontend
const credential: typeof credentials[number] | null = credentials[0] || null;
return {
...integration,
/**
* @deprecated use `credentials`
*/
credential,
credentials,
};
});
return integrations;
}
export type IntegrationMeta = ReturnType<typeof getIntegrations>;
export function hasIntegration(integrations: IntegrationMeta, type: string): boolean {
return !!integrations.find(
(i) =>
i.type === type &&
!!i.installed &&
(type === "daily_video" ||
type === "jitsi_video" ||
type === "huddle01_video" ||
i.credentials.length > 0)
);
}
export function hasIntegrationInstalled(type: Integration["type"]): boolean {
return ALL_INTEGRATIONS.some((i) => i.type === type && !!i.installed);
}
export default getIntegrations;

View File

@ -0,0 +1,38 @@
<svg height="64" viewBox="0 0 32 32" width="64" xmlns="http://www.w3.org/2000/svg">
<clipPath id="a">
<path d="m-200-175h1000v562h-1000z" />
</clipPath>
<clipPath id="b">
<circle cx="107" cy="106" r="102" />
</clipPath>
<clipPath id="c">
<circle cx="107" cy="106" r="100" />
</clipPath>
<clipPath id="d">
<circle cx="107" cy="106" r="92" />
</clipPath>
<clipPath id="e">
<path clipRule="evenodd"
d="m135 94.06 26-19c2.27-1.85 4-1.42 4 2v57.94c0 3.84-2.16 3.4-4 2l-26-19zm-88-16.86v43.2a17.69 17.69 0 0 0 17.77 17.6h63a3.22 3.22 0 0 0 3.23-3.2v-43.2a17.69 17.69 0 0 0 -17.77-17.6h-63a3.22 3.22 0 0 0 -3.23 3.2z" />
</clipPath>
<g clip-path="url(#a)" transform="translate(0 -178)">
<path d="m232 61h366v90h-366z" fill="#4a8cff" />
</g>
<g clip-path="url(#a)" transform="matrix(.156863 0 0 .156863 -.784314 -.627496)">
<g clip-path="url(#b)">
<path d="m0-1h214v214h-214z" fill="#e5e5e4" />
</g>
<g clip-path="url(#c)">
<path d="m2 1h210v210h-210z" fill="#fff" />
</g>
<g clip-path="url(#d)">
<path d="m10 9h194v194h-194z" fill="#4a8cff" />
</g>
<g clip-path="url(#e)">
<path d="m42 69h128v74h-128z" fill="#fff" />
</g>
</g>
<g clip-path="url(#a)" transform="translate(0 -178)">
<path d="m232 19.25h180v38.17h-180z" fill="#90908f" />
</g>
</svg>