From 1a934f0abc965852208cdf854bd277c08d597815 Mon Sep 17 00:00:00 2001 From: bombies Date: Wed, 1 Nov 2023 14:06:38 -0500 Subject: [PATCH] Add dream calendar --- .../components/DashboardSidebar.tsx | 0 .../components/dreams/DreamsProvider.tsx | 6 +- .../components/dreams/LogDreamCard.tsx | 2 +- .../components/dreams/card/DreamCard.tsx | 2 +- .../dreams/card/DreamCardSkeleton.tsx | 0 .../components/dreams/card/DreamModal.tsx | 2 +- .../card/view/DreamEditableAddButton.tsx | 0 .../dreams/card/view/DreamEditableChip.tsx | 0 .../components/dreams/card/view/DreamView.tsx | 8 +- .../containers/CurrentDreamsContainer.tsx | 10 +- .../dreams/containers/DreamContainer.tsx | 0 .../dreams/containers/PastDreamItem.tsx | 6 +- .../dreams/containers/PastDreamsContainer.tsx | 95 +++++++++ .../forms/characters/AddCharacterForm.tsx | 2 +- .../forms/characters/AddCharacterModal.tsx | 4 +- .../dreams/forms/log/DreamCharacterSelect.tsx | 2 +- .../dreams/forms/log/DreamTagSelect.tsx | 2 +- .../dreams/forms/log/LogDreamForm.tsx | 10 +- .../dreams/forms/log/LogDreamModal.tsx | 2 +- .../dreams/forms/tags/AddTagForm.tsx | 2 +- .../dreams/forms/tags/AddTagModal.tsx | 2 +- .../dreams/hooks/dream-api-utils.ts | 0 .../components/dreams/hooks/useDayDreams.tsx | 63 ++++++ .../dreams/hooks/useDreamCharacters.tsx | 0 .../components/dreams/hooks/useDreamTags.tsx | 0 .../components/dreams/hooks/useDreams.tsx | 0 .../dashboard/{ => (your-dreams)}/page.tsx | 4 +- .../calendar/components/Calendar.tsx | 93 --------- .../calendar/components/DreamCalendar.tsx | 189 ++++++++++++++++++ .../calendar/components/DreamCalendarDay.tsx | 113 +++++++++++ .../(internal)/dashboard/calendar/page.tsx | 6 +- .../calendar/utils/calendar-utils.ts | 27 ++- .../dreams/containers/PastDreamsContainer.tsx | 122 ----------- .../(site)/(internal)/dashboard/layout.tsx | 4 +- src/app/(site)/components/inputs/Select.tsx | 19 +- 35 files changed, 530 insertions(+), 267 deletions(-) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/DashboardSidebar.tsx (100%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/DreamsProvider.tsx (81%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/LogDreamCard.tsx (90%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/card/DreamCard.tsx (96%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/card/DreamCardSkeleton.tsx (100%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/card/DreamModal.tsx (94%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/card/view/DreamEditableAddButton.tsx (100%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/card/view/DreamEditableChip.tsx (100%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/card/view/DreamView.tsx (96%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/containers/CurrentDreamsContainer.tsx (78%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/containers/DreamContainer.tsx (100%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/containers/PastDreamItem.tsx (76%) create mode 100644 src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamsContainer.tsx rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/forms/characters/AddCharacterForm.tsx (96%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/forms/characters/AddCharacterModal.tsx (75%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/forms/log/DreamCharacterSelect.tsx (97%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/forms/log/DreamTagSelect.tsx (98%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/forms/log/LogDreamForm.tsx (93%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/forms/log/LogDreamModal.tsx (82%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/forms/tags/AddTagForm.tsx (96%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/forms/tags/AddTagModal.tsx (80%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/hooks/dream-api-utils.ts (100%) create mode 100644 src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDayDreams.tsx rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/hooks/useDreamCharacters.tsx (100%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/hooks/useDreamTags.tsx (100%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/components/dreams/hooks/useDreams.tsx (100%) rename src/app/(site)/(internal)/dashboard/{ => (your-dreams)}/page.tsx (81%) delete mode 100644 src/app/(site)/(internal)/dashboard/calendar/components/Calendar.tsx create mode 100644 src/app/(site)/(internal)/dashboard/calendar/components/DreamCalendar.tsx create mode 100644 src/app/(site)/(internal)/dashboard/calendar/components/DreamCalendarDay.tsx delete mode 100644 src/app/(site)/(internal)/dashboard/components/dreams/containers/PastDreamsContainer.tsx diff --git a/src/app/(site)/(internal)/dashboard/components/DashboardSidebar.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/DashboardSidebar.tsx similarity index 100% rename from src/app/(site)/(internal)/dashboard/components/DashboardSidebar.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/DashboardSidebar.tsx diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/DreamsProvider.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/DreamsProvider.tsx similarity index 81% rename from src/app/(site)/(internal)/dashboard/components/dreams/DreamsProvider.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/DreamsProvider.tsx index bc04ae0..0ad82b8 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/DreamsProvider.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/DreamsProvider.tsx @@ -1,11 +1,11 @@ "use client" import {FC, PropsWithChildren} from "react"; -import useDreams, {DreamsState} from "@/app/(site)/(internal)/dashboard/components/dreams/hooks/useDreams"; +import useDreams, {DreamsState} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDreams"; import useDreamCharacters, { DreamCharactersState -} from "@/app/(site)/(internal)/dashboard/components/dreams/hooks/useDreamCharacters"; -import useDreamTags, {DreamTagsState} from "@/app/(site)/(internal)/dashboard/components/dreams/hooks/useDreamTags"; +} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDreamCharacters"; +import useDreamTags, {DreamTagsState} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDreamTags"; import {createDataContext, DataContextProps} from "@/utils/client/client-data-utils"; interface DreamsContextProps extends DataContextProps { diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/LogDreamCard.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/LogDreamCard.tsx similarity index 90% rename from src/app/(site)/(internal)/dashboard/components/dreams/LogDreamCard.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/LogDreamCard.tsx index 65e4a6d..acd2be6 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/LogDreamCard.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/LogDreamCard.tsx @@ -4,7 +4,7 @@ import {FC, Fragment, useState} from "react"; import {CardBody} from "@nextui-org/card"; import CloudIcon from "@/app/(site)/components/icons/CloudIcon"; import Card from "@/app/(site)/components/Card"; -import LogDreamModal from "@/app/(site)/(internal)/dashboard/components/dreams/forms/log/LogDreamModal"; +import LogDreamModal from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/LogDreamModal"; const LogDreamCard: FC = () => { const [modalOpen, setModalOpen] = useState(false) diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/card/DreamCard.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamCard.tsx similarity index 96% rename from src/app/(site)/(internal)/dashboard/components/dreams/card/DreamCard.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamCard.tsx index fcda902..cf17f92 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/card/DreamCard.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamCard.tsx @@ -4,7 +4,7 @@ import {FC, Fragment, useCallback, useState} from "react"; import {Dream, DreamCharacter, DreamTag} from "@prisma/client"; import {CardBody, CardHeader} from "@nextui-org/card"; import Card from "@/app/(site)/components/Card"; -import DreamModal from "@/app/(site)/(internal)/dashboard/components/dreams/card/DreamModal"; +import DreamModal from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamModal"; import {OptimisticWorker} from "@/utils/client/client-data-utils"; import toast from "react-hot-toast"; import useSWRMutation from "swr/mutation"; diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/card/DreamCardSkeleton.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamCardSkeleton.tsx similarity index 100% rename from src/app/(site)/(internal)/dashboard/components/dreams/card/DreamCardSkeleton.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamCardSkeleton.tsx diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/card/DreamModal.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamModal.tsx similarity index 94% rename from src/app/(site)/(internal)/dashboard/components/dreams/card/DreamModal.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamModal.tsx index 689daa8..bbf9bb2 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/card/DreamModal.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamModal.tsx @@ -7,7 +7,7 @@ import {Divider} from "@nextui-org/divider"; import {Button} from "@nextui-org/react"; import ConfirmationModal from "@/app/(site)/components/ConfirmationModal"; import TrashIcon from "@/app/(site)/components/icons/TrashIcon"; -import DreamView from "@/app/(site)/(internal)/dashboard/components/dreams/card/view/DreamView"; +import DreamView from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/view/DreamView"; type Props = { dream: Dream, diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/card/view/DreamEditableAddButton.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/view/DreamEditableAddButton.tsx similarity index 100% rename from src/app/(site)/(internal)/dashboard/components/dreams/card/view/DreamEditableAddButton.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/view/DreamEditableAddButton.tsx diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/card/view/DreamEditableChip.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/view/DreamEditableChip.tsx similarity index 100% rename from src/app/(site)/(internal)/dashboard/components/dreams/card/view/DreamEditableChip.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/view/DreamEditableChip.tsx diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/card/view/DreamView.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/view/DreamView.tsx similarity index 96% rename from src/app/(site)/(internal)/dashboard/components/dreams/card/view/DreamView.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/view/DreamView.tsx index 6787e6e..96f6826 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/card/view/DreamView.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/view/DreamView.tsx @@ -10,12 +10,12 @@ import {Button} from "@nextui-org/button"; import {EditIcon} from "@nextui-org/shared-icons"; import toast from "react-hot-toast"; import EditableTextArea from "@/app/(site)/components/inputs/editable/EditableTextArea"; -import DreamEditableChip from "@/app/(site)/(internal)/dashboard/components/dreams/card/view/DreamEditableChip"; +import DreamEditableChip from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/view/DreamEditableChip"; import {DropdownItem, Spacer} from "@nextui-org/react"; import DreamEditableAddButton - from "@/app/(site)/(internal)/dashboard/components/dreams/card/view/DreamEditableAddButton"; -import {useDreamsData} from "@/app/(site)/(internal)/dashboard/components/dreams/DreamsProvider"; -import {FetchFullDream, UpdateDream} from "../../hooks/dream-api-utils"; + from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/view/DreamEditableAddButton"; +import {useDreamsData} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/DreamsProvider"; +import {FetchFullDream, UpdateDream} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/dream-api-utils"; type Props = { dream: Dream, diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/containers/CurrentDreamsContainer.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/CurrentDreamsContainer.tsx similarity index 78% rename from src/app/(site)/(internal)/dashboard/components/dreams/containers/CurrentDreamsContainer.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/CurrentDreamsContainer.tsx index e52c909..b2e5e7d 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/containers/CurrentDreamsContainer.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/CurrentDreamsContainer.tsx @@ -1,10 +1,10 @@ import {FC, Fragment, useMemo} from "react"; -import {useDreamsData} from "@/app/(site)/(internal)/dashboard/components/dreams/DreamsProvider"; -import DreamCard from "@/app/(site)/(internal)/dashboard/components/dreams/card/DreamCard"; -import LogDreamCard from "@/app/(site)/(internal)/dashboard/components/dreams/LogDreamCard"; +import {useDreamsData} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/DreamsProvider"; +import DreamCard from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamCard"; +import LogDreamCard from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/LogDreamCard"; import useTodayTimeRange from "@/app/(site)/hooks/time-hooks"; -import DreamCardSkeleton from "@/app/(site)/(internal)/dashboard/components/dreams/card/DreamCardSkeleton"; -import DreamContainer from "@/app/(site)/(internal)/dashboard/components/dreams/containers/DreamContainer"; +import DreamCardSkeleton from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamCardSkeleton"; +import DreamContainer from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/DreamContainer"; const CurrentDreamsContainer: FC = () => { const [startOfToday, endOfToday] = useTodayTimeRange() diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/containers/DreamContainer.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/DreamContainer.tsx similarity index 100% rename from src/app/(site)/(internal)/dashboard/components/dreams/containers/DreamContainer.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/DreamContainer.tsx diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/containers/PastDreamItem.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamItem.tsx similarity index 76% rename from src/app/(site)/(internal)/dashboard/components/dreams/containers/PastDreamItem.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamItem.tsx index 77f9216..90275c0 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/containers/PastDreamItem.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamItem.tsx @@ -1,12 +1,12 @@ "use client" import {FC, Fragment, useMemo} from "react"; -import {PastDream} from "@/app/(site)/(internal)/dashboard/components/dreams/containers/PastDreamsContainer"; -import DreamCard from "@/app/(site)/(internal)/dashboard/components/dreams/card/DreamCard"; +import {DayDreams} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamsContainer"; +import DreamCard from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamCard"; import {DreamCharacter, DreamTag} from "@prisma/client"; type Props = { - dream: PastDream, + dream: DayDreams, allCharacters: DreamCharacter[], allTags: DreamTag[], } diff --git a/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamsContainer.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamsContainer.tsx new file mode 100644 index 0000000..cf23803 --- /dev/null +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamsContainer.tsx @@ -0,0 +1,95 @@ +"use client" + +import {FC, Fragment, useMemo} from "react"; +import DreamContainer + from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/DreamContainer"; +import {useDreamsData} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/DreamsProvider"; +import {Dream} from "@prisma/client"; +import {useEndOfDay} from "@/app/(site)/hooks/time-hooks"; +import PastDreamItem from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamItem"; +import DreamCardSkeleton + from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamCardSkeleton"; +import {Divider} from "@nextui-org/divider"; +import Card from "@/app/(site)/components/Card"; +import {CardBody} from "@nextui-org/card"; +import {useRouter} from "next/navigation"; +import CloudIcon from "@/app/(site)/components/icons/CloudIcon"; +import useDayDreams from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDayDreams"; + +export type GroupedDreams = { + [K: string]: Dream[] +} + +export type DayDreams = { + timestamp: number, + dreams: Dream[] +} + +const NUMBER_OF_DAYS = 7 + +const PastDreamsContainer: FC = () => { + const router = useRouter() + const {dreams, tags, characters} = useDreamsData() + const latestDate = useEndOfDay({ + dayOffset: -1 + }) + + const pastDreams = useDayDreams({ + dreams: dreams.data, + sortMode: "descending", + dayCount: NUMBER_OF_DAYS, + latestDate + }) + + + const dreamItems = useMemo(() => pastDreams.map(dream => ( + + )), [characters.data, pastDreams, tags.data]) + + + return ( + + {dreams.loading ? ( + + + + + + ) : (dreamItems.length ? + + {dreamItems} + + router.push("/dashboard/calendar")} + isPressable + isBlurred + classNames={{ + base: "hover:scale-105", + body: "bg-secondary py-8" + }} + > + +
+ +

View All Dreams

+
+
+
+
+ : +

You have no previous + dreams for the past week...

) + } +
+ ) +} + +export default PastDreamsContainer \ No newline at end of file diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/forms/characters/AddCharacterForm.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/characters/AddCharacterForm.tsx similarity index 96% rename from src/app/(site)/(internal)/dashboard/components/dreams/forms/characters/AddCharacterForm.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/characters/AddCharacterForm.tsx index 030d505..fd6cd8f 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/forms/characters/AddCharacterForm.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/characters/AddCharacterForm.tsx @@ -5,7 +5,7 @@ import {SubmitHandler, useForm} from "react-hook-form"; import {PostDreamCharacterDto} from "@/app/api/me/dreams/dreams.dto"; import axios from "axios"; import useSWRMutation from "swr/mutation"; -import {useDreamsData} from "@/app/(site)/(internal)/dashboard/components/dreams/DreamsProvider"; +import {useDreamsData} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/DreamsProvider"; import {DreamCharacter} from "@prisma/client"; import {handleAxiosError} from "@/utils/client/client-utils"; import {useSession} from "next-auth/react"; diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/forms/characters/AddCharacterModal.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/characters/AddCharacterModal.tsx similarity index 75% rename from src/app/(site)/(internal)/dashboard/components/dreams/forms/characters/AddCharacterModal.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/characters/AddCharacterModal.tsx index 44ed397..4fef028 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/forms/characters/AddCharacterModal.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/characters/AddCharacterModal.tsx @@ -2,8 +2,8 @@ import {FC} from "react"; import Modal from "@/app/(site)/components/Modal"; -import AddTagForm from "@/app/(site)/(internal)/dashboard/components/dreams/forms/tags/AddTagForm"; -import AddCharacterForm from "@/app/(site)/(internal)/dashboard/components/dreams/forms/characters/AddCharacterForm"; +import AddTagForm from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/tags/AddTagForm"; +import AddCharacterForm from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/characters/AddCharacterForm"; type Props = { isOpen: boolean, diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/forms/log/DreamCharacterSelect.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/DreamCharacterSelect.tsx similarity index 97% rename from src/app/(site)/(internal)/dashboard/components/dreams/forms/log/DreamCharacterSelect.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/DreamCharacterSelect.tsx index 247c18b..bef2b7d 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/forms/log/DreamCharacterSelect.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/DreamCharacterSelect.tsx @@ -5,7 +5,7 @@ import Button from "@/app/(site)/components/Button"; import Select from "@/app/(site)/components/inputs/Select"; import {Chip} from "@nextui-org/chip"; import {SelectItem} from "@nextui-org/react"; -import {DreamCharactersState} from "@/app/(site)/(internal)/dashboard/components/dreams/hooks/useDreamCharacters"; +import {DreamCharactersState} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDreamCharacters"; import {UseFormRegister} from "react-hook-form"; import PlusIcon from "@/app/(site)/components/icons/PlusIcon"; diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/forms/log/DreamTagSelect.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/DreamTagSelect.tsx similarity index 98% rename from src/app/(site)/(internal)/dashboard/components/dreams/forms/log/DreamTagSelect.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/DreamTagSelect.tsx index 62101cd..8976fe3 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/forms/log/DreamTagSelect.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/DreamTagSelect.tsx @@ -6,7 +6,7 @@ import Select from "@/app/(site)/components/inputs/Select"; import {Chip} from "@nextui-org/chip"; import {SelectItem} from "@nextui-org/react"; import {UseFormRegister} from "react-hook-form"; -import {DreamTagsState} from "@/app/(site)/(internal)/dashboard/components/dreams/hooks/useDreamTags"; +import {DreamTagsState} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDreamTags"; import PlusIcon from "@/app/(site)/components/icons/PlusIcon"; type Props = { diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/forms/log/LogDreamForm.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/LogDreamForm.tsx similarity index 93% rename from src/app/(site)/(internal)/dashboard/components/dreams/forms/log/LogDreamForm.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/LogDreamForm.tsx index e969462..161fec5 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/forms/log/LogDreamForm.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/LogDreamForm.tsx @@ -6,9 +6,9 @@ import {PostDreamDto} from "@/app/api/me/dreams/dreams.dto"; import Input from "@/app/(site)/components/inputs/Input"; import TextArea from "@/app/(site)/components/inputs/TextArea"; import Button from "@/app/(site)/components/Button"; -import {useDreamsData} from "@/app/(site)/(internal)/dashboard/components/dreams/DreamsProvider"; -import DreamCharacterSelect from "@/app/(site)/(internal)/dashboard/components/dreams/forms/log/DreamCharacterSelect"; -import DreamTagSelect from "@/app/(site)/(internal)/dashboard/components/dreams/forms/log/DreamTagSelect"; +import {useDreamsData} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/DreamsProvider"; +import DreamCharacterSelect from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/DreamCharacterSelect"; +import DreamTagSelect from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/DreamTagSelect"; import {Divider} from "@nextui-org/divider"; import PencilIcon from "@/app/(site)/components/icons/PencilIcon"; import CloseIcon from "@/app/(site)/components/icons/CloseIcon"; @@ -17,8 +17,8 @@ import {Dream} from "@prisma/client"; import {handleAxiosError, postMutator} from "@/utils/client/client-utils"; import {useSession} from "next-auth/react"; import toast from "react-hot-toast"; -import AddTagModal from "@/app/(site)/(internal)/dashboard/components/dreams/forms/tags/AddTagModal"; -import AddCharacterModal from "@/app/(site)/(internal)/dashboard/components/dreams/forms/characters/AddCharacterModal"; +import AddTagModal from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/tags/AddTagModal"; +import AddCharacterModal from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/characters/AddCharacterModal"; type FormProps = Omit & { tags?: string[] | string diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/forms/log/LogDreamModal.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/LogDreamModal.tsx similarity index 82% rename from src/app/(site)/(internal)/dashboard/components/dreams/forms/log/LogDreamModal.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/LogDreamModal.tsx index 8972255..d2318eb 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/forms/log/LogDreamModal.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/LogDreamModal.tsx @@ -1,6 +1,6 @@ import {FC} from "react"; import Modal from "@/app/(site)/components/Modal"; -import LogDreamForm from "@/app/(site)/(internal)/dashboard/components/dreams/forms/log/LogDreamForm"; +import LogDreamForm from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/log/LogDreamForm"; type Props = { isOpen: boolean, diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/forms/tags/AddTagForm.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/tags/AddTagForm.tsx similarity index 96% rename from src/app/(site)/(internal)/dashboard/components/dreams/forms/tags/AddTagForm.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/tags/AddTagForm.tsx index 03f3b1d..b75378f 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/forms/tags/AddTagForm.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/tags/AddTagForm.tsx @@ -5,7 +5,7 @@ import {SubmitHandler, useForm} from "react-hook-form"; import {PostDreamTagDto} from "@/app/api/me/dreams/dreams.dto"; import axios from "axios"; import useSWRMutation from "swr/mutation"; -import {useDreamsData} from "@/app/(site)/(internal)/dashboard/components/dreams/DreamsProvider"; +import {useDreamsData} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/DreamsProvider"; import {DreamTag} from "@prisma/client"; import {handleAxiosError} from "@/utils/client/client-utils"; import {useSession} from "next-auth/react"; diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/forms/tags/AddTagModal.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/tags/AddTagModal.tsx similarity index 80% rename from src/app/(site)/(internal)/dashboard/components/dreams/forms/tags/AddTagModal.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/tags/AddTagModal.tsx index 41e3443..90c8f27 100644 --- a/src/app/(site)/(internal)/dashboard/components/dreams/forms/tags/AddTagModal.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/tags/AddTagModal.tsx @@ -2,7 +2,7 @@ import {FC} from "react"; import Modal from "@/app/(site)/components/Modal"; -import AddTagForm from "@/app/(site)/(internal)/dashboard/components/dreams/forms/tags/AddTagForm"; +import AddTagForm from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/forms/tags/AddTagForm"; type Props = { isOpen: boolean, diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/hooks/dream-api-utils.ts b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/dream-api-utils.ts similarity index 100% rename from src/app/(site)/(internal)/dashboard/components/dreams/hooks/dream-api-utils.ts rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/dream-api-utils.ts diff --git a/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDayDreams.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDayDreams.tsx new file mode 100644 index 0000000..cc80efd --- /dev/null +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDayDreams.tsx @@ -0,0 +1,63 @@ +import {Dream} from "@prisma/client"; +import { + DayDreams, GroupedDreams +} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamsContainer"; +import {useEffect, useMemo} from "react"; + +type Args = { + dreams: Dream[], + latestDate?: Date, + dayCount?: number, + sortMode?: "ascending" | "descending" +} + +const useDayDreams = ({dreams, latestDate, dayCount, sortMode}: Args): DayDreams[] => { + const filteredDreams = useMemo(() => dreams.filter(dream => latestDate ? new Date(dream.createdAt.toString()).getTime() <= latestDate.getTime() : true), [dreams, latestDate]) + const sortedDreams = useMemo(() => filteredDreams.sort((a, b) => { + const aDate = new Date(a.createdAt.toString()) + const bDate = new Date(b.createdAt.toString()) + return sortMode === "descending" ? bDate.getTime() - aDate.getTime() : aDate.getTime() - bDate.getTime() + }), [filteredDreams, sortMode]) + + const dreamCreationDates = useMemo(() => ( + sortedDreams.map(dream => { + const creationDate = new Date(dream.createdAt.toString()) + creationDate.setHours(0, 0, 0, 0) + return creationDate.getTime() + }) + // Remove duplicates + .filter((creationTime, i, arr) => arr.indexOf(creationTime) === i) + ), [sortedDreams]) + + const groupedDreams = useMemo(() => ( + dreamCreationDates.reduce((prev, curr, i, arr) => { + const endDate = new Date(arr[i]) + endDate.setHours(23, 59, 59, 999) + + const dreams = sortedDreams.filter(dream => { + const dreamDate = new Date(dream.createdAt) + return dreamDate.getTime() >= curr && dreamDate <= endDate + }) + + return ({ + ...prev, + [curr]: dreams + }) + }, {}) + ), [dreamCreationDates, sortedDreams]) + + + const pastDreamsArr = useMemo(() => Object.keys(groupedDreams) + .filter(timestamp => groupedDreams[timestamp].length) + .map(timestamp => { + const dreamsForDay = groupedDreams[timestamp] + return ({ + timestamp: Number(timestamp), + dreams: dreamsForDay + }) + }), [groupedDreams]) + + return dayCount && dayCount > 0 && pastDreamsArr.length ? pastDreamsArr.slice(0, Math.min(pastDreamsArr.length, dayCount)) : pastDreamsArr +} + +export default useDayDreams \ No newline at end of file diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/hooks/useDreamCharacters.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDreamCharacters.tsx similarity index 100% rename from src/app/(site)/(internal)/dashboard/components/dreams/hooks/useDreamCharacters.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDreamCharacters.tsx diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/hooks/useDreamTags.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDreamTags.tsx similarity index 100% rename from src/app/(site)/(internal)/dashboard/components/dreams/hooks/useDreamTags.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDreamTags.tsx diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/hooks/useDreams.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDreams.tsx similarity index 100% rename from src/app/(site)/(internal)/dashboard/components/dreams/hooks/useDreams.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDreams.tsx diff --git a/src/app/(site)/(internal)/dashboard/page.tsx b/src/app/(site)/(internal)/dashboard/(your-dreams)/page.tsx similarity index 81% rename from src/app/(site)/(internal)/dashboard/page.tsx rename to src/app/(site)/(internal)/dashboard/(your-dreams)/page.tsx index 3995ac8..1c8e58b 100644 --- a/src/app/(site)/(internal)/dashboard/page.tsx +++ b/src/app/(site)/(internal)/dashboard/(your-dreams)/page.tsx @@ -1,8 +1,8 @@ "use client" import {FC, Fragment} from "react"; -import CurrentDreamsContainer from "@/app/(site)/(internal)/dashboard/components/dreams/containers/CurrentDreamsContainer"; -import PastDreamsContainer from "@/app/(site)/(internal)/dashboard/components/dreams/containers/PastDreamsContainer"; +import CurrentDreamsContainer from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/CurrentDreamsContainer"; +import PastDreamsContainer from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamsContainer"; const DashboardHomePage: FC = () => { return ( diff --git a/src/app/(site)/(internal)/dashboard/calendar/components/Calendar.tsx b/src/app/(site)/(internal)/dashboard/calendar/components/Calendar.tsx deleted file mode 100644 index c448d80..0000000 --- a/src/app/(site)/(internal)/dashboard/calendar/components/Calendar.tsx +++ /dev/null @@ -1,93 +0,0 @@ -"use client" - -import {FC, useState} from "react"; -import Select from "@/app/(site)/components/inputs/Select"; -import { - createDaysForCurrentMonth, - createDaysForNextMonth, createDaysForPreviousMonth, - daysOfWeek -} from "@/app/(site)/(internal)/dashboard/calendar/utils/calendar-utils"; - -const Calendar: FC = () => { - const [[year, month], setCurrentYearAndMonth] = useState<[number, number]>([new Date().getFullYear(), new Date().getMonth() + 1]); - - let currentMonthDays = createDaysForCurrentMonth(year, month); - let previousMonthDays = createDaysForPreviousMonth( - year, - month, - currentMonthDays - ); - let nextMonthDays = createDaysForNextMonth(year, month, currentMonthDays); - let calendarGridDayObjects = [ - ...previousMonthDays, - ...currentMonthDays, - ...nextMonthDays - ]; - - return ( -
-
-
- - -
- -
-
- {daysOfWeek.map((day, i) => ( -

- {day} -

- - ))} -
-
- {daysOfWeek.map((day, i) => ( -

- {day.charAt(0)} -

- - ))} -
-
- { - calendarGridDayObjects.map(day => ( -
-
- {day.dayOfMonth} -
-
- hi -
-
- )) - } -
-
- ) -} - -export default Calendar \ No newline at end of file diff --git a/src/app/(site)/(internal)/dashboard/calendar/components/DreamCalendar.tsx b/src/app/(site)/(internal)/dashboard/calendar/components/DreamCalendar.tsx new file mode 100644 index 0000000..08a2d87 --- /dev/null +++ b/src/app/(site)/(internal)/dashboard/calendar/components/DreamCalendar.tsx @@ -0,0 +1,189 @@ +"use client" + +import {FC, useMemo, useState} from "react"; +import Select from "@/app/(site)/components/inputs/Select"; +import { + createDaysForCurrentMonth, + createDaysForNextMonth, createDaysForPreviousMonth, + daysOfWeek, getMonthDropdownOptions, getYearDropdownOptions +} from "@/app/(site)/(internal)/dashboard/calendar/utils/calendar-utils"; +import {Chip} from "@nextui-org/chip"; +import {SelectItem} from "@nextui-org/react"; +import DreamCalendarDay from "@/app/(site)/(internal)/dashboard/calendar/components/DreamCalendarDay"; +import {useDreamsData} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/DreamsProvider"; +import useDayDreams from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/hooks/useDayDreams"; + +const DreamCalendar: FC = () => { + const [[currentYear, currentMonth], setCurrentYearAndMonth] = useState<[number, number]>([new Date().getFullYear(), new Date().getMonth() + 1]); + + let currentMonthDays = createDaysForCurrentMonth(currentYear, currentMonth); + let previousMonthDays = createDaysForPreviousMonth( + currentYear, + currentMonth, + currentMonthDays + ); + let nextMonthDays = createDaysForNextMonth(currentYear, currentMonth, currentMonthDays); + let calendarGridDayObjects = [ + ...previousMonthDays, + ...currentMonthDays, + ...nextMonthDays + ]; + + const selectMonths = useMemo(() => getMonthDropdownOptions(), []) + const selectYears = useMemo(() => getYearDropdownOptions(new Date().getUTCFullYear()), []) + + const {dreams, tags, characters} = useDreamsData() + const dayDreams = useDayDreams({dreams: dreams.data}) + + return ( +
+
+
+ + +
+
+
+ {daysOfWeek.map((day, i) => ( +

+ {day} +

+ + ))} +
+
+ {daysOfWeek.map((day, i) => ( +

+ {day.charAt(0)} +

+ + ))} +
+
+ { + calendarGridDayObjects.map(day => { + const dateStrSplit = day.dateString.split("-") + const date = new Date(Number(dateStrSplit[0]), Number(dateStrSplit[1]) - 1, Number(dateStrSplit[2])) + date.setHours(0, 0, 0, 0) + + const dayIsToday = () => { + const today = new Date() + return date.getUTCFullYear() === today.getUTCFullYear() && + date.getUTCMonth() === today.getUTCMonth() && + date.getUTCDate() === today.getUTCDate() + } + + const dreamsForDay = dayDreams.find(dayDream => { + const endOfDay = new Date(dayDream.timestamp) + endOfDay.setHours(23, 59, 59, 999) + return date.getTime() >= dayDream.timestamp && date.getTime() <= endOfDay.getTime() + }) + + return ( + + ) + }) + } +
+
+ ) +} + +export default DreamCalendar \ No newline at end of file diff --git a/src/app/(site)/(internal)/dashboard/calendar/components/DreamCalendarDay.tsx b/src/app/(site)/(internal)/dashboard/calendar/components/DreamCalendarDay.tsx new file mode 100644 index 0000000..e75dd2f --- /dev/null +++ b/src/app/(site)/(internal)/dashboard/calendar/components/DreamCalendarDay.tsx @@ -0,0 +1,113 @@ +"use client" + +import {FC, Fragment, useState} from "react"; +import clsx from "clsx"; +import {Chip} from "@nextui-org/chip"; +import { + DayDreams +} from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/PastDreamsContainer"; +import {CalendarMonthDay} from "@/app/(site)/(internal)/dashboard/calendar/utils/calendar-utils"; +import Modal from "@/app/(site)/components/Modal"; +import DreamContainer + from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/containers/DreamContainer"; +import DreamCard from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/card/DreamCard"; +import {Dream, DreamCharacter, DreamTag} from "@prisma/client"; +import {OptimisticWorker} from "@/utils/client/client-data-utils"; + +type Props = { + dreams?: DayDreams + day: CalendarMonthDay, + allCharacters: DreamCharacter[], + allTags: DreamTag[], + optimisticRemove?: OptimisticWorker, + isToday: boolean, +} + +const DreamCalendarDay: FC = ({dreams, day, allTags, allCharacters, optimisticRemove, isToday}) => { + const [modalOpen, setModalOpen] = useState(false) + const dateStrSplit = day.dateString.split("-") + + return ( + + setModalOpen(false)} + size="2xl" + > + + {dreams?.dreams.map(dream => ( + + ))} + + +
{ + if (dreams) + setModalOpen(true) + }} + > + {day.isCurrentMonth && ( +
+
+

{day.dayOfMonth}

+ {isToday && ( + +

+ TODAY +

+
+ )} +
+ { + dreams && ( + +
+ { + dreams.dreams.slice(0, Math.min(dreams.dreams.length, 2)) + .map(dream => ( +
+

+ {dream.title} +

+
+ )) + } +
+
+ +
+
+ + ) + } +
+ )} +
+
+ ) +} + +export default DreamCalendarDay \ No newline at end of file diff --git a/src/app/(site)/(internal)/dashboard/calendar/page.tsx b/src/app/(site)/(internal)/dashboard/calendar/page.tsx index fad7eb8..8ab1749 100644 --- a/src/app/(site)/(internal)/dashboard/calendar/page.tsx +++ b/src/app/(site)/(internal)/dashboard/calendar/page.tsx @@ -1,11 +1,11 @@ import {FC, Fragment} from "react"; -import Calendar from "@/app/(site)/(internal)/dashboard/calendar/components/Calendar"; +import DreamCalendar from "@/app/(site)/(internal)/dashboard/calendar/components/DreamCalendar"; const CalendarPage: FC = () => { return ( -

Dream Calendar

- +

Dream Calendar

+
) } diff --git a/src/app/(site)/(internal)/dashboard/calendar/utils/calendar-utils.ts b/src/app/(site)/(internal)/dashboard/calendar/utils/calendar-utils.ts index 6bb5826..e66d6d1 100644 --- a/src/app/(site)/(internal)/dashboard/calendar/utils/calendar-utils.ts +++ b/src/app/(site)/(internal)/dashboard/calendar/utils/calendar-utils.ts @@ -1,4 +1,4 @@ -import { range } from "ramda"; +import {range} from "ramda"; import dayjs from "dayjs"; import weekday from "dayjs/plugin/weekday"; import weekOfYear from "dayjs/plugin/weekOfYear"; @@ -16,13 +16,18 @@ export const daysOfWeek = [ "Saturday" ]; -export function getYearDropdownOptions(currentYear: number) { +export function getYearDropdownOptions(currentYear: number): CalendarDropdownOptions[] { let minYear = currentYear - 4; let maxYear = currentYear + 5; - return range(minYear, maxYear + 1).map((y) => ({ label: `${y}`, value: y })); + return range(minYear, maxYear + 1).map((y) => ({label: `${y}`, value: y})); } -export function getMonthDropdownOptions() { +export type CalendarDropdownOptions = { + value: number, + label: string, +} + +export function getMonthDropdownOptions(): CalendarDropdownOptions[] { return range(1, 13).map((m) => ({ value: m, label: dayjs() @@ -35,7 +40,13 @@ export function getNumberOfDaysInMonth(year: number, month: number) { return dayjs(`${year}-${month}-01`).daysInMonth(); } -export function createDaysForCurrentMonth(year: number, month: number) { +export type CalendarMonthDay = { + dateString: string, + dayOfMonth: number, + isCurrentMonth: boolean, +} + +export function createDaysForCurrentMonth(year: number, month: number): CalendarMonthDay[] { return [...Array(getNumberOfDaysInMonth(year, month))].map((_, index) => { return { dateString: dayjs(`${year}-${month}-${index + 1}`).format("YYYY-MM-DD"), @@ -45,7 +56,7 @@ export function createDaysForCurrentMonth(year: number, month: number) { }); } -export function createDaysForPreviousMonth(year: number, month: number, currentMonthDays: any[]) { +export function createDaysForPreviousMonth(year: number, month: number, currentMonthDays: CalendarMonthDay[]): CalendarMonthDay[] { const firstDayOfTheMonthWeekday = getWeekday(currentMonthDays[0].dateString); const previousMonth = dayjs(`${year}-${month}-01`).subtract(1, "month"); @@ -63,7 +74,7 @@ export function createDaysForPreviousMonth(year: number, month: number, currentM `${previousMonth.year()}-${previousMonth.month() + 1}-${ previousMonthLastMondayDayOfMonth + index }` - ).format("YYYY-MM-DD"), + ).format("YYYY-MM-D"), dayOfMonth: previousMonthLastMondayDayOfMonth + index, isCurrentMonth: false, isPreviousMonth: true @@ -71,7 +82,7 @@ export function createDaysForPreviousMonth(year: number, month: number, currentM }); } -export function createDaysForNextMonth(year: number, month: number, currentMonthDays: any) { +export function createDaysForNextMonth(year: number, month: number, currentMonthDays: CalendarMonthDay[]): CalendarMonthDay[] { const lastDayOfTheMonthWeekday = getWeekday( `${year}-${month}-${currentMonthDays.length}` ); diff --git a/src/app/(site)/(internal)/dashboard/components/dreams/containers/PastDreamsContainer.tsx b/src/app/(site)/(internal)/dashboard/components/dreams/containers/PastDreamsContainer.tsx deleted file mode 100644 index fe4f09e..0000000 --- a/src/app/(site)/(internal)/dashboard/components/dreams/containers/PastDreamsContainer.tsx +++ /dev/null @@ -1,122 +0,0 @@ -"use client" - -import {FC, Fragment, useMemo} from "react"; -import DreamContainer from "@/app/(site)/(internal)/dashboard/components/dreams/containers/DreamContainer"; -import {useDreamsData} from "@/app/(site)/(internal)/dashboard/components/dreams/DreamsProvider"; -import {Dream} from "@prisma/client"; -import {useStartOfDay} from "@/app/(site)/hooks/time-hooks"; -import PastDreamItem from "@/app/(site)/(internal)/dashboard/components/dreams/containers/PastDreamItem"; -import DreamCardSkeleton from "@/app/(site)/(internal)/dashboard/components/dreams/card/DreamCardSkeleton"; -import {Divider} from "@nextui-org/divider"; -import Card from "@/app/(site)/components/Card"; -import {CardBody} from "@nextui-org/card"; -import {useRouter} from "next/navigation"; -import CloudIcon from "@/app/(site)/components/icons/CloudIcon"; - -type GroupedDreams = { - [K: string]: Dream[] -} - -export type PastDream = { - timestamp: number, - dreams: Dream[] -} - -const NUMBER_OF_DAYS = 7 - -const PastDreamsContainer: FC = () => { - const router = useRouter() - const {dreams, tags, characters} = useDreamsData() - const earliestDate = useStartOfDay({ - dayOffset: -NUMBER_OF_DAYS, // A week ago @ 12:00 AM - }) - - const pastDreams = useMemo(() => { - const filteredDreams = dreams.data.filter(dream => new Date(dream.createdAt.toString()).getTime() >= earliestDate.getTime()) - const dayTimes = [earliestDate] - for (let i = 1; i < NUMBER_OF_DAYS; i++) { - const d = new Date(dayTimes[dayTimes.length - 1]) - d.setTime(d.getTime() + (24 * 60 * 60 * 1000)) - dayTimes.push(d) - } - - const groupedDreams = dayTimes.reduce((previousValue, currentValue, i, arr) => { - const endDate = new Date(arr[i]) - endDate.setHours(23, 59, 59, 999) - - const dreams = filteredDreams.filter(dream => { - const dreamDate = new Date(dream.createdAt) - return dreamDate >= currentValue && dreamDate <= endDate - }) - - return ({ - ...previousValue, - [currentValue.getTime()]: dreams - }) - }, {}) - - const pastDreamsArr: PastDream[] = [] - for (let timestamp in groupedDreams) { - const dreamsForDay = groupedDreams[timestamp] - if (dreamsForDay.length === 0) - continue - pastDreamsArr.push({ - timestamp: Number(timestamp), - dreams: dreamsForDay - }) - } - - return pastDreamsArr.sort((a, b) => b.timestamp - a.timestamp) - }, [dreams.data, earliestDate]) - - - const dreamItems = useMemo(() => pastDreams.map(dream => ( - - )), [characters.data, pastDreams, tags.data]) - - - return ( - - {dreams.loading ? ( - - - - - - ) : (dreamItems.length ? - - {dreamItems} - - router.push("/dashboard/calendar")} - isPressable - isBlurred - classNames={{ - base: "hover:scale-105", - body: "bg-secondary py-8" - }} - > - -
- -

View All Dreams

-
-
-
-
- : -

You have no previous dreams for the past week...

) - } -
- ) -} - -export default PastDreamsContainer \ No newline at end of file diff --git a/src/app/(site)/(internal)/dashboard/layout.tsx b/src/app/(site)/(internal)/dashboard/layout.tsx index 81b17b3..1389827 100644 --- a/src/app/(site)/(internal)/dashboard/layout.tsx +++ b/src/app/(site)/(internal)/dashboard/layout.tsx @@ -1,7 +1,7 @@ import {FC, PropsWithChildren} from "react"; -import DashboardSidebar from "@/app/(site)/(internal)/dashboard/components/DashboardSidebar"; +import DashboardSidebar from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/DashboardSidebar"; import {Metadata} from "next"; -import DreamsProvider from "@/app/(site)/(internal)/dashboard/components/dreams/DreamsProvider"; +import DreamsProvider from "@/app/(site)/(internal)/dashboard/(your-dreams)/components/dreams/DreamsProvider"; export const metadata: Metadata = { title: 'Dream Logger - Dashboard', diff --git a/src/app/(site)/components/inputs/Select.tsx b/src/app/(site)/components/inputs/Select.tsx index d8efe83..ae22c21 100644 --- a/src/app/(site)/components/inputs/Select.tsx +++ b/src/app/(site)/components/inputs/Select.tsx @@ -2,22 +2,29 @@ import {useMemo} from "react"; import {SelectProps, Select as NextSelect} from "@nextui-org/react"; import {UseFormRegister} from "react-hook-form"; +import clsx from "clsx"; type Props = { register?: UseFormRegister, } & SelectProps -export default function Select({classNames, listboxProps, popoverProps, children, id, register, ...props}: Props) { +export default function Select({ + classNames, + listboxProps, + popoverProps, + children, + id, + register, + ...props + }: Props) { // @ts-ignore const defAttributes: SelectProps = useMemo(() => ({ id, color: "primary", size: "lg", classNames: { - trigger: "h-fit py-6 bg-[#9E23FF1A]/10 border-1 border-[#3E0070] hover:!bg-[#9E23FF1A]/20 focus-within:!bg-[#9E23FF1A]/20", - input: "text-[#EAE0FF]", - label: "text-lg text-[#EAE0FF]", - ...classNames + trigger: clsx("h-fit py-6 bg-[#9E23FF1A]/10 border-1 border-[#3E0070] hover:!bg-[#9E23FF1A]/20 focus-within:!bg-[#9E23FF1A]/20", classNames?.trigger), + label: clsx("text-lg text-[#EAE0FF]", classNames?.label), }, listboxProps: { ...listboxProps, @@ -41,7 +48,7 @@ export default function Select({classNames, listboxProps, popoverProps, child }, ...props }), [classNames, id, listboxProps, popoverProps, props]) - + return register && id ? (