diff --git a/src/components/CodeEditor/CodeEditorHelper.tsx b/src/components/CodeEditor/CodeEditorHelper.tsx index 4c79f215..eb5e589a 100644 --- a/src/components/CodeEditor/CodeEditorHelper.tsx +++ b/src/components/CodeEditor/CodeEditorHelper.tsx @@ -1,5 +1,15 @@ -import { Stack, Typography, Grid, Tooltip, Button } from "@mui/material"; -import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; +import { + Stack, + Typography, + Grid, + Tooltip, + Button, + IconButton, +} from "@mui/material"; +import SecretsIcon from "@mui/icons-material/VpnKeyOutlined"; +import FunctionsIcon from "@mui/icons-material/CloudOutlined"; +import DocsIcon from "@mui/icons-material/DescriptionOutlined"; +import { useAppContext } from "@src/contexts/AppContext"; export interface ICodeEditorHelperProps { docLink: string; @@ -13,6 +23,7 @@ export default function CodeEditorHelper({ docLink, additionalVariables, }: ICodeEditorHelperProps) { + const { projectId } = useAppContext(); const availableVariables = [ { key: "row", @@ -34,16 +45,14 @@ export default function CodeEditorHelper({ key: "storage", description: `firebase Storage can be accessed through this, storage.bucket() returns default storage bucket of the firebase project.`, }, - { - key: "utilFns", - description: `utilFns provides a set of functions that are commonly used, such as easy access to GCP Secret Manager`, - }, ]; return ( @@ -60,8 +69,46 @@ export default function CodeEditorHelper({ ))} - - + */} ); } diff --git a/src/components/CodeEditor/derivative.d.ts b/src/components/CodeEditor/derivative.d.ts new file mode 100644 index 00000000..07a363a6 --- /dev/null +++ b/src/components/CodeEditor/derivative.d.ts @@ -0,0 +1,10 @@ +type DerivativeContext = { + row: Row; + ref: FirebaseFirestore.DocumentReference; + storage: firebasestorage.Storage; + db: FirebaseFirestore.Firestore; + auth: firebaseauth.BaseAuth; + change: any; +}; + +type Derivative = (context: DerivativeContext) => Promise; diff --git a/src/components/CodeEditor/rowy.d.ts b/src/components/CodeEditor/rowy.d.ts index de9d706e..cd2bbdc2 100644 --- a/src/components/CodeEditor/rowy.d.ts +++ b/src/components/CodeEditor/rowy.d.ts @@ -48,7 +48,7 @@ interface Rowy { /** * Get an existing secret from the secret manager. */ - get: (name: string, version?: string) => Promise; + get: (name: SecretNames, version?: string) => Promise; }; /** * Gives access to the Cloud Storage. @@ -60,14 +60,14 @@ interface Rowy { */ url: ( url: string, - options: uploadOptions + options?: uploadOptions ) => Promise; /** * uploads a file to storage bucket from a buffer or string */ data: ( data: Buffer | string, - options: uploadOptions + options?: uploadOptions ) => Promise; }; }; @@ -76,7 +76,10 @@ interface Rowy { * use rowy.secrets.get instead. * Get an existing secret from the secret manager. */ - getSecret: (name: string, version?: string) => Promise; + getSecret: ( + name: SecretNames, + version?: string + ) => Promise; /** * @deprecated will be removed in version 2.0. * use rowy.metadata.serviceAccountUser instead. @@ -93,3 +96,9 @@ interface Rowy { } declare const rowy: Rowy; +type SecretNames = "sendgrid" | "unsplash" | "twilio"; +enum secrets { + sendgrid = "sendgrid", + unsplash = "unsplash", + twilio = "twilio", +} diff --git a/src/components/CodeEditor/useMonacoCustomizations.ts b/src/components/CodeEditor/useMonacoCustomizations.ts index edb6c2a8..4db51e03 100644 --- a/src/components/CodeEditor/useMonacoCustomizations.ts +++ b/src/components/CodeEditor/useMonacoCustomizations.ts @@ -23,6 +23,7 @@ import firebaseStorageDefs from "!!raw-loader!./firebaseStorage.d.ts"; import utilsDefs from "!!raw-loader!./utils.d.ts"; import rowyUtilsDefs from "!!raw-loader!./rowy.d.ts"; import extensionsDefs from "!!raw-loader!./extensions.d.ts"; +import derivativeDefs from "!!raw-loader!./derivative.d.ts"; export interface IUseMonacoCustomizationsProps { minHeight?: number; @@ -103,6 +104,9 @@ export default function useMonacoCustomizations({ "ts:filename/utils.d.ts" ); monaco.languages.typescript.javascriptDefaults.addExtraLib(rowyUtilsDefs); + monaco.languages.typescript.javascriptDefaults.addExtraLib( + derivativeDefs + ); } catch (error) { console.error( "An error occurred during initialization of Monaco: ", diff --git a/src/components/CodeEditor/utils.d.ts b/src/components/CodeEditor/utils.d.ts index 38a02852..b93b7c93 100644 --- a/src/components/CodeEditor/utils.d.ts +++ b/src/components/CodeEditor/utils.d.ts @@ -2,15 +2,6 @@ * utility functions */ declare namespace utilFns { - /** - * Sends out an email through sendGrid - */ - function sendEmail(msg: { - from: string; - templateId: string; - personalizations: { to: string; dynamic_template_data: any }[]; - }): void {} - /** * Gets the secret defined in Google Cloud Secret */ diff --git a/src/components/fields/Derivative/Settings.tsx b/src/components/fields/Derivative/Settings.tsx index b57cb47f..4dfa2151 100644 --- a/src/components/fields/Derivative/Settings.tsx +++ b/src/components/fields/Derivative/Settings.tsx @@ -15,6 +15,11 @@ const CodeEditor = lazy( () => import("@src/components/CodeEditor" /* webpackChunkName: "CodeEditor" */) ); +const diagnosticsOptions = { + noSemanticValidation: false, + noSyntaxValidation: false, + noSuggestionDiagnostics: true, +}; export default function Settings({ config, @@ -30,6 +35,20 @@ export default function Settings({ .filter((column) => column.fieldName !== fieldName) .filter((column) => column.type !== FieldType.subTable) .map((c) => ({ label: c.name, value: c.key })); + console.log({ config }); + const code = config.code + ? config.code + : config?.script + ? `const derivative:Derivative = async ({row,ref,db,storage,auth})=>{ + ${config.script.replace(/utilFns.getSecret/g, "rowy.secrets.getSecret")} + }` + : `const derivative:Derivative = async ({row,ref,db,storage,auth})=>{ + // Write your derivative code here + // for example: + // const sum = row.a + row.b; + // return sum; + // checkout the documentation for more info: https://docs.rowy.io/field-types/derivative + }`; return ( <> @@ -92,7 +111,11 @@ export default function Settings({ Derivative script }> - +