This commit is contained in:
Belle 2024-08-21 23:37:26 +08:00
parent c88f5f763b
commit 04af0efc2b
5 changed files with 936 additions and 57 deletions

View file

@ -51,6 +51,7 @@ const ProjectView = ({
screenshot = '',
video = '',
readMeLink = '',
preview,
...props
}) => {
const [darkColor, setDarkColor] = useState('#000000')
@ -101,7 +102,13 @@ const ProjectView = ({
<div
{...props}
className="gaegu"
sx={{ position: 'relative', backgroundColor: color, color: textColor, minHeight: '100vh' }}
sx={{
position: 'relative',
backgroundColor: color,
color: textColor,
minHeight: '100vh',
width: '100%'
}}
>
<div
sx={{
@ -151,32 +158,36 @@ const ProjectView = ({
{codeHost}
</Button>
</div>
<Text
as="a"
href="/arcade/showcase/my"
sx={{
border: `2px dashed ${textColor}`,
borderRadius: '5px',
position: ['relative', 'relative', 'absolute'],
display: 'flex',
left: '10px',
top: '10px',
justifyContent: 'center',
alignItems: 'center',
px: 2,
py: 1,
transitionDuration: '0.4s',
cursor: 'pointer',
textDecoration: 'none',
mb: 3,
'&:hover': {
background: textColor || '#333',
color: invertedColor || '#F4E7C7'
}
}}
>
<Icon glyph="home" /> View all my ships
</Text>
{preview ? (
<></>
) : (
<Text
as="a"
href="/arcade/showcase/my"
sx={{
border: `2px dashed ${textColor}`,
borderRadius: '5px',
position: ['relative', 'relative', 'absolute'],
display: 'flex',
left: '10px',
top: '10px',
justifyContent: 'center',
alignItems: 'center',
px: 2,
py: 1,
transitionDuration: '0.4s',
cursor: 'pointer',
textDecoration: 'none',
mb: 3,
'&:hover': {
background: textColor || '#333',
color: invertedColor || '#F4E7C7'
}
}}
>
<Icon glyph="home" /> View all my ships
</Text>
)}
</div>
<div
@ -184,7 +195,7 @@ const ProjectView = ({
width: '90%',
margin: 'auto',
my: 3,
maxWidth: '800px',
maxWidth: '800px'
}}
>
<div
@ -198,7 +209,7 @@ const ProjectView = ({
gap: '10px'
}}
>
{ image != '' && (
{image != '' && (
<div
sx={{
display: 'flex',
@ -206,11 +217,7 @@ const ProjectView = ({
justifyContent: 'center'
}}
>
<img
src={image}
alt="Project Image"
className={styles.image}
/>
<img src={image} alt="Project Image" className={styles.image} />
</div>
)}
<YoutubeRenderer youtubeLink={video} />
@ -237,7 +244,6 @@ const ProjectView = ({
<ReadmeRenderer markdown={markdown} />
</p>
</div>
</div>
)
}

View file

@ -0,0 +1,33 @@
import { useRef } from 'react'
import { Text, Close } from 'theme-ui'
import styles from './cohort-card.module.css'
import { useState } from 'react'
import { Button } from 'theme-ui'
import Icon from '@hackclub/icons'
import randomNotFoundImg from './random-not-found-img'
/** @jsxImportSource theme-ui */
const SmallView = ({
id,
title = 'Title Not Found',
desc = 'Description Not Found'
}) => {
return (
<div
sx={{
border: '2px dashed #09AFB4',
borderRadius: '10px',
px: 3,
color: '#35290F',
height: '100%'
}}
id={id}
>
<h1 sx={{ mt: 2, mb: 0, wordBreak: 'break-all' }}>{title}</h1>
<p sx={{ mt: 0 }}>{desc}</p>
</div>
)
}
export default SmallView

View file

@ -62,6 +62,7 @@
"pcb-stackup": "^4.2.8",
"rc-dialog": "^9.5.2",
"react": "^17.0.2",
"react-beautiful-dnd": "^13.1.1",
"react-before-after-slider-component": "^1.1.8",
"react-countdown": "^2.3.6",
"react-datepicker": "^4.24.0",

View file

@ -0,0 +1,770 @@
import { useEffect, useState, useRef } from 'react'
import CohortCard from '../../../components/arcade/showcase/cohort-card'
import { Button, Heading, Text, Box, Close, Flex } from 'theme-ui'
import SlideDown from '../../../components/slide-down'
import styles from '../../../components/arcade/showcase/my.module.css'
import Countdown from 'react-countdown'
import Icon from '@hackclub/icons'
import ProjectView from '../../../components/arcade/showcase/project-view'
import SmallView from '../../../components/arcade/showcase/small-view-card'
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd'
import { over } from 'lodash'
/** @jsxImportSource theme-ui */
const styled = `
@import url('https://fonts.googleapis.com/css2?family=Slackey&family=Emblema+One&family=Gaegu&display=swap');
body, html {
overflow-x: hidden;
}
.slackey {
font-family: "Slackey", sans-serif;
}
.emblema {
font-family: "Emblema One", system-ui;
}
.gaegu {
font-family: "Gaegu", sans-serif;
}
body {
background-color: #FAEFD6;
}
@keyframes float {
from,
to {
transform: translate(0%, -37%) rotate(-2deg);
}
25% {
transform: translate(-2%, -40%) rotate(2deg);
}
50% {
transform: translate(0%, -43%) rotate(-1deg);
}
75% {
transform: translate(-1%, -40%) rotate(-1deg);
}
}
a {
color: inherit;
}
`
const Loading = () => (
<div
sx={{
width: '100%',
maxWidth: '1200px',
margin: 'auto',
textAlign: 'center'
}}
>
Loading...
</div>
)
const ErrorMessage = () => (
<div
sx={{
width: '100%',
maxWidth: '1200px',
margin: 'auto',
textAlign: 'center'
}}
>
There was an error loading your project.
</div>
)
const My = () => {
// let originalProjects = {
// cohort: {
// id: 'rectAjJ2Lv4dDhUGR'
// },
// showcases: [
// {
// id: 'rec4cl4TSvfwwnU6H',
// createdTime: '2024-08-14T13:47:49.000Z',
// fields: {
// Name: 'Blast-off',
// 'Code Link': 'https://github.com/Ranger-NF/BlastOff',
// 'Play Link': 'https://ranger-nf.itch.io/blastoff',
// Description: 'This is a description',
// color: '#14f0cb',
// textColor: '#ffffff',
// ScreenshotLink:
// 'https://cloud-c6ul4axwx-hack-club-bot.vercel.app/0instagram_profile_downloader.jpg',
// ReadMeLink:
// 'https://raw.githubusercontent.com/remarkjs/react-markdown/main/readme.md',
// 'View link':
// 'https://hackclub.com/arcade/showcase/project/rec4cl4TSvfwwnU6H'
// }
// },
// {
// id: 'recLyu8vD4mmUqYrA',
// createdTime: '2024-08-19T17:12:16.000Z',
// fields: {
// Name: 'Turtle T1 (A rabbit R1 spinoff)',
// 'Code Link': 'https://github.com/briyandyju09/Turtle-T1',
// Description: 'A web based spin off to the not so liked rabbit R1',
// color: '#FAEFD6',
// ScreenshotLink:
// 'https://cloud-k7p388c60-hack-club-bot.vercel.app/0image-19.png',
// ReadMeLink:
// 'https://raw.githubusercontent.com/briyandyju09/Turtle-T1/main/README.md',
// 'View link':
// 'https://hackclub.com/arcade/showcase/project/recLyu8vD4mmUqYrA'
// }
// },
// {
// id: 'recYZd9J9MS4fDuJC',
// createdTime: '2024-08-16T22:28:10.000Z',
// fields: {
// Name: 'peace-and-tranquility',
// 'Code Link': 'https://github.com/maxwofford/peace-and-tranquility',
// 'Play Link': 'https://dinosaurbbq.org/',
// Description: 'No one is around to help',
// color: '#293438',
// textColor: '#ffffff',
// ScreenshotLink:
// 'https://cloud-c6ul4axwx-hack-club-bot.vercel.app/0instagram_profile_downloader.jpg',
// ReadMeLink:
// 'https://raw.githubusercontent.com/remarkjs/react-markdown/main/readme.md',
// 'View link':
// 'https://hackclub.com/arcade/showcase/project/recYZd9J9MS4fDuJC'
// }
// },
// {
// id: 'reclIN8evh60EH90v',
// createdTime: '2024-08-17T05:57:05.000Z',
// fields: {
// Name: 'site2eeeEEE534',
// 'Code Link': 'https://github.com/hackclub/site',
// 'Play Link': 'https://hackclub.com',
// Description:
// '🌈 The new, new Hack Club website (uses Next.js & Theme UI).',
// color: '#68d0f8',
// textColor: '#fafafa',
// ScreenshotLink:
// 'https://cloud-c6ul4axwx-hack-club-bot.vercel.app/0instagram_profile_downloader.jpg',
// ReadMeLink:
// 'https://raw.githubusercontent.com/remarkjs/react-markdown/main/readme.md',
// 'View link':
// 'https://hackclub.com/arcade/showcase/project/reclIN8evh60EH90v'
// }
// },
// {
// id: 'reclIN8evh60EH2220v',
// createdTime: '2024-08-17T05:57:05.000Z',
// fields: {
// Name: 'site2eeeEEE53344',
// 'Code Link': 'https://github.com/hackclub/site',
// 'Play Link': 'https://hackclub.com',
// Description:
// '🌈 The new, new Hack Club website (uses Next.js & Theme UI).',
// color: '#68d0f8',
// textColor: '#fafafa',
// ScreenshotLink:
// 'https://cloud-c6ul4axwx-hack-club-bot.vercel.app/0instagram_profile_downloader.jpg',
// ReadMeLink:
// 'https://raw.githubusercontent.com/remarkjs/react-markdown/main/readme.md',
// 'View link':
// 'https://hackclub.com/arcade/showcase/project/reclIN8evh60EH90v'
// }
// }
// ]
// }
// originalProjects = originalProjects.showcases
const [projects, setProjects] = useState([])
const [originalProjects, setOriginalProjects] = useState([])
const [name, setName] = useState('')
const [loadStatus, setLoadStatus] = useState('loading')
const [status, setStatus] = useState('loading')
const [errorMsg, setError] = useState(null)
const [votes, setVotes] = useState({})
const [openProjectId, setOpenProjectId] = useState('')
const [openProject, setOpenProject] = useState([])
const [showUIElements, setShowUIElements] = useState(false)
const [activeDroppableId, setActiveDroppableId] = useState(null)
const [activeDroppable, setActiveDroppable] = useState(true)
const [submitStatus, setSubmitStatus] = useState('loading')
const [creative, setCreative] = useState([])
const [technical, setTechnical] = useState([])
const [overall, setOverall] = useState([])
const [showCreative, setShowCreative] = useState(true)
const [showTechnical, setShowTechnical] = useState(false)
const [showOverall, setShowOverall] = useState(false)
const [endPage, setEndPage] = useState(false)
const [isButtonActive, setIsButtonActive] = useState(false)
const loadProjects = async () => {
const token = window.localStorage.getItem('arcade.authToken')
const response = await fetch('/api/arcade/showcase/cohort/active', {
method: 'GET',
headers: {
Authorization: `Bearer ${token}`
}
}).catch(e => {
console.error(e)
setLoadStatus('error')
setError(e)
})
const data = await response.json()
if (data.error) {
setLoadStatus('error')
return
} else {
setProjects(data.showcases)
setOriginalProjects(data.showcases)
setLoadStatus('success')
}
}
useEffect(async () => {
loadProjects()
}, [])
const getProjectDetails = async () => {
const token = window.localStorage.getItem('arcade.authToken')
setStatus('loading')
try {
const response = await fetch(
`/api/arcade/showcase/projects/${openProjectId}`,
{
method: 'GET',
headers: {
Authorization: `Bearer ${token}`
}
}
)
const data = await response.json()
if (data.error) {
setStatus('error')
setError(data.error)
} else {
setOpenProject(data.project)
setStatus('success')
}
} catch (e) {
console.error(e)
setStatus('error')
setError(e.message)
}
}
useEffect(() => {
getProjectDetails()
}, [openProjectId])
useEffect(() => {
setShowUIElements(true)
}, [])
useEffect(() => {
console.log(Object.keys(votes).length)
if (Object.keys(votes).length == 5) {
setIsButtonActive(true)
} else {
setIsButtonActive(false)
}
}, [votes])
const extractVotes = votes => {
const sortedKeys = Object.keys(votes).sort((a, b) => {
const numA = parseInt(a.split('-')[1], 10)
const numB = parseInt(b.split('-')[1], 10)
return numA - numB
})
return sortedKeys.map(key => votes[key])
}
const onDragUpdate = update => {
setActiveDroppable(true)
const { destination } = update
if (destination) {
setActiveDroppableId(destination.droppableId)
}
}
const onDragEnd = result => {
const { source, destination } = result
if (!destination) return
if (
source.droppableId === 'projects' &&
destination.droppableId.startsWith('votes-')
) {
const linkId = result.draggableId
const voteId = destination.droppableId
setVotes(prevVotes => {
const updatedVotes = {
...prevVotes,
[voteId]: linkId
}
const votedProjectIds = Object.values(updatedVotes)
const updatedProjects = originalProjects.filter(
project => !votedProjectIds.includes(project.id)
)
setProjects(updatedProjects)
return updatedVotes
})
}
setActiveDroppable(false)
}
const deleteVote = voteId => {
setVotes(prevVotes => {
const updatedVotes = { ...prevVotes }
delete updatedVotes[voteId]
const votedProjectIds = Object.values(updatedVotes)
const updatedProjects = originalProjects.filter(
project => !votedProjectIds.includes(project.id)
)
setProjects(updatedProjects)
return updatedVotes
})
}
const renderVoteBox = voteId => {
const linkId = votes[voteId]
const project = originalProjects.find(link => link.id === linkId)
if (project) {
return (
<div
sx={{
backgroundColor: '#F6E7C5',
borderRadius: '10px',
position: 'relative',
height: '100%',
display: 'flex',
alignItems: 'center'
}}
>
<Close
sx={{
'&:hover': { cursor: 'pointer' },
position: 'absolute',
top: '0px',
right: '0px',
zIndex: 2,
color: '#09AFB4'
}}
onClick={e => {
deleteVote(voteId)
}}
/>
<Flex
sx={{
background: '#09AFB4',
px: 2,
py: 1,
color: '#FAEFD6',
height: '100%',
alignItems: 'center',
justifyContent: 'center',
width: '50px',
flex: '0 0 50px'
}}
>
<Text variant="subtitle" sx={{ mt: 0 }}>
{voteId.replace('votes-', '')}
</Text>
</Flex>
<Box sx={{ pl: 3 }}>
<Text variant="subtitle" as="h3" sx={{ mt: 0, fontWeight: 'bold' }}>
{project.fields.Name}
</Text>
<Text variant="caption" as="p" sx={{ color: '#35290F' }}>
{project.fields.Description}
</Text>
</Box>
</div>
)
}
return (
<div
sx={{
display: 'flex',
alignItems: 'center',
// justifyContent: 'center',
height: '100%',
position: 'relative',
backgroundColor: '#FAEFD6',
borderRadius: '10px'
}}
>
<Flex
sx={{
background: '#09AFB4',
px: 2,
py: 1,
color: '#FAEFD6',
height: '100%',
alignItems: 'center',
justifyContent: 'center',
width: '50px',
flex: '0 0 50px'
}}
>
<Text variant="subtitle" sx={{ mt: 0 }}>
{voteId.replace('votes-', '')}
</Text>
</Flex>
<Text sx={{ display: 'block', textAlign: 'center', width: '100%' }}>
Drop here
</Text>
</div>
)
}
const voteCreative = () => {
let ids = extractVotes(votes)
setCreative(ids)
setShowCreative(false)
setVotes({})
setProjects(originalProjects)
setShowTechnical(true)
}
const voteTechnical = () => {
let ids = extractVotes(votes)
setTechnical(ids)
setShowTechnical(false)
setVotes({})
setProjects(originalProjects)
setShowOverall(true)
}
const voteOverall = () => {
let ids = extractVotes(votes)
setOverall(ids)
setShowTechnical(false)
setVotes({})
setProjects(originalProjects)
setEndPage(true)
}
const submitVote = async (creative, technical, overall) => {
const authToken = window.localStorage.getItem('arcade.authToken')
try {
const response = await fetch('/api/arcade/showcase/vote', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: authToken
},
body: JSON.stringify({
creative,
technical,
overall
})
})
const data = await response.json()
setSubmitStatus('success')
return data
} catch (error) {
console.error('Error submitting vote:', error)
setSubmitStatus('error')
throw error
}
}
useEffect(() => {
console.log('the votes')
console.log(creative)
console.log(technical)
console.log(overall)
submitVote(creative, technical, overall)
}, [endPage])
return endPage == true ? (
<div
sx={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
height: '100vh',
width: '100vw',
backgroundColor: '#FAEFD6'
}}
>
{submitStatus == 'loading'
? 'Loading'
: submitStatus == 'success'
? 'Thanks for voting!'
: 'Ran into an error sending your votes'}
</div>
) : (
showUIElements && (
<div>
<div
sx={{
zIndex: 5,
position: 'relative',
color: '#35290F',
height: '100vh'
}}
className="gaegu"
>
<DragDropContext onDragEnd={onDragEnd} onDragUpdate={onDragUpdate}>
<div
sx={{
display: 'grid',
gridTemplateColumns: ['1fr', '1fr', '1fr 1fr'],
height: '100%',
minHeight: '100vh'
}}
>
<div
sx={{
backgroundColor: '#F6E7C5',
pr: 3,
py: 5,
pl: 4,
overflowY: 'scroll',
height: '100vh'
}}
>
<Text variant="title" className="slackey" as="h1">
Ships
</Text>
<Text variant="subtitle" as="h4" sx={{ mb: 3 }}>
Here are the 18 projects for this round of voting :) Please
carefully look at each of them.
</Text>
<Droppable droppableId="projects">
{provided => (
<div
{...provided.droppableProps}
ref={provided.innerRef}
sx={{
width: '100%',
display: 'grid',
gridTemplateColumns: ['1fr', '1fr', '1fr 1fr'],
gap: '10px'
}}
>
{projects.map((project, index) => (
<Draggable
key={project.id}
draggableId={project.id}
index={index}
>
{provided => (
<div
ref={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
onClick={e => {
document
.getElementById('show-project')
.showModal()
setOpenProjectId(project.id)
}}
sx={{
cursor: 'drag'
}}
>
<SmallView
id={project.id}
title={project.fields.Name}
desc={project.fields.Description}
/>
</div>
)}
</Draggable>
))}
{provided.placeholder}
</div>
)}
</Droppable>
</div>
<div sx={{ pl: 3, py: 5, pr: 4 }}>
<div>
<Text as="p" variant="subtitle">
Choose top 5 for{' '}
</Text>
<Text
as="p"
className="slackey"
variant="subtitle"
sx={{ pb: 3 }}
>
{showCreative
? 'Most creative ships'
: showTechnical
? 'Most technical ships'
: 'Best overall ships'}
</Text>
{['votes-1', 'votes-2', 'votes-3', 'votes-4', 'votes-5'].map(
voteId => (
<Droppable key={voteId} droppableId={voteId}>
{provided => (
<div
ref={provided.innerRef}
{...provided.droppableProps}
sx={{
width: '100%',
height: ['14vh', '14vh', '12vh'],
minHeight: '80px',
border: '2px dashed #09AFB4',
borderRadius: '10px',
mb: 3,
backgroundColor:
activeDroppableId === voteId
? '#F6E7C5'
: '#FAEFD6',
transition: 'transform 0.2s ease',
transform:
activeDroppableId === voteId
? activeDroppable == true
? 'scale(1.05)'
: 'scale(1)'
: 'scale(1)'
}}
>
{renderVoteBox(voteId)}
{provided.placeholder}
</div>
)}
</Droppable>
)
)}
{isButtonActive ? (
<Button
onClick={e => {
showCreative
? voteCreative()
: showTechnical
? voteTechnical()
: showOverall
? voteOverall()
: null
}}
sx={{
backgroundColor: '#09AFB4',
color: '#FAEFD6',
borderRadius: '5px',
border: 'none',
px: '20px',
transitionDuration: '0.3s',
'&:hover': {
transform: 'scale(1.05)'
},
width: 'fit-content'
}}
>
Place votes
</Button>
) : (
<Button
sx={{
backgroundColor: '#09AFB4',
color: '#FAEFD6',
borderRadius: '5px',
border: 'none',
px: '20px',
width: 'fit-content',
opacity: 0.4,
transition: 'none',
'&:hover': {
transform: 'none'
},
cursor: 'not-allowed'
}}
>
Place votes
</Button>
)}
</div>
</div>
</div>
</DragDropContext>
<dialog
id="show-project"
sx={{
borderRadius: '10px',
border: '3px dashed #09AFB4',
width: '70vw'
}}
className="gaegu"
>
{status == 'loading' && <Loading />}
{status == 'error' && <ErrorMessage />}
{status == 'success' && (
<ProjectView
preview="preview"
key={openProject.id}
id={openProject.id}
title={openProject.title}
desc={openProject.desc}
slack={openProject.slackLink}
codeLink={openProject.codeLink}
playLink={openProject.playLink}
images={openProject.images}
githubProf={openProject.githubProf}
user={openProject.user}
color={openProject.color}
textColor={openProject.textColor}
screenshot={openProject.screenshot}
video={openProject.video}
readMeLink={openProject.readMeLink}
/>
)}
<Close
sx={{
'&:hover': { cursor: 'pointer' },
position: 'absolute',
top: '10px',
right: '10px',
zIndex: 2,
color: '#09AFB4'
}}
onClick={e => {
document.getElementById('show-project').close()
}}
/>
</dialog>
</div>
<style>{styled}</style>
</div>
)
)
}
export default My

113
yarn.lock
View file

@ -992,7 +992,7 @@
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.10.1", "@babel/runtime@^7.11.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
"@babel/runtime@^7.10.1", "@babel/runtime@^7.11.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
version "7.25.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb"
integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==
@ -2130,6 +2130,14 @@
dependencies:
"@types/unist" "*"
"@types/hoist-non-react-statics@^3.3.0":
version "3.3.5"
resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494"
integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==
dependencies:
"@types/react" "*"
hoist-non-react-statics "^3.3.0"
"@types/json5@^0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
@ -2208,11 +2216,29 @@
resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb"
integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==
"@types/prop-types@^15.0.0":
"@types/prop-types@*", "@types/prop-types@^15.0.0":
version "15.7.12"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
"@types/react-redux@^7.1.20":
version "7.1.33"
resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.33.tgz#53c5564f03f1ded90904e3c90f77e4bd4dc20b15"
integrity sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==
dependencies:
"@types/hoist-non-react-statics" "^3.3.0"
"@types/react" "*"
hoist-non-react-statics "^3.3.0"
redux "^4.0.0"
"@types/react@*":
version "18.3.4"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.4.tgz#dfdd534a1d081307144c00e325c06e00312c93a3"
integrity sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==
dependencies:
"@types/prop-types" "*"
csstype "^3.0.2"
"@types/styled-system@^5.1.13":
version "5.1.22"
resolved "https://registry.yarnpkg.com/@types/styled-system/-/styled-system-5.1.22.tgz#508499f4c68bb86dde3454693e92f5771edf177f"
@ -3303,6 +3329,13 @@ crypto-browserify@3.12.0, crypto-browserify@^3.11.0:
randombytes "^2.0.0"
randomfill "^1.0.3"
css-box-model@^1.2.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1"
integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==
dependencies:
tiny-invariant "^1.0.6"
css-color-keywords@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
@ -4961,7 +4994,7 @@ hmac-drbg@^1.0.1:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2:
hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@ -6040,6 +6073,11 @@ mdurl@^1.0.0:
resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==
memoize-one@^5.1.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e"
integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==
merge-stream@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
@ -7363,6 +7401,11 @@ quick-lru@^1.0.0:
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
integrity sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==
raf-schd@^4.0.2:
version "4.0.3"
resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a"
integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@ -7416,6 +7459,19 @@ rc-util@^5.21.0, rc-util@^5.24.4, rc-util@^5.43.0:
"@babel/runtime" "^7.18.3"
react-is "^18.2.0"
react-beautiful-dnd@^13.1.1:
version "13.1.1"
resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2"
integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==
dependencies:
"@babel/runtime" "^7.9.2"
css-box-model "^1.2.0"
memoize-one "^5.1.1"
raf-schd "^4.0.2"
react-redux "^7.2.0"
redux "^4.0.4"
use-memo-one "^1.1.1"
react-before-after-slider-component@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/react-before-after-slider-component/-/react-before-after-slider-component-1.1.8.tgz#3df14381703aaa43428cdac05f271b8b492d25ca"
@ -7466,6 +7522,11 @@ react-is@16.13.1, react-is@^16.10.2, react-is@^16.13.1, react-is@^16.7.0, react-
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
react-is@^17.0.2:
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, react-is@^18.2.0:
version "18.3.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
@ -7534,6 +7595,18 @@ react-popper@^2.3.0:
react-fast-compare "^3.0.1"
warning "^4.0.2"
react-redux@^7.2.0:
version "7.2.9"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d"
integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==
dependencies:
"@babel/runtime" "^7.15.4"
"@types/react-redux" "^7.1.20"
hoist-non-react-statics "^3.3.2"
loose-envify "^1.4.0"
prop-types "^15.7.2"
react-is "^17.0.2"
react-refresh@0.8.3:
version "0.8.3"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f"
@ -7706,6 +7779,13 @@ recharts@2.12.2:
tiny-invariant "^1.3.1"
victory-vendor "^36.6.8"
redux@^4.0.0, redux@^4.0.4:
version "4.2.1"
resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197"
integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==
dependencies:
"@babel/runtime" "^7.9.2"
reflect.getprototypeof@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859"
@ -8394,16 +8474,7 @@ string-hash@1.1.3:
resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b"
integrity sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==
"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string-width@^4.1.0:
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@ -8514,7 +8585,7 @@ stringify-entities@^4.0.0:
character-entities-html4 "^2.0.0"
character-entities-legacy "^3.0.0"
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@ -8528,13 +8599,6 @@ strip-ansi@6.0.0:
dependencies:
ansi-regex "^5.0.0"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-ansi@^7.0.1:
version "7.1.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
@ -8714,7 +8778,7 @@ timers-browserify@2.0.12, timers-browserify@^2.0.4:
dependencies:
setimmediate "^1.0.4"
tiny-invariant@^1.3.1:
tiny-invariant@^1.0.6, tiny-invariant@^1.3.1:
version "1.3.3"
resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
@ -9214,6 +9278,11 @@ url@^0.11.0:
punycode "^1.4.1"
qs "^6.12.3"
use-memo-one@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99"
integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==
use-subscription@1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1"