Skip to content

Commit

Permalink
Add dream calendar
Browse files Browse the repository at this point in the history
  • Loading branch information
bombies committed Nov 1, 2023
1 parent 2c8ded5 commit 1a934f0
Show file tree
Hide file tree
Showing 35 changed files with 530 additions and 267 deletions.
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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()
Expand Down
Original file line number Diff line number Diff line change
@@ -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[],
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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 => (
<PastDreamItem
key={dream.timestamp}
dream={dream}
allTags={tags.data}
allCharacters={characters.data}
/>
)), [characters.data, pastDreams, tags.data])


return (
<DreamContainer
containerClassName="!py-12"
title="Previous Dreams"
>
{dreams.loading ? (
<Fragment>
<DreamCardSkeleton/>
<DreamCardSkeleton/>
<DreamCardSkeleton/>
</Fragment>
) : (dreamItems.length ?
<Fragment>
{dreamItems}
<Divider className="my-3"/>
<Card
onPress={() => router.push("/dashboard/calendar")}
isPressable
isBlurred
classNames={{
base: "hover:scale-105",
body: "bg-secondary py-8"
}}
>
<CardBody>
<div className="flex gap-4">
<CloudIcon width={32}/>
<p className="font-semibold text-lg phone:text-medium self-center">View All Dreams</p>
</div>
</CardBody>
</Card>
</Fragment>
:
<h3 className="text-center font-light text-3xl tablet:text-xl text-subtext/30 py-6">You have no previous
dreams for the past week...</h3>)
}
</DreamContainer>
)
}

export default PastDreamsContainer
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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<PostDreamDto, 'tags' | 'characters'> & {
tags?: string[] | string
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Dream[]>(() => dreams.filter(dream => latestDate ? new Date(dream.createdAt.toString()).getTime() <= latestDate.getTime() : true), [dreams, latestDate])
const sortedDreams = useMemo<Dream[]>(() => 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<GroupedDreams>(() => (
dreamCreationDates.reduce<GroupedDreams>((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<DayDreams[]>(() => 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
Original file line number Diff line number Diff line change
@@ -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 (
Expand Down
Loading

0 comments on commit 1a934f0

Please sign in to comment.