Skip to content

Commit

Permalink
Merge pull request #2208 from wondrous-dev/staging
Browse files Browse the repository at this point in the history
Staging
  • Loading branch information
andywong418 authored Feb 4, 2024
2 parents 2eed76c + 670761c commit d608dc9
Show file tree
Hide file tree
Showing 6 changed files with 241 additions and 16 deletions.
5 changes: 5 additions & 0 deletions wondrous-bot-admin/src/components/Icons/download.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,6 @@ const PlanSelectComponent = () => {
>
Select your plan
</Typography>
<Typography color="white" fontWeight={500} fontSize={"15px"}>
Try one of our premium plans to experience our full suite of products or start for free.
</Typography>
</Box>
<Box
display="flex"
Expand Down
14 changes: 14 additions & 0 deletions wondrous-bot-admin/src/graphql/queries/org.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,17 @@ export const GET_ORG_BY_REFERRAL_CODE = gql`
}
${OrgFragment}
`;

export const EXPORT_USER_ROLE_SUBMISSIONS = gql`
query exportUserRolesSubmissions($orgId: String, $startDate: String, $endDate: String, $cmtyUserId: String) {
exportUserRolesSubmissions(orgId: $orgId, startDate: $startDate, endDate: $endDate, cmtyUserId: $cmtyUserId) {
acceptedSubmissions
rejectedSubmissions
discordUserId
discordUsername
questTitleAccepted
questTitleRejected
roles
}
}
`;
182 changes: 182 additions & 0 deletions wondrous-bot-admin/src/pages/quests/members/ExportModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
import { Box, Grid } from "@mui/material";
import { Label } from "components/QuestsList/styles";
import Modal from "components/Shared/Modal";
import { SharedSecondaryButton } from "components/Shared/styles";
import Radio from "@mui/material/Radio";
import RadioGroup from "@mui/material/RadioGroup";
import FormControlLabel from "@mui/material/FormControlLabel";
import FormControl from "@mui/material/FormControl";
import FormLabel from "@mui/material/FormLabel";
import { useContext, useState } from "react";
import { useLazyQuery, useMutation } from "@apollo/client";
import GlobalContext from "utils/context/GlobalContext";
import { EXPORT_USER_ROLE_SUBMISSIONS } from "graphql/queries";
const arrayToCSV = (arr, delimiter = ",") =>
arr.map((v) => v.map((x) => (isNaN(x) ? `"${x.replace(/"/g, '""')}"` : x)).join(delimiter)).join("\n");
const exportUserRolesSubmissionsToCsv = (userRolesData, timeValue) => {
const headers = [
"Name (Discord username)",
"Team",
"# of submissions",
"# of accepted submissions",
"# of rejected submissions",
"Names of accepted submissions",
"Names of rejected submissions",
];
const rows = [[headers]];
userRolesData.forEach((userRole) => {
const totalSubmissions = Number(userRole?.acceptedSubmissions) + Number(userRole?.rejectedSubmissions);
const row = [
userRole?.discordUsername,
userRole?.roles?.join("; "),
totalSubmissions,
userRole?.acceptedSubmissions || 0,
userRole?.rejectedSubmissions || 0,
userRole?.questTitleAccepted?.join("; "),
userRole?.questTitleRejected?.join("; "),
];
rows.push(row);
});
let csvContent = "data:text/csv;charset=utf-8,";
rows.forEach((rowArray) => {
const row = rowArray.join(",");
csvContent += `${row}\r\n`;
});

let encodedUri = encodeURI(csvContent);
encodedUri = encodedUri.replace(/#/g, "%23");
const link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", `wonderverse_${timeValue}_data.csv`);
document.body.appendChild(link); // Required for FF
link.click();
};

const getStartAndEndDateFromDate = (value) => {
let startDate = new Date();
const endDate = new Date();
if (value === "today") {
startDate.setHours(0, 0, 0, 0);
} else if (value === "currentMonth") {
startDate = new Date(startDate.getFullYear(), startDate.getMonth(), 1);
} else if (value === "last7days") {
startDate.setDate(startDate.getDate() - 7);
} else if (value === "last30days") {
startDate.setDate(startDate.getDate() - 30);
} else if (value === "all") {
startDate = new Date(0);
}
return {
startDate,
endDate,
};
};
const DATE_STEPS = [
{
label: "Today",
value: "today",
},
{
label: "Current Month",
value: "currentMonth",
},
{
label: "Last 7 days",
value: "last7days",
},
{
label: "Last 30 days",
value: "last30days",
},
{
label: "All",
value: "all",
},
];
const ExportModal = ({ isOpen, onClose }) => {
const { activeOrg } = useContext(GlobalContext);
const [value, setValue] = useState("all");
const [exportUserRolesSubmissions] = useLazyQuery(EXPORT_USER_ROLE_SUBMISSIONS);
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setValue((event.target as HTMLInputElement).value);
};
return (
<>
<Modal
open={isOpen}
onClose={onClose}
title={"Export Members Activity Data"}
maxWidth={700}
footerRight={
<Box justifyContent={"flex-end"} display="flex" width={"100%"}>
<SharedSecondaryButton
style={{
radius: "6px",
width: "fit-content",
marginRight: "8px",
}}
$reverse
onClick={() => {
onClose();
}}
>
Cancel
</SharedSecondaryButton>
<SharedSecondaryButton
onClick={async () => {
const { startDate, endDate } = getStartAndEndDateFromDate(value);
const userRolesData = await exportUserRolesSubmissions({
variables: {
orgId: activeOrg?.id,
startDate,
endDate,
},
});
exportUserRolesSubmissionsToCsv(userRolesData?.data?.exportUserRolesSubmissions, value);
}}
>
Download
</SharedSecondaryButton>
</Box>
}
>
<Box display="flex" flexDirection={"column"}>
<Label>Date Range</Label>
<FormControl
style={{
marginTop: "8px",
}}
>
<RadioGroup
value={value}
onChange={handleChange}
aria-labelledby="demo-radio-buttons-group-label"
name="radio-buttons-group"
>
{DATE_STEPS.map((step, index) => {
return (
<FormControlLabel
key={index}
value={step.value}
control={
<Radio
sx={{
"& .MuiSvgIcon-root": {
color: "#2A8D5C",
},
}}
/>
}
label={step.label}
/>
);
})}
</RadioGroup>
</FormControl>
</Box>
</Modal>
</>
);
};

export default ExportModal;
50 changes: 38 additions & 12 deletions wondrous-bot-admin/src/pages/quests/members/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ import { MemberPageSearchBar } from "./MemberSearchBar";
import ResetPointsModal from "./ResetPointsModal";
import MembersTutorial from "components/TutorialComponent/Tutorials/MembersTutorial";
import { transformUser } from "utils/transformCmtyUserToMembers";
import { FilterPill } from "components/ViewQuestResults/styles";
import DownloadSvg from "components/Icons/download.svg";
import ExportModal from "./ExportModal";

const MembersPage = () => {
const { activeOrg } = useContext(GlobalContext);
Expand All @@ -23,6 +26,7 @@ const MembersPage = () => {
const [memberSearch, setMemberSearch] = useState(null);
const [resetPointsBalance, setResetPointsBalance] = useState(null);
const [openResetPointsModal, setOpenResetPointsModal] = useState(false);
const [openExportModal, setOpenExportModal] = useState(false);
const [memberInfo, setMemberInfo] = useState(null);
const [getCmtyUsersForOrg, { data, fetchMore, refetch, loading }] = useLazyQuery(GET_COMMUNITY_USERS_FOR_ORG, {
notifyOnNetworkStatusChange: true,
Expand Down Expand Up @@ -70,14 +74,14 @@ const MembersPage = () => {

const headers = ["Name", "Level", "Discord", "Twitter", "Points Balance", "Total Points Accumulated"];


return (
<>
<ResetPointsModal
openResetPointsModal={openResetPointsModal}
setOpenResetPointsModal={setOpenResetPointsModal}
pointsBalance={resetPointsBalance}
/>
<ExportModal isOpen={!!openExportModal} onClose={() => setOpenExportModal(false)} />
{data?.getCmtyUsersForOrg ? (
<MembersTutorial setMembersData={setMembersData} data={data?.getCmtyUsersForOrg} />
) : null}
Expand All @@ -98,32 +102,54 @@ const MembersPage = () => {
sm: "24px 56px",
}}
>
<Box
paddingRight="12px"
display="flex" alignItems={{
xs: 'flex-start',
md: 'center'
}} gap="12px" flexDirection={{
xs: 'column',
md: 'row'
}}>
<Box
paddingRight="12px"
display="flex"
alignItems={{
xs: "flex-start",
md: "center",
}}
gap="12px"
flexDirection={{
xs: "column",
md: "row",
}}
>
<MemberPageSearchBar onChange={setMemberSearch} member={memberSearch} setMemberInfo={setMemberInfo} />
<SharedSecondaryButton
onClick={() => {
setResetPointsBalance(false);
setOpenResetPointsModal(true);
}}
>
Reset member points
Reset points
</SharedSecondaryButton>
<SharedSecondaryButton
onClick={() => {
setResetPointsBalance(true);
setOpenResetPointsModal(true);
}}
>
Reset member point balances
Reset point balances
</SharedSecondaryButton>
<Box flex={1} />
<FilterPill
style={{
fontWeight: "600",
}}
onClick={() => {
setOpenExportModal(true);
}}
>
Export members{" "}
<img
style={{
cursor: "pointer",
marginLeft: "12px",
}}
src={DownloadSvg}
/>
</FilterPill>
</Box>
<Box width="100%" height="100%" data-tour="tutorial-members-table">
{membersData?.length > 0 ? (
Expand Down
3 changes: 2 additions & 1 deletion wondrous-bot-admin/src/utils/constants.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,7 @@ const FHENIX_INTEGRATIONS = [
];
export const POKT_ORG_ID = import.meta.env.VITE_PRODUCTION ? "110964182503916540" : "89444950095167649";

const FHENIX_ORG_ID = import.meta.env.VITE_PRODUCTION ? "110521236745880560" : "89444950095167649";
export const CUSTOM_INTEGRATIONS = {
// LIFI
"58318954576216128": {
Expand Down Expand Up @@ -474,7 +475,7 @@ export const CUSTOM_INTEGRATIONS = {
name: "Apeiron",
integrations: APEIRON_INTEGRATIONS,
},
"110521236745880560": {
[FHENIX_ORG_ID]: {
name: "Fhenix",
integrations: FHENIX_INTEGRATIONS,
},
Expand Down

0 comments on commit d608dc9

Please sign in to comment.