docs[minor]: Swap gtag for supabase (#18937)

Added deps:
- `@supabase/supabase-js` - for sending inserts
- `supabase` - dev dep, for generating types via cli
- `dotenv` for loading env vars

Added script:
- `yarn gen` - will auto generate the database schema types using the
supabase CLI. Not necessary for development, but is useful. Requires
authing with the supabase CLI (will error out w/ instructions if you're
not authed).

Added functionality:
- pulls users IP address (using a free endpoint: `https://api.ipify.org`
so we can filter out abuse down the line)

TODO:
- [x] add env vars to vercel
pull/18942/head
Brace Sproul 2 months ago committed by GitHub
parent 5c2f7e6b2b
commit 4ff6aa5c78
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

1
docs/.gitignore vendored

@ -1 +1,2 @@
/.quarto/
src/supabase.d.ts

@ -4,7 +4,7 @@
// Note: type annotations allow type checking and IDEs autocompletion
// eslint-disable-next-line import/no-extraneous-dependencies
const { ProvidePlugin } = require("webpack");
const path = require("path");
require("dotenv").config();
const baseLightCodeBlockTheme = require("prism-react-renderer/themes/vsLight");
const baseDarkCodeBlockTheme = require("prism-react-renderer/themes/vsDark");
@ -335,12 +335,13 @@ const config = {
src: "https://www.googletagmanager.com/gtag/js?id=G-9B66JQQH2F",
async: true,
},
{
src: "https://www.googletagmanager.com/gtag/js?id=G-WFT0J048RF",
async: true,
}
],
customFields: {
NEXT_PUBLIC_SUPABASE_PUBLIC_KEY:
process.env.NEXT_PUBLIC_SUPABASE_PUBLIC_KEY,
NEXT_PUBLIC_SUPABASE_URL: process.env.NEXT_PUBLIC_SUPABASE_URL,
},
};
module.exports = config;

15800
docs/package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -16,7 +16,9 @@
"lint:fix": "yarn lint --fix",
"precommit": "lint-staged",
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,md,mdx}\"",
"format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,md,mdx}\""
"format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,md,mdx}\"",
"gen": "yarn gen:supabase",
"gen:supabase": "npx supabase gen types typescript --project-id 'xsqpnijvmbodcxyapnyq' --schema public > ./src/supabase.d.ts"
},
"dependencies": {
"@docusaurus/core": "2.4.3",
@ -24,6 +26,7 @@
"@docusaurus/remark-plugin-npm2yarn": "^2.4.3",
"@docusaurus/theme-mermaid": "2.4.3",
"@mdx-js/react": "^1.6.22",
"@supabase/supabase-js": "^2.39.7",
"clsx": "^1.2.1",
"cookie": "^0.6.0",
"json-loader": "^0.5.7",
@ -36,6 +39,7 @@
"devDependencies": {
"@babel/eslint-parser": "^7.18.2",
"docusaurus-plugin-typedoc": "next",
"dotenv": "^16.4.5",
"eslint": "^8.19.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-prettier": "^8.5.0",
@ -45,6 +49,7 @@
"eslint-plugin-react": "^7.30.1",
"eslint-plugin-react-hooks": "^4.6.0",
"prettier": "^2.7.1",
"supabase": "^1.148.6",
"typedoc": "^0.24.4",
"typedoc-plugin-markdown": "next",
"yaml-loader": "^0.8.0"

@ -1,5 +0,0 @@
export default function gtag(...args) {
if (window.gtagFeedback) {
window.gtagFeedback(...args);
}
}

@ -1,6 +1,6 @@
/* eslint-disable no-return-assign, react/jsx-props-no-spreading */
import React, { useState, useEffect } from "react";
import gtag from "../analytics";
import { createClient } from "@supabase/supabase-js";
const useCookie = () => {
/**
@ -90,27 +90,69 @@ function SvgThumbsDown() {
);
}
/**
* Generated type for the Supabase DB schema.
* @typedef {import('../supabase').Database} Database
*/
const FEEDBACK_COOKIE_PREFIX = "feedbackSent";
/** @type {Database["public"]["Enums"]["project_type"]} */
const LANGCHAIN_PROJECT_NAME = "langchain_py_docs";
/**
* @returns {Promise<string>}
*/
const getIpAddress = async () => {
const response = await fetch("https://api.ipify.org?format=json");
return (await response.json()).ip;
};
export default function Feedback() {
const { setCookie, checkCookie } = useCookie();
const [feedbackSent, setFeedbackSent] = useState(false);
/**
* @param {"good" | "bad"} feedback
*/
const handleFeedback = (feedback) => {
/** @param {"good" | "bad"} feedback */
const handleFeedback = async (feedback) => {
if (process.env.NODE_ENV !== "production") {
console.log("Feedback (dev)");
return;
}
const cookieName = `${FEEDBACK_COOKIE_PREFIX}_${window.location.pathname}`;
if (checkCookie(cookieName)) {
return;
}
const feedbackEnv =
process.env.NODE_ENV === "production"
? "page_feedback"
: "page_feedback_dev";
/** @type {Database} */
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL,
process.env.NEXT_PUBLIC_SUPABASE_PUBLIC_KEY
);
try {
const ipAddress = await getIpAddress();
/**
* "id" and "created_at" are automatically generated by Supabase
* @type {Omit<Database["public"]["Tables"]["feedback"]["Row"], "id" | "created_at">}
*/
const data = {
is_good: feedback === "good",
url: window.location.pathname,
user_ip: ipAddress,
project: LANGCHAIN_PROJECT_NAME,
};
const { error } = await supabase.from("feedback").insert(data);
if (error) {
throw error;
}
} catch (e) {
console.error("Failed to send feedback", {
e,
});
return;
}
gtag("event", `${feedbackEnv}_${feedback}`, {});
// Set a cookie to prevent feedback from being sent multiple times
setCookie(cookieName, window.location.pathname, 1);
setFeedbackSent(true);
@ -161,16 +203,16 @@ export default function Feedback() {
{...defaultFields}
role="button" // Make it recognized as an interactive element
tabIndex={0} // Make it focusable
onKeyDown={(e) => {
onKeyDown={async (e) => {
// Handle keyboard interaction
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
handleFeedback("good");
await handleFeedback("good");
}
}}
onClick={(e) => {
onClick={async (e) => {
e.preventDefault();
handleFeedback("good");
await handleFeedback("good");
}}
>
<SvgThumbsUp />
@ -179,16 +221,16 @@ export default function Feedback() {
{...defaultFields}
role="button" // Make it recognized as an interactive element
tabIndex={0} // Make it focusable
onKeyDown={(e) => {
onKeyDown={async (e) => {
// Handle keyboard interaction
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
handleFeedback("bad");
await handleFeedback("bad");
}
}}
onClick={(e) => {
onClick={async (e) => {
e.preventDefault();
handleFeedback("bad");
await handleFeedback("bad");
}}
>
<SvgThumbsDown />

@ -3,9 +3,3 @@ function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-9B66JQQH2F');
// Only for feedback
function gtagFeedback(){dataLayer.push(arguments);}
gtagFeedback('js', new Date());
gtagFeedback('config', 'G-WFT0J048RF');

@ -2675,6 +2675,77 @@ __metadata:
languageName: node
linkType: hard
"@supabase/functions-js@npm:2.1.5":
version: 2.1.5
resolution: "@supabase/functions-js@npm:2.1.5"
dependencies:
"@supabase/node-fetch": ^2.6.14
checksum: f2ab8636af8d982270b61631a5120369ca10db101b4298da71be892e5d91a8ddaddcf7f51079ad0fe24731a15892b21bd7dbe41b997da9d4b90e4326d09632c8
languageName: node
linkType: hard
"@supabase/gotrue-js@npm:2.62.2":
version: 2.62.2
resolution: "@supabase/gotrue-js@npm:2.62.2"
dependencies:
"@supabase/node-fetch": ^2.6.14
checksum: d77f5075c56dc8529b137f8aba3e4f5ee7da30c21f519202fd63d2b71aef459b6b61daee0a7e199eaa31ab14206336efa0141baafebfe3f1fb94c0e1f15dfbf5
languageName: node
linkType: hard
"@supabase/node-fetch@npm:2.6.15, @supabase/node-fetch@npm:^2.6.14":
version: 2.6.15
resolution: "@supabase/node-fetch@npm:2.6.15"
dependencies:
whatwg-url: ^5.0.0
checksum: 9673b49236a56df49eb7ea5cb789cf4e8b1393069b84b4964ac052995e318a34872f428726d128f232139e17c3375a531e45e99edd3e96a25cce60d914b53879
languageName: node
linkType: hard
"@supabase/postgrest-js@npm:1.9.2":
version: 1.9.2
resolution: "@supabase/postgrest-js@npm:1.9.2"
dependencies:
"@supabase/node-fetch": ^2.6.14
checksum: 9aefbdfc1c0d8a00b932b0939dbcbb5ec392b1324ad1b63b5e0486c6f9882a9c2292c80d3f803a0338938097372f08b3bcbdc3c4699d5bef13791ddc35d53b86
languageName: node
linkType: hard
"@supabase/realtime-js@npm:2.9.3":
version: 2.9.3
resolution: "@supabase/realtime-js@npm:2.9.3"
dependencies:
"@supabase/node-fetch": ^2.6.14
"@types/phoenix": ^1.5.4
"@types/ws": ^8.5.10
ws: ^8.14.2
checksum: 180a5084b94a4e324fc04041182bf8819c3c2545a731c276a56f9647f78078180b0460b68a0d6c568d29b2fa4aace0545bb71dcb89b547ec85781032dff74e71
languageName: node
linkType: hard
"@supabase/storage-js@npm:2.5.5":
version: 2.5.5
resolution: "@supabase/storage-js@npm:2.5.5"
dependencies:
"@supabase/node-fetch": ^2.6.14
checksum: 4470499113c15e1124d99048eef0097c7ba431d728e351519ee26948775171d6c6bb41156f8ffb3860009b82b93809af01c9d075ece6000f783f59ce9fd00ee8
languageName: node
linkType: hard
"@supabase/supabase-js@npm:^2.39.7":
version: 2.39.7
resolution: "@supabase/supabase-js@npm:2.39.7"
dependencies:
"@supabase/functions-js": 2.1.5
"@supabase/gotrue-js": 2.62.2
"@supabase/node-fetch": 2.6.15
"@supabase/postgrest-js": 1.9.2
"@supabase/realtime-js": 2.9.3
"@supabase/storage-js": 2.5.5
checksum: f2cc7c7841762d3161f53b19e82b0eb860d72510729114ed45a38aff0427c5897e4a176092b370b68fcd621b385de4d3b90fc43fe39d129d09c04b6da5a407d7
languageName: node
linkType: hard
"@svgr/babel-plugin-add-jsx-attribute@npm:^6.5.1":
version: 6.5.1
resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:6.5.1"
@ -3085,6 +3156,13 @@ __metadata:
languageName: node
linkType: hard
"@types/phoenix@npm:^1.5.4":
version: 1.6.4
resolution: "@types/phoenix@npm:1.6.4"
checksum: 0f13849602db6d9a2a4b9d96386c45471acedf2bc3d6bf6b3289876fa73f0fe0e84c8466bd55c4f2763d33e142e5311c220820fed9ac2a21d9126f1f70a7338f
languageName: node
linkType: hard
"@types/prop-types@npm:*":
version: 15.7.11
resolution: "@types/prop-types@npm:15.7.11"
@ -3227,7 +3305,7 @@ __metadata:
languageName: node
linkType: hard
"@types/ws@npm:^8.5.5":
"@types/ws@npm:^8.5.10, @types/ws@npm:^8.5.5":
version: 8.5.10
resolution: "@types/ws@npm:8.5.10"
dependencies:
@ -4037,6 +4115,18 @@ __metadata:
languageName: node
linkType: hard
"bin-links@npm:^4.0.3":
version: 4.0.3
resolution: "bin-links@npm:4.0.3"
dependencies:
cmd-shim: ^6.0.0
npm-normalize-package-bin: ^3.0.0
read-cmd-shim: ^4.0.0
write-file-atomic: ^5.0.0
checksum: 3b3ee22efc38d608479d51675c8958a841b8b55b8975342ce86f28ac4e0bb3aef46e9dbdde976c6dc1fe1bd2aa00d42e00869ad35b57ee6d868f39f662858911
languageName: node
linkType: hard
"binary-extensions@npm:^2.0.0":
version: 2.2.0
resolution: "binary-extensions@npm:2.2.0"
@ -4469,6 +4559,13 @@ __metadata:
languageName: node
linkType: hard
"cmd-shim@npm:^6.0.0":
version: 6.0.2
resolution: "cmd-shim@npm:6.0.2"
checksum: df3a01fc4d72a49b450985b991205e65774b28e7f74a2e4d2a11fd0df8732e3828f9e7b644050def3cd0be026cbd3ee46a1f50ce5f57d0b3fb5afe335bdfacde
languageName: node
linkType: hard
"collapse-white-space@npm:^1.0.2":
version: 1.0.6
resolution: "collapse-white-space@npm:1.0.6"
@ -5410,6 +5507,13 @@ __metadata:
languageName: node
linkType: hard
"data-uri-to-buffer@npm:^4.0.0":
version: 4.0.1
resolution: "data-uri-to-buffer@npm:4.0.1"
checksum: 0d0790b67ffec5302f204c2ccca4494f70b4e2d940fea3d36b09f0bb2b8539c2e86690429eb1f1dc4bcc9e4df0644193073e63d9ee48ac9fce79ec1506e4aa4c
languageName: node
linkType: hard
"dayjs@npm:^1.11.7":
version: 1.11.10
resolution: "dayjs@npm:1.11.10"
@ -5652,9 +5756,11 @@ __metadata:
"@docusaurus/remark-plugin-npm2yarn": ^2.4.3
"@docusaurus/theme-mermaid": 2.4.3
"@mdx-js/react": ^1.6.22
"@supabase/supabase-js": ^2.39.7
clsx: ^1.2.1
cookie: ^0.6.0
docusaurus-plugin-typedoc: next
dotenv: ^16.4.5
eslint: ^8.19.0
eslint-config-airbnb: ^19.0.4
eslint-config-prettier: ^8.5.0
@ -5668,6 +5774,7 @@ __metadata:
process: ^0.11.10
react: ^17.0.2
react-dom: ^17.0.2
supabase: ^1.148.6
typedoc: ^0.24.4
typedoc-plugin-markdown: next
typescript: ^5.1.3
@ -5807,6 +5914,13 @@ __metadata:
languageName: node
linkType: hard
"dotenv@npm:^16.4.5":
version: 16.4.5
resolution: "dotenv@npm:16.4.5"
checksum: 301a12c3d44fd49888b74eb9ccf9f07a1f5df43f489e7fcb89647a2edcd84c42d6bc349dc8df099cd18f07c35c7b04685c1a4f3e6a6a9e6b30f8d48c15b7f49c
languageName: node
linkType: hard
"duplexer3@npm:^0.1.4":
version: 0.1.5
resolution: "duplexer3@npm:0.1.5"
@ -6642,6 +6756,16 @@ __metadata:
languageName: node
linkType: hard
"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4":
version: 3.2.0
resolution: "fetch-blob@npm:3.2.0"
dependencies:
node-domexception: ^1.0.0
web-streams-polyfill: ^3.0.3
checksum: f19bc28a2a0b9626e69fd7cf3a05798706db7f6c7548da657cbf5026a570945f5eeaedff52007ea35c8bcd3d237c58a20bf1543bc568ab2422411d762dd3d5bf
languageName: node
linkType: hard
"file-entry-cache@npm:^6.0.1":
version: 6.0.1
resolution: "file-entry-cache@npm:6.0.1"
@ -6833,6 +6957,15 @@ __metadata:
languageName: node
linkType: hard
"formdata-polyfill@npm:^4.0.10":
version: 4.0.10
resolution: "formdata-polyfill@npm:4.0.10"
dependencies:
fetch-blob: ^3.1.2
checksum: 82a34df292afadd82b43d4a740ce387bc08541e0a534358425193017bf9fb3567875dc5f69564984b1da979979b70703aa73dee715a17b6c229752ae736dd9db
languageName: node
linkType: hard
"forwarded@npm:0.2.0":
version: 0.2.0
resolution: "forwarded@npm:0.2.0"
@ -7604,7 +7737,7 @@ __metadata:
languageName: node
linkType: hard
"https-proxy-agent@npm:^7.0.1":
"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2":
version: 7.0.4
resolution: "https-proxy-agent@npm:7.0.4"
dependencies:
@ -9281,6 +9414,13 @@ __metadata:
languageName: node
linkType: hard
"node-domexception@npm:^1.0.0":
version: 1.0.0
resolution: "node-domexception@npm:1.0.0"
checksum: ee1d37dd2a4eb26a8a92cd6b64dfc29caec72bff5e1ed9aba80c294f57a31ba4895a60fd48347cf17dd6e766da0ae87d75657dfd1f384ebfa60462c2283f5c7f
languageName: node
linkType: hard
"node-emoji@npm:^1.10.0":
version: 1.11.0
resolution: "node-emoji@npm:1.11.0"
@ -9304,6 +9444,17 @@ __metadata:
languageName: node
linkType: hard
"node-fetch@npm:^3.3.2":
version: 3.3.2
resolution: "node-fetch@npm:3.3.2"
dependencies:
data-uri-to-buffer: ^4.0.0
fetch-blob: ^3.1.4
formdata-polyfill: ^4.0.10
checksum: 06a04095a2ddf05b0830a0d5302699704d59bda3102894ea64c7b9d4c865ecdff2d90fd042df7f5bc40337266961cb6183dcc808ea4f3000d024f422b462da92
languageName: node
linkType: hard
"node-forge@npm:^1":
version: 1.3.1
resolution: "node-forge@npm:1.3.1"
@ -9384,6 +9535,13 @@ __metadata:
languageName: node
linkType: hard
"npm-normalize-package-bin@npm:^3.0.0":
version: 3.0.1
resolution: "npm-normalize-package-bin@npm:3.0.1"
checksum: de416d720ab22137a36292ff8a333af499ea0933ef2320a8c6f56a73b0f0448227fec4db5c890d702e26d21d04f271415eab6580b5546456861cc0c19498a4bf
languageName: node
linkType: hard
"npm-run-path@npm:^4.0.1":
version: 4.0.1
resolution: "npm-run-path@npm:4.0.1"
@ -10794,6 +10952,13 @@ __metadata:
languageName: node
linkType: hard
"read-cmd-shim@npm:^4.0.0":
version: 4.0.0
resolution: "read-cmd-shim@npm:4.0.0"
checksum: 2fb5a8a38984088476f559b17c6a73324a5db4e77e210ae0aab6270480fd85c355fc990d1c79102e25e555a8201606ed12844d6e3cd9f35d6a1518791184e05b
languageName: node
linkType: hard
"readable-stream@npm:^2.0.1":
version: 2.3.8
resolution: "readable-stream@npm:2.3.8"
@ -12009,6 +12174,20 @@ __metadata:
languageName: node
linkType: hard
"supabase@npm:^1.148.6":
version: 1.149.1
resolution: "supabase@npm:1.149.1"
dependencies:
bin-links: ^4.0.3
https-proxy-agent: ^7.0.2
node-fetch: ^3.3.2
tar: 6.2.0
bin:
supabase: bin/supabase
checksum: 32e91100c72fcf3773efe29b84dbb49337da4ee7f064f79df017e1ffaa586cdc9ab84aa4ed49a6e84c1c1c9c734a7c3846299ab62116ab1a6b5a62a6722a2c26
languageName: node
linkType: hard
"supports-color@npm:^5.3.0":
version: 5.5.0
resolution: "supports-color@npm:5.5.0"
@ -12081,7 +12260,7 @@ __metadata:
languageName: node
linkType: hard
"tar@npm:^6.1.11, tar@npm:^6.1.2":
"tar@npm:6.2.0, tar@npm:^6.1.11, tar@npm:^6.1.2":
version: 6.2.0
resolution: "tar@npm:6.2.0"
dependencies:
@ -12860,6 +13039,13 @@ __metadata:
languageName: node
linkType: hard
"web-streams-polyfill@npm:^3.0.3":
version: 3.3.3
resolution: "web-streams-polyfill@npm:3.3.3"
checksum: 21ab5ea08a730a2ef8023736afe16713b4f2023ec1c7085c16c8e293ee17ed085dff63a0ad8722da30c99c4ccbd4ccd1b2e79c861829f7ef2963d7de7004c2cb
languageName: node
linkType: hard
"web-worker@npm:^1.2.0":
version: 1.3.0
resolution: "web-worker@npm:1.3.0"
@ -13213,6 +13399,16 @@ __metadata:
languageName: node
linkType: hard
"write-file-atomic@npm:^5.0.0":
version: 5.0.1
resolution: "write-file-atomic@npm:5.0.1"
dependencies:
imurmurhash: ^0.1.4
signal-exit: ^4.0.1
checksum: 8dbb0e2512c2f72ccc20ccedab9986c7d02d04039ed6e8780c987dc4940b793339c50172a1008eed7747001bfacc0ca47562668a069a7506c46c77d7ba3926a9
languageName: node
linkType: hard
"ws@npm:^7.3.1":
version: 7.5.9
resolution: "ws@npm:7.5.9"
@ -13228,7 +13424,7 @@ __metadata:
languageName: node
linkType: hard
"ws@npm:^8.13.0":
"ws@npm:^8.13.0, ws@npm:^8.14.2":
version: 8.16.0
resolution: "ws@npm:8.16.0"
peerDependencies:

Loading…
Cancel
Save