* Add TipTap editor and renderer components
* Change market description editor to rich text
* Type description as JSON, fix string-based logic
- Delete make-predictions.tsx
- Delete feed logic that showed descriptions
* wip Fix API validation
* fix type error
* fix extension import (backend)
In firebase, typescript compiles imports into common js imports
like `const StarterKit = require("@tiptap/starter-kit")`
Even though StarterKit is exported from the cjs file, it gets imported
as undefined. But it magically works if we import *
If you're reading this in the future, consider replacing StarterKit with
the entire list of extensions.
* Stop load on fail create market, improve warning
* Refactor editor as hook / fix infinite submit bug
Move state of editor back up to parent
We have to do this later anyways to allow parent to edit
* Add images - display, paste + uploading
* add uploading state of image
* Fix placeholder, misc styling
min height, quote
* Fix appending to description
* code review fixes: rename, refactor, chop carets
* Add hint & upload button on new lines
- bump to Tailwind 3.1 for arbitrary variants
* clean up, run prettier
* rename FileButton to FileUploadButton
* add image extension as functions dependency
|
||
|---|---|---|
| .. | ||
| src | ||
| .env | ||
| .eslintrc.js | ||
| .gitignore | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
NOTE: Adapted from One Word's /functions doc. Fix any errors you see!
Firestore Cloud Functions
This is code that doesn't make sense on the frontend client, e.g.
- Long-running or slow operation (database)
- Tasks that need to be run every so often (syncing email list to Mailjet)
- Anything we should't trust to clients (secrets, auth)
If you want to make and test changes, you'll have to do a bit of setup...
Installing
Adapted from https://firebase.google.com/docs/functions/get-started
$ cd functionsto switch to this folder$ yarn global add firebase-toolsto install the Firebase CLI globally$ yarnto install JS dependencies$ firebase loginto authenticate the CLI tools to Firebase$ firebase use devto choose the dev project
For local development
-
Install gcloud CLI
-
If you don't have java (or see the error
Error: Process java -version has exited with code 1. Please make sure Java is installed and on your system PATH.):$ brew install java$ sudo ln -sfn /opt/homebrew/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
-
$ gcloud auth loginto authenticate the CLI tools to Google Cloud -
$ gcloud config set project <project-id>to choose the project ($ gcloud projects listto see options) -
$ mkdir firestore_exportto create a folder to store the exported database -
$ yarn db:update-local-from-remoteto pull the remote db from Firestore to local 0. TODO: this won't work when open source, we'll have to point to the public db
Developing locally
$ firebase use devif you haven't already$ yarn serveto spin up the emulators 0. The Emulator UI is at http://localhost:4000; the functions are hosted on :5001. Note: You have to kill and restart emulators when you change code; no hot reload =($ yarn dev:emulatein/webto connect to emulators with the frontend 0. Note: emulated database is cleared after every shutdown
Firestore Commands
db:update-local-from-remote- Pull the remote db from Firestore to local, also calls:db:backup-remote- Exports the remote dev db to the backup folder on Google Cloud Storage (called on everydb:update-local-from-remote)db:rename-remote-backup-folder- Renames the remote backup folder (called on everydb:backup-remoteto preserve the previous db backup)
db:backup-local- Save the local db changes to the disk (overwrites existing)
Debugging
- Find local logs directly in the shell that ran
$ yarn dev - Find deployed logs here
Deploying
$ firebase use prodto switch to prod$ firebase deploy --only functionsto push your changes live! (Future TODO: auto-deploy functions on Git push)
Secrets management
Secrets are strings that shouldn't be checked into Git (eg API keys, passwords). We store these using Google Secret Manager, which provides them as environment variables to functions that require them. Some useful workflows:
- Set a secret:
$ firebase functions:secrets:set stripe.test_secret="THE-API-KEY" - Read a secret:
$ firebase functions:secrets:access STRIPE_APIKEY