From ffe0f3b74bf75dab255720c5fbf5673caf59bfb0 Mon Sep 17 00:00:00 2001 From: Oleksii Pohorelyi Date: Tue, 25 May 2021 09:04:03 +0300 Subject: [PATCH 01/46] AAA I can set an announcement with funnels and CTA button --- functions/venue.js | 3 +- src/api/bannerAdmin.ts | 2 +- .../AnnouncementMessage.scss | 13 +- .../AnnouncementMessage.tsx | 26 +-- src/components/molecules/NavBar/NavBar.tsx | 1 - .../organisms/BannerAdmin/BannerAdmin.scss | 22 +++ .../organisms/BannerAdmin/BannerAdmin.tsx | 155 +++++++++++++----- src/pages/Admin/Venue/VenueAdminPage.scss | 25 ++- src/pages/Admin/Venue/VenueAdminPage.tsx | 41 +++-- .../AnnouncementContainer.scss | 9 + .../AnnouncementContainer.tsx | 18 ++ .../VenuePage/AnnouncementContainer/index.ts | 1 + src/pages/VenuePage/TemplateWrapper.tsx | 26 +-- src/types/banner.ts | 9 + src/types/venues.ts | 3 +- 15 files changed, 264 insertions(+), 90 deletions(-) create mode 100644 src/components/organisms/BannerAdmin/BannerAdmin.scss create mode 100644 src/pages/VenuePage/AnnouncementContainer/AnnouncementContainer.scss create mode 100644 src/pages/VenuePage/AnnouncementContainer/AnnouncementContainer.tsx create mode 100644 src/pages/VenuePage/AnnouncementContainer/index.ts create mode 100644 src/types/banner.ts diff --git a/functions/venue.js b/functions/venue.js index 569fff6525..ecdcdb3c4b 100644 --- a/functions/venue.js +++ b/functions/venue.js @@ -863,6 +863,7 @@ exports.adminHideVenue = functions.https.onCall(async (data, context) => { admin.firestore().collection("venues").doc(venueId).update(updated); }); +//This will be change exports.adminUpdateBannerMessage = functions.https.onCall( async (data, context) => { await checkUserIsOwner(data.venueId, context.auth.token.user_id); @@ -870,7 +871,7 @@ exports.adminUpdateBannerMessage = functions.https.onCall( .firestore() .collection("venues") .doc(data.venueId) - .update({ bannerMessage: data.bannerMessage || null }); + .update({ banner: data.banner || null }); } ); diff --git a/src/api/bannerAdmin.ts b/src/api/bannerAdmin.ts index 9df2c4166f..f25020fcac 100644 --- a/src/api/bannerAdmin.ts +++ b/src/api/bannerAdmin.ts @@ -7,7 +7,7 @@ export const makeUpdateBanner = ( ) => async (message?: string): Promise => { const params = { venueId, - bannerMessage: message ?? "", + banner: message ?? {}, }; await firebase diff --git a/src/components/molecules/AnnouncementMessage/AnnouncementMessage.scss b/src/components/molecules/AnnouncementMessage/AnnouncementMessage.scss index 95055d4df4..3ca98f0a27 100644 --- a/src/components/molecules/AnnouncementMessage/AnnouncementMessage.scss +++ b/src/components/molecules/AnnouncementMessage/AnnouncementMessage.scss @@ -7,20 +7,13 @@ $message-margin: $spacing + $close-icon-width + 5px; .announcement-container { display: block; z-index: z(announcement); - position: absolute; + position: relative; background: $primary; - top: 66px; - left: 50%; - width: 500px; - margin: 0 auto 0 -250px; + width: 638px; transition: left 0.1s linear; - &.centered { - left: 50%; - } - padding: $spacing 0; - border-radius: 0 0 20px 20px; + border-radius: 20px; text-align: center; .close-button { diff --git a/src/components/molecules/AnnouncementMessage/AnnouncementMessage.tsx b/src/components/molecules/AnnouncementMessage/AnnouncementMessage.tsx index b73238edfe..dcc25db58b 100644 --- a/src/components/molecules/AnnouncementMessage/AnnouncementMessage.tsx +++ b/src/components/molecules/AnnouncementMessage/AnnouncementMessage.tsx @@ -9,12 +9,16 @@ import { RenderMarkdown } from "components/organisms/RenderMarkdown"; import "./AnnouncementMessage.scss"; +import { BannerFormData } from "types/banner"; + type AnnouncementMessageProps = { - message?: string; + banner?: BannerFormData; + isCancel?: boolean; }; export const AnnouncementMessage: React.FC = ({ - message = "", + banner, + isCancel = false, }) => { const [isVisible, setVisibility] = useState(false); const { isExpanded } = useChatSidebarControls(); @@ -24,12 +28,12 @@ export const AnnouncementMessage: React.FC = ({ }, []); useEffect(() => { - if (message) { + if (banner?.content) { setVisibility(true); } - }, [message]); + }, [banner]); - if (!isVisible || !message) return null; + if (!isVisible || !banner?.content) return null; return (
= ({ })} >
- +
- + > + + + ) : null}
); }; diff --git a/src/components/molecules/NavBar/NavBar.tsx b/src/components/molecules/NavBar/NavBar.tsx index c3b639ccc7..3cfdda3727 100644 --- a/src/components/molecules/NavBar/NavBar.tsx +++ b/src/components/molecules/NavBar/NavBar.tsx @@ -74,7 +74,6 @@ export interface NavBarPropsType { export const NavBar: React.FC = ({ hasBackButton = true }) => { const { user, userWithId } = useUser(); const venueId = useVenueId(); - const radioStations = useSelector(radioStationsSelector); const { currentVenue, parentVenue, sovereignVenueId } = useRelatedVenues({ diff --git a/src/components/organisms/BannerAdmin/BannerAdmin.scss b/src/components/organisms/BannerAdmin/BannerAdmin.scss new file mode 100644 index 0000000000..eeca85effa --- /dev/null +++ b/src/components/organisms/BannerAdmin/BannerAdmin.scss @@ -0,0 +1,22 @@ +@import "scss/constants.scss"; + +.Banner { + &__input-text { + text-align: start; + } + + &__button-container { + margin-top: 25px; + } + + &__action-container { + margin-left: 50px; + } +} + +.BannerToggle { + &__title { + font-size: $font-size--lg; + margin-left: $spacing--md; + } +} diff --git a/src/components/organisms/BannerAdmin/BannerAdmin.tsx b/src/components/organisms/BannerAdmin/BannerAdmin.tsx index 2c7c70fd47..4fd3950430 100644 --- a/src/components/organisms/BannerAdmin/BannerAdmin.tsx +++ b/src/components/organisms/BannerAdmin/BannerAdmin.tsx @@ -1,9 +1,21 @@ -import React, { useCallback, useRef, useState } from "react"; - -import { makeUpdateBanner } from "api/bannerAdmin"; +import React, { useCallback } from "react"; +import { useForm } from "react-hook-form"; +import { BannerFormData } from "types/banner"; import { AnyVenue } from "types/venues"; +import "./BannerAdmin.scss"; + +const initialBannerData = { + title: "", + content: "", + isActionButton: false, + buttonUrl: "", + buttonDisplayText: "", + isFullScreen: false, + isCloseButton: false, +}; + interface BannerAdminProps { venueId?: string; venue: AnyVenue; @@ -12,73 +24,132 @@ interface BannerAdminProps { // @debt This component is almost exactly the same as IframeAdmin, we should refactor them both to use the same generic base component // BannerAdmin is the 'canonical example' to follow when we do this export const BannerAdmin: React.FC = ({ venueId, venue }) => { - const existingBannerMessage = venue?.bannerMessage ?? ""; - - const textareaFieldRef = useRef(null); - const [error, setError] = useState(); - - const handleInputChange = useCallback(() => { - setError(null); - }, []); + const { register, handleSubmit, reset } = useForm({ + mode: "onChange", + reValidateMode: "onChange", + }); const updateBannerInFirestore = useCallback( - (msg?: string) => { + (data: BannerFormData) => { if (!venueId) return; - makeUpdateBanner(venueId, (errorMsg) => setError(errorMsg))(msg); + // makeUpdateBanner(venueId)(data); }, [venueId] ); - const saveBanner = useCallback( - (e: React.MouseEvent) => { - e.preventDefault(); + const onSubmit = (data: BannerFormData) => { + updateBannerInFirestore(data); + }; - if (!textareaFieldRef.current) return; - - updateBannerInFirestore(textareaFieldRef.current.value); - }, - [updateBannerInFirestore] - ); - - const clearBanner = useCallback(() => updateBannerInFirestore(""), [ - updateBannerInFirestore, - ]); + const clearBanner = useCallback(() => { + updateBannerInFirestore(initialBannerData); + reset(); + }, [updateBannerInFirestore, reset]); return (
-
+
- + +
+