ok
This commit is contained in:
@@ -338,6 +338,8 @@ const Header = ({
|
|||||||
Ubah profil
|
Ubah profil
|
||||||
</Child>
|
</Child>
|
||||||
)}
|
)}
|
||||||
|
{user.roleId == 0 && (
|
||||||
|
<Child onClick={()=>setModal('create_coupon', {})}>Buat Voucher</Child>)}
|
||||||
{shopId && user.roleId == 1 && (
|
{shopId && user.roleId == 1 && (
|
||||||
<Child onClick={goToAdminCafes}>Dashboard</Child>)}
|
<Child onClick={goToAdminCafes}>Dashboard</Child>)}
|
||||||
{shopId &&
|
{shopId &&
|
||||||
|
|||||||
@@ -19,12 +19,12 @@ import MaterialList from "../pages/MaterialList.js";
|
|||||||
import MaterialMutationsPage from "../pages/MaterialMutationsPage.js";
|
import MaterialMutationsPage from "../pages/MaterialMutationsPage.js";
|
||||||
import Reports from "../pages/Reports.js";
|
import Reports from "../pages/Reports.js";
|
||||||
import NotificationRequest from "../pages/NotificationRequest.js";
|
import NotificationRequest from "../pages/NotificationRequest.js";
|
||||||
import Unavailable from "../pages/Unavailable.js";
|
|
||||||
import NotificationBlocked from "../pages/NotificationBlocked.js";
|
import NotificationBlocked from "../pages/NotificationBlocked.js";
|
||||||
import WelcomePageEditor from "../pages/WelcomePageEditor.js";
|
import WelcomePageEditor from "../pages/WelcomePageEditor.js";
|
||||||
import GuidePage from "../pages/GuidePage";
|
import GuidePage from "../pages/GuidePage";
|
||||||
import Join from "../pages/Join";
|
import Join from "../pages/Join";
|
||||||
import Loading from "../pages/Loading";
|
import Loading from "../pages/Loading";
|
||||||
|
import Message from "../pages/Message";
|
||||||
import Login from "../pages/Login";
|
import Login from "../pages/Login";
|
||||||
import ResetPassword from "../pages/ResetPassword";
|
import ResetPassword from "../pages/ResetPassword";
|
||||||
import { getImageUrl } from "../helpers/itemHelper.js";
|
import { getImageUrl } from "../helpers/itemHelper.js";
|
||||||
@@ -76,7 +76,6 @@ const Modal = ({ user, shop, isOpen, onClose, modalContent, deviceType, setModal
|
|||||||
{modalContent === "edit_account" && <AccountUpdatePage user={user} />}
|
{modalContent === "edit_account" && <AccountUpdatePage user={user} />}
|
||||||
{modalContent === "reset-password" && <ResetPassword />}
|
{modalContent === "reset-password" && <ResetPassword />}
|
||||||
{modalContent === "req_notification" && <NotificationRequest setModal={setModal} />}
|
{modalContent === "req_notification" && <NotificationRequest setModal={setModal} />}
|
||||||
{modalContent === "unavailable" && <Unavailable close={handleContentClick} />}
|
|
||||||
{modalContent === "blocked_notification" && <NotificationBlocked />}
|
{modalContent === "blocked_notification" && <NotificationBlocked />}
|
||||||
{modalContent === "create_clerk" && <CreateClerk shopId={shop.cafeId} />}
|
{modalContent === "create_clerk" && <CreateClerk shopId={shop.cafeId} />}
|
||||||
{modalContent === "create_kedai" && <CreateCafe shopId={shop.cafeId} />}
|
{modalContent === "create_kedai" && <CreateCafe shopId={shop.cafeId} />}
|
||||||
@@ -124,6 +123,7 @@ const Modal = ({ user, shop, isOpen, onClose, modalContent, deviceType, setModal
|
|||||||
{modalContent === "join" && <Join setModal={setModal} />}
|
{modalContent === "join" && <Join setModal={setModal} />}
|
||||||
{modalContent === "claim-coupon" && <Join setModal={setModal} />}
|
{modalContent === "claim-coupon" && <Join setModal={setModal} />}
|
||||||
{modalContent === "loading" && <Loading setModal={setModal} />}
|
{modalContent === "loading" && <Loading setModal={setModal} />}
|
||||||
|
{modalContent === "message" && <Message/>}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
49
src/components/StepByStep.js
Normal file
49
src/components/StepByStep.js
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import styles from './StepByStep.module.css'; // Import the CSS Module
|
||||||
|
|
||||||
|
const StepByStep = () => {
|
||||||
|
return (
|
||||||
|
<div className={styles.container}>
|
||||||
|
<div className={styles.screen}>
|
||||||
|
<div className={styles.main}>
|
||||||
|
<img src="https://i.ibb.co.com/F4VK6KHs/header.jpg" alt="Header" />
|
||||||
|
<div className={styles.player}>
|
||||||
|
<img src="https://i.ibb.co.com/6cGq6byM/player1.jpg" alt="Player 1" />
|
||||||
|
<img src="https://i.ibb.co.com/0VDjJdXV/player2.jpg" alt="Player 2" />
|
||||||
|
<img src="https://i.ibb.co.com/8D3mSp4g/player3.jpg" alt="Player 3" />
|
||||||
|
<img src="https://i.ibb.co.com/XxS1DhRy/player4.jpg" alt="Player 4" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<img src="https://i.ibb.co.com/4z5zdsS/body.jpg" alt="Body" />
|
||||||
|
<div className={styles.escappucino}>
|
||||||
|
<img src="https://i.ibb.co.com/yFvrPX8z/pesan.png" alt="Escappucino 1" />
|
||||||
|
<img src="https://i.ibb.co.com/rRwPHtY7/pesan-1.png" alt="Escappucino 2" />
|
||||||
|
</div>
|
||||||
|
<div className={styles.chickenkatsu}>
|
||||||
|
<img src="https://i.ibb.co.com/yFvrPX8z/pesan.png" alt="Chickenkatsu 1" />
|
||||||
|
<img src="https://i.ibb.co.com/rRwPHtY7/pesan-1.png" alt="Chickenkatsu 2" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.cartbutton}>
|
||||||
|
<img src="https://i.ibb.co.com/zVrfGjZw/New-Project.png" alt="Cart Button" />
|
||||||
|
<img src="https://i.ibb.co.com/Y7wbjGDz/cart-2.png" alt="Cart Icon" />
|
||||||
|
</div>
|
||||||
|
<div className={styles.cart}>
|
||||||
|
<img src="https://i.ibb.co.com/F4Hb7Tqg/cart.jpg" alt="Cart Image" />
|
||||||
|
<img src="https://i.ibb.co.com/Mxrjc9Dc/checkout.png" alt="Checkout" />
|
||||||
|
</div>
|
||||||
|
<div className={styles.transaction}>
|
||||||
|
<img src="https://i.ibb.co.com/1p7pnnD/transaction.png" alt="Transaction" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.secondscreen}>
|
||||||
|
<div className={styles.secondmain}>
|
||||||
|
<img src="https://i.ibb.co.com/LDw21htp/New-Project.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default StepByStep;
|
||||||
684
src/components/StepByStep.module.css
Normal file
684
src/components/StepByStep.module.css
Normal file
@@ -0,0 +1,684 @@
|
|||||||
|
|
||||||
|
.title {
|
||||||
|
color: #5C6AC4;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
width: 188px;
|
||||||
|
height: 308px;
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
.screen {
|
||||||
|
width: 122px;
|
||||||
|
height: 264px;
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 10px;
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
z-index: 11;
|
||||||
|
}
|
||||||
|
|
||||||
|
.secondscreen {
|
||||||
|
width: 122px;
|
||||||
|
height: 264px;
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 10px;
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
left: 38%;
|
||||||
|
top: -62%;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.secondmain {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
animation: reportScrollBottom 5s infinite; /* Apply scroll animation only once */
|
||||||
|
}
|
||||||
|
.secondmain img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes reportScrollBottom {
|
||||||
|
0% {
|
||||||
|
transform: translateY(0%); /* Start from the top */
|
||||||
|
}
|
||||||
|
30% {
|
||||||
|
transform: translateY(0%); /* Start from the top */
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
transform: translateY(-43%); /* Start from the top */
|
||||||
|
}
|
||||||
|
80% {
|
||||||
|
transform: translateY(-43%); /* Start from the top */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateY(0%); /* Start from the top */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.main {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%; /* Ensure the div fills the container */
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-start;
|
||||||
|
animation: scrollBottom 20s infinite; /* Apply scroll animation only once */
|
||||||
|
position: absolute; /* Ensures it moves within the container */
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main img{
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main > div:nth-child(2) {
|
||||||
|
animation: playerClick 20s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main > div:nth-child(3) {
|
||||||
|
animation: bodyDown 20s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Keyframes for scrolling the div content down */
|
||||||
|
@keyframes scrollBottom {
|
||||||
|
0% {
|
||||||
|
transform: translateY(0); /* Start from the top */
|
||||||
|
}
|
||||||
|
10% {
|
||||||
|
transform: translateY(0); /* Scale down at 20% */
|
||||||
|
}
|
||||||
|
15% {
|
||||||
|
transform: translateY(-50%); /* Move the content up */
|
||||||
|
}
|
||||||
|
57.5% {
|
||||||
|
transform: translateY(-50%); /* Move the content up */
|
||||||
|
}
|
||||||
|
62.5% {
|
||||||
|
transform: translateY(0%); /* Move the content up */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateY(0%); /* Move the content up */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes playerClick {
|
||||||
|
0% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
}
|
||||||
|
64% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
}
|
||||||
|
65% {
|
||||||
|
transform: scale(0.8); /* Scale down */
|
||||||
|
}
|
||||||
|
66% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
67% {
|
||||||
|
transform: scale(0.8); /* Scale down */
|
||||||
|
}
|
||||||
|
68% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
94% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
95% {
|
||||||
|
transform: scale(0.8); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
96% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes bodyDown {
|
||||||
|
0% {
|
||||||
|
margin-top: 0%;
|
||||||
|
}
|
||||||
|
64% {
|
||||||
|
margin-top: 0%;
|
||||||
|
}
|
||||||
|
65% {
|
||||||
|
margin-top: 20%;
|
||||||
|
}
|
||||||
|
66% {
|
||||||
|
margin-top: 20%;
|
||||||
|
}
|
||||||
|
67% {
|
||||||
|
margin-top: 96%;
|
||||||
|
}
|
||||||
|
90% {
|
||||||
|
margin-top: 96%;
|
||||||
|
}
|
||||||
|
91% {
|
||||||
|
margin-top: 20%;
|
||||||
|
}
|
||||||
|
97% {
|
||||||
|
margin-top: 20%;
|
||||||
|
}
|
||||||
|
98% {
|
||||||
|
margin-top: 0%;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
margin-top: 0%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.player img{
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.player > img:nth-child(1) {
|
||||||
|
animation: playerUnexpandedOpacity 20s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.player > img:nth-child(2) {
|
||||||
|
animation: player2ExpandedOpacity 20s infinite;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.player > img:nth-child(3) {
|
||||||
|
animation: player3ExpandedOpacity 20s infinite;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.player > img:nth-child(4) {
|
||||||
|
animation: player4ExpandedOpacity 20s infinite;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes playerUnexpandedOpacity {
|
||||||
|
0% {
|
||||||
|
filter: opacity(1); /* Initial scale */
|
||||||
|
}
|
||||||
|
65% {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
66% {
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
95% {
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
96% {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
filter: opacity(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes player2ExpandedOpacity {
|
||||||
|
0% {
|
||||||
|
filter: opacity(0); /* Initial scale */
|
||||||
|
}
|
||||||
|
65% {
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
66% {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
67% {
|
||||||
|
filter: opacity(0); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
filter: opacity(0); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes player3ExpandedOpacity {
|
||||||
|
0% {
|
||||||
|
filter: opacity(0); /* Initial scale */
|
||||||
|
}
|
||||||
|
66% {
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
67% {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
90% {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
91% {
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
filter: opacity(0); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes player4ExpandedOpacity {
|
||||||
|
0% {
|
||||||
|
filter: opacity(0); /* Initial scale */
|
||||||
|
}
|
||||||
|
90% {
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
91% {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
95% {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
97% {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
98% {
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
filter: opacity(0); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.escappucino {
|
||||||
|
position: relative;
|
||||||
|
top: -63.6%;
|
||||||
|
width: 100%;
|
||||||
|
animation: escappucinoscaleAnimation 20s infinite; /* Apply the scale animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.escappucino img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.escappucino > img:nth-child(1) {
|
||||||
|
position: absolute;
|
||||||
|
animation: escappucinochildOpacityAnimation 20s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.escappucino > img:nth-child(2) {
|
||||||
|
animation: escappucinochildOpacityAnimation2 20s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes escappucinoscaleAnimation {
|
||||||
|
0% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
}
|
||||||
|
5% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
}
|
||||||
|
7.5% {
|
||||||
|
transform: scale(0.8); /* Scale down */
|
||||||
|
}
|
||||||
|
10% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes escappucinochildOpacityAnimation {
|
||||||
|
0% {
|
||||||
|
opacity: 1; /* Start visible */
|
||||||
|
}
|
||||||
|
5% {
|
||||||
|
opacity: 1; /* Start visible */
|
||||||
|
}
|
||||||
|
7.5% {
|
||||||
|
opacity: 0; /* Fade out at 70% */
|
||||||
|
}
|
||||||
|
10% {
|
||||||
|
opacity: 0; /* Keep faded out */
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
opacity: 0; /* Keep faded out */
|
||||||
|
}
|
||||||
|
60% {
|
||||||
|
opacity: 1; /* Keep faded out */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1; /* Keep faded out */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes escappucinochildOpacityAnimation2 {
|
||||||
|
0% {
|
||||||
|
opacity: 0; /* Start invisible */
|
||||||
|
}
|
||||||
|
5% {
|
||||||
|
opacity: 0; /* Start invisible */
|
||||||
|
}
|
||||||
|
7.5% {
|
||||||
|
opacity: 1; /* Fade in at 70% */
|
||||||
|
}
|
||||||
|
10% {
|
||||||
|
opacity: 1; /* Keep visible */
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
opacity: 1; /* Keep faded out */
|
||||||
|
}
|
||||||
|
60% {
|
||||||
|
opacity: 0; /* Keep faded out */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 0; /* Keep faded out */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chickenkatsu {
|
||||||
|
position: relative;
|
||||||
|
top: -27.6%;
|
||||||
|
width: 100%;
|
||||||
|
animation: chickenkatsuscaleAnimation 20s infinite; /* Apply the scale animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.chickenkatsu img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chickenkatsu > img:nth-child(1) {
|
||||||
|
position: absolute;
|
||||||
|
animation: chickenkatsuchildOpacityAnimation 20s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chickenkatsu > img:nth-child(2) {
|
||||||
|
animation: chickenkatsuchildOpacityAnimation2 20s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes chickenkatsuscaleAnimation {
|
||||||
|
0% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
}
|
||||||
|
15% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
}
|
||||||
|
17.5% {
|
||||||
|
transform: scale(0.8); /* Scale down */
|
||||||
|
}
|
||||||
|
20% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes chickenkatsuchildOpacityAnimation {
|
||||||
|
0% {
|
||||||
|
opacity: 1; /* Start visible */
|
||||||
|
}
|
||||||
|
15% {
|
||||||
|
opacity: 1; /* Start visible */
|
||||||
|
}
|
||||||
|
17.5% {
|
||||||
|
opacity: 0; /* Fade out at 70% */
|
||||||
|
}
|
||||||
|
20% {
|
||||||
|
opacity: 0; /* Keep faded out */
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
opacity: 0; /* Keep faded out */
|
||||||
|
}
|
||||||
|
60% {
|
||||||
|
opacity: 1; /* Keep faded out */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1; /* Keep faded out */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes chickenkatsuchildOpacityAnimation2 {
|
||||||
|
0% {
|
||||||
|
opacity: 0; /* Start visible */
|
||||||
|
}
|
||||||
|
15% {
|
||||||
|
opacity: 0; /* Start visible */
|
||||||
|
}
|
||||||
|
17.5% {
|
||||||
|
opacity: 1; /* Fade out at 70% */
|
||||||
|
}
|
||||||
|
20% {
|
||||||
|
opacity: 1; /* Keep faded out */
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
opacity: 1; /* Keep faded out */
|
||||||
|
}
|
||||||
|
60% {
|
||||||
|
opacity: 0; /* Keep faded out */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 0; /* Keep faded out */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.cartbutton{
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
top: 86%;
|
||||||
|
animation: cartbuttonscaleAnimation 20s infinite; /* Apply the scale animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.cartbutton img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cartbutton > img:nth-child(1) {
|
||||||
|
position: absolute;
|
||||||
|
animation: cartbuttonchildOpacityAnimation 20s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cartbutton > img:nth-child(2) {
|
||||||
|
animation: cartbuttonchildOpacityAnimation2 20s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes cartbuttonscaleAnimation {
|
||||||
|
0% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
5% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
7.5% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
25% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
}
|
||||||
|
27.5% {
|
||||||
|
transform: scale(0.8); /* Scale down */
|
||||||
|
}
|
||||||
|
30% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
60% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes cartbuttonchildOpacityAnimation {
|
||||||
|
0% {
|
||||||
|
opacity: 1; /* Start visible */
|
||||||
|
}
|
||||||
|
15% {
|
||||||
|
opacity: 1; /* Start visible */
|
||||||
|
}
|
||||||
|
17.5% {
|
||||||
|
opacity: 0; /* Fade out at 70% */
|
||||||
|
}
|
||||||
|
20% {
|
||||||
|
opacity: 0; /* Keep faded out */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 0; /* Keep faded out */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes cartbuttonchildOpacityAnimation2 {
|
||||||
|
0% {
|
||||||
|
opacity: 0; /* Start invisible */
|
||||||
|
}
|
||||||
|
15% {
|
||||||
|
opacity: 0; /* Start invisible */
|
||||||
|
}
|
||||||
|
17.5% {
|
||||||
|
opacity: 1; /* Fade in at 70% */
|
||||||
|
}
|
||||||
|
20% {
|
||||||
|
opacity: 1; /* Keep visible */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1; /* Keep visible */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.cart{
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
left: 100%;
|
||||||
|
animation: cartslideinAnimation 20s infinite; /* Apply the scale animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart > img:nth-child(1) {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart > img:nth-child(2) {
|
||||||
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 90.7%;
|
||||||
|
left: 0;
|
||||||
|
animation: checkoutbuttonscaleAnimation 20s infinite; /* Apply the scale animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes cartslideinAnimation {
|
||||||
|
0% {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
30% {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
32.5% {
|
||||||
|
left: 0%;
|
||||||
|
}
|
||||||
|
55% {
|
||||||
|
left: 0%;
|
||||||
|
}
|
||||||
|
57.5% {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes checkoutbuttonscaleAnimation {
|
||||||
|
0% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
}
|
||||||
|
37.5% {
|
||||||
|
transform: scale(1); /* Initial scale */
|
||||||
|
}
|
||||||
|
40% {
|
||||||
|
transform: scale(0.8); /* Scale down */
|
||||||
|
}
|
||||||
|
42.5% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: scale(1); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.transaction{
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
animation: transactionAnimation 20s infinite;
|
||||||
|
background-color: #0000006b;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.transaction img {
|
||||||
|
width: 80%;
|
||||||
|
animation: transactionElementAnimation 20s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes transactionAnimation {
|
||||||
|
0% {
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
42.5% {
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
45% {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
52.5% {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
55% {
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
filter: opacity(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* New keyframes for scaling and opacity effect */
|
||||||
|
@keyframes transactionElementAnimation {
|
||||||
|
0% {
|
||||||
|
transform: scale(0); /* Initial scale */
|
||||||
|
}
|
||||||
|
42.5% {
|
||||||
|
transform: scale(0); /* Initial scale */
|
||||||
|
}
|
||||||
|
45% {
|
||||||
|
transform: scale(1); /* Scale down */
|
||||||
|
}
|
||||||
|
52.5% {
|
||||||
|
transform: scale(1); /* Scale down */
|
||||||
|
}
|
||||||
|
55% {
|
||||||
|
transform: scale(0); /* Scale down */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: scale(0); /* Scale back to original size */
|
||||||
|
}
|
||||||
|
}
|
||||||
17
src/components/Watermark.js
Normal file
17
src/components/Watermark.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import StepByStep from './StepByStep';
|
||||||
|
|
||||||
|
const Watermark = ({dontShowName}) => {
|
||||||
|
return (
|
||||||
|
<div style={{ zIndex: 5, marginTop: '30px', backgroundColor: 'rgb(222 237 100)', fontWeight: 700, fontSize: '15px', lineHeight: '1rem', letterSpacing: '-1px', color: 'rgb(37, 79, 26)', padding: '10px' }}>
|
||||||
|
{!dontShowName && <div>KEDAIMASTER.COM</div>}
|
||||||
|
<div style={{ display: 'flex' }}>
|
||||||
|
<div style={{ width: '45vw', marginTop: '10px', fontSize: '5.5vw', lineHeight: '33px' }}>Gak perlu rasain antri panjang yang bikin bosen lagi. Tinggal scan QR yang ada di meja, eh tiba tiba pesanan udah dimejamu</div>
|
||||||
|
<StepByStep />
|
||||||
|
</div>
|
||||||
|
<div style={{ marginTop: '8px' }}>© 2025 KEDIRITECHNOPARK.COM</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Watermark;
|
||||||
@@ -10,6 +10,7 @@ import {
|
|||||||
|
|
||||||
import "../App.css";
|
import "../App.css";
|
||||||
|
|
||||||
|
import Watermark from "../components/Watermark";
|
||||||
import { getImageUrl, createItem, updateItem, moveItemType } from "../helpers/itemHelper.js";
|
import { getImageUrl, createItem, updateItem, moveItemType } from "../helpers/itemHelper.js";
|
||||||
import SearchInput from "../components/SearchInput";
|
import SearchInput from "../components/SearchInput";
|
||||||
import ItemTypeLister from "../components/ItemTypeLister";
|
import ItemTypeLister from "../components/ItemTypeLister";
|
||||||
@@ -139,7 +140,7 @@ function CafePage({
|
|||||||
socket.on("joined-room", (response) => {
|
socket.on("joined-room", (response) => {
|
||||||
const { isSpotifyNeedLogin, isExceededDeadline } = response;
|
const { isSpotifyNeedLogin, isExceededDeadline } = response;
|
||||||
setNeedSpotifyLogin(isSpotifyNeedLogin);
|
setNeedSpotifyLogin(isSpotifyNeedLogin);
|
||||||
if (isExceededDeadline) setModal('unavailable');
|
if (isExceededDeadline) setModal('message',{returnMessage:'Kafe sedang tidak tersedia'});
|
||||||
setIsExceededDeadline(isExceededDeadline);
|
setIsExceededDeadline(isExceededDeadline);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -210,8 +211,8 @@ function CafePage({
|
|||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
welcomePageConfig != null && (
|
welcomePageConfig != null && (
|
||||||
<div className="Cafe" style={{ filter: isExceededDeadline ? 'grayscale(1)' : '', pointerEvents: isExceededDeadline ? 'none' : '' }}>
|
<div className="Cafe" style={{ display: 'flex', flexDirection: 'column', justifyContent: 'space-between', minHeight: '100vh', filter: isExceededDeadline ? 'grayscale(1)' : '', pointerEvents: isExceededDeadline ? 'none' : '' }}>
|
||||||
<body className="App-header">
|
<div className="App-header">
|
||||||
<Header
|
<Header
|
||||||
HeaderText={"Menu"}
|
HeaderText={"Menu"}
|
||||||
showProfile={true}
|
showProfile={true}
|
||||||
@@ -359,8 +360,8 @@ function CafePage({
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
<div style={{ marginTop: '30px', height: '27px', backgroundColor: 'rgb(222 237 100)', fontWeight: 700, fontSize: '15px', lineHeight: '1rem', letterSpacing: '-1px', color: 'rgb(37, 79, 26)', padding: '10px' }}><div>KEDAIMASTER</div></div>
|
</div>
|
||||||
</body>
|
<Watermark/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import API_BASE_URL from '../config';
|
|||||||
import DailyCharts from '../components/DailyCharts';
|
import DailyCharts from '../components/DailyCharts';
|
||||||
import Coupon from '../components/Coupon';
|
import Coupon from '../components/Coupon';
|
||||||
import Reports from './Reports'
|
import Reports from './Reports'
|
||||||
|
import Watermark from '../components/Watermark.js';
|
||||||
|
|
||||||
const LinktreePage = ({ user, setModal }) => {
|
const LinktreePage = ({ user, setModal }) => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -297,7 +298,7 @@ const LinktreePage = ({ user, setModal }) => {
|
|||||||
{getLocalStorage('auth') == null && (
|
{getLocalStorage('auth') == null && (
|
||||||
<div className={styles.LoginForm}>
|
<div className={styles.LoginForm}>
|
||||||
<div className={`${styles.FormUsername} ${inputtingPassword ? styles.animateForm : wasInputtingPassword ? styles.reverseForm : ''}`}>
|
<div className={`${styles.FormUsername} ${inputtingPassword ? styles.animateForm : wasInputtingPassword ? styles.reverseForm : ''}`}>
|
||||||
<label htmlFor="username" className={styles.usernameLabel}>---- Masuk -------------------------------</label>
|
<label htmlFor="username" className={styles.usernameLabel}>---- Masuk -----------------------------</label>
|
||||||
<input
|
<input
|
||||||
id="username"
|
id="username"
|
||||||
placeholder="username"
|
placeholder="username"
|
||||||
@@ -316,7 +317,7 @@ const LinktreePage = ({ user, setModal }) => {
|
|||||||
<label onClick={() => setInputtingPassword(false)} htmlFor="password" className={styles.usernameLabel}> <--- <-- Kembali </label>
|
<label onClick={() => setInputtingPassword(false)} htmlFor="password" className={styles.usernameLabel}> <--- <-- Kembali </label>
|
||||||
<label htmlFor="password" className={styles.usernameLabel}> ----- </label>
|
<label htmlFor="password" className={styles.usernameLabel}> ----- </label>
|
||||||
<label onClick={() => setModal('reset-password', { username: username })} className={styles.usernameLabel}>
|
<label onClick={() => setModal('reset-password', { username: username })} className={styles.usernameLabel}>
|
||||||
lupa password? -
|
lupa password?
|
||||||
</label>
|
</label>
|
||||||
</span>
|
</span>
|
||||||
<input
|
<input
|
||||||
@@ -360,9 +361,9 @@ const LinktreePage = ({ user, setModal }) => {
|
|||||||
onError={(e) => e.target.src = '/fallback-image.png'}
|
onError={(e) => e.target.src = '/fallback-image.png'}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<a style={{ left: 0, right: 0, bottom: 0, textAlign: 'center', color: '#254F1A', fontSize: '13px', position: 'fixed' }}>©2025 KEDIRITECHNOPARK.COM</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<Watermark dontShowName={true}/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -78,6 +78,8 @@ const LinktreePage = ({ data, setModal }) => {
|
|||||||
// Handle manual coupon code check
|
// Handle manual coupon code check
|
||||||
const handleLogCouponForUser = async (code = couponCode) => {
|
const handleLogCouponForUser = async (code = couponCode) => {
|
||||||
const result = await logCouponForUser(code); // Call the helper
|
const result = await logCouponForUser(code); // Call the helper
|
||||||
|
|
||||||
|
return result.success;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Listen for query parameter changes (using the `location` object)
|
// Listen for query parameter changes (using the `location` object)
|
||||||
@@ -106,20 +108,11 @@ const LinktreePage = ({ data, setModal }) => {
|
|||||||
<div className={styles.subHeadingTransparent}>
|
<div className={styles.subHeadingTransparent}>
|
||||||
Daftarkan kedaimu sekarang dan mulai gunakan semua fitur unggulan kami.
|
Daftarkan kedaimu sekarang dan mulai gunakan semua fitur unggulan kami.
|
||||||
</div>
|
</div>
|
||||||
<form className={styles.linktreeForm}>
|
<div className={styles.linktreeForm}>
|
||||||
<label htmlFor="username" className={styles.usernameLabel}>
|
<button onClick={()=>window.open("https://api.whatsapp.com/send?phone=6281318894994&text=Saya%20ingin%20coba%20gratis%203%20bulan")} className={styles.claimButton}>
|
||||||
--------------------------------------------
|
<span>Dapatkan voucher gratis 3 bulan</span>
|
||||||
</label>
|
|
||||||
<input
|
|
||||||
id="username"
|
|
||||||
placeholder="nomor whatsapp atau email"
|
|
||||||
maxLength="30"
|
|
||||||
className={styles.usernameInput}
|
|
||||||
/>
|
|
||||||
<button type="submit" className={styles.claimButton}>
|
|
||||||
<span>➜</span>
|
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</div>
|
||||||
<div className={styles.footer}>
|
<div className={styles.footer}>
|
||||||
<div className={styles.footerLinks}>
|
<div className={styles.footerLinks}>
|
||||||
<a
|
<a
|
||||||
@@ -131,7 +124,10 @@ const LinktreePage = ({ data, setModal }) => {
|
|||||||
Pelajari lebih lanjut
|
Pelajari lebih lanjut
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
onClick={() => setIsUsingCoupon(true)}
|
onClick={(e) => {
|
||||||
|
e.preventDefault(); // Prevent the default anchor behavior
|
||||||
|
setIsUsingCoupon(true);
|
||||||
|
}}
|
||||||
className={styles.footerLink}
|
className={styles.footerLink}
|
||||||
>
|
>
|
||||||
Gunakan Voucher
|
Gunakan Voucher
|
||||||
@@ -141,14 +137,14 @@ const LinktreePage = ({ data, setModal }) => {
|
|||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className={styles.dashboardContainer}>
|
<div className={styles.dashboardContainer}>
|
||||||
<div className={styles.mainHeading}>{isOnlyClaimCoupon ? 'Aktifkan Voucher' : 'Daftar Dengan Voucher'}</div>
|
<div className={styles.voucherHeading}>{isOnlyClaimCoupon ? 'Aktifkan Voucher' : 'Daftar Dengan Voucher'}</div>
|
||||||
<div className={styles.subHeading}>
|
<div className={styles.subHeading}>
|
||||||
Voucher dapat digunakan untuk pembuatan akun bisnis maupun untuk memperpanjang masa berlangganan.
|
Voucher dapat digunakan untuk pembuatan akun bisnis maupun untuk memperpanjang masa berlangganan.
|
||||||
</div>
|
</div>
|
||||||
{couponStatus === 0 ? (
|
{couponStatus === 0 ? (
|
||||||
<form className={styles.linktreeForm} onSubmit={(e) => e.preventDefault()}>
|
<form className={styles.linktreeForm} onSubmit={(e) => e.preventDefault()}>
|
||||||
<label htmlFor="coupon" className={styles.usernameLabel}>
|
<label htmlFor="coupon" className={styles.usernameLabel}>
|
||||||
--------------------------------------------
|
----------------------------------------
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
id="coupon"
|
id="coupon"
|
||||||
@@ -179,21 +175,31 @@ const LinktreePage = ({ data, setModal }) => {
|
|||||||
<button
|
<button
|
||||||
className={styles.claimButton}
|
className={styles.claimButton}
|
||||||
style={{ width: '266px' }}
|
style={{ width: '266px' }}
|
||||||
onClick={() => {
|
onClick={async () => {
|
||||||
if (!isOnlyClaimCoupon) {
|
if (!isOnlyClaimCoupon) {
|
||||||
|
|
||||||
const secretKey = 'xixixi666'; // Your AES-256 key (32 characters)
|
const secretKey = 'xixixi666'; // Your AES-256 key (32 characters)
|
||||||
|
|
||||||
// Encrypt couponCode inline
|
// Encrypt couponCode inline
|
||||||
const encryptedCouponCode = CryptoJS.AES.encrypt(couponCode, secretKey).toString();
|
const encryptedCouponCode = CryptoJS.AES.encrypt(couponCode, secretKey).toString();
|
||||||
console.log(encryptedCouponCode)
|
console.log(encryptedCouponCode);
|
||||||
// If it's only claiming a coupon, trigger claim logic
|
|
||||||
|
// If it's not for claiming a coupon, trigger the create user modal logic
|
||||||
setModal('create_user', { codeStatus: 200, c: encryptedCouponCode });
|
setModal('create_user', { codeStatus: 200, c: encryptedCouponCode });
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, handle the coupon for user creation
|
try {
|
||||||
handleLogCouponForUser();
|
// Otherwise, handle the coupon for user creation
|
||||||
|
setModal('loading');
|
||||||
|
|
||||||
|
const loggingcoupon = await handleLogCouponForUser(); // Await the coupon logging process
|
||||||
|
setModal('message', {
|
||||||
|
returnMessage: loggingcoupon ? 'Kupon berhasil ditambahkan' : 'Kupon gagal ditambahkan'
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error during coupon handling:', error);
|
||||||
|
setModal('message', { returnMessage: 'Kupon gagal ditambahkan' });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<span>{isOnlyClaimCoupon ? 'Aktifkan untuk akun ini' : 'Buat akun bisnis dengan voucher ini'}</span>
|
<span>{isOnlyClaimCoupon ? 'Aktifkan untuk akun ini' : 'Buat akun bisnis dengan voucher ini'}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
/* Main Heading */
|
/* Main Heading */
|
||||||
.mainHeading {
|
.mainHeading {
|
||||||
|
width: 222px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-size: 32px;
|
font-size: 32px;
|
||||||
line-height: 2.25rem;
|
line-height: 2.25rem;
|
||||||
@@ -25,6 +26,15 @@
|
|||||||
color: rgb(37, 79, 26);
|
color: rgb(37, 79, 26);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Main Heading */
|
||||||
|
.voucherHeading {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 32px;
|
||||||
|
line-height: 2.25rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
letter-spacing: -1px;
|
||||||
|
color: rgb(37, 79, 26);
|
||||||
|
}
|
||||||
.swipeContainer {
|
.swipeContainer {
|
||||||
height: 75px;
|
height: 75px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -109,7 +119,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.claimButton {
|
.claimButton {
|
||||||
width: 200px;
|
width: 236px;
|
||||||
height: 45px;
|
height: 45px;
|
||||||
background-color: #254F1A;
|
background-color: #254F1A;
|
||||||
color: #D2E823;
|
color: #D2E823;
|
||||||
|
|||||||
@@ -1,21 +1,11 @@
|
|||||||
/* General container */
|
/* General container */
|
||||||
.centeredLinktreePage {
|
.centeredLinktreePage {
|
||||||
height: 100vh;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
background-color: rgb(222 237 100);
|
background-color: rgb(222 237 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nonCenteredLinktreePage {
|
|
||||||
height: 100vh;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: start;
|
|
||||||
background-color: rgb(255 255 255);
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboardLine {
|
.dashboardLine {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
left: 0px;
|
left: 0px;
|
||||||
@@ -29,7 +19,7 @@
|
|||||||
background-color: inherit;
|
background-color: inherit;
|
||||||
z-index: 6;
|
z-index: 6;
|
||||||
padding: 0 1rem;
|
padding: 0 1rem;
|
||||||
padding-top: 40px;
|
padding-top: 100px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Main Heading */
|
/* Main Heading */
|
||||||
|
|||||||
28
src/pages/Message.js
Normal file
28
src/pages/Message.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
// LinktreePage.js
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import styles from './Join.module.css'; // Import the module.css file
|
||||||
|
|
||||||
|
const LinktreePage = () => {
|
||||||
|
const [returnMessage, setReturnMessage] = useState('');
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const newQueryParams = new URLSearchParams(window.location.search);
|
||||||
|
const r = newQueryParams.get('returnMessage');
|
||||||
|
if (r) {
|
||||||
|
setReturnMessage(r)
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles.linktreePage}>
|
||||||
|
<div className={styles.dashboardContainer}>
|
||||||
|
<div className={styles.mainHeading}>{returnMessage}</div>
|
||||||
|
<div className={styles.subHeadingTransparent}>
|
||||||
|
Daftarkan kedaimu sekarang dan mulai gunakan semua fitur unggulan kami.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default LinktreePage;
|
||||||
@@ -315,26 +315,29 @@ const App = ({ forCafe = true, cafeId = -1,
|
|||||||
if (otherCafes != null) {
|
if (otherCafes != null) {
|
||||||
console.log(otherCafes)
|
console.log(otherCafes)
|
||||||
let updatedFullTexts;
|
let updatedFullTexts;
|
||||||
|
|
||||||
if (otherCafes.length === 0) {
|
if (otherCafes.length === 0) {
|
||||||
updatedFullTexts = [[user.roleId == 0 ? "Buat Voucher" : "Buat bisnis", 0]];
|
// Only include the role-specific option if user.roleId is 1
|
||||||
|
updatedFullTexts = user.roleId == 1 ? [["Buat Bisnis", 0]] : [];
|
||||||
setSelectedCafeId(-1);
|
setSelectedCafeId(-1);
|
||||||
} else if (otherCafes.length === 1) {
|
} else if (otherCafes.length === 1) {
|
||||||
updatedFullTexts = [
|
updatedFullTexts = [
|
||||||
[otherCafes[0].name || otherCafes[0].username, otherCafes[0].cafeId || otherCafes[0].userId],
|
[otherCafes[0].cafeIdentifyName || otherCafes[0].username, otherCafes[0].cafeId || otherCafes[0].userId],
|
||||||
[user.roleId == 0 ? "Buat Voucher" : "Buat bisnis", -1]
|
// Only add the "Buat Bisnis" option for user.roleId == 1
|
||||||
|
...(user.roleId == 1 ? [["Buat Bisnis", -1]] : [])
|
||||||
];
|
];
|
||||||
|
|
||||||
setSelectedCafeId(otherCafes[0].cafeId); // Get the cafeId (second part of the pair)
|
setSelectedCafeId(otherCafes[0].cafeId); // Get the cafeId (second part of the pair)
|
||||||
} else {
|
} else {
|
||||||
updatedFullTexts = [
|
updatedFullTexts = [
|
||||||
["semua", 0], // First entry is "semua"
|
["semua", 0], // First entry is "semua"
|
||||||
...otherCafes.map(item => [item.name || item.username, item.cafeId || item.userId]), // Map over cafes to get name and cafeId pairs
|
...otherCafes.map(item => [item.cafeIdentifyName || item.username, item.cafeId || item.userId]), // Map over cafes to get name and cafeId pairs
|
||||||
[user.roleId == 0 ? "Buat Voucher" : "Tambah Bisnis +", -1] // Add the "+" entry
|
// Only add "Buat Bisnis +" option for user.roleId == 1
|
||||||
|
...(user.roleId == 1 ? [["Buat Bisnis +", -1]] : [])
|
||||||
];
|
];
|
||||||
|
|
||||||
setSelectedCafeId(0);
|
setSelectedCafeId(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
setFullTexts(updatedFullTexts); // Set fullTexts with the original structure
|
setFullTexts(updatedFullTexts); // Set fullTexts with the original structure
|
||||||
// Set fullTextsVisible to an array of names only
|
// Set fullTextsVisible to an array of names only
|
||||||
@@ -400,7 +403,7 @@ const App = ({ forCafe = true, cafeId = -1,
|
|||||||
setSelectedCafeId(selectedItem[1]); // Get the cafeId (second part of the pair)
|
setSelectedCafeId(selectedItem[1]); // Get the cafeId (second part of the pair)
|
||||||
}
|
}
|
||||||
let nextSelectedId = selectedItem[1]
|
let nextSelectedId = selectedItem[1]
|
||||||
if (selectedItem[1] == -1 && user.roleId == 0) setModal('create_coupon', {}, () => { setSelectedSwitch(1); setSelectedCafeId(unSelectedItem[1]); nextSelectedId=unSelectedItem[1] });
|
|
||||||
console.log(analytics)
|
console.log(analytics)
|
||||||
if (user && user.roleId === 0 && analytics) {
|
if (user && user.roleId === 0 && analytics) {
|
||||||
// Filter the analytics items based on userId
|
// Filter the analytics items based on userId
|
||||||
@@ -448,9 +451,9 @@ const App = ({ forCafe = true, cafeId = -1,
|
|||||||
} else {
|
} else {
|
||||||
setModal('loading');
|
setModal('loading');
|
||||||
const create = await createCafe(itemName);
|
const create = await createCafe(itemName);
|
||||||
if (!create) {
|
setModal('message', {
|
||||||
setModalStatus('failed');
|
returnMessage: create ? 'Berhasil membuat cafe' : 'Gagal membuat cafe'
|
||||||
}
|
});
|
||||||
|
|
||||||
// Add a 2-second delay before proceeding
|
// Add a 2-second delay before proceeding
|
||||||
await delay(2000);
|
await delay(2000);
|
||||||
|
|||||||
Reference in New Issue
Block a user