Skip to content

Commit ba8091d

Browse files
Merge branch 'main' of github.com:brandonnorsworthy/rust-quest into updates
2 parents a331a63 + b156da9 commit ba8091d

File tree

8 files changed

+3774
-2956
lines changed

8 files changed

+3774
-2956
lines changed

pnpm-lock.yaml

+3,704-2,939
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/assets/text/news.md

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
## Future Updates
1313
- Light/Dark mode toggle
14+
- Select the tier/stage you are in for the wipe to get challenges relevant to your progression. (e.g. early game, mid game, late game)
1415
- Bingo card generator with a code to share with friends to compete or collaborate
1516
__^^ let us know if this is a feature you'd like to see! ^^__
1617

public/robots.txt

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
User-agent: *
2+
Disallow:
3+
4+
Sitemap: https://rustquests.com/sitemap.xml

public/sitemap.xml

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3+
<!-- Public Routes -->
4+
<url>
5+
<loc>https://rustquests.com/</loc>
6+
</url>
7+
<url>
8+
<loc>https://rustquests.com/login</loc>
9+
</url>
10+
<url>
11+
<loc>https://rustquests.com/unauthorized</loc>
12+
</url>
13+
<url>
14+
<loc>https://rustquests.com/leaderboard</loc>
15+
</url>
16+
17+
</urlset>

src/components/Toaster/index.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ const Toaster: React.FC = () => {
2626
});
2727
};
2828

29+
const toastsCopy = [...toasts];
2930
return (
3031
<div className="absolute bottom-4 md:bottom-8 right-4 md:right-8 z-[1000] flex flex-col items-end">
3132
{
32-
toasts.reverse().map((toast, index) => {
33+
toastsCopy.reverse().map((toast, index) => {
3334
let toastStyle = null;
3435
switch (toast.type) {
3536
case 'error':

src/modals/ViewQuest/ViewQuest.tsx

+8-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ interface ModalProps {
88
onSkip?: () => void;
99
onComplete?: () => void;
1010
onIncomplete?: () => void;
11-
quest: Quest
11+
quest: Quest,
12+
disableButtons?: boolean;
1213
}
1314

1415
const ViewQuest: React.FC<ModalProps> = (props) => {
@@ -17,7 +18,8 @@ const ViewQuest: React.FC<ModalProps> = (props) => {
1718
onSkip,
1819
onComplete,
1920
onIncomplete,
20-
quest
21+
quest,
22+
disableButtons
2123
} = props;
2224
const { title, description, objectives, image_url, category, info_url, username } = quest;
2325

@@ -78,6 +80,7 @@ const ViewQuest: React.FC<ModalProps> = (props) => {
7880
info_url &&
7981
<Button
8082
type="info"
83+
disabled={disableButtons}
8184
onClick={() => window.open(info_url, '_blank', 'noopener,noreferrer')}>
8285
learn more
8386
</Button>
@@ -88,6 +91,7 @@ const ViewQuest: React.FC<ModalProps> = (props) => {
8891
onSkip &&
8992
<Button
9093
type="cancel"
94+
disabled={disableButtons}
9195
onClick={onSkip}>
9296
skip
9397
</Button>
@@ -96,6 +100,7 @@ const ViewQuest: React.FC<ModalProps> = (props) => {
96100
onComplete &&
97101
<Button
98102
type="confirm"
103+
disabled={disableButtons}
99104
onClick={onComplete}>
100105
complete
101106
</Button>
@@ -104,6 +109,7 @@ const ViewQuest: React.FC<ModalProps> = (props) => {
104109
onIncomplete &&
105110
<Button
106111
type="cancel"
112+
disabled={disableButtons}
107113
onClick={onIncomplete}>
108114
mark incomplete
109115
</Button>

src/pages/LandingPage.tsx

+14-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const LandingPage = () => {
2929
const [currentQuest, setCurrentQuest] = useState<Quest | null>(storedQuests);
3030
const [currentOpenModal, setCurrentOpenModal] = useState<ModalTypes>(null);
3131
const [spinning, setSpinning] = useState(false);
32+
const [isModalLoading, setIsModalLoading] = useState(false);
3233

3334
const disableButtons = currentOpenModal ? true : false;
3435

@@ -48,10 +49,13 @@ const LandingPage = () => {
4849
if (!accessToken) return navigate("/login");
4950

5051
try {
52+
setIsModalLoading(true);
5153
const randomQuestResponse = await questService.getRandomQuest(accessToken);
5254

5355
if (!randomQuestResponse) {
5456
toast.warning("No quests available, add new filters or reset your progress to see more quests.");
57+
setCurrentOpenModal(null);
58+
setCurrentQuest(null);
5559
return;
5660
}
5761

@@ -60,24 +64,31 @@ const LandingPage = () => {
6064
setCurrentOpenModal("quest");
6165
localStorage.setItem('currentQuest', JSON.stringify(randomQuestResponse));
6266
} catch (error) {
67+
setCurrentOpenModal(null);
68+
setCurrentQuest(null);
6369
toast.error("Failed to get random quest", error);
70+
} finally {
71+
setIsModalLoading(false);
6472
}
6573
};
6674

6775
const handleQuestSkip = () => {
68-
setCurrentQuest(null);
76+
// setCurrentQuest(null);
6977
localStorage.removeItem('currentQuest');
78+
handleSpinWheel();
7079
};
7180

7281
const handleQuestComplete = async () => {
7382
if (!accessToken) return navigate("/login");
7483

7584
try {
85+
setIsModalLoading(true);
7686
const completeQuestResponse = await userService.completeQuest(accessToken, currentQuest!.id);
7787

78-
setCurrentQuest(null);
88+
// setCurrentQuest(null);
7989
localStorage.removeItem('currentQuest');
8090
toast.success(completeQuestResponse);
91+
handleSpinWheel();
8192
} catch (error) {
8293
toast.error("Failed to complete quest", error);
8394
}
@@ -132,6 +143,7 @@ const LandingPage = () => {
132143
onSkip={handleQuestSkip}
133144
onComplete={handleQuestComplete}
134145
quest={currentQuest}
146+
disableButtons={isModalLoading}
135147
/>
136148
</Modal>
137149
);

src/pages/admin/AdminSuggestionsPage.tsx

+24-12
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,6 @@ const AdminSuggestionsPage = () => {
8585
closeModal();
8686
};
8787

88-
const handleDeleteSuggestion = async () => {
89-
const onConfirm = () => toast.info('not implemented yet');
90-
setConfirmDialog({
91-
title: "Are you sure?",
92-
description: "If you delete this suggestion, you will lose all changes.",
93-
onConfirm: () => {
94-
onConfirm();
95-
setConfirmDialog(null);
96-
}
97-
});
98-
};
99-
10088
const handleCreateQuest = async (newQuest: convertSuggestionIntoQuestBodyRequest) => {
10189
const handleConvertSuggestionToQuest = async () => {
10290
try {
@@ -125,6 +113,30 @@ const AdminSuggestionsPage = () => {
125113
}
126114
});
127115
};
116+
117+
const handleDeleteSuggestion = async () => {
118+
const onConfirm = () => {
119+
try {
120+
if (!selectedSuggestion) return;
121+
if (!accessToken) return;
122+
123+
suggestionService.deleteSuggestion(accessToken, selectedSuggestion.id);
124+
closeModal();
125+
fetchSuggestions();
126+
127+
toast.success("Suggestion deleted successfully");
128+
} catch (error) {
129+
toast.error("Failed to delete suggestion", error);
130+
} finally {
131+
setConfirmDialog(null);
132+
}
133+
};
134+
setConfirmDialog({
135+
title: "Are you sure?",
136+
description: "If you delete this suggestion, you will lose all changes.",
137+
onConfirm: onConfirm,
138+
});
139+
};
128140

129141
return (
130142
<main className="overflow-hidden h-dvh w-dvw">

0 commit comments

Comments
 (0)