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"