From 74ec0105cdfb902594e6365e80ac88ca2f8183e2 Mon Sep 17 00:00:00 2001 From: Liam Arbuckle Date: Thu, 17 Nov 2022 01:33:37 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=A6=94=F0=9F=97=9D=20=E2=86=A3=20Data=20r?= =?UTF-8?q?etrieval=20for=20#16,=20#17=20is=20looking=20good?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 ++ instance/database.db | 0 package.json | 26 ++++++---- server/.flaskenv | 2 + server/app.py | 75 +++++++++++++++++++++++++++ server/requirements.txt | 2 + src/App.js | 4 +- src/components/Account.js | 24 ++++++++- src/components/api/PlanetForm.js | 35 +++++++++++++ src/components/api/Planets.js | 21 ++++++++ src/index.js | 1 + yarn.lock | 87 ++++++++++++++++++++++++++++---- 12 files changed, 260 insertions(+), 22 deletions(-) create mode 100644 instance/database.db create mode 100644 server/.flaskenv create mode 100644 server/app.py create mode 100644 server/requirements.txt create mode 100644 src/components/api/PlanetForm.js create mode 100644 src/components/api/Planets.js diff --git a/.gitignore b/.gitignore index 145469b5..4db2a54c 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,11 @@ build .build /build +venv +.venv +/.venv +/venv + cache /cache ./cache diff --git a/instance/database.db b/instance/database.db new file mode 100644 index 00000000..e69de29b diff --git a/package.json b/package.json index 420707da..2279941e 100644 --- a/package.json +++ b/package.json @@ -3,20 +3,16 @@ "version": "0.1.0", "private": true, "dependencies": { - "@supabase/supabase-js": "^1.35.2", - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "^13.1.1", - "@testing-library/user-event": "^13.5.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", - "react-scripts": "5.0.1", - "web-vitals": "^2.1.4", "@everipedia/wagmi-magic-connector": "^0.7.1", "@magic-ext/oauth": "^4.0.0", "@magiclabs/ui": "^0.24.2", "@openzeppelin/contracts": "^4.7.3", "@stripe/react-stripe-js": "^1.14.1", "@stripe/stripe-js": "^1.42.0", + "@supabase/supabase-js": "^1.35.2", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.1.1", + "@testing-library/user-event": "^13.5.0", "@thirdweb-dev/contracts": "^3.1.11", "@thirdweb-dev/react": "^3", "@thirdweb-dev/sdk": "^3", @@ -32,18 +28,25 @@ "next-router": "^1.3.6", "node-forge": "^1.3.1", "node-sass": "^7.0.3", + "react": "^18.0.0", "react-bootstrap": "^2.5.0", + "react-dom": "^18.0.0", "react-icons": "^4.6.0", "react-router-dom": "5.2.1", + "react-scripts": "5.0.1", + "semantic-ui-css": "^2.5.0", + "semantic-ui-react": "^2.1.3", "stripe": "^10.15.0", "styled-components": "^5.3.6", - "wagmi": "^0.7.8" + "wagmi": "^0.7.8", + "web-vitals": "^2.1.4" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", - "eject": "react-scripts eject" + "eject": "react-scripts eject", + "start-api": "cd server && .venv/bin/flask run" }, "eslintConfig": { "extends": [ @@ -67,5 +70,6 @@ "autoprefixer": "^10.4.4", "postcss": "^8.4.12", "tailwindcss": "^3.0.24" - } + }, + "proxy": "http://localhost:5000" } diff --git a/server/.flaskenv b/server/.flaskenv new file mode 100644 index 00000000..364d68d5 --- /dev/null +++ b/server/.flaskenv @@ -0,0 +1,2 @@ +FLASK_APP=app.py +FLASK_ENV=development \ No newline at end of file diff --git a/server/app.py b/server/app.py new file mode 100644 index 00000000..b9268b4a --- /dev/null +++ b/server/app.py @@ -0,0 +1,75 @@ +from flask import Flask, jsonify, request +import time +import requests +import psycopg2 + +# App & Data configuration =====> +app = Flask(__name__) +DATABASE_URL = "postgresql://postgres:KBqI9fPB3h4mgFcU@db.afwwxlhknelxylrfvexi.supabase.co:5432/postgres" +connection = psycopg2.connect(DATABASE_URL) + +# Table configuration =====> +CREATE_ROOMS_TABLE = ( + "CREATE TABLE IF NOT EXISTS rooms (id SERIAL PRIMARY KEY, name TEXT);" +) + +CREATE_TEMPS_TABLE = """CREATE TABLE IF NOT EXISTS temperatures (room_id INTEGER, temperature REAL, date TIMESTAMP, FOREIGN KEY(room_id) REFERENCES rooms(id) ON DELETE CASCADE);""" + +INSERT_ROOM_RETURN_ID = "INSERT INTO rooms (name) VALUES (%s) RETURNING id;" + +CREATE_PLANETS_TABLE = ( # If the planet table doesn't exist on Supabase + "CREATE TABLE IF NOT EXISTS planets (planetId INTEGER PRIMARY KEY, profileId TEXT, planetName TEXT);" +) # Would be a good idea to double check that this configuration is aligned with https://skinetics.notion.site/Inventory-what-goes-where-1fb9b1e776c048ed9a9b5c1ff1def491 + +INSERT_PLANET_RETURN_ID = "INSERT INTO users (profileId) VALUES (%s) RETURNING id;" + +CREATE_PLANETSDEMO_TABLE = ( # Demo table that is to test out the post request from flask to `add_planet` decorator + "CREATE TABLE IF NOT EXISTS planetsdemo (planetId SERIAL PRIMARY KEY, name TEXT, moons INTEGER);" +) +INSERT_PLANETSDEMO = "INSERT INTO planetsdemo (name, moons) VALUES (%s, %s);" + +@app.route('/time') +def get_time(): + return {'time': time.time()} + +@app.route('/planets') +def planet(): + planets = [{'name': 'Mars', 'moons': 2}, {'name': 'Earth', 'moons': 1}] + return jsonify({'planets' : planets}) + +# Example, working POST request to Supabase +@app.post("/api/room") # Post request to create a new room +def create_room(): + data = request.get_json() # dict of data from post request + name = data["name"] + with connection: # Start connection to db + with connection.cursor() as cursor: # Object to manipulate entries in db + cursor.execute(CREATE_ROOMS_TABLE) + cursor.execute(INSERT_ROOM_RETURN_ID, (name,)) # Insert room & retrieve id + room_id = cursor.fetchone()[0] # access first column ([0]) + return {"id" : room_id, "message": f"Room {name} created."}, 201 + +@app.post('/add_planets') +def add_planets(): + data = request.get_json() + planetId = data['planetId'] # is this the primary key, or is it something else? + #profileId = data['profileId'] # Magic id -> will be retrieved from the user id (if they have a magic account attached, otherwise use their supabase profile id) + planetName = data['name'] # Other potential properties -> address, tokenId, holder (foreign key to user/profile ID), etc + + with connection: + with connection.cursor() as cursor: # object to manipulate entries in database + cursor.execute(CREATE_PLANETS_TABLE) + cursor.execute(INSERT_PLANET_RETURN_ID, (planetId,)) # Insert planet & retrieve ID + planet_id = cursor.fetchone()[0] # access first column ([0]) + return {"id" : planet_id, "message": f"User {planetId} created."}, 201 + +@app.post('/add_planet') +def add_planet(): + data = request.get_json() + name = data['name'] + moons = data['moons'] + + with connection: + with connection.cursor() as cursor: + cursor.execute(CREATE_PLANETSDEMO_TABLE) + cursor.execute(INSERT_PLANETSDEMO, (name, moons)) \ No newline at end of file diff --git a/server/requirements.txt b/server/requirements.txt new file mode 100644 index 00000000..5a4a2b93 --- /dev/null +++ b/server/requirements.txt @@ -0,0 +1,2 @@ +flask +python-dotenv \ No newline at end of file diff --git a/src/App.js b/src/App.js index 0075d6cf..6744b584 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,7 @@ import { useEffect, useState } from 'react'; import './App.css'; + +// Auth component imports import { supabase } from './supabaseClient' import Auth from './components/Auth'; import Account from './components/Account'; @@ -22,4 +24,4 @@ function App() { ); } -export default App; +export default App; \ No newline at end of file diff --git a/src/components/Account.js b/src/components/Account.js index eda14499..07baca32 100644 --- a/src/components/Account.js +++ b/src/components/Account.js @@ -2,7 +2,15 @@ import { useState, useEffect } from "react" import { supabase } from "../supabaseClient" import Avatar from './Avatar'; +// Styling imports =====> +import { Container } from "semantic-ui-react"; + +// API/data imports =====> +import { Planets } from "./api/Planets"; +import { PlanetForm } from "./api/PlanetForm"; + const Account = ( { session } ) => { + // Authentication settings const [loading, setLoading] = useState(true) const [username, setUsername] = useState(null) const [website, setWebsite] = useState(null) @@ -10,8 +18,18 @@ const Account = ( { session } ) => { useEffect(() => { getProfile() - }, [session]) + }, [session]) // Update whenever session (from Supabase) changes + + // Call second flask app + const [planets, setPlanets] = useState([]); + + useEffect(() => { + fetch('/planets').then(response => response.json().then(data => { + setPlanets(data.planets); + })); + }, []); // Also pass in the authentication settings to Flask via POST + // Get profile information from Supabase postgres const getProfile = async () => { try { setLoading(true) @@ -107,6 +125,10 @@ const Account = ( { session } ) => { )} + + + + ) } diff --git a/src/components/api/PlanetForm.js b/src/components/api/PlanetForm.js new file mode 100644 index 00000000..05ca4e38 --- /dev/null +++ b/src/components/api/PlanetForm.js @@ -0,0 +1,35 @@ +import React, {useState} from "react"; +import { Button, Form, Input } from 'semantic-ui-react'; + +export const PlanetForm = () => { + const [name, setName] = useState(''); + const [moons, setMoons] = useState(0); + + return ( +
+ + setName(e.target.value)} /> + + + setMoons(e.target.value)} /> + + + + +
+ ) +} \ No newline at end of file diff --git a/src/components/api/Planets.js b/src/components/api/Planets.js new file mode 100644 index 00000000..35e04ffc --- /dev/null +++ b/src/components/api/Planets.js @@ -0,0 +1,21 @@ +import React from "react"; +import { List, Header, Rating } from "semantic-ui-react"; + +export const Planets = ({ planets }) => { + return ( + + {planets.map(planet => { + return ( + +
{planet.name}
+
+
Moons: {planet.moons}
+ +
+
+
+ ) + })} +
+ ) +} \ No newline at end of file diff --git a/src/index.js b/src/index.js index 1675893a..3b5061fb 100644 --- a/src/index.js +++ b/src/index.js @@ -2,6 +2,7 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; +import 'semantic-ui-css/semantic.min.css'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( diff --git a/yarn.lock b/yarn.lock index e70523fc..96d4c139 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1038,7 +1038,7 @@ core-js-pure "^3.25.1" regenerator-runtime "^0.13.10" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== @@ -1961,6 +1961,21 @@ dependencies: "@floating-ui/core" "^1.0.1" +"@fluentui/react-component-event-listener@~0.63.0": + version "0.63.1" + resolved "https://registry.yarnpkg.com/@fluentui/react-component-event-listener/-/react-component-event-listener-0.63.1.tgz#c2af94893671f1d6bfe2a8a07dcfa2cb01b85f52" + integrity sha512-gSMdOh6tI3IJKZFqxfQwbTpskpME0CvxdxGM2tdglmf6ZPVDi0L4+KKIm+2dN8nzb8Ya1A8ZT+Ddq0KmZtwVQg== + dependencies: + "@babel/runtime" "^7.10.4" + +"@fluentui/react-component-ref@~0.63.0": + version "0.63.1" + resolved "https://registry.yarnpkg.com/@fluentui/react-component-ref/-/react-component-ref-0.63.1.tgz#a7778e2a5c724d12e828afd994c93fa2da44f64e" + integrity sha512-8MkXX4+R3i80msdbD4rFpEB4WWq2UDvGwG386g3ckIWbekdvN9z2kWAd9OXhRGqB7QeOsoAGWocp6gAMCivRlw== + dependencies: + "@babel/runtime" "^7.10.4" + react-is "^16.6.3" + "@formatjs/ecma402-abstract@1.13.0": version "1.13.0" resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.13.0.tgz#df6db3cbee0182bbd2fd6217103781c802aee819" @@ -2925,7 +2940,7 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@popperjs/core@^2.11.5", "@popperjs/core@^2.8.6": +"@popperjs/core@^2.11.5", "@popperjs/core@^2.6.0", "@popperjs/core@^2.8.6": version "2.11.6" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== @@ -4003,6 +4018,14 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== +"@semantic-ui-react/event-stack@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@semantic-ui-react/event-stack/-/event-stack-3.1.3.tgz#2862d2631d67dd846c705db2fc1ede1c468be3a1" + integrity sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ== + dependencies: + exenv "^1.2.2" + prop-types "^15.6.2" + "@seznam/compose-react-refs@^1.0.4": version "1.0.6" resolved "https://registry.yarnpkg.com/@seznam/compose-react-refs/-/compose-react-refs-1.0.6.tgz#6ec4e70bdd6e32f8e70b4100f27267cf306bd8df" @@ -8589,6 +8612,11 @@ execa@5.1.1, execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +exenv@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw== + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -10704,6 +10732,11 @@ jose@^4.10.0, jose@^4.9.3: resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.0.tgz#1c7f5c7806383d3e836434e8f49da531cb046a9d" integrity sha512-wLe+lJHeG8Xt6uEubS4x0LVjS/3kXXu9dGoj9BNnlhYq7Kts0Pbb2pvv5KiI0yaKH/eaiR0LUOBhOVo9ktd05A== +jquery@x.*: + version "3.6.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.1.tgz#fab0408f8b45fc19f956205773b62b292c147a16" + integrity sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw== + js-base64@^2.4.9: version "2.6.4" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" @@ -10932,6 +10965,11 @@ keccak@^3.0.0, keccak@^3.0.1, keccak@^3.0.2: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +keyboard-key@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keyboard-key/-/keyboard-key-1.1.0.tgz#6f2e8e37fa11475bb1f1d65d5174f1b35653f5b7" + integrity sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ== + keyvaluestorage-interface@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" @@ -11070,6 +11108,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -13305,21 +13348,21 @@ react-icons@^4.6.0: resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.6.0.tgz#f83eda179af5d02c047449a20b702c858653d397" integrity sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g== -react-is@^16.13.1, react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0: +react-is@^16.13.1, react-is@^16.3.2, react-is@^16.6.0, react-is@^16.6.3, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +"react-is@^16.8.6 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" @@ -13332,7 +13375,7 @@ react-native-url-polyfill@^1.3.0: dependencies: whatwg-url-without-unicode "8.0.0-3" -react-popper@^2.2.4: +react-popper@^2.2.4, react-popper@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.3.0.tgz#17891c620e1320dce318bad9fede46a5f71c70ba" integrity sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q== @@ -13988,6 +14031,32 @@ selfsigned@^2.1.1: dependencies: node-forge "^1" +semantic-ui-css@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/semantic-ui-css/-/semantic-ui-css-2.5.0.tgz#b3b7b58b5ffbe6d6fb6549beded16e79a9aa64eb" + integrity sha512-jIWn3WXXE2uSaWCcB+gVJVRG3masIKtTMNEP2X8Aw909H2rHpXGneYOxzO3hT8TpyvB5/dEEo9mBFCitGwoj1A== + dependencies: + jquery x.* + +semantic-ui-react@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/semantic-ui-react/-/semantic-ui-react-2.1.3.tgz#1eee4e3f6dd4dbc673a4b9dd9757f8fba2d6591c" + integrity sha512-dd2pqalMk0ycJoHf7hn4mYd0xohg0NMk7ohlpPVOigCfMLrKk2e3NZdRk0yBetvD+qJXPqZ04jA43bDwqOM5OA== + dependencies: + "@babel/runtime" "^7.10.5" + "@fluentui/react-component-event-listener" "~0.63.0" + "@fluentui/react-component-ref" "~0.63.0" + "@popperjs/core" "^2.6.0" + "@semantic-ui-react/event-stack" "^3.1.3" + clsx "^1.1.1" + keyboard-key "^1.1.0" + lodash "^4.17.21" + lodash-es "^4.17.21" + prop-types "^15.7.2" + react-is "^16.8.6 || ^17.0.0 || ^18.0.0" + react-popper "^2.3.0" + shallowequal "^1.1.0" + "semver@2 || 3 || 4 || 5", semver@^5.4.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"