WIP
parent
73381dbb93
commit
5d2fbe4629
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
|
@ -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>
|
Loading…
Reference in New Issue