diff --git a/.babelrc b/.babelrc index ca0cb10d..fc5ee40b 100644 --- a/.babelrc +++ b/.babelrc @@ -8,7 +8,8 @@ "importSource": "@emotion/react" } } - ] + ], + "@babel/preset-typescript" ], "plugins": [ [ diff --git a/.eslintrc.js b/.eslintrc.js index 1c65dc3f..b404be12 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,4 +1,5 @@ module.exports = { + parser: '@typescript-eslint/parser', parserOptions: { ecmaFeatures: { jsx: true, @@ -6,8 +7,8 @@ module.exports = { ecmaVersion: 12, sourceType: 'module', }, - plugins: ['react', 'import', 'react-hooks'], - extends: ['airbnb'], + plugins: ['react', 'import', 'react-hooks', '@typescript-eslint'], + extends: ['airbnb', 'plugin:@typescript-eslint/recommended'], env: { browser: true, es2021: true, @@ -21,21 +22,32 @@ module.exports = { map: [['@', '.']], }, node: { - extensions: ['.js', '.jsx', '.ts', '.tsx'] + extensions: ['.js', '.jsx', '.ts', '.tsx'], }, }, }, rules: { - "import/no-extraneous-dependencies": ["error", { devDependencies: ["./*.js"] }], - 'import/extensions': ['error', 'ignorePackages', { - js: 'never', - jsx: 'never', - ts: 'never', - tsx: 'never', - }], + 'import/no-extraneous-dependencies': [ + 'error', + { devDependencies: ['./*.js'] }, + ], + 'import/extensions': [ + 'error', + 'ignorePackages', + { + js: 'never', + jsx: 'never', + ts: 'never', + tsx: 'never', + }, + ], 'react/no-unescaped-entities': 'off', '@next/next/no-page-custom-font': 'off', 'react/prop-types': [0], + 'react/jsx-filename-extension': [ + 1, + { extensions: ['.js', '.jsx', '.ts', '.tsx'] }, + ], 'react/jsx-props-no-spreading': [0], 'arrow-body-style': 0, 'no-console': 0, @@ -64,6 +76,7 @@ module.exports = { 'react/function-component-definition': 0, 'react/jsx-no-useless-fragment': 0, 'react/no-unknown-property': 0, + 'react/require-default-props': 0, 'no-unsafe-optional-chaining': 0, 'react/no-invalid-html-attribute': 0, }, diff --git a/.github/workflows/push-change-to-discord-webhook-url.yml b/.github/workflows/push-change-to-discord-webhook-url.yml index 5ba0ed89..2bee6eae 100644 --- a/.github/workflows/push-change-to-discord-webhook-url.yml +++ b/.github/workflows/push-change-to-discord-webhook-url.yml @@ -3,7 +3,7 @@ name: Push Change to Discord Webhook URL on: push: branches: - - main + - dev # Allow manual trigger workflow_dispatch: diff --git a/components/About/AboutTeam/index.jsx b/components/About/AboutTeam/index.jsx index a45f6001..3cb168d3 100644 --- a/components/About/AboutTeam/index.jsx +++ b/components/About/AboutTeam/index.jsx @@ -276,7 +276,7 @@ const AboutTeam = () => { flexDirection: 'row', }} > - {Members.map(({ id, name, image }) => ( + {Members.map(({ id, name }) => ( { const stageRef = React.useRef(null); - const [mainState, setMainState] = useState('initial'); // initial, search, gallery, uploaded - const [imageUploaded, setImageUploaded] = useState(0); + const [, setMainState] = useState('initial'); // initial, search, gallery, uploaded + const [, setImageUploaded] = useState(0); const [selectedFile, setSelectedFile] = useState(null); const [img] = useImage(selectedFile, 'Anonymous'); - const [newImage] = useImage(stageRef?.current?.toDataURL(), 'Anonymous'); + useImage(stageRef?.current?.toDataURL(), 'Anonymous'); const handleUploadClick = (event) => { const file = event.target.files[0]; const reader = new FileReader(); const url = reader.readAsDataURL(file); - reader.onloadend = function (e) { + reader.onloadend = () => { setSelectedFile([reader.result]); }; console.log(url); diff --git a/components/ContributeResource/ActivitiesResource/index.jsx b/components/ContributeResource/ActivitiesResource/index.jsx index da0b5a7e..06a595fc 100644 --- a/components/ContributeResource/ActivitiesResource/index.jsx +++ b/components/ContributeResource/ActivitiesResource/index.jsx @@ -1,6 +1,5 @@ import React from 'react'; -import styled from '@emotion/styled'; -import { Box, Paper, Typography } from '@mui/material'; +import { Box, Typography } from '@mui/material'; const ActivitiesResource = () => { return ( diff --git a/components/ContributeResource/LocationResource/index.jsx b/components/ContributeResource/LocationResource/index.jsx index ae9982f6..9180a7c0 100644 --- a/components/ContributeResource/LocationResource/index.jsx +++ b/components/ContributeResource/LocationResource/index.jsx @@ -1,6 +1,5 @@ import React from 'react'; -import styled from '@emotion/styled'; -import { Box, Paper, Typography } from '@mui/material'; +import { Box, Typography } from '@mui/material'; const LearningResource = () => { return ( diff --git a/components/ContributeResource/index.jsx b/components/ContributeResource/index.jsx index 212756e9..129de672 100644 --- a/components/ContributeResource/index.jsx +++ b/components/ContributeResource/index.jsx @@ -3,7 +3,6 @@ import styled from '@emotion/styled'; import { Paper, Box, Typography } from '@mui/material'; import LearningResource from './LearningResource'; import ActivitiesResource from './ActivitiesResource'; -import LocationResource from './LocationResource'; const ResourceWrapper = styled.section` padding-top: 40px; diff --git a/components/Group/Form/Fields/DateRadio.jsx b/components/Group/Form/Fields/DateRadio.jsx index 33304064..bcc6e842 100644 --- a/components/Group/Form/Fields/DateRadio.jsx +++ b/components/Group/Form/Fields/DateRadio.jsx @@ -1,5 +1,5 @@ import dayjs from 'dayjs'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import Box from '@mui/material/Box'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; diff --git a/components/Group/detail/OrganizerCard.jsx b/components/Group/detail/OrganizerCard.jsx index 2e283c6f..83e1f55a 100644 --- a/components/Group/detail/OrganizerCard.jsx +++ b/components/Group/detail/OrganizerCard.jsx @@ -72,13 +72,6 @@ const StyledTags = styled.div` } `; -const StyledTime = styled.time` - display: flex; - justify-content: flex-end; - font-size: 12px; - color: #92989a; -`; - function OrganizerCard({ data = {}, isLoading }) { const educationStage = EDUCATION_STEP.find(({ key }) => key === data?.user?.educationStage) diff --git a/components/Home/APPBanner/index.jsx b/components/Home/APPBanner/index.jsx index 4fc9daf6..9d9ee741 100644 --- a/components/Home/APPBanner/index.jsx +++ b/components/Home/APPBanner/index.jsx @@ -1,4 +1,3 @@ -import React, { useState } from 'react'; import styled from '@emotion/styled'; import Box from '@mui/material/Box'; import { Typography, Button } from '@mui/material'; diff --git a/components/Home/About/Tags/index.jsx b/components/Home/About/Tags/index.jsx index 3f21a73f..3effe699 100644 --- a/components/Home/About/Tags/index.jsx +++ b/components/Home/About/Tags/index.jsx @@ -1,4 +1,4 @@ -import React, { useCallback, useMemo } from 'react'; +import React, { useMemo } from 'react'; import styled from '@emotion/styled'; import { useRouter } from 'next/router'; import Chip from '@mui/material/Chip'; @@ -10,45 +10,8 @@ const TagsWrapper = styled.ul` flex-wrap: wrap; `; -// const TagItemWrapper = styled.li` -// color: black; -// border-radius: 15px; -// padding: 2px 10px; -// margin: 0 5px; -// white-space: nowrap; -// cursor: pointer; -// ${({ color }) => css` -// background-color: ${COLOR_TABLE[color ?? "default"]}; -// `} -// `; - const Tags = ({ tags = [], type }) => { - const { query, push } = useRouter(); - const linkTagsHandler = useCallback( - (newQuery) => { - // 複製一份,避免影響到使用體驗 - const clonedQuery = { ...query }; - delete clonedQuery.title; - if (clonedQuery[type]) { - push({ - pathname: '/search', - query: { - ...clonedQuery, - [type]: [clonedQuery[type].split(','), newQuery].join(','), - }, - }); - } else { - push({ - pathname: '/search', - query: { - ...clonedQuery, - [type]: newQuery, - }, - }); - } - }, - [push, query, type], - ); + const { query } = useRouter(); const linkList = useMemo(() => { return tags.map((newQuery) => { diff --git a/components/Home/About/index.jsx b/components/Home/About/index.jsx index b1cb4121..96c3d9cf 100644 --- a/components/Home/About/index.jsx +++ b/components/Home/About/index.jsx @@ -1,9 +1,6 @@ import React from 'react'; import styled from '@emotion/styled'; -import Box from '@mui/material/Box'; -import { Typography, Button } from '@mui/material'; -import { FacebookRounded } from '@mui/icons-material'; -import Chip from '@mui/material/Chip'; +import { Box, Chip, Typography } from '@mui/material'; import { useRouter } from 'next/router'; import { COLOR_TABLE } from '../../../constants/notion'; import { CATEGORIES } from '../../../constants/category'; diff --git a/components/Home/Banner/index.jsx b/components/Home/Banner/index.jsx index 82717129..3418443c 100644 --- a/components/Home/Banner/index.jsx +++ b/components/Home/Banner/index.jsx @@ -1,7 +1,6 @@ import React, { useCallback } from 'react'; import styled from '@emotion/styled'; import { Box, Button, Typography } from '@mui/material'; -import Typed from 'react-typed'; import SearchField from '../SearchField'; import BannerVideo from '../BannerVideo'; import Title from './Title'; diff --git a/components/Home/FacebookPosts/CardList/Card/index.jsx b/components/Home/FacebookPosts/CardList/Card/index.jsx index f7b0a4ec..1d5e5dfc 100644 --- a/components/Home/FacebookPosts/CardList/Card/index.jsx +++ b/components/Home/FacebookPosts/CardList/Card/index.jsx @@ -1,9 +1,6 @@ import styled from '@emotion/styled'; -import { css } from '@emotion/react'; -import { useRouter } from 'next/router'; -import { Box, Tooltip, Typography } from '@mui/material'; +import { Box, Tooltip } from '@mui/material'; import dayjs from 'dayjs'; -import { slideInUp } from '../../../../../shared/styles/animation'; const CardWrapper = styled.li` position: relative; @@ -41,26 +38,7 @@ const ContentWrapper = styled.p` font-size: 12px; `; -const BackgroundWrapper = styled.div` - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: hidden; - border-radius: 20px; - z-index: -1; - ${({ image }) => css` - background-image: ${`url(${image})`}; - background-size: cover; - background-repeat: no-repeat; - background-position: 50% 50%; - filter: brightness(50%); - `} -`; - -const Card = ({ id, message = '', date, title, link, type }) => { - const router = useRouter(); +const Card = ({ id, message = '', date }) => { return ( css` - background-image: ${`url(${image})`}; - background-size: cover; - background-repeat: no-repeat; - background-position: 50% 50%; - filter: brightness(50%); - `} -`; const ImageWrapper = styled(LazyLoadImage)` - /* border-radius: 10px; */ width: 150px; height: 150px; min-width: 150px; @@ -67,7 +29,7 @@ const ImageWrapper = styled(LazyLoadImage)` object-position: center; `; -const Card = ({ message = '', date, image, url }) => { +const Card = ({ message = '', image, url }) => { return ( window.open(url, '_target')}> diff --git a/components/Home/FacebookPosts/StoryCardList/Card/index.jsx b/components/Home/FacebookPosts/StoryCardList/Card/index.jsx index 31aae98b..1cf18fcc 100644 --- a/components/Home/FacebookPosts/StoryCardList/Card/index.jsx +++ b/components/Home/FacebookPosts/StoryCardList/Card/index.jsx @@ -1,10 +1,6 @@ import styled from '@emotion/styled'; -import { css } from '@emotion/react'; -import { useRouter } from 'next/router'; -import { Box, Skeleton, Tooltip, Typography } from '@mui/material'; -import dayjs from 'dayjs'; +import { Tooltip } from '@mui/material'; import { LazyLoadImage } from 'react-lazy-load-image-component'; -import { slideInUp } from '../../../../../shared/styles/animation'; const CardWrapper = styled.li` position: relative; @@ -23,42 +19,7 @@ const CardWrapper = styled.li` } `; -const ContentWrapper = styled.p` - display: flex; - flex-direction: column; - align-items: center; - height: calc(90px - 20px); - font-weight: 500; - text-align: left; - display: -webkit-box; - text-overflow: ellipsis; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - overflow: hidden; - white-space: pre-wrap; - font-size: 12px; -`; - -const BackgroundWrapper = styled.div` - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: hidden; - border-radius: 20px; - z-index: -1; - ${({ image }) => css` - background-image: ${`url(${image})`}; - background-size: cover; - background-repeat: no-repeat; - background-position: 50% 50%; - filter: brightness(50%); - `} -`; - const ImageWrapper = styled(LazyLoadImage)` - /* border-radius: 10px; */ width: 150px; height: calc(calc(150px / 9) * 16); min-width: 150px; @@ -72,10 +33,8 @@ const VideoWrapper = styled.video` object-fit: cover; width: 100%; height: inherit; - /* background: rgba(0, 0, 0, 0.75); - backdrop-filter: blur(180px); */ - /* z-index: 1; */ `; + const Card = ({ message = '', media, url, type }) => { if (type === 'VIDEO') { return ( diff --git a/components/Home/FacebookPosts/index.jsx b/components/Home/FacebookPosts/index.jsx index 2ba90240..87e16260 100644 --- a/components/Home/FacebookPosts/index.jsx +++ b/components/Home/FacebookPosts/index.jsx @@ -1,13 +1,10 @@ import React, { useEffect } from 'react'; import styled from '@emotion/styled'; -import Box from '@mui/material/Box'; import { useSelector, useDispatch, shallowEqual } from 'react-redux'; -import CardList from './CardList'; import ImageCardList from './ImageCardList'; import StoryCardList from './StoryCardList'; import { - // getFacebookFansPagePost, getFacebookGroupPost, getInstagramPost, getInstagramStory, @@ -15,7 +12,6 @@ import { const GuideWrapper = styled.div` width: 90%; - /* height: calc(var(--section-height) + var(--section-height-offset)); */ margin: 0 auto; padding-top: 40px; padding-bottom: 40px; @@ -36,12 +32,8 @@ const GuideWrapper = styled.div` const Guide = () => { const dispatch = useDispatch(); const { - groupPosts, - // fanpagesPosts, instagramPosts, instagramStories, - // isLoadingFanpagesPosts, - isLoadingGroupPosts, isLoadingInstagramPosts, isLoadingInstagramStories, } = useSelector(({ shared }) => { @@ -60,7 +52,6 @@ const Guide = () => { }, shallowEqual); useEffect(() => { - // dispatch(getFacebookFansPagePost(7)); dispatch(getFacebookGroupPost(7)); dispatch(getInstagramPost()); dispatch(getInstagramStory()); @@ -81,12 +72,6 @@ const Guide = () => { isLoading={isLoadingInstagramPosts} direction="right" /> - {/* */} ); }; diff --git a/components/Home/JoinCooperate/index.jsx b/components/Home/JoinCooperate/index.jsx index 19051c29..7e4c1d68 100644 --- a/components/Home/JoinCooperate/index.jsx +++ b/components/Home/JoinCooperate/index.jsx @@ -1,10 +1,6 @@ -import React, { useState } from 'react'; import styled from '@emotion/styled'; import Box from '@mui/material/Box'; import { Button, Typography } from '@mui/material'; -import { FacebookRounded } from '@mui/icons-material'; -import { useRouter } from 'next/router'; -import WramModal from '../../../shared/components/WarmModal'; const GroupWrapper = styled.div` width: 90%; @@ -20,9 +16,6 @@ const GroupWrapper = styled.div` `; const JoinCooperate = () => { - const router = useRouter(); - const [open, setOpen] = useState(false); - return ( { - const router = useRouter(); const [open, setOpen] = useState(false); return ( diff --git a/components/Marathon/Mentors.jsx b/components/Marathon/Mentors.jsx index 1504e43b..df157a07 100644 --- a/components/Marathon/Mentors.jsx +++ b/components/Marathon/Mentors.jsx @@ -271,7 +271,7 @@ const Mentors = () => { } }; - const handleTouchEnd = (e) => { + const handleTouchEnd = () => { setTouchStartX(null); }; diff --git a/components/Marathon/SignUp/ConfirmForm.jsx b/components/Marathon/SignUp/ConfirmForm.jsx index f41e221e..1ec1a81c 100644 --- a/components/Marathon/SignUp/ConfirmForm.jsx +++ b/components/Marathon/SignUp/ConfirmForm.jsx @@ -211,12 +211,12 @@ export default function ConfirmForm({ setCurrentStep, currentStep, }) { - const [hasClickSubmitButton, setHasClickSubmitButton] = useState(false); + const [/** hasClickSubmitButton */, setHasClickSubmitButton] = useState(false); const reduxDispatch = useDispatch(); const marathonState = useSelector((state) => { return state.marathon; }); const userState = useSelector((state) => { return state.user; }); const token = useSelector((state) => { return state.user.token; }); - const [newMarathon, setNewMarathon] = useState(reduxInitMarathonState); + const [/** newMarathon */, setNewMarathon] = useState(reduxInitMarathonState); const router = useRouter(); const { openLoginModal } = useAuthDispatch(); const [user, setUser] = useState({ @@ -338,7 +338,7 @@ export default function ConfirmForm({ 學習動機 - {marathonState?.motivation?.tags?.map((tag, _i) => { + {marathonState?.motivation?.tags?.map((tag) => { return (
{tag} @@ -356,7 +356,7 @@ export default function ConfirmForm({ 學習方法與策略 - {marathonState?.strategies?.tags.map((tag, _i) => { + {marathonState?.strategies?.tags.map((tag) => { return (
{tag} @@ -388,7 +388,7 @@ export default function ConfirmForm({ 學習成果及呈現方式 - {marathonState?.outcomes?.tags?.map((tag, _i) => { + {marathonState?.outcomes?.tags?.map((tag) => { return (
{tag} @@ -471,7 +471,7 @@ export default function ConfirmForm({ 夥伴的 Email { - marathonState.pricing.email.map((email, _i) => { + marathonState.pricing.email.map((email) => { return ( { - const names = value.filter((milestone, _i) => { + const names = value.filter((milestone) => { return (milestone.name.trim().length > 0); }); return names.length === newMarathon.milestones?.length; @@ -156,10 +156,9 @@ export default function MarathonForm({ } if (validate(input)) { - setErrors((prevErrors) => { - const { [name]: _, ...remainingErrors } = prevErrors; - return remainingErrors; - }); + setErrors((prevErrors) => + Object.fromEntries(Object.entries(prevErrors).filter(([key]) => key !== name)) + ); } else { setErrors({ ...errors, diff --git a/components/Marathon/SignUp/MilestoneGroup.jsx b/components/Marathon/SignUp/MilestoneGroup.jsx index cb16cb07..fdb52d09 100644 --- a/components/Marathon/SignUp/MilestoneGroup.jsx +++ b/components/Marathon/SignUp/MilestoneGroup.jsx @@ -3,7 +3,6 @@ import { useState, useEffect } from "react"; import styled from '@emotion/styled'; import { Box, - Grid, TextField, MenuItem, Typography, @@ -48,7 +47,7 @@ export default function MilestoneGroup({ }) { const eventWeekRange = 22; const [startDate, setStartDate] = useState('2025-02-09'); - const [endDate, setEndDate] = useState(dayjs(startDate).add('22', 'week')); + const [/** endDate */, setEndDate] = useState(dayjs(startDate).add('22', 'week')); const [frequency, setFrequency] = useState('biweekly'); function arabicToChinese(num) { @@ -113,26 +112,26 @@ export default function MilestoneGroup({ } }); }; - const handleStartDate = (eventStartDate) => { - setStartDate(eventStartDate); - const eventEndDate = dayjs(eventStartDate).add(eventWeekRange, 'week'); - setEndDate(eventEndDate); - const changedMilestones = calculateMilestones(eventStartDate, frequency, milestones); - onChange({ - type: 'UPDATE_FIELD', - payload: { - key: 'milestones', - value: changedMilestones - } - }); - }; - const handleEndDate = (fakeDate) => { + // const handleStartDate = (eventStartDate) => { + // setStartDate(eventStartDate); + // const eventEndDate = dayjs(eventStartDate).add(eventWeekRange, 'week'); + // setEndDate(eventEndDate); + // const changedMilestones = calculateMilestones(eventStartDate, frequency, milestones); + // onChange({ + // type: 'UPDATE_FIELD', + // payload: { + // key: 'milestones', + // value: changedMilestones + // } + // }); + // }; + const handleEndDate = (/** fakeDate */) => { const eventEndDate = dayjs(startDate).add(eventWeekRange, 'week'); setEndDate(eventEndDate); }; const updateMilestone = (newMilestone) => { - const changedMilestones = milestones.map((item, _i) => { + const changedMilestones = milestones.map((item) => { return (item._tempId === newMilestone._tempId ? newMilestone : item); }); // check if milestone name exist diff --git a/components/Marathon/SignUp/MilestonePanel.jsx b/components/Marathon/SignUp/MilestonePanel.jsx index b70e2d0a..0ea5af92 100644 --- a/components/Marathon/SignUp/MilestonePanel.jsx +++ b/components/Marathon/SignUp/MilestonePanel.jsx @@ -1,7 +1,6 @@ import { v4 as uuidv4 } from 'uuid'; import { useState } from 'react'; import styled from "@emotion/styled"; -import dayjs from "dayjs"; import { Grid, @@ -122,7 +121,7 @@ export default function MilestonePanel({ }; const handleDeleteSubMilestone = (deletedItem) => { - const newSubMilestones = (milestone.subMilestones).filter((item, _i) => { + const newSubMilestones = (milestone.subMilestones).filter((item) => { return (item._tempId !== deletedItem._tempId); }); onChange({ @@ -132,7 +131,7 @@ export default function MilestonePanel({ }; const handleEditSubMilestone = (newItem) => { - const newSubMilestones = (milestone.subMilestones).map((item, _i) => { + const newSubMilestones = (milestone.subMilestones).map((item) => { return (newItem._tempId === item._tempId) ? newItem : item; }); onChange({ diff --git a/components/Marathon/SignUp/MultiSelectDropdown.jsx b/components/Marathon/SignUp/MultiSelectDropdown.jsx index 7ac3695f..1e789453 100644 --- a/components/Marathon/SignUp/MultiSelectDropdown.jsx +++ b/components/Marathon/SignUp/MultiSelectDropdown.jsx @@ -69,7 +69,7 @@ export default function MultiSelectDropdown({ }} > { - listItems.map((item, index) => { + listItems.map((item) => { return ( ISOToWeekday(ISODate)) diff --git a/components/Marathon/SignUp/UserProfileForm.jsx b/components/Marathon/SignUp/UserProfileForm.jsx index 28b01ce2..7c26e16d 100644 --- a/components/Marathon/SignUp/UserProfileForm.jsx +++ b/components/Marathon/SignUp/UserProfileForm.jsx @@ -4,7 +4,6 @@ import dayjs from 'dayjs'; import toast from 'react-hot-toast'; import { useSearchParams } from 'next/navigation'; import useMediaQuery from '@mui/material/useMediaQuery'; -import { useRouter } from 'next/router'; import { useDispatch, useSelector } from 'react-redux'; import { fetchMarathonProfileByUserEvent @@ -29,8 +28,6 @@ import { } from '@mui/material'; import { MobileDatePicker } from '@mui/x-date-pickers/MobileDatePicker'; -import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; -import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import Fields from '@/components/Group/Form/Fields'; import useEditProfile from './useEditProfile'; import ErrorMessage from './ErrorMessage'; @@ -38,8 +35,6 @@ import ErrorMessage from './ErrorMessage'; import TheAvator from './TheAvator'; import FormInput from './EditFormInput'; import { - FormWrapper, - ContentWrapper, StyledGroup, StyledSelectWrapper, StyledSelectBox, @@ -50,7 +45,6 @@ import { StyledSection, StyledButtonGroup, StyledButton, - MarathonSignUpWrapper, } from './Edit.styled'; export default function UserProfileForm({ @@ -61,7 +55,6 @@ export default function UserProfileForm({ const reduxDispatch = useDispatch(); const mobileScreen = useMediaQuery('(max-width: 767px)'); const [isSetting, setIsSetting] = useState(false); - const router = useRouter(); const searchParams = useSearchParams(); const check = searchParams.get('check'); const [hasClickNextStep, setHasClickNextStep] = useState(false); diff --git a/components/Marathon/SignUp/useEditProfile.jsx b/components/Marathon/SignUp/useEditProfile.jsx index 4255ab09..aa5c6ddf 100644 --- a/components/Marathon/SignUp/useEditProfile.jsx +++ b/components/Marathon/SignUp/useEditProfile.jsx @@ -3,7 +3,6 @@ import { useReducer, useRef, useState } from 'react'; import { useDispatch } from 'react-redux'; import { updateUser, createUser } from '@/redux/actions/user'; import { z } from 'zod'; -import { useAuthDispatch } from '@/contexts/Auth'; const initialState = { name: '', @@ -115,7 +114,6 @@ const userReducer = (state, payload) => { const useEditProfile = () => { const reduxDispatch = useDispatch(); const [userState, stateDispatch] = useReducer(userReducer, initialState); - const authDispatch = useAuthDispatch(); const [errors, setErrors] = useState({}); const refs = useRef({}); diff --git a/components/Marathon/Spotlight/index.jsx b/components/Marathon/Spotlight/index.jsx index b288e4b9..18790d45 100644 --- a/components/Marathon/Spotlight/index.jsx +++ b/components/Marathon/Spotlight/index.jsx @@ -3,7 +3,6 @@ import { Box, Typography } from "@mui/material"; -import BoomImage from "@/public/assets/booming.png"; const StyledGroup = styled(Box)` width: 100%; diff --git a/components/Partner/Banner/index.jsx b/components/Partner/Banner/index.jsx index 48b32fe9..32b1f744 100644 --- a/components/Partner/Banner/index.jsx +++ b/components/Partner/Banner/index.jsx @@ -1,4 +1,3 @@ -import { useSelector } from 'react-redux'; import styled from '@emotion/styled'; import { useRouter } from 'next/router'; import { Box } from '@mui/material'; diff --git a/components/Partner/PartnerList/PartnerCard/PartnerSkelton.jsx b/components/Partner/PartnerList/PartnerCard/PartnerSkelton.jsx index 404e050a..14b0a93b 100644 --- a/components/Partner/PartnerList/PartnerCard/PartnerSkelton.jsx +++ b/components/Partner/PartnerList/PartnerCard/PartnerSkelton.jsx @@ -21,7 +21,7 @@ const PartnerSkelton = () => { - {new Array(3).fill(0).map((_, idx) => ( + {new Array(3).fill(0).map(() => ( { const [getSearchParams, pushState] = useSearchParamsManager(); - const [_, setTag] = useState(); + const [, setTag] = useState(); const currentTags = getSearchParams('tag').toString(); const handleChange = (val) => { diff --git a/components/Partner/index.jsx b/components/Partner/index.jsx index 17e02064..7e683c71 100644 --- a/components/Partner/index.jsx +++ b/components/Partner/index.jsx @@ -66,7 +66,7 @@ function Partner() { const { page: current = 1, totalPages } = pagination; // queryStr - const [getSearchParams, _, generateParamsItems] = useSearchParamsManager(); + const [getSearchParams, , generateParamsItems] = useSearchParamsManager(); const searchParamsItems = useMemo( () => generateParamsItems(['area', 'role', 'edu', 'tag', 'q'], keySelections), diff --git a/components/Profile/Accountsetting/index.jsx b/components/Profile/Accountsetting/index.jsx index a3a8f423..fbb998f8 100644 --- a/components/Profile/Accountsetting/index.jsx +++ b/components/Profile/Accountsetting/index.jsx @@ -9,7 +9,6 @@ import { } from '@mui/material'; import { useRouter } from 'next/router'; import styled from '@emotion/styled'; -import { useDispatch } from 'react-redux'; import { useAuth, useAuthDispatch } from '@/contexts/Auth'; const StyledTypographyStyle = styled(Typography)` diff --git a/components/Profile/MyMarathon/LoadingCard.jsx b/components/Profile/MyMarathon/LoadingCard.jsx index fc0e2239..5c32006e 100644 --- a/components/Profile/MyMarathon/LoadingCard.jsx +++ b/components/Profile/MyMarathon/LoadingCard.jsx @@ -1,6 +1,5 @@ import Skeleton from '@mui/material/Skeleton'; import IconButton from '@mui/material/IconButton'; -import LocationOnOutlinedIcon from '@mui/icons-material/LocationOnOutlined'; import MoreVertOutlinedIcon from '@mui/icons-material/MoreVertOutlined'; import { StyledContainer, diff --git a/components/Profile/MyMarathon/index.jsx b/components/Profile/MyMarathon/index.jsx index 41210559..ece54b98 100644 --- a/components/Profile/MyMarathon/index.jsx +++ b/components/Profile/MyMarathon/index.jsx @@ -50,7 +50,7 @@ const MyMarathon = ({ title, sx }) => { )} {marathons.length > 0 && ( - marathons.map((marathon, _i) => { + marathons.map((marathon) => { return ( css` -// background-color: ${COLOR_TABLE[color ?? "default"]}; -// `} -// `; - const Tags = ({ tags, type }) => { - const { query, push } = useRouter(); - const linkTagsHandler = useCallback( - (newQuery) => { - // 複製一份,避免影響到使用體驗 - const clonedQuery = { ...query }; - delete clonedQuery.title; - if (clonedQuery[type]) { - push({ - pathname: '/search', - query: { - ...clonedQuery, - [type]: [clonedQuery[type].split(','), newQuery].join(','), - }, - }); - } else { - push({ - pathname: '/search', - query: { - ...clonedQuery, - [type]: newQuery, - }, - }); - } - }, - [push, query, type], - ); + const { query } = useRouter(); const linkList = useMemo(() => { return tags.map((newQuery) => { @@ -82,10 +45,8 @@ const Tags = ({ tags, type }) => { {tags.map(({ name, color }, index) => (
  • - {/* */} linkTagsHandler(name)} sx={{ backgroundColor: COLOR_TABLE[color ?? 'default'], cursor: 'pointer', @@ -99,7 +60,6 @@ const Tags = ({ tags, type }) => { }, }} /> - {/* */}
  • ))} diff --git a/components/Resource/index.jsx b/components/Resource/index.jsx index c07447bd..0f29b08e 100644 --- a/components/Resource/index.jsx +++ b/components/Resource/index.jsx @@ -1,15 +1,10 @@ import React, { useEffect, useMemo, useState } from 'react'; import styled from '@emotion/styled'; import { useRouter } from 'next/router'; -import { Button, Paper, Box, Stack, Typography } from '@mui/material'; +import { Box, Typography } from '@mui/material'; import { css } from '@emotion/react'; -import { DiscussionEmbed, Recommendations, CommentEmbed } from 'disqus-react'; -import { Share } from '@mui/icons-material'; -import { CopyToClipboard } from 'react-copy-to-clipboard'; -import toast from 'react-hot-toast'; -import appendQuery from 'append-query'; +import { DiscussionEmbed } from 'disqus-react'; import Shares from './Shares'; -import { postFetcher } from '../../utils/fetcher'; import Tags from './Tags'; import RelatedResources from '../../shared/components/RelatedResources'; import Desc from './Desc'; diff --git a/components/Search/SearchField/AgeCheckbox/index.jsx b/components/Search/SearchField/AgeCheckbox/index.jsx index 20fc06de..57ed841f 100644 --- a/components/Search/SearchField/AgeCheckbox/index.jsx +++ b/components/Search/SearchField/AgeCheckbox/index.jsx @@ -1,30 +1,11 @@ /* eslint-disable react/jsx-wrap-multilines */ -import React, { useState } from 'react'; -import styled from '@emotion/styled'; -import { Box, Select, MenuItem } from '@mui/material'; import { useRouter } from 'next/router'; -// import { SEARCH_TAGS } from "../../../constants/category"; -import OutlinedInput from '@mui/material/OutlinedInput'; -import InputLabel from '@mui/material/InputLabel'; import FormControl from '@mui/material/FormControl'; -import Chip from '@mui/material/Chip'; import FormLabel from '@mui/material/FormLabel'; import FormGroup from '@mui/material/FormGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; -import FormHelperText from '@mui/material/FormHelperText'; import Checkbox from '@mui/material/Checkbox'; -const ITEM_HEIGHT = 48; -const ITEM_PADDING_TOP = 8; -const MenuProps = { - PaperProps: { - style: { - maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP, - width: 250, - }, - }, -}; - const names = ['學齡前', '國小', '國高中', '大學以上']; const AgeDropdown = () => { diff --git a/components/Search/SearchField/AgeDropdown/index.jsx b/components/Search/SearchField/AgeDropdown/index.jsx index 93531bbe..844522b4 100644 --- a/components/Search/SearchField/AgeDropdown/index.jsx +++ b/components/Search/SearchField/AgeDropdown/index.jsx @@ -1,8 +1,5 @@ -import React, { useState } from 'react'; -import styled from '@emotion/styled'; import { Box, Select, MenuItem } from '@mui/material'; import { useRouter } from 'next/router'; -// import { SEARCH_TAGS } from "../../../constants/category"; import OutlinedInput from '@mui/material/OutlinedInput'; import InputLabel from '@mui/material/InputLabel'; import FormControl from '@mui/material/FormControl'; diff --git a/components/Search/SearchField/FeeDropdown/index.jsx b/components/Search/SearchField/FeeDropdown/index.jsx index 19452fae..8df91cbf 100644 --- a/components/Search/SearchField/FeeDropdown/index.jsx +++ b/components/Search/SearchField/FeeDropdown/index.jsx @@ -1,28 +1,10 @@ -import React, { useState } from 'react'; -import styled from '@emotion/styled'; -import { Box, Select, MenuItem } from '@mui/material'; import { useRouter } from 'next/router'; -// import { SEARCH_TAGS } from "../../../constants/category"; -import OutlinedInput from '@mui/material/OutlinedInput'; -import InputLabel from '@mui/material/InputLabel'; import FormControl from '@mui/material/FormControl'; -import Chip from '@mui/material/Chip'; import Radio from '@mui/material/Radio'; import RadioGroup from '@mui/material/RadioGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; import FormLabel from '@mui/material/FormLabel'; -const ITEM_HEIGHT = 48; -const ITEM_PADDING_TOP = 8; -const MenuProps = { - PaperProps: { - style: { - maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP, - width: 250, - }, - }, -}; - const names = ['不拘', '免費', '部分免費', '需付費']; const FeeDropdown = () => { diff --git a/components/Search/SearchField/index.jsx b/components/Search/SearchField/index.jsx index 19ea34c7..ce53cecf 100644 --- a/components/Search/SearchField/index.jsx +++ b/components/Search/SearchField/index.jsx @@ -1,44 +1,15 @@ -import React, { useState } from 'react'; import styled from '@emotion/styled'; -import { Box, Select, MenuItem } from '@mui/material'; +import { Box } from '@mui/material'; import { useRouter } from 'next/router'; -import { Whatshot } from '@mui/icons-material'; -import OutlinedInput from '@mui/material/OutlinedInput'; -import InputLabel from '@mui/material/InputLabel'; -import FormControl from '@mui/material/FormControl'; -import Chip from '@mui/material/Chip'; -import { SEARCH_TAGS } from '../../../constants/category'; import SearchInput from './SearchInput'; import HotTags from './HotTags'; -import AgeDropdown from './AgeDropdown'; import FeeDropdown from './FeeDropdown'; import AgeCheckbox from './AgeCheckbox'; const SearchFieldWrapper = styled.div` width: 100%; - - /* @media (max-width: 767px) { - margin: 0 10px 10px 10px; - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - } */ `; -const ITEM_HEIGHT = 48; -const ITEM_PADDING_TOP = 8; -const MenuProps = { - PaperProps: { - style: { - maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP, - width: 250, - }, - }, -}; - -const names = ['學齡前', '國小', '國高中', '大學以上']; - const SearchField = () => { const { query } = useRouter(); const queryList = (query?.cats ?? '').split(',').reverse(); diff --git a/components/Search/SearchGalleryList/ImageItem/index.jsx b/components/Search/SearchGalleryList/ImageItem/index.jsx index 179f82ef..81bac5d2 100644 --- a/components/Search/SearchGalleryList/ImageItem/index.jsx +++ b/components/Search/SearchGalleryList/ImageItem/index.jsx @@ -1,122 +1,15 @@ -/* eslint-disable react/jsx-wrap-multilines */ import React, { useMemo } from 'react'; -import styled from '@emotion/styled'; -import { css, keyframes } from '@emotion/react'; import { - Typography, - Box, - ImageList, ImageListItem, ImageListItemBar, IconButton, } from '@mui/material'; import dayjs from 'dayjs'; import isBetween from 'dayjs/plugin/isBetween'; -// import { TikTokFont } from '../../../../shared/styles/css'; -dayjs.extend(isBetween); - -function srcset(image, width, height, rows = 1, cols = 1) { - return { - src: `${image}?w=${width * cols}&h=${height * rows}&fit=crop&auto=format`, - srcSet: `${image}?w=${width * cols}&h=${ - height * rows - }&fit=crop&auto=format&dpr=2 2x`, - }; -} - -const ItemWrapper = styled.li` - display: flex; - padding-top: 20px; - padding-bottom: 20px; - border-bottom: 1px solid rgba(168, 168, 168, 0.3); -`; - -const ContentWrapper = styled.article` - width: calc(100% - 200px); - padding: 0 10px; - margin-left: 20px; - @media (max-width: 767px) { - width: calc(100% - 100px); - } -`; - -const ImageWrapper = styled.div` - width: 200px; - height: 200px; - background-color: #f5f5f5; - ${({ image }) => css` - background-image: ${`url(${image})`}; - background-size: cover; - background-repeat: no-repeat; - background-position: 50% 50%; - `} - border-radius: 20px; - /* object-fit: cover; */ - /* opacity: 0; */ - - @media (max-width: 767px) { - width: 100px; - height: 100px; - } -`; - -const TitleWrapper = styled.div` - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - align-items: center; - .title { - font-size: 24px; - font-weight: 500; - margin: 0 10px 0 0; - color: black; - &:hover { - cursor: pointer; - color: #16b9b3; - transition: 0.5s; - } - } - - @media (max-width: 767px) { - .title { - text-overflow: ellipsis; - width: 100%; - } - } -`; - -const Item = ({ data, margin }) => { - const hashTags = useMemo( - () => data?.properties['標籤']?.multi_select ?? [], - [data], - ); - const resourcesTags = useMemo( - () => data?.properties['資源類型']?.multi_select ?? [], - [data], - ); - const feeTags = useMemo( - () => - data?.properties['費用']?.select - ? [data?.properties['費用']?.select] - : [], - [data], - ); - const isNewResource = useMemo(() => { - const today = dayjs(); - const createDay = dayjs(data?.created_time); - const isRecent = dayjs(createDay).isBetween( - today, - dayjs(today).subtract(1, 'month'), - ); - return isRecent; - }, [data]); - - const ageOfUserTags = useMemo( - () => data?.properties['年齡層']?.multi_select ?? [], - [data], - ); +dayjs.extend(isBetween); +const Item = ({ data }) => { const title = useMemo( () => (data?.properties['資源名稱']?.title ?? []).find( @@ -125,26 +18,9 @@ const Item = ({ data, margin }) => { [data?.properties], ); - const contributors = useMemo( - () => data?.properties['創建者']?.multi_select ?? [], - [data?.properties], - ); - - // const link = useMemo(() => data?.properties["連結"]?.url ?? "", [data]); - const link = useMemo(() => `/resource/${title}`, [title]); - return ( { title={title} position="top" actionIcon={ - - {/* */} - + } actionPosition="left" /> diff --git a/components/Search/SearchGalleryList/Item/Contributors/index.jsx b/components/Search/SearchGalleryList/Item/Contributors/index.jsx index cacbefba..3b14cd61 100644 --- a/components/Search/SearchGalleryList/Item/Contributors/index.jsx +++ b/components/Search/SearchGalleryList/Item/Contributors/index.jsx @@ -1,10 +1,5 @@ -import React, { useMemo } from 'react'; -import styled from '@emotion/styled'; -import { css } from '@emotion/react'; import Link from 'next/link'; import { Typography, Box } from '@mui/material'; -import dayjs from 'dayjs'; -import isBetween from 'dayjs/plugin/isBetween'; const Contributors = ({ contributors }) => { return ( diff --git a/components/Search/SearchGalleryList/Item/LogoImage/index.jsx b/components/Search/SearchGalleryList/Item/LogoImage/index.jsx index a23a6d55..02cba3db 100644 --- a/components/Search/SearchGalleryList/Item/LogoImage/index.jsx +++ b/components/Search/SearchGalleryList/Item/LogoImage/index.jsx @@ -1,8 +1,6 @@ -import React, { useMemo } from 'react'; import styled from '@emotion/styled'; import { css } from '@emotion/react'; -import Link from 'next/link'; -import { Typography, Box } from '@mui/material'; +import { Box } from '@mui/material'; import dayjs from 'dayjs'; import isBetween from 'dayjs/plugin/isBetween'; diff --git a/components/Search/SearchGalleryList/Item/index.jsx b/components/Search/SearchGalleryList/Item/index.jsx index 314ba8ca..de66c47b 100644 --- a/components/Search/SearchGalleryList/Item/index.jsx +++ b/components/Search/SearchGalleryList/Item/index.jsx @@ -1,14 +1,11 @@ import React, { useMemo } from 'react'; import styled from '@emotion/styled'; -import { css, keyframes } from '@emotion/react'; -import Link from 'next/link'; -import { Typography, Box } from '@mui/material'; import dayjs from 'dayjs'; import isBetween from 'dayjs/plugin/isBetween'; import Tags from './Tags'; import LogoImage from './LogoImage'; import Contributors from './Contributors'; -// import { TikTokFont } from '../../../../shared/styles/css'; + dayjs.extend(isBetween); const ItemWrapper = styled.li` @@ -27,25 +24,6 @@ const ContentWrapper = styled.article` } `; -const ImageWrapper = styled.div` - width: 200px; - height: 200px; - background-color: #f5f5f5; - ${({ image }) => css` - background-image: ${`url(${image})`}; - background-size: cover; - background-repeat: no-repeat; - background-position: 50% 50%; - `} - border-radius: 20px; - /* object-fit: cover; */ - /* opacity: 0; */ - - @media (max-width: 767px) { - width: 100px; - height: 100px; - } -`; const TitleWrapper = styled.div` display: flex; flex-wrap: wrap; diff --git a/components/Search/SearchGalleryList/SponsorItem/Contributors/index.jsx b/components/Search/SearchGalleryList/SponsorItem/Contributors/index.jsx index cacbefba..3b14cd61 100644 --- a/components/Search/SearchGalleryList/SponsorItem/Contributors/index.jsx +++ b/components/Search/SearchGalleryList/SponsorItem/Contributors/index.jsx @@ -1,10 +1,5 @@ -import React, { useMemo } from 'react'; -import styled from '@emotion/styled'; -import { css } from '@emotion/react'; import Link from 'next/link'; import { Typography, Box } from '@mui/material'; -import dayjs from 'dayjs'; -import isBetween from 'dayjs/plugin/isBetween'; const Contributors = ({ contributors }) => { return ( diff --git a/components/Search/SearchGalleryList/SponsorItem/LogoImage/index.jsx b/components/Search/SearchGalleryList/SponsorItem/LogoImage/index.jsx index afec2e0a..92c1550c 100644 --- a/components/Search/SearchGalleryList/SponsorItem/LogoImage/index.jsx +++ b/components/Search/SearchGalleryList/SponsorItem/LogoImage/index.jsx @@ -1,11 +1,8 @@ -import React, { useMemo } from 'react'; import styled from '@emotion/styled'; import { css } from '@emotion/react'; -import Link from 'next/link'; -import { Typography, Box } from '@mui/material'; +import { Box } from '@mui/material'; import dayjs from 'dayjs'; import isBetween from 'dayjs/plugin/isBetween'; -import { COLOR_TABLE } from '../../../../../constants/notion'; dayjs.extend(isBetween); @@ -93,6 +90,7 @@ const PromoteWrapper = styled.div` color: #ffffffff; font-weight: bold; transform: rotate(45deg); + } `; const LogoImage = ({ link, data }) => { diff --git a/components/Search/SearchGalleryList/SponsorItem/index.jsx b/components/Search/SearchGalleryList/SponsorItem/index.jsx index 2b46102f..4f7433c1 100644 --- a/components/Search/SearchGalleryList/SponsorItem/index.jsx +++ b/components/Search/SearchGalleryList/SponsorItem/index.jsx @@ -1,7 +1,5 @@ import React, { useMemo } from 'react'; import styled from '@emotion/styled'; -import { css } from '@emotion/react'; -import Link from 'next/link'; import { Typography, Box } from '@mui/material'; import dayjs from 'dayjs'; import isBetween from 'dayjs/plugin/isBetween'; @@ -9,7 +7,6 @@ import { Whatshot } from '@mui/icons-material'; import Tags from './Tags'; import LogoImage from './LogoImage'; import Contributors from './Contributors'; -import { COLOR_TABLE } from '../../../../constants/notion'; dayjs.extend(isBetween); diff --git a/components/Search/SearchGalleryList/index.jsx b/components/Search/SearchGalleryList/index.jsx index c24783b2..96771b5f 100644 --- a/components/Search/SearchGalleryList/index.jsx +++ b/components/Search/SearchGalleryList/index.jsx @@ -1,83 +1,20 @@ import React from 'react'; -import styled from '@emotion/styled'; import { ImageList, - ImageListItem, - ImageListItemBar, - IconButton, } from '@mui/material'; -import StarBorderIcon from '@mui/icons-material/StarBorder'; -import Item from './Item'; -import SponsorItem from './SponsorItem'; -import SkeletonItem from './SkeletonItem'; import ImageItem from './ImageItem'; -const ListWrapper = styled.ul` - display: flex; - flex-direction: column; - justify-content: space-between; -`; - const SearchGalleryList = ({ list, - sponsorList, - queryTags, - isLoading, - isLoadingNextData, }) => { - // if (isLoading && list.length === 0) { - // return ( - // - // - // - // - // - // - // - // ); - // } - // return ( - // - // {/* {sponsorList.map((item) => ( - // - // ))} */} - // {list.map((item, index) => - // isLoading ? ( - // - // ) : ( - // - // ) - // )} - // {isLoadingNextData && ( - // <> - // - // - // - // - // )} - // - // ); - return ( {list.map((item) => { return ( diff --git a/components/Search/SearchResultList/Item/Contributors/index.jsx b/components/Search/SearchResultList/Item/Contributors/index.jsx index cacbefba..3b14cd61 100644 --- a/components/Search/SearchResultList/Item/Contributors/index.jsx +++ b/components/Search/SearchResultList/Item/Contributors/index.jsx @@ -1,10 +1,5 @@ -import React, { useMemo } from 'react'; -import styled from '@emotion/styled'; -import { css } from '@emotion/react'; import Link from 'next/link'; import { Typography, Box } from '@mui/material'; -import dayjs from 'dayjs'; -import isBetween from 'dayjs/plugin/isBetween'; const Contributors = ({ contributors }) => { return ( diff --git a/components/Search/SearchResultList/Item/LogoImage/index.jsx b/components/Search/SearchResultList/Item/LogoImage/index.jsx index 6460436d..b16a1893 100644 --- a/components/Search/SearchResultList/Item/LogoImage/index.jsx +++ b/components/Search/SearchResultList/Item/LogoImage/index.jsx @@ -1,8 +1,6 @@ -import React, { useMemo } from 'react'; import styled from '@emotion/styled'; import { css } from '@emotion/react'; -import Link from 'next/link'; -import { Typography, Box } from '@mui/material'; +import { Box } from '@mui/material'; import dayjs from 'dayjs'; import isBetween from 'dayjs/plugin/isBetween'; diff --git a/components/Search/SearchResultList/Item/Tags/index.jsx b/components/Search/SearchResultList/Item/Tags/index.jsx index af9d98a4..c792e84d 100644 --- a/components/Search/SearchResultList/Item/Tags/index.jsx +++ b/components/Search/SearchResultList/Item/Tags/index.jsx @@ -1,28 +1,15 @@ -import React, { useCallback, useMemo } from 'react'; +import React, { useCallback } from 'react'; import styled from '@emotion/styled'; import { useRouter } from 'next/router'; import Chip from '@mui/material/Chip'; import { COLOR_TABLE } from '../../../../../constants/notion'; import { scrollToTop } from '../../../../../utils/ux'; -// import { TikTokFont } from "../../../../../shared/styles/css"; const TagsWrapper = styled.ul` display: flex; flex-wrap: wrap; `; -// const TagItemWrapper = styled.li` -// color: black; -// border-radius: 15px; -// padding: 2px 10px; -// margin: 0 5px; -// white-space: nowrap; -// cursor: pointer; -// ${({ color }) => css` -// background-color: ${COLOR_TABLE[color ?? "default"]}; -// `} -// `; - const Tags = ({ tags, type }) => { const { query, push } = useRouter(); const linkTagsHandler = useCallback( @@ -56,32 +43,6 @@ const Tags = ({ tags, type }) => { }, [push, query, type], ); - const linkList = useMemo(() => { - return tags.map((newQuery) => { - // 複製一份,避免影響到使用體驗 - const clonedQuery = { ...query }; - delete clonedQuery.title; - if (clonedQuery[type]) { - const queryObject = { - ...clonedQuery, - [type]: [clonedQuery[type].split(','), newQuery].join(','), - }; - const queryStirng = Object.keys(queryObject) - .map((key) => queryObject[key]) - .join('&'); - return `/search?${queryStirng}`; - } else { - const queryObject = { - ...clonedQuery, - [type]: newQuery, - }; - const queryStirng = Object.keys(queryObject) - .map((key) => queryObject[key]) - .join('&'); - return `/search?${queryStirng}`; - } - }); - }, [tags, query]); return ( diff --git a/components/Search/SearchResultList/Item/index.jsx b/components/Search/SearchResultList/Item/index.jsx index 1865187a..09f4bd47 100644 --- a/components/Search/SearchResultList/Item/index.jsx +++ b/components/Search/SearchResultList/Item/index.jsx @@ -1,14 +1,11 @@ import React, { useMemo } from 'react'; import styled from '@emotion/styled'; -import { css, keyframes } from '@emotion/react'; -import Link from 'next/link'; -import { Typography, Box } from '@mui/material'; import dayjs from 'dayjs'; import isBetween from 'dayjs/plugin/isBetween'; import Tags from './Tags'; import LogoImage from './LogoImage'; import Contributors from './Contributors'; -// import { TikTokFont } from '../../../../shared/styles/css'; + dayjs.extend(isBetween); const ItemWrapper = styled.li` @@ -26,25 +23,6 @@ const ContentWrapper = styled.article` } `; -const ImageWrapper = styled.div` - width: 200px; - height: 200px; - border-radius: 20px; - background-color: #f5f5f5; - ${({ image }) => css` - background-image: ${`url(${image})`}; - background-size: cover; - background-repeat: no-repeat; - background-position: 50% 50%; - `} - /* object-fit: cover; */ - /* opacity: 0; */ - - @media (max-width: 767px) { - width: 100px; - height: 100px; - } -`; const TitleWrapper = styled.div` display: flex; flex-wrap: wrap; diff --git a/components/Search/SearchResultList/SponsorItem/Contributors/index.jsx b/components/Search/SearchResultList/SponsorItem/Contributors/index.jsx index cacbefba..3b14cd61 100644 --- a/components/Search/SearchResultList/SponsorItem/Contributors/index.jsx +++ b/components/Search/SearchResultList/SponsorItem/Contributors/index.jsx @@ -1,10 +1,5 @@ -import React, { useMemo } from 'react'; -import styled from '@emotion/styled'; -import { css } from '@emotion/react'; import Link from 'next/link'; import { Typography, Box } from '@mui/material'; -import dayjs from 'dayjs'; -import isBetween from 'dayjs/plugin/isBetween'; const Contributors = ({ contributors }) => { return ( diff --git a/components/Search/SearchResultList/SponsorItem/LogoImage/index.jsx b/components/Search/SearchResultList/SponsorItem/LogoImage/index.jsx index 5bb88ccd..92c1550c 100644 --- a/components/Search/SearchResultList/SponsorItem/LogoImage/index.jsx +++ b/components/Search/SearchResultList/SponsorItem/LogoImage/index.jsx @@ -1,8 +1,6 @@ -import React, { useMemo } from 'react'; import styled from '@emotion/styled'; import { css } from '@emotion/react'; -import Link from 'next/link'; -import { Typography, Box } from '@mui/material'; +import { Box } from '@mui/material'; import dayjs from 'dayjs'; import isBetween from 'dayjs/plugin/isBetween'; @@ -92,6 +90,7 @@ const PromoteWrapper = styled.div` color: #ffffffff; font-weight: bold; transform: rotate(45deg); + } `; const LogoImage = ({ link, data }) => { diff --git a/components/Search/SearchResultList/SponsorItem/index.jsx b/components/Search/SearchResultList/SponsorItem/index.jsx index 2b46102f..4f7433c1 100644 --- a/components/Search/SearchResultList/SponsorItem/index.jsx +++ b/components/Search/SearchResultList/SponsorItem/index.jsx @@ -1,7 +1,5 @@ import React, { useMemo } from 'react'; import styled from '@emotion/styled'; -import { css } from '@emotion/react'; -import Link from 'next/link'; import { Typography, Box } from '@mui/material'; import dayjs from 'dayjs'; import isBetween from 'dayjs/plugin/isBetween'; @@ -9,7 +7,6 @@ import { Whatshot } from '@mui/icons-material'; import Tags from './Tags'; import LogoImage from './LogoImage'; import Contributors from './Contributors'; -import { COLOR_TABLE } from '../../../../constants/notion'; dayjs.extend(isBetween); diff --git a/package.json b/package.json index cfe3b76a..d28067d3 100644 --- a/package.json +++ b/package.json @@ -71,11 +71,14 @@ "zod": "^3.22.4" }, "devDependencies": { + "@babel/preset-typescript": "^7.26.0", "@emotion/babel-plugin": "^11.9.2", "@next/eslint-plugin-next": "^13.2.1", "@tailwindcss/typography": "^0.5.15", "@types/chrome": "^0.0.206", "@types/react-dom": "^19.0.2", + "@typescript-eslint/eslint-plugin": "6", + "@typescript-eslint/parser": "6", "autoprefixer": "^10.4.20", "babel-plugin-import": "^1.13.8", "eslint": "^8.35.0", diff --git a/pages/404.jsx b/pages/404.jsx index 1e55556c..fee34529 100644 --- a/pages/404.jsx +++ b/pages/404.jsx @@ -5,11 +5,11 @@ import { Typography, Button, Paper } from '@mui/material'; import { FacebookRounded } from '@mui/icons-material'; import Chip from '@mui/material/Chip'; import { useRouter } from 'next/router'; -import Navigatin from '../shared/components/Navigation_v2'; -import Footer from '../shared/components/Footer_v2'; -import { COLOR_TABLE } from '../constants/notion'; -import { CATEGORIES } from '../constants/category'; -import RelatedResources from '../shared/components/RelatedResources'; +import Navigatin from '@/shared/components/Navigation_v2'; +import Footer from '@/shared/components/Footer_v2'; +import { COLOR_TABLE } from '@/constants/notion'; +import { CATEGORIES } from '@/constants/category'; +import RelatedResources from '@/shared/components/RelatedResources'; import { getRedirectionStorage } from '@/utils/storage'; const BodyWrapper = styled.div` diff --git a/pages/_app.jsx b/pages/_app.jsx index 42137633..cd50c25f 100644 --- a/pages/_app.jsx +++ b/pages/_app.jsx @@ -34,89 +34,6 @@ const swrConfig = { errorRetryCount: 0, }; -const App = ({ Component, pageProps }) => { - const router = useRouter(); - useEffect(() => { - initGA('UA-181407006-3'); - // `routeChangeComplete` won't run for the first page load unless the query string is - // hydrated later on, so here we log a page view if this is the first render and - // there's no query string - if (!router.asPath.includes('?')) { - logPageView(); - } - }, []); - - useEffect(() => { - // Listen for page changes after a navigation or when the query changes - router.events.on('routeChangeComplete', logPageView); - return () => { - router.events.off('routeChangeComplete', logPageView); - }; - }, [router.events]); - - // const [mode, setMode] = useState("light"); - // Update the theme only if the mode changes - // const theme = useMemo(() => themeFactory(mode), [mode]); - return ( - <> - {/* */} - - {/* */} - - {/* */} - - - - - - - - - - - - - - - - - - ); -}; - const ThemeComponentWrap = ({ pageProps, Component }) => { const dispatch = useDispatch(); const searchParams = useSearchParams(); @@ -183,30 +100,28 @@ const ThemeComponentWrap = ({ pageProps, Component }) => { width="300" height="289" /> -

    - { - isComplete ? - + { + isComplete ? ( + <> +

    帳號已驗證成功,快來體驗平台的特色功能! - - : - +

    +
    + +
    + + ) : ( + <> +

    我們會公開你的個人檔案,填寫完整的資料,才能讓其他夥伴們更了解你喔! - - } -

    -
    - { - isComplete ? - - : - <> +

    +
    - - } -
    +
    + + ) + } @@ -235,4 +151,87 @@ const ThemeComponentWrap = ({ pageProps, Component }) => { ); }; +const App = ({ Component, pageProps }) => { + const router = useRouter(); + useEffect(() => { + initGA('UA-181407006-3'); + // `routeChangeComplete` won't run for the first page load unless the query string is + // hydrated later on, so here we log a page view if this is the first render and + // there's no query string + if (!router.asPath.includes('?')) { + logPageView(); + } + }, []); + + useEffect(() => { + // Listen for page changes after a navigation or when the query changes + router.events.on('routeChangeComplete', logPageView); + return () => { + router.events.off('routeChangeComplete', logPageView); + }; + }, [router.events]); + + // const [mode, setMode] = useState("light"); + // Update the theme only if the mode changes + // const theme = useMemo(() => themeFactory(mode), [mode]); + return ( + <> + {/* */} + + {/* */} + + {/* */} + + + + + + + + + + + + + + + + + + ); +}; + export default App; diff --git a/pages/join/index.jsx b/pages/join/index.jsx index 0756cb35..778721e0 100644 --- a/pages/join/index.jsx +++ b/pages/join/index.jsx @@ -2,14 +2,7 @@ import { useMemo } from 'react'; import { useRouter } from 'next/router'; import styled from '@emotion/styled'; -import { - Box, - Divider, - Typography, - Button, - Skeleton, - TextField, -} from '@mui/material'; +import { Divider, Typography } from '@mui/material'; import SEOConfig from '@/shared/components/SEO'; import Navigation from '@/shared/components/Navigation_v2'; import Footer from '@/shared/components/Footer_v2'; diff --git a/pages/signin/index.tsx b/pages/signin/index.tsx index 3a886948..3f3e16fe 100644 --- a/pages/signin/index.tsx +++ b/pages/signin/index.tsx @@ -32,7 +32,7 @@ function SignInPage() { }; return ( - + {step === 1 && ( { +const IntroList = ({ list }) => { return ( - {/*

    {title}

    */}
      {list.map(({ name, link, target }) => (
    • diff --git a/shared/components/MarkdownEditor/MarkdownEditor.jsx b/shared/components/MarkdownEditor/MarkdownEditor.jsx index e47b1b43..b60ba546 100644 --- a/shared/components/MarkdownEditor/MarkdownEditor.jsx +++ b/shared/components/MarkdownEditor/MarkdownEditor.jsx @@ -85,7 +85,7 @@ function InternalMarkdownEditor( } return true; }) - .map(([_, plugin]) => plugin), + .map(([, plugin]) => plugin), [markdown.current] ); diff --git a/shared/components/Mode/index.jsx b/shared/components/Mode/index.jsx index 4edb0ed1..ac257351 100644 --- a/shared/components/Mode/index.jsx +++ b/shared/components/Mode/index.jsx @@ -1,7 +1,4 @@ import { DarkMode, LightMode } from '@mui/icons-material'; -import React, { useCallback } from 'react'; -import { useRouter } from 'next/router'; -import styled from '@emotion/styled'; import { Box } from '@mui/material'; import { useDispatch, useSelector } from 'react-redux'; import { changeMode } from '../../../redux/actions/theme'; diff --git a/shared/components/Navigation_v2/MainNav/Hamberger/MarathonList/index.jsx b/shared/components/Navigation_v2/MainNav/Hamberger/MarathonList/index.jsx index 5b6775d3..46a680db 100644 --- a/shared/components/Navigation_v2/MainNav/Hamberger/MarathonList/index.jsx +++ b/shared/components/Navigation_v2/MainNav/Hamberger/MarathonList/index.jsx @@ -3,7 +3,6 @@ import { keyframes, css } from '@emotion/react'; import styled from '@emotion/styled'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; -import useMediaQuery from '@mui/material/useMediaQuery'; import { Box, MenuItem } from '@mui/material'; import { useRouter } from 'next/router'; diff --git a/shared/components/Navigation_v2/MainNav/Hamberger/MenuItem.jsx b/shared/components/Navigation_v2/MainNav/Hamberger/MenuItem.jsx index 6d158123..13427684 100644 --- a/shared/components/Navigation_v2/MainNav/Hamberger/MenuItem.jsx +++ b/shared/components/Navigation_v2/MainNav/Hamberger/MenuItem.jsx @@ -20,15 +20,6 @@ const slideInFrames = keyframes` } `; -const shrinkFrames = keyframes` - 0% { - width: 95%; - } - 100% { - width: 90%; - } -`; - const MenuItemWrapper = styled.li` animation: 1s ${appearFrames} forwards; ${(props) => css` diff --git a/shared/components/Navigation_v2/MainNav/List/index.jsx b/shared/components/Navigation_v2/MainNav/List/index.jsx index a31066fd..1b4a67c3 100644 --- a/shared/components/Navigation_v2/MainNav/List/index.jsx +++ b/shared/components/Navigation_v2/MainNav/List/index.jsx @@ -1,16 +1,9 @@ import React from 'react'; import styled from '@emotion/styled'; import Link from 'next/link'; -import { css, keyframes } from '@emotion/css'; import { Box } from '@mui/material'; import { NAV_LINK } from '../../../../../constants/category'; -const textclip = keyframes` - to { - background-position: 200% center; - } -`; - const LinkListWrapper = styled.ul` display: flex; justify-content: space-around; diff --git a/shared/components/Navigation_v2/MainNav/SubList/MarathonList/index.jsx b/shared/components/Navigation_v2/MainNav/SubList/MarathonList/index.jsx index a43c2c96..ebebf5fb 100644 --- a/shared/components/Navigation_v2/MainNav/SubList/MarathonList/index.jsx +++ b/shared/components/Navigation_v2/MainNav/SubList/MarathonList/index.jsx @@ -33,7 +33,7 @@ const StyledMenuItem = styled(MenuItem)` `} `; -const MarathonList = ({ onCloseMenu = () => {}, user }) => { +const MarathonList = ({ onCloseMenu = () => {} }) => { const isPadScreen = useMediaQuery('(max-width: 767px)'); const [isOpenMenu, setIsOpenMenu] = useState(null); const router = useRouter(); diff --git a/shared/components/Navigation_v2/MainNav/SubList/index.jsx b/shared/components/Navigation_v2/MainNav/SubList/index.jsx index e71e876b..10ba14db 100644 --- a/shared/components/Navigation_v2/MainNav/SubList/index.jsx +++ b/shared/components/Navigation_v2/MainNav/SubList/index.jsx @@ -1,6 +1,5 @@ import React from 'react'; import styled from '@emotion/styled'; -import Link from 'next/link'; import { Button } from '@mui/material'; import { useAuth, useAuthDispatch } from '@/contexts/Auth'; import UserAvatar from './UserAvatar'; diff --git a/shared/components/Navigation_v2/PromotionBar.jsx b/shared/components/Navigation_v2/PromotionBar.jsx index 8e5a7aaf..1cbc923a 100644 --- a/shared/components/Navigation_v2/PromotionBar.jsx +++ b/shared/components/Navigation_v2/PromotionBar.jsx @@ -1,4 +1,3 @@ -import { useState, useEffect } from 'react'; import styled from '@emotion/styled'; import Link from 'next/link'; @@ -75,7 +74,7 @@ const CloseButton = styled.span` } `; -const PromotionBar = ({ isShow, link, text, toggleAction }) => { +const PromotionBar = ({ isShow, text, toggleAction }) => { return ( <> {isShow && ( diff --git a/shared/components/Navigation_v2/index.jsx b/shared/components/Navigation_v2/index.jsx index 4bffd4af..519389a7 100644 --- a/shared/components/Navigation_v2/index.jsx +++ b/shared/components/Navigation_v2/index.jsx @@ -20,26 +20,15 @@ export const NavigationWrapper = styled(AppBar)(({ hasPromote }) => ({ }, })); -const donateTexts = [ - '✨島島阿學需要你的支持,讓人人都享有同等資源✨', - '✨推廣民主教育,島島阿學需要你的支持✨', - '✨用捐款與島島阿學一同推動民主教育✨', -]; - -const buildRandomText = () => { - const randomIndex = Math.floor(Math.random() * donateTexts.length); - return donateTexts[randomIndex]; -}; - const texts = [ '✨「島島盃 - 2025 春季學習馬拉松」開跑啦!1/19 截止申請!✨', '✨參加學習馬拉松,一起為自己重新打造喜歡的學習生活吧!✨', '✨申請學習馬拉松,即可試用最新個人化功能輔助學習唷!✨', + // '✨島島阿學需要你的支持,讓人人都享有同等資源✨', + // '✨推廣民主教育,島島阿學需要你的支持✨', + // '✨用捐款與島島阿學一同推動民主教育✨', ]; -// const ToolbarWrapper = styled(Toolbar)` -// margin: 0 auto; -// `; // 問卷 https://docs.google.com/forms/d/e/1FAIpQLSeyU9-Q-kIWp5uutcik3h-RO4o5VuG6oG0m-4u1Ua18EOu3aw/viewform const Navigation = () => { const [showPromotetionBar, setShowPromotionBar] = useState(true); @@ -68,9 +57,7 @@ const Navigation = () => { text={texts[currentIndex]} toggleAction={setShowPromotionBar} /> - {/* */} - {/* */} ); diff --git a/shared/components/RelatedResources/Card/index.jsx b/shared/components/RelatedResources/Card/index.jsx index 4e2988cc..2c8ebeb3 100644 --- a/shared/components/RelatedResources/Card/index.jsx +++ b/shared/components/RelatedResources/Card/index.jsx @@ -1,4 +1,3 @@ -import React, { useEffect, useMemo, useState } from 'react'; import styled from '@emotion/styled'; import { css } from '@emotion/react'; import { Tooltip } from '@mui/material'; diff --git a/shared/components/RelatedResources/index.jsx b/shared/components/RelatedResources/index.jsx index 338cc6b5..68b5f613 100644 --- a/shared/components/RelatedResources/index.jsx +++ b/shared/components/RelatedResources/index.jsx @@ -1,8 +1,7 @@ -import React, { useEffect, useMemo, useState } from 'react'; +import React, { useEffect } from 'react'; import styled from '@emotion/styled'; -import { css } from '@emotion/react'; import { useRouter } from 'next/router'; -import { Button, Paper, Box, Stack, Typography, Skeleton } from '@mui/material'; +import { Skeleton } from '@mui/material'; import { useDispatch, useSelector } from 'react-redux'; import Marquee from 'react-fast-marquee'; import { loadRelatedResources } from '../../../redux/actions/resource'; diff --git a/shared/components/ScrollToTop/index.jsx b/shared/components/ScrollToTop/index.jsx index 39dce2c9..882b654f 100644 --- a/shared/components/ScrollToTop/index.jsx +++ b/shared/components/ScrollToTop/index.jsx @@ -1,10 +1,9 @@ import React, { useMemo } from 'react'; import styled from '@emotion/styled'; import ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'; -import { Button, Fab } from '@mui/material'; +import { Fab } from '@mui/material'; import useScrollPosition from '@react-hook/window-scroll'; import { scrollToTop } from '../../../utils/ux'; -// import { Navigation } from "@mui/icons-material"; const ScrollToTopWrapper = styled.div` position: fixed; diff --git a/shared/components/Speech/index.jsx b/shared/components/Speech/index.jsx index bb385dbe..12dc0b02 100644 --- a/shared/components/Speech/index.jsx +++ b/shared/components/Speech/index.jsx @@ -9,32 +9,11 @@ import { Button, CircularProgress, IconButton, - Typography, Box, } from '@mui/material'; -import { Clear as ClearIcon, Mic as MicIcon } from '@mui/icons-material'; +import { Clear as ClearIcon } from '@mui/icons-material'; import styled from '@emotion/styled'; -// import { CentralBlock, HorizontalBlock } from "./general"; import useUnchanger from '../../../hooks/useUnchanger'; -// import { speech as i18n } from "../i18n"; -// en - US; -// eslint-disable-next-line react/display-name -// const HorizontalBlock = forwardRef(({ children = <>, minWidth = 0, style = {}, Tag = "div", width = "auto", ...otherProps }, ref) => { -// return ( -// -// {children} -// -// ); -// }); const pulse = keyframes` 0% { diff --git a/shared/components/SurveyModal/index.jsx b/shared/components/SurveyModal/index.jsx index 833e4e5f..52c90810 100644 --- a/shared/components/SurveyModal/index.jsx +++ b/shared/components/SurveyModal/index.jsx @@ -1,7 +1,4 @@ import React, { useState } from 'react'; -import styled from '@emotion/styled'; -// import { css } from "@emotion/react"; -import { Box, Paper, Typography, Stack, Avatar } from '@mui/material'; import TextField from '@mui/material/TextField'; import Dialog from '@mui/material/Dialog'; import DialogActions from '@mui/material/DialogActions'; diff --git a/shared/components/WarmModal/index.jsx b/shared/components/WarmModal/index.jsx index 9c2fc8aa..3b88f8f9 100644 --- a/shared/components/WarmModal/index.jsx +++ b/shared/components/WarmModal/index.jsx @@ -1,7 +1,5 @@ import React, { useState } from 'react'; -import styled from '@emotion/styled'; -// import { css } from "@emotion/react"; -import { Box, Paper, Typography, Stack, Avatar } from '@mui/material'; +import { Typography } from '@mui/material'; import TextField from '@mui/material/TextField'; import Dialog from '@mui/material/Dialog'; import DialogActions from '@mui/material/DialogActions'; diff --git a/yarn.lock b/yarn.lock index 96169480..92c03690 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32,6 +32,15 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" +"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" @@ -68,6 +77,17 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== + dependencies: + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" @@ -75,6 +95,13 @@ dependencies: "@babel/types" "^7.24.7" +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== + dependencies: + "@babel/types" "^7.25.9" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" @@ -109,6 +136,19 @@ "@babel/helper-split-export-declaration" "^7.24.7" semver "^6.3.1" +"@babel/helper-create-class-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" + integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.25.9" + semver "^6.3.1" + "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da" @@ -159,6 +199,14 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" @@ -167,6 +215,14 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-module-transforms@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" @@ -178,6 +234,15 @@ "@babel/helper-split-export-declaration" "^7.24.7" "@babel/helper-validator-identifier" "^7.24.7" +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/helper-optimise-call-expression@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" @@ -185,11 +250,23 @@ dependencies: "@babel/types" "^7.24.7" +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== + dependencies: + "@babel/types" "^7.25.9" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== +"@babel/helper-plugin-utils@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + "@babel/helper-remap-async-to-generator@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7" @@ -208,6 +285,15 @@ "@babel/helper-member-expression-to-functions" "^7.24.7" "@babel/helper-optimise-call-expression" "^7.24.7" +"@babel/helper-replace-supers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" + integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/helper-simple-access@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" @@ -224,6 +310,14 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" +"@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-split-export-declaration@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" @@ -236,16 +330,31 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + "@babel/helper-validator-option@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + "@babel/helper-wrap-function@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" @@ -279,6 +388,13 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== +"@babel/parser@^7.25.9", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== + dependencies: + "@babel/types" "^7.26.3" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055" @@ -379,6 +495,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -435,6 +558,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-syntax-typescript@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" @@ -632,6 +762,14 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/helper-simple-access" "^7.24.7" +"@babel/plugin-transform-modules-commonjs@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== + dependencies: + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-modules-systemjs@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7" @@ -799,6 +937,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-typescript@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz#3d6add9c78735623317387ee26d5ada540eee3fd" + integrity sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-syntax-typescript" "^7.25.9" + "@babel/plugin-transform-unicode-escapes@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" @@ -926,6 +1075,17 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/preset-typescript@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz#4a570f1b8d104a242d923957ffa1eaff142a106d" + integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-typescript" "^7.25.9" + "@babel/regjsgen@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" @@ -954,6 +1114,15 @@ "@babel/parser" "^7.24.7" "@babel/types" "^7.24.7" +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/traverse@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" @@ -970,6 +1139,19 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.25.9": + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.3" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.24.7", "@babel/types@^7.4.4": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" @@ -979,6 +1161,14 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@babel/types@^7.25.9", "@babel/types@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.3.2", "@codemirror/autocomplete@^6.4.0", "@codemirror/autocomplete@^6.7.1": version "6.18.2" resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.2.tgz#bf3f15f1bf0fdfa3b4fac560e419adae1ece8a94" @@ -1520,6 +1710,18 @@ dependencies: eslint-visitor-keys "^3.3.0" +"@eslint-community/eslint-utils@^4.4.0": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.5.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + "@eslint-community/regexpp@^4.6.1": version "4.11.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" @@ -2886,7 +3088,7 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" -"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2974,7 +3176,7 @@ dependencies: "@types/node" "*" -"@types/semver@^7.3.12": +"@types/semver@^7.3.12", "@types/semver@^7.5.0": version "7.5.8" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== @@ -2994,6 +3196,34 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== +"@typescript-eslint/eslint-plugin@6": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@6": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" @@ -3002,11 +3232,34 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== + dependencies: + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -3020,6 +3273,33 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + "@typescript-eslint/utils@^5.10.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" @@ -3042,6 +3322,14 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" @@ -4956,6 +5244,11 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +ignore@^5.2.4: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -5355,6 +5648,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -6225,6 +6523,13 @@ mime-db@^1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -7226,6 +7531,11 @@ semver@^7.3.7: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +semver@^7.5.4: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -7686,6 +7996,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-api-utils@^1.0.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== + ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"