diff --git a/client/.env b/client/.env index 5b9388e..8b5a0ce 100644 --- a/client/.env +++ b/client/.env @@ -1,2 +1,2 @@ -VITE_API_URL=http://192.168.1.171:3000 -# VITE_API_URL=http://localhost:3000 \ No newline at end of file +VITE_API_URL=https://graff.estate +# VITE_API_URL=http://192.168.1.171:3003 \ No newline at end of file diff --git a/client/index.html b/client/index.html index 7e42895..85c7310 100644 --- a/client/index.html +++ b/client/index.html @@ -1,10 +1,10 @@ - + - + - Vite + React + TS + Интерактивные решения для застройщиков
diff --git a/client/package.json b/client/package.json index f72ebb5..238c4fb 100644 --- a/client/package.json +++ b/client/package.json @@ -22,10 +22,12 @@ "react-rangeslider": "^2.2.0", "react-router-dom": "^6.18.0", "react-swipeable": "^7.0.1", + "react-yandex-metrika": "^2.6.0", "usehooks-ts": "^2.9.1", "zustand": "^4.4.6" }, "devDependencies": { + "@types/node": "^20.10.5", "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", "@types/react-input-mask": "^3.0.5", diff --git a/client/public/favicon.svg b/client/public/favicon.svg new file mode 100644 index 0000000..b8ec576 --- /dev/null +++ b/client/public/favicon.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/public/images/Datamining.jpg b/client/public/images/Datamining.jpg index 162ca35..1c8c88b 100644 Binary files a/client/public/images/Datamining.jpg and b/client/public/images/Datamining.jpg differ diff --git a/client/public/images/Map.png b/client/public/images/Map.png index fa4ca9e..da5c742 100644 Binary files a/client/public/images/Map.png and b/client/public/images/Map.png differ diff --git a/client/public/images/Stream.jpg b/client/public/images/Stream.jpg deleted file mode 100644 index 36e7193..0000000 Binary files a/client/public/images/Stream.jpg and /dev/null differ diff --git a/client/public/images/VR.png b/client/public/images/VR.png index bb7a183..2f26430 100644 Binary files a/client/public/images/VR.png and b/client/public/images/VR.png differ diff --git a/client/public/images/VR2.jpg b/client/public/images/VR2.jpg deleted file mode 100644 index 017da12..0000000 Binary files a/client/public/images/VR2.jpg and /dev/null differ diff --git a/client/public/images/VRHeadset.png b/client/public/images/VRHeadset.png deleted file mode 100644 index 01bdb24..0000000 Binary files a/client/public/images/VRHeadset.png and /dev/null differ diff --git a/client/public/images/Video.jpg b/client/public/images/Video.jpg deleted file mode 100644 index 49c5ae7..0000000 Binary files a/client/public/images/Video.jpg and /dev/null differ diff --git a/client/public/images/ViewBox.jpg b/client/public/images/ViewBox.jpg deleted file mode 100644 index d1f2056..0000000 Binary files a/client/public/images/ViewBox.jpg and /dev/null differ diff --git a/client/public/images/blendings/1.svg b/client/public/images/blendings/1.svg new file mode 100644 index 0000000..f56a0d4 --- /dev/null +++ b/client/public/images/blendings/1.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/public/images/blendings/2.svg b/client/public/images/blendings/2.svg new file mode 100644 index 0000000..9060b47 --- /dev/null +++ b/client/public/images/blendings/2.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/public/images/blendings/3.svg b/client/public/images/blendings/3.svg new file mode 100644 index 0000000..7dfab76 --- /dev/null +++ b/client/public/images/blendings/3.svg @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/public/images/blendings/4.svg b/client/public/images/blendings/4.svg new file mode 100644 index 0000000..e546861 --- /dev/null +++ b/client/public/images/blendings/4.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/public/images/blendings/5.svg b/client/public/images/blendings/5.svg new file mode 100644 index 0000000..a74e7a6 --- /dev/null +++ b/client/public/images/blendings/5.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/public/images/blendings/6.svg b/client/public/images/blendings/6.svg new file mode 100644 index 0000000..5ef7331 --- /dev/null +++ b/client/public/images/blendings/6.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/public/images/blendings/7.svg b/client/public/images/blendings/7.svg new file mode 100644 index 0000000..cd3d6c9 --- /dev/null +++ b/client/public/images/blendings/7.svg @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/public/images/blendings/8.svg b/client/public/images/blendings/8.svg new file mode 100644 index 0000000..4ba9d2c --- /dev/null +++ b/client/public/images/blendings/8.svg @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/public/images/projects/photo01.jpg b/client/public/images/projects/photo01.jpg deleted file mode 100644 index a7c2bf8..0000000 Binary files a/client/public/images/projects/photo01.jpg and /dev/null differ diff --git a/client/public/images/projects/photo02.jpg b/client/public/images/projects/photo02.jpg deleted file mode 100644 index 9502938..0000000 Binary files a/client/public/images/projects/photo02.jpg and /dev/null differ diff --git a/client/public/images/projects/photo03.jpg b/client/public/images/projects/photo03.jpg deleted file mode 100644 index 56c960a..0000000 Binary files a/client/public/images/projects/photo03.jpg and /dev/null differ diff --git a/client/public/images/projects/photo04.jpg b/client/public/images/projects/photo04.jpg deleted file mode 100644 index 43c9e06..0000000 Binary files a/client/public/images/projects/photo04.jpg and /dev/null differ diff --git a/client/public/images/projects/photo05.jpg b/client/public/images/projects/photo05.jpg deleted file mode 100644 index 73a401b..0000000 Binary files a/client/public/images/projects/photo05.jpg and /dev/null differ diff --git a/client/public/images/projects/photo06.jpg b/client/public/images/projects/photo06.jpg deleted file mode 100644 index 969a0d2..0000000 Binary files a/client/public/images/projects/photo06.jpg and /dev/null differ diff --git a/client/public/images/projects/photo07.jpg b/client/public/images/projects/photo07.jpg deleted file mode 100644 index 3579129..0000000 Binary files a/client/public/images/projects/photo07.jpg and /dev/null differ diff --git a/client/public/images/projects/photo08.jpg b/client/public/images/projects/photo08.jpg deleted file mode 100644 index 4e69f2a..0000000 Binary files a/client/public/images/projects/photo08.jpg and /dev/null differ diff --git a/client/public/images/projects/photo09.jpg b/client/public/images/projects/photo09.jpg deleted file mode 100644 index a5efb7c..0000000 Binary files a/client/public/images/projects/photo09.jpg and /dev/null differ diff --git a/client/public/images/projects/photo10.jpg b/client/public/images/projects/photo10.jpg deleted file mode 100644 index 3253fe2..0000000 Binary files a/client/public/images/projects/photo10.jpg and /dev/null differ diff --git a/client/public/images/projects/photo11.jpg b/client/public/images/projects/photo11.jpg deleted file mode 100644 index a9d97cb..0000000 Binary files a/client/public/images/projects/photo11.jpg and /dev/null differ diff --git a/client/public/images/projects/photo12.jpg b/client/public/images/projects/photo12.jpg deleted file mode 100644 index 6e10688..0000000 Binary files a/client/public/images/projects/photo12.jpg and /dev/null differ diff --git a/client/public/images/projects/photo13.jpg b/client/public/images/projects/photo13.jpg deleted file mode 100644 index 8f81007..0000000 Binary files a/client/public/images/projects/photo13.jpg and /dev/null differ diff --git a/client/public/images/projects/photo14.jpg b/client/public/images/projects/photo14.jpg deleted file mode 100644 index d57b317..0000000 Binary files a/client/public/images/projects/photo14.jpg and /dev/null differ diff --git a/client/public/images/projects/photo15.jpg b/client/public/images/projects/photo15.jpg deleted file mode 100644 index ef47ece..0000000 Binary files a/client/public/images/projects/photo15.jpg and /dev/null differ diff --git a/client/public/images/projects/photo16.jpg b/client/public/images/projects/photo16.jpg deleted file mode 100644 index bcceb67..0000000 Binary files a/client/public/images/projects/photo16.jpg and /dev/null differ diff --git a/client/public/images/projects/photo17.jpg b/client/public/images/projects/photo17.jpg deleted file mode 100644 index 3b2eab9..0000000 Binary files a/client/public/images/projects/photo17.jpg and /dev/null differ diff --git a/client/public/images/projects/photo18.jpg b/client/public/images/projects/photo18.jpg deleted file mode 100644 index d17c1d7..0000000 Binary files a/client/public/images/projects/photo18.jpg and /dev/null differ diff --git a/client/public/images/projects/photo19.jpg b/client/public/images/projects/photo19.jpg deleted file mode 100644 index 2fe90ff..0000000 Binary files a/client/public/images/projects/photo19.jpg and /dev/null differ diff --git a/client/public/images/projects/photo20.jpg b/client/public/images/projects/photo20.jpg deleted file mode 100644 index 73d38d4..0000000 Binary files a/client/public/images/projects/photo20.jpg and /dev/null differ diff --git a/client/public/images/projects/photo21.jpg b/client/public/images/projects/photo21.jpg deleted file mode 100644 index fb04cd0..0000000 Binary files a/client/public/images/projects/photo21.jpg and /dev/null differ diff --git a/client/public/images/stream/aivaz.jpg b/client/public/images/stream/aivaz.jpg index c0c5295..db91da1 100644 Binary files a/client/public/images/stream/aivaz.jpg and b/client/public/images/stream/aivaz.jpg differ diff --git a/client/public/images/stream/liferes.jpg b/client/public/images/stream/liferes.jpg index d2f434f..fe66697 100644 Binary files a/client/public/images/stream/liferes.jpg and b/client/public/images/stream/liferes.jpg differ diff --git a/client/public/images/stream/nks.jpg b/client/public/images/stream/nks.jpg index cbf428e..04eb333 100644 Binary files a/client/public/images/stream/nks.jpg and b/client/public/images/stream/nks.jpg differ diff --git a/client/public/videos/features/integra_crm.mp4 b/client/public/videos/features/integra_crm.mp4 new file mode 100644 index 0000000..7ee9b59 Binary files /dev/null and b/client/public/videos/features/integra_crm.mp4 differ diff --git a/client/public/videos/features/nks_infra.mp4 b/client/public/videos/features/nks_infra.mp4 new file mode 100644 index 0000000..0f98c66 Binary files /dev/null and b/client/public/videos/features/nks_infra.mp4 differ diff --git a/client/public/videos/features/parametric.mp4 b/client/public/videos/features/parametric.mp4 new file mode 100644 index 0000000..7770c03 Binary files /dev/null and b/client/public/videos/features/parametric.mp4 differ diff --git a/client/public/videos/features/render.mp4 b/client/public/videos/features/render.mp4 new file mode 100644 index 0000000..8019efd Binary files /dev/null and b/client/public/videos/features/render.mp4 differ diff --git a/client/public/videos/features/send.mp4 b/client/public/videos/features/send.mp4 new file mode 100644 index 0000000..61aaf90 Binary files /dev/null and b/client/public/videos/features/send.mp4 differ diff --git a/client/public/videos/features/uralsky.mp4 b/client/public/videos/features/uralsky.mp4 new file mode 100644 index 0000000..8a8f7e1 Binary files /dev/null and b/client/public/videos/features/uralsky.mp4 differ diff --git a/client/public/videos/features/virtual_tour.mp4 b/client/public/videos/features/virtual_tour.mp4 new file mode 100644 index 0000000..9e903f7 Binary files /dev/null and b/client/public/videos/features/virtual_tour.mp4 differ diff --git a/client/public/videos/features/wish.mp4 b/client/public/videos/features/wish.mp4 new file mode 100644 index 0000000..1621ee8 Binary files /dev/null and b/client/public/videos/features/wish.mp4 differ diff --git a/client/public/videos/showreel_1080p_4000k_h264.mp4 b/client/public/videos/showreel_1080p_4000k_h264.mp4 new file mode 100644 index 0000000..3bed4a2 Binary files /dev/null and b/client/public/videos/showreel_1080p_4000k_h264.mp4 differ diff --git a/client/public/videos/vr.mp4 b/client/public/videos/vr.mp4 new file mode 100644 index 0000000..1e47883 Binary files /dev/null and b/client/public/videos/vr.mp4 differ diff --git a/client/public/vite.svg b/client/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/client/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/src/App.tsx b/client/src/App.tsx index 6ce644a..e530ea7 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -1,41 +1,39 @@ /* eslint-disable no-irregular-whitespace */ import "./App.css"; -import BlendingHeader from "./components/blendings/BlendingHeader"; -import FeatureItem from "./components/FeatureItem"; -// import BlendVR from "./components/blendings/BlendVR"; -import BlendStream from "./components/blendings/BlendStream"; -import StreamButton from "./components/StreamButton"; import "react-rangeslider/lib/index.css"; import "./components/RangeSlider.css"; +import { YMInitializer } from "react-yandex-metrika"; +import IProject from "./types/IProject"; +import api from "./utils/api"; import { useEffect, useState } from "react"; +import FeatureItem from "./components/FeatureItem"; +import StreamButton from "./components/StreamButton"; import ProjectCard from "./components/ProjectCard"; -// import MoreProjectButton from "./components/MoreProjectButton"; import ExampleCard from "./components/ExampleCard"; import FeatureVideoViewBox from "./components/FeatureVideoViewBox"; import Button from "./components/Button"; import Calc from "./components/Calc"; -import BlendingCalc from "./components/blendings/BlendingCalc"; -import BlendingClients from "./components/blendings/BlendingClients"; import Heading2 from "./components/Headings/Heading2"; -// import PlayIcon from "./components/icons/PlayIcon"; import VideoSliderMobile from "./components/VideoSliderMobile"; // import { isMobile } from "react-device-detect"; -import IProject from "./types/IProject"; -import api from "./utils/api"; +import FeedbackForm from "./components/FeedbackForm"; +import useModalStore from "./stores/useModalStore"; +import FeedbackModal from "./components/modals/FeedbackModal"; +import ModalContainer from "./components/ModalContainer"; +import MoreProjectButton from "./components/MoreProjectButton"; import MailIcon from "./components/icons/MailIcon"; import PhoneIcon from "./components/icons/PhoneIcon"; import VKIcon from "./components/icons/VKIcon"; import YouTubeIcon from "./components/icons/YouTubeIcon"; import TelegramIcon from "./components/icons/TelegramIcon"; -import FeedbackForm from "./components/FeedbackForm"; function App() { const [selectedVideo, setSelectedVideo] = useState( - "https://graff.estate/videos/features/virtual_tour.mp4" + "/videos/features/virtual_tour.mp4" ); - // const [isShowProjects, setIsShowProjects] = useState(false); - const [projects, setProjects] = useState([]); + const [setModal] = useModalStore((state) => [state.setModal]); + const [isShownAllProjects, setIsShownAllProjects] = useState(false); async function getProjects() { try { @@ -71,19 +69,19 @@ function App() { />
- -
+ {/*
-
+
*/}
@@ -100,26 +98,26 @@ function App() { Помогаем девелоперам эффективно демонстрировать свой объект. Продавать больше и быстрее.

-
- +
+
-
+
-
+
Помогаем
продавать{" "} @@ -226,7 +224,7 @@ function App() {
-
+
+ +
+ +
-
+
@@ -277,52 +279,52 @@ function App() { setSelectedVideo(video)} /> setSelectedVideo(video)} /> setSelectedVideo(video)} /> setSelectedVideo(video)} /> setSelectedVideo(video)} /> setSelectedVideo(video)} /> setSelectedVideo(video)} /> setSelectedVideo(video)} /> - + /> */}
@@ -341,7 +343,7 @@ function App() {
-
+
@@ -355,9 +357,13 @@ function App() { жилого комплекса - + + +
@@ -373,9 +379,13 @@ function App() {
- + + +
@@ -403,12 +413,12 @@ function App() { />
-
- +
+
-
+
@@ -427,7 +437,7 @@ function App() {

-

+

Полученный отчет позволяет сделать процесс демонстрации жилого комплекса еще эффективнее

@@ -446,7 +456,7 @@ function App() {
-
+
@@ -458,14 +468,19 @@ function App() { реальности -
-

- Клиент полностью погружается в воссозданную реальность, - чувствует удобство и уровень комфорта -

+
+

+ Клиент полностью погружается в воссозданную реальность, + чувствует удобство и уровень комфорта +

+
@@ -479,25 +494,48 @@ function App() { className="sm:px-6 sm:pt-8 sm:pb-5 p-4 pb-2 border-t border-[#3D425C] w-full" />
- +
- -

- Клиент полностью погружается -
- в воссозданную реальность, чувствует -
- удобство и уровень комфорта -

- + +
+

+ Клиент полностью погружается +
+ в воссозданную реальность, чувствует +
+ удобство и уровень комфорта +

+ +
+
+ +
+
-
+
Оцените эффективность
@@ -522,21 +560,40 @@ function App() { -
- +
+
-
+
Проекты -
+
{projects.map((project, index) => ( ))}
+
+ {[...Array(5)].map((_, index) => ( + + ))} + {!isShownAllProjects ? ( + setIsShownAllProjects(true)} + /> + ) : ( + <> + {projects.map( + (_, index) => + projects[index + 5] && ( + + ) + )} + + )} +
-
+
Наши клиенты{" "} @@ -553,101 +610,101 @@ function App() { alt="" className="sm:hidden block" /> -
- +
+
-
-
-
-
-

- Свяжитесь -
с нами -

-

- Хотите увеличить конверсию? -
- Давайте обсудим детали! -

+
+
+
+
+
+

+ Свяжитесь +
с нами +

+

+ Хотите увеличить конверсию? +
+ Давайте обсудим детали! +

+
+
+ +
+
- -
- -
-
- -
-
- {/* */} -
- -
-
-

- Горячая линия -

-
-
- - - -
-
-

- Социальные -
- сети +

+
+
+

+ Горячая линия

- + + + +
+
+

+ Социальные +
+ сети +

+
+
+ +
-
+
@@ -656,12 +713,12 @@ function App() {

- + Политика конфиденциальности - + {/* graff.estate - + */}

© 2023 GRAFF interactive. Все права защищены. @@ -695,6 +752,20 @@ function App() {

+ + + + ); } diff --git a/client/src/components/Button.tsx b/client/src/components/Button.tsx index 920f4d7..36f8263 100644 --- a/client/src/components/Button.tsx +++ b/client/src/components/Button.tsx @@ -7,7 +7,7 @@ interface ButtonProps { width?: "fit" | "full"; disabled?: boolean; className?: string; - handleClick?: () => void; + onClick?: () => void; } function Button({ @@ -17,12 +17,12 @@ function Button({ width = "fit", disabled = false, className, - handleClick, + onClick, }: ButtonProps) { return ( +
+
+
+
+ setName(e.target.value)} + className="feedback-field bg-transparent border border-[#3D425C] rounded-none sm:pt-12 sm:pb-4 sm:px-4 pt-8 pb-3 px-3 outline-none outline-1 -outline-offset-1 focus:outline-[#D375FF] transition-all w-full" + /> +

+ Имя + +

+
+ +
+ ) => + setPhone(e.target.value) + } + className={[ + "feedback-field bg-transparent border rounded-none border-t-0 border-[#3D425C] sm:pt-12 sm:pb-4 sm:px-4 pt-8 pb-3 px-3 outline-none outline-1 -outline-offset-1 focus:outline-[#D375FF] transition-all w-full", + ].join(" ")} + /> +

+ Телефон + +

+
+ +
+ setEmail(e.target.value)} + className="feedback-field bg-transparent border rounded-none border-t-0 border-[#3D425C] sm:pt-12 sm:pb-4 sm:px-4 pt-8 pb-3 px-3 outline-none outline-1 -outline-offset-1 focus:outline-[#D375FF] transition-all w-full" + /> +

+ Email + +

+
+ +
+ +
+ +
+
+ Нажимая кнопку отправить, вы принимаете{" "} + + условия использования + {" "} + и{" "} + + политику конфиденциальности + +
+
+
+
+
+ +
+

+

+ Звездочкой отмечены обязательные +
+ для заполнения поля +

+
+
+
+ + +
+
+ ) : ( +
+
+

+ Заявка отправлена + +

+ +
+ +
+

+ Спасибо за подачу заявки! +

+ +

+ Мы ценим ваш интерес к нашей компании и в ближайшее время свяжемся + с вами для уточнения деталей проекта. +

+
+
+ )} + + ); +} + +export default ContactsForm; diff --git a/client/src/components/ExampleCard.tsx b/client/src/components/ExampleCard.tsx index 81b5f7b..188bd9b 100644 --- a/client/src/components/ExampleCard.tsx +++ b/client/src/components/ExampleCard.tsx @@ -21,7 +21,7 @@ function ExampleCard({ title, company, image }: ExampleCardProps) { initial={{ opacity: 0, translateY: 64 }} whileInView={{ opacity: 1, translateY: 0 }} viewport={{ once: true, margin: "-10%" }} - transition={{ duration: 1, ease: [0.58, 0.12, 0.27, 0.98], delay: 0.2 }} + transition={{ duration: 1, ease: [0.58, 0.12, 0.27, 0.98] }} className="flex flex-col gap-1" >

{title}

diff --git a/client/src/components/FeatureItem.tsx b/client/src/components/FeatureItem.tsx index 3f37837..6fc16e5 100644 --- a/client/src/components/FeatureItem.tsx +++ b/client/src/components/FeatureItem.tsx @@ -1,4 +1,3 @@ -import BlendingFeatures from "./blendings/BlendingFeatures"; import ArrowIcon from "./icons/ArrowIcon"; interface FeatureItemProps { @@ -33,9 +32,9 @@ function FeatureItem({ {desc}

- - - +
+ +
diff --git a/client/src/components/FeedbackForm.tsx b/client/src/components/FeedbackForm.tsx index 7ef5a7f..b2ae563 100644 --- a/client/src/components/FeedbackForm.tsx +++ b/client/src/components/FeedbackForm.tsx @@ -1,4 +1,3 @@ -import ky from "ky"; import { ChangeEvent, FormEvent, useState } from "react"; import InputMask from "react-input-mask"; import AsteriskIcon from "./icons/AsteriskIcon"; @@ -6,6 +5,7 @@ import SendIcon from "./icons/SendIcon"; import CheckGradientIcon from "./icons/CheckGradientIcon"; import LoaderIcon from "./icons/LoaderIcon"; import Button from "./Button"; +import api from "../utils/api"; function FeedbackForm() { const [name, setName] = useState(""); @@ -21,8 +21,8 @@ function FeedbackForm() { setIsLoading(true); try { - await ky - .post(`https://estate.graff.tech/api/mail1`, { + await api + .post("mail", { json: { fullname: name, phone, @@ -124,11 +124,19 @@ function FeedbackForm() {
Нажимая кнопку отправить, вы принимаете{" "} - + условия использования {" "} и{" "} - + политику конфиденциальности
diff --git a/client/src/components/ModalContainer.tsx b/client/src/components/ModalContainer.tsx index f853402..8717dcc 100644 --- a/client/src/components/ModalContainer.tsx +++ b/client/src/components/ModalContainer.tsx @@ -1,25 +1,17 @@ import useModalStore from "../stores/useModalStore"; -import CloseIcon from "./icons/CloseIcon"; function ModalContainer() { - const [modal, setModal] = useModalStore((state) => [ - state.modal, - state.setModal, - ]); + const [modal] = useModalStore((state) => [state.modal]); if (modal) { return (
setModal(null)} - className={`min-h-screen p-8 absolute top-0 left-0 w-full flex justify-center items-center bg-black bg-opacity-30 overflow-auto transition-opacity`} + className={`fixed p-8 top-0 left-0 w-full h-full flex justify-center items-center bg-black bg-opacity-80 overflow-auto transition-opacity`} >
e.stopPropagation()} className="cursor-default"> {modal}
- -
); } diff --git a/client/src/components/MoreProjectButton.tsx b/client/src/components/MoreProjectButton.tsx index 18cccf1..72af7e4 100644 --- a/client/src/components/MoreProjectButton.tsx +++ b/client/src/components/MoreProjectButton.tsx @@ -2,10 +2,10 @@ import { motion } from "framer-motion"; import PlusIcon from "./icons/PlusIcon"; interface MoreProjectButtonProps { - handleClick?: () => void; + onClick?: () => void; } -function MoreProjectButton({ handleClick }: MoreProjectButtonProps) { +function MoreProjectButton({ onClick }: MoreProjectButtonProps) { return (

Показать еще

diff --git a/client/src/components/ProjectCard.tsx b/client/src/components/ProjectCard.tsx index ed7e433..53e4de0 100644 --- a/client/src/components/ProjectCard.tsx +++ b/client/src/components/ProjectCard.tsx @@ -28,7 +28,7 @@ function ProjectCard({
@@ -36,7 +36,7 @@ function ProjectCard({

{name}

- {company}, {city} + {company !== "-" && `${company},`} {city}

diff --git a/client/src/components/StreamButton.tsx b/client/src/components/StreamButton.tsx index 75f7a34..ca99a59 100644 --- a/client/src/components/StreamButton.tsx +++ b/client/src/components/StreamButton.tsx @@ -37,9 +37,11 @@ function StreamButton({
-
+

начать демонстрацию

diff --git a/client/src/components/VideoSliderMobile.tsx b/client/src/components/VideoSliderMobile.tsx index a00f2e8..5f6b162 100644 --- a/client/src/components/VideoSliderMobile.tsx +++ b/client/src/components/VideoSliderMobile.tsx @@ -12,53 +12,53 @@ function VideoSliderMobile() { { title: "Виртуальный тур по жилому комплексу", desc: "Клиент лично оценит угол инсоляции, малые архитектурные формы и ландшафт, перемещаясь по комплексу с помощью тапа.", - video: "https://graff.estate/videos/features/virtual_tour.mp4", + video: "/videos/features/virtual_tour.mp4", }, { title: "Вся инфрастуктура на одном экране", desc: "Возможность оценить инфраструктуру района покажет важные для клиента точки интереса и время, за которое он сможет до них дойти.", - video: "https://graff.estate/videos/features/nks_infra.mp4", + video: "/videos/features/nks_infra.mp4", }, { title: "Конфигуратор интерьера", desc: "Клиент может свободно выбирать мебель и дизайн с помощью конфигуратора интерьера. Возможно выбрать стиль всей квартиры или изменить отдельные детали.", - video: "https://graff.estate/videos/features/uralsky.mp4", + video: "/videos/features/uralsky.mp4", }, { title: "Параметрический поиск квартир", desc: "Фильтр позволит отметить конкретные преимущества, определить количество комнат, желаемый этаж, цену, и получить выборку подходящих вариантов.", - video: "https://graff.estate/videos/features/parametric.mp4", + video: "/videos/features/parametric.mp4", }, { title: "Любой рендер за несколько секунд", desc: "Когда для рекламы вам понадобится любой объект с любого ракурса, просто сделайте фотографию внутри презентации.", - video: "https://graff.estate/videos/features/render.mp4", + video: "/videos/features/render.mp4", }, { title: "Формирование вишлиста", desc: "Клиент может добавить варианты квартир в избранное, сравнить их между собой по основным параметрам и выбрать свою будущую квартиру.", - video: "https://graff.estate/videos/features/wish.mp4", + video: "/videos/features/wish.mp4", }, { title: "Интеграция с CRM-системой", desc: "Приложение передает информацию о клиенте в CRM-систему застройщика и получает актуальную информацию по ценам и статусам квартир.", - video: "https://graff.estate/videos/features/integra_crm.mp4", + video: "/videos/features/integra_crm.mp4", }, { title: "Отправка коммерческого предложения", desc: "Коммерческое предложение с выбранными квартирами может быть отправлено клиенту на почту или распечатано и отдано лично в руки.", - video: "https://graff.estate/videos/features/send.mp4", - }, - { - title: "Интерактивная инсоляция", - desc: "Функция позволяет в режиме реального времени увидеть уровень освещенности выбранной квартиры, а если вы изучаете экстерьер жилого комплекса – функция покажет архитектурную подсветку.", - video: "", - }, - { - title: "Подбор квартир на генплане", - desc: "Сделать генплан удобным инструментом выбора квартиры поможет подсветка выбранных квартир прямо на фасаде Жилого комплекса.", - video: "", + video: "/videos/features/send.mp4", }, + // { + // title: "Интерактивная инсоляция", + // desc: "Функция позволяет в режиме реального времени увидеть уровень освещенности выбранной квартиры, а если вы изучаете экстерьер жилого комплекса – функция покажет архитектурную подсветку.", + // video: "", + // }, + // { + // title: "Подбор квартир на генплане", + // desc: "Сделать генплан удобным инструментом выбора квартиры поможет подсветка выбранных квартир прямо на фасаде Жилого комплекса.", + // video: "", + // }, ]); const [activeIndex, setActiveIndex] = useState(0); diff --git a/client/src/components/blendings/BlendStream.tsx b/client/src/components/blendings/BlendStream.tsx deleted file mode 100644 index b6306c8..0000000 --- a/client/src/components/blendings/BlendStream.tsx +++ /dev/null @@ -1,798 +0,0 @@ -function BlendStream() { - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} - -export default BlendStream; diff --git a/client/src/components/blendings/BlendVR.tsx b/client/src/components/blendings/BlendVR.tsx deleted file mode 100644 index 60aed7d..0000000 --- a/client/src/components/blendings/BlendVR.tsx +++ /dev/null @@ -1,353 +0,0 @@ -function BlendVR() { - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} - -export default BlendVR; diff --git a/client/src/components/blendings/BlendingCalc.tsx b/client/src/components/blendings/BlendingCalc.tsx deleted file mode 100644 index 93e1e66..0000000 --- a/client/src/components/blendings/BlendingCalc.tsx +++ /dev/null @@ -1,352 +0,0 @@ -function BlendingCalc() { - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} - -export default BlendingCalc; diff --git a/client/src/components/blendings/BlendingClients.tsx b/client/src/components/blendings/BlendingClients.tsx deleted file mode 100644 index f697c94..0000000 --- a/client/src/components/blendings/BlendingClients.tsx +++ /dev/null @@ -1,352 +0,0 @@ -function BlendingClients() { - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} - -export default BlendingClients; diff --git a/client/src/components/blendings/BlendingFeatures.tsx b/client/src/components/blendings/BlendingFeatures.tsx deleted file mode 100644 index 1871c55..0000000 --- a/client/src/components/blendings/BlendingFeatures.tsx +++ /dev/null @@ -1,798 +0,0 @@ -function BlendingFeatures() { - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} - -export default BlendingFeatures; diff --git a/client/src/components/blendings/BlendingHeader.tsx b/client/src/components/blendings/BlendingHeader.tsx deleted file mode 100644 index a9cd3f6..0000000 --- a/client/src/components/blendings/BlendingHeader.tsx +++ /dev/null @@ -1,374 +0,0 @@ -function Blending1() { - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} - -export default Blending1; diff --git a/client/src/components/icons/Close2Icon.tsx b/client/src/components/icons/Close2Icon.tsx new file mode 100644 index 0000000..5d56747 --- /dev/null +++ b/client/src/components/icons/Close2Icon.tsx @@ -0,0 +1,26 @@ +interface IconProps { + className?: string; +} + +function Close2Icon({ className }: IconProps) { + return ( + + + + ); +} + +export default Close2Icon; diff --git a/client/src/components/modals/CreateProjectModal.tsx b/client/src/components/modals/CreateProjectModal.tsx index b3b3a6f..cfdcfc5 100644 --- a/client/src/components/modals/CreateProjectModal.tsx +++ b/client/src/components/modals/CreateProjectModal.tsx @@ -6,6 +6,7 @@ import Button from "../Button"; import IProject from "../../types/IProject"; import useModalStore from "../../stores/useModalStore"; import { format } from "date-fns"; +import Close2Icon from "../icons/Close2Icon"; function CreateProjectModal() { const [project, setProject] = useState({ @@ -41,7 +42,10 @@ function CreateProjectModal() { .post("upload", { body: formData }) .json(); - setProject((prev) => ({ ...prev, image: file })); + setProject((prev) => ({ + ...prev, + image: `${import.meta.env.VITE_API_URL}/api/${file}`, + })); } catch (error) { if (error instanceof Error) { alert(`Error: ${error.message}`); @@ -75,7 +79,15 @@ function CreateProjectModal() { return (
-

Создание проекта

+
+

Создание проекта

+ +
-

Удаление проекта

+
+

Удаление проекта

+ +
+

{file ? file.name : "Выберите изображение"}

- {project.image && } - {previewFile && } + {previewFile ? ( + + ) : ( + project.image && + )}
diff --git a/client/src/components/modals/FeedbackModal.tsx b/client/src/components/modals/FeedbackModal.tsx new file mode 100644 index 0000000..8ce5bf9 --- /dev/null +++ b/client/src/components/modals/FeedbackModal.tsx @@ -0,0 +1,13 @@ +import ContactsForm from "../ContactsForm"; + +function FeedbackModal() { + return ( +
+
+ +
+
+ ); +} + +export default FeedbackModal; diff --git a/client/src/main.tsx b/client/src/main.tsx index a0f54b7..4e1ac20 100644 --- a/client/src/main.tsx +++ b/client/src/main.tsx @@ -2,22 +2,17 @@ import ReactDOM from "react-dom/client"; import { createBrowserRouter, RouterProvider } from "react-router-dom"; import App from "./App.tsx"; import "./index.css"; -import ProjectsPage from "./pages/ProjectsPage.tsx"; -import TestPage from "./pages/TestPage.tsx"; +// import ProjectsPage from "./pages/ProjectsPage.tsx"; const router = createBrowserRouter([ { path: "/", element: , }, - { - path: "/projects", - element: , - }, - { - path: "/test", - element: , - }, + // { + // path: "/projects", + // element: , + // }, ]); ReactDOM.createRoot(document.getElementById("root")!).render( diff --git a/client/src/pages/ProjectsPage.tsx b/client/src/pages/ProjectsPage.tsx index e29e637..39211b9 100644 --- a/client/src/pages/ProjectsPage.tsx +++ b/client/src/pages/ProjectsPage.tsx @@ -37,7 +37,7 @@ function ProjectsPage() {
-
diff --git a/client/src/utils/api.ts b/client/src/utils/api.ts index 74ccfa8..676012b 100644 --- a/client/src/utils/api.ts +++ b/client/src/utils/api.ts @@ -1,7 +1,7 @@ import ky from "ky"; const api = ky.extend({ - prefixUrl: import.meta.env.VITE_API_URL, + prefixUrl: `${import.meta.env.VITE_API_URL}/api`, }); export default api; diff --git a/client/src/utils/randomNumber.ts b/client/src/utils/randomNumber.ts new file mode 100644 index 0000000..2569ed0 --- /dev/null +++ b/client/src/utils/randomNumber.ts @@ -0,0 +1,3 @@ +export default function randomNumber(min: number, max: number) { + return Math.floor(Math.random() * (max - min) + min); +} diff --git a/client/vite.config.ts b/client/vite.config.ts index d366e8c..326ec3a 100644 --- a/client/vite.config.ts +++ b/client/vite.config.ts @@ -1,7 +1,32 @@ -import { defineConfig } from "vite"; +import { defineConfig, loadEnv } from "vite"; import react from "@vitejs/plugin-react-swc"; // https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], +export default defineConfig(({ mode }) => { + process.env = { ...process.env, ...loadEnv(mode, process.cwd()) }; + // const env = loadEnv(mode, process.cwd()); + + return { + plugins: [react()], + server: { + port: 3002, + proxy: { + "/api": { + target: process.env.VITE_API_URL, + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, ""), + }, + }, + }, + preview: { + port: 3002, + proxy: { + "/api": { + target: process.env.VITE_API_URL, + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, ""), + }, + }, + }, + }; }); diff --git a/client/yarn.lock b/client/yarn.lock index c100d0e..4bb54fb 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -334,6 +334,13 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/node@^20.10.5": + version "20.10.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" + integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== + dependencies: + undici-types "~5.26.4" + "@types/prop-types@*": version "15.7.10" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.10.tgz#892afc9332c4d62a5ea7e897fe48ed2085bbb08a" @@ -1484,6 +1491,11 @@ react-swipeable@^7.0.1: resolved "https://registry.yarnpkg.com/react-swipeable/-/react-swipeable-7.0.1.tgz#cd299f5986c5e4a7ee979839658c228f660e1e0c" integrity sha512-RKB17JdQzvECfnVj9yDZsiYn3vH0eyva/ZbrCZXZR0qp66PBRhtg4F9yJcJTWYT5Adadi+x4NoG53BxKHwIYLQ== +react-yandex-metrika@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/react-yandex-metrika/-/react-yandex-metrika-2.6.0.tgz#9c935c8c7ea5505e34391b9b3e86deb6d50053c9" + integrity sha512-8K4wExsNZtY3DTxh1G8a+zWH9Pg8fw23MJcoJ4I/562qrHRnh7L5nteq3lnNL58dnNQbuuHIRoGgMjIo+r1GjA== + react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -1719,6 +1731,11 @@ ua-parser-js@^1.0.33: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" diff --git a/server/.env b/server/.env index b2b3968..020f99e 100644 --- a/server/.env +++ b/server/.env @@ -1,3 +1,3 @@ -PORT=3000 +PORT=3003 MONGO_URI=mongodb://root:p62Z!ZatgY25@194.26.138.94:27017/ JWT_SECRET=yDcdWJgvlj2bJAuovYfQHTvtc3U9xQPw \ No newline at end of file diff --git a/server/ecosystem.config.js b/server/ecosystem.config.js new file mode 100644 index 0000000..646f9dd --- /dev/null +++ b/server/ecosystem.config.js @@ -0,0 +1,10 @@ +module.exports = { + apps: [ + { + name: "graff.estate-server:3003", + exec_mode: "cluster", + script: "yarn", + args: "start", + }, + ], +}; diff --git a/server/package.json b/server/package.json index 2373119..1e6ccca 100644 --- a/server/package.json +++ b/server/package.json @@ -2,9 +2,8 @@ "name": "server", "private": true, "version": "0.0.0", - "type": "module", "scripts": { - "dev": "nodemon --exec node --no-warnings=ExperimentalWarning --loader=ts-node/esm src/index.ts", + "dev": "nodemon src/index.ts", "build": "npx tsc", "start": "node dist/index.js" }, @@ -12,16 +11,20 @@ "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", + "express-sslify": "^1.2.0", "mongoose": "^8.0.1", "multer": "^1.4.5-lts.1", + "nodemailer": "^6.9.7", "sharp": "^0.32.6", "uuid": "^9.0.1" }, "devDependencies": { "@types/cors": "^2.8.15", "@types/express": "^4.17.20", + "@types/express-sslify": "^1.2.5", "@types/multer": "^1.4.11", "@types/node": "^20.8.10", + "@types/nodemailer": "^6.4.14", "@types/uuid": "^9.0.7", "nodemon": "^3.0.1", "ts-node": "^10.9.1", diff --git a/server/src/index.ts b/server/src/index.ts index 97bb8e2..81cf5e2 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -2,19 +2,19 @@ import "dotenv/config"; import connectDB from "./config/db"; import express, { json } from "express"; import cors from "cors"; -import uploadRouter from "./routes/upload"; -import projectsRouter from "./routes/projects"; +import mailRoute from "./routes/mail"; +import projectRoute from "./routes/projects"; -await connectDB(); +connectDB(); const app = express(); -const port = process.env.PORT || 3000; +const port = process.env.PORT || 3003; app.use(json()); -app.use(cors()); +app.use(cors({ origin: "*" })); -app.use("/upload", uploadRouter); -app.use("/projects", projectsRouter); +app.use("/mail", mailRoute); +app.use("/projects", projectRoute); app.listen(port, () => { console.log(`Server is listening on port ${port}`); diff --git a/server/src/models/Mail.ts b/server/src/models/Mail.ts new file mode 100644 index 0000000..3ca9eea --- /dev/null +++ b/server/src/models/Mail.ts @@ -0,0 +1,32 @@ +import { Schema, model } from "mongoose"; + +const mailSchema = new Schema( + { + fullname: { + type: String, + required: true, + }, + email: { + type: String, + required: true, + }, + phone: { + type: String, + }, + request: { + type: String, + }, + referer: { + type: String, + }, + }, + { + timestamps: true, + toJSON: { virtuals: true }, + toObject: { virtuals: true }, + } +); + +const Mail = model("Mail", mailSchema); + +export default Mail; diff --git a/server/src/routes/mail.ts b/server/src/routes/mail.ts new file mode 100644 index 0000000..a22f829 --- /dev/null +++ b/server/src/routes/mail.ts @@ -0,0 +1,57 @@ +import { Router } from "express"; +import Mail from "../models/Mail"; +import nodemailer from "nodemailer"; + +const router = Router(); + +router.post("/", async (req, res) => { + try { + const referer = req.headers.referer; + const { fullname, email, phone, request } = req.body; + + await Mail.create({ fullname, email, phone, request, referer }); + + // create reusable transporter object using the default SMTP transport + let transporter = nodemailer.createTransport({ + host: "mail.netangels.ru", + port: 587, + secure: false, // true for 465, false for other ports + auth: { + user: "test@graff.tech", // generated ethereal user + pass: "ZmL0pKiDFWUyCDMq", // generated ethereal password + }, + }); + + // send mail with defined transport object + let info = await transporter.sendMail({ + from: email, // sender address + to: "info@graff.tech", // list of receivers + subject: "Заявка с сайта graff.estate", // Subject line + text: ` + Имя Фамилия: ${fullname} + Email: ${email} + Телефон: ${phone} + Текст запроса: ${request} + `, // plain text body + html: `
+

Имя: ${fullname}

+

Email: ${email}

+

Телефон: ${phone}

+

Текст запроса: ${request}

+
`, // html body + }); + + console.log(info); + + console.log(req.body); + + res.json({ ok: 1 }); + } catch (error) { + console.log(error); + res.json({ error: 1 }); + } +}); + +const mailRoute = router; + +export default mailRoute; diff --git a/server/src/routes/projects.ts b/server/src/routes/projects.ts index 3aed427..1b675be 100644 --- a/server/src/routes/projects.ts +++ b/server/src/routes/projects.ts @@ -5,7 +5,7 @@ const router = Router(); router.get("/", async (_req, res) => { try { - const projects = await Project.find().sort({ createdAt: -1 }); + const projects = await Project.find().sort({ releaseDate: -1 }); return res.json(projects); } catch (error) { @@ -66,5 +66,5 @@ router.delete("/:id", async (req, res) => { } }); -const projectsRouter = router; -export default projectsRouter; +const projectRoute = router; +export default projectRoute; diff --git a/server/src/routes/upload.ts b/server/src/routes/upload.ts index 6757ca1..94c636c 100644 --- a/server/src/routes/upload.ts +++ b/server/src/routes/upload.ts @@ -1,61 +1,77 @@ import { Router } from "express"; -import multer, { memoryStorage } from "multer"; -import sharp from "sharp"; -import fs from "fs"; -import { v4 as uuidv4 } from "uuid"; +// import multer, { memoryStorage } from "multer"; +// import sharp from "sharp"; +// import fs from "fs"; +import path from "path"; +// import { v4 as uuidv4 } from "uuid"; const router = Router(); -const upload = multer({ - dest: "uploads/", - storage: memoryStorage(), - fileFilter: (_req, file, cb) => { - if (file.mimetype.split("/")[0] === "image") { - cb(null, true); - } else { - cb(new Error("Only images are allowed!")); - } - }, +// const upload = multer({ +// dest: "uploads/", +// storage: memoryStorage(), +// fileFilter: (_req, file, cb) => { +// if (file.mimetype.split("/")[0] === "image") { +// cb(null, true); +// } else { +// cb(new Error("Only images are allowed!")); +// } +// }, +// }); + +router.get("/", (_req, res) => { + res.json({ ok: 1 }); }); -router.get("/:file", (req, res) => { - const fileName = req.params.file; +// router.get("/:filename", (req, res) => { +// res.sendFile(`${path.resolve("uploads")}/${req.params.filename}`); +// }); - try { - const readStream = fs.createReadStream(`uploads/${fileName}`); - readStream.pipe(res); - } catch (error) { - if (error instanceof Error) { - return res.json({ error: error.message }); - } - } -}); +// router.get("/:file", (req, res) => { +// const fileName = req.params.file; -router.post("/", upload.single("file"), async (req, res) => { - if (!req.file) { - return res.json({ error: "req.file" }); - } +// console.log(fileName); - try { - const filename = `${uuidv4()}.jpg`; +// try { +// const readStream = fs.createReadStream( +// `${path.join(__dirname, "uploads")}/${fileName}` +// ); - await sharp(req.file.buffer) - .resize({ - width: 728, - height: 728, - fit: "inside", - withoutEnlargement: true, - }) - .jpeg({ quality: 90 }) - .toFile(`uploads/${filename}`); +// console.log(readStream); - return res.json({ file: `http://192.168.1.171:3000/upload/${filename}` }); - } catch (error) { - if (error instanceof Error) { - return res.json({ error: error.message }); - } - } -}); +// readStream.pipe(res); +// } catch (error) { +// if (error instanceof Error) { +// return res.json({ error: error.message }); +// } +// } +// }); -const uploadRouter = router; -export default uploadRouter; +// router.post("/", upload.single("file"), async (req, res) => { +// if (!req.file) { +// return res.json({ error: "req.file" }); +// } + +// try { +// const filename = `${uuidv4()}.jpg`; + +// await sharp(req.file.buffer) +// .resize({ +// width: 728, +// height: 728, +// fit: "inside", +// withoutEnlargement: true, +// }) +// .jpeg({ quality: 90 }) +// .toFile(`uploads/${filename}`); + +// return res.json({ file: `/upload/${filename}` }); +// } catch (error) { +// if (error instanceof Error) { +// return res.json({ error: error.message }); +// } +// } +// }); + +const uploadRoute = router; +export default uploadRoute; diff --git a/server/tsconfig.json b/server/tsconfig.json index 9fb5481..e7913fc 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -1,114 +1,18 @@ { "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "ES2020" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "ESNext" /* Specify what module code is generated. */, - // "rootDir": "./", /* Specify the root folder within your source files. */ - "moduleResolution": "Node" /* Specify how TypeScript looks up a file from a given module specifier. */, - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "outDir": "./dist" /* Specify an output folder for all emitted files. */, - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, - - /* Type Checking */ - "strict": true /* Enable all strict type-checking options. */, - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - "noUnusedLocals": true /* Enable error reporting when local variables aren't read. */, - "noUnusedParameters": true /* Raise an error when a function parameter isn't read. */, - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - "noFallthroughCasesInSwitch": true /* Enable error reporting for fallthrough cases in switch statements. */, - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ + "target": "ESNext", + "module": "CommonJS", + "moduleResolution": "Node", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true }, "ts-node": { - "esm": true, - "experimentalSpecifierResolution": "node", "transpileOnly": true } } diff --git a/server/uploads/02e37966-d5c0-4197-9a07-bd0899977581.jpg b/server/uploads/02e37966-d5c0-4197-9a07-bd0899977581.jpg new file mode 100644 index 0000000..6892cb5 Binary files /dev/null and b/server/uploads/02e37966-d5c0-4197-9a07-bd0899977581.jpg differ diff --git a/server/uploads/1072c768-1284-4a2e-ac79-8ee02cc00bd7.jpg b/server/uploads/1072c768-1284-4a2e-ac79-8ee02cc00bd7.jpg new file mode 100644 index 0000000..ba905c1 Binary files /dev/null and b/server/uploads/1072c768-1284-4a2e-ac79-8ee02cc00bd7.jpg differ diff --git a/server/uploads/10ebf169-8aaa-4226-8c83-47e7e73ed7a1.jpg b/server/uploads/10ebf169-8aaa-4226-8c83-47e7e73ed7a1.jpg new file mode 100644 index 0000000..30b72ae Binary files /dev/null and b/server/uploads/10ebf169-8aaa-4226-8c83-47e7e73ed7a1.jpg differ diff --git a/server/uploads/1fd4e736-65ec-4ddd-a95c-c95fdbf4505d.jpg b/server/uploads/1fd4e736-65ec-4ddd-a95c-c95fdbf4505d.jpg new file mode 100644 index 0000000..edc4cdb Binary files /dev/null and b/server/uploads/1fd4e736-65ec-4ddd-a95c-c95fdbf4505d.jpg differ diff --git a/server/uploads/21f326b4-4827-4726-81d6-05b42976ca5a.jpg b/server/uploads/21f326b4-4827-4726-81d6-05b42976ca5a.jpg new file mode 100644 index 0000000..5a99e48 Binary files /dev/null and b/server/uploads/21f326b4-4827-4726-81d6-05b42976ca5a.jpg differ diff --git a/server/uploads/22633312-9762-4e27-a846-0f5fbdd2f168.jpg b/server/uploads/22633312-9762-4e27-a846-0f5fbdd2f168.jpg new file mode 100644 index 0000000..0bb610a Binary files /dev/null and b/server/uploads/22633312-9762-4e27-a846-0f5fbdd2f168.jpg differ diff --git a/server/uploads/26097c7a-b6ff-49e3-9045-deb284db3ca6.jpg b/server/uploads/26097c7a-b6ff-49e3-9045-deb284db3ca6.jpg new file mode 100644 index 0000000..b7cca85 Binary files /dev/null and b/server/uploads/26097c7a-b6ff-49e3-9045-deb284db3ca6.jpg differ diff --git a/server/uploads/30092de7-1476-4f37-8d49-faf689384f36.jpg b/server/uploads/30092de7-1476-4f37-8d49-faf689384f36.jpg new file mode 100644 index 0000000..6a8d4e5 Binary files /dev/null and b/server/uploads/30092de7-1476-4f37-8d49-faf689384f36.jpg differ diff --git a/server/uploads/3b51a99a-f8a8-411b-a4de-c4b57604e136.jpg b/server/uploads/3b51a99a-f8a8-411b-a4de-c4b57604e136.jpg new file mode 100644 index 0000000..793e3bc Binary files /dev/null and b/server/uploads/3b51a99a-f8a8-411b-a4de-c4b57604e136.jpg differ diff --git a/server/uploads/3e51ec53-c6c0-452a-9493-1463dea63f53.jpg b/server/uploads/3e51ec53-c6c0-452a-9493-1463dea63f53.jpg new file mode 100644 index 0000000..58cea8d Binary files /dev/null and b/server/uploads/3e51ec53-c6c0-452a-9493-1463dea63f53.jpg differ diff --git a/server/uploads/441b3c15-2885-4fd2-82bb-395aecd05ca5.jpg b/server/uploads/441b3c15-2885-4fd2-82bb-395aecd05ca5.jpg new file mode 100644 index 0000000..471e6cd Binary files /dev/null and b/server/uploads/441b3c15-2885-4fd2-82bb-395aecd05ca5.jpg differ diff --git a/server/uploads/48b37509-d993-447d-ba9b-bc1d4a6b678c.jpg b/server/uploads/48b37509-d993-447d-ba9b-bc1d4a6b678c.jpg new file mode 100644 index 0000000..4f386d7 Binary files /dev/null and b/server/uploads/48b37509-d993-447d-ba9b-bc1d4a6b678c.jpg differ diff --git a/server/uploads/57cec318-7f36-4190-9db4-03e5eacd0af1.jpg b/server/uploads/57cec318-7f36-4190-9db4-03e5eacd0af1.jpg new file mode 100644 index 0000000..2faeaf3 Binary files /dev/null and b/server/uploads/57cec318-7f36-4190-9db4-03e5eacd0af1.jpg differ diff --git a/server/uploads/598e1932-2475-46ff-b620-6822c7feee3c.jpg b/server/uploads/598e1932-2475-46ff-b620-6822c7feee3c.jpg new file mode 100644 index 0000000..7281d18 Binary files /dev/null and b/server/uploads/598e1932-2475-46ff-b620-6822c7feee3c.jpg differ diff --git a/server/uploads/63bba9b5-da3a-4e0d-ad2a-f642246f8a1f.jpg b/server/uploads/63bba9b5-da3a-4e0d-ad2a-f642246f8a1f.jpg new file mode 100644 index 0000000..574993d Binary files /dev/null and b/server/uploads/63bba9b5-da3a-4e0d-ad2a-f642246f8a1f.jpg differ diff --git a/server/uploads/6464a678-05a2-484c-b716-eec441dc7f6d.jpg b/server/uploads/6464a678-05a2-484c-b716-eec441dc7f6d.jpg new file mode 100644 index 0000000..56a3b54 Binary files /dev/null and b/server/uploads/6464a678-05a2-484c-b716-eec441dc7f6d.jpg differ diff --git a/server/uploads/6513f9e5-ae6d-4915-a5d7-1e0d1ec42178.jpg b/server/uploads/6513f9e5-ae6d-4915-a5d7-1e0d1ec42178.jpg new file mode 100644 index 0000000..e470928 Binary files /dev/null and b/server/uploads/6513f9e5-ae6d-4915-a5d7-1e0d1ec42178.jpg differ diff --git a/server/uploads/768a430e-a858-40f0-be26-ba01f91cf950.jpg b/server/uploads/768a430e-a858-40f0-be26-ba01f91cf950.jpg new file mode 100644 index 0000000..69c4e14 Binary files /dev/null and b/server/uploads/768a430e-a858-40f0-be26-ba01f91cf950.jpg differ diff --git a/server/uploads/6390e7ea-9b80-4f77-b923-19565a799aaf.jpg b/server/uploads/7e28445b-f530-4a4a-9148-be947264e4d4.jpg similarity index 100% rename from server/uploads/6390e7ea-9b80-4f77-b923-19565a799aaf.jpg rename to server/uploads/7e28445b-f530-4a4a-9148-be947264e4d4.jpg diff --git a/server/uploads/811c3281-8375-4cba-9ad2-1d06bf0811e9.jpg b/server/uploads/811c3281-8375-4cba-9ad2-1d06bf0811e9.jpg new file mode 100644 index 0000000..c7e5174 Binary files /dev/null and b/server/uploads/811c3281-8375-4cba-9ad2-1d06bf0811e9.jpg differ diff --git a/server/uploads/92413a8f-e523-4591-b7f8-ed0079dd0b65.jpg b/server/uploads/92413a8f-e523-4591-b7f8-ed0079dd0b65.jpg new file mode 100644 index 0000000..a3a97a3 Binary files /dev/null and b/server/uploads/92413a8f-e523-4591-b7f8-ed0079dd0b65.jpg differ diff --git a/server/uploads/b2c89001-0929-4fb0-8450-9abcd2ed4e39.jpg b/server/uploads/a2a15f04-707f-47a7-ab84-da55520b9b7c.jpg similarity index 100% rename from server/uploads/b2c89001-0929-4fb0-8450-9abcd2ed4e39.jpg rename to server/uploads/a2a15f04-707f-47a7-ab84-da55520b9b7c.jpg diff --git a/server/uploads/adb3dafa-ba9a-4000-8e1b-8985eb10772f.jpg b/server/uploads/adb3dafa-ba9a-4000-8e1b-8985eb10772f.jpg new file mode 100644 index 0000000..91b8560 Binary files /dev/null and b/server/uploads/adb3dafa-ba9a-4000-8e1b-8985eb10772f.jpg differ diff --git a/server/uploads/b0272f18-996d-4211-9eb7-4020073a14db.jpg b/server/uploads/b0272f18-996d-4211-9eb7-4020073a14db.jpg new file mode 100644 index 0000000..bbc8879 Binary files /dev/null and b/server/uploads/b0272f18-996d-4211-9eb7-4020073a14db.jpg differ diff --git a/server/uploads/be094ff5-e782-4c4f-8c8c-f509c4cc3faf.jpg b/server/uploads/be094ff5-e782-4c4f-8c8c-f509c4cc3faf.jpg new file mode 100644 index 0000000..bc9a13d Binary files /dev/null and b/server/uploads/be094ff5-e782-4c4f-8c8c-f509c4cc3faf.jpg differ diff --git a/server/uploads/bed3c81a-b812-452f-b3e4-3844121930d0.jpg b/server/uploads/bed3c81a-b812-452f-b3e4-3844121930d0.jpg new file mode 100644 index 0000000..57a406e Binary files /dev/null and b/server/uploads/bed3c81a-b812-452f-b3e4-3844121930d0.jpg differ diff --git a/server/uploads/c46e7516-256b-4c0e-9d5b-b9ef887f14dd.jpg b/server/uploads/c46e7516-256b-4c0e-9d5b-b9ef887f14dd.jpg new file mode 100644 index 0000000..fe8c0bb Binary files /dev/null and b/server/uploads/c46e7516-256b-4c0e-9d5b-b9ef887f14dd.jpg differ diff --git a/server/uploads/c8739341-c581-49d2-8c04-5075dc5a48de.jpg b/server/uploads/c8739341-c581-49d2-8c04-5075dc5a48de.jpg new file mode 100644 index 0000000..06a63d0 Binary files /dev/null and b/server/uploads/c8739341-c581-49d2-8c04-5075dc5a48de.jpg differ diff --git a/server/uploads/ca03e2a6-daeb-40b5-9ed7-c163663eb034.jpg b/server/uploads/ca03e2a6-daeb-40b5-9ed7-c163663eb034.jpg new file mode 100644 index 0000000..697b45a Binary files /dev/null and b/server/uploads/ca03e2a6-daeb-40b5-9ed7-c163663eb034.jpg differ diff --git a/server/uploads/cb92d1d9-f606-4618-a55b-4cda66a445e9.jpg b/server/uploads/cb92d1d9-f606-4618-a55b-4cda66a445e9.jpg new file mode 100644 index 0000000..c2b8548 Binary files /dev/null and b/server/uploads/cb92d1d9-f606-4618-a55b-4cda66a445e9.jpg differ diff --git a/server/uploads/ceeda8b7-0c83-4a65-a879-50145b4b9f27.jpg b/server/uploads/ceeda8b7-0c83-4a65-a879-50145b4b9f27.jpg new file mode 100644 index 0000000..e88b2a2 Binary files /dev/null and b/server/uploads/ceeda8b7-0c83-4a65-a879-50145b4b9f27.jpg differ diff --git a/server/uploads/d11013f1-66ab-40c2-83b0-198368cb34f5.jpg b/server/uploads/d11013f1-66ab-40c2-83b0-198368cb34f5.jpg new file mode 100644 index 0000000..6a8d4e5 Binary files /dev/null and b/server/uploads/d11013f1-66ab-40c2-83b0-198368cb34f5.jpg differ diff --git a/server/uploads/eeba427d-dea5-4336-81d1-8a7fadcbbe6a.jpg b/server/uploads/eeba427d-dea5-4336-81d1-8a7fadcbbe6a.jpg new file mode 100644 index 0000000..edc4cdb Binary files /dev/null and b/server/uploads/eeba427d-dea5-4336-81d1-8a7fadcbbe6a.jpg differ diff --git a/server/uploads/ff2722b1-30c9-4947-84f4-03fd7576e638.jpg b/server/uploads/ff2722b1-30c9-4947-84f4-03fd7576e638.jpg new file mode 100644 index 0000000..618adce Binary files /dev/null and b/server/uploads/ff2722b1-30c9-4947-84f4-03fd7576e638.jpg differ diff --git a/server/yarn.lock b/server/yarn.lock index 9dc7739..6bac2af 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -86,6 +86,13 @@ "@types/range-parser" "*" "@types/send" "*" +"@types/express-sslify@^1.2.5": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/express-sslify/-/express-sslify-1.2.5.tgz#1ee100084d8563ff46feabf0af54c072170f99c4" + integrity sha512-SxezXJqojxyTkkemmPQ9bUZQ3xLpzasA/I7bSTqt7tF6L4KNvfOlmcwjZ38tSolkf3oeQu20UVXh74ZBb8IUZA== + dependencies: + "@types/express" "*" + "@types/express@*", "@types/express@^4.17.20": version "4.17.21" resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz" @@ -125,6 +132,13 @@ dependencies: undici-types "~5.26.4" +"@types/nodemailer@^6.4.14": + version "6.4.14" + resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.14.tgz#5c81a5e856db7f8ede80013e6dbad7c5fb2283e2" + integrity sha512-fUWthHO9k9DSdPCSPRqcu6TWhYyxTBg382vlNIttSe9M7XfsT06y0f24KHXtbnijPGGRIcVvdKHTNikOI6qiHA== + dependencies: + "@types/node" "*" + "@types/qs@*": version "6.9.10" resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz" @@ -519,6 +533,11 @@ expand-template@^2.0.3: resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +express-sslify@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/express-sslify/-/express-sslify-1.2.0.tgz#30e84bceed1557eb187672bbe1430a0a2a100d9c" + integrity sha512-OOf2B3MxAVjEXPPWl4Z19wA2oMH+RCULJVhejPwuhiDDClr9QczZz5ycABLSnnN+oY8JcLs32ghs9cxOj0vi+w== + express@^4.18.2: version "4.18.2" resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" @@ -921,6 +940,11 @@ node-addon-api@^6.1.0: resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== +nodemailer@^6.9.7: + version "6.9.7" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.7.tgz#ec2f488f62ba1558e7b19239b62778df4a5c4397" + integrity sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw== + nodemon@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz"