diff --git a/frontend/package.json b/frontend/package.json
index b953c72a01..f74b7df505 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -14,7 +14,6 @@
"@justinribeiro/lite-youtube": "^1.3.1",
"express": "^4.17.3",
"file-loader": "^6.0.0",
- "file-selector": "^0.2.4",
"highlight.js": "^11.6.0",
"joi": "^17.2.1",
"lodash": "^4.17.21",
@@ -27,10 +26,7 @@
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-double-scrollbar": "^0.0.15",
- "react-dropzone": "^11.5.1",
- "react-hot-toast": "^1.0.1",
"react-intersection-observer": "^9.4.1",
- "react-social-login-buttons": "3.1.2",
"semantic-ui-css": "^2.4.1",
"semantic-ui-react": "^2.0.3",
"swr": "^1.3.0",
diff --git a/frontend/src/components/NewProject/ConflictModal.tsx b/frontend/src/components/NewProject/ConflictModal.tsx
deleted file mode 100644
index 67b40a38bf..0000000000
--- a/frontend/src/components/NewProject/ConflictModal.tsx
+++ /dev/null
@@ -1,166 +0,0 @@
-import React, { useContext, useEffect } from 'react'
-import { Button, Form, Input, Modal } from 'semantic-ui-react'
-
-import useForm from '@hooks/useForm'
-import ExistingProjectFromModel from '@models/ExistingProjectForm'
-import { isUsableProjectName } from '@utils/giteaApi'
-import { formatAsGiteaRepoName } from '@utils/index'
-import { AuthContext } from '@contexts/AuthContext'
-
-const ConflictModal = ({
- conflictModalOpen,
- onClose,
- originalProjectName,
- message,
- onDifferentName,
- onDifferentNameButtonContent,
- onOverwrite,
- onOverwriteButtonContent,
-}: BaseConflictModalProps) => {
- const { user } = useContext(AuthContext)
- const { form, onChange, isValid, populate, formatErrorPrompt } = useForm(
- ExistingProjectFromModel,
- )
-
- const [isValidProjectName, setIsValidProjectName] = React.useState(false)
-
- const didChangeName = originalProjectName !== form.name
- const projectName = formatAsGiteaRepoName(form.name || '')
-
- useEffect(() => {
- populate({ name: originalProjectName })
- }, [originalProjectName, populate])
-
- useEffect(() => {
- if (form.name && didChangeName) {
- isUsableProjectName(user.username, form.name, isValid).then(
- setIsValidProjectName,
- )
- }
- }, [user, form.name, isValid, didChangeName])
-
- return (
-
- A project with that name already exists.
-
- {message}
-
-
-
-
- {didChangeName ? (
-
-
- )
-}
-
-export const SyncConflictModal = ({
- conflictModalOpen,
- onClose,
- originalProjectName,
- onDifferentName,
- onOverwrite,
-}: SyncConflictModalProps) => (
-
-)
-
-export const UploadConflictModal = ({
- conflictModalOpen,
- onClose,
- onDifferentName,
- onOverwrite,
- originalProjectName,
-}: SyncConflictModalProps) => (
-
-)
-
-/**
- * Disjoint form validation errors, e.g, maximum length, not empty, etc, with conflicting project name errors
- * @returns
- */
-const formatProjectNameError = (
- isValidProjectName: boolean,
- didChangeName: boolean,
- projectName: string,
- formErrors?: { content: any; pointing: string },
-) => {
- if (formErrors) {
- return formErrors
- }
- return !isValidProjectName && didChangeName
- ? {
- content: `A project named "${projectName}" already exists!`,
- pointing: 'below',
- }
- : null
-}
-
-interface SyncConflictModalProps {
- conflictModalOpen: boolean
- onClose: () => void
- onDifferentName: (name: string) => void
- onOverwrite: () => void
- originalProjectName: string
-}
-
-interface BaseConflictModalProps extends SyncConflictModalProps {
- message: string
- onDifferentNameButtonContent: string
- onOverwriteButtonContent: string
-}
diff --git a/frontend/src/components/NewProject/Ops.js b/frontend/src/components/NewProject/Ops.js
deleted file mode 100644
index 67779cbffe..0000000000
--- a/frontend/src/components/NewProject/Ops.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export const NoOp = Symbol('NoOp') // The user is doing nothing.
-export const UploadOp = Symbol('UploadOp') // The user is uploading files.
-export const SyncOp = Symbol('SyncOp') // The user is syncing a project.
diff --git a/frontend/src/components/NewProject/Sync/index.jsx b/frontend/src/components/NewProject/Sync/index.jsx
deleted file mode 100644
index 7de8fe2d5b..0000000000
--- a/frontend/src/components/NewProject/Sync/index.jsx
+++ /dev/null
@@ -1,225 +0,0 @@
-import React, { useContext, useState } from 'react'
-import { func } from 'prop-types'
-import { Input, Button, Form, Message } from 'semantic-ui-react'
-
-import { useRouter } from 'next/router'
-import isEmpty from 'lodash/isEmpty'
-
-import { AuthContext } from '@contexts/AuthContext'
-import { deleteRepo, mirrorRepo, repoExists } from '@utils/giteaApi'
-import { urlToName, waitFor } from '@utils/index'
-import SyncRepoFromModel from '@models/SyncRepoForm'
-import useForm from '@hooks/useForm'
-import { SyncOp, NoOp } from '../Ops'
-import { SyncConflictModal } from '../ConflictModal'
-import styles from './index.module.scss'
-
-const remoteRepoPlaceHolder = 'https://github.com/emard/ulx3s'
-
-const Sync = ({ setUserOp }) => {
- const { push } = useRouter()
- const { user, apiToken } = useContext(AuthContext)
- const { form, errors, onChange, clear } = useForm(SyncRepoFromModel)
-
- const [loading, setLoading] = useState(false)
- const [message, setMessage] = useState({})
- const [conflictModalOpen, setConflictModalOpen] = useState(false)
- const repoName = urlToName(form.url)
-
- const uid = user?.id
- const username = user?.username
-
- const onSuccessfulSync = async repoName => {
- setMessage({
- content: 'Migrated successfully, redirecting the project page...',
- color: 'green',
- })
-
- const exists = waitFor(() => repoExists(`${username}/${repoName}`), {
- timeoutMS: 60_000,
- })
-
- if (!exists) {
- setMessage({
- content: `Sorry, something went wrong with importing this repository.`,
- color: 'red',
- })
- return
- }
- await push(`/${username}/${repoName}`)
- }
-
- const onFailedSync = async (delayedSyncOp, alreadySynced = false) => {
- // If migration failed don't remove the uploading side.
- clearTimeout(delayedSyncOp)
- setUserOp(NoOp)
-
- setLoading(false)
- if (alreadySynced) {
- setConflictModalOpen(true)
- } else {
- setMessage({
- content: `Something went wrong. Are you sure "${form.url}" is a valid git repository?`,
- color: 'red',
- })
- }
- }
-
- const handleClick = async () => {
- if (isEmpty(errors)) {
- // Syncing can be instantaneous, avoid flickering by delaying setting the user operation.
- const delayedSyncOp = setTimeout(() => setUserOp(SyncOp), 500)
-
- setLoading(true)
- setMessage({
- content: 'Processing the repository, this may take a while...',
- color: 'green',
- })
-
- const repoURL = form.url
- const repoName = urlToName(repoURL)
-
- const res = await mirrorRepo(repoURL, uid, apiToken)
- const migrateSuccessfully = res.ok
- const alreadySynced = res.status === 409
-
- if (migrateSuccessfully) {
- onSuccessfulSync(repoName)
- } else {
- onFailedSync(delayedSyncOp, alreadySynced)
- }
- } else {
- setMessage({
- content: `Please, enter a valid URL to a remote git repo e.g., ${remoteRepoPlaceHolder}`,
- color: 'yellow',
- })
- }
- }
-
- const onDifferentName = async repoName => {
- // Syncing can be instantaneous, avoid flickering by delaying setting the user operation.
- const delayedSyncOp = setTimeout(() => setUserOp(SyncOp), 500)
-
- setLoading(true)
- setConflictModalOpen(false)
- setMessage({
- content: 'Processing the repository, this may take a while...',
- color: 'green',
- })
-
- const repoURL = form.url
-
- const res = await mirrorRepo(repoURL, uid, apiToken, repoName)
- const migrateSuccessfully = res.ok
-
- if (migrateSuccessfully) {
- onSuccessfulSync(repoName)
- } else {
- onFailedSync(delayedSyncOp)
- }
- }
-
- const onOverwrite = async () => {
- // Syncing can be instantaneous, avoid flickering by delaying setting the user operation.
- const delayedSyncOp = setTimeout(() => setUserOp(SyncOp), 500)
-
- setLoading(true)
- setConflictModalOpen(false)
- setMessage({
- content: 'Processing the repository, this may take a while...',
- color: 'green',
- })
-
- const repoURL = form.url
- const repoName = urlToName(repoURL)
-
- const deletedRepoSuccessfully = await deleteRepo(
- `${user.username}/${repoName}`,
- apiToken,
- )
-
- if (deletedRepoSuccessfully) {
- const res = await mirrorRepo(repoURL, uid, apiToken)
- const migrateSuccessfully = res.ok
-
- if (migrateSuccessfully) {
- onSuccessfulSync(repoName)
- } else {
- onFailedSync(delayedSyncOp)
- }
- } else {
- // If migration failed don't remove the uploading side.
- clearTimeout(delayedSyncOp)
- setUserOp(NoOp)
-
- setLoading(false)
- setMessage({
- content: `Couldn't overwrite "${repoName}"`,
- color: 'red',
- })
- }
- }
-
- return (
- <>
-
-
Import an existing Git repository
-
-
-
-
-
- {!isEmpty(message) ? (
-
- {message.content}
-
- ) : null}
-
- {
- setUserOp(NoOp)
- // Close the modal
- setConflictModalOpen(false)
- // Clear input and error message.
- clear()
- setMessage({})
- }}
- onDifferentName={onDifferentName}
- onOverwrite={onOverwrite}
- />
- >
- )
-}
-
-Sync.propTypes = {
- setUserOp: func.isRequired,
-}
-
-export default Sync
diff --git a/frontend/src/components/NewProject/Sync/index.module.scss b/frontend/src/components/NewProject/Sync/index.module.scss
deleted file mode 100644
index 7cd9fd0367..0000000000
--- a/frontend/src/components/NewProject/Sync/index.module.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-.urlInput {
- min-width: 300px;
- max-height: 37px;
- flex-grow: 1;
- margin-bottom: 20px;
- margin: auto !important;
- padding: 0 !important;
-}
-
-.syncButton {
- margin: auto !important;
- padding: 0 !important;
-}
-
-.syncFormFields {
- display: flex;
- gap: 1em;
-}
diff --git a/frontend/src/models/ExistingProjectForm.js b/frontend/src/models/ExistingProjectForm.js
deleted file mode 100644
index e00073bc35..0000000000
--- a/frontend/src/models/ExistingProjectForm.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import Joi from 'joi'
-
-const ExistingProjectFromModel = Joi.object({
- _csrf: Joi.string(),
- name: Joi.string().required().max(60),
-})
-
-export default ExistingProjectFromModel
diff --git a/frontend/src/models/SyncRepoForm.js b/frontend/src/models/SyncRepoForm.js
deleted file mode 100644
index 5b2d634c64..0000000000
--- a/frontend/src/models/SyncRepoForm.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import Joi from 'joi'
-
-const SyncRepoFromModel = Joi.object({
- _csrf: Joi.string(),
- url: Joi.string().uri(),
-})
-
-export default SyncRepoFromModel
diff --git a/frontend/src/pages/projects/new/index.jsx b/frontend/src/pages/projects/new/index.jsx
deleted file mode 100644
index bee83cf42a..0000000000
--- a/frontend/src/pages/projects/new/index.jsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import React from 'react'
-import { Grid } from 'semantic-ui-react'
-
-import { withRequireSignIn } from '@utils/authHandlers'
-import Page from '@components/Page'
-import Sync from '@components/NewProject/Sync'
-import styles from './index.module.scss'
-
-const New = () => {
- return (
-
-
-
-
- {}} />
-
-
-
-
- )
-}
-
-export const getServerSideProps = withRequireSignIn('/projects/new')
-
-export default New
diff --git a/frontend/src/pages/projects/new/index.module.scss b/frontend/src/pages/projects/new/index.module.scss
deleted file mode 100644
index 9f3848b3fc..0000000000
--- a/frontend/src/pages/projects/new/index.module.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-.projectsNew {
- margin-top: 30px !important;
- height: 75vh;
- max-width: 1500px;
-}
-
-.syncSide {
- padding-left: 50px;
- padding-right: 50px;
- display: flex;
- flex-wrap: wrap;
- justify-content: center;
- width: 100%;
-}
-
-.optionColumn {
- display: flex !important;
- align-items: center;
- justify-content: center;
-}
diff --git a/frontend/src/pages/search/index.tsx b/frontend/src/pages/search/index.tsx
index fd8ae8939a..9bd99b560a 100644
--- a/frontend/src/pages/search/index.tsx
+++ b/frontend/src/pages/search/index.tsx
@@ -64,7 +64,7 @@ const PageContent = () => {
{projects.length === 0 ? (
Sorry, no result.{' '}
-
+
Add your project!
diff --git a/frontend/test/ConflictModal.test.tsx b/frontend/test/ConflictModal.test.tsx
deleted file mode 100644
index c546751017..0000000000
--- a/frontend/test/ConflictModal.test.tsx
+++ /dev/null
@@ -1,152 +0,0 @@
-import { afterEach, beforeAll, beforeEach, expect, it, vi } from 'vitest'
-import { cleanup, fireEvent, render, waitFor } from '@testing-library/react'
-
-import Sync from '@components/NewProject/Sync'
-import { SyncConflictModal } from '@components/NewProject/ConflictModal'
-import AuthProvider from '@contexts/AuthContext'
-
-import GetRepo from './fixtures/GetRepoRes.json'
-
-const SESSION = { user: { username: 'tester' } }
-
-beforeAll(() => {
- vi.mock('next/config', () => ({
- default: () => ({
- publicRuntimeConfig: {
- KITSPACE_GITEA_URL: 'https://gitea.kitspace.test',
- },
- }),
- }))
-
- vi.mock('next/router', () => require('next-router-mock'))
-})
-
-beforeEach(() => {
- const GITEA_URL = 'https://gitea.kitspace.test'
- fetchMock.mockResponse(req => {
- switch (req.url) {
- case `${GITEA_URL}/api/v1/repos/tester/test_repo`:
- return JSON.stringify(GetRepo)
- case `${GITEA_URL}/api/v1/repos/migrate`:
- return { status: 409 }
- case `${GITEA_URL}/api/v1/repos/tester/new_test_repo`:
- return { status: 404 }
- default:
- throw new Error(`Unhandled request: ${req.url}`)
- }
- })
-})
-
-it('opens conflict modal if the project name conflict with existing project', async () => {
- const setUserOp = vi.fn()
- const screen = render(
-
-
- ,
- )
-
- // Write the url in the input
- const input = screen.getAllByRole('textbox')
- fireEvent.change(input[0], {
- target: { value: 'https://github.com/kitspace-test-repos/test_repo' },
- })
-
- // Click the Sync button
- fireEvent.click(screen.getByText('Sync'))
- // Wait the modal to appear
- await screen.findByText('A project with that name already exists.')
- // It should set the userOp to sync
- expect(setUserOp).toHaveBeenCalled()
-
- // The conflict modal form should have the project name
- const conflictModalInput = screen.getAllByRole('textbox')[1] as HTMLInputElement
- expect(conflictModalInput.value).toBe('test_repo')
- // The button should say overwrite because we haven't changed the project name yet.
- expect(screen.getByText('Overwrite')).toBeTruthy()
-})
-
-it('changes the overwrite button to OK if the new project name does not cause conflict', async () => {
- const setUserOp = vi.fn()
-
- const screen = render(
-
-
- ,
- )
- // Write the url in the input
- const input = screen.getAllByRole('textbox')
- fireEvent.change(input[0], {
- target: { value: 'https://github.com/kitspace-test-repos/test_repo' },
- })
-
- // Click the Sync button
- fireEvent.click(screen.getByText('Sync'))
- // Wait the modal to appear.
- await screen.findByText('A project with that name already exists.')
-
- const conflictModalInput = screen.getAllByRole('textbox')[1] as HTMLInputElement
- // Change the project name.
- fireEvent.change(conflictModalInput, {
- target: { value: 'new_test_repo' },
- })
-
- // The button should say OK because we have changed the project name.
- expect(screen.getByText('OK')).toBeTruthy()
-})
-
-it('overwrites the repo if the user clicks on `Overwrite`', () => {
- const onClose = vi.fn()
- const onDifferentName = vi.fn()
- const onOverwrite = vi.fn()
-
- const screen = render(
-
-
- ,
- )
- fireEvent.click(screen.getByText('Overwrite'))
- expect(onOverwrite).toHaveBeenCalled()
-})
-
-it('creates a repo with a different name if the user the conflicting name and clicks `OK`', async () => {
- const onClose = vi.fn()
- const onDifferentName = vi.fn()
- const onOverwrite = vi.fn()
-
- const screen = render(
-
-
- ,
- )
-
- const conflictModalInput = screen.getAllByRole('textbox')[0]
-
- fireEvent.change(conflictModalInput, {
- target: { value: 'new_test_repo' },
- })
-
- // Wait for the button to be enabled
- await waitFor(() =>
- expect(screen.getByText('OK')).toHaveProperty('disabled', false),
- )
-
- fireEvent.click(screen.getByText('OK'))
- expect(onDifferentName).toHaveBeenCalled()
-})
-
-afterEach(() => {
- cleanup()
- fetchMock.resetMocks()
-})
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index e84baca201..35dcc365cc 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -1115,11 +1115,6 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
-attr-accept@^2.2.1:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b"
- integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==
-
axe-core@^4.0.2:
version "4.2.1"
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.2.1.tgz#2e50bcf10ee5b819014f6e342e41e45096239e34"
@@ -2124,20 +2119,6 @@ file-loader@^6.0.0:
loader-utils "^2.0.0"
schema-utils "^2.6.5"
-file-selector@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.2.2.tgz#76186ac94ea01a18262a1e9ee36a8815911bc0b4"
- integrity sha512-tMZc0lkFzhOGlZUAkQ5iljPORvDX+nWEI+9C5nj9KT7Ax8bAUUtI/GYM8JFIjyKfKlQkJRC84D0UgxwDqRGvRQ==
- dependencies:
- tslib "^2.0.3"
-
-file-selector@^0.2.4:
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.2.4.tgz#7b98286f9dbb9925f420130ea5ed0a69238d4d80"
- integrity sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA==
- dependencies:
- tslib "^2.0.3"
-
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
@@ -2313,12 +2294,17 @@ globrex@^0.1.2:
resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098"
integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==
-goober@^2.0.15:
- version "2.0.19"
- resolved "https://registry.yarnpkg.com/goober/-/goober-2.0.19.tgz#9a17ca57f32f5009d013a85bbb44d67d2be6b596"
- integrity sha512-ewW0g4H+CDIxneBEynuaiGiCIGhlKxo6APHMntnJBt/Qx5XMBLJXrgKdj6CDM/id0vSK9F2EtIPE++8bttCC9Q==
+graceful-fs@^4.1.2:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
+ integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
+
+graceful-fs@^4.2.4:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
-graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+graceful-fs@^4.2.9:
version "4.2.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
@@ -3414,27 +3400,11 @@ react-double-scrollbar@^0.0.15:
resolved "https://registry.yarnpkg.com/react-double-scrollbar/-/react-double-scrollbar-0.0.15.tgz#e915ab8cb3b959877075f49436debfdb04288fe4"
integrity sha1-6RWrjLO5WYdwdfSUNt6/2wQoj+Q=
-react-dropzone@^11.5.1:
- version "11.5.1"
- resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.5.1.tgz#f4d664437bf8af6acfccbf5040a9890c6780a49f"
- integrity sha512-eNhttdq4ZDe3eKbXAe54Opt+sbtqmNK5NWTHf/l5d+1TdZqShJ8gMjBrya00qx5zkI//TYxRhu1d9pemTgaWwg==
- dependencies:
- attr-accept "^2.2.1"
- file-selector "^0.2.2"
- prop-types "^15.7.2"
-
react-fast-compare@^3.0.1:
version "3.2.0"
resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb"
integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==
-react-hot-toast@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-1.0.1.tgz#1352a526545f157bc83fbc2b19ac3ad1d92e780e"
- integrity sha512-og5MNzjNHa7BTjdThj3cwGoyD8tLoxMN9c8/Sme6bBLCnlrF54QrNOJW5gJkETTsuAHVsUK5z8Q6vvkc+9OfCg==
- dependencies:
- goober "^2.0.15"
-
react-intersection-observer@^9.4.1:
version "9.4.1"
resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.4.1.tgz#4ccb21e16acd0b9cf5b28d275af7055bef878f6b"
@@ -3463,11 +3433,6 @@ react-refresh@^0.14.0:
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e"
integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==
-react-social-login-buttons@3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/react-social-login-buttons/-/react-social-login-buttons-3.1.2.tgz#ba99cc2c508e7abeb1afdacaf50c885d590f9e66"
- integrity sha512-a8YinHatG28MUqLap5J5n6X6fvjXBVu8Zng++esZwLIUfCS3BoUVpn4cHaNR8FiTYLX5DKLPuKpzXTPHm8V7mw==
-
react@^17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
@@ -4077,11 +4042,6 @@ tslib@^1.8.1, tslib@^1.9.3:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-tslib@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
- integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
-
tsutils@^3.21.0:
version "3.21.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"