diff --git a/components/sample-rhdevs-website/FilterFunction/FilterBar.tsx b/components/sample-rhdevs-website/FilterFunction/FilterBar.tsx new file mode 100644 index 0000000..116a5c8 --- /dev/null +++ b/components/sample-rhdevs-website/FilterFunction/FilterBar.tsx @@ -0,0 +1,129 @@ +import { useState } from 'react' +import dayjs from 'dayjs' + +const isSameOrAfter = require('dayjs/plugin/isSameOrAfter') +const isSameOrBefore = require('dayjs/plugin/isSameOrBefore') + +dayjs.extend(isSameOrAfter) +dayjs.extend(isSameOrBefore) + +function FilterBar({ + ccaList, + onNameFilter, + onTypeFilter, + onTagFilter, + onCcaFilter, + onStartFilter, + onEndFilter, +}) { + const [filters, setFilters] = useState({ + name: '', + type: '', + tags: '', + startTime: '', + endTime: '', + cca: '', + }) + + const handleInput = (field) => (event) => { + const { value } = event.target + + setFilters({ + ...filters, + [field]: value, + }) + + switch (field) { + case 'name': + onNameFilter(value) + break + case 'type': + onTypeFilter(value) + break + case 'tags': + onTagFilter(value) + break + case 'startTime': + onStartFilter(value) + break + case 'endTime': + onEndFilter(value) + break + case 'cca': + onCcaFilter(value) + break + } + } + + return ( +
+
+

Filters

+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+
+ ) +} + +export default FilterBar diff --git a/components/sample-rhdevs-website/FilterFunction/FilterFunction.css b/components/sample-rhdevs-website/FilterFunction/FilterFunction.css new file mode 100644 index 0000000..b741508 --- /dev/null +++ b/components/sample-rhdevs-website/FilterFunction/FilterFunction.css @@ -0,0 +1,5 @@ +.filter-area{ + width: 100%; + background-color: white; + padding: 2px 20px; +} \ No newline at end of file diff --git a/components/sample-rhdevs-website/FilterFunction/FilterFunctionID.tsx b/components/sample-rhdevs-website/FilterFunction/FilterFunctionID.tsx new file mode 100644 index 0000000..7cda1e1 --- /dev/null +++ b/components/sample-rhdevs-website/FilterFunction/FilterFunctionID.tsx @@ -0,0 +1,21 @@ +import React from 'react' +import '@/components/FilterFunction.css' + +function FilterFunction(props) { + function onFilterValueChanged(event) { + console.log(event.target.value) + props.filterValueSelected(event.target.value) + } + + return ( +
+ +
+ ) +} + +export default FilterFunction diff --git a/package.json b/package.json index 2671cd6..9d37ec7 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next lint && next dev", + "dev": "next dev", "build": "next build", "start": "next build && npm run open-browser && next start", "lint": "next lint" @@ -11,16 +11,21 @@ "dependencies": { "@ant-design/icons": "^5.0.1", "@next/font": "13.1.6", + "@reduxjs/toolkit": "^1.9.3", "@types/node": "18.11.18", "@types/react": "18.0.27", "@types/react-dom": "18.0.10", - "@typescript-eslint/eslint-plugin": "^5.51.0", "antd": "^5.1.7", "axios": "^1.2.6", + "next": "13.1.6", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.43.0", + "react-redux": "^8.0.5", + "redux": "^4.2.1", + "redux-devtools-extension": "^2.13.9", + "redux-thunk": "^2.4.2", "react-scroll-parallax": "^3.3.2", "sharp": "^0.31.3", "styled-components": "^5.3.6", diff --git a/store/endpoints.ts b/store/endpoints.ts new file mode 100644 index 0000000..86c3bda --- /dev/null +++ b/store/endpoints.ts @@ -0,0 +1,265 @@ +//https://docs.google.com/spreadsheets/d/1_txnmuoX-rZVrHhZki4wNCBfSZQN3J86lN-PXw1xS4g/edit#gid=328274554 +import axios from 'axios' + +export enum ENDPOINTS { + // AUTH + LOGIN = '/login', + IS_LOGGEDIN = '/protected', + REGISTER = '/register', + FORGET_PASSWORD = '/forgot', + RESET_PASSWORD = '/reset', + + // USERS + TELEGRAM_HANDLE = '/users/telegramID', //TODO make backend + USER = '/user', + USER_PROFILE = '/profile', + USER_PROFILE_PICTURE = '/profile/picture', + EDIT_PROFILE = '/profiles', + USER_CCAS = '/user_CCA', + FRIEND = '/friend', + + // FACILITY + FACILITY_LIST = '/facilities', + FACILITY = '/facilities', + FACILITY_BOOKING = '/bookings/facility', + BOOKING = '/bookings', + VIEW_BOOKING = '/bookings', + USER_BOOKINGS = '/bookings/user', + JCRC_BLOCKOUT = '/bookings/blockout', + + // LAUNDRY + MACHINE_LIST = '/location', + LAUNDRY_MACHINE = '/laundry/machine', + UPDATE_MACHINE = '/laundry/machine', + EDIT_DURATION = '/laundry/machine/editDuration', + + // SCHEDULING + USER_TIMETABLE = '/timetable/all', + ALL_USERS = '/user/all', + USER_PERMISSION = '/permissions', + + ALL_EVENTS = '/event/all', + GET_EVENT_BY_EVENTID = '/event/eventID', + GET_EVENT_BY_CCAID = '/event/ccaID', + GET_PUBLIC_EVENTS = '/event/public', + ALL_PUBLIC_EVENTS = '/event/public/all', + ALL_PUBLIC_EVENTS_AFTER_SPECIFIC_TIME = '/event/public/afterTime', + USER_PRIVATE_EVENTS_AFTER_SPECIFIC_TIME = '/event/private', + USER_EVENT = '/user_event', + ADD_EVENT = '/event/add', + DELETE_EVENT = '/event/delete', + RSVP_EVENT = '/user_event', + EDIT_EVENT = '/event/edit', + + ADD_MODS = '/nusmods/addNUSMods', + DELETE_NUSMODS_EVENT = '/nusmods/deleteMod', + DELETE_MODS = '/nusmods/delete', + NUSMODS = '/nusmods', + + USER_LESSON = 'user_lesson', + LESSON_DETAILS = '/lesson', + + CCA_DETAILS = '/cca', + ALL_CCAS = '/cca', + CCA_MEMBER = '/user_CCA', + + EVENT_DETAILS = '/event', + + // FRIENDS + ALL_FRIENDS = '/friend', + + // SOCIAL + ALL_PROFILES = '/profiles', + OFFICIAL_POSTS = '/posts/official', + ALL_POSTS = '/posts', + FRIENDS_OF_USER_POSTS = '/posts/friend', + SPECIFIC_POST = '/posts', + DELETE_POST = '/posts', + EDIT_POST = '/posts', + CREATE_POSTS = '/posts', + + // HOME + SEARCH = '/search', + + // SUPPER + GET_SUPPER_NOTIFICATIONS = '/user', + CLOSE_SUPPER_NOTIFICATIONS = '/user', + ALL_RESTAURANTS = '/restaurants', + GET_RESTAURANT = '/restaurant', + GET_RESTAURANT_MENU = '/restaurant', + GET_MENU_FOOD = '/restaurant/food', + ADD_FOOD = '/order', + GET_FOOD = '/order', + EDIT_FOOD = '/order', + DELETE_FOOD = '/order', + GET_COLLATED_ORDER = '/supperGroup', + GET_USER_ORDER = '/supperGroup', + ALL_SUPPER_GROUPS = '/supperGroup', + ADD_SUPPER_GROUP = '/supperGroup', + GET_SUPPER_GROUP_BY_ID = '/supperGroup', + CREATE_ORDER = '/order', + UPDATE_SUPPER_GROUP = '/supperGroup', + DELETE_SUPPER_GROUP = '/supperGroup', + GET_ORDER_BY_ID = '/order', + UPDATE_ORDER_DETAILS = '/order', + DELETE_ORDER = '/order', + GET_ORDER_HISTORY = '/user', + GET_SUPPER_GROUP_HISTORY = '/user', + GET_JOINED_SUPPER_GROUP_HISTORY = '/user', + UPDATE_SUPPER_GROUP_PAYMENT_STATUS = '/supperGroup', + LEAVE_SUPPER_GROUP = '/supperGroup', + GET_OWNER_EDITS = '/order', + UPDATE_OWNER_EDITS = '/supperGroup', + + // GYM + GET_GYM_HISTORY = '/', + GET_GYM_STATUS = '/status', + GET_PROFILE_PICTURE = '/keyHolder/profilepic', + MOVE_KEY = '/movekey', + RETURN_KEY = '/returnkey', + TOGGLE_GYM = '/togglegym', +} + +export enum DOMAINS { + FACILITY = 'facility', + EVENT = 'event', + LAUNDRY = 'laundry', + SOCIAL = 'social', + AUTH = 'auth', + SUPPER = 'supper', + GYM = 'gym', +} + +export const DOMAIN_URL = { + FACILITY: + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/facilities' + : '//rhappmiddleware.herokuapp.com/rhappfacilities', + EVENT: + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/scheduling' + : '//rhappmiddleware.herokuapp.com/rhappevents', + LAUNDRY: + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/laundry' + : '//rhappmiddleware.herokuapp.com/rhapplaundry', + SOCIAL: + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/social' + : '//rhappmiddleware.herokuapp.com/rhappsocial', + AUTH: + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/auth' + : '//rhappmiddleware.herokuapp.com/rhappauth', + SUPPER: + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/supper' + : '//rhappmiddleware.herokuapp.com/rhappsupper', + GYM: + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/gym' + : '//rhappmiddleware.herokuapp.com/rhappgym', +} + +async function makeRequest( + url: string, + domain: DOMAINS, + method: 'get' | 'post' | 'delete' | 'put', + additionalHeaders: Record = {}, + requestBody: Record = {}, +) { + let DOMAIN_URL_REQ: string + switch (domain) { + case DOMAINS.FACILITY: + DOMAIN_URL_REQ = + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/facilities' + : '//rhappmiddleware.herokuapp.com/rhappfacilities' + break + case DOMAINS.EVENT: + DOMAIN_URL_REQ = + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/scheduling' + : '//rhappmiddleware.herokuapp.com/rhappevents' + break + case DOMAINS.LAUNDRY: + DOMAIN_URL_REQ = + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/laundry' + : '//rhappmiddleware.herokuapp.com/rhappsocial' + break + case DOMAINS.SOCIAL: + DOMAIN_URL_REQ = + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/social' + : '//rhappmiddleware.herokuapp.com/rhappsocial' + break + case DOMAINS.AUTH: + DOMAIN_URL_REQ = + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/auth' + : '//rhappmiddleware.herokuapp.com/rhappauth' + break + case DOMAINS.SUPPER: + DOMAIN_URL_REQ = + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/supper' + : '//rhappmiddleware.herokuapp.com/rhappsupper' + break + case DOMAINS.GYM: + DOMAIN_URL_REQ = + process.env.REACT_APP_MODE === 'production' + ? '//rhapp-backend.rhdevs.repl.co/gym' + : '//rhappmiddleware.herokuapp.com/rhappgym' + break + } + return axios({ + method: method, + url: DOMAIN_URL_REQ + url, + headers: { + 'Access-Control-Allow-Origin': '*', + ...additionalHeaders, + }, + data: requestBody, + // withCredentials: true, + validateStatus: (status) => { + return status >= 200 && status < 400 + }, + }).then((response) => response.data) +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type ResponsePromise = Promise + +export function get(endpoint: ENDPOINTS, domain: DOMAINS, subRoute = ''): ResponsePromise { + return makeRequest(endpoint + subRoute, domain, 'get') +} + +export function post( + endpoint: ENDPOINTS, + domain: DOMAINS, + requestBody: Record, + additionalHeaders: Record = {}, + subRoute = '', +): ResponsePromise { + return makeRequest(endpoint + subRoute, domain, 'post', additionalHeaders, requestBody) +} + +export function del( + endpoint: ENDPOINTS, + domain: DOMAINS, + additionalHeaders: Record = {}, + subRoute = '', +): ResponsePromise { + return makeRequest(endpoint + subRoute, domain, 'delete', additionalHeaders) +} + +export function put( + endpoint: ENDPOINTS, + domain: DOMAINS, + requestBody: Record, + additionalHeaders: Record = {}, + subRoute = '', +): ResponsePromise { + return makeRequest(endpoint + subRoute, domain, 'put', additionalHeaders, requestBody) +} diff --git a/store/index.ts b/store/index.ts new file mode 100644 index 0000000..a85cfb0 --- /dev/null +++ b/store/index.ts @@ -0,0 +1,11 @@ +import userReducer from './user/reducer' + +import { configureStore } from '@reduxjs/toolkit' + +const store = configureStore({ + reducer: { + user: userReducer, + }, +}) + +export default store diff --git a/store/types.d.ts b/store/types.d.ts new file mode 100644 index 0000000..8f9e3f4 --- /dev/null +++ b/store/types.d.ts @@ -0,0 +1,9 @@ +import { useSelector, useDispatch, TypedUseSelectorHook } from 'react-redux' +import type { ThunkAction, AnyAction } from '@reduxjs/toolkit' + +export const useAppSelector: TypedUseSelectorHook = useSelector +export const useAppDispatch = () => useDispatch() + +export type RootState = ReturnType +export type AppDispatch = typeof store.dispatch +export type AppThunk = ThunkAction diff --git a/store/user/action.ts b/store/user/action.ts new file mode 100644 index 0000000..a557137 --- /dev/null +++ b/store/user/action.ts @@ -0,0 +1,37 @@ +import { ICredentials, IStar, IUser, initialUserState } from './types' +// import { setUser } from './reducer' +// import authService from '../../services/auth' +// import { AppThunk } from '..' +// import type { PayloadAction } from '@reduxjs/toolkit' + +// export const acSetUser = (user: IUser): AppThunk>> => { +// return async (dispatch) => { +// return dispatch(setUser(user)) +// } +// } +// export const acUserUpdateProfile = (user: FormData): AppThunk>> => { +// return async (dispatch) => { +// const updatedUser: IUser = await authService.update(user) +// return dispatch(setUser(updatedUser)) +// } +// } +// export const acUserLogin = (credentials: ICredentials): AppThunk>> => { +// return async (dispatch) => { +// const user: IUser = await authService.login(credentials) +// return dispatch(setUser(user)) +// } +// } +// export const acUserLogout = (): AppThunk>> => { +// return async (dispatch) => { +// await authService.logout() +// return dispatch(setUser(initialUserState)) +// } +// } +// export const acUserSignUp = ( +// credentials: ICredentials, +// ): AppThunk>> => { +// return async (dispatch) => { +// const user: IUser = await authService.signup(credentials) +// return dispatch(setUser(user)) +// } +// } diff --git a/store/user/reducer.ts b/store/user/reducer.ts new file mode 100644 index 0000000..e85d836 --- /dev/null +++ b/store/user/reducer.ts @@ -0,0 +1,16 @@ +import { IUser, initialUserState } from './types' +import { createSlice } from '@reduxjs/toolkit' +import type { PayloadAction } from '@reduxjs/toolkit' + +const userSlice = createSlice({ + name: 'user', + initialState: initialUserState, + reducers: { + setUser(state, action: PayloadAction) { + return action.payload + }, + }, +}) +export const { setUser } = userSlice.actions + +export default userSlice.reducer diff --git a/store/user/types.ts b/store/user/types.ts new file mode 100644 index 0000000..daa73e2 --- /dev/null +++ b/store/user/types.ts @@ -0,0 +1,34 @@ +export interface ICredentials { + email: string + password: string + username?: string +} + +export interface IStar { + id: number + user_id: number + post_id: number +} + +export interface IUser { + id: number + email: string + username: string + profile_picture: string + stars: IStar[] + bio: string + admin_level: number + created_at: string +} + +//-1 is used as the default id for an empty IUser object as database ids are non-negative +export const initialUserState: IUser = { + id: -1, + email: '', + username: '', + profile_picture: '', + stars: [], + bio: '', + admin_level: -1, + created_at: '', +} diff --git a/texts/common/dummyEventList.ts b/texts/common/dummyEventList.ts new file mode 100644 index 0000000..2e162a4 --- /dev/null +++ b/texts/common/dummyEventList.ts @@ -0,0 +1,57 @@ +// use these values for testing purposes + +export type Event = { + id: number + startTime: Date + endTime: Date + name: string + description: string + type: 'event' | 'fundraiser' | 'announcement' + tags: 'sports' | 'culture' | 'committee' | 'general' + signUpLink?: string + cca: string // TODO: replace with CCA type + } + + let eventList = [ + { + id: 1, + startTime: new Date('2021-02-14T12:00:00'), + endTime: new Date('2021-02-14T13:00:00'), + name: 'RC SP Valentines Fundraiser', + description: ` + Still thinking of what to get your friends or that special someone for VALENTINES DAY? RVC SP got you!!! + With a wide assortment of gifts from fresh flowers and preserved flowers , there's bound to be something for everyone! + As all stocks are limited, fill up the pre order form HERE to get FIRST DIBS on your items! + + P.S. Due to unforeseen circumstances, our crochet flowers will not be sold anymore but fret not! + The other options are still available so faster PREORDER NOWWWW + + All profits will be channelled to support the welfare of our beneficiaries so DONT WAIT ANYMORE!!! + Show your love to your friends/ boo and do a good deed today! + `, + type: 'fundraiser', + tags: 'culture', + signUpLink: 'https://google.com', + cca: 'Raffles Volunteer Corps', + }, + { + id: 2, + startTime: new Date('2021-02-14T12:00:00'), + endTime: new Date('2021-02-14T13:00:00'), + name: 'Animal Therapy', + description: ` + Already behind on school work and feeling stressed? Or love animals and want to interact with cute dogs? + RVC SP X HeaRHtfelt X RHSafe X AnG presents ANIMAL THERAPY + + Come down to interact with cute dogs from Animals Lovers League (ALL) and de-stress! + There will be other booths such as nail painting , jagua ink drawing and a customised key chain booth. + Proceeds from these booths will go directly to the animal shelter we are working with + `, + type: 'event', + tags: 'general', + cca: 'Raffles Volunteer Corps', + } + ] + +export default eventList + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 9ba0e00..ce9d172 100644 --- a/yarn.lock +++ b/yarn.lock @@ -137,6 +137,13 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.12.1", "@babel/runtime@^7.9.2": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + "@babel/template@^7.18.10": version "7.20.7" resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" @@ -428,6 +435,16 @@ rc-trigger "^5.3.4" rc-util "^5.24.4" +"@reduxjs/toolkit@^1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.3.tgz#27e1a33072b5a312e4f7fa19247fec160bbb2df9" + integrity sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg== + dependencies: + immer "^9.0.16" + redux "^4.2.0" + redux-thunk "^2.4.2" + reselect "^4.1.7" + "@rushstack/eslint-patch@^1.1.3": version "1.2.0" resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz" @@ -440,7 +457,7 @@ dependencies: tslib "^2.4.0" -"@types/hoist-non-react-statics@*": +"@types/hoist-non-react-statics@*", "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== @@ -503,14 +520,19 @@ "@types/react" "*" csstype "^3.0.2" -"@typescript-eslint/eslint-plugin@^5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz#da3f2819633061ced84bb82c53bba45a6fe9963a" - integrity sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ== +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + +"@typescript-eslint/eslint-plugin@^5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz#0c5091289ce28372e38ab8d28e861d2dbe1ab29e" + integrity sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew== dependencies: - "@typescript-eslint/scope-manager" "5.51.0" - "@typescript-eslint/type-utils" "5.51.0" - "@typescript-eslint/utils" "5.51.0" + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/type-utils" "5.54.1" + "@typescript-eslint/utils" "5.54.1" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" @@ -537,21 +559,21 @@ "@typescript-eslint/types" "5.49.0" "@typescript-eslint/visitor-keys" "5.49.0" -"@typescript-eslint/scope-manager@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz#ad3e3c2ecf762d9a4196c0fbfe19b142ac498990" - integrity sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ== +"@typescript-eslint/scope-manager@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz#6d864b4915741c608a58ce9912edf5a02bb58735" + integrity sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg== dependencies: - "@typescript-eslint/types" "5.51.0" - "@typescript-eslint/visitor-keys" "5.51.0" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" -"@typescript-eslint/type-utils@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz#7af48005531700b62a20963501d47dfb27095988" - integrity sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ== +"@typescript-eslint/type-utils@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz#4825918ec27e55da8bb99cd07ec2a8e5f50ab748" + integrity sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g== dependencies: - "@typescript-eslint/typescript-estree" "5.51.0" - "@typescript-eslint/utils" "5.51.0" + "@typescript-eslint/typescript-estree" "5.54.1" + "@typescript-eslint/utils" "5.54.1" debug "^4.3.4" tsutils "^3.21.0" @@ -560,10 +582,10 @@ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz" integrity sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg== -"@typescript-eslint/types@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.51.0.tgz#e7c1622f46c7eea7e12bbf1edfb496d4dec37c90" - integrity sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw== +"@typescript-eslint/types@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c" + integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw== "@typescript-eslint/typescript-estree@5.49.0": version "5.49.0" @@ -578,29 +600,29 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz#0ec8170d7247a892c2b21845b06c11eb0718f8de" - integrity sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA== +"@typescript-eslint/typescript-estree@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz#df7b6ae05fd8fef724a87afa7e2f57fa4a599be1" + integrity sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg== dependencies: - "@typescript-eslint/types" "5.51.0" - "@typescript-eslint/visitor-keys" "5.51.0" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.51.0.tgz#074f4fabd5b12afe9c8aa6fdee881c050f8b4d47" - integrity sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw== +"@typescript-eslint/utils@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34" + integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.51.0" - "@typescript-eslint/types" "5.51.0" - "@typescript-eslint/typescript-estree" "5.51.0" + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/typescript-estree" "5.54.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" @@ -613,12 +635,12 @@ "@typescript-eslint/types" "5.49.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz#c0147dd9a36c0de758aaebd5b48cae1ec59eba87" - integrity sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ== +"@typescript-eslint/visitor-keys@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz#d7a8a0f7181d6ac748f4d47b2306e0513b98bf8b" + integrity sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg== dependencies: - "@typescript-eslint/types" "5.51.0" + "@typescript-eslint/types" "5.54.1" eslint-visitor-keys "^3.3.0" acorn-jsx@^5.3.2: @@ -806,6 +828,11 @@ axios@^1.2.6: version "1.3.0" resolved "https://registry.npmjs.org/axios/-/axios-1.3.0.tgz" integrity sha512-oCye5nHhTypzkdLIvF9SaHfr8UAquqCn1KY3j8vsrjeol8yohAdGxIpRPbF1bOLsx33HOAatdfMX1yzsj2cHwg== + + + + + dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -1289,10 +1316,10 @@ eslint-config-next@13.1.6: eslint-plugin-react "^7.31.7" eslint-plugin-react-hooks "^4.5.0" -eslint-config-prettier@^8.6.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" - integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== +eslint-config-prettier@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz#f1cc58a8afebc50980bd53475451df146c13182d" + integrity sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA== eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: version "0.3.7" @@ -1831,7 +1858,7 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -1848,6 +1875,11 @@ ignore@^5.2.0: resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +immer@^9.0.16: + version "9.0.19" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.19.tgz#67fb97310555690b5f9cd8380d38fc0aabb6b38b" + integrity sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ== + import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" @@ -2926,6 +2958,22 @@ react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-redux@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.0.5.tgz#e5fb8331993a019b8aaf2e167a93d10af469c7bd" + integrity sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw== + dependencies: + "@babel/runtime" "^7.12.1" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/use-sync-external-store" "^0.0.3" + hoist-non-react-statics "^3.3.2" + react-is "^18.0.0" + use-sync-external-store "^1.0.0" react-scroll-parallax@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/react-scroll-parallax/-/react-scroll-parallax-3.3.2.tgz#e6acae262c22d44244739fc9486f11a43f199fff" @@ -2949,6 +2997,23 @@ readable-stream@^3.1.1, readable-stream@^3.4.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +redux-devtools-extension@^2.13.9: + version "2.13.9" + resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz#6b764e8028b507adcb75a1cae790f71e6be08ae7" + integrity sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A== + +redux-thunk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" + integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== + +redux@^4.2.0, redux@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" + integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== + dependencies: + "@babel/runtime" "^7.9.2" + regenerator-runtime@^0.13.11: version "0.13.11" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" @@ -2973,6 +3038,11 @@ regexpp@^3.2.0: resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +reselect@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.7.tgz#56480d9ff3d3188970ee2b76527bd94a95567a42" + integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== + resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz" @@ -3409,6 +3479,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +use-sync-external-store@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"