Skip to content

Commit f6691f2

Browse files
authored
Merge pull request #107 from dragoni7/fix-equipping-shared-mods
Fixed equipping shared loadout mods. Added loading message. Added fad…
2 parents 474c56c + f2fd01f commit f6691f2

File tree

10 files changed

+175
-117
lines changed

10 files changed

+175
-117
lines changed

src/app/routes/Dashboard.tsx

Lines changed: 112 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
resetLoadout,
3030
resetLoadoutArmorMods,
3131
updateLoadoutArmor,
32+
updateLoadoutArmorMods,
3233
updateLoadoutCharacter,
3334
updateRequiredStatMods,
3435
updateSubclass,
@@ -39,14 +40,14 @@ import { updateManifest } from '../../lib/bungie_api/manifest';
3940
import LoadoutCustomization from '../../components/LoadoutCustomization';
4041
import background from '/assets/background.png';
4142
import ExoticSelector from '../../features/armor-optimization/components/ExoticSelector';
42-
import { DAMAGE_TYPE } from '../../lib/bungie_api/constants';
43+
import { ARMOR_ARRAY, DAMAGE_TYPE } from '../../lib/bungie_api/constants';
4344
import { decodeLoadout } from '../../features/loadouts/util/loadout-encoder';
4445
import {
4546
resetDashboard,
4647
updateSelectedCharacter,
4748
updateSelectedExoticItemHash,
4849
} from '../../store/DashboardReducer';
49-
import { CircularProgress, Box, Grid, Typography } from '@mui/material';
50+
import { CircularProgress, Box, Grid, Typography, Container } from '@mui/material';
5051
import { ManifestArmorStatMod, ManifestExoticArmor } from '../../types/manifest-types';
5152
import { SharedLoadoutDto } from '../../features/loadouts/types';
5253
import { updateProfileCharacters } from '../../store/ProfileReducer';
@@ -55,20 +56,23 @@ import useArtificeMods from '../../hooks/use-artifice-mods';
5556
import useStatMods from '../../hooks/use-stat-mods';
5657
import StatModifications from '../../features/subclass/components/StatModifications';
5758
import Footer from '../../components/Footer';
59+
import { equipSharedMods } from '@/features/loadouts/util/loadout-utils';
60+
import FadeIn from '@/components/FadeIn';
5861

5962
const DashboardContent = styled(Grid)(({ theme }) => ({
6063
backgroundImage: `url(${background})`,
6164
backgroundSize: 'cover',
6265
backgroundPosition: 'center',
6366
}));
6467

65-
const LoadingScreen = styled(Grid)(({ theme }) => ({
68+
const LoadingScreen = styled(Box)(({ theme }) => ({
6669
height: '100vh',
6770
width: '100vw',
6871
display: 'flex',
6972
flexDirection: 'column',
7073
justifyContent: 'center',
7174
alignItems: 'center',
75+
textAlign: 'center',
7276
backgroundImage: `url(${background})`,
7377
backgroundSize: 'cover',
7478
backgroundPosition: 'center',
@@ -89,7 +93,7 @@ export const Dashboard: React.FC = () => {
8993
const fragments = useSelector(
9094
(state: RootState) => state.loadoutConfig.loadout.subclassConfig.fragments
9195
);
92-
const [generatingPermutations, setGeneratingPermutations] = useState(false);
96+
9397
const [subclasses, setSubclasses] = useState<
9498
{ [key: number]: SubclassConfig | undefined } | undefined
9599
>(undefined);
@@ -101,6 +105,7 @@ export const Dashboard: React.FC = () => {
101105
const [showLoadoutCustomization, setShowLoadoutCustomization] = useState(false);
102106
const [showAbilitiesModification, setShowAbilitiesModification] = useState(false);
103107
const [sharedLoadoutDto, setSharedLoadoutDto] = useState<SharedLoadoutDto | undefined>(undefined);
108+
const [loadingMessage, setLoadingMessage] = useState<String>('Loading...');
104109

105110
const statMods = useStatMods();
106111
const artificeMods = useArtificeMods();
@@ -212,9 +217,11 @@ export const Dashboard: React.FC = () => {
212217
};
213218

214219
const updateData = async () => {
220+
setLoadingMessage('Loading Destiny Data...');
215221
await updateManifest();
216222
const destinyMembership = await getDestinyMembershipId();
217223
dispatch(updateMembership(destinyMembership));
224+
setLoadingMessage('Loading Character Data...');
218225
const profileCharacters = await getProfileData();
219226
dispatch(updateProfileCharacters(profileCharacters));
220227

@@ -226,9 +233,12 @@ export const Dashboard: React.FC = () => {
226233
const sharedLoadoutLink = localStorage.getItem('lastShared');
227234

228235
if (sharedLoadoutLink !== '' && sharedLoadoutLink !== null) {
236+
setLoadingMessage('Finding Best Loadout From Share Link...');
229237
const sharedLoadoutDto = decodeLoadout(sharedLoadoutLink!);
230238
setSharedLoadoutDto(sharedLoadoutDto);
231239

240+
await equipSharedMods(sharedLoadoutDto, dispatch).catch(console.error);
241+
232242
targetCharacterIndex = profileCharacters.findIndex(
233243
(character: Character) => character.class === sharedLoadoutDto.characterClass
234244
);
@@ -254,6 +264,8 @@ export const Dashboard: React.FC = () => {
254264
})
255265
);
256266
}
267+
268+
setSharedLoadoutDto(undefined);
257269
} else {
258270
const keys = Object.keys(profileCharacters[targetCharacterIndex].subclasses);
259271

@@ -345,21 +357,24 @@ export const Dashboard: React.FC = () => {
345357
filtered = filterPermutations(permutations, selectedValues, fragmentStatModifications);
346358
}
347359

348-
setGeneratingPermutations(false);
349-
350360
return filtered;
351361
}, [permutations, selectedValues, sharedLoadoutDto, fragmentStatModifications]);
352362

353363
useEffect(() => {
354364
if (filteredPermutations && sharedLoadoutDto) {
355-
openLoadoutCustomization(filteredPermutations[0]);
365+
openLoadoutCustomization(filteredPermutations[0], false).catch(console.error);
356366
localStorage.removeItem('lastShared');
357367
}
358368
}, [filteredPermutations, sharedLoadoutDto]);
359369

360-
function openLoadoutCustomization(filteredPermutation: FilteredPermutation) {
361-
dispatch(resetLoadoutArmorMods());
370+
async function openLoadoutCustomization(
371+
filteredPermutation: FilteredPermutation,
372+
clearMods: boolean = true
373+
) {
374+
if (clearMods) dispatch(resetLoadoutArmorMods());
375+
362376
dispatch(updateLoadoutArmor(filteredPermutation.permutation));
377+
363378
const allStatMods = statMods.concat(artificeMods);
364379
let requiredMods: { mod: ManifestArmorStatMod; equipped: boolean }[] = [];
365380

@@ -392,6 +407,7 @@ export const Dashboard: React.FC = () => {
392407
}
393408

394409
dispatch(updateRequiredStatMods(requiredMods));
410+
395411
setShowLoadoutCustomization(true);
396412
}
397413

@@ -452,95 +468,102 @@ export const Dashboard: React.FC = () => {
452468
return (
453469
<>
454470
{showAbilitiesModification && customizingSubclass ? (
455-
<SubclassCustomizationWrapper
456-
onBackClick={() => setShowAbilitiesModification(false)}
457-
subclass={customizingSubclass}
458-
screenshot={customizingSubclass.subclass.screenshot}
459-
/>
460-
) : showLoadoutCustomization ? (
461-
<LoadoutCustomization
462-
onBackClick={() => {
463-
setShowLoadoutCustomization(false);
464-
setSharedLoadoutDto(undefined);
465-
}}
466-
screenshot={selectedSubclass?.subclass.screenshot || ''}
467-
subclass={selectedSubclass!}
468-
/>
469-
) : sharedLoadoutDto === undefined && selectedSubclass ? (
470-
<>
471-
<HeaderComponent
472-
emblemUrl={characters[selectedCharacterIndex]?.emblem?.secondarySpecial || ''}
473-
overlayUrl={characters[selectedCharacterIndex]?.emblem?.secondaryOverlay || ''}
474-
displayName={membership.bungieGlobalDisplayName}
475-
characters={characters}
476-
selectedCharacter={characters[selectedCharacterIndex]!}
477-
onCharacterClick={handleCharacterClick}
471+
<FadeIn duration={160}>
472+
<SubclassCustomizationWrapper
473+
onBackClick={() => setShowAbilitiesModification(false)}
474+
subclass={customizingSubclass}
475+
screenshot={customizingSubclass.subclass.screenshot}
478476
/>
479-
480-
<Grid
481-
container
482-
sx={{
483-
width: '100vw',
484-
height: '100vh',
485-
overflowY: 'auto',
486-
paddingTop: '120px',
477+
</FadeIn>
478+
) : showLoadoutCustomization && sharedLoadoutDto === undefined ? (
479+
<FadeIn duration={160}>
480+
<LoadoutCustomization
481+
onBackClick={() => {
482+
setShowLoadoutCustomization(false);
487483
}}
488-
>
489-
<DashboardContent item container md={12} justifyContent="space-evenly">
490-
<Grid item container direction="column" md={4} spacing={3} sx={{ marginTop: '2%' }}>
491-
<Grid item md={1}>
492-
<SingleDiamondButton
493-
subclasses={subclasses}
494-
selectedSubclass={selectedSubclass}
495-
onSubclassSelect={handleSubclassSelect}
496-
onSubclassRightClick={handleSubclassRightClick}
497-
/>
498-
</Grid>
499-
<Grid item md={1}>
500-
<NumberBoxes />
484+
screenshot={selectedSubclass?.subclass.screenshot || ''}
485+
subclass={selectedSubclass!}
486+
/>
487+
</FadeIn>
488+
) : sharedLoadoutDto === undefined && selectedSubclass ? (
489+
<>
490+
<FadeIn duration={200}>
491+
<HeaderComponent
492+
emblemUrl={characters[selectedCharacterIndex]?.emblem?.secondarySpecial || ''}
493+
overlayUrl={characters[selectedCharacterIndex]?.emblem?.secondaryOverlay || ''}
494+
displayName={membership.bungieGlobalDisplayName}
495+
characters={characters}
496+
selectedCharacter={characters[selectedCharacterIndex]!}
497+
onCharacterClick={handleCharacterClick}
498+
/>
499+
</FadeIn>
500+
501+
<FadeIn duration={300}>
502+
<Grid
503+
container
504+
sx={{
505+
width: '100vw',
506+
height: '100vh',
507+
overflowY: 'auto',
508+
paddingTop: '120px',
509+
}}
510+
>
511+
<DashboardContent item container md={12} justifyContent="space-evenly">
512+
<Grid item container direction="column" md={4} spacing={3} sx={{ marginTop: '2%' }}>
513+
<Grid item md={1}>
514+
<SingleDiamondButton
515+
subclasses={subclasses}
516+
selectedSubclass={selectedSubclass}
517+
onSubclassSelect={handleSubclassSelect}
518+
onSubclassRightClick={handleSubclassRightClick}
519+
/>
520+
</Grid>
521+
<Grid item md={1}>
522+
<NumberBoxes />
523+
</Grid>
501524
</Grid>
502-
</Grid>
503-
<Grid
504-
item
505-
container
506-
md={4}
507-
spacing={3}
508-
direction="column"
509-
justifyContent={'start'}
510-
alignItems={'center'}
511-
sx={{ marginTop: '1%' }}
512-
>
513-
<Grid item height="32vh">
514-
<ExoticSelector
515-
selectedCharacter={characters[selectedCharacterIndex]!}
516-
selectedExoticItemHash={selectedExotic.itemHash}
517-
/>
525+
<Grid
526+
item
527+
container
528+
md={4}
529+
spacing={3}
530+
direction="column"
531+
justifyContent={'start'}
532+
alignItems={'center'}
533+
sx={{ marginTop: '1%' }}
534+
>
535+
<Grid item height="32vh">
536+
<ExoticSelector
537+
selectedCharacter={characters[selectedCharacterIndex]!}
538+
selectedExoticItemHash={selectedExotic.itemHash}
539+
/>
540+
</Grid>
541+
<Grid item alignSelf="flex-start">
542+
<StatModifications />
543+
</Grid>
518544
</Grid>
519-
<Grid item alignSelf="flex-start">
520-
<StatModifications />
545+
<Grid item md={4} sx={{ marginTop: '1%' }}>
546+
{filteredPermutations ? (
547+
<PermutationsList
548+
permutations={filteredPermutations}
549+
onPermutationClick={openLoadoutCustomization}
550+
/>
551+
) : (
552+
false
553+
)}
521554
</Grid>
522-
</Grid>
523-
<Grid item md={4} sx={{ marginTop: '1%' }}>
524-
{filteredPermutations ? (
525-
<PermutationsList
526-
permutations={filteredPermutations}
527-
onPermutationClick={openLoadoutCustomization}
528-
/>
529-
) : (
530-
false
531-
)}
532-
</Grid>
533-
<Footer
534-
emblemUrl={characters[selectedCharacterIndex]?.emblem?.secondarySpecial || ''}
535-
/>
536-
</DashboardContent>
537-
</Grid>
555+
<Footer
556+
emblemUrl={characters[selectedCharacterIndex]?.emblem?.secondarySpecial || ''}
557+
/>
558+
</DashboardContent>
559+
</Grid>
560+
</FadeIn>
538561
</>
539562
) : (
540-
<LoadingScreen container>
563+
<LoadingScreen>
541564
<CircularProgress size={60} thickness={4} />
542565
<Typography variant="h5" sx={{ mt: 2, color: 'white' }}>
543-
Loading Dashboard...
566+
{loadingMessage}
544567
</Typography>
545568
</LoadingScreen>
546569
)}

src/components/HoverCard.tsx

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
HoverCardTitle,
2727
HoverCardIcon,
2828
} from '../styled';
29+
import FadeIn from './FadeIn';
2930

3031
type HoverCardItem =
3132
| ManifestSubclass
@@ -210,17 +211,22 @@ const HoverCard: React.FC<HoverCardProps> = ({ item, children }) => {
210211
>
211212
{children}
212213
{hoverData && (
213-
<HoverCardContainer>
214-
{hoverData.type === 'armorMod' || hoverData.type === 'armorStatMod' ? (
215-
renderDescription()
216-
) : (
217-
<>
218-
<HoverCardTitle variant="h6">{hoverData.name}</HoverCardTitle>
219-
<HoverCardIcon src={hoverData.secondaryIcon || hoverData.icon} alt={hoverData.name} />
220-
{renderDescription()}
221-
</>
222-
)}
223-
</HoverCardContainer>
214+
<FadeIn duration={160}>
215+
<HoverCardContainer>
216+
{hoverData.type === 'armorMod' || hoverData.type === 'armorStatMod' ? (
217+
renderDescription()
218+
) : (
219+
<>
220+
<HoverCardTitle variant="h6">{hoverData.name}</HoverCardTitle>
221+
<HoverCardIcon
222+
src={hoverData.secondaryIcon || hoverData.icon}
223+
alt={hoverData.name}
224+
/>
225+
{renderDescription()}
226+
</>
227+
)}
228+
</HoverCardContainer>
229+
</FadeIn>
224230
)}
225231
</div>
226232
);

src/components/LoadoutCustomization.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import ShareLoadout from '../features/loadouts/components/ShareLoadout';
77
import { SubclassConfig } from '../types/d2l-types';
88
import { BackButton } from './BackButton';
99
import TotalStatsDisplay from './TotalStatsDisplay';
10+
import FadeIn from './FadeIn';
1011

1112
interface LoadoutCustomizationProps {
1213
onBackClick: () => void;
@@ -82,7 +83,9 @@ const LoadoutCustomization: React.FC<LoadoutCustomizationProps> = ({
8283
</Container>
8384
</Grid>
8485
<Grid item md={1}>
85-
<AbilitiesModification subclass={subclass} />
86+
<FadeIn duration={400}>
87+
<AbilitiesModification subclass={subclass} />
88+
</FadeIn>
8689
</Grid>
8790
<Grid
8891
item

src/features/loadouts/components/EquipLoadout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { EquipResult } from '../types';
1919
import { STATUS } from '../constants';
2020
import React from 'react';
2121
import LoadingBorder from './LoadingBorder';
22-
import FadeIn from './FadeIn';
22+
import FadeIn from '../../../components/FadeIn';
2323
import { equipLoadout } from '../util/loadout-utils';
2424
import { TransitionProps } from '@mui/material/transitions';
2525
import SaveLoadout from './SaveLoadout';

0 commit comments

Comments
 (0)