diff --git a/apps/dimentorin/public/image/payment/bca.webp b/apps/dimentorin/public/image/payment/bca.webp
new file mode 100644
index 0000000..4497662
Binary files /dev/null and b/apps/dimentorin/public/image/payment/bca.webp differ
diff --git a/apps/dimentorin/public/image/payment/qris.webp b/apps/dimentorin/public/image/payment/qris.webp
new file mode 100644
index 0000000..8eb3c4f
Binary files /dev/null and b/apps/dimentorin/public/image/payment/qris.webp differ
diff --git a/apps/dimentorin/public/image/sample-qrcode.webp b/apps/dimentorin/public/image/sample-qrcode.webp
new file mode 100644
index 0000000..2fc66e6
Binary files /dev/null and b/apps/dimentorin/public/image/sample-qrcode.webp differ
diff --git a/apps/dimentorin/src/app/(public)/_components/header.tsx b/apps/dimentorin/src/app/(public)/_components/header.tsx
index beff631..feabf4b 100644
--- a/apps/dimentorin/src/app/(public)/_components/header.tsx
+++ b/apps/dimentorin/src/app/(public)/_components/header.tsx
@@ -71,7 +71,7 @@ export const Header: FC = () => {
)}
- Login
+ Login
diff --git a/apps/dimentorin/src/app/(public)/layout.tsx b/apps/dimentorin/src/app/(public)/layout.tsx
index d9ffaf8..5e12f2a 100644
--- a/apps/dimentorin/src/app/(public)/layout.tsx
+++ b/apps/dimentorin/src/app/(public)/layout.tsx
@@ -6,7 +6,7 @@ export default function Layout() {
return (
-
+
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/index.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/index.tsx
new file mode 100644
index 0000000..16437ef
--- /dev/null
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/index.tsx
@@ -0,0 +1,163 @@
+import { CloseOutlined } from "@ant-design/icons"
+import { Button } from "@imphnen-frontend-service/ui/atoms"
+import { AnimatePresence, motion } from "framer-motion"
+import { FC, useCallback, useEffect, useState } from "react"
+import { TopicStep } from "./steps/topic"
+import { cn, Show } from "@imphnen-frontend-service/utils"
+import { ScheduleStep } from "./steps/schedule"
+import { ProfileStep } from "./steps/profile"
+import { QrisPaymentStep } from "./steps/qris-payement"
+import { VAPaymentStep } from "./steps/va-payment"
+import { SuccessStep } from "./steps/success"
+import { PaymentStep } from "./steps/payment"
+
+const STEPS = ['topic', 'schedule', 'profile', 'payment', 'qr-payment', 'va-payment', 'success'] as const
+type Step = typeof STEPS[number]
+
+type Props = {
+ open: boolean
+ setOpen: (open: boolean) => void
+}
+
+export const AppointmentModal: FC = ({ open, setOpen }) => {
+ const [step, setStep] = useState('topic')
+ const [selectedTopics, setSelectedTopics] = useState([])
+
+ const handleStep = (action: 'next' | 'prev') => {
+ if (action === 'next' && step === 'success') {
+ setOpen(false)
+ } else if (action === 'next') {
+ setStep(STEPS[STEPS.indexOf(step) + 1])
+ } else if (action === 'prev' && step !== 'topic') {
+ setStep(STEPS[STEPS.indexOf(step) - 1])
+ }
+ }
+
+ const handleEscapeKey = useCallback(
+ (e: KeyboardEvent) => {
+ if (e.key === "Escape" && open) setOpen(false)
+ },
+ [open, setOpen]
+ )
+
+ useEffect(() => {
+ if (open) {
+ document.body.style.overflow = "hidden"
+ window.addEventListener("keydown", handleEscapeKey)
+ } else {
+ document.body.style.overflow = ""
+ }
+
+ return () => {
+ document.body.style.overflow = ""
+ window.removeEventListener("keydown", handleEscapeKey)
+ }
+ }, [handleEscapeKey, open])
+
+ return (
+
+ {open && (
+
+ setOpen(false)} />
+
+
+
+
+
+
+
+
+
+ {step !== 'success' && (
+
+ )}
+
+
+ {step !== 'success' && (
+
+
+
+ Yosha~! Saatnya Level Up dengan Sesi Mentoring bersama Senpai!
+
+
+
+
+
+ )}
+
+
+ {step === 'topic' && }
+ {step === 'schedule' && }
+ {step === 'profile' && }
+ {step === 'payment' && }
+ {step === 'qr-payment' && }
+ {step === 'va-payment' && }
+ {step === 'success' && }
+
+
+
+
+
+
+
+
+ handleStep('prev')}
+ >
+ Kembali
+
+ handleStep('next')}
+ >
+
+
+ Selanjutnya
+
+
+
+
+
+
+
+ )}
+
+ )
+}
\ No newline at end of file
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/payment.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/payment.tsx
new file mode 100644
index 0000000..aaea02c
--- /dev/null
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/payment.tsx
@@ -0,0 +1,120 @@
+import { For, Show } from "@imphnen-frontend-service/utils"
+import { FC } from "react"
+import { motion } from "framer-motion"
+import { TOPICS } from "../../../sections/topics"
+
+type Props = {
+ selectedTopics: number[]
+}
+
+export const PaymentStep: FC
= ({ selectedTopics }) => {
+ return (
+
+
+
+
+ Senpai Kamu
+
+
+
+
+
+
+
+ Muhammad Firdaus Oi Oi Oi, S.H., M.H.
+
+
+ UI Designer at Oray orayan Studios
+
+
+
+
+
+
+
+ Topics :
+
+
+
+ {(topic) => (
+
+
+ {topic.icon}
+ {topic.name}
+
+
+ )}
+
+
+
+
+
+
+
+
+ Metode Pembayaran
+
+
+
+ Virtual Account
+
+
+
+ {(bank, index) => (
+
+
+
+
+
+
+ )}
+
+
+
+
+
+ QRIS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Detail Pembayaran
+
+
+
Subtotal :
+
Rp. 50.000
+
Service Fee :
+
Rp. 2.000
+
+
+
+
Total :
+
Rp. 52.000
+
+
+
+
+ )
+}
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/profile.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/profile.tsx
new file mode 100644
index 0000000..35e377b
--- /dev/null
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/profile.tsx
@@ -0,0 +1,38 @@
+import { Input } from "@imphnen-frontend-service/ui/atoms"
+import { cn } from "@imphnen-frontend-service/utils"
+import { motion } from "framer-motion"
+
+const labelClass = cn('text-neutral-800 text-[10px] font-semibold mb-1.5 inline-block md:text-xs md:mb-2 xl:text-[15px]')
+
+export const ProfileStep = () => {
+ return (
+
+
+ Langkah 3 dari 3
+
+
+ Lengkapi profil kamu agar senpai dapat mengenal kamu lebih baik.
+
+
+
+
+ )
+}
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/qris-payement.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/qris-payement.tsx
new file mode 100644
index 0000000..d17b546
--- /dev/null
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/qris-payement.tsx
@@ -0,0 +1,55 @@
+import { For } from "@imphnen-frontend-service/utils"
+import { motion } from "framer-motion"
+
+const PAYMENT_STEP = [
+ 'Buka aplikasi e-wallet atau m-banking kamu',
+ 'Cari fitur bayar menggunakan QRIS',
+ 'Scan kode QR di samping',
+ 'Konfimasi pembayaran, dan proses selesai.'
+]
+
+export const QrisPaymentStep = () => {
+ return (
+
+
+
+ Silahkan ikuti instruksi pembayaran di bawah ini
+
+
+
+ Cara melakukan pembayaran
+
+
+
+ {(step, index) => (
+
+ {step}
+
+ )}
+
+
+
+
+
+ Biaya yang harus dibayarkan
+
+
Rp. 52.000
+
+
+
+
+
+ QR Code Pembayaran
+
+
+
+
+
+
+ )
+}
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/schedule.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/schedule.tsx
new file mode 100644
index 0000000..be7127f
--- /dev/null
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/schedule.tsx
@@ -0,0 +1,56 @@
+import { Input, Select, Textarea } from "@imphnen-frontend-service/ui/atoms"
+import { cn } from "@imphnen-frontend-service/utils"
+import { motion } from "framer-motion"
+
+const placeholder = `Hi [Nama Mentor], Saya [Nama Kamu] & saya berharap dapat memiliki sesi mentoring dengan Anda.
+
+Saat ini, saya tertarik untuk mengejar __. Tujuan saya untuk sesi ini adalah __.
+
+Saya ingin tahu secara khusus tentang ___.
+1.Pertanyaan Anda
+2. ...
+3. ...`
+
+const labelClass = cn('text-neutral-800 text-[10px] font-semibold mb-1.5 inline-block md:text-xs md:mb-2 xl:text-[15px]')
+
+export const ScheduleStep = () => {
+ return (
+
+
+ Langkah 2 dari 3
+
+
+ Pilih jadwal sesuai preferensi kamu & siapkan pertanyaanmu
+
+
+
+
+ Tanggal
+
+
+
+ Waktu
+
+
+
+ Lokasi
+
+ Online
+ Offline
+
+
+
+ Pertanyaan Untuk Senpai
+
+
+
+
+ )
+}
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/success.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/success.tsx
new file mode 100644
index 0000000..27975c6
--- /dev/null
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/success.tsx
@@ -0,0 +1,33 @@
+import { CheckOutlined } from "@ant-design/icons"
+import { cn } from "@imphnen-frontend-service/utils"
+import { motion } from "framer-motion"
+
+export const SuccessStep = () => {
+ return (
+
+
+ Booking Senpai Berhasil
+
+
+
+
+
+ Untuk detail dan instruksi berikutnya dapat dilihat di dashboard pada halaman booking
+
+
+ )
+}
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/topic.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/topic.tsx
new file mode 100644
index 0000000..a2b139b
--- /dev/null
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/topic.tsx
@@ -0,0 +1,82 @@
+import { CheckOutlined } from "@ant-design/icons"
+import { cn, For, Show } from "@imphnen-frontend-service/utils"
+import { FC } from "react"
+import { motion } from "framer-motion"
+import { TOPICS } from "../../../sections/topics"
+
+type Props = {
+ selectedTopics: number[]
+ setSelectedTopics: (topics: number[]) => void
+}
+
+export const TopicStep: FC = ({ selectedTopics, setSelectedTopics }) => {
+ const handleSelectTopic = (topicId: number) => {
+ if (selectedTopics.includes(topicId)) {
+ setSelectedTopics(selectedTopics.filter((id) => id !== topicId))
+ } else {
+ setSelectedTopics([...selectedTopics, topicId])
+ }
+ }
+
+ return (
+ <>
+
+
+
+
+
+
+ Muhammad Firdaus Oi Oi Oi, S.H., M.H.
+
+
+ UI Designer at Oray orayan Studios
+
+
+
+
+
+
+ Langkah 1 dari 3
+
+
+ Pilih topik yang ingin kamu diskusikan dengan Senpai kamu~
+
+
+
+
+ {(topic) => (
+ handleSelectTopic(topic.id)}
+ >
+
{topic.icon}
+
{topic.name}
+
+
+
+
+
+
+
+ )}
+
+
+
+ >
+ )
+}
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/va-payment.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/va-payment.tsx
new file mode 100644
index 0000000..05c3474
--- /dev/null
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/modals/appointment/steps/va-payment.tsx
@@ -0,0 +1,55 @@
+import { For } from "@imphnen-frontend-service/utils"
+import { motion } from "framer-motion"
+
+const PAYMENT_STEP = [
+ 'Buka aplikasi e-wallet atau m-banking kamu',
+ 'Pergi ke fitur transfer via Virtual Account',
+ 'Pilih bank dan kode VA sesuai dengan yang ada pada halaman ini',
+ 'Konfimasi pembayaran, dan proses selesai.'
+]
+
+export const VAPaymentStep = () => {
+ return (
+
+
+
+ Silahkan ikuti instruksi pembayaran di bawah ini
+
+
+
+ Cara melakukan pembayaran
+
+
+
+ {(step, index) => (
+
+ {step}
+
+ )}
+
+
+
+
+
+
+
+
+
+
+ Kode Virtual Account
+
+
+ 8091239861969812
+
+
+ A/N Unknown
+
+
+
+ )
+}
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/profile.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/profile.tsx
index 78435db..ec05fce 100644
--- a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/profile.tsx
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/profile.tsx
@@ -2,7 +2,11 @@ import { StarFilled } from "@ant-design/icons"
import { Button } from "@imphnen-frontend-service/ui/atoms"
import { cn, For } from "@imphnen-frontend-service/utils"
-export const ProfileSection: React.FC = () => {
+type Props = {
+ onBook: () => void
+}
+
+export const ProfileSection: React.FC = ({ onBook }) => {
return (
{
Jum, 4 April 2025
Jum, 4 April 2025
-
+
Book Your Senpai!
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/senpai-schedule.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/senpai-schedule.tsx
index 3f7af36..b47c709 100644
--- a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/senpai-schedule.tsx
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/senpai-schedule.tsx
@@ -25,7 +25,11 @@ const SCHEDULES = [
}
]
-export const SenpaiScheduleSection: FC = () => {
+type Props = {
+ onBook: () => void
+}
+
+export const SenpaiScheduleSection: FC = ({ onBook }) => {
return (
Senpai Schedule
@@ -62,7 +66,7 @@ export const SenpaiScheduleSection: FC = () => {
-
+
Book Your Senpai!
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/topics.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/topics.tsx
index 24913fa..df6d16d 100644
--- a/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/topics.tsx
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/_components/sections/topics.tsx
@@ -1,14 +1,14 @@
import { For } from "@imphnen-frontend-service/utils"
import { FC } from "react"
-const TOPICS = [
- { icon: '💼', name: 'Career & Self Development' },
- { icon: '🏢', name: 'Industry Insight' },
- { icon: '🗂️', name: 'Project Management & IT Tools' },
- { icon: '🖥️', name: 'Basic IT' },
- { icon: '💻', name: 'Programming/Software Dev' },
- { icon: '🗃️', name: 'Data & Database' },
- { icon: AI , name: 'AI Tips' }
+export const TOPICS = [
+ { id: 1, icon: '💼', name: 'Career & Self Development' },
+ { id: 2, icon: '🏢', name: 'Industry Insight' },
+ { id: 3, icon: '🗂️', name: 'Project Management & IT Tools' },
+ { id: 4, icon: '🖥️', name: 'Basic IT' },
+ { id: 5, icon: '💻', name: 'Programming/Software Dev' },
+ { id: 6, icon: '🗃️', name: 'Data & Database' },
+ { id: 7, icon: AI , name: 'AI Tips' }
]
export const TopicsSection: FC = () => {
diff --git a/apps/dimentorin/src/app/(public)/mentoring/[id]/page.tsx b/apps/dimentorin/src/app/(public)/mentoring/[id]/page.tsx
index 3a97de1..ad6934c 100644
--- a/apps/dimentorin/src/app/(public)/mentoring/[id]/page.tsx
+++ b/apps/dimentorin/src/app/(public)/mentoring/[id]/page.tsx
@@ -1,20 +1,25 @@
-import { FC } from 'react'
+import { FC, useState } from 'react'
import { ProfileSection } from './_components/sections/profile'
import { StatisticsSection } from './_components/sections/senpai-statistics'
import { TopicsSection } from './_components/sections/topics'
import { ExperienceSection } from './_components/sections/experience'
import { EducationSection } from './_components/sections/education'
import { SenpaiScheduleSection } from './_components/sections/senpai-schedule'
-
-
-
+import { Button } from '@imphnen-frontend-service/ui/atoms'
+import { AppointmentModal } from './_components/modals/appointment'
export const Components: FC = () => {
+ const [open, setOpen] = useState(false)
+
return (
-
+
setOpen(true)} />
+
+ setOpen(true)}>
+ Book Your Senpai!
+
@@ -33,11 +38,13 @@ export const Components: FC = () => {
-
+ setOpen(true)} />
+
+
)
}
diff --git a/apps/dimentorin/src/app/page.tsx b/apps/dimentorin/src/app/page.tsx
deleted file mode 100644
index 77801dc..0000000
--- a/apps/dimentorin/src/app/page.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Navbar } from '@imphnen-frontend-service/ui/organisms';
-import { FC, ReactElement } from 'react';
-
-export const Components: FC = (): ReactElement => {
- return (
-
-
-
- );
-};
-
-export default Components;
diff --git a/libs/ui/src/atoms/input/input.tsx b/libs/ui/src/atoms/input/input.tsx
index 664169a..1877947 100644
--- a/libs/ui/src/atoms/input/input.tsx
+++ b/libs/ui/src/atoms/input/input.tsx
@@ -9,7 +9,7 @@ import { EyeInvisibleOutlined, EyeOutlined } from '@ant-design/icons'; // Import
import { cn } from '@imphnen-frontend-service/utils';
import { Button } from '../button';
-type TInputType = 'text' | 'email' | 'number' | 'password' | 'file';
+type TInputType = 'text' | 'email' | 'number' | 'password' | 'file' | 'date' | 'time';
type TInputSize = 'sm' | 'md' | 'lg';
type Width = 'standard' | 'custom'