diff --git a/package.json b/package.json index f63de6c..cd083fc 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,13 @@ "@fontsource/poppins": "^4.4.5", "@heroicons/react": "^1.0.2", "@react-spring/web": "^9.7.3", + "@ristek-kit/ads": "^1.2.6", "axios": "^0.19.0", "copy-image-clipboard": "^2.1.2", "framer-motion": "^4", "html-to-image": "^1.9.0", "ics": "^2.31.0", + "mixpanel-browser": "^2.48.1", "query-string": "^6.8.1", "react": "^16.8.6", "react-burger-menu": "^2.6.10", @@ -30,7 +32,7 @@ "react-redux": "^7.1.0", "react-router": "^5.2.0", "react-router-dom": "^5.2.0", - "react-scripts": "3.0.1", + "react-scripts": "^4.0.1", "redux": "^4.0.4", "styled-components": "^4.3.2" }, @@ -60,8 +62,10 @@ "devDependencies": { "@testing-library/jest-dom": "^5.14.1", "@testing-library/react": "^12.1.2", + "eslint": "^7.11.0", "eslint-config-prettier": "^8.3.0", - "eslint-config-react-app": "^6.0.0", + "eslint-config-react-app": "^7.0.1", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "^7.25.3", "eslint-plugin-unused-imports": "^1.1.4", diff --git a/src/App.js b/src/App.js index eaf4ed2..4c1a704 100644 --- a/src/App.js +++ b/src/App.js @@ -3,6 +3,7 @@ import { Provider } from "react-redux"; import { Router } from "react-router"; import { createBrowserHistory } from "history"; +import { AdsProvider } from "@ristek-kit/ads"; import MediaQuery from "containers/MediaQuery"; import Loading from "containers/Loading"; @@ -11,6 +12,7 @@ import store from "./redux/store"; import config from "config"; import "./app.css"; +import "@ristek-kit/ads/dist/styles.css"; import ScrollToTop from "utils/scroll"; const history = createBrowserHistory({ basename: config.BASE_URL }); @@ -20,7 +22,9 @@ function App() { - + + + diff --git a/src/app.css b/src/app.css index 6cc2452..d179e38 100644 --- a/src/app.css +++ b/src/app.css @@ -462,7 +462,6 @@ button { -moz-appearance: none; background: transparent; padding: 0; - border: 0; border-radius: 0; line-height: 1; } @@ -603,7 +602,7 @@ button { } .small-offset-2 { - margin-left: 16.66667% + margin-left: 16.66667%; } .small-4 { @@ -1974,7 +1973,7 @@ p + .stat { .entryJadwal { position: absolute; width: calc((100% / 6) - 0.5rem); - background: #F2994A; + background: #f2994a; color: #222222; } diff --git a/src/assets/Feedback/Modal/bauhaus-feedback-1.png b/src/assets/Feedback/Modal/bauhaus-feedback-1.png new file mode 100644 index 0000000..4b94f65 Binary files /dev/null and b/src/assets/Feedback/Modal/bauhaus-feedback-1.png differ diff --git a/src/assets/Feedback/Modal/bauhaus-feedback-2.svg b/src/assets/Feedback/Modal/bauhaus-feedback-2.svg new file mode 100644 index 0000000..5a5855d --- /dev/null +++ b/src/assets/Feedback/Modal/bauhaus-feedback-2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/Feedback/Page/bauhaus-feedback-1.png b/src/assets/Feedback/Page/bauhaus-feedback-1.png new file mode 100644 index 0000000..3c0cce1 Binary files /dev/null and b/src/assets/Feedback/Page/bauhaus-feedback-1.png differ diff --git a/src/assets/Feedback/Page/bauhaus-feedback-2.png b/src/assets/Feedback/Page/bauhaus-feedback-2.png new file mode 100644 index 0000000..ae8e31d Binary files /dev/null and b/src/assets/Feedback/Page/bauhaus-feedback-2.png differ diff --git a/src/assets/Feedback/Page/bauhaus-feedback-3.png b/src/assets/Feedback/Page/bauhaus-feedback-3.png new file mode 100644 index 0000000..bbbf4a2 Binary files /dev/null and b/src/assets/Feedback/Page/bauhaus-feedback-3.png differ diff --git a/src/assets/Feedback/Page/bauhaus-feedback-4.png b/src/assets/Feedback/Page/bauhaus-feedback-4.png new file mode 100644 index 0000000..40b0ec6 Binary files /dev/null and b/src/assets/Feedback/Page/bauhaus-feedback-4.png differ diff --git a/src/assets/GoogleCalendar.png b/src/assets/GoogleCalendar.png new file mode 100644 index 0000000..90a38a6 Binary files /dev/null and b/src/assets/GoogleCalendar.png differ diff --git a/src/assets/GoogleCalendarModal/mulai.png b/src/assets/GoogleCalendarModal/mulai.png new file mode 100644 index 0000000..a3b40ca Binary files /dev/null and b/src/assets/GoogleCalendarModal/mulai.png differ diff --git a/src/assets/GoogleCalendarModal/step1.png b/src/assets/GoogleCalendarModal/step1.png new file mode 100644 index 0000000..2c3d55f Binary files /dev/null and b/src/assets/GoogleCalendarModal/step1.png differ diff --git a/src/assets/GoogleCalendarModal/step2.png b/src/assets/GoogleCalendarModal/step2.png new file mode 100644 index 0000000..ddbbcfe Binary files /dev/null and b/src/assets/GoogleCalendarModal/step2.png differ diff --git a/src/assets/GoogleCalendarModal/step3.png b/src/assets/GoogleCalendarModal/step3.png new file mode 100644 index 0000000..23dceb7 Binary files /dev/null and b/src/assets/GoogleCalendarModal/step3.png differ diff --git a/src/assets/GoogleCalendarModal/step4.png b/src/assets/GoogleCalendarModal/step4.png new file mode 100644 index 0000000..ae01141 Binary files /dev/null and b/src/assets/GoogleCalendarModal/step4.png differ diff --git a/src/assets/GoogleCalendarModal/step5.png b/src/assets/GoogleCalendarModal/step5.png new file mode 100644 index 0000000..8d13fab Binary files /dev/null and b/src/assets/GoogleCalendarModal/step5.png differ diff --git a/src/assets/GoogleCalendarModal/step6.png b/src/assets/GoogleCalendarModal/step6.png new file mode 100644 index 0000000..b903458 Binary files /dev/null and b/src/assets/GoogleCalendarModal/step6.png differ diff --git a/src/assets/GoogleCalendarModal/step7.png b/src/assets/GoogleCalendarModal/step7.png new file mode 100644 index 0000000..9a2c279 Binary files /dev/null and b/src/assets/GoogleCalendarModal/step7.png differ diff --git a/src/assets/GoogleCalendarModal/step8.png b/src/assets/GoogleCalendarModal/step8.png new file mode 100644 index 0000000..56119a9 Binary files /dev/null and b/src/assets/GoogleCalendarModal/step8.png differ diff --git a/src/components/Cards.js b/src/components/Cards.js index 10fd353..6afd210 100644 --- a/src/components/Cards.js +++ b/src/components/Cards.js @@ -7,7 +7,7 @@ import { Icon, useColorModeValue, } from "@chakra-ui/react"; -import { GoMarkGithub } from "react-icons/go"; +import { FaGithub } from "react-icons/fa6"; export const ContributorCard = ({ name, avatar, github, contributions }) => { const theme = useColorModeValue("light", "dark"); @@ -61,7 +61,7 @@ export const ContributorCard = ({ name, avatar, github, contributions }) => { > {" "} Github diff --git a/src/config.js b/src/config.js index ff5dbf4..572c783 100644 --- a/src/config.js +++ b/src/config.js @@ -4,19 +4,21 @@ const config = { SSO_UI_URL: "https://sso.ui.ac.id/cas2", AIRTABLE_BASE_ID: process.env.REACT_APP_BETA_AIRTABLE_BASE_ID, AIRTABLE_API_KEY: process.env.REACT_APP_BETA_AIRTABLE_API_KEY, - AIRTABLE_TABLE_NAME: process.env.REACT_APP_BETA_AIRTABLE_TABLE_NAME + AIRTABLE_TABLE_NAME: process.env.REACT_APP_BETA_AIRTABLE_TABLE_NAME, + MIXPANEL_PROJECT_TOKEN: process.env.REACT_APP_MIXPANEL_PROJECT_TOKEN, }, production: { API_BASE_URL: process.env.REACT_APP_AWS_BACKEND_URL, - BASE_URL: "/" + BASE_URL: "/", }, development: { - API_BASE_URL: "http://localhost:5000/susunjadwal/api", - BASE_URL: "/" - } + // API_BASE_URL: "http://localhost:5000/susunjadwal/api", + API_BASE_URL: "https://stg.api.susunjadwal.cs.ui.ac.id/susunjadwal/api", + BASE_URL: "/", + }, }; export default { ...config.base, - ...config[process.env.NODE_ENV || "development"] + ...config[process.env.NODE_ENV || "development"], }; diff --git a/src/containers/Admin/Feedbacks/feedback.js b/src/containers/Admin/Feedbacks/feedback.js new file mode 100644 index 0000000..22e1140 --- /dev/null +++ b/src/containers/Admin/Feedbacks/feedback.js @@ -0,0 +1,37 @@ +export const dummyFeedbacks = [ + { id: 1, username: 'farrel.altaf', rating: 5, feedback: 'Bagus banget inimah susun jadwal nggak membingungkan, makasih!', time: '17/04/2024 20:08', status: 'diproses' }, + { id: 2, username: 'johndoe', rating: 5, feedback: 'Sangat membantu, terima kasih!', time: '18/04/2024 10:15', status: 'diproses' }, + { id: 3, username: 'janedoe', rating: 5, feedback: 'Cukup membantu, tetapi bisa lebih baik.', time: '19/04/2024 14:23', status: 'belum_diproses' }, + { id: 4, username: 'alice', rating: 5, feedback: 'Luar biasa! Sangat merekomendasikan.', time: '20/04/2024 08:45', status: 'diproses' }, + { id: 5, username: 'bob', rating: 5, feedback: 'Tidak puas, banyak bug.', time: '21/04/2024 19:05', status: 'belum_diproses' }, + { id: 6, username: 'charlie', rating: 5, feedback: 'Bagus, tapi bisa lebih baik.', time: '22/04/2024 11:30', status: 'diproses' }, + { id: 7, username: 'dave', rating: 5, feedback: 'Kurang memuaskan.', time: '23/04/2024 17:50', status: 'belum_diproses' }, + { id: 8, username: 'eve', rating: 5, feedback: 'Biasa saja.', time: '24/04/2024 13:10', status: 'diproses' }, + { id: 9, username: 'frank', rating: 5, feedback: 'Luar biasa!', time: '25/04/2024 09:20', status: 'diproses' }, + { id: 10, username: 'grace', rating: 5, feedback: 'Sangat membantu, terima kasih!', time: '26/04/2024 16:40', status: 'diproses' }, + { id: 11, username: 'aldi.putra', rating: 5, feedback: 'Mantap, semoga kedepannya lebih bagus lagi.', time: '27/04/2024 10:30', status: 'diproses' }, + { id: 12, username: 'bella.rizky', rating: 5, feedback: 'Kurang suka, banyak yang kurang jelas.', time: '28/04/2024 14:50', status: 'belum_diproses' }, + { id: 13, username: 'cindy.sari', rating: 5, feedback: 'Biasa aja sih, tapi lumayan.', time: '29/04/2024 12:20', status: 'diproses' }, + { id: 14, username: 'doni.setiawan', rating: 5, feedback: 'Perfect! Gak ada duanya.', time: '30/04/2024 09:10', status: 'diproses' }, + { id: 15, username: 'erwin.pratama', rating: 5, feedback: 'Cukup oke, meskipun ada sedikit bug.', time: '01/05/2024 16:45', status: 'diproses' }, + { id: 16, username: 'fanny.febri', rating: 5, feedback: 'Gak sesuai ekspektasi, kecewa.', time: '02/05/2024 11:00', status: 'belum_diproses' }, + { id: 17, username: 'galih.eka', rating: 3, feedback: 'Lumayan, bisa diterima lah.', time: '03/05/2024 13:35', status: 'diproses' }, + { id: 18, username: 'hendra.satria', rating: 5, feedback: 'Bagus banget, sangat memudahkan.', time: '04/05/2024 15:20', status: 'diproses' }, + { id: 19, username: 'ika.putri', rating: 4, feedback: 'Bagus, tapi masih bisa ditingkatkan.', time: '05/05/2024 17:50', status: 'diproses' }, + { id: 20, username: 'jaka.saputra', rating: 2, feedback: 'Kurang memuaskan, banyak bug.', time: '06/05/2024 19:30', status: 'belum_diproses' }, + { id: 21, username: 'kenny.tan', rating: 3, feedback: 'Not bad, bisa lah.', time: '07/05/2024 21:10', status: 'diproses' }, + { id: 22, username: 'lina.agustina', rating: 4, feedback: 'Suka banget, sangat membantu.', time: '08/05/2024 08:50', status: 'diproses' }, + { id: 23, username: 'mario.gilang', rating: 5, feedback: 'Perfect, sangat memudahkan.', time: '09/05/2024 10:00', status: 'diproses' }, + { id: 24, username: 'nina.wulandari', rating: 2, feedback: 'Kurang jelas, banyak yang harus diperbaiki.', time: '10/05/2024 12:30', status: 'belum_diproses' }, + { id: 25, username: 'okky.ferdi', rating: 3, feedback: 'Lumayan, tapi banyak kekurangan.', time: '11/05/2024 14:10', status: 'diproses' }, + { id: 26, username: 'poppy.anggi', rating: 4, feedback: 'Bagus, saya suka.', time: '12/05/2024 16:00', status: 'diproses' }, + { id: 27, username: 'rizal.budi', rating: 1, feedback: 'Gak bagus, kecewa banget.', time: '13/05/2024 18:30', status: 'belum_diproses' }, + { id: 28, username: 'sandy.prayoga', rating: 5, feedback: 'Sangat memuaskan!', time: '14/05/2024 20:10', status: 'diproses' }, + { id: 29, username: 'tina.putri', rating: 4, feedback: 'Cukup membantu, terima kasih.', time: '15/05/2024 22:00', status: 'diproses' }, + { id: 30, username: 'utami.dewi', rating: 3, feedback: 'Biasa saja, masih bisa ditingkatkan.', time: '16/05/2024 08:10', status: 'diproses' }, +]; + +export const feedbackStats = [5, 4, 3, 2, 1].map(rating => ({ + rating, + count: dummyFeedbacks.filter(fb => fb.rating === rating).length, +})); diff --git a/src/containers/Admin/Feedbacks/index.js b/src/containers/Admin/Feedbacks/index.js new file mode 100644 index 0000000..2eed4dc --- /dev/null +++ b/src/containers/Admin/Feedbacks/index.js @@ -0,0 +1,307 @@ +import React, { useState } from 'react'; +import { + Box, + Text, + Image, + Flex, + Table, + Thead, + Tbody, + Tr, + Th, + Td, + Select, + useColorModeValue, + HStack, + Link, +} from '@chakra-ui/react'; +import { Helmet } from 'react-helmet'; +import { NavLink } from 'react-router-dom'; +import { ChevronLeftIcon, ChevronRightIcon, StarIcon, ArrowUpIcon, ArrowDownIcon } from '@chakra-ui/icons'; +import styled from 'styled-components'; +import LogoSunjad from 'assets/Beta/LogoSunjad-light.svg'; +import { dummyFeedbacks, feedbackStats } from './feedback'; + +const AdminFeedbacks = () => { + const [feedbacksPerPage, setFeedbacksPerPage] = useState(5); + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ key: null, direction: 'asc' }); + + const totalPages = Math.ceil(dummyFeedbacks.length / feedbacksPerPage); + const sortedFeedbacks = [...dummyFeedbacks]; + + + + const sortedData = () => { + if (sortConfig.key !== null) { + sortedFeedbacks.sort((a, b) => { + if (sortConfig.key === 'Waktu') { + const dateA = new Date(a[sortConfig.key]); + const dateB = new Date(b[sortConfig.key]); + return sortConfig.direction === 'asc' ? dateA - dateB : dateB - dateA; + } else { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === 'asc' ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === 'asc' ? 1 : -1; + } + return 0; + } + }); + } + return sortedFeedbacks; + }; + + const currentFeedbacks = sortedData().slice( + (currentPage - 1) * feedbacksPerPage, + currentPage * feedbacksPerPage + ); + + const handlePageChange = page => { + if (page < 1 || page > totalPages) return; + setCurrentPage(page); + }; + + const handleSort = key => { + let direction = 'asc'; + if (sortConfig.key === key && sortConfig.direction === 'asc') { + direction = 'desc'; + } + setSortConfig({ key, direction }); + }; + + const averageRating = ( + dummyFeedbacks.reduce((acc, feedback) => acc + feedback.rating, 0) / dummyFeedbacks.length + ).toFixed(1); + + const getPaginationItems = () => { + const items = []; + const startPage = Math.max(1, currentPage - 2); + const endPage = Math.min(totalPages, currentPage + 2); + + if (startPage > 1) { + items.push( + handlePageChange(1)} isActive={currentPage === 1}> + 1 + + ); + if (startPage > 2) { + items.push(...); + } + } + + for (let page = startPage; page <= endPage; page++) { + items.push( + handlePageChange(page)} isActive={currentPage === page}> + {page} + + ); + } + + if (endPage < totalPages) { + if (endPage < totalPages - 1) { + items.push(...); + } + items.push( + handlePageChange(totalPages)} isActive={currentPage === totalPages}> + {totalPages} + + ); + } + + return items; + }; + + const renderSortIcon = key => { + if (sortConfig.key !== key) return ; + return sortConfig.direction === 'asc' ? : ; + }; + + return ( + + + + + + logo + + Sign Out + + + + + + Rating & Ulasan User + + + + + + {averageRating} + + + {Array(5) + .fill('') + .map((_, i) => ( + + ))} + + + {dummyFeedbacks.length} ulasan + + + + {feedbackStats.map((stat, i) => ( + + + {stat.rating} + + + + + + ))} + + + + + + + + + + + + + + + + + {currentFeedbacks.map((feedback, index) => ( + + + + + + + + + ))} + +
+ handleSort('id')}> + No {renderSortIcon('id')} + + + handleSort('username')}> + Nama User {renderSortIcon('username')} + + + handleSort('rating')}> + Rating {renderSortIcon('rating')} + + + Feedback (opsional) + + handleSort('time')}> + Waktu {renderSortIcon('time')} + + + handleSort('status')}> + Aksi {renderSortIcon('status')} + +
{(currentPage - 1) * feedbacksPerPage + index + 1}{feedback.username}{feedback.rating}{feedback.feedback}{feedback.time} + +
+
+ + + handlePageChange(currentPage - 1)} disabled={currentPage === 1}> + + Previous + + {getPaginationItems()} + handlePageChange(currentPage + 1)} disabled={currentPage === totalPages}> + Next + + + + + + Ulasan per halaman: + + +
+
+ ); +}; + +const Container = props => ( + +); + +export const SignOutLink = styled(NavLink)` + font-size: 18px; + white-space: nowrap; + color: var(--chakra-colors-state-Error) !important; + @media only screen and (max-width: 900px) { + font-size: 14px; + line-height: 3rem; + } +`; + +const PaginationButton = styled.button` + background: transparent; + color: var(--chakra-colors-primary-Purple); + border: ${props => (props.isActive ? '1px solid var(--chakra-colors-primary-Purple)' : 'none')}; + border-radius: 0.25rem; + padding: 0.5rem 1rem; + margin: 0 0.25rem; + cursor: pointer; + transition: background 0.3s, color 0.3s; + + &:hover { + background: var(--chakra-colors-primary-Purple); + color: white; + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } +`; + +export default AdminFeedbacks; diff --git a/src/containers/Admin/Login/index.js b/src/containers/Admin/Login/index.js new file mode 100644 index 0000000..38463ff --- /dev/null +++ b/src/containers/Admin/Login/index.js @@ -0,0 +1,116 @@ +import React, { useState } from 'react'; +import { + Box, + Button, + Input, + FormControl, + FormLabel, + FormErrorMessage, + Text, + Stack, + InputGroup, + InputRightElement, + IconButton, + useColorModeValue, + Image, +} from '@chakra-ui/react'; +import { Helmet } from 'react-helmet'; +import { useHistory } from 'react-router-dom'; +import { ViewIcon, ViewOffIcon } from '@chakra-ui/icons'; +import RistekLogo from "assets/Beta/LogoSunjad-light.svg"; + +const AdminLogin = () => { + const [showPassword, setShowPassword] = useState(false); + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [errors, setErrors] = useState({ username: '', password: '' }); + + const handleShowClick = () => setShowPassword(!showPassword); + + const history = useHistory(); + + const handleSubmit = (e) => { + e.preventDefault(); + const validationErrors = {}; + + if (!username) { + validationErrors.username = 'Masukan username'; + } + if (!password) { + validationErrors.password = 'Masukan password'; + } + + setErrors(validationErrors); + + if (Object.keys(validationErrors).length === 0) { + if (username === 'admin' && password === '12345678') { + history.push('/feedback-recap'); + } else { + setErrors({ username: 'Invalid username or password' }); + } + } + }; + + return ( + + + + Logo + + Welcome Back! Admin + +
+ + Username * + setUsername(e.target.value)} + /> + {errors.username} + + + + Password * + + setPassword(e.target.value)} + /> + + : } + onClick={handleShowClick} + variant="ghost" + /> + + + {errors.password} + + + +
+
+
+ ); +}; + +export default AdminLogin; diff --git a/src/containers/BuildSchedule/CourseClass.js b/src/containers/BuildSchedule/CourseClass.js index bec6c62..bdf8118 100644 --- a/src/containers/BuildSchedule/CourseClass.js +++ b/src/containers/BuildSchedule/CourseClass.js @@ -1,5 +1,6 @@ import React from "react"; import styled from "styled-components"; +// import { useMixpanel } from "hooks/useMixpanel"; import { useSelector, useDispatch } from "react-redux"; import { addSchedule, removeSchedule } from "redux/modules/schedules"; import { useColorModeValue } from "@chakra-ui/react"; @@ -99,6 +100,8 @@ function CourseClass({ course, courseClass }) { dispatch(removeSchedule(item)); } else { dispatch(addSchedule(item)); + // TODO: Re-enable mixpanel or change to other analytics + // useMixpanel.track("select_course"); } }; diff --git a/src/containers/BuildSchedule/SelectMajor.js b/src/containers/BuildSchedule/SelectMajor.js index a26718f..da612a8 100644 --- a/src/containers/BuildSchedule/SelectMajor.js +++ b/src/containers/BuildSchedule/SelectMajor.js @@ -1,8 +1,10 @@ import React from "react"; +// import { useMixpanel } from "hooks/useMixpanel"; import { Flex } from "@chakra-ui/react"; import FACULTIES from "utils/faculty-base-additional-info.json"; import { useForm } from "react-hook-form"; import { CustomSelect } from "components/CustomSelect"; +import { useEffect } from "react"; function SelectMajor({ theme, isMobile, setMajorSelected, show }) { const { register, watch } = useForm(); @@ -26,6 +28,16 @@ function SelectMajor({ theme, isMobile, setMajorSelected, show }) { setMajorSelected(selectedMajor[0]); } + useEffect(() => { + // TODO: Re-enable mixpanel or change to other analytics + // if (selectedFaculty) useMixpanel.track("select_faculty"); + }, [selectedFaculty]); + + useEffect(() => { + // TODO: Re-enable mixpanel or change to other analytics + // if (selectedMajorName) useMixpanel.track("select_prodi");/ + }, [selectedMajorName]); + return ( { @@ -95,6 +97,17 @@ function BuildSchedule() { } }); + // TODO: Re-enable mixpanel or change to other analytics + // useEffect(() => { + // useMixpanel.track("open_buat_jadwal"); + // }, []); + + useEffect(() => { + if (isInitialMount.current) isInitialMount.current = false; + // TODO: Re-enable mixpanel or change to other analytics + // else useMixpanel.track("search_course"); + }, [value]); + return ( @@ -249,6 +262,13 @@ function BuildSchedule() { > Mata kuliah yang dicari tidak ditemukan + + Some users may experience missing course information. We are + currently fixing this problem. + ) : ( filteredCourse.map((course, idx) => ( diff --git a/src/containers/Contributors/index.js b/src/containers/Contributors/index.js index ad47138..f509699 100644 --- a/src/containers/Contributors/index.js +++ b/src/containers/Contributors/index.js @@ -1,4 +1,5 @@ import React, { useCallback, useEffect, useState } from "react"; +// import { useMixpanel } from "hooks/useMixpanel"; import { Text, Box, Button, Flex, useColorModeValue } from "@chakra-ui/react"; import { ChevronLeftIcon } from "@chakra-ui/icons"; import { Link } from "react-router-dom"; @@ -34,6 +35,11 @@ const Contributors = () => { fetchContributors(); }, [fetchContributors]); + useEffect(() => { + // TODO: Re-enable mixpanel or change to other analytics + // useMixpanel.track("open_contributors"); + }, []); + const MergeContributors = (contributors, otherContributors) => { if (contributors && otherContributors) { // if contributors from repoA and repoB fetched @@ -85,6 +91,8 @@ const Contributors = () => { avatar={user.avatar_url} github={user.html_url} contributions={user.contributions} + // TODO: Re-enable mixpanel or change to other analytics + // onClick={() => useMixpanel.track("see_contributor_detail")} /> )); @@ -131,6 +139,8 @@ const Contributors = () => { useMixpanel.track("gabung_discord")} target="_blank" >