diff --git a/components/calender/CalenderNav.tsx b/components/calender/CalenderNav.tsx index 9fbd69f..a01e89d 100644 --- a/components/calender/CalenderNav.tsx +++ b/components/calender/CalenderNav.tsx @@ -1,34 +1,50 @@ import React, { useContext } from "react"; -import { Heading, HStack, IconButton } from "@chakra-ui/react"; +import { useRouter } from "next/router"; +import { HStack, IconButton } from "@chakra-ui/react"; import { Icon } from "@iconify/react"; -import { format } from "date-fns"; +import { sub, add, format } from "date-fns"; import { CalenderContext } from "../../contexts/CalenderContext"; +import DatePicker from "./DatePicker"; const CalenderNav = (): JSX.Element => { - const { selectedMonth, prevMonth, nextMonth } = useContext(CalenderContext); + const { selectedDate } = useContext(CalenderContext); - const currentMonth = format(selectedMonth, "LLLL uuuu"); + const router = useRouter(); + + const handleNavButtons = (direction: "next" | "prev") => { + if (direction === "next") { + const newMonth = add(selectedDate, { + months: 1, + }); + + const year = format(newMonth, "y"); + const month = format(newMonth, "L"); + + router.push(`/calendar/${year}/${month}`); + } else if (direction === "prev") { + const newMonth = sub(selectedDate, { + months: 1, + }); + + const year = format(newMonth, "y"); + const month = format(newMonth, "L"); + + router.push(`/calendar/${year}/${month}`); + } + }; return ( } - onClick={() => prevMonth()} + onClick={() => handleNavButtons("prev")} /> - - {currentMonth} - + } - onClick={() => nextMonth()} + onClick={() => handleNavButtons("next")} /> ); diff --git a/components/calender/DatePicker.tsx b/components/calender/DatePicker.tsx new file mode 100644 index 0000000..1130b08 --- /dev/null +++ b/components/calender/DatePicker.tsx @@ -0,0 +1,266 @@ +import React, { useContext, useRef, useState } from "react"; +import { useRouter } from "next/router"; +import { + Button, + FormControl, + FormErrorMessage, + FormLabel, + Heading, + HStack, + Input, + Popover, + PopoverBody, + PopoverCloseButton, + PopoverContent, + PopoverHeader, + PopoverTrigger, + VStack, +} from "@chakra-ui/react"; +import { + Formik, + // FormikHelpers, + FormikProps, + Form, + Field, + FieldProps, +} from "formik"; +import { format } from "date-fns"; +import { CalenderContext } from "../../contexts/CalenderContext"; +import FormValidateEmoji from "./FormValidateEmoji"; + +interface UpdateCalendarProps { + year: number; + month: number; + day: number; +} + +const DatePicker = (): JSX.Element => { + const { selectedDate } = useContext(CalenderContext); + + const currentMonth = format(selectedDate, "LLLL uuuu"); + + const router = useRouter(); + + const [valid, setValid] = useState(false); + + const validateDate = ( + dateString?: string | undefined + ): string | undefined => { + let dateError; + + if (dateString) { + const dateArr = dateString.split("-"); + if (dateArr.length !== 3) { + dateError = "Please select a date."; + setValid(false); + } else if (dateArr.length === 3) { + const date: UpdateCalendarProps = { + year: parseInt(dateArr[0]), + month: parseInt(dateArr[1]), + day: parseInt(dateArr[2]), + }; + + if (!/^(19|20)\d{2}$/.test(`${date.year}`)) { + dateError = "Please use a year between 1900 and 2099"; + setValid(false); + } + + if (date.month < 1 || date.month > 12) { + dateError = "Please use a month between 1 and 12"; + setValid(false); + } + + if (date.day < 1 || date.day > 31) { + dateError = "Please use a day between 1 and 31"; + setValid(false); + } + + setValid(true); + } else { + setValid(true); + } + } else if (dateString.length === 0) { + dateError = "Please select a date."; + setValid(false); + } else { + setValid(true); + } + + return dateError; + }; + + const handleSubmit = (formInput?: { date?: string }): Promise => { + return new Promise((resolve, reject) => { + if (formInput.date) { + if (!validateDate(formInput.date)) { + const dateArr = formInput.date.split("-"); + const date: UpdateCalendarProps = { + year: parseInt(dateArr[0]), + month: parseInt(dateArr[1]), + day: parseInt(dateArr[2]), + }; + + return resolve(router.push(`/calendar/${date.year}/${date.month}`)); + } else { + return reject("Error validating date."); + } + } else { + return reject("Date not provided."); + } + }); + }; + + // Field theme + const fieldTheme = { + width: "auto", + bg: "gray.900", + borderColor: "white", + _placeholder: { + color: "white", + }, + _focus: { + bg: "#000", + color: "#FFF", + borderColor: "#63b3ed", + boxShadow: "0 0 0 1px #63b3ed", + zIndex: "1", + }, + }; + + const initRef = useRef(); + + return ( + + + + + + + + {"Choose a Date"} + + + + + { + handleSubmit(data) + .then(() => { + actions.setSubmitting(false); + actions.resetForm({ + values: { + date: "", + }, + }); + }) + .catch(() => { + actions.setSubmitting(false); + }); + }} + > + {(formProps: FormikProps<{ date: string }>) => ( +
+ + + Required fields indicated with{" "} + + + + {({ field, form }: FieldProps) => ( + + + + + {"Date:"} + + + {!form.touched.date && ( + + )} + {form.errors.name && form.touched.date && ( + + )} + {!form.errors.name && form.touched.date && ( + + )} + + + {form.errors.date} + + + + )} + + + +
+ )} +
+
+
+
+ ); +}; + +export default DatePicker; diff --git a/components/calender/FormValidateEmoji.tsx b/components/calender/FormValidateEmoji.tsx new file mode 100644 index 0000000..2edbd19 --- /dev/null +++ b/components/calender/FormValidateEmoji.tsx @@ -0,0 +1,35 @@ +import React, { FC } from "react"; + +interface FormValidateEmojiProps { + type: string; +} + +const FormValidateEmoji: FC = ({ + type, +}: FormValidateEmojiProps) => { + interface Validations { + [key: string]: JSX.Element; + } + + const validations: Validations = { + Required: ( + + ❗ + + ), + Error: ( + + ❌ + + ), + Valid: ( + + ✔ + + ), + }; + + return validations[`${type}`]; +}; + +export default FormValidateEmoji; diff --git a/components/calender/Calender.tsx b/components/calender/index.tsx similarity index 74% rename from components/calender/Calender.tsx rename to components/calender/index.tsx index 98a81c4..63e77b9 100644 --- a/components/calender/Calender.tsx +++ b/components/calender/index.tsx @@ -1,10 +1,28 @@ -import React, { useContext } from "react"; +import React, { useContext, useEffect } from "react"; import { Box, HStack, SimpleGrid, Text, VStack } from "@chakra-ui/react"; import CalenderNav from "./CalenderNav"; import { CalenderContext } from "../../contexts/CalenderContext"; -const Calender = (): JSX.Element => { - const { daysOfMonth, daysOfWeek } = useContext(CalenderContext); +interface UpdateCalendarProps { + year: number; + month: number; + day: number; +} + +const Calender = (newDate?: UpdateCalendarProps): JSX.Element => { + const { daysOfMonth, daysOfWeek, setDate } = useContext(CalenderContext); + + useEffect(() => { + if (newDate) { + const { year, month, day } = newDate; + + if (year > 0 && month > 0 && day > 0) { + setDate(newDate); + } else { + console.warn("Invalid date format: ", newDate); + } + } + }, [daysOfMonth, daysOfWeek, newDate, setDate]); // Simulated user settings context const userSettings = { diff --git a/contexts/CalenderContext.tsx b/contexts/CalenderContext.tsx index dc584fd..9ebd4b4 100644 --- a/contexts/CalenderContext.tsx +++ b/contexts/CalenderContext.tsx @@ -1,5 +1,5 @@ import React, { createContext, useState, ReactNode, useEffect } from "react"; -import { endOfMonth, getDate, sub, add } from "date-fns"; +import { endOfMonth, getDate, sub, add, compareAsc } from "date-fns"; // TODO: import types type days = @@ -18,12 +18,16 @@ interface DaysOfWeek { }; } +interface UpdateCalendarProps { + year: number; + month: number; + day: number; +} interface CalenderContextState { - selectedMonth: Date; + selectedDate: Date; daysOfMonth: [number]; daysOfWeek: DaysOfWeek; - prevMonth: () => void; - nextMonth: () => void; + setDate: (date: UpdateCalendarProps) => boolean; } const CalenderContext = createContext({} as CalenderContextState); @@ -34,9 +38,9 @@ const CalenderContextProvider = ({ children: ReactNode; }): JSX.Element => { // Selected month & year - const [selectedMonth, setSelectedMonth] = useState(new Date()); + const [selectedDate, setSelectedDate] = useState(new Date()); const [endOfSelectedMonth, SetEndOfSelectedDMonth] = useState( - getDate(endOfMonth(selectedMonth)) + getDate(endOfMonth(selectedDate)) ); const [daysOfMonth, setDaysOfMonth] = useState<[number]>([0]); @@ -71,14 +75,14 @@ const CalenderContextProvider = ({ populateDays(); } } - }, [selectedMonth, endOfSelectedMonth]); + }, [selectedDate, endOfSelectedMonth]); // Update end of month. useEffect(() => { - if (endOfSelectedMonth !== getDate(endOfMonth(selectedMonth))) { - SetEndOfSelectedDMonth(getDate(endOfMonth(selectedMonth))); + if (endOfSelectedMonth !== getDate(endOfMonth(selectedDate))) { + SetEndOfSelectedDMonth(getDate(endOfMonth(selectedDate))); } - }, [selectedMonth]); + }, [selectedDate]); // Calender Layout const daysOfWeek: DaysOfWeek = { @@ -107,28 +111,26 @@ const CalenderContextProvider = ({ //TODO: Create an object of arrays that will align with the days on the week. Make two sets for each start of the week setting. // Navigation - const prevMonth = (): void => { - const newMonth = sub(selectedMonth, { - months: 1, - }); + const setDate = (input: UpdateCalendarProps): boolean => { + const { year, month: inputMonth, day } = input; - setSelectedMonth(newMonth); - }; + if (!year || !inputMonth || day < 0 || day > 31) { + return false; + } else { + const month = inputMonth - 1; + const customDate: Date = new Date(year, month, day); - const nextMonth = (): void => { - const newMonth = add(selectedMonth, { - months: 1, - }); - - setSelectedMonth(newMonth); + if (compareAsc(customDate, selectedDate) !== 0) { + setSelectedDate(customDate); + } + } }; const calenderContextValues = { - selectedMonth, + selectedDate, daysOfMonth, daysOfWeek, - prevMonth, - nextMonth, + setDate, }; return ( diff --git a/next-env.d.ts b/next-env.d.ts index 9bc3dd4..4f11a03 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,5 +1,4 @@ /// -/// /// // NOTE: This file should not be edited diff --git a/package.json b/package.json index f595b17..7979164 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "private": true, "name": "lucid-creations-media-potty-chart", "homepage": "https://lucidcreations.media/introducing-code-name-potty-chart/", - "version": "0.0.3.2-pre-alpha", + "version": "v0.0.4.0-pre-alpha", "author": { "name": "Lucid Creations Media", "url": "https://lucidcreations.media", @@ -21,8 +21,9 @@ "@emotion/styled": "^11.6.0", "@types/react": "^17.0.37", "date-fns": "^2.27.0", + "formik": "^2.2.9", "framer-motion": "^5.3.3", - "next": "12.0.4", + "next": "12.0.7", "react": "17.0.2", "react-dom": "17.0.2", "sharp": "^0.29.3" @@ -36,7 +37,7 @@ "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-react": "^7.26.1", "eslint-plugin-react-hooks": "^4.2.0", - "prettier": "^2.5.0", + "prettier": "^2.5.1", "typescript": "4.4.4" }, "packageManager": "yarn@3.1.0" diff --git a/pages/calendar/[...date].tsx b/pages/calendar/[...date].tsx new file mode 100644 index 0000000..aaa6945 --- /dev/null +++ b/pages/calendar/[...date].tsx @@ -0,0 +1,78 @@ +import React, { useEffect, useState } from "react"; +import { Box } from "@chakra-ui/react"; +import { useRouter } from "next/router"; +import ErrorPage from "next/error"; +import Calender from "../../components/calender"; +import { CalenderContextProvider } from "../../contexts/CalenderContext"; + +interface UpdateCalendarProps { + year: number; + month: number; + day: number; +} + +const DateRoute: React.FC = () => { + const router = useRouter(); + const { date: slug } = router.query; + + const [date, setDate] = useState(null); + + const validateDateInput = (dateArr: number[]): UpdateCalendarProps => { + if (!(dateArr.length >= 2) && !(dateArr.length <= 3)) { + return { + year: 0, + month: 0, + day: 0, + }; + } + + const date = { + year: 0, + month: 0, + day: 0, + }; + + if (/^(19|20)\d{2}$/.test(`${dateArr[0]}`)) { + date.year = dateArr[0]; + } + + if (dateArr[1] > 0 || dateArr[1] <= 12) { + date.month = dateArr[1]; + } + + if (dateArr[2] && (dateArr[2] > 0 || dateArr[2] <= 31)) { + date.day = dateArr[2]; + } else if (!dateArr[2]) { + date.day = 1; + } + + return date; + }; + + useEffect(() => { + if (slug && slug.length === 1 && slug[0] !== "now") { + return console.warn("improper date input"); + } + + if (slug && Array.isArray(slug) && slug.length >= 2 && slug.length <= 3) { + const parsedSlug = slug.map((e) => { + return parseInt(e); + }); + setDate({ ...validateDateInput(parsedSlug) }); + } + }, [slug]); + + if (router.isFallback) { + return ; + } + + return ( + + + + + + ); +}; + +export default DateRoute; diff --git a/pages/calendar/index.tsx b/pages/calendar/index.tsx new file mode 100644 index 0000000..7db5a70 --- /dev/null +++ b/pages/calendar/index.tsx @@ -0,0 +1,23 @@ +import React, { useEffect } from "react"; +import { useRouter } from "next/router"; +import { Box, Heading } from "@chakra-ui/react"; + +const DateRoute = () => { + const router = useRouter(); + + useEffect(() => { + if (router) { + router.push("calendar/now"); + } + }, [router]); + + return ( + + + Loading + + + ); +}; + +export default DateRoute; diff --git a/pages/index.tsx b/pages/index.tsx index 0505f2c..a0fe706 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,13 +1,25 @@ -import React from "react"; +import React, { useRef } from "react"; import { Box } from "@chakra-ui/react"; -import Calender from "../components/calender/Calender"; +import Calender from "../components/calender"; import { CalenderContextProvider } from "../contexts/CalenderContext"; +import { format } from "date-fns"; + +interface UpdateCalendarProps { + year: number; + month: number; + day: number; +} const IndexPage = (): JSX.Element => { + const date = useRef({ + year: parseInt(format(new Date(), "y")), + month: parseInt(format(new Date(), "d")), + day: parseInt(format(new Date(), "L")), + }); return ( - + ); diff --git a/theme/layout/Header.tsx b/theme/layout/Header.tsx index 8ff0105..d56a150 100644 --- a/theme/layout/Header.tsx +++ b/theme/layout/Header.tsx @@ -13,7 +13,7 @@ import MobileNav from "./MobileNav"; const Header = (): JSX.Element => { const appName = "LCM Potty Chart"; - const appVersion = "v0.0.3.2-pre-alpha"; + const appVersion = "v0.0.4.0-pre-alpha"; // Add transparency while not at the top of the page. const [transparentNavbar, setTransparentNavbar] = useState(false); diff --git a/yarn.lock b/yarn.lock index 61ba93e..7bbe5f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1201,10 +1201,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:12.0.4": - version: 12.0.4 - resolution: "@next/env@npm:12.0.4" - checksum: a7bb0bdff4a061e00b559582268f787f6f636003560f83f3624f035a9220356f50fc6ce5d1db620df5b183a40182bf5647a7bc33b15a1fb008ea7ca8e2b78d54 +"@next/env@npm:12.0.7": + version: 12.0.7 + resolution: "@next/env@npm:12.0.7" + checksum: 98258ead3fd384ead612385c89aad4f4bbcb71fdd28a2e8c8abaa7cbdc63070edb849efc859b3d45215aa5c37cb256fb8cb4958708ea2e1f4b3e968102eba93b languageName: node linkType: hard @@ -1217,16 +1217,16 @@ __metadata: languageName: node linkType: hard -"@next/polyfill-module@npm:12.0.4": - version: 12.0.4 - resolution: "@next/polyfill-module@npm:12.0.4" - checksum: 701f563ef8fbd0fb21d321713061e04e26b6ac7fd304ff0456f39495a2fd10f50539fcd5fcd22aee078993a7f7539f34e7532df4f9fa7add31aed5614daa2304 +"@next/polyfill-module@npm:12.0.7": + version: 12.0.7 + resolution: "@next/polyfill-module@npm:12.0.7" + checksum: 6bf5bd8746eb8419196160b3e7f87b30ca25499bc40b125d82677401f853c4e2adf7b7f1fdf0b686ad24293839a3b78c2b36805802330ee9d09163a1a12c8e36 languageName: node linkType: hard -"@next/react-dev-overlay@npm:12.0.4": - version: 12.0.4 - resolution: "@next/react-dev-overlay@npm:12.0.4" +"@next/react-dev-overlay@npm:12.0.7": + version: 12.0.7 + resolution: "@next/react-dev-overlay@npm:12.0.7" dependencies: "@babel/code-frame": 7.12.11 anser: 1.4.9 @@ -1246,96 +1246,96 @@ __metadata: peerDependenciesMeta: webpack: optional: true - checksum: ac54baf04117cf815f4872aba701b583312969cbf1ff882a471b8dc12c3bc5a5e2c59f530e6d97447afdf7bddc1edbf9d961b5c34b54691d13d4d0cf85a26f12 + checksum: 47caa6a8a3494f8cff9b3f212c9a3197a7c6b020cf685852248db92e4625e03f378bfbc9a39bf7b2fc0595535dfe2cfea9b00a228644ce79b36dbb4ee5cb1219 languageName: node linkType: hard -"@next/react-refresh-utils@npm:12.0.4": - version: 12.0.4 - resolution: "@next/react-refresh-utils@npm:12.0.4" +"@next/react-refresh-utils@npm:12.0.7": + version: 12.0.7 + resolution: "@next/react-refresh-utils@npm:12.0.7" peerDependencies: react-refresh: 0.8.3 webpack: ^4 || ^5 peerDependenciesMeta: webpack: optional: true - checksum: 7c1c9c32848abda86f898950f9710121200b376fd58f248403e8205c12c8934ed11f230a2adf1f3d8f8ca692a7aa6abdc536bcbf02c99a9cb93f9c2ad3d2c6cf + checksum: 04d29941089bd402fc276ad8e17195bc4636c92f9eb25cc75b3d4a81d9be128cb9917271b9ae6d2998b2e3219b80ff54a623366cd6696711664a1d4161f14bc1 languageName: node linkType: hard -"@next/swc-android-arm64@npm:12.0.4": - version: 12.0.4 - resolution: "@next/swc-android-arm64@npm:12.0.4" +"@next/swc-android-arm64@npm:12.0.7": + version: 12.0.7 + resolution: "@next/swc-android-arm64@npm:12.0.7" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:12.0.4": - version: 12.0.4 - resolution: "@next/swc-darwin-arm64@npm:12.0.4" +"@next/swc-darwin-arm64@npm:12.0.7": + version: 12.0.7 + resolution: "@next/swc-darwin-arm64@npm:12.0.7" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:12.0.4": - version: 12.0.4 - resolution: "@next/swc-darwin-x64@npm:12.0.4" +"@next/swc-darwin-x64@npm:12.0.7": + version: 12.0.7 + resolution: "@next/swc-darwin-x64@npm:12.0.7" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm-gnueabihf@npm:12.0.4": - version: 12.0.4 - resolution: "@next/swc-linux-arm-gnueabihf@npm:12.0.4" +"@next/swc-linux-arm-gnueabihf@npm:12.0.7": + version: 12.0.7 + resolution: "@next/swc-linux-arm-gnueabihf@npm:12.0.7" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:12.0.4": - version: 12.0.4 - resolution: "@next/swc-linux-arm64-gnu@npm:12.0.4" +"@next/swc-linux-arm64-gnu@npm:12.0.7": + version: 12.0.7 + resolution: "@next/swc-linux-arm64-gnu@npm:12.0.7" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:12.0.4": - version: 12.0.4 - resolution: "@next/swc-linux-arm64-musl@npm:12.0.4" +"@next/swc-linux-arm64-musl@npm:12.0.7": + version: 12.0.7 + resolution: "@next/swc-linux-arm64-musl@npm:12.0.7" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:12.0.4": - version: 12.0.4 - resolution: "@next/swc-linux-x64-gnu@npm:12.0.4" +"@next/swc-linux-x64-gnu@npm:12.0.7": + version: 12.0.7 + resolution: "@next/swc-linux-x64-gnu@npm:12.0.7" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:12.0.4": - version: 12.0.4 - resolution: "@next/swc-linux-x64-musl@npm:12.0.4" +"@next/swc-linux-x64-musl@npm:12.0.7": + version: 12.0.7 + resolution: "@next/swc-linux-x64-musl@npm:12.0.7" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:12.0.4": - version: 12.0.4 - resolution: "@next/swc-win32-arm64-msvc@npm:12.0.4" +"@next/swc-win32-arm64-msvc@npm:12.0.7": + version: 12.0.7 + resolution: "@next/swc-win32-arm64-msvc@npm:12.0.7" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:12.0.4": - version: 12.0.4 - resolution: "@next/swc-win32-ia32-msvc@npm:12.0.4" +"@next/swc-win32-ia32-msvc@npm:12.0.7": + version: 12.0.7 + resolution: "@next/swc-win32-ia32-msvc@npm:12.0.7" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:12.0.4": - version: 12.0.4 - resolution: "@next/swc-win32-x64-msvc@npm:12.0.4" +"@next/swc-win32-x64-msvc@npm:12.0.7": + version: 12.0.7 + resolution: "@next/swc-win32-x64-msvc@npm:12.0.7" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2697,6 +2697,13 @@ __metadata: languageName: node linkType: hard +"deepmerge@npm:^2.1.1": + version: 2.2.1 + resolution: "deepmerge@npm:2.2.1" + checksum: 284b71065079e66096229f735a9a0222463c9ca9ee9dda7d5e9a0545bf254906dbc7377e3499ca3b2212073672b1a430d80587993b43b87d8de17edc6af649a8 + languageName: node + linkType: hard + "define-properties@npm:^1.1.3": version: 1.1.3 resolution: "define-properties@npm:1.1.3" @@ -3425,6 +3432,23 @@ __metadata: languageName: node linkType: hard +"formik@npm:^2.2.9": + version: 2.2.9 + resolution: "formik@npm:2.2.9" + dependencies: + deepmerge: ^2.1.1 + hoist-non-react-statics: ^3.3.0 + lodash: ^4.17.21 + lodash-es: ^4.17.21 + react-fast-compare: ^2.0.1 + tiny-warning: ^1.0.2 + tslib: ^1.10.0 + peerDependencies: + react: ">=16.8.0" + checksum: f07f80eee8423b4c5560546c48c4093c47530dae7d931a4e0d947d68ae1aab94291b1bf2e99ecaa5854ee50593b415fb5724c624c787338f0577f066009e8812 + languageName: node + linkType: hard + "framer-motion@npm:^5.3.3": version: 5.3.3 resolution: "framer-motion@npm:5.3.3" @@ -3780,7 +3804,7 @@ __metadata: languageName: node linkType: hard -"hoist-non-react-statics@npm:^3.3.1": +"hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" dependencies: @@ -4349,6 +4373,13 @@ __metadata: languageName: node linkType: hard +"lodash-es@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash-es@npm:4.17.21" + checksum: 05cbffad6e2adbb331a4e16fbd826e7faee403a1a04873b82b42c0f22090f280839f85b95393f487c1303c8a3d2a010048bf06151a6cbe03eee4d388fb0a12d2 + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -4377,6 +4408,13 @@ __metadata: languageName: node linkType: hard +"lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + "loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -4414,9 +4452,10 @@ __metadata: eslint-plugin-jsx-a11y: ^6.4.1 eslint-plugin-react: ^7.26.1 eslint-plugin-react-hooks: ^4.2.0 + formik: ^2.2.9 framer-motion: ^5.3.3 - next: 12.0.4 - prettier: ^2.5.0 + next: 12.0.7 + prettier: ^2.5.1 react: 17.0.2 react-dom: 17.0.2 sharp: ^0.29.3 @@ -4678,28 +4717,28 @@ __metadata: languageName: node linkType: hard -"next@npm:12.0.4": - version: 12.0.4 - resolution: "next@npm:12.0.4" +"next@npm:12.0.7": + version: 12.0.7 + resolution: "next@npm:12.0.7" dependencies: "@babel/runtime": 7.15.4 "@hapi/accept": 5.0.2 "@napi-rs/triples": 1.0.3 - "@next/env": 12.0.4 - "@next/polyfill-module": 12.0.4 - "@next/react-dev-overlay": 12.0.4 - "@next/react-refresh-utils": 12.0.4 - "@next/swc-android-arm64": 12.0.4 - "@next/swc-darwin-arm64": 12.0.4 - "@next/swc-darwin-x64": 12.0.4 - "@next/swc-linux-arm-gnueabihf": 12.0.4 - "@next/swc-linux-arm64-gnu": 12.0.4 - "@next/swc-linux-arm64-musl": 12.0.4 - "@next/swc-linux-x64-gnu": 12.0.4 - "@next/swc-linux-x64-musl": 12.0.4 - "@next/swc-win32-arm64-msvc": 12.0.4 - "@next/swc-win32-ia32-msvc": 12.0.4 - "@next/swc-win32-x64-msvc": 12.0.4 + "@next/env": 12.0.7 + "@next/polyfill-module": 12.0.7 + "@next/react-dev-overlay": 12.0.7 + "@next/react-refresh-utils": 12.0.7 + "@next/swc-android-arm64": 12.0.7 + "@next/swc-darwin-arm64": 12.0.7 + "@next/swc-darwin-x64": 12.0.7 + "@next/swc-linux-arm-gnueabihf": 12.0.7 + "@next/swc-linux-arm64-gnu": 12.0.7 + "@next/swc-linux-arm64-musl": 12.0.7 + "@next/swc-linux-x64-gnu": 12.0.7 + "@next/swc-linux-x64-musl": 12.0.7 + "@next/swc-win32-arm64-msvc": 12.0.7 + "@next/swc-win32-ia32-msvc": 12.0.7 + "@next/swc-win32-x64-msvc": 12.0.7 acorn: 8.5.0 assert: 2.0.0 browserify-zlib: 0.2.0 @@ -4741,12 +4780,12 @@ __metadata: use-subscription: 1.5.1 util: 0.12.4 vm-browserify: 1.1.2 - watchpack: 2.1.1 + watchpack: 2.3.0 peerDependencies: fibers: ">= 3.1.0" node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 - react: ^17.0.2 || ^18.0.0 - react-dom: ^17.0.2 || ^18.0.0 + react: ^17.0.2 || ^18.0.0-0 + react-dom: ^17.0.2 || ^18.0.0-0 sass: ^1.3.0 dependenciesMeta: "@next/swc-android-arm64": @@ -4780,7 +4819,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: b9711e7d4242daaaffce72bfc4dce1d0107e0f48f03fd43190f2d81b8bb08f0c34d6ef0cf1f69885dc73a786a61cf0a7d06c2296c389dbb2dba5ddd66c38127b + checksum: 78a0ebd697b71e76f4ffaf6ba093390a16a15a750978acfc976cb32759bee18b5da82e8d2fc0170135105bb55c8c5fe86f7cbd0d45ab5b7255161d57deafa93f languageName: node linkType: hard @@ -5266,12 +5305,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.5.0": - version: 2.5.0 - resolution: "prettier@npm:2.5.0" +"prettier@npm:^2.5.1": + version: 2.5.1 + resolution: "prettier@npm:2.5.1" bin: prettier: bin-prettier.js - checksum: aad1b35b73e7c14596d389d90977a83dad0db689ba5802a0ef319c357b7867f55b885db197972aa6a56c30f53088c9f8e0d7f7930ae074c275a4e9cbe091d21d + checksum: 21b9408476ea1c544b0e45d51ceb94a84789ff92095abb710942d780c862d0daebdb29972d47f6b4d0f7ebbfb0ffbf56cc2cfa3e3e9d1cca54864af185b15b66 languageName: node linkType: hard @@ -5454,6 +5493,13 @@ __metadata: languageName: node linkType: hard +"react-fast-compare@npm:^2.0.1": + version: 2.0.4 + resolution: "react-fast-compare@npm:2.0.4" + checksum: 06046595f90a4e3e3a56f40a8078c00aa71bdb064ddb98343f577f546aa22e888831fd45f009c93b34707cc842b4c637737e956fd13d6f80607ee92fb9cf9a1c + languageName: node + linkType: hard + "react-focus-lock@npm:2.5.2": version: 2.5.2 resolution: "react-focus-lock@npm:2.5.2" @@ -6303,6 +6349,13 @@ __metadata: languageName: node linkType: hard +"tiny-warning@npm:^1.0.2": + version: 1.0.3 + resolution: "tiny-warning@npm:1.0.3" + checksum: da62c4acac565902f0624b123eed6dd3509bc9a8d30c06e017104bedcf5d35810da8ff72864400ad19c5c7806fc0a8323c68baf3e326af7cb7d969f846100d71 + languageName: node + linkType: hard + "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -6354,7 +6407,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.0.0, tslib@npm:^1.8.1, tslib@npm:^1.9.3": +"tslib@npm:^1.0.0, tslib@npm:^1.10.0, tslib@npm:^1.8.1, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd @@ -6564,13 +6617,13 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:2.1.1": - version: 2.1.1 - resolution: "watchpack@npm:2.1.1" +"watchpack@npm:2.3.0": + version: 2.3.0 + resolution: "watchpack@npm:2.3.0" dependencies: glob-to-regexp: ^0.4.1 graceful-fs: ^4.1.2 - checksum: 4a2d7ed1b441814b232db9c065beaee40ad0e37f77279331d663fa950b6b1926210a8dfa6009dc806b248f15d48826c9c6ce1a7fd6e6c94178d13c6c0a33f32c + checksum: 54f577fe311ae6130b43c3202ddc5c66ea8cdc5e0569b6e1dbccf5c0f5f4f8d4d00b7b97f6ae6d53e9361766bf0dc4e6dc7b30e57392948af9795217f6d9d7a7 languageName: node linkType: hard