diff --git a/src/components/navigator/NavigatorView.scss b/src/components/navigator/NavigatorView.scss index a438267d..0e4c348b 100644 --- a/src/components/navigator/NavigatorView.scss +++ b/src/components/navigator/NavigatorView.scss @@ -1,24 +1,63 @@ .nitro-navigator { width: $navigator-width; height: $navigator-height; -} -.nitro-navigator-doorbell { - width: 250px; + .navigator-grid { - .content-area { - min-height: 143px; - height: 143px; + .navigator-item { + + .badge { + width: 35px; + min-width: 35px; + } + } + + &:not(.two-columns) { + + .navigator-item { + + &:nth-child(odd) { + background-color: $grid-active-bg-color; + } + } + } + + &.two-columns { + + .navigator-item { + + &:nth-child(4n-2), + &:nth-child(4n-3) { + background: $grid-active-bg-color; + } + } + } } } +.nitro-navigator-doorbell, .nitro-navigator-password { width: 250px; - - .content-area { - min-height: 218px; - height: 218px; - } } -@import './views/NavigatorViews'; +.nitro-room-info { + width: $room-info-width; + max-height: 300px; +} + +.nitro-room-link { + width: 400px; +} + +.nitro-room-settings { + width: 400px; + + .list-container { + min-height: 100px; + max-height: 100px; + + .list-item { + background-color: $grid-active-bg-color; + } + } +} diff --git a/src/components/navigator/NavigatorView.tsx b/src/components/navigator/NavigatorView.tsx index 6f2ad5d3..e8c47028 100644 --- a/src/components/navigator/NavigatorView.tsx +++ b/src/components/navigator/NavigatorView.tsx @@ -1,6 +1,8 @@ +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { ConvertGlobalRoomIdMessageComposer, HabboWebTools, ILinkEventTracker, LegacyExternalInterface, NavigatorInitComposer, NavigatorSearchComposer, RoomDataParser, RoomSessionEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useReducer, useState } from 'react'; import { AddEventLinkTracker, GoToDesktop, LocalizeText, RemoveLinkEventTracker, TryVisitRoom } from '../../api'; +import { Column } from '../../common/Column'; import { NavigatorEvent, UpdateDoorStateEvent } from '../../events'; import { UseMountEffect } from '../../hooks'; import { useRoomSessionManagerEvent } from '../../hooks/events/nitro/session/room-session-manager-event'; @@ -246,15 +248,17 @@ export const NavigatorView: FC<{}> = props => ); }) } - setCreatorOpen(true) }> - + setCreatorOpen(true) }> + { !isCreatorOpen && <> - { (navigatorState.searchResult && navigatorState.searchResult.results.map((result, index) => )) } + + { (navigatorState.searchResult && navigatorState.searchResult.results.map((result, index) => )) } + } { isCreatorOpen && } diff --git a/src/components/navigator/views/search-result/NavigatorSearchResultView.types.ts b/src/components/navigator/common/NavigatorSearchResultViewDisplayMode.ts similarity index 58% rename from src/components/navigator/views/search-result/NavigatorSearchResultView.types.ts rename to src/components/navigator/common/NavigatorSearchResultViewDisplayMode.ts index de83955e..27069cfd 100644 --- a/src/components/navigator/views/search-result/NavigatorSearchResultView.types.ts +++ b/src/components/navigator/common/NavigatorSearchResultViewDisplayMode.ts @@ -1,10 +1,3 @@ -import { NavigatorSearchResultList } from '@nitrots/nitro-renderer'; - -export interface NavigatorSearchResultViewProps -{ - searchResult: NavigatorSearchResultList; -} - export class NavigatorSearchResultViewDisplayMode { public static readonly LIST: number = 0; diff --git a/src/components/navigator/views/creator/NavigatorRoomCreatorView.types.ts b/src/components/navigator/common/RoomModels.ts similarity index 94% rename from src/components/navigator/views/creator/NavigatorRoomCreatorView.types.ts rename to src/components/navigator/common/RoomModels.ts index 64d4e1b3..c2b40066 100644 --- a/src/components/navigator/views/creator/NavigatorRoomCreatorView.types.ts +++ b/src/components/navigator/common/RoomModels.ts @@ -1,11 +1,13 @@ import { HabboClubLevelEnum } from '@nitrots/nitro-renderer'; -export interface NavigatorRoomCreatorViewProps +export interface IRoomModel { - + clubLevel: number; + tileSize: number; + name: string; } -export const NAVIGATOR_ROOM_MODELS: { clubLevel: number, tileSize: number, name: string }[] = [ +export const RoomModels: IRoomModel[] = [ { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 104, name: 'a' }, { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 94, name: 'b' }, { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 36, name: 'c' }, diff --git a/src/components/navigator/views/NavigatorViews.scss b/src/components/navigator/views/NavigatorViews.scss deleted file mode 100644 index 631f2cea..00000000 --- a/src/components/navigator/views/NavigatorViews.scss +++ /dev/null @@ -1,6 +0,0 @@ -@import './creator/NavigatorRoomCreatorView'; -@import './search-result/NavigatorSearchResultView'; -@import './search-result-item/NavigatorSearchResultItemView'; -@import './room-info/NavigatorRoomInfoView'; -@import './room-link/NavigatorRoomLinkView'; -@import './room-settings/NavigatorRoomSettingsView'; diff --git a/src/components/navigator/views/creator/NavigatorRoomCreatorView.scss b/src/components/navigator/views/creator/NavigatorRoomCreatorView.scss deleted file mode 100644 index ea0addeb..00000000 --- a/src/components/navigator/views/creator/NavigatorRoomCreatorView.scss +++ /dev/null @@ -1,26 +0,0 @@ -.room-model-list { - display: flex; - overflow-x: auto; - scroll-snap-type: x mandatory; - scroll-behavior: smooth; - -webkit-overflow-scrolling: touch; - - > div { - border-color: $grid-border-color !important; - background-color: $grid-bg-color; - - &.active { - border-color: $grid-active-border-color !important; - background-color: $grid-active-bg-color; - } - - &.disabled { - cursor: not-allowed; - - img { - opacity: .5; - filter: grayscale(1); - } - } - } -} diff --git a/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx b/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx index d747180d..a71fca18 100644 --- a/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx +++ b/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx @@ -1,25 +1,47 @@ /* eslint-disable no-template-curly-in-string */ import { HabboClubLevelEnum, RoomCreateComposer } from '@nitrots/nitro-renderer'; -import classNames from 'classnames'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import { GetConfiguration, GetSessionDataManager, LocalizeText } from '../../../../api'; +import { Column } from '../../../../common/Column'; +import { Flex } from '../../../../common/Flex'; +import { Grid } from '../../../../common/Grid'; +import { LayoutGridItem } from '../../../../common/layout/LayoutGridItem'; +import { Text } from '../../../../common/Text'; +import { BatchUpdates } from '../../../../hooks'; import { SendMessageHook } from '../../../../hooks/messages'; import { CurrencyIcon } from '../../../../views/shared/currency-icon/CurrencyIcon'; +import { IRoomModel, RoomModels } from '../../common/RoomModels'; import { useNavigatorContext } from '../../context/NavigatorContext'; -import { NavigatorRoomCreatorViewProps, NAVIGATOR_ROOM_MODELS } from './NavigatorRoomCreatorView.types'; -export const NavigatorRoomCreatorView: FC = props => +export const NavigatorRoomCreatorView: FC<{}> = props => { + const [ maxVisitorsList, setMaxVisitorsList ] = useState(null); + const [ name, setName ] = useState(null); + const [ description, setDescription ] = useState(null); + const [ category, setCategory ] = useState(null); + const [ visitorsCount, setVisitorsCount ] = useState(null); + const [ tradesSetting, setTradesSetting ] = useState(0); + const [ selectedModelName, setSelectedModelName ] = useState(RoomModels[0].name); const { navigatorState = null } = useNavigatorContext(); const { categories = null } = navigatorState; - const [ maxVisitorsList, setMaxVisitorsList ] = useState(null); - const [ name, setName ] = useState(null); - const [ description, setDescription ] = useState(null); - const [ category, setCategory ] = useState(null); - const [ visitorsCount, setVisitorsCount ] = useState(null); - const [ tradesSetting, setTradesSetting ] = useState(0); - const [ selectedModelName, setSelectedModelName ] = useState(NAVIGATOR_ROOM_MODELS[0].name); + const getRoomModelImage = (name: string) => GetConfiguration('images.url') + `/navigator/models/model_${ name }.png`; + + const selectModel = (model: IRoomModel) => + { + if(!model) return; + + if(model.clubLevel > GetSessionDataManager().clubLevel) return; + + setSelectedModelName(name); + } + + const createRoom = () => + { + if(!name || name.length < 3) return; + + SendMessageHook(new RoomCreateComposer(name, description, 'model_' + selectedModelName, Number(category), Number(visitorsCount), tradesSetting)); + } useEffect(() => { @@ -27,13 +49,13 @@ export const NavigatorRoomCreatorView: FC = props { const list = []; - for(let i = 10; i <= 100; i = i + 10) - { - list.push(i); - } + for(let i = 10; i <= 100; i = i + 10) list.push(i); - setMaxVisitorsList(list); - setVisitorsCount(list[0]); + BatchUpdates(() => + { + setMaxVisitorsList(list); + setVisitorsCount(list[0]); + }); } }, [ maxVisitorsList ]); @@ -41,89 +63,60 @@ export const NavigatorRoomCreatorView: FC = props { if(categories) setCategory(categories[0].id); }, [ categories ]); - - const getRoomModelImage = useCallback((name: string) => - { - return GetConfiguration('images.url') + `/navigator/models/model_${ name }.png`; - }, []); - - const selectModel = useCallback((name: string) => - { - const model = NAVIGATOR_ROOM_MODELS.find(model => model.name === name); - - if(!model) return; - - if(model.clubLevel > GetSessionDataManager().clubLevel) return; - - setSelectedModelName(name); - }, [ setSelectedModelName ]); - - const createRoom = useCallback(() => - { - if(!name || name.length < 3) return; - - SendMessageHook(new RoomCreateComposer(name, description, 'model_' + selectedModelName, Number(category), Number(visitorsCount), tradesSetting)); - }, [ name, description, category, visitorsCount, tradesSetting, selectedModelName ]); return ( -
-
-
-
- - setName(e.target.value) } /> -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- + + + + { LocalizeText('navigator.createroom.roomnameinfo') } + setName(e.target.value) } /> + + + { LocalizeText('navigator.category') } + + + + { LocalizeText('navigator.maxvisitors') } + + + + { LocalizeText('navigator.tradesettings') } + + + + + { LocalizeText('navigator.createroom.roomdescinfo') } setDescription(e.target.value) } /> -
-
+ + { - NAVIGATOR_ROOM_MODELS.map(model => + RoomModels.map(model => { - return (
selectModel(model.name) } className={ 'h-100 cursor-pointer d-flex flex-column justify-content-center align-items-center p-1 me-2 rounded border border-2' + classNames({ ' active': selectedModelName === model.name, ' disabled': GetSessionDataManager().clubLevel < model.clubLevel }) }> - -
{ model.tileSize } { LocalizeText('navigator.createroom.tilesize') }
- { model.clubLevel > HabboClubLevelEnum.NO_CLUB && } -
); + return ( selectModel(model) } itemActive={ (selectedModelName === model.name) } overflow="unset" gap={ 0 } className="p-1" disabled={ (GetSessionDataManager().clubLevel < model.clubLevel) }> + + + + { model.tileSize } { LocalizeText('navigator.createroom.tilesize') } + { model.clubLevel > HabboClubLevelEnum.NO_CLUB && } + ); }) } -
+ -
+ ); } diff --git a/src/components/navigator/views/room-doorbell/NavigatorRoomDoorbellView.tsx b/src/components/navigator/views/room-doorbell/NavigatorRoomDoorbellView.tsx index 90b33e02..b4a9e0e4 100644 --- a/src/components/navigator/views/room-doorbell/NavigatorRoomDoorbellView.tsx +++ b/src/components/navigator/views/room-doorbell/NavigatorRoomDoorbellView.tsx @@ -1,41 +1,60 @@ -import { FC, useCallback } from 'react'; +import { RoomDataParser } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; import { CreateRoomSession, GoToDesktop, LocalizeText } from '../../../../api'; +import { Button } from '../../../../common/Button'; +import { Column } from '../../../../common/Column'; +import { Text } from '../../../../common/Text'; import { UpdateDoorStateEvent } from '../../../../events'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; -import { NavigatorRoomDoorbellViewProps } from './NavigatorRoomDoorbellView.types'; + +export interface NavigatorRoomDoorbellViewProps +{ + roomData: RoomDataParser; + state: string; + onClose: (state: string) => void; +} export const NavigatorRoomDoorbellView: FC = props => { const { roomData = null, state = null, onClose = null } = props; - const close = useCallback(() => + const close = () => { if(state === UpdateDoorStateEvent.STATE_WAITING) GoToDesktop(); onClose(null); - }, [ state, onClose ]); + } - const ring = useCallback(() => + const ring = () => { if(!roomData) return; CreateRoomSession(roomData.roomId); onClose(UpdateDoorStateEvent.STATE_PENDING_SERVER); - }, [ roomData, onClose ]); + } return ( - - { roomData && { roomData.roomName } } - { (state === UpdateDoorStateEvent.START_DOORBELL) && { LocalizeText('navigator.doorbell.info') } } - { (state === UpdateDoorStateEvent.STATE_WAITING) && { LocalizeText('navigator.doorbell.waiting') } } - { (state === UpdateDoorStateEvent.STATE_NO_ANSWER) && { LocalizeText('navigator.doorbell.no.answer') } } -
- { (state === UpdateDoorStateEvent.START_DOORBELL) && } - -
+ + + { roomData && + { roomData.roomName } } + { (state === UpdateDoorStateEvent.START_DOORBELL) && + { LocalizeText('navigator.doorbell.info') } } + { (state === UpdateDoorStateEvent.STATE_WAITING) && + { LocalizeText('navigator.doorbell.waiting') } } + { (state === UpdateDoorStateEvent.STATE_NO_ANSWER) && + { LocalizeText('navigator.doorbell.no.answer') } } + + { (state === UpdateDoorStateEvent.START_DOORBELL) && + } +
); diff --git a/src/components/navigator/views/room-doorbell/NavigatorRoomDoorbellView.types.ts b/src/components/navigator/views/room-doorbell/NavigatorRoomDoorbellView.types.ts deleted file mode 100644 index f471bd21..00000000 --- a/src/components/navigator/views/room-doorbell/NavigatorRoomDoorbellView.types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { RoomDataParser } from '@nitrots/nitro-renderer'; - -export interface NavigatorRoomDoorbellViewProps -{ - roomData: RoomDataParser; - state: string; - onClose: (state: string) => void; -} diff --git a/src/components/navigator/views/room-info/NavigatorRoomInfoView.scss b/src/components/navigator/views/room-info/NavigatorRoomInfoView.scss deleted file mode 100644 index 7f10ad0c..00000000 --- a/src/components/navigator/views/room-info/NavigatorRoomInfoView.scss +++ /dev/null @@ -1,23 +0,0 @@ -.nitro-room-info { - width: $room-info-width; - max-height: 300px; - - - .gray { - filter: grayscale(1); - opacity: .5; - } - - .room-thumbnail { - position: relative; - width: 110px; - height: 110px; - background: url("../../../../assets/images/navigator/thumbnail_placeholder.png") no-repeat center; - background-color: rgba($black, .125); - } - - .group-badge { - width: 50px; - height: 50px; - } -} diff --git a/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx b/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx index 8cbc4f1a..9c975a79 100644 --- a/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx +++ b/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx @@ -133,11 +133,9 @@ export const NavigatorRoomInfoView: FC = props => { roomInfoData.enteredGuestRoom && <> - - - { hasPermission('settings') && processAction('open_room_thumbnail_camera') } /> } - - + + { hasPermission('settings') && processAction('open_room_thumbnail_camera') } /> } + diff --git a/src/components/navigator/views/room-link/NavigatorRoomLinkView.scss b/src/components/navigator/views/room-link/NavigatorRoomLinkView.scss deleted file mode 100644 index 47a33189..00000000 --- a/src/components/navigator/views/room-link/NavigatorRoomLinkView.scss +++ /dev/null @@ -1,3 +0,0 @@ -.nitro-room-link { - width: 400px; -} diff --git a/src/components/navigator/views/room-password/NavigatorRoomPasswordView.tsx b/src/components/navigator/views/room-password/NavigatorRoomPasswordView.tsx index bad4c45e..edc060b8 100644 --- a/src/components/navigator/views/room-password/NavigatorRoomPasswordView.tsx +++ b/src/components/navigator/views/room-password/NavigatorRoomPasswordView.tsx @@ -1,18 +1,28 @@ +import { RoomDataParser } from '@nitrots/nitro-renderer'; import { FC, useCallback, useState } from 'react'; import { CreateRoomSession, LocalizeText } from '../../../../api'; +import { Button } from '../../../../common/Button'; +import { Column } from '../../../../common/Column'; +import { Text } from '../../../../common/Text'; import { UpdateDoorStateEvent } from '../../../../events'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; -import { NavigatorRoomPasswordViewProps } from './NavigatorRoomPasswordView.types'; + +export interface NavigatorRoomPasswordViewProps +{ + roomData: RoomDataParser; + state: string; + onClose: (state: string) => void; +} export const NavigatorRoomPasswordView: FC = props => { const { roomData = null, state = null, onClose = null } = props; const [ password, setPassword ] = useState(''); - const close = useCallback(() => + const close = () => { onClose(null); - }, [ onClose ]); + } const tryEntering = useCallback(() => { @@ -26,18 +36,24 @@ export const NavigatorRoomPasswordView: FC = pro return ( - - { roomData && { roomData.roomName } } - { (state === UpdateDoorStateEvent.START_PASSWORD) && { LocalizeText('navigator.password.info') } } - { (state === UpdateDoorStateEvent.STATE_WRONG_PASSWORD) && { LocalizeText('navigator.password.retryinfo') } } -
- + + + { roomData && + { roomData.roomName } } + { (state === UpdateDoorStateEvent.START_PASSWORD) && + { LocalizeText('navigator.password.info') } } + { (state === UpdateDoorStateEvent.STATE_WRONG_PASSWORD) && + { LocalizeText('navigator.password.retryinfo') } } + + + { LocalizeText('navigator.password.enter') } setPassword(event.target.value) } /> -
-
- - -
+
+ + ); diff --git a/src/components/navigator/views/room-password/NavigatorRoomPasswordView.types.ts b/src/components/navigator/views/room-password/NavigatorRoomPasswordView.types.ts deleted file mode 100644 index 4d1ea7d2..00000000 --- a/src/components/navigator/views/room-password/NavigatorRoomPasswordView.types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { RoomDataParser } from '@nitrots/nitro-renderer'; - -export interface NavigatorRoomPasswordViewProps -{ - roomData: RoomDataParser; - state: string; - onClose: (state: string) => void; -} diff --git a/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.scss b/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.scss deleted file mode 100644 index a136464b..00000000 --- a/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.scss +++ /dev/null @@ -1,49 +0,0 @@ -.nitro-room-settings { - width: 400px; - - .user-rights-container { - - .row { - - .col:nth-child(even) { - //background: $light !important; - } - } - } - - .list-container { - max-height: 100px; - min-height: 100px; - overflow-y: scroll; - background-color: white; - border-radius: 5px; - text-align: center; - - &.rights { - max-height: 80%; - min-height: 80%; - margin-bottom: 5px; - } - - &.friends-rights { - max-height: 90%; - min-height: 90%; - } - - .rights-button - { - float: right; - margin: 2px; - font-size: 7px; - padding: 3px; - min-height: unset; - } - - .list-item { - &.selected { - background-color: cadetblue; - } - } - } - -} diff --git a/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.tsx b/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.tsx index aeac1985..f151cdbc 100644 --- a/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.tsx +++ b/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.tsx @@ -1,17 +1,14 @@ import { RoomBannedUsersComposer, RoomBannedUsersEvent, RoomSettingsEvent, RoomUsersWithRightsComposer, RoomUsersWithRightsEvent, SaveRoomSettingsComposer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useCallback, useState } from 'react'; import { LocalizeText } from '../../../../api'; -import { FriendsEvent } from '../../../../events'; -import { FriendListContentEvent } from '../../../../events/friends/FriendListContentEvent'; -import { dispatchUiEvent, useUiEvent } from '../../../../hooks'; import { CreateMessageHook, SendMessageHook } from '../../../../hooks/messages'; import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../../../layout'; import RoomSettingsData from '../../common/RoomSettingsData'; -import { NavigatorRoomSettingsAccessTabView } from './views/tab-access/NavigatorRoomSettingsAccessTabView'; -import { NavigatorRoomSettingsBasicTabView } from './views/tab-basic/NavigatorRoomSettingsBasicTabView'; -import { NavigatorRoomSettingsModTabView } from './views/tab-mod/NavigatorRoomSettingsModTabView'; -import { NavigatorRoomSettingsRightsTabView } from './views/tab-rights/NavigatorRoomSettingsRightsTabView'; -import { NavigatorRoomSettingsVipChatTabView } from './views/tab-vipchat/NavigatorRoomSettingsVipChatTabView'; +import { NavigatorRoomSettingsAccessTabView } from './views/NavigatorRoomSettingsAccessTabView'; +import { NavigatorRoomSettingsBasicTabView } from './views/NavigatorRoomSettingsBasicTabView'; +import { NavigatorRoomSettingsModTabView } from './views/NavigatorRoomSettingsModTabView'; +import { NavigatorRoomSettingsRightsTabView } from './views/NavigatorRoomSettingsRightsTabView'; +import { NavigatorRoomSettingsVipChatTabView } from './views/NavigatorRoomSettingsVipChatTabView'; const TABS: string[] = [ 'navigator.roomsettings.tab.1', @@ -25,7 +22,6 @@ export const NavigatorRoomSettingsView: FC<{}> = props => { const [ roomSettingsData, setRoomSettingsData ] = useState(null); const [ currentTab, setCurrentTab ] = useState(TABS[0]); - const [ friends, setFriends ] = useState>(new Map()); const updateSettings = useCallback((roomSettings: RoomSettingsData) => { @@ -73,24 +69,11 @@ export const NavigatorRoomSettingsView: FC<{}> = props => setRoomSettingsData(data); }, [roomSettingsData]); - const onFriendsListContentEvent = useCallback((event: FriendListContentEvent) => - { - if(!roomSettingsData || !event.friends) return; - - setFriends(event.friends); - }, [roomSettingsData]); - CreateMessageHook(RoomSettingsEvent, onRoomSettingsEvent); CreateMessageHook(RoomUsersWithRightsEvent, onRoomUsersWithRightsEvent); CreateMessageHook(RoomBannedUsersEvent, onRoomBannedUsersEvent); - useUiEvent(FriendListContentEvent.FRIEND_LIST_CONTENT, onFriendsListContentEvent); - useEffect(() => - { - if(roomSettingsData) dispatchUiEvent(new FriendsEvent(FriendsEvent.REQUEST_FRIEND_LIST)); - }, [roomSettingsData]) - - const save = useCallback((data: RoomSettingsData) => + const saveSettings = useCallback((data: RoomSettingsData) => { SendMessageHook( new SaveRoomSettingsComposer( @@ -132,6 +115,109 @@ export const NavigatorRoomSettingsView: FC<{}> = props => } }, [ setRoomSettingsData ]); + const handleChange = useCallback((field: string, value: string | number | boolean) => + { + const roomSettings = Object.assign({}, roomSettingsData); + + let save = true; + + switch(field) + { + case 'name': + roomSettings.roomName = String(value); + save = false; + break; + case 'description': + roomSettings.roomDescription = String(value); + save = false; + break; + case 'category': + roomSettings.categoryId = Number(value); + break; + case 'max_visitors': + roomSettings.userCount = Number(value); + break; + case 'trade_state': + roomSettings.tradeState = Number(value); + break; + case 'allow_walkthrough': + roomSettings.allowWalkthrough = Boolean(value); + break; + case 'allow_pets': + roomSettings.allowPets = Boolean(value); + break; + case 'allow_pets_eat': + roomSettings.allowPetsEat = Boolean(value); + break; + case 'hide_walls': + roomSettings.hideWalls = Boolean(value); + break; + case 'wall_thickness': + roomSettings.wallThickness = Number(value); + break; + case 'floor_thickness': + roomSettings.floorThickness = Number(value); + break; + case 'lock_state': + roomSettings.lockState = Number(value); + + if(Number(value) === 3) save = false; + break; + case 'password': + roomSettings.password = String(value); + save = false; + break; + case 'confirm_password': + roomSettings.confirmPassword = String(value); + save = false; + break; + case 'moderation_mute': + roomSettings.muteState = Number(value); + break; + case 'moderation_kick': + roomSettings.kickState = Number(value); + break; + case 'moderation_ban': + roomSettings.banState = Number(value); + break; + case 'bubble_mode': + roomSettings.chatBubbleMode = Number(value); + break; + case 'chat_weight': + roomSettings.chatBubbleWeight = Number(value); + break; + case 'bubble_speed': + roomSettings.chatBubbleSpeed = Number(value); + break; + case 'flood_protection': + roomSettings.chatFloodProtection = Number(value); + break; + case 'chat_distance': + roomSettings.chatDistance = Number(value); + save = false; + break; + case 'unban_user': + roomSettings.bannedUsers.delete(Number(value)); + save = false; + break; + case 'remove_rights_user': + roomSettings.usersWithRights.delete(Number(value)); + save = false; + break; + case 'remove_all_rights': + roomSettings.usersWithRights.clear(); + save = false; + break; + case 'save': + save = true; + break; + } + + setRoomSettingsData(roomSettings); + + if(save) saveSettings(roomSettings); + }, [ roomSettingsData, saveSettings ]); + if(!roomSettingsData) return null; return ( @@ -143,12 +229,17 @@ export const NavigatorRoomSettingsView: FC<{}> = props => return setCurrentTab(tab) }>{ LocalizeText(tab) } }) } - - { currentTab === TABS[0] && } - { currentTab === TABS[1] && } - { currentTab === TABS[2] && } - { currentTab === TABS[3] && } - { currentTab === TABS[4] && } + + { currentTab === TABS[0] && + } + { currentTab === TABS[1] && + } + { currentTab === TABS[2] && + } + { currentTab === TABS[3] && + } + { currentTab === TABS[4] && + } ); diff --git a/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.types.ts b/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.types.ts deleted file mode 100644 index dd32f7e9..00000000 --- a/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import RoomSettingsData from '../../common/RoomSettingsData'; - -export class NavigatorRoomSettingsTabViewProps -{ - roomSettingsData: RoomSettingsData; - setRoomSettingsData: (roomSettings: RoomSettingsData) => void; - onSave: (data: RoomSettingsData) => void; -} diff --git a/src/components/navigator/views/room-settings/views/NavigatorRoomSettingsAccessTabView.tsx b/src/components/navigator/views/room-settings/views/NavigatorRoomSettingsAccessTabView.tsx new file mode 100644 index 00000000..30a6c1ed --- /dev/null +++ b/src/components/navigator/views/room-settings/views/NavigatorRoomSettingsAccessTabView.tsx @@ -0,0 +1,73 @@ +import { FC, useCallback } from 'react'; +import { LocalizeText } from '../../../../../api'; +import { Column } from '../../../../../common/Column'; +import { Flex } from '../../../../../common/Flex'; +import { Text } from '../../../../../common/Text'; +import { NavigatorRoomSettingsTabViewProps } from './NavigatorRoomSettingsTabViewProps.types'; + +export const NavigatorRoomSettingsAccessTabView: FC = props => +{ + const { roomSettingsData = null, handleChange = null } = props; + + const isPasswordValid = useCallback(() => + { + return (roomSettingsData.password && (roomSettingsData.password.length > 0) && (roomSettingsData.password === roomSettingsData.confirmPassword)); + }, [ roomSettingsData ]); + + const trySave = useCallback(() => + { + if(isPasswordValid()) handleChange('save', null); + }, [ isPasswordValid, handleChange ]); + + return ( + <> + + { LocalizeText('navigator.roomsettings.roomaccess.caption') } + { LocalizeText('navigator.roomsettings.roomaccess.info') } + + + + { LocalizeText('navigator.roomsettings.doormode') } + + handleChange('lock_state', 0) } /> + { LocalizeText('navigator.roomsettings.doormode.open') } + + + handleChange('lock_state', 1) } /> + { LocalizeText('navigator.roomsettings.doormode.doorbell') } + + + handleChange('lock_state', 2) } /> + { LocalizeText('navigator.roomsettings.doormode.invisible') } + + + handleChange('lock_state', 3) } /> + { (roomSettingsData.lockState !== 3) && + { LocalizeText('navigator.roomsettings.doormode.password') } } + { (roomSettingsData.lockState === 3) && + + { LocalizeText('navigator.roomsettings.doormode.password') } + handleChange('password', e.target.value) } onBlur={ trySave } placeholder={ LocalizeText('navigator.roomsettings.password') } /> + handleChange('confirm_password', e.target.value) } onBlur={ trySave } placeholder={ LocalizeText('navigator.roomsettings.passwordconfirm') } /> + { !isPasswordValid() && + + { LocalizeText('navigator.roomsettings.invalidconfirm') } + } + } + + + + { LocalizeText('navigator.roomsettings.pets') } + + handleChange('allow_pets', event.target.checked) } /> + { LocalizeText('navigator.roomsettings.allowpets') } + + + handleChange('allow_pets_eat', event.target.checked) } /> + { LocalizeText('navigator.roomsettings.allowfoodconsume') } + + + + + ); +}; diff --git a/src/components/navigator/views/room-settings/views/tab-basic/NavigatorRoomSettingsBasicTabView.tsx b/src/components/navigator/views/room-settings/views/NavigatorRoomSettingsBasicTabView.tsx similarity index 64% rename from src/components/navigator/views/room-settings/views/tab-basic/NavigatorRoomSettingsBasicTabView.tsx rename to src/components/navigator/views/room-settings/views/NavigatorRoomSettingsBasicTabView.tsx index cd1fd234..43166e55 100644 --- a/src/components/navigator/views/room-settings/views/tab-basic/NavigatorRoomSettingsBasicTabView.tsx +++ b/src/components/navigator/views/room-settings/views/NavigatorRoomSettingsBasicTabView.tsx @@ -1,66 +1,31 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { FC, useCallback, useState } from 'react'; -import { LocalizeText } from '../../../../../../api'; -import { Base } from '../../../../../../common/Base'; -import { Flex } from '../../../../../../common/Flex'; -import { Text } from '../../../../../../common/Text'; -import { GetMaxVisitorsList } from '../../../../common/RoomSettingsUtils'; -import { useNavigatorContext } from '../../../../context/NavigatorContext'; -import { NavigatorRoomSettingsTabViewProps } from '../../NavigatorRoomSettingsView.types'; +import { FC, useState } from 'react'; +import { LocalizeText } from '../../../../../api'; +import { Base } from '../../../../../common/Base'; +import { Flex } from '../../../../../common/Flex'; +import { Text } from '../../../../../common/Text'; +import { GetMaxVisitorsList } from '../../../common/RoomSettingsUtils'; +import { useNavigatorContext } from '../../../context/NavigatorContext'; +import { NavigatorRoomSettingsTabViewProps } from './NavigatorRoomSettingsTabViewProps.types'; const DESC_MAX_LENGTH = 255; export const NavigatorRoomSettingsBasicTabView: FC = props => { - const { roomSettingsData = null, setRoomSettingsData = null, onSave = null } = props; + const { roomSettingsData = null, handleChange = null } = props; const [ maxVisitorsList, setMaxVisitorsList ] = useState(GetMaxVisitorsList()); const { navigatorState = null } = useNavigatorContext(); const { categories = null } = navigatorState; - const handleChange = useCallback((field: string, value: string | number | boolean) => - { - const roomSettings = Object.assign({}, roomSettingsData); - - let save = true; - - switch(field) - { - case 'name': - roomSettings.roomName = String(value); - save = false; - break; - case 'description': - roomSettings.roomDescription = String(value); - save = false; - break; - case 'category': - roomSettings.categoryId = Number(value); - break; - case 'max_visitors': - roomSettings.userCount = Number(value); - break; - case 'trade_state': - roomSettings.tradeState = Number(value); - break; - case 'allow_walkthrough': - roomSettings.allowWalkthrough = Boolean(value); - break; - } - - setRoomSettingsData(roomSettings); - - if(save) onSave(roomSettings); - }, [ roomSettingsData, setRoomSettingsData, onSave ]); - return ( <> { LocalizeText('navigator.roomname') } - handleChange('name', event.target.value) } onBlur={ () => onSave(roomSettingsData) } /> + handleChange('name', event.target.value) } onBlur={ event => handleChange('save', null) } /> { LocalizeText('navigator.roomsettings.desc') } -