From 67373f97545849a4622751bb18561f8a49a46021 Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Tue, 16 Apr 2024 17:14:26 -0400 Subject: [PATCH 01/16] Fix radar chart issue where colors match on unify page --- src/app/unify/[users]/UnifyContent.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/unify/[users]/UnifyContent.jsx b/src/app/unify/[users]/UnifyContent.jsx index 86859bb..122da00 100644 --- a/src/app/unify/[users]/UnifyContent.jsx +++ b/src/app/unify/[users]/UnifyContent.jsx @@ -428,7 +428,7 @@ function UnifyContent({ user1Data, user2Data }) { valueFormat=">-.1f" maxValue="100" colors={[ - user2personality.colors.dark, + user2personality.colors.bg, user1personality.colors.dark, ]} margin={{ top: 40, right: 60, bottom: 40, left: 60 }} From a3bf957d8cd94456f95adb5a2caef74a6ae955f0 Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Tue, 16 Apr 2024 17:26:25 -0400 Subject: [PATCH 02/16] Adjust colors again --- src/app/unify/[users]/UnifyContent.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/unify/[users]/UnifyContent.jsx b/src/app/unify/[users]/UnifyContent.jsx index 122da00..acd9e3e 100644 --- a/src/app/unify/[users]/UnifyContent.jsx +++ b/src/app/unify/[users]/UnifyContent.jsx @@ -428,8 +428,8 @@ function UnifyContent({ user1Data, user2Data }) { valueFormat=">-.1f" maxValue="100" colors={[ - user2personality.colors.bg, - user1personality.colors.dark, + user2personality.colors.cassetteAccent, + user1personality.colors.cassetteBody, ]} margin={{ top: 40, right: 60, bottom: 40, left: 60 }} gridLabelOffset={25} From 5744bf756c7e903cd682165cde37d2f71f05b5e6 Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Tue, 16 Apr 2024 17:41:12 -0400 Subject: [PATCH 03/16] Fix font loading on Chrome (and Safari) --- public/fonts/HomemadeApple.ttf | Bin 0 -> 110080 bytes public/fonts/Koulen-Regular.ttf | Bin 0 -> 56324 bytes src/app/globals.css | 4 +- src/app/user/[slug]/page.jsx | 172 ++++++++++++++++---------------- 4 files changed, 86 insertions(+), 90 deletions(-) create mode 100644 public/fonts/HomemadeApple.ttf create mode 100644 public/fonts/Koulen-Regular.ttf diff --git a/public/fonts/HomemadeApple.ttf b/public/fonts/HomemadeApple.ttf new file mode 100644 index 0000000000000000000000000000000000000000..75d4fbcb8b50189a2b6c68c6b4aa32750075ddb1 GIT binary patch literal 110080 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 TK)(s7A0(A$r6Ce<&F_Bzx- { - // Wait for the image to load - img.onload = () => { - // Create a canvas element - const canvas = document.createElement("canvas"); - const ctx = canvas.getContext("2d"); - - if (!ctx) { - setError("Unable to obtain 2D context for canvas."); - return; + // const fontLoadPromise = Promise.all([ + // document.fonts.load("20px Koulen"), + // document.fonts.load("16px HomemadeApple"), + // ]); + + // Wait for the image to load + img.onload = () => { + // Create a canvas element + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + + if (!ctx) { + setError("Unable to obtain 2D context for canvas."); + return; + } + + canvas.width = img.width; + canvas.height = img.height; + + // Clear canvas + ctx.clearRect(0, 0, canvas.width, canvas.height); + + canvas.width = img.width; + canvas.height = img.height; + + // Draw the image on the canvas + ctx.drawImage(img, 0, 0); + + ctx.textAlign = "center"; + + ctx.font = `20px Koulen`; + + // Render the text onto the canvas + ctx.font = `16px HomemadeApple`; + ctx.fillStyle = "black"; + ctx.fillText( + `@${userData.userProfile.display_name}`, + canvas.width / 2, + 375, + ); + + ctx.font = `20px Koulen`; + ctx.fillStyle = `${personality.colors.cassetteAccent}`; + ctx.fillText(`#${personality.name}`, canvas.width / 2, 460); + + ctx.font = `35px Koulen`; + ctx.fillStyle = "black"; + ctx.fillText("A", canvas.width / 2 - 110, 393); + + // url to redirect user to, this brings up the unify page + const shareURL = `http://${process.env.NEXT_PUBLIC_FRONTEND_URL}/unify/${userData.userProfile.id}`; + + // Convert canvas to blob + canvas.toBlob(async (blob) => { + if (navigator.share) { + try { + await navigator.share({ + title: "Unify with me!", + text: `Compare our stats on Uni.fy`, + url: shareURL, + files: [ + new File([blob], "file.png", { + type: blob.type, + }), + ], + }); + } catch (error) { + // prevent cancelation of share from being error } - - canvas.width = img.width; - canvas.height = img.height; - - // Clear canvas - ctx.clearRect(0, 0, canvas.width, canvas.height); - - canvas.width = img.width; - canvas.height = img.height; - - // Draw the image on the canvas - ctx.drawImage(img, 0, 0); - - ctx.textAlign = "center"; - - ctx.font = `20px Koulen`; - - // Render the text onto the canvas - ctx.font = `16px HomemadeApple`; - ctx.fillStyle = "black"; - ctx.fillText( - `@${userData.userProfile.display_name}`, - canvas.width / 2, - 375, - ); - - ctx.font = `20px Koulen`; - ctx.fillStyle = `${personality.colors.cassetteAccent}`; - ctx.fillText(`#${personality.name}`, canvas.width / 2, 460); - - ctx.font = `35px Koulen`; - ctx.fillStyle = "black"; - ctx.fillText("A", canvas.width / 2 - 110, 393); - - // url to redirect user to, this brings up the unify page - const shareURL = `http://${process.env.NEXT_PUBLIC_FRONTEND_URL}/unify/${userData.userProfile.id}`; - - // Convert canvas to blob - canvas.toBlob(async (blob) => { - if (navigator.share) { - try { - await navigator.share({ - title: "Unify with me!", - text: `Compare our stats on Uni.fy`, - url: shareURL, - files: [ - new File([blob], "file.png", { - type: blob.type, - }), - ], - }); - } catch (error) { - // prevent cancelation of share from being error - } - } else { - try { - await navigator.clipboard.write([ - new ClipboardItem({ - "text/plain": new Blob([shareURL], { - type: "text/plain", - }), - }), - ]); - alert("Link copied to clipboard"); - } catch (error) { - alert("Failed to copy to clipboard."); - } - } - }, "image/png"); - }; - }) - .catch(); + } else { + try { + await navigator.clipboard.write([ + new ClipboardItem({ + "text/plain": new Blob([shareURL], { + type: "text/plain", + }), + }), + ]); + alert("Link copied to clipboard"); + } catch (error) { + alert("Failed to copy to clipboard."); + } + } + }, "image/png"); + }; }; useEffect(() => { From 5d5ea33417997a95eb26761bde8fb2d3f000c589 Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:01:00 -0400 Subject: [PATCH 04/16] Refactor shared components --- README.md | 1 + src/app/unify/[users]/ShareUnify.jsx | 2 +- src/app/unify/[users]/UnifyContent.jsx | 4 ++-- src/app/user/[slug]/ShareCassette.jsx | 2 +- src/app/user/[slug]/UserContent.jsx | 4 ++-- src/{app/user/[slug] => shared}/CDCase.jsx | 0 src/{app/user/[slug] => shared}/CDStack.jsx | 2 +- src/{app/user/[slug] => shared}/Cassette.jsx | 0 8 files changed, 8 insertions(+), 7 deletions(-) rename src/{app/user/[slug] => shared}/CDCase.jsx (100%) rename src/{app/user/[slug] => shared}/CDStack.jsx (95%) rename src/{app/user/[slug] => shared}/Cassette.jsx (100%) diff --git a/README.md b/README.md index 951c0d6..fa4a466 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ To start the application, simply run `npm run dev`. You can access the applicati | `.all-contributorsrc` | See . | | `.env` | Non-secret environment variables. | | `jsconfig.json` | VS Code IntelliSense support file. | +| `public/` | Public assets (fonts) | Other supporting files in the root directory include configuration files for linting (ESLint + Prettier), testing (Jest), Next.js, and others. diff --git a/src/app/unify/[users]/ShareUnify.jsx b/src/app/unify/[users]/ShareUnify.jsx index 74e3ac9..6caf08b 100644 --- a/src/app/unify/[users]/ShareUnify.jsx +++ b/src/app/unify/[users]/ShareUnify.jsx @@ -5,7 +5,7 @@ Generated when they click the Unify/Share button on their user page. import PropTypes from "prop-types"; import getPersonality from "@/shared/GetPersonality"; -import Cassette from "@/app/user/[slug]/Cassette"; +import Cassette from "@/shared/Cassette"; function ShareUnify({ user1Data, user2Data }) { const user1Personality = getPersonality(user1Data); // get personality for user 1 diff --git a/src/app/unify/[users]/UnifyContent.jsx b/src/app/unify/[users]/UnifyContent.jsx index acd9e3e..9a41e00 100644 --- a/src/app/unify/[users]/UnifyContent.jsx +++ b/src/app/unify/[users]/UnifyContent.jsx @@ -10,10 +10,10 @@ import PropTypes from "prop-types"; import GenrePieChart from "@/shared/GenrePieChart"; import ShareUnify from "@/app/unify/[users]/ShareUnify"; import "@/app/globals.css"; -import Cassette from "@/app/user/[slug]/Cassette"; +import Cassette from "@/shared/Cassette"; import getPersonality from "@/shared/GetPersonality"; import Boombox from "@/app/unify/[users]/Boombox"; -import CDStack from "@/app/user/[slug]/CDStack"; +import CDStack from "@/shared/CDStack"; // Find percent match between two lists function calculateGenreSimilarity(list1, list2) { diff --git a/src/app/user/[slug]/ShareCassette.jsx b/src/app/user/[slug]/ShareCassette.jsx index 010ef97..f02a589 100644 --- a/src/app/user/[slug]/ShareCassette.jsx +++ b/src/app/user/[slug]/ShareCassette.jsx @@ -4,7 +4,7 @@ Contains a graphic showing a summary of the unified data between two users. */ import PropTypes from "prop-types"; -import Cassette from "@/app/user/[slug]/Cassette"; +import Cassette from "@/shared/Cassette"; import getPersonality from "@/shared/GetPersonality"; function ShareCassette({ userData }) { diff --git a/src/app/user/[slug]/UserContent.jsx b/src/app/user/[slug]/UserContent.jsx index edc99e7..0e39f53 100644 --- a/src/app/user/[slug]/UserContent.jsx +++ b/src/app/user/[slug]/UserContent.jsx @@ -8,9 +8,9 @@ import PropTypes from "prop-types"; import "@/app/globals.css"; import GenrePieChart from "@/shared/GenrePieChart"; import Boombox from "@/app/user/[slug]/Boombox"; -import Cassette from "@/app/user/[slug]/Cassette"; +import Cassette from "@/shared/Cassette"; import PaperTitle from "@/app/user/[slug]/PaperTitle"; -import CDStack from "@/app/user/[slug]/CDStack"; +import CDStack from "@/shared/CDStack"; import getPersonality from "@/shared/GetPersonality"; import PhotoMarquee from "@/app/user/[slug]/PhotoMarquee"; import PhotoGallery from "@/app/user/[slug]/PhotoGallery"; diff --git a/src/app/user/[slug]/CDCase.jsx b/src/shared/CDCase.jsx similarity index 100% rename from src/app/user/[slug]/CDCase.jsx rename to src/shared/CDCase.jsx diff --git a/src/app/user/[slug]/CDStack.jsx b/src/shared/CDStack.jsx similarity index 95% rename from src/app/user/[slug]/CDStack.jsx rename to src/shared/CDStack.jsx index 8e49419..80b22e6 100644 --- a/src/app/user/[slug]/CDStack.jsx +++ b/src/shared/CDStack.jsx @@ -5,7 +5,7 @@ Params: - userColors: color scheme */ import PropTypes from "prop-types"; -import CDCase from "@/app/user/[slug]/CDCase"; +import CDCase from "@/shared/CDCase"; export default function CDStack({ topList, userColors }) { return ( diff --git a/src/app/user/[slug]/Cassette.jsx b/src/shared/Cassette.jsx similarity index 100% rename from src/app/user/[slug]/Cassette.jsx rename to src/shared/Cassette.jsx From aa746542378cce90334666ef7e1c5e78d2e465c3 Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:07:27 -0400 Subject: [PATCH 05/16] Fix unique key prop warning for CDStack --- src/app/unify/[users]/UnifyContent.jsx | 12 ++++-------- src/app/user/[slug]/UserContent.jsx | 6 ++---- src/shared/CDStack.jsx | 16 +++++++++++----- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/app/unify/[users]/UnifyContent.jsx b/src/app/unify/[users]/UnifyContent.jsx index 9a41e00..051e6e1 100644 --- a/src/app/unify/[users]/UnifyContent.jsx +++ b/src/app/unify/[users]/UnifyContent.jsx @@ -330,9 +330,7 @@ function UnifyContent({ user1Data, user2Data }) {
artist.name)} + topList={user1Data.topArtists.slice(0, 8)} userColors={user1personality.colors} />
@@ -349,9 +347,7 @@ function UnifyContent({ user1Data, user2Data }) {
artist.name)} + topList={user2Data.topArtists.slice(0, 8)} userColors={user2personality.colors} />
@@ -390,7 +386,7 @@ function UnifyContent({ user1Data, user2Data }) {
song.name)} + topList={user1Data.topSongs.slice(0, 8)} userColors={user1personality.colors} />
@@ -407,7 +403,7 @@ function UnifyContent({ user1Data, user2Data }) {
song.name)} + topList={user2Data.topSongs.slice(0, 8)} userColors={user2personality.colors} />
diff --git a/src/app/user/[slug]/UserContent.jsx b/src/app/user/[slug]/UserContent.jsx index 0e39f53..70adf4b 100644 --- a/src/app/user/[slug]/UserContent.jsx +++ b/src/app/user/[slug]/UserContent.jsx @@ -188,9 +188,7 @@ function UserContent({ userData, shareCassette }) {
artist.name)} + topList={userData.topArtists.slice(0, 8)} userColors={userColors} />
@@ -227,7 +225,7 @@ function UserContent({ userData, shareCassette }) {
song.name)} + topList={userData.topSongs.slice(0, 8)} userColors={userColors} />
diff --git a/src/shared/CDStack.jsx b/src/shared/CDStack.jsx index 80b22e6..1ba5db2 100644 --- a/src/shared/CDStack.jsx +++ b/src/shared/CDStack.jsx @@ -17,11 +17,12 @@ export default function CDStack({ topList, userColors }) { const yOffset = rank * 80; return ( ); })} @@ -31,8 +32,13 @@ export default function CDStack({ topList, userColors }) { CDStack.propTypes = { userColors: PropTypes.shape({ - dark: PropTypes.string, - light: PropTypes.string, - }), - topList: PropTypes.arrayOf(PropTypes.string).isRequired, + dark: PropTypes.string.isRequired, + light: PropTypes.string.isRequired, + }).isRequired, + topList: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + }), + ).isRequired, }; From 83fc7e1c98d383f1a48c50f207ea1fb5c67c14dd Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:22:27 -0400 Subject: [PATCH 06/16] Fix console error from circle with negative r --- src/shared/GenrePieChart.jsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/shared/GenrePieChart.jsx b/src/shared/GenrePieChart.jsx index 3389e5e..b7ebc8e 100644 --- a/src/shared/GenrePieChart.jsx +++ b/src/shared/GenrePieChart.jsx @@ -14,16 +14,18 @@ and the third a thicker barrier between the color portion and the chart itself. */ export function VinylCircle({ centerCircleColor = "#1d40af", width = 0 }) { - const newWidth = Math.min((width - 280) / 2, 160); + const newWidth = Math.max(0, Math.min((width - 280) / 2, 160)); // make sure newWidth is not negative const radii = []; if (newWidth > 0) { + // add a bunch of radii to a list to then turn into circles that make up vinyl graphic for (let i = newWidth - 1; i > 10; i -= 3) { - radii.push(i); + radii.push(i); // add radii to list of radii } } return ( + {/* Add all of the vinyl circles/grooves */} {radii.map((radius) => ( ))} + {/* Add the center circle */} + {/* Add a band of black around the center circle */} Date: Tue, 16 Apr 2024 18:46:19 -0400 Subject: [PATCH 07/16] More comments part 1 --- src/shared/CDCase.jsx | 14 ++++++++++---- src/shared/CDStack.jsx | 1 + src/shared/Cassette.jsx | 3 +++ src/shared/GenrePieChart.jsx | 15 ++++++++------- src/shared/GetPersonality.jsx | 10 ++++++++++ src/utils/misc/SpotifyCodeGenerator.js | 19 +++++++++++++++---- src/utils/supabase/client.js | 11 ++++++++--- src/utils/supabase/middleware.js | 17 ++++++++++++++++- src/utils/supabase/server.js | 10 +++++++--- 9 files changed, 78 insertions(+), 22 deletions(-) diff --git a/src/shared/CDCase.jsx b/src/shared/CDCase.jsx index 8f68343..0d8060f 100644 --- a/src/shared/CDCase.jsx +++ b/src/shared/CDCase.jsx @@ -1,12 +1,18 @@ +/* +CD case graphic containing name and ranking which is stacked in CDStack.jsx +and displayed on the user page and unify page to show top songs or top artists +*/ + import PropTypes from "prop-types"; export default function CDCase({ - title, - ranking, - userColors, - xOffset, + title, // title is displayed on side of cd case + ranking, // ranking is displayed in text on left of cd case + userColors, // colors of user are used to style cd case + xOffset, // accepts xOffset and yOffest for stacking yOffset, }) { + // make title reasonable size let titleSize = "text-4xl"; if (title.length > 14 && title.length < 17) { titleSize = "text-3xl"; diff --git a/src/shared/CDStack.jsx b/src/shared/CDStack.jsx index 1ba5db2..ffb2655 100644 --- a/src/shared/CDStack.jsx +++ b/src/shared/CDStack.jsx @@ -13,6 +13,7 @@ export default function CDStack({ topList, userColors }) { // of CDs in the stack {topList.map((val, rank) => { + // have random x offset for cd case to give stacking effect const xOffset = Math.floor(Math.random() * 80); const yOffset = rank * 80; return ( diff --git a/src/shared/Cassette.jsx b/src/shared/Cassette.jsx index 0c2c328..b3a4b25 100644 --- a/src/shared/Cassette.jsx +++ b/src/shared/Cassette.jsx @@ -170,6 +170,7 @@ export default function Cassette({ userData, side, userColors }) { /> {/* Text items */} + {/* Foreign object containing text for user personality name */}
+ {/* Foreign object containing text showing what side of the cassette it is */}
+ {/* Foreign object containing text with the user's display name */}
+ {/* Underlying genre pie chart using nivo */} + {/* Overlay vinyl circle to turn pie chart into vinyl */}
diff --git a/src/shared/GetPersonality.jsx b/src/shared/GetPersonality.jsx index 35c6922..6095e75 100644 --- a/src/shared/GetPersonality.jsx +++ b/src/shared/GetPersonality.jsx @@ -2,6 +2,8 @@ Function to calculate the personality of a user based on how close the features of their top songs are to the 10 reference personalities using euclidean distance */ + +// list of colors that can be used for the personalities const colorPresets = { red: { bg: "#FF5555", @@ -48,6 +50,8 @@ const colorPresets = { }; // the reference personalities +// each have a score for the main song feature categories which is used +// to calculate which personality a user matches best const personalities = [ { name: "Indie Introvert 🎧", @@ -183,7 +187,9 @@ const personalities = [ // get the closes personality const getPersonality = (userData) => { + // set min distance to infinity to start so we always get a closest personality let minDistance = Infinity; + // variable to store closest personality so far let closestPersonality = null; // process user data object and normalize @@ -219,13 +225,17 @@ const getPersonality = (userData) => { // find similarity between personality and user's data // uses euclidean distance + // loops through personalities personalities.forEach((personality) => { let distance = 0; + // iterate through the features and sum distance between feature for user and personality Object.keys(personality.scores).forEach((key) => { distance += (personality.scores[key] - userScores[key]) ** 2; }); + // take square root to get euclidean distance distance = Math.sqrt(distance); + // update closestPersonality if the distance for the current personality is the smallest so far if (distance < minDistance) { minDistance = distance; closestPersonality = personality; diff --git a/src/utils/misc/SpotifyCodeGenerator.js b/src/utils/misc/SpotifyCodeGenerator.js index ee02f1f..4cd0f4f 100644 --- a/src/utils/misc/SpotifyCodeGenerator.js +++ b/src/utils/misc/SpotifyCodeGenerator.js @@ -24,15 +24,18 @@ function hashCode(str) { // uses a seed to get a random pastel color function getColorFromSeed(seed) { + // get base color using the seed and 1677215 which is FFFFFF in hex const baseColor = Math.floor(seed * 16777215).toString(16); // Generate a random base color // Convert the base color to RGB const rgb = parseInt(baseColor, 16); + // using bit shifts to get the correct hex const r = (rgb >> 16) & 255; const g = (rgb >> 8) & 255; const b = rgb & 255; // Adjust the brightness and saturation for a pastel effect + // this takes the mean of the color and white, to get a pastel const colorR = Math.floor((r + 255) / 2); const colorG = Math.floor((g + 255) / 2); const colorB = Math.floor((b + 255) / 2); @@ -47,6 +50,7 @@ function getColorFromSeed(seed) { // function to modify the svg returned by spotify to remove background const modifySvg = (svgString) => { + // use dom Parser to parse svg string into doc const parser = new DOMParser(); const doc = parser.parseFromString(svgString, "image/svg+xml"); @@ -63,34 +67,41 @@ const modifySvg = (svgString) => { return modifiedSvgString; }; +// function to get spotify code for a given spotify URI from the spotify website export default async function GetSpotifyCode(SpotifyURL) { const format = "svg"; - const backgroundColor = "FFFFFF"; // Math.floor(Math.random()*16777215).toString(16); + // request background color to be white + const backgroundColor = "FFFFFF"; const textColor = "black"; const imageWidth = "400"; + // process Spotify URL into just the URI part (uri is spotify id/code) const URIRegex = /\/([^/]+)\/([^?]+)/; /// \/([^\/?]+)\?/; const URIString = SpotifyURL.match(URIRegex)[2].split("/")[1]; + // get which type of item it is (track, artist, playlist, user) const type = SpotifyURL.match(URIRegex)[2].split("/")[0]; + // construct the full uri for the object const FullURI = `spotify:${type}:${URIString}`; + // this is the url that will contain the image of the spotify code with the uri as the input (and other parameters) const url = `https://scannables.scdn.co/uri/plain/${format}/${backgroundColor}/${textColor}/${imageWidth}/${FullURI}`; + // fetch the image at the url try { const response = await axios.get(url, { responseType: "arraybuffer" }); + // decode the response into an svg const svgString = new TextDecoder("utf-8").decode( new Uint8Array(response.data), ); return svgString; } catch (error) { - // Error saving Spotify code + // error if something went wrong getting the spotify code + throw error("Could not get spotify code"); } - - return null; } export { hashCode, getColorFromSeed, modifySvg, GetSpotifyCode }; diff --git a/src/utils/supabase/client.js b/src/utils/supabase/client.js index 3f8395a..f899b6a 100644 --- a/src/utils/supabase/client.js +++ b/src/utils/supabase/client.js @@ -1,10 +1,15 @@ -// https://supabase.com/docs/guides/auth/server-side/nextjs +/* +this function sets up a client to interact with the Supabase database from the browser. +it uses environment variables for the Supabase URL and the anonymous access key. +https://supabase.com/docs/guides/auth/server-side/nextjs +*/ import { createBrowserClient } from "@supabase/ssr"; export default function createClient() { + // create a client for browser-based interactions with Supabase return createBrowserClient( - process.env.NEXT_PUBLIC_SUPABASE_URL, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY, + process.env.NEXT_PUBLIC_SUPABASE_URL, // get the Supabase URL from environment variables + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY, // get the Supabase anonymous key from environment variables ); } diff --git a/src/utils/supabase/middleware.js b/src/utils/supabase/middleware.js index a4b2141..8ba9d4a 100644 --- a/src/utils/supabase/middleware.js +++ b/src/utils/supabase/middleware.js @@ -1,23 +1,33 @@ -// https://supabase.com/docs/guides/auth/server-side/nextjs +/* +this function manages the user session in a Next.js application by interacting with Supabase's server-side features +it captures the incoming request, creates a server client for Supabase with custom cookie handling, and returns a response with potentially updated cookies +use this link to refer to how server side authentication in next.js works with supabase: https://supabase.com/docs/guides/auth/server-side/nextjs +*/ import { createServerClient } from "@supabase/ssr"; import { NextResponse } from "next/server"; +// define the updateSession function that will handle the session updates export default async function updateSession(request) { + // create a NextResponse object that contains the request headers let response = NextResponse.next({ request: { headers: request.headers, }, }); + // create a supabase client using environment variables for URL and anon key const supabase = createServerClient( process.env.NEXT_PUBLIC_SUPABASE_URL, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY, { + // define methods to handle cookies cookies: { + // get a cookie's value by its name get(name) { return request.cookies.get(name)?.value; }, + // set a cookie with name, value, and options set(name, value, options) { request.cookies.set({ name, @@ -29,12 +39,14 @@ export default async function updateSession(request) { headers: request.headers, }, }); + // set the cookie in the response object as well response.cookies.set({ name, value, ...options, }); }, + // remove a cookie by name and options by setting its value to empty remove(name, options) { request.cookies.set({ name, @@ -46,6 +58,7 @@ export default async function updateSession(request) { headers: request.headers, }, }); + // set the removed cookie in the response object as well response.cookies.set({ name, value: "", @@ -56,7 +69,9 @@ export default async function updateSession(request) { }, ); + // retrieve user information with supabase auth await supabase.auth.getUser(); + // return the modified response object return response; } diff --git a/src/utils/supabase/server.js b/src/utils/supabase/server.js index 9dc1aa4..66da51d 100644 --- a/src/utils/supabase/server.js +++ b/src/utils/supabase/server.js @@ -1,4 +1,8 @@ -// https://supabase.com/docs/guides/auth/server-side/nextjs +/* +this function sets up a client to interact with the Supabase database from the server +it uses env variables for the Supabase URL and the anon access key, and handles cookies to manage session +https://supabase.com/docs/guides/auth/server-side/nextjs +*/ import { createServerClient } from "@supabase/ssr"; import { cookies } from "next/headers"; @@ -7,8 +11,8 @@ export default function createClient() { const cookieStore = cookies(); return createServerClient( - process.env.NEXT_PUBLIC_SUPABASE_URL, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY, + process.env.NEXT_PUBLIC_SUPABASE_URL, // get the Supabase URL from environment variables + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY, // get the Supabase anonymous key from environment variables { cookies: { get(name) { From d842c17bce13f4e76f914ed39e2c17d0160d6574 Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Tue, 16 Apr 2024 22:00:06 -0400 Subject: [PATCH 08/16] Comments part 2 --- src/app/IPod.jsx | 2 ++ src/app/LoadingIcon.jsx | 2 ++ src/app/auth/callback/route.js | 8 ++++++++ src/app/auth/confirm/route.js | 22 ++++++++++++++-------- src/app/auth/signout/route.js | 2 ++ src/app/error/page.jsx | 2 ++ src/app/layout.jsx | 8 ++++++++ src/app/login/actions.js | 2 ++ src/app/page.jsx | 5 +++++ src/app/unify/[users]/ShareUnify.jsx | 6 ++++++ src/app/unify/[users]/UnifyContent.jsx | 9 +++++++++ src/app/unify/[users]/page.jsx | 2 ++ src/app/user/[slug]/PaperTitle.jsx | 4 ++++ src/app/user/[slug]/PhotoGallery.jsx | 5 +++++ src/app/user/[slug]/ShareCassette.jsx | 1 + src/app/user/[slug]/UserContent.jsx | 1 + src/app/user/[slug]/page.jsx | 18 ++++++++++++------ src/fonts.js | 7 +++++++ src/middleware.js | 7 +++++++ src/spotify.js | 21 ++++++++++++++++----- src/utils/supabase/server.js | 5 ++++- 21 files changed, 119 insertions(+), 20 deletions(-) diff --git a/src/app/IPod.jsx b/src/app/IPod.jsx index 91d3a2d..360cab8 100644 --- a/src/app/IPod.jsx +++ b/src/app/IPod.jsx @@ -35,6 +35,7 @@ export default function Ipod({ children }) { stroke="black" strokeWidth="5" /> + {/* add in children as foreign object */}
{children}
@@ -106,6 +107,7 @@ export default function Ipod({ children }) { fill="#D3D3D3" /> + {/* this next part is just paper texture stuff(?) using feComposite */} ; } diff --git a/src/app/layout.jsx b/src/app/layout.jsx index 7012949..63d684d 100644 --- a/src/app/layout.jsx +++ b/src/app/layout.jsx @@ -1,12 +1,20 @@ +/* +Layout stuff for application setting Koulen as default font +*/ + import PropTypes from "prop-types"; import "./globals.css"; import "bootstrap/dist/css/bootstrap.min.css"; import { koulen } from "@/fonts"; +// this defines metadata with a title and an empty description export const metadata = { title: "Unify", description: "", }; + +// this function wraps its children components with HTML structure. +// it sets the language of the document to english and applies a custom font class to the body. export default function RootLayout({ children }) { return ( diff --git a/src/app/login/actions.js b/src/app/login/actions.js index 74ba23f..8c72a77 100644 --- a/src/app/login/actions.js +++ b/src/app/login/actions.js @@ -35,8 +35,10 @@ export default async function loginWithSpotify() { }); if (error) { + // redirects to error page on error redirect(`/error?message=${error.message}`); } else { + // redirects to url from supabase oauth to continue sign in (goes to spotify) redirect(data.url); } } diff --git a/src/app/page.jsx b/src/app/page.jsx index c99680b..62ce427 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -13,8 +13,11 @@ import LeftPanel from "@/app/LeftPanel"; import LoadingIcon from "@/app/LoadingIcon"; import createClient from "@/utils/supabase/client"; +// index page function export default function IndexPage() { + // use react router for page navigation const router = useRouter(); + // create supabase client const supabase = createClient(); const [loggedIn, setLoggedIn] = useState(false); @@ -97,9 +100,11 @@ export default function IndexPage() { loginWithSpotify(); }} > + {/* Show Continue to Account if logged in, else, show log in with Spotify */} {loggedIn ? "Continue to Account" : "Log in with Spotify"}
+ {/* if logged in show sign out button which calls handleSignOut when clicked */} diff --git a/src/app/user/[slug]/UserContent.jsx b/src/app/user/[slug]/UserContent.jsx index ad005dc..01ed03e 100644 --- a/src/app/user/[slug]/UserContent.jsx +++ b/src/app/user/[slug]/UserContent.jsx @@ -15,7 +15,7 @@ import getPersonality from "@/shared/GetPersonality"; import PhotoMarquee from "@/app/user/[slug]/PhotoMarquee"; import PhotoGallery from "@/app/user/[slug]/PhotoGallery"; -function UserContent({ userData, shareCassette }) { +function UserContent({ userData, shareCassette, mabVersion }) { // Convert object to array of { id: genre, value: frequency } objects const top5Genres = Object.entries(userData.topGenres) .sort((a, b) => b[1] - a[1]) // Sort genres by frequency in descending order @@ -47,7 +47,11 @@ function UserContent({ userData, shareCassette }) { md:w-[80%] md:mt-16 \ xl:w-[60%]" > - +
{/* Spotlight transition, takes on light color + holds cassette */} diff --git a/src/app/user/[slug]/page.jsx b/src/app/user/[slug]/page.jsx index 5d932a0..dcb9762 100644 --- a/src/app/user/[slug]/page.jsx +++ b/src/app/user/[slug]/page.jsx @@ -23,6 +23,8 @@ export default function UserPage({ params: { slug } }) { const [loading, setLoading] = useState(true); const [userData, setUserData] = useState(null); const [errorMessage, setError] = useState(null); + const [mabVersion, setMABVersion] = useState(null); + const [clickedShare, setClickedShare] = useState(false); // preload fonts to fix bug async function loadFonts() { @@ -41,6 +43,26 @@ export default function UserPage({ params: { slug } }) { // Function to handle sharing const shareCassette = async () => { + // if the user has not clicked share already + if (!clickedShare) { + // update multi armed bandit clicks value + supabase + .from("mab") + .select("clicks") + .eq("id", mabVersion) + .then(({ data }) => { + supabase + .from("mab") + .update({ clicks: data[0].clicks + 1 }) // increment clicks + .eq("id", mabVersion) + .then(() => { + setError("mab error"); // set error if mab update returned error + }); + }); + } + // set that user has clicked share to prevent updating clicked value multiple times + setClickedShare(true); + // Use Web Share API to share the default image const svgString = ReactDOMServer.renderToString( , @@ -158,15 +180,67 @@ export default function UserPage({ params: { slug } }) { }); }, [slug]); + // use multi arm bandit approach to pick which version of "share cassette" button to use + // uses epsilon-greedy algorithm pulling data from supabase + useEffect(() => { + let mabValue = null; + // get data on the designs from supabase + supabase + .from("mab") + .select() + .then(({ data, error }) => { + if (error) { + setError("MAB data not found."); + } else if (data) { + const epsilon = 0.1; // 10% of the time, explore + if (Math.random() < epsilon) { + // Exploration: Select a random ID + const randomIndex = Math.floor(Math.random() * data.length); + setMABVersion(data[randomIndex].id); + mabValue = data[randomIndex].visits + 1; + // increase number of visits for selected deisign by 1 + supabase + .from("mab") + .update({ visits: mabValue }) + .eq("id", data[randomIndex].id) + .then(() => { + setError("mab error"); // set error if mab update returned error + }); + } else { + // Exploitation: Select the ID with the highest clicks-to-visits ratio + const bestOption = data.reduce((best, current) => { + const bestCtr = best.clicks / best.visits; + const currentCtr = current.clicks / current.visits; + return currentCtr > bestCtr ? current : best; + }); + setMABVersion(bestOption.id); + mabValue = bestOption.visits + 1; + // increase number of visits for selected deisign by 1 + supabase + .from("mab") + .update({ visits: mabValue }) + .eq("id", bestOption.id) + .then(() => { + setError("mab error"); // set error if mab update returned error + }); + } + } + }) + .catch((err) => { + setError(`Error fetching MAB data. Error: ${err.message}`); + }); + }, []); + return (
{/* show user content if the user data is available */} - {!loading && userData && ( + {!loading && userData && mabVersion && (
)} From b5582cc6a2d470f8a5d00d6a0e116746169d67a4 Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Wed, 17 Apr 2024 21:56:09 -0400 Subject: [PATCH 12/16] Update props to fix eslint warning --- src/app/user/[slug]/Boombox.jsx | 1 + src/app/user/[slug]/UserContent.jsx | 1 + 2 files changed, 2 insertions(+) diff --git a/src/app/user/[slug]/Boombox.jsx b/src/app/user/[slug]/Boombox.jsx index 3eed529..912d3b6 100644 --- a/src/app/user/[slug]/Boombox.jsx +++ b/src/app/user/[slug]/Boombox.jsx @@ -336,4 +336,5 @@ Boombox.propTypes = { }), }).isRequired, shareCassetteFunc: PropTypes.func.isRequired, + mabVersion: PropTypes.number.isRequired, }; diff --git a/src/app/user/[slug]/UserContent.jsx b/src/app/user/[slug]/UserContent.jsx index 01ed03e..489b817 100644 --- a/src/app/user/[slug]/UserContent.jsx +++ b/src/app/user/[slug]/UserContent.jsx @@ -288,4 +288,5 @@ UserContent.propTypes = { ), }).isRequired, shareCassette: PropTypes.func.isRequired, + mabVersion: PropTypes.number.isRequired, }; From 10f0148ad1c8892230a4204bb4827c93a3024c00 Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Wed, 17 Apr 2024 22:04:21 -0400 Subject: [PATCH 13/16] fix tests by adding mocks --- __tests__/share_cassette.t.js | 5 ++++- __tests__/user.t.js | 2 ++ src/app/user/[slug]/page.jsx | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/__tests__/share_cassette.t.js b/__tests__/share_cassette.t.js index d3ed70c..580c4b7 100644 --- a/__tests__/share_cassette.t.js +++ b/__tests__/share_cassette.t.js @@ -9,6 +9,9 @@ jest.mock("../src/utils/supabase/client", () => { return jest.fn(() => ({ from: jest.fn().mockReturnThis(), select: jest.fn().mockReturnThis(), + update: jest.fn().mockReturnThis(), + then: jest.fn().mockReturnThis(), + catch: jest.fn().mockReturnThis(), eq: jest.fn().mockResolvedValue({ data: [ { @@ -87,7 +90,7 @@ describe("shareCassette", () => { // Wait for the button with specific text and style to appear in the document const shareButton = await screen.findByRole("button", { - name: /share cassette/i, + name: /share/i, }); fireEvent.click(shareButton); diff --git a/__tests__/user.t.js b/__tests__/user.t.js index 7758064..23a8589 100644 --- a/__tests__/user.t.js +++ b/__tests__/user.t.js @@ -46,6 +46,8 @@ beforeEach(() => { createClient.mockImplementation(() => ({ from: jest.fn().mockReturnThis(), select: jest.fn().mockReturnThis(), + then: jest.fn().mockReturnThis(), + catch: jest.fn().mockReturnThis(), eq: jest.fn().mockResolvedValue({ data: [{ spotify_data: { username: "user1" } }], error: null, diff --git a/src/app/user/[slug]/page.jsx b/src/app/user/[slug]/page.jsx index dcb9762..17e8d01 100644 --- a/src/app/user/[slug]/page.jsx +++ b/src/app/user/[slug]/page.jsx @@ -23,7 +23,7 @@ export default function UserPage({ params: { slug } }) { const [loading, setLoading] = useState(true); const [userData, setUserData] = useState(null); const [errorMessage, setError] = useState(null); - const [mabVersion, setMABVersion] = useState(null); + const [mabVersion, setMABVersion] = useState(1); const [clickedShare, setClickedShare] = useState(false); // preload fonts to fix bug From 95ac175d3061f0fdc66b39104ac016c63b2e6614 Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Wed, 17 Apr 2024 22:09:59 -0400 Subject: [PATCH 14/16] Update README.md --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index fa4a466..f4e46e7 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,18 @@ The application is currently deployed via Vercel at [http://unify-cs439.vercel.a You can view an example of a User Profile page at [http://unify-cs439.vercel.app/user/testuser](http://unify-cs439.vercel.app/user/testuser). You can view an example of a Unify Results page at [http://unify-cs439.vercel.app/unify/testuser&hoixw](http://unify-cs439.vercel.app/unify/testuser&hoixw). +## Metrics Milestone +We have chosen to use a multi armed bandit approach to find what text for the "share" button on the user page +will result in the highest rate of the user sharing their results. 10% of the time, the user will be displayed a random +choice of the three possible texts, this is the exploration part. The other 90% of the time, the user will be displayed the text that has the highest conversion rate thus far.\ +The three button texts that the user could be shown are:\ +Share Results\ +Share Cassette\ +Share with Friends!\ +We believe that this button is an appropriate element to implement the multi armed bandit procedure, as it is what drives growth of our application. New users will click this button to unify with their friends, and be prompted to create an account, increasing the reach of our application. + + + ## Contributors From c0094feec9b0cfb848cfa1d50f0a92ac432ccc94 Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Wed, 17 Apr 2024 22:13:00 -0400 Subject: [PATCH 15/16] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index f4e46e7..b59d023 100644 --- a/README.md +++ b/README.md @@ -137,8 +137,7 @@ Share Results\ Share Cassette\ Share with Friends!\ We believe that this button is an appropriate element to implement the multi armed bandit procedure, as it is what drives growth of our application. New users will click this button to unify with their friends, and be prompted to create an account, increasing the reach of our application. - - +The code for calculating which option to use can be found in /src/app/user/[slug]/page.jsx. It is a react effect that pulls the data from the supabase database to find the best version of the design, or randomly chooses one. This gets passed to /src/app/user/[slug]/Boombox.jsx, where the text of the button is changed depending on the design selected. ## Contributors From 9f37cddf24e5c1291c1e3ff39609edc616fe3c0d Mon Sep 17 00:00:00 2001 From: davidcrair <115373655+davidcrair@users.noreply.github.com> Date: Wed, 17 Apr 2024 22:16:35 -0400 Subject: [PATCH 16/16] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b59d023..40091ed 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,7 @@ The application is currently deployed via Vercel at [http://unify-cs439.vercel.a You can view an example of a User Profile page at [http://unify-cs439.vercel.app/user/testuser](http://unify-cs439.vercel.app/user/testuser). You can view an example of a Unify Results page at [http://unify-cs439.vercel.app/unify/testuser&hoixw](http://unify-cs439.vercel.app/unify/testuser&hoixw). ## Metrics Milestone + We have chosen to use a multi armed bandit approach to find what text for the "share" button on the user page will result in the highest rate of the user sharing their results. 10% of the time, the user will be displayed a random choice of the three possible texts, this is the exploration part. The other 90% of the time, the user will be displayed the text that has the highest conversion rate thus far.\