nitro-v36-with-renderer-v36
/
src /
components /
room /
widgets /
furniture /
context-menu /
PurchasableClothingConfirmView.tsx
PurchasableClothingConfirmView.tsx 4.3 Ko
Télécharger le fichier
import {
AvatarFigurePartType,
GetAvatarRenderManager,
GetSessionDataManager,
RedeemItemClothingComposer,
RoomObjectCategory,
UserFigureComposer
} from '@octane/renderer';
import { FC, useEffect, useState } from 'react';
import { BuildPurchasableClothingFigure, GetFurnitureDataForRoomObject, LocalizeText, SendMessageComposer } from '../../../../../api';
import { Button, Column, LayoutAvatarImageView, OctaneCardContentView, OctaneCardHeaderView, OctaneCardView, Text } from '../../../../../common';
import { NativeTextTree } from '../../../../../common/native-text/NativeTextTree';
import { useRoom } from '../../../../../hooks';
interface PurchasableClothingConfirmViewProps {
objectId: number;
onClose: () => void;
}
const MODE_DEFAULT: number = -1;
const MODE_PURCHASABLE_CLOTHING: number = 0;
export const PurchasableClothingConfirmView: FC<PurchasableClothingConfirmViewProps> = (props) => {
const { objectId = -1, onClose = null } = props;
const [mode, setMode] = useState(MODE_DEFAULT);
const [gender, setGender] = useState<string>(AvatarFigurePartType.MALE);
const [newFigure, setNewFigure] = useState<string>(null);
const { roomSession = null } = useRoom();
const useProduct = () => {
SendMessageComposer(new RedeemItemClothingComposer(objectId));
SendMessageComposer(new UserFigureComposer(gender, newFigure));
onClose();
};
useEffect(() => {
let mode = MODE_DEFAULT;
const figure = GetSessionDataManager().figure;
const gender = GetSessionDataManager().gender;
const validSets: number[] = [];
if (roomSession && objectId >= 0) {
const furniData = GetFurnitureDataForRoomObject(roomSession.roomId, objectId, RoomObjectCategory.FLOOR);
if (furniData && furniData.customParams && furniData.customParams.length) {
const setIds = furniData.customParams
.split(',')
.map((part) => parseInt(part))
.filter((id) => !isNaN(id));
for (const setId of setIds) {
if (GetAvatarRenderManager().isValidFigureSetForGender(setId, gender)) validSets.push(setId);
}
if (validSets.length) mode = MODE_PURCHASABLE_CLOTHING;
}
}
if (mode === MODE_DEFAULT) {
onClose();
return;
}
setGender(gender);
setNewFigure(BuildPurchasableClothingFigure(figure, validSets));
// if owns clothing, change to it
setMode(mode);
}, [roomSession, objectId, onClose]);
if (mode === MODE_DEFAULT) return null;
return (
<NativeTextTree>
<OctaneCardView className="octane-use-product-confirmation">
<OctaneCardHeaderView headerText={LocalizeText('useproduct.widget.title.bind_clothing')} onCloseClick={onClose} />
<OctaneCardContentView center>
<div className="flex overflow-hidden gap-2">
<div className="flex flex-col">
<div className="mannequin-preview">
<LayoutAvatarImageView direction={2} figure={newFigure} />
</div>
</div>
<div className="flex flex-col justify-between overflow-auto">
<Column gap={2}>
<Text>{LocalizeText('useproduct.widget.text.bind_clothing')}</Text>
<Text>{LocalizeText('useproduct.widget.info.bind_clothing')}</Text>
</Column>
<div className="flex items-center justify-between">
<Button variant="danger" onClick={onClose}>
{LocalizeText('useproduct.widget.cancel')}
</Button>
<Button variant="success" onClick={useProduct}>
{LocalizeText('useproduct.widget.bind_clothing')}
</Button>
</div>
</div>
</div>
</OctaneCardContentView>
</OctaneCardView>
</NativeTextTree>
);
};
