diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index c51d7b9c..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,86 +0,0 @@ -module.exports = { - 'extends': [ - 'react-app', - 'react-app/jest' - ], - 'rules': { - 'linebreak-style': [ - 'off' - ], - 'quotes': [ - 'error', - 'single' - ], - 'brace-style': [ - 'error', - 'allman', - { - 'allowSingleLine': true - } - ], - 'object-curly-spacing': [ - 'error', - 'always' - ], - 'keyword-spacing': [ - 'error', - { - 'overrides': { - 'if': { - 'after': false - }, - 'for': { - 'after': false - }, - 'while': { - 'after': false - }, - 'switch': { - 'after': false - } - } - } - ], - '@typescript-eslint/no-explicit-any': [ - 'off' - ], - '@typescript-eslint/ban-ts-comment': [ - 'off' - ], - '@typescript-eslint/no-empty-function': [ - 'error', - { - 'allow': [ - 'functions', - 'arrowFunctions', - 'generatorFunctions', - 'methods', - 'generatorMethods', - 'constructors' - ] - } - ], - '@typescript-eslint/no-unused-vars': [ - 'off' - ], - '@typescript-eslint/ban-types': [ - 'error', - { - 'types': { - 'String': true, - 'Boolean': true, - 'Number': true, - 'Symbol': true, - '{}': false, - 'Object': false, - 'object': false, - 'Function': false - }, - 'extendDefaults': true - } - ], - 'no-switch-case-fall-through': [ - 'off' - ] - } - } diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..97926803 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,67 @@ +{ + "root": true, + "settings": { + "react": { + "pragma": "React", + "version": "18.0.0" + } + }, + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "react", + "@typescript-eslint" + ], + "rules": { + "linebreak-style": [ "off" ], + "quotes": [ "error", "single" ], + "@typescript-eslint/indent": [ "error", 4, { "SwitchCase": 1 } ], + "array-bracket-spacing": [ "error", "always" ], + "brace-style": [ "error", "allman" ], + "template-curly-spacing": [ "error", "always" ], + "no-multi-spaces": [ "error" ], + "jsx-quotes": [ "error" ], + "react/prop-types": [ "off" ], + "react/jsx-curly-spacing": [ "error", { "when": "always", "children": true } ], + "react/jsx-equals-spacing": [ "error" ], + "react/jsx-newline": [ "error", { "prevent": true } ], + "@typescript-eslint/object-curly-spacing": [ "error", "always", + { + "arraysInObjects": true, + "objectsInObjects": false + } + ], + "@typescript-eslint/ban-types": [ + "error", + { + "types": { + "String": true, + "Boolean": true, + "Number": true, + "Symbol": true, + "{}": false, + "Object": false, + "object": false, + "Function": false + }, + "extendDefaults": true + } + ], + "no-switch-case-fall-through": [ "off" ] + } +} diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index b14d30ec..00000000 --- a/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -*.scss diff --git a/.vscode/settings.json b/.vscode/settings.json index abf4f847..87146d22 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,15 +4,24 @@ "typescript.preferences.quoteStyle": "single", "typescript.format.placeOpenBraceOnNewLineForControlBlocks": true, "typescript.format.placeOpenBraceOnNewLineForFunctions": true, + "typescript.format.enable": false, "editor.codeActionsOnSave": { - "source.fixAll": true, - "source.fixAll.sortJSON": false, + "source.fixAll.eslint": true, "source.organizeImports": true }, - "git.ignoreLimitWarning": true, + "git.ignoreLimitWarning": true, "files.eol": "\n", "files.insertFinalNewline": true, "files.trimFinalNewlines": true, "editor.wordWrap": "on", - "emmet.showExpandedAbbreviation": "never" + "emmet.showExpandedAbbreviation": "never", + "eslint.validate": [ + "javascript", + "javascriptreact", + "html", + "typescriptreact" + ], + "eslint.workingDirectories": [ + "./src" + ] } diff --git a/README.md b/README.md index e420b3df..b9932897 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# Nitro React +# Nitro React v2.1 ## Prerequisites -- You must have [git](https://git-scm.com/) installed -- You must have [NodeJS](https://nodejs.org/) >= 16.13 installed -- We recommend you use [Yarn](https://yarnpkg.com/) over [npm](https://npmjs.com/) - - `npm i yarn -g` +- [Git](https://git-scm.com/) +- [NodeJS](https://nodejs.org/) >= 18 + - If using NodeJS < 18 remove `--openssl-legacy-provider` from the package.json scripts +- [Yarn](https://yarnpkg.com/) `npm i yarn -g` ## Installation diff --git a/craco.config.js b/craco.config.js index 4f5320a4..51847cbb 100644 --- a/craco.config.js +++ b/craco.config.js @@ -24,20 +24,25 @@ module.exports = { }, module: { ...webpackConfig.module, - rules: webpackConfig.module.rules.map((rule) => - { - if(!rule.oneOf) return rule; + rules: [ + { + test: /\.mjs$/, + include: /node_modules/, + type: 'javascript/auto' + }, + ...webpackConfig.module.rules.map((rule) => { + if (!rule.oneOf) return rule; - return { - ...rule, - oneOf: rule.oneOf.map((ruleObject) => - { - if(!new RegExp(ruleObject.test).test('.ts') || !ruleObject.include) return ruleObject; - - return { ...ruleObject, include: undefined }; - }) - }; - }) + return { + ...rule, + oneOf: rule.oneOf.map((ruleObject) => { + if (!new RegExp(ruleObject.test).test('.ts') || !ruleObject.include) return ruleObject; + + return { ...ruleObject, include: undefined }; + }) + }; + }) + ] } }) } diff --git a/package.json b/package.json index 195a948d..9b5a435b 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,57 @@ { "name": "nitro-react", - "version": "2.0.0", + "version": "2.1.0", "homepage": ".", "private": true, "scripts": { - "start": "cross-env BROWSER=none IMAGE_INLINE_SIZE_LIMIT=100000 craco start", - "build": "cross-env GENERATE_SOURCEMAP=false IMAGE_INLINE_SIZE_LIMIT=100000 craco build", + "start": "cross-env SKIP_PREFLIGHT_CHECK=true BROWSER=none IMAGE_INLINE_SIZE_LIMIT=100000 craco --openssl-legacy-provider start", + "build": "cross-env SKIP_PREFLIGHT_CHECK=true GENERATE_SOURCEMAP=false IMAGE_INLINE_SIZE_LIMIT=100000 craco --openssl-legacy-provider build", "build:prod": "npx browserslist@latest --update-db && yarn build", "test": "craco test", - "eject": "react-scripts eject" + "eject": "react-scripts eject", + "eslint": "eslint src --ext .ts,.tsx" }, "dependencies": { - "@craco/craco": "^6.3.0", - "@fortawesome/fontawesome-svg-core": "^6.1.0", - "@fortawesome/free-solid-svg-icons": "^6.1.0", - "@fortawesome/react-fontawesome": "^0.1.17", - "@nitrots/nitro-renderer": "^1.1.13", + "@craco/craco": "^6.4.5", + "@fortawesome/fontawesome-svg-core": "^6.1.1", + "@fortawesome/free-solid-svg-icons": "^6.1.1", + "@fortawesome/react-fontawesome": "^0.2.0", + "@nitrots/nitro-renderer": "^1.3.4", "animate.css": "^4.1.1", "classnames": "^2.3.1", "cross-env": "^7.0.3", "emoji-toolkit": "^6.6.0", - "node-sass": "^6.0.1", - "react": "^17.0.2", - "react-bootstrap": "^2.0.0-alpha.2", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-bootstrap": "^2.2.2", + "react-dom": "^18.2.0", "react-scripts": "4.0.3", - "react-slider": "^1.3.1", + "react-slider": "^2.0.0", "react-transition-group": "^4.4.2", "react-virtualized": "^9.22.3", "react-youtube": "^7.13.1", - "typescript": "^4.3.5" + "sass": "^1.53.0", + "typescript": "^4.3.5", + "use-between": "^1.3.4" }, "resolutions": { - "react-error-overlay": "6.0.9" + "react-error-overlay": "6.0.9", + "@types/react": "^18.0.15", + "@types/react-dom": "^18.0.6" }, "devDependencies": { - "@types/node": "^12.20.19", - "@types/react": "^17.0.15", - "@types/react-dom": "^17.0.9", + "@types/node": "^18.6.1", + "@types/react": "^18.0.15", + "@types/react-dom": "^18.0.6", "@types/react-slider": "^1.3.1", - "@types/react-transition-group": "^4.4.2", - "@types/react-virtualized": "^9.21.13", - "@typescript-eslint/eslint-plugin": "^4.29.1", + "@types/react-transition-group": "^4.4.5", + "@types/react-virtualized": "^9.21.21", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.6.0", + "eslint-plugin-react": "^7.30.1", + "eslint-plugin-react-hooks": "^4.6.0", "react-error-overlay": "6.0.9" } } diff --git a/public/index.html b/public/index.html index 7898a6da..aaceef80 100644 --- a/public/index.html +++ b/public/index.html @@ -24,7 +24,10 @@ diff --git a/public/ui-config.json.example b/public/ui-config.json.example index 43902aab..403bb68a 100644 --- a/public/ui-config.json.example +++ b/public/ui-config.json.example @@ -1,8 +1,8 @@ { "image.library.notifications.url": "${image.library.url}notifications/%image%.png", "achievements.images.url": "${image.library.url}Quests/%image%.png", - "camera.url": "https://camera.com", - "thumbnails.url": "https://camera.com/thumbnail/%thumbnail%.png", + "camera.url": "https://camera.url", + "thumbnails.url": "https://camera.url/thumbnail/%thumbnail%.png", "url.prefix": "https://website.com", "habbopages.url": "${url.prefix}/", "group.homepage.url": "${url.prefix}/groups/%groupid%/id", @@ -13,23 +13,69 @@ "user.badges.max.slots": 5, "camera.publish.disabled": false, "hc.disabled": false, + "badge.descriptions.enabled": true, + "motto.max.length": 38, + "bot.name.max.length": 15, + "navigator.room.models": [ + { "clubLevel": 0, "tileSize": 104, "name": "a" }, + { "clubLevel": 0, "tileSize": 94, "name": "b" }, + { "clubLevel": 0, "tileSize": 36, "name": "c" }, + { "clubLevel": 0, "tileSize": 84, "name": "d" }, + { "clubLevel": 0, "tileSize": 80, "name": "e" }, + { "clubLevel": 0, "tileSize": 80, "name": "f" }, + { "clubLevel": 0, "tileSize": 416, "name": "i" }, + { "clubLevel": 0, "tileSize": 320, "name": "j" }, + { "clubLevel": 0, "tileSize": 448, "name": "k" }, + { "clubLevel": 0, "tileSize": 352, "name": "l" }, + { "clubLevel": 0, "tileSize": 384, "name": "m" }, + { "clubLevel": 0, "tileSize": 372, "name": "n" }, + { "clubLevel": 1, "tileSize": 80, "name": "g" }, + { "clubLevel": 1, "tileSize": 74, "name": "h" }, + { "clubLevel": 1, "tileSize": 416, "name": "o" }, + { "clubLevel": 1, "tileSize": 352, "name": "p" }, + { "clubLevel": 1, "tileSize": 304, "name": "q" }, + { "clubLevel": 1, "tileSize": 336, "name": "r" }, + { "clubLevel": 1, "tileSize": 748, "name": "u" }, + { "clubLevel": 1, "tileSize": 438, "name": "v" }, + { "clubLevel": 2, "tileSize": 540, "name": "t" }, + { "clubLevel": 2, "tileSize": 512, "name": "w" }, + { "clubLevel": 2, "tileSize": 396, "name": "x" }, + { "clubLevel": 2, "tileSize": 440, "name": "y" }, + { "clubLevel": 2, "tileSize": 456, "name": "z" }, + { "clubLevel": 2, "tileSize": 208, "name": "0" }, + { "clubLevel": 2, "tileSize": 1009, "name": "1" }, + { "clubLevel": 2, "tileSize": 1044, "name": "2" }, + { "clubLevel": 2, "tileSize": 183, "name": "3" }, + { "clubLevel": 2, "tileSize": 254, "name": "4" }, + { "clubLevel": 2, "tileSize": 1024, "name": "5" }, + { "clubLevel": 2, "tileSize": 801, "name": "6" }, + { "clubLevel": 2, "tileSize": 354, "name": "7" }, + { "clubLevel": 2, "tileSize": 888, "name": "8" }, + { "clubLevel": 2, "tileSize": 926, "name": "9" } + ], "hotelview": { "show.avatar": true, "widgets": { "slot.1.widget": "promoarticle", - "slot.1.conf": "", + "slot.1.conf": {}, "slot.2.widget": "widgetcontainer", - "slot.2.conf": "image:${image.library.url}web_promo_small/spromo_Canal_Bundle.png,texts:2021NitroPromo,btnLink:https://google.com", + "slot.2.conf": { + "image": "${image.library.url}web_promo_small/spromo_Canal_Bundle.png", + "texts": "2021NitroPromo", + "btnLink": "https://google.com" + }, "slot.3.widget": "promoarticle", - "slot.3.conf": "", + "slot.3.conf": {}, "slot.4.widget": "", - "slot.4.conf": "", + "slot.4.conf": {}, "slot.5.widget": "", - "slot.5.conf": "", + "slot.5.conf": {}, "slot.6.widget": "achievementcompetition_hall_of_fame", - "slot.6.conf": "", + "slot.6.conf": { + "campaign": "habboFameComp" + }, "slot.7.widget": "", - "slot.7.conf": "" + "slot.7.conf": {} }, "images": { "background": "${asset.url}/images/reception/stretch_blue.png", @@ -52,14 +98,18 @@ 0, 5 ], + "catalog.links": { + "hc.buy_hc": "habbo_club", + "hc.hc_gifts": "club_gifts", + "pets.buy_food": "pet_food", + "pets.buy_saddle": "saddles" + }, "hc.center": { "benefits.info": true, "payday.info": true, "gift.info": true, "benefits.habbopage": "habboclub", - "payday.habbopage": "hcpayday", - "catalog.buy": "habbo_club", - "catalog.gifts": "club_gifts" + "payday.habbopage": "hcpayday" }, "respect.options": { "enabled": false, diff --git a/src/App.scss b/src/App.scss index b73ed915..9a3bd885 100644 --- a/src/App.scss +++ b/src/App.scss @@ -19,7 +19,7 @@ $grid-active-border-color: $white; $toolbar-height: 55px; $achievement-width: 375px; -$achievement-height: 425px; +$achievement-height: 405px; $avatar-editor-width: 620px; $avatar-editor-height: 374px; @@ -52,7 +52,7 @@ $friends-list-width: 250px; $friends-list-height: 300px; $help-width: 450px; -$help-height: 250px; +$help-height: 290px; $nitropedia-width: 400px; $nitropedia-height: 400px; diff --git a/src/App.tsx b/src/App.tsx index ee5a8fc2..82ca72a4 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,49 +1,42 @@ import { ConfigurationEvent, HabboWebTools, LegacyExternalInterface, Nitro, NitroCommunicationDemoEvent, NitroEvent, NitroLocalizationEvent, NitroVersion, RoomEngineEvent, WebGL } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { GetCommunication, GetConfiguration, GetNitroInstance } from './api'; +import { FC, useCallback, useEffect, useState } from 'react'; +import { DispatchUiEvent, GetCommunication, GetConfiguration, GetNitroInstance, GetUIVersion } from './api'; import { Base, TransitionAnimation, TransitionAnimationTypes } from './common'; import { LoadingView } from './components/loading/LoadingView'; import { MainView } from './components/main/MainView'; -import { DispatchUiEvent, UseConfigurationEvent, UseLocalizationEvent, UseMainEvent, UseRoomEngineEvent } from './hooks'; +import { useConfigurationEvent, useLocalizationEvent, useMainEvent, useRoomEngineEvent } from './hooks'; +import IntervalWebWorker from './workers/IntervalWebWorker'; +import { WorkerBuilder } from './workers/WorkerBuilder'; + +NitroVersion.UI_VERSION = GetUIVersion(); export const App: FC<{}> = props => { const [ isReady, setIsReady ] = useState(false); const [ isError, setIsError ] = useState(false); - const [message, setMessage] = useState('Getting Ready'); - const [percent, setPercent] = useState(0); - - //@ts-ignore - if(!NitroConfig) throw new Error('NitroConfig is not defined!'); + const [ message, setMessage ] = useState('Getting Ready'); + const [ percent, setPercent ] = useState(0); + const [ imageRendering, setImageRendering ] = useState(true); if(!GetNitroInstance()) { - NitroVersion.UI_VERSION = '2.0.0'; + //@ts-ignore + if(!NitroConfig) throw new Error('NitroConfig is not defined!'); + Nitro.bootstrap(); + + const worker = new WorkerBuilder(IntervalWebWorker); + + Nitro.instance.setWorker(worker); } - const getPreloadAssetUrls = useCallback(() => - { - const urls: string[] = []; - const assetUrls = GetConfiguration('preload.assets.urls'); - - if(assetUrls && assetUrls.length) - { - for(const url of assetUrls) urls.push(GetNitroInstance().core.configuration.interpolate(url)); - } - - return urls; - }, []); - - const loadPercent = useCallback(() => setPercent(prevValue => (prevValue + 20)), []); - const handler = useCallback((event: NitroEvent) => { switch(event.type) { case ConfigurationEvent.LOADED: GetNitroInstance().localization.init(); - loadPercent(); + setPercent(prevValue => (prevValue + 20)); return; case ConfigurationEvent.FAILED: setIsError(true); @@ -60,44 +53,48 @@ export const App: FC<{}> = props => setTimeout(() => window.location.reload(), 1500); return; case NitroCommunicationDemoEvent.CONNECTION_HANDSHAKING: - loadPercent(); - return; - case NitroCommunicationDemoEvent.CONNECTION_HANDSHAKE_FAILED: + setPercent(prevValue => (prevValue + 20)); + return; + case NitroCommunicationDemoEvent.CONNECTION_HANDSHAKE_FAILED: setIsError(true); setMessage('Handshake Failed'); - return; - case NitroCommunicationDemoEvent.CONNECTION_AUTHENTICATED: - loadPercent(); + return; + case NitroCommunicationDemoEvent.CONNECTION_AUTHENTICATED: + setPercent(prevValue => (prevValue + 20)); GetNitroInstance().init(); if(LegacyExternalInterface.available) LegacyExternalInterface.call('legacyTrack', 'authentication', 'authok', []); - return; - case NitroCommunicationDemoEvent.CONNECTION_ERROR: + return; + case NitroCommunicationDemoEvent.CONNECTION_ERROR: setIsError(true); setMessage('Connection Error'); - return; - case NitroCommunicationDemoEvent.CONNECTION_CLOSED: + return; + case NitroCommunicationDemoEvent.CONNECTION_CLOSED: //if(GetNitroInstance().roomEngine) GetNitroInstance().roomEngine.dispose(); - //setIsError(true); setMessage('Connection Error'); HabboWebTools.send(-1, 'client.init.handshake.fail'); return; case RoomEngineEvent.ENGINE_INITIALIZED: - loadPercent(); + setPercent(prevValue => (prevValue + 20)); setTimeout(() => setIsReady(true), 300); return; - case NitroLocalizationEvent.LOADED: - GetNitroInstance().core.asset.downloadAssets(getPreloadAssetUrls(), (status: boolean) => + case NitroLocalizationEvent.LOADED: { + const assetUrls = GetConfiguration('preload.assets.urls'); + const urls: string[] = []; + + if(assetUrls && assetUrls.length) for(const url of assetUrls) urls.push(GetNitroInstance().core.configuration.interpolate(url)); + + GetNitroInstance().core.asset.downloadAssets(urls, (status: boolean) => { if(status) { GetCommunication().init(); - loadPercent(); + setPercent(prevValue => (prevValue + 20)) } else { @@ -106,34 +103,49 @@ export const App: FC<{}> = props => } }); return; + } } - }, [ getPreloadAssetUrls,loadPercent ]); + }, []); - UseMainEvent(Nitro.WEBGL_UNAVAILABLE, handler); - UseMainEvent(Nitro.WEBGL_CONTEXT_LOST, handler); - UseMainEvent(NitroCommunicationDemoEvent.CONNECTION_HANDSHAKING, handler); - UseMainEvent(NitroCommunicationDemoEvent.CONNECTION_HANDSHAKE_FAILED, handler); - UseMainEvent(NitroCommunicationDemoEvent.CONNECTION_AUTHENTICATED, handler); - UseMainEvent(NitroCommunicationDemoEvent.CONNECTION_ERROR, handler); - UseMainEvent(NitroCommunicationDemoEvent.CONNECTION_CLOSED, handler); - UseRoomEngineEvent(RoomEngineEvent.ENGINE_INITIALIZED, handler); - UseLocalizationEvent(NitroLocalizationEvent.LOADED, handler); - UseConfigurationEvent(ConfigurationEvent.LOADED, handler); - UseConfigurationEvent(ConfigurationEvent.FAILED, handler); + useMainEvent(Nitro.WEBGL_UNAVAILABLE, handler); + useMainEvent(Nitro.WEBGL_CONTEXT_LOST, handler); + useMainEvent(NitroCommunicationDemoEvent.CONNECTION_HANDSHAKING, handler); + useMainEvent(NitroCommunicationDemoEvent.CONNECTION_HANDSHAKE_FAILED, handler); + useMainEvent(NitroCommunicationDemoEvent.CONNECTION_AUTHENTICATED, handler); + useMainEvent(NitroCommunicationDemoEvent.CONNECTION_ERROR, handler); + useMainEvent(NitroCommunicationDemoEvent.CONNECTION_CLOSED, handler); + useRoomEngineEvent(RoomEngineEvent.ENGINE_INITIALIZED, handler); + useLocalizationEvent(NitroLocalizationEvent.LOADED, handler); + useConfigurationEvent(ConfigurationEvent.LOADED, handler); + useConfigurationEvent(ConfigurationEvent.FAILED, handler); - if(!WebGL.isWebGLAvailable()) + useEffect(() => { - DispatchUiEvent(new NitroEvent(Nitro.WEBGL_UNAVAILABLE)); - } - else - { - GetNitroInstance().core.configuration.init(); - } + if(!WebGL.isWebGLAvailable()) + { + DispatchUiEvent(new NitroEvent(Nitro.WEBGL_UNAVAILABLE)); + } + else + { + GetNitroInstance().core.configuration.init(); + } + + const resize = (event: UIEvent) => setImageRendering(!(window.devicePixelRatio % 1)); + + window.addEventListener('resize', resize); + + resize(null); + + return () => + { + window.removeEventListener('resize', resize); + } + }, []); return ( - + { (!isReady || isError) && - } + } diff --git a/src/api/GetRendererVersion.ts b/src/api/GetRendererVersion.ts new file mode 100644 index 00000000..bb9e4618 --- /dev/null +++ b/src/api/GetRendererVersion.ts @@ -0,0 +1,3 @@ +import { NitroVersion } from '@nitrots/nitro-renderer'; + +export const GetRendererVersion = () => NitroVersion.RENDERER_VERSION; diff --git a/src/api/GetUIVersion.ts b/src/api/GetUIVersion.ts new file mode 100644 index 00000000..881eea94 --- /dev/null +++ b/src/api/GetUIVersion.ts @@ -0,0 +1 @@ +export const GetUIVersion = () => '2.1.0'; diff --git a/src/components/achievements/common/AchievementCategory.ts b/src/api/achievements/AchievementCategory.ts similarity index 59% rename from src/components/achievements/common/AchievementCategory.ts rename to src/api/achievements/AchievementCategory.ts index 992c3a57..906d8da4 100644 --- a/src/components/achievements/common/AchievementCategory.ts +++ b/src/api/achievements/AchievementCategory.ts @@ -1,6 +1,8 @@ import { AchievementData } from '@nitrots/nitro-renderer'; +import { AchievementUtilities } from './AchievementUtilities'; +import { IAchievementCategory } from './IAchievementCategory'; -export class AchievementCategory +export class AchievementCategory implements IAchievementCategory { private _code: string; private _achievements: AchievementData[]; @@ -13,26 +15,12 @@ export class AchievementCategory public getProgress(): number { - let progress = 0; - - for(const achievement of this._achievements) - { - progress += (achievement.finalLevel ? achievement.level : (achievement.level - 1)); - } - - return progress; + return AchievementUtilities.getAchievementCategoryProgress(this); } public getMaxProgress(): number { - let progress = 0; - - for(const achievement of this._achievements) - { - progress += achievement.levelCount; - } - - return progress; + return AchievementUtilities.getAchievementCategoryMaxProgress(this); } public get code(): string diff --git a/src/api/achievements/AchievementUtilities.ts b/src/api/achievements/AchievementUtilities.ts new file mode 100644 index 00000000..b581f979 --- /dev/null +++ b/src/api/achievements/AchievementUtilities.ts @@ -0,0 +1,97 @@ +import { AchievementData } from '@nitrots/nitro-renderer'; +import { GetConfiguration, GetLocalization } from '../nitro'; +import { IAchievementCategory } from './IAchievementCategory'; + +export class AchievementUtilities +{ + public static getAchievementBadgeCode(achievement: AchievementData): string + { + if(!achievement) return null; + + let badgeId = achievement.badgeId; + + if(!achievement.finalLevel) badgeId = GetLocalization().getPreviousLevelBadgeId(badgeId); + + return badgeId; + } + + public static getAchievementCategoryImageUrl(category: IAchievementCategory, progress: number = null, icon: boolean = false): string + { + const imageUrl = GetConfiguration('achievements.images.url'); + + let imageName = icon ? 'achicon_' : 'achcategory_'; + + imageName += category.code; + + if(progress !== null) imageName += `_${ ((progress > 0) ? 'active' : 'inactive') }`; + + return imageUrl.replace('%image%', imageName); + } + + public static getAchievementCategoryMaxProgress(category: IAchievementCategory): number + { + if(!category) return 0; + + let progress = 0; + + for(const achievement of category.achievements) + { + progress += achievement.levelCount; + } + + return progress; + } + + public static getAchievementCategoryProgress(category: IAchievementCategory): number + { + if(!category) return 0; + + let progress = 0; + + for(const achievement of category.achievements) progress += (achievement.finalLevel ? achievement.level : (achievement.level - 1)); + + return progress; + } + + public static getAchievementCategoryTotalUnseen(category: IAchievementCategory): number + { + if(!category) return 0; + + let unseen = 0; + + for(const achievement of category.achievements) ((achievement.unseen > 0) && unseen++); + + return unseen; + } + + public static getAchievementHasStarted(achievement: AchievementData): boolean + { + if(!achievement) return false; + + if(achievement.finalLevel || ((achievement.level - 1) > 0)) return true; + + return false; + } + + public static getAchievementIsIgnored(achievement: AchievementData): boolean + { + if(!achievement) return false; + + const ignored = GetConfiguration('achievements.unseen.ignored'); + const value = achievement.badgeId.replace(/[0-9]/g, ''); + const index = ignored.indexOf(value); + + if(index >= 0) return true; + + return false; + } + + public static getAchievementLevel(achievement: AchievementData): number + { + if(!achievement) return 0; + + if(achievement.finalLevel) return achievement.level; + + return (achievement.level - 1); + } +} diff --git a/src/api/achievements/IAchievementCategory.ts b/src/api/achievements/IAchievementCategory.ts new file mode 100644 index 00000000..a049d464 --- /dev/null +++ b/src/api/achievements/IAchievementCategory.ts @@ -0,0 +1,7 @@ +import { AchievementData } from '@nitrots/nitro-renderer'; + +export interface IAchievementCategory +{ + code: string; + achievements: AchievementData[]; +} diff --git a/src/api/achievements/index.ts b/src/api/achievements/index.ts new file mode 100644 index 00000000..a3d44b73 --- /dev/null +++ b/src/api/achievements/index.ts @@ -0,0 +1,3 @@ +export * from './AchievementCategory'; +export * from './AchievementUtilities'; +export * from './IAchievementCategory'; diff --git a/src/components/avatar-editor/common/AvatarEditorAction.ts b/src/api/avatar/AvatarEditorAction.ts similarity index 100% rename from src/components/avatar-editor/common/AvatarEditorAction.ts rename to src/api/avatar/AvatarEditorAction.ts diff --git a/src/components/avatar-editor/common/AvatarEditorGridColorItem.ts b/src/api/avatar/AvatarEditorGridColorItem.ts similarity index 100% rename from src/components/avatar-editor/common/AvatarEditorGridColorItem.ts rename to src/api/avatar/AvatarEditorGridColorItem.ts diff --git a/src/components/avatar-editor/common/AvatarEditorGridPartItem.ts b/src/api/avatar/AvatarEditorGridPartItem.ts similarity index 95% rename from src/components/avatar-editor/common/AvatarEditorGridPartItem.ts rename to src/api/avatar/AvatarEditorGridPartItem.ts index 285cbcad..a3b16616 100644 --- a/src/components/avatar-editor/common/AvatarEditorGridPartItem.ts +++ b/src/api/avatar/AvatarEditorGridPartItem.ts @@ -1,12 +1,12 @@ import { AvatarFigurePartType, IAvatarImageListener, IAvatarRenderManager, IFigurePart, IFigurePartSet, IGraphicAsset, IPartColor, NitroAlphaFilter, NitroContainer, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; -import { GetAvatarRenderManager } from '../../../api'; +import { GetAvatarRenderManager } from '../nitro'; import { FigureData } from './FigureData'; export class AvatarEditorGridPartItem implements IAvatarImageListener { private static ALPHA_FILTER: NitroAlphaFilter = new NitroAlphaFilter(0.2); - private static THUMB_DIRECTIONS: number[] = [2, 6, 0, 4, 3, 1]; - private static DRAW_ORDER: string[] = [ + private static THUMB_DIRECTIONS: number[] = [ 2, 6, 0, 4, 3, 1 ]; + private static DRAW_ORDER: string[] = [ AvatarFigurePartType.LEFT_HAND_ITEM, AvatarFigurePartType.LEFT_HAND, AvatarFigurePartType.LEFT_SLEEVE, @@ -201,13 +201,13 @@ export class AvatarEditorGridPartItem implements IAvatarImageListener if(this._partSet) { - this._isHC = (this._partSet.clubLevel > 0); - this._isSellable = this._partSet.isSellable; + this._isHC = (this._partSet.clubLevel > 0); + this._isSellable = this._partSet.isSellable; } else { - this._isHC = false; - this._isSellable = false; + this._isHC = false; + this._isSellable = false; } if(this._isDisabled) this.setAlpha(container, 0.2); diff --git a/src/components/avatar-editor/common/AvatarEditorUtilities.ts b/src/api/avatar/AvatarEditorUtilities.ts similarity index 99% rename from src/components/avatar-editor/common/AvatarEditorUtilities.ts rename to src/api/avatar/AvatarEditorUtilities.ts index 5a7b9f52..3626ab8e 100644 --- a/src/components/avatar-editor/common/AvatarEditorUtilities.ts +++ b/src/api/avatar/AvatarEditorUtilities.ts @@ -1,5 +1,5 @@ import { IPartColor } from '@nitrots/nitro-renderer'; -import { GetAvatarPalette, GetAvatarRenderManager, GetAvatarSetType, GetClubMemberLevel, GetConfiguration } from '../../../api'; +import { GetAvatarPalette, GetAvatarRenderManager, GetAvatarSetType, GetClubMemberLevel, GetConfiguration } from '../nitro'; import { AvatarEditorGridColorItem } from './AvatarEditorGridColorItem'; import { AvatarEditorGridPartItem } from './AvatarEditorGridPartItem'; import { CategoryBaseModel } from './CategoryBaseModel'; diff --git a/src/components/avatar-editor/common/BodyModel.ts b/src/api/avatar/BodyModel.ts similarity index 97% rename from src/components/avatar-editor/common/BodyModel.ts rename to src/api/avatar/BodyModel.ts index d7170dbd..7cdb34ce 100644 --- a/src/components/avatar-editor/common/BodyModel.ts +++ b/src/api/avatar/BodyModel.ts @@ -1,5 +1,5 @@ import { AvatarEditorFigureCategory, AvatarScaleType, AvatarSetType } from '@nitrots/nitro-renderer'; -import { GetAvatarRenderManager } from '../../../api'; +import { GetAvatarRenderManager } from '../nitro'; import { AvatarEditorUtilities } from './AvatarEditorUtilities'; import { CategoryBaseModel } from './CategoryBaseModel'; import { FigureData } from './FigureData'; diff --git a/src/components/avatar-editor/common/CategoryBaseModel.ts b/src/api/avatar/CategoryBaseModel.ts similarity index 99% rename from src/components/avatar-editor/common/CategoryBaseModel.ts rename to src/api/avatar/CategoryBaseModel.ts index 5cd311c0..34dd9330 100644 --- a/src/components/avatar-editor/common/CategoryBaseModel.ts +++ b/src/api/avatar/CategoryBaseModel.ts @@ -11,7 +11,7 @@ export class CategoryBaseModel implements IAvatarEditorCategoryModel constructor() { - this._isInitalized = false; + this._isInitalized = false; this._maxPaletteCount = 0; } diff --git a/src/components/avatar-editor/common/CategoryData.ts b/src/api/avatar/CategoryData.ts similarity index 100% rename from src/components/avatar-editor/common/CategoryData.ts rename to src/api/avatar/CategoryData.ts diff --git a/src/components/avatar-editor/common/FigureData.ts b/src/api/avatar/FigureData.ts similarity index 98% rename from src/components/avatar-editor/common/FigureData.ts rename to src/api/avatar/FigureData.ts index 072ced1c..78014d11 100644 --- a/src/components/avatar-editor/common/FigureData.ts +++ b/src/api/avatar/FigureData.ts @@ -199,8 +199,8 @@ export class FigureData { let figureString = ''; - const setTypes: string[] = [ FigureData.FACE ]; - const figureSets: string[] = []; + const setTypes: string[] = [ FigureData.FACE ]; + const figureSets: string[] = []; for(const setType of setTypes) { diff --git a/src/components/avatar-editor/common/FigureGenerator.ts b/src/api/avatar/FigureGenerator.ts similarity index 84% rename from src/components/avatar-editor/common/FigureGenerator.ts rename to src/api/avatar/FigureGenerator.ts index fa4126ed..b83a6616 100644 --- a/src/components/avatar-editor/common/FigureGenerator.ts +++ b/src/api/avatar/FigureGenerator.ts @@ -1,6 +1,6 @@ import { AvatarFigureContainer, IFigurePartSet, IPalette, IPartColor, SetType } from '@nitrots/nitro-renderer'; -import { GetAvatarRenderManager } from '../../../api'; -import { Randomizer } from '../../../api/utils'; +import { GetAvatarRenderManager } from '../nitro'; +import { Randomizer } from '../utils'; import { FigureData } from './FigureData'; function getTotalColors(partSet: IFigurePartSet): number @@ -26,11 +26,11 @@ function getRandomPartSet(setType: SetType, gender: string, clubLevel: number = if(!setType) return null; const options = setType.partSets.getValues().filter(option => - { - if(!option.isSelectable || ((option.gender !== 'U') && (option.gender !== gender)) || (option.clubLevel > clubLevel) || (option.isSellable && (figureSetIds.indexOf(option.id) === -1))) return null; + { + if(!option.isSelectable || ((option.gender !== 'U') && (option.gender !== gender)) || (option.clubLevel > clubLevel) || (option.isSellable && (figureSetIds.indexOf(option.id) === -1))) return null; - return option; - }); + return option; + }); if(!options || !options.length) return null; @@ -42,11 +42,11 @@ function getRandomColors(palette: IPalette, partSet: IFigurePartSet, clubLevel: if(!palette) return []; const options = palette.colors.getValues().filter(option => - { - if(!option.isSelectable || (option.clubLevel > clubLevel)) return null; + { + if(!option.isSelectable || (option.clubLevel > clubLevel)) return null; - return option; - }); + return option; + }); if(!options || !options.length) return null; diff --git a/src/components/avatar-editor/common/HeadModel.ts b/src/api/avatar/HeadModel.ts similarity index 100% rename from src/components/avatar-editor/common/HeadModel.ts rename to src/api/avatar/HeadModel.ts diff --git a/src/components/avatar-editor/common/IAvatarEditorCategoryModel.ts b/src/api/avatar/IAvatarEditorCategoryModel.ts similarity index 100% rename from src/components/avatar-editor/common/IAvatarEditorCategoryModel.ts rename to src/api/avatar/IAvatarEditorCategoryModel.ts diff --git a/src/components/avatar-editor/common/LegModel.ts b/src/api/avatar/LegModel.ts similarity index 100% rename from src/components/avatar-editor/common/LegModel.ts rename to src/api/avatar/LegModel.ts diff --git a/src/components/avatar-editor/common/TorsoModel.ts b/src/api/avatar/TorsoModel.ts similarity index 100% rename from src/components/avatar-editor/common/TorsoModel.ts rename to src/api/avatar/TorsoModel.ts diff --git a/src/api/avatar/index.ts b/src/api/avatar/index.ts new file mode 100644 index 00000000..37b30721 --- /dev/null +++ b/src/api/avatar/index.ts @@ -0,0 +1,13 @@ +export * from './AvatarEditorAction'; +export * from './AvatarEditorGridColorItem'; +export * from './AvatarEditorGridPartItem'; +export * from './AvatarEditorUtilities'; +export * from './BodyModel'; +export * from './CategoryBaseModel'; +export * from './CategoryData'; +export * from './FigureData'; +export * from './FigureGenerator'; +export * from './HeadModel'; +export * from './IAvatarEditorCategoryModel'; +export * from './LegModel'; +export * from './TorsoModel'; diff --git a/src/components/camera/common/CameraEditorTabs.ts b/src/api/camera/CameraEditorTabs.ts similarity index 100% rename from src/components/camera/common/CameraEditorTabs.ts rename to src/api/camera/CameraEditorTabs.ts diff --git a/src/components/camera/common/CameraPicture.ts b/src/api/camera/CameraPicture.ts similarity index 77% rename from src/components/camera/common/CameraPicture.ts rename to src/api/camera/CameraPicture.ts index 8d9401b6..fe8c2210 100644 --- a/src/components/camera/common/CameraPicture.ts +++ b/src/api/camera/CameraPicture.ts @@ -4,5 +4,6 @@ export class CameraPicture { constructor( public texture: NitroTexture, - public imageUrl: string) {} + public imageUrl: string) + {} } diff --git a/src/components/camera/common/CameraPictureThumbnail.ts b/src/api/camera/CameraPictureThumbnail.ts similarity index 67% rename from src/components/camera/common/CameraPictureThumbnail.ts rename to src/api/camera/CameraPictureThumbnail.ts index d88f9dcd..cd126607 100644 --- a/src/components/camera/common/CameraPictureThumbnail.ts +++ b/src/api/camera/CameraPictureThumbnail.ts @@ -2,5 +2,6 @@ export class CameraPictureThumbnail { constructor( public effectName: string, - public thumbnailUrl: string) {} + public thumbnailUrl: string) + {} } diff --git a/src/api/camera/index.ts b/src/api/camera/index.ts new file mode 100644 index 00000000..93c6ccb9 --- /dev/null +++ b/src/api/camera/index.ts @@ -0,0 +1,3 @@ +export * from './CameraEditorTabs'; +export * from './CameraPicture'; +export * from './CameraPictureThumbnail'; diff --git a/src/components/campaign/common/CalendarItem.ts b/src/api/campaign/CalendarItem.ts similarity index 100% rename from src/components/campaign/common/CalendarItem.ts rename to src/api/campaign/CalendarItem.ts diff --git a/src/components/campaign/common/CalendarItemState.ts b/src/api/campaign/CalendarItemState.ts similarity index 100% rename from src/components/campaign/common/CalendarItemState.ts rename to src/api/campaign/CalendarItemState.ts diff --git a/src/components/campaign/common/ICalendarItem.ts b/src/api/campaign/ICalendarItem.ts similarity index 100% rename from src/components/campaign/common/ICalendarItem.ts rename to src/api/campaign/ICalendarItem.ts diff --git a/src/api/campaign/index.ts b/src/api/campaign/index.ts new file mode 100644 index 00000000..a86e40c4 --- /dev/null +++ b/src/api/campaign/index.ts @@ -0,0 +1,3 @@ +export * from './CalendarItem'; +export * from './CalendarItemState'; +export * from './ICalendarItem'; diff --git a/src/api/catalog/BuilderFurniPlaceableStatus.ts b/src/api/catalog/BuilderFurniPlaceableStatus.ts new file mode 100644 index 00000000..40eb6f65 --- /dev/null +++ b/src/api/catalog/BuilderFurniPlaceableStatus.ts @@ -0,0 +1,10 @@ +export class BuilderFurniPlaceableStatus +{ + public static OKAY: number = 0; + public static MISSING_OFFER: number = 1; + public static FURNI_LIMIT_REACHED: number = 2; + public static NOT_IN_ROOM: number = 3; + public static NOT_ROOM_OWNER: number = 4; + public static GUILD_ROOM: number = 5; + public static VISITORS_IN_ROOM: number = 6; +} diff --git a/src/components/catalog/common/CatalogNode.ts b/src/api/catalog/CatalogNode.ts similarity index 100% rename from src/components/catalog/common/CatalogNode.ts rename to src/api/catalog/CatalogNode.ts diff --git a/src/components/catalog/common/CatalogPage.ts b/src/api/catalog/CatalogPage.ts similarity index 100% rename from src/components/catalog/common/CatalogPage.ts rename to src/api/catalog/CatalogPage.ts diff --git a/src/components/catalog/common/CatalogPageName.ts b/src/api/catalog/CatalogPageName.ts similarity index 100% rename from src/components/catalog/common/CatalogPageName.ts rename to src/api/catalog/CatalogPageName.ts diff --git a/src/components/catalog/common/CatalogPetPalette.ts b/src/api/catalog/CatalogPetPalette.ts similarity index 93% rename from src/components/catalog/common/CatalogPetPalette.ts rename to src/api/catalog/CatalogPetPalette.ts index 7a7df4c2..d92c40dd 100644 --- a/src/components/catalog/common/CatalogPetPalette.ts +++ b/src/api/catalog/CatalogPetPalette.ts @@ -5,5 +5,6 @@ export class CatalogPetPalette constructor( public readonly breed: string, public readonly palettes: SellablePetPaletteData[] - ) {} + ) + {} } diff --git a/src/components/catalog/common/CatalogPurchaseState.ts b/src/api/catalog/CatalogPurchaseState.ts similarity index 100% rename from src/components/catalog/common/CatalogPurchaseState.ts rename to src/api/catalog/CatalogPurchaseState.ts diff --git a/src/components/catalog/common/CatalogType.ts b/src/api/catalog/CatalogType.ts similarity index 100% rename from src/components/catalog/common/CatalogType.ts rename to src/api/catalog/CatalogType.ts diff --git a/src/components/catalog/common/CatalogUtilities.ts b/src/api/catalog/CatalogUtilities.ts similarity index 59% rename from src/components/catalog/common/CatalogUtilities.ts rename to src/api/catalog/CatalogUtilities.ts index f2655688..5ca8fed5 100644 --- a/src/components/catalog/common/CatalogUtilities.ts +++ b/src/api/catalog/CatalogUtilities.ts @@ -1,5 +1,5 @@ import { SellablePetPaletteData } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../../../api'; +import { GetRoomEngine } from '../nitro'; import { ICatalogNode } from './ICatalogNode'; export const GetPixelEffectIcon = (id: number) => @@ -85,21 +85,21 @@ export function GetPetAvailableColors(petIndex: number, palettes: SellablePetPal switch(petIndex) { case 0: - return [[16743226], [16750435], [16764339], [0xF59500], [16498012], [16704690], [0xEDD400], [16115545], [16513201], [8694111], [11585939], [14413767], [6664599], [9553845], [12971486], [8358322], [10002885], [13292268], [10780600], [12623573], [14403561], [12418717], [14327229], [15517403], [14515069], [15764368], [16366271], [0xABABAB], [0xD4D4D4], [0xFFFFFF], [14256481], [14656129], [15848130], [14005087], [14337152], [15918540], [15118118], [15531929], [9764857], [11258085]]; + return [ [ 16743226 ], [ 16750435 ], [ 16764339 ], [ 0xF59500 ], [ 16498012 ], [ 16704690 ], [ 0xEDD400 ], [ 16115545 ], [ 16513201 ], [ 8694111 ], [ 11585939 ], [ 14413767 ], [ 6664599 ], [ 9553845 ], [ 12971486 ], [ 8358322 ], [ 10002885 ], [ 13292268 ], [ 10780600 ], [ 12623573 ], [ 14403561 ], [ 12418717 ], [ 14327229 ], [ 15517403 ], [ 14515069 ], [ 15764368 ], [ 16366271 ], [ 0xABABAB ], [ 0xD4D4D4 ], [ 0xFFFFFF ], [ 14256481 ], [ 14656129 ], [ 15848130 ], [ 14005087 ], [ 14337152 ], [ 15918540 ], [ 15118118 ], [ 15531929 ], [ 9764857 ], [ 11258085 ] ]; case 1: - return [[16743226], [16750435], [16764339], [0xF59500], [16498012], [16704690], [0xEDD400], [16115545], [16513201], [8694111], [11585939], [14413767], [6664599], [9553845], [12971486], [8358322], [10002885], [13292268], [10780600], [12623573], [14403561], [12418717], [14327229], [15517403], [14515069], [15764368], [16366271], [0xABABAB], [0xD4D4D4], [0xFFFFFF], [14256481], [14656129], [15848130], [14005087], [14337152], [15918540], [15118118], [15531929], [9764857], [11258085]]; + return [ [ 16743226 ], [ 16750435 ], [ 16764339 ], [ 0xF59500 ], [ 16498012 ], [ 16704690 ], [ 0xEDD400 ], [ 16115545 ], [ 16513201 ], [ 8694111 ], [ 11585939 ], [ 14413767 ], [ 6664599 ], [ 9553845 ], [ 12971486 ], [ 8358322 ], [ 10002885 ], [ 13292268 ], [ 10780600 ], [ 12623573 ], [ 14403561 ], [ 12418717 ], [ 14327229 ], [ 15517403 ], [ 14515069 ], [ 15764368 ], [ 16366271 ], [ 0xABABAB ], [ 0xD4D4D4 ], [ 0xFFFFFF ], [ 14256481 ], [ 14656129 ], [ 15848130 ], [ 14005087 ], [ 14337152 ], [ 15918540 ], [ 15118118 ], [ 15531929 ], [ 9764857 ], [ 11258085 ] ]; case 2: - return [[16579283], [15378351], [8830016], [15257125], [9340985], [8949607], [6198292], [8703620], [9889626], [8972045], [12161285], [13162269], [8620113], [12616503], [8628101], [0xD2FF00], [9764857]]; + return [ [ 16579283 ], [ 15378351 ], [ 8830016 ], [ 15257125 ], [ 9340985 ], [ 8949607 ], [ 6198292 ], [ 8703620 ], [ 9889626 ], [ 8972045 ], [ 12161285 ], [ 13162269 ], [ 8620113 ], [ 12616503 ], [ 8628101 ], [ 0xD2FF00 ], [ 9764857 ] ]; case 3: - return [[0xFFFFFF], [0xEEEEEE], [0xDDDDDD]]; + return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ] ]; case 4: - return [[0xFFFFFF], [16053490], [15464440], [16248792], [15396319], [15007487]]; + return [ [ 0xFFFFFF ], [ 16053490 ], [ 15464440 ], [ 16248792 ], [ 15396319 ], [ 15007487 ] ]; case 5: - return [[0xFFFFFF], [0xEEEEEE], [0xDDDDDD]]; + return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ] ]; case 6: - return [[0xFFFFFF], [0xEEEEEE], [0xDDDDDD], [16767177], [16770205], [16751331]]; + return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ], [ 16767177 ], [ 16770205 ], [ 16751331 ] ]; case 7: - return [[0xCCCCCC], [0xAEAEAE], [16751331], [10149119], [16763290], [16743786]]; + return [ [ 0xCCCCCC ], [ 0xAEAEAE ], [ 16751331 ], [ 10149119 ], [ 16763290 ], [ 16743786 ] ]; default: { const colors: number[][] = []; diff --git a/src/components/catalog/common/FurnitureOffer.ts b/src/api/catalog/FurnitureOffer.ts similarity index 99% rename from src/components/catalog/common/FurnitureOffer.ts rename to src/api/catalog/FurnitureOffer.ts index b25c376f..4c9c9f94 100644 --- a/src/components/catalog/common/FurnitureOffer.ts +++ b/src/api/catalog/FurnitureOffer.ts @@ -1,5 +1,5 @@ import { GetProductOfferComposer, IFurnitureData } from '@nitrots/nitro-renderer'; -import { GetProductDataForLocalization, SendMessageComposer } from '../../../api'; +import { GetProductDataForLocalization, SendMessageComposer } from '..'; import { ICatalogPage } from './ICatalogPage'; import { IProduct } from './IProduct'; import { IPurchasableOffer } from './IPurchasableOffer'; diff --git a/src/api/catalog/GetImageIconUrlForProduct.ts b/src/api/catalog/GetImageIconUrlForProduct.ts new file mode 100644 index 00000000..1e8d8c0b --- /dev/null +++ b/src/api/catalog/GetImageIconUrlForProduct.ts @@ -0,0 +1,19 @@ +import { GetRoomEngine } from '../nitro'; +import { ProductTypeEnum } from './ProductTypeEnum'; + +export const GetImageIconUrlForProduct = (productType: string, productClassId: number, extraData: string = null) => +{ + let imageUrl: string = null; + + switch(productType.toLocaleLowerCase()) + { + case ProductTypeEnum.FLOOR: + imageUrl = GetRoomEngine().getFurnitureFloorIconUrl(productClassId); + break; + case ProductTypeEnum.WALL: + imageUrl = GetRoomEngine().getFurnitureWallIconUrl(productClassId, extraData); + break; + } + + return imageUrl; +} diff --git a/src/components/catalog/common/GiftWrappingConfiguration.ts b/src/api/catalog/GiftWrappingConfiguration.ts similarity index 100% rename from src/components/catalog/common/GiftWrappingConfiguration.ts rename to src/api/catalog/GiftWrappingConfiguration.ts diff --git a/src/components/catalog/common/ICatalogNode.ts b/src/api/catalog/ICatalogNode.ts similarity index 100% rename from src/components/catalog/common/ICatalogNode.ts rename to src/api/catalog/ICatalogNode.ts diff --git a/src/components/catalog/common/ICatalogOptions.ts b/src/api/catalog/ICatalogOptions.ts similarity index 85% rename from src/components/catalog/common/ICatalogOptions.ts rename to src/api/catalog/ICatalogOptions.ts index 49ed1737..20356947 100644 --- a/src/components/catalog/common/ICatalogOptions.ts +++ b/src/api/catalog/ICatalogOptions.ts @@ -1,7 +1,6 @@ import { ClubGiftInfoParser, ClubOfferData, HabboGroupEntryData, MarketplaceConfigurationMessageParser } from '@nitrots/nitro-renderer'; import { CatalogPetPalette } from './CatalogPetPalette'; import { GiftWrappingConfiguration } from './GiftWrappingConfiguration'; -import { SubscriptionInfo } from './SubscriptionInfo'; export interface ICatalogOptions { @@ -9,7 +8,6 @@ export interface ICatalogOptions petPalettes?: CatalogPetPalette[]; clubOffers?: ClubOfferData[]; clubGifts?: ClubGiftInfoParser; - subscriptionInfo?: SubscriptionInfo; giftConfiguration?: GiftWrappingConfiguration; marketplaceConfiguration?: MarketplaceConfigurationMessageParser; } diff --git a/src/components/catalog/common/ICatalogPage.ts b/src/api/catalog/ICatalogPage.ts similarity index 100% rename from src/components/catalog/common/ICatalogPage.ts rename to src/api/catalog/ICatalogPage.ts diff --git a/src/components/catalog/views/page/layout/marketplace/common/IMarketplaceSearchOptions.ts b/src/api/catalog/IMarketplaceSearchOptions.ts similarity index 64% rename from src/components/catalog/views/page/layout/marketplace/common/IMarketplaceSearchOptions.ts rename to src/api/catalog/IMarketplaceSearchOptions.ts index 77734c3a..9489ef0f 100644 --- a/src/components/catalog/views/page/layout/marketplace/common/IMarketplaceSearchOptions.ts +++ b/src/api/catalog/IMarketplaceSearchOptions.ts @@ -1,4 +1,5 @@ -export interface IMarketplaceSearchOptions { +export interface IMarketplaceSearchOptions +{ query: string; type: number; minPrice: number; diff --git a/src/components/catalog/common/IPageLocalization.ts b/src/api/catalog/IPageLocalization.ts similarity index 100% rename from src/components/catalog/common/IPageLocalization.ts rename to src/api/catalog/IPageLocalization.ts diff --git a/src/components/catalog/common/IProduct.ts b/src/api/catalog/IProduct.ts similarity index 100% rename from src/components/catalog/common/IProduct.ts rename to src/api/catalog/IProduct.ts diff --git a/src/components/catalog/common/IPurchasableOffer.ts b/src/api/catalog/IPurchasableOffer.ts similarity index 100% rename from src/components/catalog/common/IPurchasableOffer.ts rename to src/api/catalog/IPurchasableOffer.ts diff --git a/src/components/catalog/common/IPurchaseOptions.ts b/src/api/catalog/IPurchaseOptions.ts similarity index 100% rename from src/components/catalog/common/IPurchaseOptions.ts rename to src/api/catalog/IPurchaseOptions.ts diff --git a/src/components/catalog/views/page/layout/marketplace/common/MarketplaceOfferData.ts b/src/api/catalog/MarketplaceOfferData.ts similarity index 100% rename from src/components/catalog/views/page/layout/marketplace/common/MarketplaceOfferData.ts rename to src/api/catalog/MarketplaceOfferData.ts diff --git a/src/components/catalog/views/page/layout/marketplace/common/MarketplaceOfferState.ts b/src/api/catalog/MarketplaceOfferState.ts similarity index 100% rename from src/components/catalog/views/page/layout/marketplace/common/MarketplaceOfferState.ts rename to src/api/catalog/MarketplaceOfferState.ts diff --git a/src/components/catalog/views/page/layout/marketplace/common/MarketplaceSearchType.ts b/src/api/catalog/MarketplaceSearchType.ts similarity index 100% rename from src/components/catalog/views/page/layout/marketplace/common/MarketplaceSearchType.ts rename to src/api/catalog/MarketplaceSearchType.ts diff --git a/src/components/catalog/common/Offer.ts b/src/api/catalog/Offer.ts similarity index 98% rename from src/components/catalog/common/Offer.ts rename to src/api/catalog/Offer.ts index b39ed48f..c14d6ac1 100644 --- a/src/components/catalog/common/Offer.ts +++ b/src/api/catalog/Offer.ts @@ -1,9 +1,8 @@ -import { GetFurnitureData, GetProductDataForLocalization, LocalizeText } from '../../../api'; +import { GetFurnitureData, GetProductDataForLocalization, LocalizeText, ProductTypeEnum } from '..'; import { ICatalogPage } from './ICatalogPage'; import { IProduct } from './IProduct'; import { IPurchasableOffer } from './IPurchasableOffer'; import { Product } from './Product'; -import { ProductTypeEnum } from './ProductTypeEnum'; export class Offer implements IPurchasableOffer { diff --git a/src/components/catalog/common/PageLocalization.ts b/src/api/catalog/PageLocalization.ts similarity index 94% rename from src/components/catalog/common/PageLocalization.ts rename to src/api/catalog/PageLocalization.ts index 6a51830d..91e3ce6f 100644 --- a/src/components/catalog/common/PageLocalization.ts +++ b/src/api/catalog/PageLocalization.ts @@ -1,4 +1,4 @@ -import { GetConfiguration } from '../../../api'; +import { GetConfiguration } from '../nitro'; import { IPageLocalization } from './IPageLocalization'; export class PageLocalization implements IPageLocalization diff --git a/src/api/catalog/PlacedObjectPurchaseData.ts b/src/api/catalog/PlacedObjectPurchaseData.ts new file mode 100644 index 00000000..84bad8cd --- /dev/null +++ b/src/api/catalog/PlacedObjectPurchaseData.ts @@ -0,0 +1,41 @@ +import { IFurnitureData, IProductData } from '@nitrots/nitro-renderer'; +import { IPurchasableOffer } from './IPurchasableOffer'; + +export class PlacedObjectPurchaseData +{ + constructor( + public readonly roomId: number, + public readonly objectId: number, + public readonly category: number, + public readonly wallLocation: string, + public readonly x: number, + public readonly y: number, + public readonly direction: number, + public readonly offer: IPurchasableOffer) + {} + + public get offerId(): number + { + return this.offer.offerId; + } + + public get productClassId(): number + { + return this.offer.product.productClassId; + } + + public get productData(): IProductData + { + return this.offer.product.productData; + } + + public get furniData(): IFurnitureData + { + return this.offer.product.furnitureData; + } + + public get extraParam(): string + { + return this.offer.product.extraParam; + } +} diff --git a/src/components/catalog/common/Product.ts b/src/api/catalog/Product.ts similarity index 99% rename from src/components/catalog/common/Product.ts rename to src/api/catalog/Product.ts index e0e8f079..bfb760fc 100644 --- a/src/components/catalog/common/Product.ts +++ b/src/api/catalog/Product.ts @@ -1,5 +1,5 @@ import { IFurnitureData, IObjectData, IProductData } from '@nitrots/nitro-renderer'; -import { GetConfiguration, GetRoomEngine, GetSessionDataManager } from '../../../api'; +import { GetConfiguration, GetRoomEngine, GetSessionDataManager } from '../nitro'; import { GetPixelEffectIcon, GetSubscriptionProductIcon } from './CatalogUtilities'; import { IProduct } from './IProduct'; import { IPurchasableOffer } from './IPurchasableOffer'; diff --git a/src/api/catalog/ProductTypeEnum.ts b/src/api/catalog/ProductTypeEnum.ts new file mode 100644 index 00000000..f2490816 --- /dev/null +++ b/src/api/catalog/ProductTypeEnum.ts @@ -0,0 +1,11 @@ +export class ProductTypeEnum +{ + public static WALL: string = 'i'; + public static FLOOR: string = 's'; + public static EFFECT: string = 'e'; + public static HABBO_CLUB: string = 'h'; + public static BADGE: string = 'b'; + public static GAME_TOKEN: string = 'GAME_TOKEN'; + public static PET: string = 'p'; + public static ROBOT: string = 'r'; +} diff --git a/src/components/catalog/common/RequestedPage.ts b/src/api/catalog/RequestedPage.ts similarity index 100% rename from src/components/catalog/common/RequestedPage.ts rename to src/api/catalog/RequestedPage.ts diff --git a/src/components/catalog/common/SearchResult.ts b/src/api/catalog/SearchResult.ts similarity index 79% rename from src/components/catalog/common/SearchResult.ts rename to src/api/catalog/SearchResult.ts index 4083c699..419f3cf4 100644 --- a/src/components/catalog/common/SearchResult.ts +++ b/src/api/catalog/SearchResult.ts @@ -6,6 +6,6 @@ export class SearchResult constructor( public readonly searchValue: string, public readonly offers: IPurchasableOffer[], - public readonly filteredNodes: ICatalogNode[] - ) {} + public readonly filteredNodes: ICatalogNode[]) + {} } diff --git a/src/api/catalog/index.ts b/src/api/catalog/index.ts new file mode 100644 index 00000000..6c5b9e2e --- /dev/null +++ b/src/api/catalog/index.ts @@ -0,0 +1,29 @@ +export * from './BuilderFurniPlaceableStatus'; +export * from './CatalogNode'; +export * from './CatalogPage'; +export * from './CatalogPageName'; +export * from './CatalogPetPalette'; +export * from './CatalogPurchaseState'; +export * from './CatalogType'; +export * from './CatalogUtilities'; +export * from './FurnitureOffer'; +export * from './GetImageIconUrlForProduct'; +export * from './GiftWrappingConfiguration'; +export * from './ICatalogNode'; +export * from './ICatalogOptions'; +export * from './ICatalogPage'; +export * from './IMarketplaceSearchOptions'; +export * from './IPageLocalization'; +export * from './IProduct'; +export * from './IPurchasableOffer'; +export * from './IPurchaseOptions'; +export * from './MarketplaceOfferData'; +export * from './MarketplaceOfferState'; +export * from './MarketplaceSearchType'; +export * from './Offer'; +export * from './PageLocalization'; +export * from './PlacedObjectPurchaseData'; +export * from './Product'; +export * from './ProductTypeEnum'; +export * from './RequestedPage'; +export * from './SearchResult'; diff --git a/src/components/chat-history/common/ChatEntryType.ts b/src/api/chat-history/ChatEntryType.ts similarity index 76% rename from src/components/chat-history/common/ChatEntryType.ts rename to src/api/chat-history/ChatEntryType.ts index c49cd0ea..045f00ce 100644 --- a/src/components/chat-history/common/ChatEntryType.ts +++ b/src/api/chat-history/ChatEntryType.ts @@ -2,4 +2,5 @@ export class ChatEntryType { public static TYPE_CHAT = 1; public static TYPE_ROOM_INFO = 2; + public static TYPE_IM = 3; } diff --git a/src/api/chat-history/ChatHistoryCurrentDate.ts b/src/api/chat-history/ChatHistoryCurrentDate.ts new file mode 100644 index 00000000..6947bca4 --- /dev/null +++ b/src/api/chat-history/ChatHistoryCurrentDate.ts @@ -0,0 +1,6 @@ +export const ChatHistoryCurrentDate = () => +{ + const currentTime = new Date(); + + return `${ currentTime.getHours().toString().padStart(2, '0') }:${ currentTime.getMinutes().toString().padStart(2, '0') }`; +} diff --git a/src/components/chat-history/common/IChatEntry.ts b/src/api/chat-history/IChatEntry.ts similarity index 100% rename from src/components/chat-history/common/IChatEntry.ts rename to src/api/chat-history/IChatEntry.ts diff --git a/src/api/chat-history/IRoomHistoryEntry.ts b/src/api/chat-history/IRoomHistoryEntry.ts new file mode 100644 index 00000000..4986154a --- /dev/null +++ b/src/api/chat-history/IRoomHistoryEntry.ts @@ -0,0 +1,5 @@ +export interface IRoomHistoryEntry +{ + id: number; + name: string; +} diff --git a/src/api/chat-history/MessengerHistoryCurrentDate.ts b/src/api/chat-history/MessengerHistoryCurrentDate.ts new file mode 100644 index 00000000..3aeebc50 --- /dev/null +++ b/src/api/chat-history/MessengerHistoryCurrentDate.ts @@ -0,0 +1,6 @@ +export const MessengerHistoryCurrentDate = (secondsSinceNow: number = 0) => +{ + const currentTime = secondsSinceNow ? new Date(Date.now() - secondsSinceNow * 1000) : new Date(); + + return `${ currentTime.getHours().toString().padStart(2, '0') }:${ currentTime.getMinutes().toString().padStart(2, '0') }`; +} diff --git a/src/api/chat-history/index.ts b/src/api/chat-history/index.ts new file mode 100644 index 00000000..a9893744 --- /dev/null +++ b/src/api/chat-history/index.ts @@ -0,0 +1,5 @@ +export * from './ChatEntryType'; +export * from './ChatHistoryCurrentDate'; +export * from './IChatEntry'; +export * from './IRoomHistoryEntry'; +export * from './MessengerHistoryCurrentDate'; diff --git a/src/api/common/index.ts b/src/api/common/index.ts deleted file mode 100644 index 8fa51bfb..00000000 --- a/src/api/common/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ProductImageUtility'; diff --git a/src/api/events/DispatchEvent.ts b/src/api/events/DispatchEvent.ts new file mode 100644 index 00000000..79e2f5ce --- /dev/null +++ b/src/api/events/DispatchEvent.ts @@ -0,0 +1,3 @@ +import { IEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer'; + +export const DispatchEvent = (eventDispatcher: IEventDispatcher, event: NitroEvent) => eventDispatcher.dispatchEvent(event); diff --git a/src/api/events/DispatchMainEvent.ts b/src/api/events/DispatchMainEvent.ts new file mode 100644 index 00000000..385a888e --- /dev/null +++ b/src/api/events/DispatchMainEvent.ts @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { GetNitroInstance } from '../nitro'; +import { DispatchEvent } from './DispatchEvent'; + +export const DispatchMainEvent = (event: NitroEvent) => DispatchEvent(GetNitroInstance().events, event); diff --git a/src/api/events/DispatchUiEvent.ts b/src/api/events/DispatchUiEvent.ts new file mode 100644 index 00000000..5200bb4f --- /dev/null +++ b/src/api/events/DispatchUiEvent.ts @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { DispatchEvent } from './DispatchEvent'; +import { UI_EVENT_DISPATCHER } from './UI_EVENT_DISPATCHER'; + +export const DispatchUiEvent = (event: NitroEvent) => DispatchEvent(UI_EVENT_DISPATCHER, event); diff --git a/src/hooks/events/ui/UiEventDispatcher.ts b/src/api/events/UI_EVENT_DISPATCHER.ts similarity index 100% rename from src/hooks/events/ui/UiEventDispatcher.ts rename to src/api/events/UI_EVENT_DISPATCHER.ts diff --git a/src/api/events/index.ts b/src/api/events/index.ts new file mode 100644 index 00000000..b7c22ee5 --- /dev/null +++ b/src/api/events/index.ts @@ -0,0 +1,4 @@ +export * from './DispatchEvent'; +export * from './DispatchMainEvent'; +export * from './DispatchUiEvent'; +export * from './UI_EVENT_DISPATCHER'; diff --git a/src/api/friends/GetGroupChatData.ts b/src/api/friends/GetGroupChatData.ts new file mode 100644 index 00000000..75df9629 --- /dev/null +++ b/src/api/friends/GetGroupChatData.ts @@ -0,0 +1,13 @@ +import { IGroupChatData } from './IGroupChatData'; + +export const GetGroupChatData = (extraData: string) => +{ + if(!extraData || !extraData.length) return null; + + const splitData = extraData.split('/'); + const username = splitData[0]; + const figure = splitData[1]; + const userId = parseInt(splitData[2]); + + return ({ username: username, figure: figure, userId: userId } as IGroupChatData); +} diff --git a/src/api/friends/IGroupChatData.ts b/src/api/friends/IGroupChatData.ts new file mode 100644 index 00000000..24a3f9cf --- /dev/null +++ b/src/api/friends/IGroupChatData.ts @@ -0,0 +1,6 @@ +export interface IGroupChatData +{ + username: string; + figure: string; + userId: number; +} diff --git a/src/components/friends/common/MessengerFriend.ts b/src/api/friends/MessengerFriend.ts similarity index 96% rename from src/components/friends/common/MessengerFriend.ts rename to src/api/friends/MessengerFriend.ts index 2ed3c655..b5cfc887 100644 --- a/src/components/friends/common/MessengerFriend.ts +++ b/src/api/friends/MessengerFriend.ts @@ -2,7 +2,7 @@ import { FriendParser } from '@nitrots/nitro-renderer'; export class MessengerFriend { - public static RELATIONSHIP_NONE: number = 0; + public static RELATIONSHIP_NONE: number = 0; public static RELATIONSHIP_HEART: number = 1; public static RELATIONSHIP_SMILE: number = 2; public static RELATIONSHIP_BOBBA: number = 3; diff --git a/src/components/friends/common/GroupType.ts b/src/api/friends/MessengerGroupType.ts similarity index 74% rename from src/components/friends/common/GroupType.ts rename to src/api/friends/MessengerGroupType.ts index 0cbc1a43..d46a1b63 100644 --- a/src/components/friends/common/GroupType.ts +++ b/src/api/friends/MessengerGroupType.ts @@ -1,4 +1,4 @@ -export class GroupType +export class MessengerGroupType { public static readonly GROUP_CHAT = 0; public static readonly PRIVATE_CHAT = 1; diff --git a/src/api/friends/MessengerIconState.ts b/src/api/friends/MessengerIconState.ts new file mode 100644 index 00000000..63f8c133 --- /dev/null +++ b/src/api/friends/MessengerIconState.ts @@ -0,0 +1,6 @@ +export class MessengerIconState +{ + public static HIDDEN: number = 0; + public static SHOW: number = 1; + public static UNREAD: number = 2; +} diff --git a/src/components/friends/common/MessengerRequest.ts b/src/api/friends/MessengerRequest.ts similarity index 75% rename from src/components/friends/common/MessengerRequest.ts rename to src/api/friends/MessengerRequest.ts index 2e7dbfa2..89ceec5b 100644 --- a/src/components/friends/common/MessengerRequest.ts +++ b/src/api/friends/MessengerRequest.ts @@ -11,10 +11,10 @@ export class MessengerRequest { if(!data) return false; - this._id = data.requestId; - this._name = data.requesterName; - this._figureString = data.figureString; - this._requesterUserId = data.requesterUserId; + this._id = data.requestId; + this._name = data.requesterName; + this._figureString = data.figureString; + this._requesterUserId = data.requesterUserId; return true; } diff --git a/src/components/friends/common/MessengerSettings.ts b/src/api/friends/MessengerSettings.ts similarity index 80% rename from src/components/friends/common/MessengerSettings.ts rename to src/api/friends/MessengerSettings.ts index bc9b6f4e..e0fc8c24 100644 --- a/src/components/friends/common/MessengerSettings.ts +++ b/src/api/friends/MessengerSettings.ts @@ -6,5 +6,6 @@ export class MessengerSettings public userFriendLimit: number = 0, public normalFriendLimit: number = 0, public extendedFriendLimit: number = 0, - public categories: FriendCategoryData[] = []) {} + public categories: FriendCategoryData[] = []) + {} } diff --git a/src/components/friends/common/MessengerThread.ts b/src/api/friends/MessengerThread.ts similarity index 77% rename from src/components/friends/common/MessengerThread.ts rename to src/api/friends/MessengerThread.ts index a1bfe0e7..405ea338 100644 --- a/src/components/friends/common/MessengerThread.ts +++ b/src/api/friends/MessengerThread.ts @@ -1,50 +1,46 @@ -import { LocalizeText } from '../../../api'; -import { GroupType } from './GroupType'; +import { GetGroupChatData } from './GetGroupChatData'; import { MessengerFriend } from './MessengerFriend'; +import { MessengerGroupType } from './MessengerGroupType'; import { MessengerThreadChat } from './MessengerThreadChat'; import { MessengerThreadChatGroup } from './MessengerThreadChatGroup'; -import { getGroupChatData } from './Utils'; export class MessengerThread { public static MESSAGE_RECEIVED: string = 'MT_MESSAGE_RECEIVED'; + public static THREAD_ID: number = 0; + private _threadId: number; private _participant: MessengerFriend; private _groups: MessengerThreadChatGroup[]; private _lastUpdated: Date; private _unreadCount: number; - constructor(participant: MessengerFriend, isNew: boolean = true) + constructor(participant: MessengerFriend) { + this._threadId = ++MessengerThread.THREAD_ID; this._participant = participant; this._groups = []; this._lastUpdated = new Date(); this._unreadCount = 0; - - if(isNew) - { - this.addMessage(null, LocalizeText('messenger.moderationinfo'), 0, null, MessengerThreadChat.SECURITY_NOTIFICATION); - - this._unreadCount = 0; - } } public addMessage(senderId: number, message: string, secondsSinceSent: number = 0, extraData: string = null, type: number = 0): MessengerThreadChat { const isGroupChat = (senderId < 0 && extraData); - const userId = isGroupChat ? getGroupChatData(extraData).userId : senderId; + const userId = isGroupChat ? GetGroupChatData(extraData).userId : senderId; const group = this.getLastGroup(userId); if(!group) return; - if(isGroupChat) group.type = GroupType.GROUP_CHAT; + if(isGroupChat) group.type = MessengerGroupType.GROUP_CHAT; const chat = new MessengerThreadChat(senderId, message, secondsSinceSent, extraData, type); group.addChat(chat); this._lastUpdated = new Date(); + this._unreadCount++; return chat; @@ -68,6 +64,11 @@ export class MessengerThread this._unreadCount = 0; } + public get threadId(): number + { + return this._threadId; + } + public get participant(): MessengerFriend { return this._participant; @@ -90,6 +91,6 @@ export class MessengerThread public get unread(): boolean { - return this._unreadCount > 0; + return (this._unreadCount > 0); } } diff --git a/src/components/friends/common/MessengerThreadChat.ts b/src/api/friends/MessengerThreadChat.ts similarity index 100% rename from src/components/friends/common/MessengerThreadChat.ts rename to src/api/friends/MessengerThreadChat.ts diff --git a/src/components/friends/common/MessengerThreadChatGroup.ts b/src/api/friends/MessengerThreadChatGroup.ts similarity index 84% rename from src/components/friends/common/MessengerThreadChatGroup.ts rename to src/api/friends/MessengerThreadChatGroup.ts index b1eb9a60..1668aedc 100644 --- a/src/components/friends/common/MessengerThreadChatGroup.ts +++ b/src/api/friends/MessengerThreadChatGroup.ts @@ -1,4 +1,4 @@ -import { GroupType } from './GroupType'; +import { MessengerGroupType } from './MessengerGroupType'; import { MessengerThreadChat } from './MessengerThreadChat'; export class MessengerThreadChatGroup @@ -7,7 +7,7 @@ export class MessengerThreadChatGroup private _chats: MessengerThreadChat[]; private _type: number; - constructor(userId: number, type = GroupType.PRIVATE_CHAT) + constructor(userId: number, type = MessengerGroupType.PRIVATE_CHAT) { this._userId = userId; this._chats = []; diff --git a/src/api/friends/OpenMessengerChat.ts b/src/api/friends/OpenMessengerChat.ts index 37e0bc3c..9270981c 100644 --- a/src/api/friends/OpenMessengerChat.ts +++ b/src/api/friends/OpenMessengerChat.ts @@ -2,6 +2,6 @@ import { CreateLinkEvent } from '..'; export function OpenMessengerChat(friendId: number = 0): void { - if(friendId === 0) CreateLinkEvent('friends/messenger/open'); - else CreateLinkEvent(`friends/messenger/${friendId}`); + if(friendId === 0) CreateLinkEvent('friends-messenger/toggle'); + else CreateLinkEvent(`friends-messenger/${ friendId }`); } diff --git a/src/api/friends/index.ts b/src/api/friends/index.ts index ffb458ee..ce1ed60a 100644 --- a/src/api/friends/index.ts +++ b/src/api/friends/index.ts @@ -1 +1,11 @@ +export * from './GetGroupChatData'; +export * from './IGroupChatData'; +export * from './MessengerFriend'; +export * from './MessengerGroupType'; +export * from './MessengerIconState'; +export * from './MessengerRequest'; +export * from './MessengerSettings'; +export * from './MessengerThread'; +export * from './MessengerThreadChat'; +export * from './MessengerThreadChatGroup'; export * from './OpenMessengerChat'; diff --git a/src/api/groups/GetGroupManager.ts b/src/api/groups/GetGroupManager.ts index bd5a6c70..d372ace2 100644 --- a/src/api/groups/GetGroupManager.ts +++ b/src/api/groups/GetGroupManager.ts @@ -2,5 +2,5 @@ import { CreateLinkEvent } from '..'; export function GetGroupManager(groupId: number): void { - CreateLinkEvent(`groups/manage/${groupId}`); + CreateLinkEvent(`groups/manage/${ groupId }`); } diff --git a/src/components/groups/common/GroupBadgePart.ts b/src/api/groups/GroupBadgePart.ts similarity index 90% rename from src/components/groups/common/GroupBadgePart.ts rename to src/api/groups/GroupBadgePart.ts index 3e24ed6f..3b74875f 100644 --- a/src/components/groups/common/GroupBadgePart.ts +++ b/src/api/groups/GroupBadgePart.ts @@ -1,3 +1,4 @@ + export class GroupBadgePart { public static BASE: string = 'b'; @@ -18,7 +19,7 @@ export class GroupBadgePart public get code(): string { - if(this.key === 0) return null; + if((this.key === 0) && (this.type !== GroupBadgePart.BASE)) return null; return GroupBadgePart.getCode(this.type, this.key, this.color, this.position); } diff --git a/src/components/groups/common/GroupMembershipType.ts b/src/api/groups/GroupMembershipType.ts similarity index 100% rename from src/components/groups/common/GroupMembershipType.ts rename to src/api/groups/GroupMembershipType.ts diff --git a/src/components/groups/common/GroupType.ts b/src/api/groups/GroupType.ts similarity index 100% rename from src/components/groups/common/GroupType.ts rename to src/api/groups/GroupType.ts diff --git a/src/components/groups/common/IGroupCustomize.ts b/src/api/groups/IGroupCustomize.ts similarity index 100% rename from src/components/groups/common/IGroupCustomize.ts rename to src/api/groups/IGroupCustomize.ts diff --git a/src/components/groups/common/IGroupData.ts b/src/api/groups/IGroupData.ts similarity index 100% rename from src/components/groups/common/IGroupData.ts rename to src/api/groups/IGroupData.ts diff --git a/src/api/groups/index.ts b/src/api/groups/index.ts index 2f528cab..4842948b 100644 --- a/src/api/groups/index.ts +++ b/src/api/groups/index.ts @@ -1,5 +1,10 @@ export * from './GetGroupInformation'; export * from './GetGroupManager'; export * from './GetGroupMembers'; +export * from './GroupBadgePart'; +export * from './GroupMembershipType'; +export * from './GroupType'; +export * from './IGroupCustomize'; +export * from './IGroupData'; export * from './ToggleFavoriteGroup'; export * from './TryJoinGroup'; diff --git a/src/components/guide-tool/common/GuideSessionState.ts b/src/api/guide-tool/GuideSessionState.ts similarity index 100% rename from src/components/guide-tool/common/GuideSessionState.ts rename to src/api/guide-tool/GuideSessionState.ts diff --git a/src/components/guide-tool/common/GuideToolMessage.ts b/src/api/guide-tool/GuideToolMessage.ts similarity index 100% rename from src/components/guide-tool/common/GuideToolMessage.ts rename to src/api/guide-tool/GuideToolMessage.ts diff --git a/src/components/guide-tool/common/GuideToolMessageGroup.ts b/src/api/guide-tool/GuideToolMessageGroup.ts similarity index 100% rename from src/components/guide-tool/common/GuideToolMessageGroup.ts rename to src/api/guide-tool/GuideToolMessageGroup.ts diff --git a/src/api/guide-tool/index.ts b/src/api/guide-tool/index.ts new file mode 100644 index 00000000..1400adc9 --- /dev/null +++ b/src/api/guide-tool/index.ts @@ -0,0 +1,3 @@ +export * from './GuideSessionState'; +export * from './GuideToolMessage'; +export * from './GuideToolMessageGroup'; diff --git a/src/components/hc-center/common/ClubStatus.ts b/src/api/hc-center/ClubStatus.ts similarity index 100% rename from src/components/hc-center/common/ClubStatus.ts rename to src/api/hc-center/ClubStatus.ts diff --git a/src/api/hc-center/GetClubBadge.ts b/src/api/hc-center/GetClubBadge.ts new file mode 100644 index 00000000..6b779e0f --- /dev/null +++ b/src/api/hc-center/GetClubBadge.ts @@ -0,0 +1,11 @@ +const DEFAULT_BADGE: string = 'HC1'; +const BADGES: string[] = [ 'ACH_VipHC1', 'ACH_VipHC2', 'ACH_VipHC3', 'ACH_VipHC4', 'ACH_VipHC5', 'HC1', 'HC2', 'HC3', 'HC4', 'HC5' ]; + +export const GetClubBadge = (badgeCodes: string[]) => +{ + let badgeCode: string = null; + + BADGES.forEach(badge => ((badgeCodes.indexOf(badge) > -1) && (badgeCode = badge))); + + return (badgeCode || DEFAULT_BADGE); +} diff --git a/src/api/hc-center/index.ts b/src/api/hc-center/index.ts new file mode 100644 index 00000000..cee8f692 --- /dev/null +++ b/src/api/hc-center/index.ts @@ -0,0 +1,2 @@ +export * from './ClubStatus'; +export * from './GetClubBadge'; diff --git a/src/components/help/common/CallForHelpResult.ts b/src/api/help/CallForHelpResult.ts similarity index 100% rename from src/components/help/common/CallForHelpResult.ts rename to src/api/help/CallForHelpResult.ts diff --git a/src/components/help/common/GetCloseReasonKey.ts b/src/api/help/GetCloseReasonKey.ts similarity index 100% rename from src/components/help/common/GetCloseReasonKey.ts rename to src/api/help/GetCloseReasonKey.ts diff --git a/src/api/help/IHelpReport.ts b/src/api/help/IHelpReport.ts new file mode 100644 index 00000000..86117072 --- /dev/null +++ b/src/api/help/IHelpReport.ts @@ -0,0 +1,19 @@ +import { IChatEntry } from '../chat-history'; + +export interface IHelpReport +{ + reportType: number; + reportedUserId: number; + reportedChats: IChatEntry[]; + cfhCategory: number; + cfhTopic: number; + roomId: number; + roomName: string; + groupId: number; + threadId: number; + messageId: number; + extraData: string; + roomObjectId: number; + message: string; + currentStep: number; +} diff --git a/src/components/help/common/IReportedUser.ts b/src/api/help/IReportedUser.ts similarity index 100% rename from src/components/help/common/IReportedUser.ts rename to src/api/help/IReportedUser.ts diff --git a/src/api/help/ReportState.ts b/src/api/help/ReportState.ts new file mode 100644 index 00000000..ae3a3bd3 --- /dev/null +++ b/src/api/help/ReportState.ts @@ -0,0 +1,8 @@ +export class ReportState +{ + public static readonly SELECT_USER = 0; + public static readonly SELECT_CHATS = 1; + public static readonly SELECT_TOPICS = 2; + public static readonly INPUT_REPORT_MESSAGE = 3; + public static readonly REPORT_SUMMARY = 4; +} diff --git a/src/api/help/ReportType.ts b/src/api/help/ReportType.ts new file mode 100644 index 00000000..24eb7aec --- /dev/null +++ b/src/api/help/ReportType.ts @@ -0,0 +1,11 @@ +export class ReportType +{ + public static readonly EMERGENCY = 1; + public static readonly GUIDE = 2; + public static readonly IM = 3; + public static readonly ROOM = 4; + public static readonly BULLY = 6; + public static readonly THREAD = 7; + public static readonly MESSAGE = 8; + public static readonly PHOTO = 9; +} diff --git a/src/api/help/index.ts b/src/api/help/index.ts new file mode 100644 index 00000000..6fa20455 --- /dev/null +++ b/src/api/help/index.ts @@ -0,0 +1,6 @@ +export * from './CallForHelpResult'; +export * from './GetCloseReasonKey'; +export * from './IHelpReport'; +export * from './IReportedUser'; +export * from './ReportState'; +export * from './ReportType'; diff --git a/src/api/index.ts b/src/api/index.ts index f44592e6..af964444 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,17 +1,29 @@ -export * from './common'; -export * from './core'; +export * from './achievements'; +export * from './avatar'; +export * from './camera'; +export * from './campaign'; +export * from './catalog'; +export * from './chat-history'; +export * from './events'; export * from './friends'; +export * from './GetRendererVersion'; +export * from './GetUIVersion'; export * from './groups'; +export * from './guide-tool'; +export * from './hc-center'; +export * from './help'; +export * from './inventory'; +export * from './mod-tools'; export * from './navigator'; export * from './nitro'; export * from './nitro/avatar'; export * from './nitro/camera'; +export * from './nitro/core'; export * from './nitro/room'; -export * from './nitro/room/widgets'; -export * from './nitro/room/widgets/events'; -export * from './nitro/room/widgets/handlers'; -export * from './nitro/room/widgets/messages'; export * from './nitro/session'; export * from './notification'; +export * from './purse'; +export * from './room'; export * from './user'; export * from './utils'; +export * from './wired'; diff --git a/src/components/inventory/common/FurniCategory.ts b/src/api/inventory/FurniCategory.ts similarity index 100% rename from src/components/inventory/common/FurniCategory.ts rename to src/api/inventory/FurniCategory.ts diff --git a/src/components/inventory/common/FurnitureItem.ts b/src/api/inventory/FurnitureItem.ts similarity index 77% rename from src/components/inventory/common/FurnitureItem.ts rename to src/api/inventory/FurnitureItem.ts index 0cf0d457..2ad27ce5 100644 --- a/src/components/inventory/common/FurnitureItem.ts +++ b/src/api/inventory/FurnitureItem.ts @@ -1,5 +1,5 @@ import { IFurnitureItemData, IObjectData } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../../../api'; +import { GetNitroInstance } from '../nitro'; import { IFurnitureItem } from './IFurnitureItem'; export class FurnitureItem implements IFurnitureItem @@ -31,28 +31,28 @@ export class FurnitureItem implements IFurnitureItem { if(!parser) return; - this._locked = false; - this._id = parser.itemId; - this._type = parser.spriteId; - this._ref = parser.ref; - this._category = parser.category; - this._groupable = ((parser.isGroupable) && (!(parser.rentable))); - this._tradeable = parser.tradable; - this._recyclable = parser.isRecycleable; - this._sellable = parser.sellable; - this._stuffData = parser.stuffData; - this._extra = parser.extra; - this._secondsToExpiration = parser.secondsToExpiration; - this._expirationTimeStamp = parser.expirationTimeStamp; - this._hasRentPeriodStarted = parser.hasRentPeriodStarted; - this._creationDay = parser.creationDay; - this._creationMonth = parser.creationMonth; - this._creationYear = parser.creationYear; - this._slotId = parser.slotId; - this._songId = parser.songId; - this._flatId = parser.flatId; - this._isRented = parser.rentable; - this._isWallItem = parser.isWallItem; + this._locked = false; + this._id = parser.itemId; + this._type = parser.spriteId; + this._ref = parser.ref; + this._category = parser.category; + this._groupable = ((parser.isGroupable) && (!(parser.rentable))); + this._tradeable = parser.tradable; + this._recyclable = parser.isRecycleable; + this._sellable = parser.sellable; + this._stuffData = parser.stuffData; + this._extra = parser.extra; + this._secondsToExpiration = parser.secondsToExpiration; + this._expirationTimeStamp = parser.expirationTimeStamp; + this._hasRentPeriodStarted = parser.hasRentPeriodStarted; + this._creationDay = parser.creationDay; + this._creationMonth = parser.creationMonth; + this._creationYear = parser.creationYear; + this._slotId = parser.slotId; + this._songId = parser.songId; + this._flatId = parser.flatId; + this._isRented = parser.rentable; + this._isWallItem = parser.isWallItem; } public get rentable(): boolean @@ -95,7 +95,7 @@ export class FurnitureItem implements IFurnitureItem return this._extra; } - public get _Str_16260(): boolean + public get recyclable(): boolean { return this._recyclable; } @@ -135,17 +135,17 @@ export class FurnitureItem implements IFurnitureItem return time; } - public get _Str_8932(): number + public get creationDay(): number { return this._creationDay; } - public get _Str_9050(): number + public get creationMonth(): number { return this._creationMonth; } - public get _Str_9408(): number + public get creationYear(): number { return this._creationYear; } @@ -155,7 +155,7 @@ export class FurnitureItem implements IFurnitureItem return this._slotId; } - public get _Str_3951(): number + public get songId(): number { return this._songId; } @@ -185,7 +185,7 @@ export class FurnitureItem implements IFurnitureItem return this._hasRentPeriodStarted; } - public get _Str_10616(): number + public get expirationTimeStamp(): number { return this._expirationTimeStamp; } diff --git a/src/api/inventory/FurnitureUtilities.ts b/src/api/inventory/FurnitureUtilities.ts new file mode 100644 index 00000000..741f1ea1 --- /dev/null +++ b/src/api/inventory/FurnitureUtilities.ts @@ -0,0 +1,172 @@ +import { FurnitureListItemParser, IObjectData } from '@nitrots/nitro-renderer'; +import { GetRoomEngine } from '../nitro'; +import { FurniCategory } from './FurniCategory'; +import { FurnitureItem } from './FurnitureItem'; +import { GroupItem } from './GroupItem'; + +export const createGroupItem = (type: number, category: number, stuffData: IObjectData, extra: number = NaN) => new GroupItem(type, category, GetRoomEngine(), stuffData, extra); + +const addSingleFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: boolean) => +{ + const groupItems: GroupItem[] = []; + + for(const groupItem of set) + { + if(groupItem.type === item.type) groupItems.push(groupItem); + } + + for(const groupItem of groupItems) + { + if(groupItem.getItemById(item.id)) return groupItem; + } + + const groupItem = createGroupItem(item.type, item.category, item.stuffData, item.extra); + + groupItem.push(item); + + if(unseen) + { + groupItem.hasUnseenItems = true; + + set.unshift(groupItem); + } + else + { + set.push(groupItem); + } + + return groupItem; +} + +const addGroupableFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: boolean) => +{ + let existingGroup: GroupItem = null; + + for(const groupItem of set) + { + if((groupItem.type === item.type) && (groupItem.isWallItem === item.isWallItem) && groupItem.isGroupable) + { + if(item.category === FurniCategory.POSTER) + { + if(groupItem.stuffData.getLegacyString() === item.stuffData.getLegacyString()) + { + existingGroup = groupItem; + + break; + } + } + + else if(item.category === FurniCategory.GUILD_FURNI) + { + if(item.stuffData.compare(groupItem.stuffData)) + { + existingGroup = groupItem; + + break; + } + } + + else + { + existingGroup = groupItem; + + break; + } + } + } + + if(existingGroup) + { + existingGroup.push(item); + + if(unseen) + { + existingGroup.hasUnseenItems = true; + + const index = set.indexOf(existingGroup); + + if(index >= 0) set.splice(index, 1); + + set.unshift(existingGroup); + } + + return existingGroup; + } + + existingGroup = createGroupItem(item.type, item.category, item.stuffData, item.extra); + + existingGroup.push(item); + + if(unseen) + { + existingGroup.hasUnseenItems = true; + + set.unshift(existingGroup); + } + else + { + set.push(existingGroup); + } + + return existingGroup; +} + +export const addFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: boolean) => +{ + if(!item.isGroupable) + { + addSingleFurnitureItem(set, item, unseen); + } + else + { + addGroupableFurnitureItem(set, item, unseen); + } +} + +export const mergeFurniFragments = (fragment: Map, totalFragments: number, fragmentNumber: number, fragments: Map[]) => +{ + if(totalFragments === 1) return fragment; + + fragments[fragmentNumber] = fragment; + + for(const frag of fragments) + { + if(!frag) return null; + } + + const merged: Map = new Map(); + + for(const frag of fragments) + { + for(const [ key, value ] of frag) merged.set(key, value); + + frag.clear(); + } + + fragments = null; + + return merged; +} + +export const getAllItemIds = (groupItems: GroupItem[]) => +{ + const itemIds: number[] = []; + + for(const groupItem of groupItems) + { + let totalCount = groupItem.getTotalCount(); + + if(groupItem.category === FurniCategory.POST_IT) totalCount = 1; + + let i = 0; + + while(i < totalCount) + { + itemIds.push(groupItem.getItemByIndex(i).id); + + i++; + } + } + + return itemIds; +} diff --git a/src/components/inventory/common/GroupItem.ts b/src/api/inventory/GroupItem.ts similarity index 97% rename from src/components/inventory/common/GroupItem.ts rename to src/api/inventory/GroupItem.ts index 2b3598a4..8569321e 100644 --- a/src/components/inventory/common/GroupItem.ts +++ b/src/api/inventory/GroupItem.ts @@ -1,5 +1,5 @@ import { IObjectData, IRoomEngine } from '@nitrots/nitro-renderer'; -import { LocalizeText } from '../../../api'; +import { LocalizeText } from '../utils'; import { FurniCategory } from './FurniCategory'; import { FurnitureItem } from './FurnitureItem'; import { IFurnitureItem } from './IFurnitureItem'; @@ -95,8 +95,8 @@ export class GroupItem if(!furnitureItem) return items; - let found = 0; - let i = 0; + let found = 0; + let i = 0; while(i < this._items.length) { @@ -201,8 +201,8 @@ export class GroupItem { if(this._category === FurniCategory.POST_IT) { - let count = 0; - let index = 0; + let count = 0; + let index = 0; while(index < this._items.length) { @@ -281,8 +281,8 @@ export class GroupItem while(index < items.length) { - const item = items[index]; - const locked = (itemIds.indexOf(item.ref) >= 0); + const item = items[index]; + const locked = (itemIds.indexOf(item.ref) >= 0); if(item.locked !== locked) { diff --git a/src/api/inventory/IBotItem.ts b/src/api/inventory/IBotItem.ts new file mode 100644 index 00000000..0a370ba6 --- /dev/null +++ b/src/api/inventory/IBotItem.ts @@ -0,0 +1,6 @@ +import { BotData } from '@nitrots/nitro-renderer'; + +export interface IBotItem +{ + botData: BotData; +} diff --git a/src/components/inventory/common/IFurnitureItem.ts b/src/api/inventory/IFurnitureItem.ts similarity index 92% rename from src/components/inventory/common/IFurnitureItem.ts rename to src/api/inventory/IFurnitureItem.ts index 7e030c52..435597d2 100644 --- a/src/components/inventory/common/IFurnitureItem.ts +++ b/src/api/inventory/IFurnitureItem.ts @@ -8,7 +8,7 @@ export interface IFurnitureItem stuffData: IObjectData; extra: number; category: number; - _Str_16260: boolean; + recyclable: boolean; isTradable: boolean; isGroupable: boolean; sellable: boolean; diff --git a/src/api/inventory/IPetItem.ts b/src/api/inventory/IPetItem.ts new file mode 100644 index 00000000..910d5dff --- /dev/null +++ b/src/api/inventory/IPetItem.ts @@ -0,0 +1,6 @@ +import { PetData } from '@nitrots/nitro-renderer'; + +export interface IPetItem +{ + petData: PetData; +} diff --git a/src/components/inventory/common/unseen/IUnseenItemTracker.ts b/src/api/inventory/IUnseenItemTracker.ts similarity index 89% rename from src/components/inventory/common/unseen/IUnseenItemTracker.ts rename to src/api/inventory/IUnseenItemTracker.ts index 51872a00..8a70a166 100644 --- a/src/components/inventory/common/unseen/IUnseenItemTracker.ts +++ b/src/api/inventory/IUnseenItemTracker.ts @@ -3,7 +3,6 @@ export interface IUnseenItemTracker dispose(): void; resetCategory(category: number): boolean; resetItems(category: number, itemIds: number[]): boolean; - resetCategoryIfEmpty(category: number): boolean; isUnseen(category: number, itemId: number): boolean; removeUnseen(category: number, itemId: number): boolean; getIds(category: number): number[]; diff --git a/src/api/inventory/InventoryUtilities.ts b/src/api/inventory/InventoryUtilities.ts new file mode 100644 index 00000000..e263b8c8 --- /dev/null +++ b/src/api/inventory/InventoryUtilities.ts @@ -0,0 +1,117 @@ +import { FurniturePlacePaintComposer, RoomObjectCategory, RoomObjectPlacementSource, RoomObjectType } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent, GetRoomEngine, GetRoomSessionManager, SendMessageComposer } from '../nitro'; +import { FurniCategory } from './FurniCategory'; +import { GroupItem } from './GroupItem'; +import { IBotItem } from './IBotItem'; +import { IPetItem } from './IPetItem'; + +let objectMoverRequested = false; +let itemIdInPlacing = -1; + +export const isObjectMoverRequested = () => objectMoverRequested; + +export const setObjectMoverRequested = (flag: boolean) => objectMoverRequested = flag; + +export const getPlacingItemId = () => itemIdInPlacing; + +export const setPlacingItemId = (id: number) => (itemIdInPlacing = id); + +export const cancelRoomObjectPlacement = () => +{ + if(getPlacingItemId() === -1) return; + + GetRoomEngine().cancelRoomObjectPlacement(); + + setPlacingItemId(-1); + setObjectMoverRequested(false); +} + +export const attemptPetPlacement = (petItem: IPetItem, flag: boolean = false) => +{ + const petData = petItem.petData; + + if(!petData) return false; + + const session = GetRoomSessionManager().getSession(1); + + if(!session) return false; + + if(!session.isRoomOwner && !session.allowPets) return false; + + CreateLinkEvent('inventory/hide'); + + if(GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.INVENTORY, -(petData.id), RoomObjectCategory.UNIT, RoomObjectType.PET, petData.figureData.figuredata)) + { + setPlacingItemId(petData.id); + setObjectMoverRequested(true); + } + + return true; +} + +export const attemptItemPlacement = (groupItem: GroupItem, flag: boolean = false) => +{ + if(!groupItem || !groupItem.getUnlockedCount()) return false; + + const item = groupItem.getLastItem(); + + if(!item) return false; + + if((item.category === FurniCategory.FLOOR) || (item.category === FurniCategory.WALL_PAPER) || (item.category === FurniCategory.LANDSCAPE)) + { + if(flag) return false; + + SendMessageComposer(new FurniturePlacePaintComposer(item.id)); + + return false; + } + else + { + CreateLinkEvent('inventory/hide'); + + let category = 0; + let isMoving = false; + + if(item.isWallItem) category = RoomObjectCategory.WALL; + else category = RoomObjectCategory.FLOOR; + + if((item.category === FurniCategory.POSTER)) // or external image from furnidata + { + isMoving = GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.INVENTORY, item.id, category, item.type, item.stuffData.getLegacyString()); + } + else + { + isMoving = GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.INVENTORY, item.id, category, item.type, item.extra.toString(), item.stuffData); + } + + if(isMoving) + { + setPlacingItemId(item.ref); + setObjectMoverRequested(true); + } + } + + return true; +} + + +export const attemptBotPlacement = (botItem: IBotItem, flag: boolean = false) => +{ + const botData = botItem.botData; + + if(!botData) return false; + + const session = GetRoomSessionManager().getSession(1); + + if(!session || !session.isRoomOwner) return false; + + CreateLinkEvent('inventory/hide'); + + if(GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.INVENTORY, -(botData.id), RoomObjectCategory.UNIT, RoomObjectType.RENTABLE_BOT, botData.figure)) + { + setPlacingItemId(botData.id); + setObjectMoverRequested(true); + } + + return true; +} diff --git a/src/api/inventory/PetUtilities.ts b/src/api/inventory/PetUtilities.ts new file mode 100644 index 00000000..881a09e4 --- /dev/null +++ b/src/api/inventory/PetUtilities.ts @@ -0,0 +1,104 @@ +import { PetData } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent } from '../nitro'; +import { cancelRoomObjectPlacement, getPlacingItemId } from './InventoryUtilities'; +import { IPetItem } from './IPetItem'; +import { UnseenItemCategory } from './UnseenItemCategory'; + +export const getAllPetIds = (petItems: IPetItem[]) => petItems.map(item => item.petData.id); + +export const addSinglePetItem = (petData: PetData, set: IPetItem[], unseen: boolean = true) => +{ + const petItem = { petData }; + + if(unseen) + { + //petItem.isUnseen = true; + + set.unshift(petItem); + } + else + { + set.push(petItem); + } + + return petItem; +} + +export const removePetItemById = (id: number, set: IPetItem[]) => +{ + let index = 0; + + while(index < set.length) + { + const petItem = set[index]; + + if(petItem && (petItem.petData.id === id)) + { + if(getPlacingItemId() === petItem.petData.id) + { + cancelRoomObjectPlacement(); + + CreateLinkEvent('inventory/open'); + } + + set.splice(index, 1); + + return petItem; + } + + index++; + } + + return null; +} + +export const processPetFragment = (set: IPetItem[], fragment: Map, isUnseen: (category: number, itemId: number) => boolean) => +{ + const existingIds = getAllPetIds(set); + const addedIds: number[] = []; + const removedIds: number[] = []; + + for(const key of fragment.keys()) (existingIds.indexOf(key) === -1) && addedIds.push(key); + + for(const itemId of existingIds) (!fragment.get(itemId)) && removedIds.push(itemId); + + const emptyExistingSet = (existingIds.length === 0); + + for(const id of removedIds) removePetItemById(id, set); + + for(const id of addedIds) + { + const parser = fragment.get(id); + + if(!parser) continue; + + addSinglePetItem(parser, set, isUnseen(UnseenItemCategory.PET, parser.id)); + } + + return set; +} + +export const mergePetFragments = (fragment: Map, totalFragments: number, fragmentNumber: number, fragments: Map[]) => +{ + if(totalFragments === 1) return fragment; + + fragments[fragmentNumber] = fragment; + + for(const frag of fragments) + { + if(!frag) return null; + } + + const merged: Map = new Map(); + + for(const frag of fragments) + { + for(const [ key, value ] of frag) merged.set(key, value); + + frag.clear(); + } + + fragments = null; + + return merged; +} diff --git a/src/api/inventory/TradeState.ts b/src/api/inventory/TradeState.ts new file mode 100644 index 00000000..3df418ba --- /dev/null +++ b/src/api/inventory/TradeState.ts @@ -0,0 +1,10 @@ +export class TradeState +{ + public static TRADING_STATE_READY: number = 0; + public static TRADING_STATE_RUNNING: number = 1; + public static TRADING_STATE_COUNTDOWN: number = 2; + public static TRADING_STATE_CONFIRMING: number = 3; + public static TRADING_STATE_CONFIRMED: number = 4; + public static TRADING_STATE_COMPLETED: number = 5; + public static TRADING_STATE_CANCELLED: number = 6; +} diff --git a/src/components/inventory/common/TradeUserData.ts b/src/api/inventory/TradeUserData.ts similarity index 64% rename from src/components/inventory/common/TradeUserData.ts rename to src/api/inventory/TradeUserData.ts index b0b337b3..452c7ee5 100644 --- a/src/components/inventory/common/TradeUserData.ts +++ b/src/api/inventory/TradeUserData.ts @@ -6,10 +6,10 @@ export class TradeUserData constructor( public userId: number = -1, public userName: string = '', - public userItems: AdvancedMap = null, + public userItems: AdvancedMap = new AdvancedMap(), public itemCount: number = 0, public creditsCount: number = 0, public accepts: boolean = false, - public canTrade: boolean = false, - public items: AdvancedMap = new AdvancedMap()) {} + public canTrade: boolean = false) + {} } diff --git a/src/api/inventory/TradingNotificationType.ts b/src/api/inventory/TradingNotificationType.ts new file mode 100644 index 00000000..4aed4905 --- /dev/null +++ b/src/api/inventory/TradingNotificationType.ts @@ -0,0 +1,12 @@ +export class TradingNotificationType +{ + public static ALERT_SCAM: number = 0; + public static HOTEL_TRADING_DISABLED = 1; + public static YOU_NOT_ALLOWED: number = 2; + public static THEY_NOT_ALLOWED: number = 4; + public static ROOM_DISABLED: number = 6; + public static YOU_OPEN: number = 7; + public static THEY_OPEN: number = 8; + public static ERROR_WHILE_COMMIT: number = 9; + public static THEY_CANCELLED: number = 10; +} diff --git a/src/api/inventory/TradingUtilities.ts b/src/api/inventory/TradingUtilities.ts new file mode 100644 index 00000000..28ca8c88 --- /dev/null +++ b/src/api/inventory/TradingUtilities.ts @@ -0,0 +1,71 @@ +import { AdvancedMap, IObjectData, ItemDataStructure, StringDataType } from '@nitrots/nitro-renderer'; +import { GetSessionDataManager } from '../nitro'; +import { FurniCategory } from './FurniCategory'; +import { FurnitureItem } from './FurnitureItem'; +import { createGroupItem } from './FurnitureUtilities'; +import { GroupItem } from './GroupItem'; + +const isExternalImage = (spriteId: number) => GetSessionDataManager().getWallItemData(spriteId)?.isExternalImage || false; + +export const parseTradeItems = (items: ItemDataStructure[]) => +{ + const existingItems = new AdvancedMap(); + const totalItems = items.length; + + if(totalItems) + { + for(const item of items) + { + const spriteId = item.spriteId; + const category = item.category; + + let name = (item.furniType + spriteId); + + if(!item.isGroupable || isExternalImage(spriteId)) + { + name = ('itemid' + item.itemId); + } + + if(item.category === FurniCategory.POSTER) + { + name = (item.itemId + 'poster' + item.stuffData.getLegacyString()); + } + + else if(item.category === FurniCategory.GUILD_FURNI) + { + name = ''; + } + + let groupItem = ((item.isGroupable && !isExternalImage(item.spriteId)) ? existingItems.getValue(name) : null); + + if(!groupItem) + { + groupItem = createGroupItem(spriteId, category, item.stuffData); + + existingItems.add(name, groupItem); + } + + groupItem.push(new FurnitureItem(item)); + } + } + + return existingItems; +} + +export const getGuildFurniType = (spriteId: number, stuffData: IObjectData) => +{ + let type = spriteId.toString(); + + if(!(stuffData instanceof StringDataType)) return type; + + let i = 1; + + while(i < 5) + { + type = (type + (',' + stuffData.getValue(i))); + + i++; + } + + return type; +} diff --git a/src/api/inventory/UnseenItemCategory.ts b/src/api/inventory/UnseenItemCategory.ts new file mode 100644 index 00000000..cbd7e9b7 --- /dev/null +++ b/src/api/inventory/UnseenItemCategory.ts @@ -0,0 +1,9 @@ +export class UnseenItemCategory +{ + public static FURNI: number = 1; + public static RENTABLE: number = 2; + public static PET: number = 3; + public static BADGE: number = 4; + public static BOT: number = 5; + public static GAMES: number = 6; +} diff --git a/src/api/inventory/index.ts b/src/api/inventory/index.ts new file mode 100644 index 00000000..76962cfe --- /dev/null +++ b/src/api/inventory/index.ts @@ -0,0 +1,15 @@ +export * from './FurniCategory'; +export * from './FurnitureItem'; +export * from './FurnitureUtilities'; +export * from './GroupItem'; +export * from './IBotItem'; +export * from './IFurnitureItem'; +export * from './InventoryUtilities'; +export * from './IPetItem'; +export * from './IUnseenItemTracker'; +export * from './PetUtilities'; +export * from './TradeState'; +export * from './TradeUserData'; +export * from './TradingNotificationType'; +export * from './TradingUtilities'; +export * from './UnseenItemCategory'; diff --git a/src/components/mod-tools/common/IssueCategoryNames.ts b/src/api/mod-tools/GetIssueCategoryName.ts similarity index 86% rename from src/components/mod-tools/common/IssueCategoryNames.ts rename to src/api/mod-tools/GetIssueCategoryName.ts index bb1ca2c5..81a3f862 100644 --- a/src/components/mod-tools/common/IssueCategoryNames.ts +++ b/src/api/mod-tools/GetIssueCategoryName.ts @@ -1,4 +1,4 @@ -export const getSourceName = (categoryId: number): string => +export const GetIssueCategoryName = (categoryId: number) => { switch(categoryId) { @@ -29,7 +29,7 @@ export const getSourceName = (categoryId: number): string => return 'Photo'; case 15: return 'Ambassador'; - default: - return 'Unknown'; } + + return 'Unknown'; } diff --git a/src/components/mod-tools/common/ISelectedUser.ts b/src/api/mod-tools/ISelectedUser.ts similarity index 57% rename from src/components/mod-tools/common/ISelectedUser.ts rename to src/api/mod-tools/ISelectedUser.ts index c5a657a9..4f6e76b8 100644 --- a/src/components/mod-tools/common/ISelectedUser.ts +++ b/src/api/mod-tools/ISelectedUser.ts @@ -1,4 +1,5 @@ -export interface ISelectedUser { +export interface ISelectedUser +{ userId: number; username: string; } diff --git a/src/components/mod-tools/common/IUserInfo.ts b/src/api/mod-tools/IUserInfo.ts similarity index 100% rename from src/components/mod-tools/common/IUserInfo.ts rename to src/api/mod-tools/IUserInfo.ts diff --git a/src/api/mod-tools/ModActionDefinition.ts b/src/api/mod-tools/ModActionDefinition.ts new file mode 100644 index 00000000..b28aa9ce --- /dev/null +++ b/src/api/mod-tools/ModActionDefinition.ts @@ -0,0 +1,49 @@ +export class ModActionDefinition +{ + public static ALERT: number = 1; + public static MUTE: number = 2; + public static BAN: number = 3; + public static KICK: number = 4; + public static TRADE_LOCK: number = 5; + public static MESSAGE: number = 6; + + private readonly _actionId: number; + private readonly _name: string; + private readonly _actionType: number; + private readonly _sanctionTypeId: number; + private readonly _actionLengthHours: number; + + constructor(actionId: number, actionName: string, actionType: number, sanctionTypeId: number, actionLengthHours:number) + { + this._actionId = actionId; + this._name = actionName; + this._actionType = actionType; + this._sanctionTypeId = sanctionTypeId; + this._actionLengthHours = actionLengthHours; + } + + public get actionId(): number + { + return this._actionId; + } + + public get name(): string + { + return this._name; + } + + public get actionType(): number + { + return this._actionType; + } + + public get sanctionTypeId(): number + { + return this._sanctionTypeId; + } + + public get actionLengthHours(): number + { + return this._actionLengthHours; + } +} diff --git a/src/api/mod-tools/index.ts b/src/api/mod-tools/index.ts new file mode 100644 index 00000000..004bbaa3 --- /dev/null +++ b/src/api/mod-tools/index.ts @@ -0,0 +1,4 @@ +export * from './GetIssueCategoryName'; +export * from './ISelectedUser'; +export * from './IUserInfo'; +export * from './ModActionDefinition'; diff --git a/src/api/navigator/DoorStateType.ts b/src/api/navigator/DoorStateType.ts new file mode 100644 index 00000000..1f8a8efe --- /dev/null +++ b/src/api/navigator/DoorStateType.ts @@ -0,0 +1,12 @@ +export class DoorStateType +{ + public static NONE: number = 0; + public static START_DOORBELL: number = 1; + public static START_PASSWORD: number = 2; + public static STATE_PENDING_SERVER: number = 3; + public static UPDATE_STATE: number = 4; + public static STATE_WAITING: number = 5; + public static STATE_NO_ANSWER: number = 6; + public static STATE_WRONG_PASSWORD: number = 7; + public static STATE_ACCEPTED: number = 8; +} diff --git a/src/api/navigator/INavigatorData.ts b/src/api/navigator/INavigatorData.ts new file mode 100644 index 00000000..e50b6fe5 --- /dev/null +++ b/src/api/navigator/INavigatorData.ts @@ -0,0 +1,17 @@ +import { RoomDataParser } from '@nitrots/nitro-renderer'; + +export interface INavigatorData +{ + homeRoomId: number; + settingsReceived: boolean; + enteredGuestRoom: RoomDataParser; + currentRoomOwner: boolean; + currentRoomId: number; + currentRoomIsStaffPick: boolean; + createdFlatId: number; + avatarId: number; + roomPicker: boolean; + eventMod: boolean; + currentRoomRating: number; + canRate: boolean; +} diff --git a/src/components/navigator/common/INavigatorSearchFilter.ts b/src/api/navigator/INavigatorSearchFilter.ts similarity index 100% rename from src/components/navigator/common/INavigatorSearchFilter.ts rename to src/api/navigator/INavigatorSearchFilter.ts diff --git a/src/api/navigator/IRoomChatSettings.ts b/src/api/navigator/IRoomChatSettings.ts new file mode 100644 index 00000000..aee426cb --- /dev/null +++ b/src/api/navigator/IRoomChatSettings.ts @@ -0,0 +1,8 @@ +export interface IRoomChatSettings +{ + mode: number; + weight: number; + speed: number; + distance: number; + protection: number; +} diff --git a/src/api/navigator/IRoomData.ts b/src/api/navigator/IRoomData.ts new file mode 100644 index 00000000..91463147 --- /dev/null +++ b/src/api/navigator/IRoomData.ts @@ -0,0 +1,23 @@ +import { IRoomChatSettings } from './IRoomChatSettings'; +import { IRoomModerationSettings } from './IRoomModerationSettings'; + +export interface IRoomData +{ + roomId: number; + roomName: string; + roomDescription: string; + categoryId: number; + userCount: number; + tags: string[]; + tradeState: number; + allowWalkthrough: boolean; + lockState: number; + password: string; + allowPets: boolean; + allowPetsEat: boolean; + hideWalls: boolean; + wallThickness: number; + floorThickness: number; + chatSettings: IRoomChatSettings; + moderationSettings: IRoomModerationSettings; +} diff --git a/src/api/navigator/IRoomModel.ts b/src/api/navigator/IRoomModel.ts new file mode 100644 index 00000000..73dfe278 --- /dev/null +++ b/src/api/navigator/IRoomModel.ts @@ -0,0 +1,6 @@ +export interface IRoomModel +{ + clubLevel: number; + tileSize: number; + name: string; +} diff --git a/src/api/navigator/IRoomModerationSettings.ts b/src/api/navigator/IRoomModerationSettings.ts new file mode 100644 index 00000000..266fe478 --- /dev/null +++ b/src/api/navigator/IRoomModerationSettings.ts @@ -0,0 +1,6 @@ +export interface IRoomModerationSettings +{ + allowMute: number; + allowKick: number; + allowBan: number; +} diff --git a/src/api/navigator/NavigatorSearchResultViewDisplayMode.ts b/src/api/navigator/NavigatorSearchResultViewDisplayMode.ts new file mode 100644 index 00000000..b532d1af --- /dev/null +++ b/src/api/navigator/NavigatorSearchResultViewDisplayMode.ts @@ -0,0 +1,6 @@ +export class NavigatorSearchResultViewDisplayMode +{ + public static readonly LIST: number = 0; + public static readonly THUMBNAILS: number = 1; + public static readonly FORCED_THUMBNAILS: number = 2; +} diff --git a/src/components/navigator/common/RoomInfoData.ts b/src/api/navigator/RoomInfoData.ts similarity index 100% rename from src/components/navigator/common/RoomInfoData.ts rename to src/api/navigator/RoomInfoData.ts diff --git a/src/api/navigator/RoomSettingsUtils.ts b/src/api/navigator/RoomSettingsUtils.ts new file mode 100644 index 00000000..bc611dad --- /dev/null +++ b/src/api/navigator/RoomSettingsUtils.ts @@ -0,0 +1,10 @@ +const BuildMaxVisitorsList = () => +{ + const list: number[] = []; + + for(let i = 10; i <= 100; i = i + 10) list.push(i); + + return list; +} + +export const GetMaxVisitorsList = BuildMaxVisitorsList(); diff --git a/src/components/navigator/common/SearchFilterOptions.ts b/src/api/navigator/SearchFilterOptions.ts similarity index 100% rename from src/components/navigator/common/SearchFilterOptions.ts rename to src/api/navigator/SearchFilterOptions.ts diff --git a/src/api/navigator/TryVisitRoom.ts b/src/api/navigator/TryVisitRoom.ts index 94d8e6fc..81138d6c 100644 --- a/src/api/navigator/TryVisitRoom.ts +++ b/src/api/navigator/TryVisitRoom.ts @@ -1,7 +1,7 @@ -import { RoomInfoComposer } from '@nitrots/nitro-renderer'; +import { GetGuestRoomMessageComposer } from '@nitrots/nitro-renderer'; import { SendMessageComposer } from '../nitro'; export function TryVisitRoom(roomId: number): void { - SendMessageComposer(new RoomInfoComposer(roomId, false, true)); + SendMessageComposer(new GetGuestRoomMessageComposer(roomId, false, true)); } diff --git a/src/api/navigator/index.ts b/src/api/navigator/index.ts index 9aeb7a89..bceb33e4 100644 --- a/src/api/navigator/index.ts +++ b/src/api/navigator/index.ts @@ -1 +1,12 @@ +export * from './DoorStateType'; +export * from './INavigatorData'; +export * from './INavigatorSearchFilter'; +export * from './IRoomChatSettings'; +export * from './IRoomData'; +export * from './IRoomModel'; +export * from './IRoomModerationSettings'; +export * from './NavigatorSearchResultViewDisplayMode'; +export * from './RoomInfoData'; +export * from './RoomSettingsUtils'; +export * from './SearchFilterOptions'; export * from './TryVisitRoom'; diff --git a/src/api/nitro/AddWorkerEventTracker.ts b/src/api/nitro/AddWorkerEventTracker.ts new file mode 100644 index 00000000..0d81670b --- /dev/null +++ b/src/api/nitro/AddWorkerEventTracker.ts @@ -0,0 +1,7 @@ +import { IWorkerEventTracker } from '@nitrots/nitro-renderer'; +import { GetNitroInstance } from './GetNitroInstance'; + +export const AddWorkerEventTracker = (tracker: IWorkerEventTracker) => +{ + GetNitroInstance().addWorkerEventTracker(tracker); +} diff --git a/src/api/nitro/OpenUrl.ts b/src/api/nitro/OpenUrl.ts new file mode 100644 index 00000000..096776d7 --- /dev/null +++ b/src/api/nitro/OpenUrl.ts @@ -0,0 +1,16 @@ +import { HabboWebTools } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent } from './CreateLinkEvent'; + +export const OpenUrl = (url: string) => +{ + if(!url || !url.length) return; + + if(url.startsWith('http')) + { + HabboWebTools.openWebPage(url); + } + else + { + CreateLinkEvent(url); + } +} diff --git a/src/api/nitro/RemoveWorkerEventTracker.ts b/src/api/nitro/RemoveWorkerEventTracker.ts new file mode 100644 index 00000000..a1307118 --- /dev/null +++ b/src/api/nitro/RemoveWorkerEventTracker.ts @@ -0,0 +1,7 @@ +import { IWorkerEventTracker } from '@nitrots/nitro-renderer'; +import { GetNitroInstance } from './GetNitroInstance'; + +export const RemoveWorkerEventTracker = (tracker: IWorkerEventTracker) => +{ + GetNitroInstance().removeWorkerEventTracker(tracker); +} diff --git a/src/api/nitro/SendWorkerEvent.ts b/src/api/nitro/SendWorkerEvent.ts new file mode 100644 index 00000000..b0e32740 --- /dev/null +++ b/src/api/nitro/SendWorkerEvent.ts @@ -0,0 +1,6 @@ +import { GetNitroInstance } from './GetNitroInstance'; + +export const SendWorkerEvent = (message: { [index: string]: any }) => +{ + GetNitroInstance().sendWorkerEvent(message); +} diff --git a/src/api/core/GetConfigurationManager.ts b/src/api/nitro/core/GetConfigurationManager.ts similarity index 100% rename from src/api/core/GetConfigurationManager.ts rename to src/api/nitro/core/GetConfigurationManager.ts diff --git a/src/api/core/GetNitroCore.ts b/src/api/nitro/core/GetNitroCore.ts similarity index 75% rename from src/api/core/GetNitroCore.ts rename to src/api/nitro/core/GetNitroCore.ts index 19c2e586..ef34b663 100644 --- a/src/api/core/GetNitroCore.ts +++ b/src/api/nitro/core/GetNitroCore.ts @@ -1,5 +1,5 @@ import { INitroCore } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../nitro'; +import { GetNitroInstance } from '..'; export function GetNitroCore(): INitroCore { diff --git a/src/api/core/index.ts b/src/api/nitro/core/index.ts similarity index 100% rename from src/api/core/index.ts rename to src/api/nitro/core/index.ts diff --git a/src/api/nitro/index.ts b/src/api/nitro/index.ts index 18b2de0c..c5af3a30 100644 --- a/src/api/nitro/index.ts +++ b/src/api/nitro/index.ts @@ -1,6 +1,8 @@ export * from './AddLinkEventTracker'; +export * from './AddWorkerEventTracker'; export * from './avatar'; export * from './camera'; +export * from './core'; export * from './CreateLinkEvent'; export * from './GetCommunication'; export * from './GetConfiguration'; @@ -8,11 +10,10 @@ export * from './GetConnection'; export * from './GetLocalization'; export * from './GetNitroInstance'; export * from './GetTicker'; +export * from './OpenUrl'; export * from './RemoveLinkEventTracker'; +export * from './RemoveWorkerEventTracker'; export * from './room'; -export * from './room/widgets'; -export * from './room/widgets/events'; -export * from './room/widgets/handlers'; -export * from './room/widgets/messages'; export * from './SendMessageComposer'; +export * from './SendWorkerEvent'; export * from './session'; diff --git a/src/api/nitro/room/DispatchMouseEvent.ts b/src/api/nitro/room/DispatchMouseEvent.ts index 6d18f2e8..51111aca 100644 --- a/src/api/nitro/room/DispatchMouseEvent.ts +++ b/src/api/nitro/room/DispatchMouseEvent.ts @@ -1,12 +1,11 @@ import { MouseEventType } from '@nitrots/nitro-renderer'; import { GetRoomEngine } from './GetRoomEngine'; -import { SetActiveRoomId } from './SetActiveRoomId'; let didMouseMove = false; let lastClick = 0; let clickCount = 0; -export function DispatchMouseEvent(roomId: number, canvasId: number, event: MouseEvent) +export const DispatchMouseEvent = (event: MouseEvent, canvasId: number = 1) => { const x = event.clientX; const y = event.clientY; @@ -28,8 +27,8 @@ export function DispatchMouseEvent(roomId: number, canvasId: number, event: Mous { if(!didMouseMove) eventType = MouseEventType.DOUBLE_CLICK; - clickCount = 0; - lastClick = null; + clickCount = 0; + lastClick = null; } } @@ -51,7 +50,6 @@ export function DispatchMouseEvent(roomId: number, canvasId: number, event: Mous break; default: return; } - - SetActiveRoomId(roomId); + GetRoomEngine().dispatchMouseEvent(canvasId, x, y, eventType, event.altKey, (event.ctrlKey || event.metaKey), event.shiftKey, false); } diff --git a/src/api/nitro/room/DispatchTouchEvent.ts b/src/api/nitro/room/DispatchTouchEvent.ts index 7053318e..50175445 100644 --- a/src/api/nitro/room/DispatchTouchEvent.ts +++ b/src/api/nitro/room/DispatchTouchEvent.ts @@ -4,38 +4,9 @@ import { GetRoomEngine } from './GetRoomEngine'; let didMouseMove = false; let lastClick = 0; let clickCount = 0; -let touchTimer: ReturnType = null; -export function DispatchTouchEvent(roomId: number, canvasId: number, event: TouchEvent, longTouch: boolean = false, altKey: boolean = false, ctrlKey: boolean = false, shiftKey: boolean = false) +export const DispatchTouchEvent = (event: TouchEvent, canvasId: number = 1, longTouch: boolean = false, altKey: boolean = false, ctrlKey: boolean = false, shiftKey: boolean = false) => { - let eventType = event.type; - - if(longTouch) eventType = TouchEventType.TOUCH_LONG; - - if(eventType === TouchEventType.TOUCH_END && !didMouseMove) - { - eventType = MouseEventType.MOUSE_CLICK; - - if(lastClick) - { - clickCount = 1; - - if(lastClick >= (Date.now() - 300)) clickCount++; - } - - lastClick = Date.now(); - - if(clickCount === 2) - { - eventType = MouseEventType.DOUBLE_CLICK; - - clickCount = 0; - lastClick = null; - } - } - - if(touchTimer) clearTimeout(touchTimer); - let x = 0; let y = 0; @@ -50,8 +21,32 @@ export function DispatchTouchEvent(roomId: number, canvasId: number, event: Touc x = event.changedTouches[0].clientX; y = event.changedTouches[0].clientY; } + + let eventType = event.type; - GetRoomEngine().setActiveRoomId(roomId); + if(longTouch) eventType = TouchEventType.TOUCH_LONG; + + if(eventType === MouseEventType.MOUSE_CLICK || eventType === TouchEventType.TOUCH_END) + { + eventType = MouseEventType.MOUSE_CLICK; + + if(lastClick) + { + clickCount = 1; + + if(lastClick >= (Date.now() - 300)) clickCount++; + } + + lastClick = Date.now(); + + if(clickCount === 2) + { + if(!didMouseMove) eventType = MouseEventType.DOUBLE_CLICK; + + clickCount = 0; + lastClick = null; + } + } switch(eventType) { @@ -59,14 +54,7 @@ export function DispatchTouchEvent(roomId: number, canvasId: number, event: Touc break; case MouseEventType.DOUBLE_CLICK: break; - case TouchEventType.TOUCH_START: - touchTimer = setTimeout(() => - { - if(didMouseMove) return; - - DispatchTouchEvent(roomId, canvasId, event, true); - }, 300); - + case TouchEventType.TOUCH_START: eventType = MouseEventType.MOUSE_DOWN; didMouseMove = false; @@ -85,5 +73,10 @@ export function DispatchTouchEvent(roomId: number, canvasId: number, event: Touc default: return; } + if (eventType === TouchEventType.TOUCH_START) + { + GetRoomEngine().dispatchMouseEvent(canvasId, x, y, eventType, altKey, ctrlKey, shiftKey, false); + } + GetRoomEngine().dispatchMouseEvent(canvasId, x, y, eventType, altKey, ctrlKey, shiftKey, false); } diff --git a/src/api/nitro/room/GetRoomObjectBounds.ts b/src/api/nitro/room/GetRoomObjectBounds.ts index 1b149ce0..0a42ad65 100644 --- a/src/api/nitro/room/GetRoomObjectBounds.ts +++ b/src/api/nitro/room/GetRoomObjectBounds.ts @@ -1,7 +1,13 @@ -import { NitroRectangle } from '@nitrots/nitro-renderer'; import { GetRoomEngine } from './GetRoomEngine'; -export function GetRoomObjectBounds(roomId: number, objectId: number, category: number, canvasId = 1): NitroRectangle +export const GetRoomObjectBounds = (roomId: number, objectId: number, category: number, canvasId = 1) => { - return GetRoomEngine().getRoomObjectBoundingRectangle(roomId, objectId, category, canvasId); + const rectangle = GetRoomEngine().getRoomObjectBoundingRectangle(roomId, objectId, category, canvasId); + + if(!rectangle) return null; + + rectangle.x = Math.round(rectangle.x); + rectangle.y = Math.round(rectangle.y); + + return rectangle; } diff --git a/src/api/nitro/room/GetRoomObjectScreenLocation.ts b/src/api/nitro/room/GetRoomObjectScreenLocation.ts new file mode 100644 index 00000000..1a8d973d --- /dev/null +++ b/src/api/nitro/room/GetRoomObjectScreenLocation.ts @@ -0,0 +1,13 @@ +import { GetRoomEngine } from './GetRoomEngine'; + +export const GetRoomObjectScreenLocation = (roomId: number, objectId: number, category: number, canvasId = 1) => +{ + const point = GetRoomEngine().getRoomObjectScreenLocation(roomId, objectId, category, canvasId); + + if(!point) return null; + + point.x = Math.round(point.x); + point.y = Math.round(point.y); + + return point; +} diff --git a/src/api/nitro/room/InitializeRoomInstanceRenderingCanvas.ts b/src/api/nitro/room/InitializeRoomInstanceRenderingCanvas.ts index 342e4985..d85d739c 100644 --- a/src/api/nitro/room/InitializeRoomInstanceRenderingCanvas.ts +++ b/src/api/nitro/room/InitializeRoomInstanceRenderingCanvas.ts @@ -1,6 +1,9 @@ import { GetRoomEngine } from './GetRoomEngine'; -export function InitializeRoomInstanceRenderingCanvas(roomId: number, canvasId: number, width: number, height: number): void +export const InitializeRoomInstanceRenderingCanvas = (width: number, height: number, canvasId: number = 1) => { - GetRoomEngine().initializeRoomInstanceRenderingCanvas(roomId, canvasId, width, height); + const roomEngine = GetRoomEngine(); + const roomId = roomEngine.activeRoomId; + + roomEngine.initializeRoomInstanceRenderingCanvas(roomId, canvasId, width, height); } diff --git a/src/api/nitro/room/index.ts b/src/api/nitro/room/index.ts index 0c633afa..764b72e9 100644 --- a/src/api/nitro/room/index.ts +++ b/src/api/nitro/room/index.ts @@ -3,8 +3,8 @@ export * from './DispatchTouchEvent'; export * from './GetOwnRoomObject'; export * from './GetRoomEngine'; export * from './GetRoomObjectBounds'; +export * from './GetRoomObjectScreenLocation'; export * from './InitializeRoomInstanceRenderingCanvas'; export * from './IsFurnitureSelectionDisabled'; export * from './ProcessRoomObjectOperation'; export * from './SetActiveRoomId'; -export * from './widgets'; diff --git a/src/api/nitro/room/widgets/events/RoomWidgetAvatarInfoEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetAvatarInfoEvent.ts deleted file mode 100644 index e780711f..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetAvatarInfoEvent.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetAvatarInfoEvent extends RoomWidgetUpdateEvent -{ - public static AVATAR_INFO: string = 'RWAIE_AVATAR_INFO'; - - private _userId: number; - private _userName: string; - private _userType: number; - private _roomIndex: number; - private _allowNameChange: boolean; - - constructor(userId: number, userName: string, userType: number, roomIndex: number, allowNameChange: boolean) - { - super(RoomWidgetAvatarInfoEvent.AVATAR_INFO); - - this._userId = userId; - this._userName = userName; - this._userType = userType; - this._roomIndex = roomIndex; - this._allowNameChange = allowNameChange; - } - - public get userId(): number - { - return this._userId; - } - - public get userName(): string - { - return this._userName; - } - - public get userType(): number - { - return this._userType; - } - - public get roomIndex(): number - { - return this._roomIndex; - } - - public get allowNameChange(): boolean - { - return this._allowNameChange; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetChooserContentEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetChooserContentEvent.ts deleted file mode 100644 index 75ec5f8e..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetChooserContentEvent.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { RoomObjectItem } from './RoomObjectItem'; -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetChooserContentEvent extends RoomWidgetUpdateEvent -{ - public static USER_CHOOSER_CONTENT: string = 'RWCCE_USER_CHOOSER_CONTENT'; - public static FURNI_CHOOSER_CONTENT: string = 'RWCCE_FURNI_CHOOSER_CONTENT'; - - private _items: RoomObjectItem[]; - - constructor(type: string, items: RoomObjectItem[]) - { - super(type); - - this._items = items; - } - - public get items(): RoomObjectItem[] - { - return this._items; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetDoorbellEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetDoorbellEvent.ts deleted file mode 100644 index 9bad7fa4..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetDoorbellEvent.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetDoorbellEvent extends RoomWidgetUpdateEvent -{ - public static RINGING: string = 'RWDE_RINGING'; - public static REJECTED: string = 'RWDE_REJECTED'; - public static ACCEPTED: string = 'RWDE_ACCEPTED'; - - private _userName: string = ''; - - constructor(type: string, userName: string) - { - super(type); - - this._userName = userName; - } - - public get userName(): string - { - return this._userName; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetFloodControlEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetFloodControlEvent.ts deleted file mode 100644 index 8b1e10af..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetFloodControlEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetFloodControlEvent extends RoomWidgetUpdateEvent -{ - public static FLOOD_CONTROL: string = 'RWFCE_FLOOD_CONTROL'; - - private _seconds: number = 0; - - constructor(seconds: number) - { - super(RoomWidgetFloodControlEvent.FLOOD_CONTROL); - - this._seconds = seconds; - } - - public get seconds(): number - { - return this._seconds; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetObjectNameEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetObjectNameEvent.ts deleted file mode 100644 index 87fbe42f..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetObjectNameEvent.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetObjectNameEvent extends RoomWidgetUpdateEvent -{ - public static TYPE: string = 'RWONE_TYPE'; - - private _roomIndex: number; - private _category: number; - private _id: number; - private _name: string; - private _userType: number; - - constructor(type: string, roomIndex: number, category: number, id: number, name: string, userType: number) - { - super(type); - - this._roomIndex = roomIndex; - this._category = category; - this._id = id; - this._name = name; - this._userType = userType; - } - - public get roomIndex(): number - { - return this._roomIndex; - } - - public get category(): number - { - return this._category; - } - - public get id(): number - { - return this._id; - } - - public get name(): string - { - return this._name; - } - - public get userType(): number - { - return this._userType; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateChatEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateChatEvent.ts deleted file mode 100644 index bef476b1..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateChatEvent.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateChatEvent extends RoomWidgetUpdateEvent -{ - public static CHAT_EVENT: string = 'RWUCE_CHAT_EVENT'; - public static CHAT_TYPE_SPEAK: number = 0; - public static CHAT_TYPE_WHISPER: number = 1; - public static CHAT_TYPE_SHOUT: number = 2; - public static CHAT_TYPE_RESPECT: number = 3; - public static CHAT_TYPE_PETRESPECT: number = 4; - public static CHAT_TYPE_NOTIFY: number = 5; - public static CHAT_TYPE_PETTREAT: number = 6; - public static CHAT_TYPE_PETREVIVE: number = 7; - public static CHAT_TYPE_PET_REBREED_FERTILIZE: number = 8; - public static CHAT_TYPE_PET_SPEED_FERTILIZE: number = 9; - public static CHAT_TYPE_BOT_SPEAK: number = 10; - public static CHAT_TYPE_BOT_SHOUT: number = 11; - public static CHAT_TYPE_BOT_WHISPER: number = 12; - - private _userId: number; - private _text: string; - private _chatType: number; - private _userName: string; - private _links: string[]; - private _userX: number; - private _userY: number; - private _userImage: string; - private _userColor: number; - private _roomId: number; - private _userCategory: number; - private _userType: number; - private _petType: number; - private _styleId: number; - - constructor(type: string, userId: number, text: string, userName: string, userCategory: number, userType: number, petType: number, userX: number, userY: number, userImage: string, userColor: number, roomId: number, chatType: number = 0, styleId: number = 0, links: string[] = null) - { - super(type); - - this._userId = userId; - this._text = text; - this._chatType = chatType; - this._userName = userName; - this._userCategory = userCategory; - this._userType = userType; - this._petType = petType; - this._links = links; - this._userX = userX; - this._userY = userY; - this._userImage = userImage; - this._userColor = userColor; - this._roomId = roomId; - this._styleId = styleId; - } - - public get userId(): number - { - return this._userId; - } - - public get text(): string - { - return this._text; - } - - public get chatType(): number - { - return this._chatType; - } - - public get userName(): string - { - return this._userName; - } - - public get userCategory(): number - { - return this._userCategory; - } - - public get userType(): number - { - return this._userType; - } - - public get petType(): number - { - return this._petType; - } - - public get links(): string[] - { - return this._links; - } - - public get userX(): number - { - return this._userX; - } - - public get userY(): number - { - return this._userY; - } - - public get userImage(): string - { - return this._userImage; - } - - public get userColor(): number - { - return this._userColor; - } - - public get roomId(): number - { - return this._roomId; - } - - public get styleId(): number - { - return this._styleId; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateCreditFurniEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateCreditFurniEvent.ts deleted file mode 100644 index be70172a..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateCreditFurniEvent.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateCreditFurniEvent extends RoomWidgetUpdateEvent -{ - public static CREDIT_FURNI_UPDATE: string = 'RWUCFE_CREDIT_FURNI_UPDATE'; - - private _objectId: number; - private _value: number; - private _furniType: string; - - constructor(type: string, objectId: number, value: number, furniType: string) - { - super(type); - - this._objectId = objectId; - this._value = value; - this._furniType = furniType; - } - - public get objectId(): number - { - return this._objectId; - } - - public get value(): number - { - return this._value; - } - - public get furniType(): string - { - return this._furniType; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateCustomStackHeightEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateCustomStackHeightEvent.ts deleted file mode 100644 index 983b5633..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateCustomStackHeightEvent.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateCustomStackHeightEvent extends RoomWidgetUpdateEvent -{ - public static UPDATE_CUSTOM_STACK_HEIGHT: string = 'RWUCSHE_UPDATE_CUSTOM_STACK_HEIGHT'; - - private _objectId: number; - private _height: number; - - constructor(objectId: number, height: number = 0) - { - super(RoomWidgetUpdateCustomStackHeightEvent.UPDATE_CUSTOM_STACK_HEIGHT); - - this._objectId = objectId; - this._height = height; - } - - public get objectId(): number - { - return this._objectId; - } - - public get height(): number - { - return this._height; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateDanceStatusEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateDanceStatusEvent.ts deleted file mode 100644 index a1c0d206..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateDanceStatusEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateDanceStatusEvent extends RoomWidgetUpdateEvent -{ - public static UPDATE_DANCE: string = 'RWUDSE_UPDATE_DANCE'; - - private _isDancing: boolean; - - constructor(isDancing: boolean) - { - super(RoomWidgetUpdateDanceStatusEvent.UPDATE_DANCE); - - this._isDancing = isDancing; - } - - public get isDancing(): boolean - { - return this._isDancing; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateDecorateModeEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateDecorateModeEvent.ts deleted file mode 100644 index 212e371c..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateDecorateModeEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateDecorateModeEvent extends RoomWidgetUpdateEvent -{ - public static UPDATE_DECORATE: string = 'RWUDME_UPDATE_DECORATE'; - - private _isDecorating: boolean; - - constructor(isDecorating: boolean) - { - super(RoomWidgetUpdateDecorateModeEvent.UPDATE_DECORATE); - - this._isDecorating = isDecorating; - } - - public get isDecorating(): boolean - { - return this._isDecorating; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateDimmerEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateDimmerEvent.ts deleted file mode 100644 index 30556c71..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateDimmerEvent.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { RoomDimmerPreset } from './RoomDimmerPreset'; -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateDimmerEvent extends RoomWidgetUpdateEvent -{ - public static PRESETS: string = 'RWUDE_PRESETS'; - public static HIDE: string = 'RWUDE_HIDE'; - - private _selectedPresetId: number = 0; - private _presets: RoomDimmerPreset[]; - - constructor(type: string) - { - super(type); - - this._presets = []; - } - - public get presetCount(): number - { - return this._presets.length; - } - - public get presets(): RoomDimmerPreset[] - { - return this._presets; - } - - public get selectedPresetId(): number - { - return this._selectedPresetId; - } - - public set selectedPresetId(k: number) - { - this._selectedPresetId = k; - } - - public setPresetValues(id: number, type: number, color: number, brightness: number): void - { - const preset = new RoomDimmerPreset(id, type, color, brightness); - - this._presets[(id - 1)] = preset; - } - - public getPresetNumber(id: number): RoomDimmerPreset - { - return this._presets[id]; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateDimmerStateEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateDimmerStateEvent.ts deleted file mode 100644 index 27e9fd13..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateDimmerStateEvent.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateDimmerStateEvent extends RoomWidgetUpdateEvent -{ - public static DIMMER_STATE: string = 'RWUDSE_DIMMER_STATE'; - - private _state: number; - private _presetId: number; - private _effectId: number; - private _color: number; - private _brightness: number; - - constructor(state: number, presetId: number, effectId: number, color: number, brightness: number) - { - super(RoomWidgetUpdateDimmerStateEvent.DIMMER_STATE); - - this._state = state; - this._presetId = presetId; - this._effectId = effectId; - this._color = color; - this._brightness = brightness; - } - - public get state(): number - { - return this._state; - } - - public get presetId(): number - { - return this._presetId; - } - - public get effectId(): number - { - return this._effectId; - } - - public get color(): number - { - return this._color; - } - - public get brightness(): number - { - return this._brightness; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateExternalImageEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateExternalImageEvent.ts deleted file mode 100644 index 781f2b44..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateExternalImageEvent.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { IPhotoData } from './IPhotoData'; -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateExternalImageEvent extends RoomWidgetUpdateEvent -{ - public static UPDATE_EXTERNAL_IMAGE: string = 'RWUEIE_UPDATE_EXTERNAL_IMAGE'; - - private _objectId: number; - private _photoData: IPhotoData; - - constructor(objectId: number, photoData: IPhotoData = null) - { - super(RoomWidgetUpdateExternalImageEvent.UPDATE_EXTERNAL_IMAGE); - - this._objectId = objectId; - this._photoData = photoData; - } - - public get objectId(): number - { - return this._objectId; - } - - public get photoData(): IPhotoData - { - return this._photoData; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateFriendRequestEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateFriendRequestEvent.ts deleted file mode 100644 index b60ac2d4..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateFriendRequestEvent.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateFriendRequestEvent extends RoomWidgetUpdateEvent -{ - public static SHOW_FRIEND_REQUEST: string = 'RWFRUE_SHOW_FRIEND_REQUEST'; - public static HIDE_FRIEND_REQUEST: string = 'RWFRUE_HIDE_FRIEND_REQUEST'; - - private _requestId: number; - private _userId: number; - private _userName: string; - - constructor(type: string, requestId: number = -1, userId: number = -1, userName: string = null) - { - super(type); - - this._requestId = requestId; - this._userId = userId; - this._userName = userName; - } - - public get requestId(): number - { - return this._requestId; - } - - public get userId(): number - { - return this._userId; - } - - public get userName(): string - { - return this._userName; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandEvent.ts deleted file mode 100644 index 0e383daa..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandEvent.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateInfostandEvent extends RoomWidgetUpdateEvent -{} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateMannequinEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateMannequinEvent.ts deleted file mode 100644 index 1894a9fb..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateMannequinEvent.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateMannequinEvent extends RoomWidgetUpdateEvent -{ - public static MANNEQUIN_UPDATE: string = 'RWUME_MANNEQUIN_UPDATE'; - - private _objectId: number; - private _figure: string; - private _gender: string; - private _name: string; - - constructor(type: string, objectId: number, figure: string, gender: string, name: string) - { - super(type); - - this._objectId = objectId; - this._figure = figure; - this._gender = gender; - this._name = name; - } - - public get objectId(): number - { - return this._objectId; - } - - public get figure(): string - { - return this._figure; - } - - public get gender(): string - { - return this._gender; - } - - public get name(): string - { - return this._name; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdatePresentDataEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdatePresentDataEvent.ts deleted file mode 100644 index 4a4567b3..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdatePresentDataEvent.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdatePresentDataEvent extends RoomWidgetUpdateEvent -{ - public static PACKAGEINFO: string = 'RWUPDE_PACKAGEINFO'; - public static CONTENTS: string = 'RWUPDE_CONTENTS'; - public static CONTENTS_CLUB: string = 'RWUPDE_CONTENTS_CLUB'; - public static CONTENTS_FLOOR: string = 'RWUPDE_CONTENTS_FLOOR'; - public static CONTENTS_LANDSCAPE: string = 'RWUPDE_CONTENTS_LANDSCAPE'; - public static CONTENTS_WALLPAPER: string = 'RWUPDE_CONTENTS_WALLPAPER'; - public static CONTENTS_IMAGE: string = 'RWUPDE_CONTENTS_IMAGE'; - - private _objectId: number = -1; - private _classId: number = 0; - private _itemType: string = ''; - private _giftMessage: string = ''; - private _imageUrl: string = null; - private _isController: boolean; - private _purchaserName: string; - private _purchaserFigure: string; - private _placedItemId: number = -1; - private _placedItemType: string = ''; - private _placedInRoom: boolean; - - constructor(type: string, objectId: number, giftMessage: string, isOwnerOfFurniture: boolean = false, imageUrl: string = null, purchaserName: string = null, purchaserFigure: string = null) - { - super(type); - - this._objectId = objectId; - this._giftMessage = giftMessage; - this._imageUrl = imageUrl; - this._isController = isOwnerOfFurniture; - this._purchaserName = purchaserName; - this._purchaserFigure = purchaserFigure; - } - - public get objectId(): number - { - return this._objectId; - } - - public get classId(): number - { - return this._classId; - } - - public set classId(classId: number) - { - this._classId = classId; - } - - public get itemType(): string - { - return this._itemType; - } - - public set itemType(type: string) - { - this._itemType = type; - } - - public get giftMessage(): string - { - return this._giftMessage; - } - - public get imageUrl(): string - { - return this._imageUrl; - } - - public get isController(): boolean - { - return this._isController; - } - - public get purchaserName(): string - { - return this._purchaserName; - } - - public get purchaserFigure(): string - { - return this._purchaserFigure; - } - - public get placedItemId(): number - { - return this._placedItemId; - } - - public set placedItemId(itemId: number) - { - this._placedItemId = itemId; - } - - public get placedInRoom(): boolean - { - return this._placedInRoom; - } - - public set placedInRoom(flag: boolean) - { - this._placedInRoom = flag; - } - - public get placedItemType(): string - { - return this._placedItemType; - } - - public set placedItemType(type: string) - { - this._placedItemType = type; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomEngineEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomEngineEvent.ts deleted file mode 100644 index 0e72f2c3..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomEngineEvent.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateRoomEngineEvent extends RoomWidgetUpdateEvent -{ - public static GAME_MODE: string = 'RWUREE_GAME_MODE'; - public static NORMAL_MODE: string = 'RWUREE_NORMAL_MODE'; - - private _roomId: number = 0; - - constructor(type: string, roomId: number) - { - super(type); - - this._roomId = roomId; - } - - public get roomId(): number - { - return this._roomId; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomObjectEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomObjectEvent.ts deleted file mode 100644 index cbc1d9c9..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomObjectEvent.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateRoomObjectEvent extends RoomWidgetUpdateEvent -{ - public static OBJECT_SELECTED: string = 'RWUROE_OBJECT_SELECTED'; - public static OBJECT_DESELECTED: string = 'RWUROE_OBJECT_DESELECTED'; - public static USER_REMOVED: string = 'RWUROE_USER_REMOVED'; - public static FURNI_REMOVED: string = 'RWUROE_FURNI_REMOVED'; - public static FURNI_ADDED: string = 'RWUROE_FURNI_ADDED'; - public static USER_ADDED: string = 'RWUROE_USER_ADDED'; - public static OBJECT_ROLL_OVER: string = 'RWUROE_OBJECT_ROLL_OVER'; - public static OBJECT_ROLL_OUT: string = 'RWUROE_OBJECT_ROLL_OUT'; - public static OBJECT_REQUEST_MANIPULATION: string = 'RWUROE_OBJECT_REQUEST_MANIPULATION'; - - private _id: number; - private _category: number; - private _roomId: number; - - constructor(type: string, id: number, category: number, roomId: number) - { - super(type); - - this._id = id; - this._category = category; - this._roomId = roomId; - } - - public get id(): number - { - return this._id; - } - - public get category(): number - { - return this._category; - } - - public get roomId(): number - { - return this._roomId; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomViewEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomViewEvent.ts deleted file mode 100644 index fce35aaf..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomViewEvent.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NitroRectangle } from '@nitrots/nitro-renderer'; -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateRoomViewEvent extends RoomWidgetUpdateEvent -{ - public static SIZE_CHANGED: string = 'RWURVE_SIZE_CHANGED'; - - private _roomViewRectangle: NitroRectangle; - - constructor(type: string, view: NitroRectangle) - { - super(type); - - this._roomViewRectangle = view; - } - - public get roomViewRectangle(): NitroRectangle - { - return this._roomViewRectangle; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateSongEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateSongEvent.ts deleted file mode 100644 index a676a06a..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateSongEvent.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateSongEvent extends RoomWidgetUpdateEvent -{ - public static PLAYING_CHANGED: string = 'RWUSE_PLAYING_CHANGED'; - public static DATA_RECEIVED: string = 'RWUSE_DATA_RECEIVED'; - - private _songId: number; - private _songName: string; - private _songAuthor: string; - - constructor(type: string, songId: number, songName: string, songAuthor: string) - { - super(type); - - this._songId = songId; - this._songName = songName; - this._songAuthor = songAuthor; - } - - public get songId(): number - { - return this._songId; - } - - public get songName(): string - { - return this._songName; - } - - public get songAuthor(): string - { - return this._songAuthor; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateTrophyEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateTrophyEvent.ts deleted file mode 100644 index b13b2b66..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateTrophyEvent.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateTrophyEvent extends RoomWidgetUpdateEvent -{ - public static TROPHY_UPDATE: string = 'RWUTE_TROPHY_UPDATE'; - - private _color: number; - private _name: string; - private _date: string; - private _message: string; - private _extra: number; - - constructor(type: string, color: number, name: string, date: string, message: string, extra: number) - { - super(type); - - this._color = color; - this._name = name; - this._date = date; - this._message = message; - this._extra = extra; - } - - public get color(): number - { - return this._color; - } - - public get name(): string - { - return this._name; - } - - public get date(): string - { - return this._date; - } - - public get message(): string - { - return this._message; - } - - public get extra(): number - { - return this._extra; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateUserDataEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateUserDataEvent.ts deleted file mode 100644 index 7ad9f2f3..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateUserDataEvent.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateUserDataEvent extends RoomWidgetUpdateEvent -{ - public static USER_DATA_UPDATED: string = 'RWUUDE_USER_DATA_UPDATED'; - - constructor() - { - super(RoomWidgetUpdateUserDataEvent.USER_DATA_UPDATED); - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateYoutubeDisplayEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateYoutubeDisplayEvent.ts deleted file mode 100644 index 0a4773e1..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateYoutubeDisplayEvent.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateYoutubeDisplayEvent extends RoomWidgetUpdateEvent -{ - public static UPDATE_YOUTUBE_DISPLAY: string = 'RWUEIE_UPDATE_YOUTUBE_DISPLAY'; - - private _objectId: number; - private _hasControl: boolean; - - constructor(objectId: number, hasControl = false) - { - super(RoomWidgetUpdateYoutubeDisplayEvent.UPDATE_YOUTUBE_DISPLAY); - - this._objectId = objectId; - this._hasControl = hasControl; - } - - public get objectId(): number - { - return this._objectId; - } - - public get hasControl(): boolean - { - return this._hasControl; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUseProductBubbleEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUseProductBubbleEvent.ts deleted file mode 100644 index 54c8ef62..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUseProductBubbleEvent.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; -import { UseProductItem } from './UseProductItem'; - -export class RoomWidgetUseProductBubbleEvent extends RoomWidgetUpdateEvent -{ - public static USE_PRODUCT_BUBBLES: string = 'RWUPBE_USE_PRODUCT_BUBBLES'; - - private _items: UseProductItem[]; - - constructor(type: string, items: UseProductItem[]) - { - super(type); - - this._items = items; - } - - public get items(): UseProductItem[] - { - return this._items; - } -} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetWordQuizUpdateEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetWordQuizUpdateEvent.ts deleted file mode 100644 index 3652881c..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetWordQuizUpdateEvent.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { IQuestion } from '@nitrots/nitro-renderer'; -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetWordQuizUpdateEvent extends RoomWidgetUpdateEvent -{ - public static readonly NEW_QUESTION = 'RWPUW_NEW_QUESTION'; - public static readonly QUESTION_FINISHED = 'RWPUW_QUESION_FINSIHED'; - public static readonly QUESTION_ANSWERED = 'RWPUW_QUESTION_ANSWERED'; - - private _id: number = -1; - private _pollType: string = null; - private _pollId: number = -1; - private _questionId: number = -1; - private _duration: number = -1; - private _question: IQuestion = null; - private _userId: number = -1; - private _value: string; - private _answerCounts: Map; - - constructor(type: string, id: number) - { - super(type); - this._id = id; - } - - public get id(): number - { - return this._id; - } - - public get pollType(): string - { - return this._pollType; - } - - public set pollType(k: string) - { - this._pollType = k; - } - - public get pollId(): number - { - return this._pollId; - } - - public set pollId(k: number) - { - this._pollId = k; - } - - public get questionId(): number - { - return this._questionId; - } - - public set questionId(k: number) - { - this._questionId = k; - } - - public get duration(): number - { - return this._duration; - } - - public set duration(k: number) - { - this._duration = k; - } - - public get question(): IQuestion - { - return this._question; - } - - public set question(k: IQuestion) - { - this._question = k; - } - - public get userId(): number - { - return this._userId; - } - - public set userId(k: number) - { - this._userId = k; - } - - public get value(): string - { - return this._value; - } - - public set value(k: string) - { - this._value = k; - } - - public get answerCounts(): Map - { - return this._answerCounts; - } - - public set answerCounts(k: Map) - { - this._answerCounts = k; - } -} diff --git a/src/api/nitro/room/widgets/events/UseProductItem.ts b/src/api/nitro/room/widgets/events/UseProductItem.ts deleted file mode 100644 index c886c403..00000000 --- a/src/api/nitro/room/widgets/events/UseProductItem.ts +++ /dev/null @@ -1,50 +0,0 @@ -export class UseProductItem -{ - private _id: number; - private _category: number; - private _name: string; - private _requestRoomObjectId: number; - private _targetRoomObjectId: number; - private _requestInventoryStripId: number; - private _replace: boolean; - - constructor(id: number, category: number, name: string, requestRoomObjectId: number, targetRoomObjectId: number, requestInventoryStripId: number, replace: boolean) - { - this._id = id; - this._category = category; - this._name = name; - this._requestRoomObjectId = requestRoomObjectId; - this._requestInventoryStripId = requestInventoryStripId; - this._replace = replace; - } - - public get id(): number - { - return this._id; - } - - public get category(): number - { - return this._category; - } - - public get name(): string - { - return this._name; - } - - public get requestRoomObjectId(): number - { - return this._requestRoomObjectId; - } - - public get requestInventoryStripId(): number - { - return this._requestInventoryStripId; - } - - public get replace(): boolean - { - return this._replace; - } -} diff --git a/src/api/nitro/room/widgets/events/index.ts b/src/api/nitro/room/widgets/events/index.ts deleted file mode 100644 index be6a6ae5..00000000 --- a/src/api/nitro/room/widgets/events/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -export * from './IPhotoData'; -export * from './RoomDimmerPreset'; -export * from './RoomObjectItem'; -export * from './RoomWidgetAvatarInfoEvent'; -export * from './RoomWidgetChooserContentEvent'; -export * from './RoomWidgetDoorbellEvent'; -export * from './RoomWidgetFloodControlEvent'; -export * from './RoomWidgetObjectNameEvent'; -export * from './RoomWidgetPollUpdateEvent'; -export * from './RoomWidgetUpdateBackgroundColorPreviewEvent'; -export * from './RoomWidgetUpdateChatEvent'; -export * from './RoomWidgetUpdateChatInputContentEvent'; -export * from './RoomWidgetUpdateCreditFurniEvent'; -export * from './RoomWidgetUpdateCustomStackHeightEvent'; -export * from './RoomWidgetUpdateDanceStatusEvent'; -export * from './RoomWidgetUpdateDecorateModeEvent'; -export * from './RoomWidgetUpdateDimmerEvent'; -export * from './RoomWidgetUpdateDimmerStateEvent'; -export * from './RoomWidgetUpdateEvent'; -export * from './RoomWidgetUpdateExternalImageEvent'; -export * from './RoomWidgetUpdateFriendRequestEvent'; -export * from './RoomWidgetUpdateInfostandEvent'; -export * from './RoomWidgetUpdateInfostandFurniEvent'; -export * from './RoomWidgetUpdateInfostandPetEvent'; -export * from './RoomWidgetUpdateInfostandRentableBotEvent'; -export * from './RoomWidgetUpdateInfostandUserEvent'; -export * from './RoomWidgetUpdateMannequinEvent'; -export * from './RoomWidgetUpdatePresentDataEvent'; -export * from './RoomWidgetUpdateRentableBotChatEvent'; -export * from './RoomWidgetUpdateRoomEngineEvent'; -export * from './RoomWidgetUpdateRoomObjectEvent'; -export * from './RoomWidgetUpdateRoomViewEvent'; -export * from './RoomWidgetUpdateSongEvent'; -export * from './RoomWidgetUpdateTrophyEvent'; -export * from './RoomWidgetUpdateUserDataEvent'; -export * from './RoomWidgetUpdateYoutubeDisplayEvent'; -export * from './RoomWidgetUseProductBubbleEvent'; -export * from './RoomWidgetWordQuizUpdateEvent'; -export * from './UseProductItem'; diff --git a/src/api/nitro/room/widgets/handlers/DoorbellWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/DoorbellWidgetHandler.ts deleted file mode 100644 index b2b69ee9..00000000 --- a/src/api/nitro/room/widgets/handlers/DoorbellWidgetHandler.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { NitroEvent, RoomSessionDoorbellEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { RoomWidgetDoorbellEvent, RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetLetUserInMessage, RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class DoorbellWidgetHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - const doorbellEvent = (event as RoomSessionDoorbellEvent); - - switch(event.type) - { - case RoomSessionDoorbellEvent.DOORBELL: - this.container.eventDispatcher.dispatchEvent(new RoomWidgetDoorbellEvent(RoomWidgetDoorbellEvent.RINGING, doorbellEvent.userName)); - return; - case RoomSessionDoorbellEvent.RSDE_REJECTED: - this.container.eventDispatcher.dispatchEvent(new RoomWidgetDoorbellEvent(RoomWidgetDoorbellEvent.REJECTED, doorbellEvent.userName)); - return; - case RoomSessionDoorbellEvent.RSDE_ACCEPTED: - this.container.eventDispatcher.dispatchEvent(new RoomWidgetDoorbellEvent(RoomWidgetDoorbellEvent.ACCEPTED, doorbellEvent.userName)); - return; - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - case RoomWidgetLetUserInMessage.LET_USER_IN: - const letUserInMessage = (message as RoomWidgetLetUserInMessage); - - this.container.roomSession.sendDoorbellApprovalMessage(letUserInMessage.userName, letUserInMessage.canEnter); - break; - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.DOORBELL; - } - - public get eventTypes(): string[] - { - return [ - RoomSessionDoorbellEvent.DOORBELL, - RoomSessionDoorbellEvent.RSDE_REJECTED, - RoomSessionDoorbellEvent.RSDE_ACCEPTED - ]; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetLetUserInMessage.LET_USER_IN - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FriendRequestHandler.ts b/src/api/nitro/room/widgets/handlers/FriendRequestHandler.ts deleted file mode 100644 index 5269341c..00000000 --- a/src/api/nitro/room/widgets/handlers/FriendRequestHandler.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { NitroEvent, RoomSessionFriendRequestEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { FriendRequestEvent, FriendsAcceptFriendRequestEvent, FriendsDeclineFriendRequestEvent } from '../../../../../events'; -import { DispatchUiEvent } from '../../../../../hooks'; -import { RoomWidgetUpdateEvent, RoomWidgetUpdateFriendRequestEvent } from '../events'; -import { RoomWidgetFriendRequestMessage, RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FriendRequestHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - const friendRequestEvent = (event as RoomSessionFriendRequestEvent); - - switch(event.type) - { - case RoomSessionFriendRequestEvent.RSFRE_FRIEND_REQUEST: - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateFriendRequestEvent(RoomWidgetUpdateFriendRequestEvent.SHOW_FRIEND_REQUEST, friendRequestEvent.requestId, friendRequestEvent.userId, friendRequestEvent.userName)); - return; - case FriendRequestEvent.ACCEPTED: - case FriendRequestEvent.DECLINED: - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateFriendRequestEvent(RoomWidgetUpdateFriendRequestEvent.HIDE_FRIEND_REQUEST, friendRequestEvent.requestId)); - return; - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - const friendMessage = (message as RoomWidgetFriendRequestMessage); - - switch(message.type) - { - case RoomWidgetFriendRequestMessage.ACCEPT: - DispatchUiEvent(new FriendsAcceptFriendRequestEvent(friendMessage.requestId)); - break; - case RoomWidgetFriendRequestMessage.DECLINE: - DispatchUiEvent(new FriendsDeclineFriendRequestEvent(friendMessage.requestId)); - break; - - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.FRIEND_REQUEST; - } - - public get eventTypes(): string[] - { - return [ - RoomSessionFriendRequestEvent.RSFRE_FRIEND_REQUEST, - FriendRequestEvent.ACCEPTED, - FriendRequestEvent.DECLINED - ]; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetFriendRequestMessage.ACCEPT, - RoomWidgetFriendRequestMessage.DECLINE - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurniChooserWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurniChooserWidgetHandler.ts deleted file mode 100644 index f08406e8..00000000 --- a/src/api/nitro/room/widgets/handlers/FurniChooserWidgetHandler.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { NitroEvent, RoomObjectCategory, RoomObjectVariable, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { GetRoomEngine, GetSessionDataManager } from '../../../..'; -import { LocalizeText } from '../../../../utils'; -import { RoomObjectItem, RoomWidgetChooserContentEvent, RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage, RoomWidgetRequestWidgetMessage, RoomWidgetRoomObjectMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurniChooserWidgetHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - if(!message) return null; - - switch(message.type) - { - case RoomWidgetRequestWidgetMessage.FURNI_CHOOSER: - this.processChooser(); - break; - case RoomWidgetRoomObjectMessage.SELECT_OBJECT: - this.selectRoomObject((message as RoomWidgetRoomObjectMessage)); - break; - } - - return null; - } - - private processChooser(): void - { - const roomId = this.container.roomSession.roomId; - const items: RoomObjectItem[] = []; - - const wallItems = GetRoomEngine().getRoomObjects(roomId, RoomObjectCategory.WALL); - const floorItems = GetRoomEngine().getRoomObjects(roomId, RoomObjectCategory.FLOOR); - - wallItems.forEach(roomObject => - { - let name = roomObject.type; - - if(name.startsWith('poster')) - { - name = LocalizeText(`poster_${ name.replace('poster', '') }_name`); - } - else - { - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - const furniData = GetSessionDataManager().getWallItemData(typeId); - - if(furniData && furniData.name.length) name = furniData.name; - } - - items.push(new RoomObjectItem(roomObject.id, RoomObjectCategory.WALL, name)); - }); - - floorItems.forEach(roomObject => - { - let name = roomObject.type; - - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - const furniData = GetSessionDataManager().getFloorItemData(typeId); - - if(furniData && furniData.name.length) name = furniData.name; - - items.push(new RoomObjectItem(roomObject.id, RoomObjectCategory.FLOOR, name)); - }); - - items.sort((a, b) => - { - return (a.name < b.name) ? -1 : 1; - }); - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetChooserContentEvent(RoomWidgetChooserContentEvent.FURNI_CHOOSER_CONTENT, items)); - } - - private selectRoomObject(message: RoomWidgetRoomObjectMessage): void - { - if((message.category !== RoomObjectCategory.WALL) && (message.category !== RoomObjectCategory.FLOOR)) return; - - GetRoomEngine().selectRoomObject(this.container.roomSession.roomId, message.id, message.category); - } - - public get type(): string - { - return RoomWidgetEnum.FURNI_CHOOSER; - } - - public get eventTypes(): string[] - { - return []; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetRequestWidgetMessage.FURNI_CHOOSER, - RoomWidgetRoomObjectMessage.SELECT_OBJECT - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureContextMenuWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureContextMenuWidgetHandler.ts deleted file mode 100644 index 02f838e9..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureContextMenuWidgetHandler.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage, RoomWidgetUseProductMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureContextMenuWidgetHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - case RoomWidgetUseProductMessage.MONSTERPLANT_SEED: - const productMessage = (message as RoomWidgetUseProductMessage); - - this.container.roomSession.useMultistateItem(productMessage.objectId); - break; - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.FURNITURE_CONTEXT_MENU; - } - - public get eventTypes(): string[] - { - return [ - RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU, - RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU - ]; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetUseProductMessage.MONSTERPLANT_SEED - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureCreditWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureCreditWidgetHandler.ts deleted file mode 100644 index 7ab62fbb..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureCreditWidgetHandler.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { FurnitureExchangeComposer, NitroEvent, RoomObjectVariable, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { RoomWidgetCreditFurniRedeemMessage, RoomWidgetUpdateCreditFurniEvent, RoomWidgetUpdateEvent } from '..'; -import { GetRoomEngine } from '../..'; -import { IsOwnerOfFurniture } from '../../..'; -import { RoomWidgetFurniToWidgetMessage, RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureCreditWidgetHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - return; - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - case RoomWidgetFurniToWidgetMessage.REQUEST_CREDITFURNI: { - const creditMessage = (message as RoomWidgetFurniToWidgetMessage); - - const roomObject = GetRoomEngine().getRoomObject(creditMessage.roomId, creditMessage.objectId, creditMessage.category); - - if(!roomObject || !IsOwnerOfFurniture(roomObject)) return; - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateCreditFurniEvent(RoomWidgetUpdateCreditFurniEvent.CREDIT_FURNI_UPDATE, creditMessage.objectId, roomObject.model.getValue(RoomObjectVariable.FURNITURE_CREDIT_VALUE), (roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID) + '_' + creditMessage.type + '_' + creditMessage.objectId))); - - break; - } - case RoomWidgetCreditFurniRedeemMessage.REDEEM: { - const redeemMessage = (message as RoomWidgetCreditFurniRedeemMessage); - - this.container.roomSession.connection.send(new FurnitureExchangeComposer(redeemMessage.objectId)); - - break; - } - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.FURNI_CREDIT_WIDGET; - } - - public get eventTypes(): string[] - { - return []; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetFurniToWidgetMessage.REQUEST_CREDITFURNI, - RoomWidgetCreditFurniRedeemMessage.REDEEM - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureCustomStackHeightWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureCustomStackHeightWidgetHandler.ts deleted file mode 100644 index d9d858b8..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureCustomStackHeightWidgetHandler.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../../../..'; -import { RoomWidgetUpdateCustomStackHeightEvent, RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureCustomStackHeightWidgetHandler extends RoomWidgetHandler -{ - private _lastFurniId: number = -1; - - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.OPEN_WIDGET: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - this._lastFurniId = widgetEvent.objectId; - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateCustomStackHeightEvent(this._lastFurniId, roomObject.getLocation().z)); - return; - } - case RoomEngineTriggerWidgetEvent.CLOSE_WIDGET: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - if(widgetEvent.objectId !== this._lastFurniId) return; - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateCustomStackHeightEvent(-1)); - return; - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.CUSTOM_STACK_HEIGHT; - } - - public get eventTypes(): string[] - { - return []; - } - - public get messageTypes(): string[] - { - return []; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureDimmerWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureDimmerWidgetHandler.ts deleted file mode 100644 index b0d62b45..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureDimmerWidgetHandler.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { NitroEvent, RoomControllerLevel, RoomEngineDimmerStateEvent, RoomEngineTriggerWidgetEvent, RoomSessionDimmerPresetsEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../..'; -import { GetSessionDataManager } from '../../..'; -import { RoomWidgetUpdateDimmerEvent, RoomWidgetUpdateDimmerStateEvent, RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetDimmerChangeStateMessage, RoomWidgetDimmerPreviewMessage, RoomWidgetDimmerSavePresetMessage, RoomWidgetFurniToWidgetMessage, RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureDimmerWidgetHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomSessionDimmerPresetsEvent.ROOM_DIMMER_PRESETS: { - const presetsEvent = (event as RoomSessionDimmerPresetsEvent); - const updateEvent = new RoomWidgetUpdateDimmerEvent(RoomWidgetUpdateDimmerEvent.PRESETS); - - updateEvent.selectedPresetId = presetsEvent.selectedPresetId; - - let i = 0; - - while(i < presetsEvent.presetCount) - { - const preset = presetsEvent.getPreset(i); - - if(preset) updateEvent.setPresetValues(preset.id, preset.type, preset.color, preset.brightness); - - i++; - } - - this.container.eventDispatcher.dispatchEvent(updateEvent); - return; - } - case RoomEngineDimmerStateEvent.ROOM_COLOR: { - const stateEvent = (event as RoomEngineDimmerStateEvent); - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateDimmerStateEvent(stateEvent.state, stateEvent.presetId, stateEvent.effectId, stateEvent.color, stateEvent.brightness)); - return; - } - case RoomEngineTriggerWidgetEvent.REMOVE_DIMMER: { - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateDimmerEvent(RoomWidgetUpdateDimmerEvent.HIDE)); - return; - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - case RoomWidgetFurniToWidgetMessage.REQUEST_DIMMER: { - if(this.canOpenWidget()) this.container.roomSession.requestMoodlightSettings(); - - break; - } - case RoomWidgetDimmerSavePresetMessage.SAVE_PRESET: { - if(this.canOpenWidget()) - { - const savePresetMessage = (message as RoomWidgetDimmerSavePresetMessage); - - this.container.roomSession.updateMoodlightData(savePresetMessage.presetNumber, savePresetMessage.effectTypeId, savePresetMessage.color, savePresetMessage.brightness, savePresetMessage.apply); - } - - break; - } - case RoomWidgetDimmerChangeStateMessage.CHANGE_STATE: { - if(this.canOpenWidget()) this.container.roomSession.toggleMoodlightState(); - - break; - } - case RoomWidgetDimmerPreviewMessage.PREVIEW_DIMMER_PRESET: { - const roomId = this.container.roomSession.roomId; - const previewMessage = (message as RoomWidgetDimmerPreviewMessage); - - GetRoomEngine().updateObjectRoomColor(roomId, previewMessage.color, previewMessage.brightness, previewMessage.bgOnly); - - break; - } - } - - return null; - } - - private canOpenWidget(): boolean - { - return (this.container.roomSession.isRoomOwner || (this.container.roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator); - } - - public get type(): string - { - return RoomWidgetEnum.ROOM_DIMMER; - } - - public get eventTypes(): string[] - { - return [ - RoomSessionDimmerPresetsEvent.ROOM_DIMMER_PRESETS, - RoomEngineDimmerStateEvent.ROOM_COLOR, - RoomEngineTriggerWidgetEvent.REMOVE_DIMMER - ]; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetFurniToWidgetMessage.REQUEST_DIMMER, - RoomWidgetDimmerSavePresetMessage.SAVE_PRESET, - RoomWidgetDimmerChangeStateMessage.CHANGE_STATE, - RoomWidgetDimmerPreviewMessage.PREVIEW_DIMMER_PRESET - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureExternalImageWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureExternalImageWidgetHandler.ts deleted file mode 100644 index b3323520..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureExternalImageWidgetHandler.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../../../..'; -import { IPhotoData, RoomWidgetUpdateEvent, RoomWidgetUpdateExternalImageEvent } from '../events'; -import { RoomWidgetMessage } from '../messages/RoomWidgetMessage'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureExternalImageWidgetHandler extends RoomWidgetHandler -{ - private _lastFurniId: number = -1; - - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.OPEN_WIDGET: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - this._lastFurniId = widgetEvent.objectId; - - const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); - const photoData = (JSON.parse(data) as IPhotoData); - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateExternalImageEvent(roomObject.id, photoData)); - return; - } - case RoomEngineTriggerWidgetEvent.CLOSE_WIDGET: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - if(widgetEvent.objectId !== this._lastFurniId) return; - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateExternalImageEvent(-1)); - return; - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.EXTERNAL_IMAGE; - } - - public get eventTypes(): string[] - { - return []; - } - - public get messageTypes(): string[] - { - return []; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureInternalLinkHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureInternalLinkHandler.ts deleted file mode 100644 index 493f7052..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureInternalLinkHandler.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { CreateLinkEvent } from '../../../CreateLinkEvent'; -import { GetRoomEngine } from '../../GetRoomEngine'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureInternalLinkHandler extends RoomWidgetHandler -{ - private static readonly INTERNALLINK = 'internalLink'; - - public processEvent(event: NitroEvent): void - { - if(!event) return; - - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK: - const linkEvent = event as RoomEngineTriggerWidgetEvent; - const roomEngine = GetRoomEngine(); - if(!linkEvent || !roomEngine) return; - - const object = roomEngine.getRoomObject(linkEvent.roomId, linkEvent.objectId, linkEvent.category); - if(object) - { - let data = object.model.getValue(RoomObjectVariable.FURNITURE_DATA); - let link = data[FurnitureInternalLinkHandler.INTERNALLINK]; - if(!link || !link.length) link = object.model.getValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK); - if(link && link.length) CreateLinkEvent(link); - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - return null; - } - - public get type(): string - { - return RoomWidgetEnum.INTERNAL_LINK; - } - - public get eventTypes(): string[] - { - return [RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK]; - } - - public get messageTypes(): string[] - { - return []; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureMannequinWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureMannequinWidgetHandler.ts deleted file mode 100644 index 75864ee7..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureMannequinWidgetHandler.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { RoomWidgetUpdateMannequinEvent } from '..'; -import { GetRoomEngine } from '../../GetRoomEngine'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureMannequinWidgetHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_MANNEQUIN: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - const model = roomObject.model; - const figure = model.getValue(RoomObjectVariable.FURNITURE_MANNEQUIN_FIGURE); - const gender = model.getValue(RoomObjectVariable.FURNITURE_MANNEQUIN_GENDER); - const name = model.getValue(RoomObjectVariable.FURNITURE_MANNEQUIN_NAME); - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateMannequinEvent(RoomWidgetUpdateMannequinEvent.MANNEQUIN_UPDATE, roomObject.id, figure, gender, name)); - return; - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.MANNEQUIN; - } - - public get eventTypes(): string[] - { - return [ RoomEngineTriggerWidgetEvent.REQUEST_MANNEQUIN ]; - } - - public get messageTypes(): string[] - { - return []; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurniturePresentWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurniturePresentWidgetHandler.ts deleted file mode 100644 index 2b1f3ed2..00000000 --- a/src/api/nitro/room/widgets/handlers/FurniturePresentWidgetHandler.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { IFurnitureData, IGetImageListener, NitroEvent, NitroRenderTexture, PetFigureData, RoomObjectCategory, RoomObjectVariable, RoomSessionPresentEvent, RoomWidgetEnum, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; -import { GetSessionDataManager, IsOwnerOfFurniture } from '../../..'; -import { GetRoomEngine, LocalizeText } from '../../../..'; -import { ProductTypeEnum } from '../../../../../components/catalog/common/ProductTypeEnum'; -import { RoomWidgetUpdateEvent, RoomWidgetUpdatePresentDataEvent } from '../events'; -import { RoomWidgetFurniToWidgetMessage, RoomWidgetPresentOpenMessage } from '../messages'; -import { RoomWidgetMessage } from '../messages/RoomWidgetMessage'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurniturePresentWidgetHandler extends RoomWidgetHandler implements IGetImageListener -{ - private static FLOOR: string = 'floor'; - private static WALLPAPER: string = 'wallpaper'; - private static LANDSCAPE: string = 'landscape'; - private static POSTER: string = 'poster'; - - private _lastFurniId: number = -1; - private _name: string = null; - - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomSessionPresentEvent.RSPE_PRESENT_OPENED: { - const presentEvent = (event as RoomSessionPresentEvent); - - let furniData: IFurnitureData = null; - - if(presentEvent.itemType === ProductTypeEnum.FLOOR) - { - furniData = GetSessionDataManager().getFloorItemData(presentEvent.classId); - } - else if(presentEvent.itemType === ProductTypeEnum.WALL) - { - furniData = GetSessionDataManager().getWallItemData(presentEvent.classId); - } - - let isOwnerOfFurni = false; - - if(presentEvent.placedInRoom) - { - const roomObject = GetRoomEngine().getRoomObject(this.container.roomSession.roomId, presentEvent.placedItemId, RoomObjectCategory.FLOOR); - - if(roomObject) isOwnerOfFurni = IsOwnerOfFurniture(roomObject); - } - - let giftImage: string = null; - let dataUpdateEvent: RoomWidgetUpdatePresentDataEvent = null; - - switch(presentEvent.itemType) - { - case ProductTypeEnum.WALL: { - if(furniData) - { - switch(furniData.className) - { - case FurniturePresentWidgetHandler.FLOOR: - dataUpdateEvent = new RoomWidgetUpdatePresentDataEvent(RoomWidgetUpdatePresentDataEvent.CONTENTS_FLOOR, 0, LocalizeText('inventory.furni.item.floor.name'), isOwnerOfFurni); - break; - case FurniturePresentWidgetHandler.LANDSCAPE: - dataUpdateEvent = new RoomWidgetUpdatePresentDataEvent(RoomWidgetUpdatePresentDataEvent.CONTENTS_LANDSCAPE, 0, LocalizeText('inventory.furni.item.landscape.name'), isOwnerOfFurni); - break; - case FurniturePresentWidgetHandler.WALLPAPER: - dataUpdateEvent = new RoomWidgetUpdatePresentDataEvent(RoomWidgetUpdatePresentDataEvent.CONTENTS_WALLPAPER, 0, LocalizeText('inventory.furni.item.wallpaper.name'), isOwnerOfFurni); - break; - case FurniturePresentWidgetHandler.POSTER: { - const productCode = presentEvent.productCode; - - let extras: string = null; - - if(productCode.indexOf('poster') === 0) extras = productCode.replace('poster', ''); - - giftImage = GetRoomEngine().getFurnitureWallIconUrl(presentEvent.classId, extras); - - const productData = GetSessionDataManager().getProductData(productCode); - - if(productData) this._name = productData.name; - else if(furniData) this._name = furniData.name; - - dataUpdateEvent = new RoomWidgetUpdatePresentDataEvent(RoomWidgetUpdatePresentDataEvent.CONTENTS, 0, this._name, isOwnerOfFurni, giftImage); - - break; - } - default: { - giftImage = GetRoomEngine().getFurnitureWallIconUrl(presentEvent.classId); - - if(furniData) this._name = furniData.name; - - dataUpdateEvent = new RoomWidgetUpdatePresentDataEvent(RoomWidgetUpdatePresentDataEvent.CONTENTS, 0, this._name, isOwnerOfFurni, giftImage); - break; - } - } - } - - break; - } - case ProductTypeEnum.HABBO_CLUB: - dataUpdateEvent = new RoomWidgetUpdatePresentDataEvent(RoomWidgetUpdatePresentDataEvent.CONTENTS_CLUB, 0, LocalizeText('widget.furni.present.hc'), false); - break; - default: { - if(presentEvent.placedItemType === ProductTypeEnum.PET) - { - const petfigureString = presentEvent.petFigureString; - - if(petfigureString && petfigureString.length) - { - const petFigureData = new PetFigureData(petfigureString); - - const petImage = GetRoomEngine().getRoomObjectPetImage(petFigureData.typeId, petFigureData.paletteId, petFigureData.color, new Vector3d(90), 64, this, true, 0, petFigureData.customParts); - - if(petImage) giftImage = petImage.getImage().src; - } - } - - if(!giftImage) - { - const furniImage = GetRoomEngine().getFurnitureFloorImage(presentEvent.classId, new Vector3d(90), 64, this); - - if(furniImage) giftImage = furniImage.getImage().src; - } - - const productData = GetSessionDataManager().getProductData(presentEvent.productCode); - - if(productData) this._name = productData.name; - else this._name = furniData.name; - - if(giftImage) dataUpdateEvent = new RoomWidgetUpdatePresentDataEvent(RoomWidgetUpdatePresentDataEvent.CONTENTS, 0, this._name, isOwnerOfFurni, giftImage); - - break; - } - } - - if(dataUpdateEvent) - { - dataUpdateEvent.classId = presentEvent.classId; - dataUpdateEvent.itemType = presentEvent.itemType; - dataUpdateEvent.placedItemId = presentEvent.placedItemId; - dataUpdateEvent.placedInRoom = presentEvent.placedInRoom; - dataUpdateEvent.placedItemType = presentEvent.placedItemType; - - this.container.eventDispatcher.dispatchEvent(dataUpdateEvent); - } - - return; - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - case RoomWidgetFurniToWidgetMessage.REQUEST_PRESENT: { - const widgetMessage = (message as RoomWidgetFurniToWidgetMessage); - - const roomObject = GetRoomEngine().getRoomObject(widgetMessage.roomId, widgetMessage.objectId, widgetMessage.category); - - if(!roomObject) return null; - - this._lastFurniId = widgetMessage.objectId; - - const giftMessage = (roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA) || ''); - const purchaserName = roomObject.model.getValue(RoomObjectVariable.FURNITURE_PURCHASER_NAME); - const purchaserFigure = roomObject.model.getValue(RoomObjectVariable.FURNITURE_PURCHASER_FIGURE); - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - const extras = roomObject.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS); - const giftImage = GetRoomEngine().getFurnitureFloorImage(typeId, new Vector3d(180), 64, null, 0, extras); - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdatePresentDataEvent(RoomWidgetUpdatePresentDataEvent.PACKAGEINFO, widgetMessage.objectId, giftMessage, IsOwnerOfFurniture(roomObject), giftImage.getImage().src, purchaserName, purchaserFigure)); - - break; - } - case RoomWidgetPresentOpenMessage.OPEN_PRESENT: { - const openMessage = (message as RoomWidgetPresentOpenMessage); - - if(openMessage.objectId !== this._lastFurniId) return null; - - this.container.roomSession.openGift(openMessage.objectId); - - GetRoomEngine().changeObjectModelData(GetRoomEngine().activeRoomId, openMessage.objectId, RoomObjectCategory.FLOOR, RoomObjectVariable.FURNITURE_DISABLE_PICKING_ANIMATION, 1); - - break; - } - } - - return null; - } - - public imageReady(id: number, texture: NitroRenderTexture, image: HTMLImageElement = null): void - { - let imageUrl: string = null; - - if(image) imageUrl = image.src; - else if(texture) imageUrl = TextureUtils.generateImageUrl(texture); - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdatePresentDataEvent(RoomWidgetUpdatePresentDataEvent.CONTENTS_IMAGE, 0, this._name, false, imageUrl)); - } - - public imageFailed(id: number): void - { - - } - - public get type(): string - { - return RoomWidgetEnum.FURNI_PRESENT_WIDGET; - } - - public get eventTypes(): string[] - { - return [ - RoomSessionPresentEvent.RSPE_PRESENT_OPENED - ]; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetFurniToWidgetMessage.REQUEST_PRESENT, - RoomWidgetPresentOpenMessage.OPEN_PRESENT - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureRoomLinkHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureRoomLinkHandler.ts deleted file mode 100644 index 9396ba27..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureRoomLinkHandler.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { IMessageEvent, NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { CreateLinkEvent } from '../../../CreateLinkEvent'; -import { GetRoomEngine } from '../../GetRoomEngine'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureRoomLinkHandler extends RoomWidgetHandler -{ - private static readonly INTERNALLINK = 'internalLink'; - - private onRoomInfo(event: IMessageEvent): void - { - //todo - } - - public processEvent(event: NitroEvent): void - { - if(!event) return; - - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK: - const roomLinkEvent = (event as RoomEngineTriggerWidgetEvent); - const roomEngine = GetRoomEngine(); - - if(!roomLinkEvent || !roomEngine) return; - - const object = roomEngine.getRoomObject(roomLinkEvent.roomId, roomLinkEvent.objectId, roomLinkEvent.category); - if(object) - { - const data = object.model.getValue(RoomObjectVariable.FURNITURE_DATA); - let roomId = data[FurnitureRoomLinkHandler.INTERNALLINK]; - if(!roomId || !roomId.length) roomId = object.model.getValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK); - if(roomId && roomId.length) CreateLinkEvent('navigator/goto/' + roomId); - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - return null; - } - - public get type(): string - { - return RoomWidgetEnum.ROOM_LINK; - } - - public get eventTypes(): string[] - { - return [RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK]; - } - - public get messageTypes(): string[] - { - return []; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureTrophyWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureTrophyWidgetHandler.ts deleted file mode 100644 index 9b345109..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureTrophyWidgetHandler.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { NitroEvent, RoomObjectVariable, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { RoomWidgetUpdateEvent } from '..'; -import { GetRoomEngine } from '../..'; -import { RoomWidgetFurniToWidgetMessage, RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureTrophyWidgetHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - return; - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - case RoomWidgetFurniToWidgetMessage.REQUEST_TROPHY: { - const widgetMessage = (message as RoomWidgetFurniToWidgetMessage); - const roomObject = GetRoomEngine().getRoomObject(widgetMessage.roomId, widgetMessage.objectId, widgetMessage.category); - - if(!roomObject) return; - - const color = roomObject.model.getValue(RoomObjectVariable.FURNITURE_COLOR); - const extra = parseInt(roomObject.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS)); - - let data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); - - const ownerName = data.substring(0, data.indexOf('\t')); - - data = data.substring((ownerName.length + 1), data.length); - - const date = data.substring(0, data.indexOf('\t')); - const text = data.substr((date.length + 1), data.length); - - - - break; - } - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.FURNI_TROPHY_WIDGET; - } - - public get eventTypes(): string[] - { - return []; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetFurniToWidgetMessage.REQUEST_TROPHY - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureYoutubeDisplayWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureYoutubeDisplayWidgetHandler.ts deleted file mode 100644 index 8974053b..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureYoutubeDisplayWidgetHandler.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { GetYoutubeDisplayStatusMessageComposer, NitroEvent, RoomWidgetEnum, SecurityLevel } from '@nitrots/nitro-renderer'; -import { RoomEngineTriggerWidgetEvent } from '@nitrots/nitro-renderer/'; -import { RoomWidgetMessage, RoomWidgetUpdateEvent } from '..'; -import { GetSessionDataManager, IsOwnerOfFurniture, SendMessageComposer } from '../../..'; -import { GetRoomEngine } from '../../GetRoomEngine'; -import { RoomWidgetUpdateYoutubeDisplayEvent } from '../events'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureYoutubeDisplayWidgetHandler extends RoomWidgetHandler -{ - public static readonly CONTROL_COMMAND_PREVIOUS_VIDEO = 0; - public static readonly CONTROL_COMMAND_NEXT_VIDEO = 1; - public static readonly CONTROL_COMMAND_PAUSE_VIDEO = 2; - public static readonly CONTROL_COMMAND_CONTINUE_VIDEO = 3; - - private _lastFurniId: number = -1; - - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.OPEN_WIDGET: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - this._lastFurniId = widgetEvent.objectId; - - const hasControl = GetSessionDataManager().hasSecurity(SecurityLevel.EMPLOYEE) || IsOwnerOfFurniture(roomObject); - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateYoutubeDisplayEvent(roomObject.id, hasControl)); - SendMessageComposer(new GetYoutubeDisplayStatusMessageComposer(this._lastFurniId)); - return; - } - case RoomEngineTriggerWidgetEvent.CLOSE_WIDGET: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - if(widgetEvent.objectId !== this._lastFurniId) return; - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateYoutubeDisplayEvent(-1)); - return; - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.YOUTUBE; - } - - public get eventTypes(): string[] - { - return []; - } - - public get messageTypes(): string[] - { - return []; - } -} diff --git a/src/api/nitro/room/widgets/handlers/IRoomWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/IRoomWidgetHandler.ts deleted file mode 100644 index 4043b096..00000000 --- a/src/api/nitro/room/widgets/handlers/IRoomWidgetHandler.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage } from '../messages'; -import { IRoomWidgetHandlerManager } from './IRoomWidgetHandlerManager'; - -export interface IRoomWidgetHandler -{ - processEvent: (event: NitroEvent) => void; - processWidgetMessage: (message: RoomWidgetMessage) => RoomWidgetUpdateEvent; - container: IRoomWidgetHandlerManager; - type: string; - eventTypes: string[]; - messageTypes: string[]; -} diff --git a/src/api/nitro/room/widgets/handlers/IRoomWidgetHandlerManager.ts b/src/api/nitro/room/widgets/handlers/IRoomWidgetHandlerManager.ts deleted file mode 100644 index cb173f01..00000000 --- a/src/api/nitro/room/widgets/handlers/IRoomWidgetHandlerManager.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IEventDispatcher, IRoomSession, NitroEvent } from '@nitrots/nitro-renderer'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage } from '../messages'; -import { IRoomWidgetHandler } from './IRoomWidgetHandler'; - -export interface IRoomWidgetHandlerManager -{ - registerHandler(handler: IRoomWidgetHandler): void; - processEvent(event: NitroEvent): void; - processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent; - roomSession: IRoomSession; - eventDispatcher: IEventDispatcher; -} diff --git a/src/api/nitro/room/widgets/handlers/PollWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/PollWidgetHandler.ts deleted file mode 100644 index 65330784..00000000 --- a/src/api/nitro/room/widgets/handlers/PollWidgetHandler.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { NitroEvent, RoomSessionPollEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { RoomWidgetPollUpdateEvent, RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage, RoomWidgetPollMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class PollWidgetHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - const pollEvent = (event as RoomSessionPollEvent); - - let widgetEvent: RoomWidgetPollUpdateEvent; - - switch(event.type) - { - case RoomSessionPollEvent.OFFER: - widgetEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.OFFER, pollEvent.id); - widgetEvent.summary = pollEvent.summary; - widgetEvent.headline = pollEvent.headline; - break; - case RoomSessionPollEvent.ERROR: - widgetEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.ERROR, pollEvent.id); - widgetEvent.summary = pollEvent.summary; - widgetEvent.headline = pollEvent.headline; - break; - case RoomSessionPollEvent.CONTENT: - widgetEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.CONTENT, pollEvent.id); - widgetEvent.startMessage = pollEvent.startMessage; - widgetEvent.endMessage = pollEvent.endMessage; - widgetEvent.numQuestions = pollEvent.numQuestions; - widgetEvent.questionArray = pollEvent.questionArray; - widgetEvent.npsPoll = pollEvent.npsPoll; - break; - } - - if(!widgetEvent) return; - - this.container.eventDispatcher.dispatchEvent(widgetEvent); - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - const pollMessage = (message as RoomWidgetPollMessage); - switch(message.type) - { - case RoomWidgetPollMessage.START: - this.container.roomSession.sendPollStartMessage(pollMessage.id); - break; - case RoomWidgetPollMessage.REJECT: - this.container.roomSession.sendPollRejectMessage(pollMessage.id); - break; - case RoomWidgetPollMessage.ANSWER: - this.container.roomSession.sendPollAnswerMessage(pollMessage.id, pollMessage.questionId, pollMessage.answers); - break; - } - return null; - } - - public get type(): string - { - return RoomWidgetEnum.ROOM_POLL; - } - - public get eventTypes(): string[] - { - return [RoomSessionPollEvent.OFFER, RoomSessionPollEvent.ERROR, RoomSessionPollEvent.CONTENT]; - } - - public get messageTypes(): string[] - { - return [RoomWidgetPollMessage.ANSWER, RoomWidgetPollMessage.REJECT, RoomWidgetPollMessage.START]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/RoomWidgetAvatarInfoHandler.ts b/src/api/nitro/room/widgets/handlers/RoomWidgetAvatarInfoHandler.ts deleted file mode 100644 index 5ec47a95..00000000 --- a/src/api/nitro/room/widgets/handlers/RoomWidgetAvatarInfoHandler.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { NitroEvent, RoomEngineUseProductEvent, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionDanceEvent, RoomSessionPetStatusUpdateEvent, RoomSessionUserDataUpdateEvent, RoomWidgetEnum, SetRelationshipStatusComposer } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '../../..'; -import { GetRoomEngine, GetSessionDataManager, IsOwnerOfFurniture } from '../../../..'; -import { MessengerFriend } from '../../../../../components/friends/common/MessengerFriend'; -import { FurniCategory } from '../../../../../components/inventory/common/FurniCategory'; -import { RoomWidgetAvatarInfoEvent, RoomWidgetUpdateDanceStatusEvent, RoomWidgetUpdateEvent, RoomWidgetUpdateUserDataEvent, RoomWidgetUseProductBubbleEvent, UseProductItem } from '../events'; -import { RoomWidgetAvatarExpressionMessage, RoomWidgetChangePostureMessage, RoomWidgetDanceMessage, RoomWidgetMessage, RoomWidgetRoomObjectMessage, RoomWidgetUseProductMessage, RoomWidgetUserActionMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class RoomWidgetAvatarInfoHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomSessionUserDataUpdateEvent.USER_DATA_UPDATED: - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateUserDataEvent()); - return; - case RoomSessionDanceEvent.RSDE_DANCE: - const danceEvent = (event as RoomSessionDanceEvent); - - let isDancing = false; - - const userData = this.container.roomSession.userDataManager.getUserData(GetSessionDataManager().userId); - - if(userData && (userData.roomIndex === danceEvent.roomIndex)) isDancing = (danceEvent.danceId !== 0); - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateDanceStatusEvent(isDancing)); - return; - case RoomEngineUseProductEvent.USE_PRODUCT_FROM_INVENTORY: - return; - case RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM: - this.processUsableRoomObject((event as RoomEngineUseProductEvent).objectId); - return; - case RoomSessionPetStatusUpdateEvent.PET_STATUS_UPDATE: - this.processRoomSessionPetStatusUpdateEvent((event as RoomSessionPetStatusUpdateEvent)); - return; - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - let userId = 0; - - if(message instanceof RoomWidgetUserActionMessage) userId = message.userId; - - switch(message.type) - { - case RoomWidgetRoomObjectMessage.GET_OWN_CHARACTER_INFO: - this.processOwnCharacterInfo(); - break; - case RoomWidgetUserActionMessage.START_NAME_CHANGE: - // habbo help - start name change - break; - case RoomWidgetUserActionMessage.REQUEST_PET_UPDATE: - break; - case RoomWidgetUseProductMessage.PET_PRODUCT: { - const productMessage = (message as RoomWidgetUseProductMessage); - - this.container.roomSession.usePetProduct(productMessage.objectId, productMessage.petId); - break; - } - case RoomWidgetUserActionMessage.HARVEST_PET: - this.container.roomSession.harvestPet(userId); - break; - case RoomWidgetUserActionMessage.COMPOST_PLANT: - this.container.roomSession.compostPlant(userId); - break; - case RoomWidgetDanceMessage.DANCE: { - const danceMessage = (message as RoomWidgetDanceMessage); - - this.container.roomSession.sendDanceMessage(danceMessage.style); - break; - } - case RoomWidgetAvatarExpressionMessage.AVATAR_EXPRESSION: { - const expressionMessage = (message as RoomWidgetAvatarExpressionMessage); - - this.container.roomSession.sendExpressionMessage(expressionMessage.animation.ordinal) - break; - } - case RoomWidgetChangePostureMessage.CHANGE_POSTURE: { - const postureMessage = (message as RoomWidgetChangePostureMessage); - - this.container.roomSession.sendPostureMessage(postureMessage.posture); - break; - } - case RoomWidgetUserActionMessage.RELATIONSHIP_NONE: { - SendMessageComposer(new SetRelationshipStatusComposer(userId, MessengerFriend.RELATIONSHIP_NONE)); - break; - } - case RoomWidgetUserActionMessage.RELATIONSHIP_HEART: { - SendMessageComposer(new SetRelationshipStatusComposer(userId, MessengerFriend.RELATIONSHIP_HEART)); - break; - } - case RoomWidgetUserActionMessage.RELATIONSHIP_SMILE: { - SendMessageComposer(new SetRelationshipStatusComposer(userId, MessengerFriend.RELATIONSHIP_SMILE)); - break; - } - case RoomWidgetUserActionMessage.RELATIONSHIP_BOBBA: { - SendMessageComposer(new SetRelationshipStatusComposer(userId, MessengerFriend.RELATIONSHIP_BOBBA)); - break; - } - } - - return null; - } - - private processOwnCharacterInfo(): void - { - const userId = GetSessionDataManager().userId; - const userName = GetSessionDataManager().userName; - const allowNameChange = GetSessionDataManager().canChangeName; - const userData = this.container.roomSession.userDataManager.getUserData(userId); - - if(!userData) return; - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetAvatarInfoEvent(userId, userName, userData.type, userData.roomIndex, allowNameChange)); - } - - private processUsableRoomObject(objectId: number): void - { - const roomId = this.container.roomSession.roomId; - const roomObject = GetRoomEngine().getRoomObject(roomId, objectId, RoomObjectCategory.FLOOR); - - if(!roomObject || !IsOwnerOfFurniture(roomObject)) return; - - const ownerId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - const furniData = GetSessionDataManager().getFloorItemData(typeId); - const parts = furniData.customParams.split(' '); - const part = (parts.length ? parseInt(parts[0]) : -1); - - if(part === -1) return; - - this.processUseableProduct(roomId, objectId, part, furniData.specialType, ownerId); - } - - private processUseableProduct(roomId: number, objectId: number, part: number, specialType: number, ownerId: number, arg6 = -1): void - { - const useProductBubbles: UseProductItem[] = []; - const roomObjects = GetRoomEngine().getRoomObjects(roomId, RoomObjectCategory.UNIT); - - for(const roomObject of roomObjects) - { - const userData = this.container.roomSession.userDataManager.getUserDataByIndex(roomObject.id); - - let replace = false; - - if(!userData || (userData.type !== RoomObjectType.PET)) - { - - } - else - { - if(userData.ownerId === ownerId) - { - if(userData.hasSaddle && (specialType === FurniCategory.PET_SADDLE)) replace = true; - - const figureParts = userData.figure.split(' '); - const figurePart = (figureParts.length ? parseInt(figureParts[0]) : -1); - - if(figurePart === part) - { - if(specialType === FurniCategory.MONSTERPLANT_REVIVAL) - { - if(!userData.canRevive) continue; - } - - if(specialType === FurniCategory.MONSTERPLANT_REBREED) - { - if((userData.petLevel < 7) || userData.canRevive || userData.canBreed) continue; - } - - if(specialType === FurniCategory.MONSTERPLANT_FERTILIZE) - { - if((userData.petLevel >= 7) || userData.canRevive) continue; - } - - useProductBubbles.push(new UseProductItem(userData.roomIndex, RoomObjectCategory.UNIT, userData.name, objectId, roomObject.id, arg6, replace)); - } - } - } - } - - if(useProductBubbles.length) this.container.eventDispatcher.dispatchEvent(new RoomWidgetUseProductBubbleEvent(RoomWidgetUseProductBubbleEvent.USE_PRODUCT_BUBBLES, useProductBubbles)); - } - - private processRoomSessionPetStatusUpdateEvent(event: RoomSessionPetStatusUpdateEvent): void - { - - } - - public get type(): string - { - return RoomWidgetEnum.AVATAR_INFO; - } - - public get eventTypes(): string[] - { - return [ - RoomSessionUserDataUpdateEvent.USER_DATA_UPDATED, - RoomSessionDanceEvent.RSDE_DANCE, - RoomEngineUseProductEvent.USE_PRODUCT_FROM_INVENTORY, - RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM, - RoomSessionPetStatusUpdateEvent.PET_STATUS_UPDATE - ]; - } - - // UserNameUpdateEvent.UNUE_NAME_UPDATED - // RoomSessionNestBreedingSuccessEvent.RSPFUE_NEST_BREEDING_SUCCESS - // RoomSessionPetLevelUpdateEvent.RSPLUE_PET_LEVEL_UPDATE - - public get messageTypes(): string[] - { - return [ - RoomWidgetRoomObjectMessage.GET_OWN_CHARACTER_INFO, - RoomWidgetUserActionMessage.START_NAME_CHANGE, - RoomWidgetUserActionMessage.REQUEST_PET_UPDATE, - RoomWidgetUseProductMessage.PET_PRODUCT, - RoomWidgetUserActionMessage.REQUEST_BREED_PET, - RoomWidgetUserActionMessage.HARVEST_PET, - RoomWidgetUserActionMessage.REVIVE_PET, - RoomWidgetUserActionMessage.COMPOST_PLANT, - RoomWidgetDanceMessage.DANCE, - RoomWidgetAvatarExpressionMessage.AVATAR_EXPRESSION, - RoomWidgetChangePostureMessage.CHANGE_POSTURE, - RoomWidgetUserActionMessage.RELATIONSHIP_NONE, - RoomWidgetUserActionMessage.RELATIONSHIP_HEART, - RoomWidgetUserActionMessage.RELATIONSHIP_SMILE, - RoomWidgetUserActionMessage.RELATIONSHIP_BOBBA - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts b/src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts deleted file mode 100644 index d2358423..00000000 --- a/src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { AvatarFigurePartType, AvatarScaleType, AvatarSetType, IAvatarImageListener, INitroPoint, IVector3D, NitroEvent, NitroPoint, PetFigureData, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionChatEvent, RoomWidgetEnum, SystemChatStyleEnum, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; -import { GetAvatarRenderManager, GetConfigurationManager, GetRoomEngine, PlaySound } from '../../../..'; -import { LocalizeText } from '../../../../utils/LocalizeText'; -import { RoomWidgetUpdateChatEvent, RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class RoomWidgetChatHandler extends RoomWidgetHandler implements IAvatarImageListener -{ - private _avatarColorCache: Map = new Map(); - private _avatarImageCache: Map = new Map(); - private _petImageCache: Map = new Map(); - - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomSessionChatEvent.CHAT_EVENT: { - const chatEvent = (event as RoomSessionChatEvent); - - const roomObject = GetRoomEngine().getRoomObject(chatEvent.session.roomId, chatEvent.objectId, RoomObjectCategory.UNIT); - - if(!roomObject) return; - - const objectLocation = roomObject.getLocation(); - const bubbleLocation = this.getBubbleLocation(chatEvent.session.roomId, objectLocation); - const userData = this.container.roomSession.userDataManager.getUserDataByIndex(chatEvent.objectId); - - let username = ''; - let avatarColor = 0; - let imageUrl: string = null; - let chatType = chatEvent.chatType; - let styleId = chatEvent.style; - let userType = 0; - let petType = -1; - let text = chatEvent.message; - - if(userData) - { - userType = userData.type; - - const figure = userData.figure; - - switch(userType) - { - case RoomObjectType.PET: - imageUrl = this.getPetImage(figure, 2, true, 64, roomObject.model.getValue(RoomObjectVariable.FIGURE_POSTURE)); - petType = new PetFigureData(figure).typeId; - break; - case RoomObjectType.USER: - imageUrl = this.getUserImage(figure); - break; - case RoomObjectType.RENTABLE_BOT: - case RoomObjectType.BOT: - styleId = SystemChatStyleEnum.BOT; - break; - } - - avatarColor = this._avatarColorCache.get(figure); - username = userData.name; - } - - switch(chatType) - { - case RoomSessionChatEvent.CHAT_TYPE_RESPECT: - text = LocalizeText('widgets.chatbubble.respect', [ 'username' ], [ username ]); - if(GetConfigurationManager().getValue('respect.options')['enabled']) - PlaySound(GetConfigurationManager().getValue('respect.options')['sound']) - break; - case RoomSessionChatEvent.CHAT_TYPE_PETREVIVE: - case RoomSessionChatEvent.CHAT_TYPE_PET_REBREED_FERTILIZE: - case RoomSessionChatEvent.CHAT_TYPE_PET_SPEED_FERTILIZE: { - let textKey = 'widget.chatbubble.petrevived'; - - if(chatType === RoomSessionChatEvent.CHAT_TYPE_PET_REBREED_FERTILIZE) - { - textKey = 'widget.chatbubble.petrefertilized;'; - } - - else if(chatType === RoomSessionChatEvent.CHAT_TYPE_PET_SPEED_FERTILIZE) - { - textKey = 'widget.chatbubble.petspeedfertilized'; - } - - let targetUserName: string = null; - - const newRoomObject = GetRoomEngine().getRoomObject(chatEvent.session.roomId, chatEvent.extraParam, RoomObjectCategory.UNIT); - - if(newRoomObject) - { - const newUserData = this.container.roomSession.userDataManager.getUserDataByIndex(roomObject.id); - - if(newUserData) targetUserName = newUserData.name; - } - - text = LocalizeText(textKey, [ 'petName', 'userName' ], [ username, targetUserName ]); - break; - } - case RoomSessionChatEvent.CHAT_TYPE_PETRESPECT: - text = LocalizeText('widget.chatbubble.petrespect', [ 'petname' ], [ username ]); - break; - case RoomSessionChatEvent.CHAT_TYPE_PETTREAT: - text = LocalizeText('widget.chatbubble.pettreat', [ 'petname' ], [ username ]); - break; - case RoomSessionChatEvent.CHAT_TYPE_HAND_ITEM_RECEIVED: - text = LocalizeText('widget.chatbubble.handitem', [ 'username', 'handitem' ], [ username, LocalizeText(('handitem' + chatEvent.extraParam))]); - break; - case RoomSessionChatEvent.CHAT_TYPE_MUTE_REMAINING: { - const hours = ((chatEvent.extraParam > 0) ? Math.floor((chatEvent.extraParam / 3600)) : 0).toString(); - const minutes = ((chatEvent.extraParam > 0) ? Math.floor((chatEvent.extraParam % 3600) / 60) : 0).toString(); - const seconds = (chatEvent.extraParam % 60).toString(); - - text = LocalizeText('widget.chatbubble.mutetime', [ 'hours', 'minutes', 'seconds' ], [ hours, minutes, seconds ]); - break; - } - } - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateChatEvent(RoomWidgetUpdateChatEvent.CHAT_EVENT, userData.roomIndex, text, username, RoomObjectCategory.UNIT, userType, petType, bubbleLocation.x, bubbleLocation.y, imageUrl, avatarColor, chatEvent.session.roomId, chatType, styleId, [])); - - return; - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - return null; - } - - private getBubbleLocation(roomId: number, userLocation: IVector3D, canvasId = 1): INitroPoint - { - const geometry = GetRoomEngine().getRoomInstanceGeometry(roomId, canvasId); - const scale = GetRoomEngine().getRoomInstanceRenderingCanvasScale(roomId, canvasId); - - let x = ((document.body.offsetWidth * scale) / 2); - let y = ((document.body.offsetHeight * scale) / 2); - - if(geometry && userLocation) - { - const screenPoint = geometry.getScreenPoint(userLocation); - - if(screenPoint) - { - x = (x + (screenPoint.x * scale)); - y = (y + (screenPoint.y * scale)); - - const offsetPoint = GetRoomEngine().getRoomInstanceRenderingCanvasOffset(roomId, canvasId); - - if(offsetPoint) - { - x = (x + offsetPoint.x); - y = (y + offsetPoint.y); - } - } - } - - return new NitroPoint(x, y); - } - - public getUserImage(figure: string): string - { - let existing = this._avatarImageCache.get(figure); - - if(!existing) - { - existing = this.setFigureImage(figure); - } - - return existing; - } - - private setFigureImage(figure: string): string - { - const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, null, this); - - if(!avatarImage) return; - - const image = avatarImage.getCroppedImage(AvatarSetType.HEAD); - const color = avatarImage.getPartColor(AvatarFigurePartType.CHEST); - - this._avatarColorCache.set(figure, ((color && color.rgb) || 16777215)); - - avatarImage.dispose(); - - this._avatarImageCache.set(figure, image.src); - - return image.src; - } - - private getPetImage(figure: string, direction: number, _arg_3: boolean, scale: number = 64, posture: string = null): string - { - let existing = this._petImageCache.get((figure + posture)); - - if(existing) return existing; - - const figureData = new PetFigureData(figure); - const typeId = figureData.typeId; - const image = GetRoomEngine().getRoomObjectPetImage(typeId, figureData.paletteId, figureData.color, new Vector3d((direction * 45)), scale, null, false, 0, figureData.customParts, posture); - - if(image) - { - existing = TextureUtils.generateImageUrl(image.data); - - this._petImageCache.set((figure + posture), existing); - } - - return existing; - } - - public resetFigure(figure: string): void - { - this.setFigureImage(figure); - } - - public dispose(): void - { - - } - - public get disposed(): boolean - { - return false; - } - - public get type(): string - { - return RoomWidgetEnum.CHAT_WIDGET; - } - - public get eventTypes(): string[] - { - return [ - RoomSessionChatEvent.CHAT_EVENT - ]; - } - - public get messageTypes(): string[] - { - return []; - } -} diff --git a/src/api/nitro/room/widgets/handlers/RoomWidgetChatInputHandler.ts b/src/api/nitro/room/widgets/handlers/RoomWidgetChatInputHandler.ts deleted file mode 100644 index f9a01321..00000000 --- a/src/api/nitro/room/widgets/handlers/RoomWidgetChatInputHandler.ts +++ /dev/null @@ -1,238 +0,0 @@ -import { AvatarExpressionEnum, HabboClubLevelEnum, NitroEvent, RoomControllerLevel, RoomRotatingEffect, RoomSessionChatEvent, RoomSettingsComposer, RoomShakingEffect, RoomWidgetEnum, RoomZoomEvent, TextureUtils } from '@nitrots/nitro-renderer'; -import { GetClubMemberLevel, GetConfiguration, GetNitroInstance, SendMessageComposer } from '../../..'; -import { GetRoomEngine, GetSessionDataManager, LocalizeText, NotificationUtilities } from '../../../..'; -import { FloorplanEditorEvent } from '../../../../../events/floorplan-editor/FloorplanEditorEvent'; -import { DispatchUiEvent } from '../../../../../hooks'; -import { RoomWidgetFloodControlEvent, RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetChatMessage, RoomWidgetChatSelectAvatarMessage, RoomWidgetChatTypingMessage, RoomWidgetMessage, RoomWidgetRequestWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class RoomWidgetChatInputHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomSessionChatEvent.FLOOD_EVENT: { - const floodEvent = (event as RoomSessionChatEvent); - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetFloodControlEvent(parseInt(floodEvent.message))); - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - case RoomWidgetChatTypingMessage.TYPING_STATUS: { - const typingMessage = (message as RoomWidgetChatTypingMessage); - - this.container.roomSession.sendChatTypingMessage(typingMessage.isTyping); - break; - } - case RoomWidgetChatMessage.MESSAGE_CHAT: { - const chatMessage = (message as RoomWidgetChatMessage); - - if(chatMessage.text === '') return null; - - let text = chatMessage.text; - const parts = text.split(' '); - - if(parts.length > 0) - { - const firstPart = parts[0]; - let secondPart = ''; - - if(parts.length > 1) secondPart = parts[1]; - - if((firstPart.charAt(0) === ':') && (secondPart === 'x')) - { - const selectedAvatarId = GetRoomEngine().selectedAvatarId; - - if(selectedAvatarId > -1) - { - const userData = this.container.roomSession.userDataManager.getUserDataByIndex(selectedAvatarId); - - if(userData) - { - secondPart = userData.name; - text = chatMessage.text.replace(' x', (' ' + userData.name)); - } - } - } - - switch(firstPart.toLowerCase()) - { - case ':shake': - RoomShakingEffect.init(2500, 5000); - RoomShakingEffect.turnVisualizationOn(); - - return null; - - case ':rotate': - RoomRotatingEffect.init(2500, 5000); - RoomRotatingEffect.turnVisualizationOn(); - - return null; - case ':d': - case ';d': - if(GetClubMemberLevel() === HabboClubLevelEnum.VIP) - { - this.container.roomSession.sendExpressionMessage(AvatarExpressionEnum.LAUGH.ordinal); - } - - break; - case 'o/': - case '_o/': - this.container.roomSession.sendExpressionMessage(AvatarExpressionEnum.WAVE.ordinal); - - return null; - case ':kiss': - if(GetClubMemberLevel() === HabboClubLevelEnum.VIP) - { - this.container.roomSession.sendExpressionMessage(AvatarExpressionEnum.BLOW.ordinal); - - return null; - } - - break; - case ':jump': - if(GetClubMemberLevel() === HabboClubLevelEnum.VIP) - { - this.container.roomSession.sendExpressionMessage(AvatarExpressionEnum.JUMP.ordinal); - - return null; - } - - break; - case ':idle': - this.container.roomSession.sendExpressionMessage(AvatarExpressionEnum.IDLE.ordinal); - - return null; - case '_b': - this.container.roomSession.sendExpressionMessage(AvatarExpressionEnum.RESPECT.ordinal); - - return null; - case ':sign': - this.container.roomSession.sendSignMessage(parseInt(secondPart)); - - return null; - case ':iddqd': - case ':flip': - GetRoomEngine().events.dispatchEvent(new RoomZoomEvent(this.container.roomSession.roomId, -1, true)); - - return null; - case ':zoom': - GetRoomEngine().events.dispatchEvent(new RoomZoomEvent(this.container.roomSession.roomId, parseInt(secondPart), false)); - - return null; - case ':screenshot': - const texture = GetRoomEngine().createTextureFromRoom(this.container.roomSession.roomId, 1); - - const image = new Image(); - - image.src = TextureUtils.generateImageUrl(texture); - - const newWindow = window.open(''); - newWindow.document.write(image.outerHTML); - return null; - case ':pickall': - NotificationUtilities.confirm(LocalizeText('room.confirm.pick_all'), () => - { - GetSessionDataManager().sendSpecialCommandMessage(':pickall'); - }, - null, null, null, LocalizeText('generic.alert.title')); - - return null; - case ':furni': - this.container.processWidgetMessage(new RoomWidgetRequestWidgetMessage(RoomWidgetRequestWidgetMessage.FURNI_CHOOSER)); - - return null; - case ':chooser': - this.container.processWidgetMessage(new RoomWidgetRequestWidgetMessage(RoomWidgetRequestWidgetMessage.USER_CHOOSER)); - - return null; - case ':floor': - case ':bcfloor': - if(this.container.roomSession.controllerLevel >= RoomControllerLevel.ROOM_OWNER) - { - //this.container.processWidgetMessage(new RoomWidgetRequestWidgetMessage(RoomWidgetRequestWidgetMessage.FLOOR_EDITOR)); - DispatchUiEvent(new FloorplanEditorEvent(FloorplanEditorEvent.SHOW_FLOORPLAN_EDITOR)); - } - - return null; - case ':togglefps': { - if(GetNitroInstance().ticker.maxFPS > 0) GetNitroInstance().ticker.maxFPS = 0; - else GetNitroInstance().ticker.maxFPS = GetConfiguration('system.animation.fps'); - - return null; - } - case ':client': - case ':nitro': - case ':billsonnn': - // this.container.notificationService.alertWithScrollableMessages([ - // '
Version: ' + Nitro.RELEASE_VERSION + '
This client is powered by Nitro HTML5


'], 'Nitro HTML5'); - return null; - case ':settings': - if(this.container.roomSession.isRoomOwner || GetSessionDataManager().isModerator) - { - SendMessageComposer(new RoomSettingsComposer(this.container.roomSession.roomId)); - } - - return null; - } - } - - const styleId = chatMessage.styleId; - - if(this.container && this.container.roomSession) - { - switch(chatMessage.chatType) - { - case RoomWidgetChatMessage.CHAT_DEFAULT: - this.container.roomSession.sendChatMessage(text, styleId); - break; - case RoomWidgetChatMessage.CHAT_SHOUT: - this.container.roomSession.sendShoutMessage(text, styleId); - break; - case RoomWidgetChatMessage.CHAT_WHISPER: - this.container.roomSession.sendWhisperMessage(chatMessage.recipientName, text, styleId); - break; - } - } - - break; - } - case RoomWidgetChatSelectAvatarMessage.MESSAGE_SELECT_AVATAR: { - const selectedEvent = (message as RoomWidgetChatSelectAvatarMessage); - - GetRoomEngine().setSelectedAvatar(selectedEvent.roomId, selectedEvent.objectId); - break; - } - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.CHAT_INPUT_WIDGET; - } - - public get eventTypes(): string[] - { - return [ - RoomSessionChatEvent.FLOOD_EVENT - ]; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetChatTypingMessage.TYPING_STATUS, - RoomWidgetChatMessage.MESSAGE_CHAT, - RoomWidgetChatSelectAvatarMessage.MESSAGE_SELECT_AVATAR - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/RoomWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/RoomWidgetHandler.ts deleted file mode 100644 index ef0c9d39..00000000 --- a/src/api/nitro/room/widgets/handlers/RoomWidgetHandler.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage } from '../messages'; -import { IRoomWidgetHandler } from './IRoomWidgetHandler'; -import { IRoomWidgetHandlerManager } from './IRoomWidgetHandlerManager'; - -export abstract class RoomWidgetHandler implements IRoomWidgetHandler -{ - private _container: IRoomWidgetHandlerManager = null; - - public abstract processEvent(event: NitroEvent): void; - - public abstract processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent; - - public get container(): IRoomWidgetHandlerManager - { - return this._container; - } - - public set container(container: IRoomWidgetHandlerManager) - { - this._container = container; - } - - public abstract get type(): string; - - public abstract get eventTypes(): string[]; - - public abstract get messageTypes(): string[]; -} diff --git a/src/api/nitro/room/widgets/handlers/RoomWidgetHandlerManager.ts b/src/api/nitro/room/widgets/handlers/RoomWidgetHandlerManager.ts deleted file mode 100644 index 4bf56a99..00000000 --- a/src/api/nitro/room/widgets/handlers/RoomWidgetHandlerManager.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { IEventDispatcher, IRoomSession, NitroEvent, RoomEngineTriggerWidgetEvent } from '@nitrots/nitro-renderer'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage } from '../messages'; -import { IRoomWidgetHandler } from './IRoomWidgetHandler'; -import { IRoomWidgetHandlerManager } from './IRoomWidgetHandlerManager'; - -export class RoomWidgetHandlerManager implements IRoomWidgetHandlerManager -{ - private _roomSession: IRoomSession; - private _eventDispatcher: IEventDispatcher; - private _handlers: IRoomWidgetHandler[] = []; - private _eventMap: Map = new Map(); - private _messageMap: Map = new Map(); - - constructor(roomSession: IRoomSession, eventDispatcher: IEventDispatcher) - { - this._roomSession = roomSession; - this._eventDispatcher = eventDispatcher; - } - - public registerHandler(handler: IRoomWidgetHandler): void - { - const eventTypes = handler.eventTypes; - - eventTypes.push(RoomEngineTriggerWidgetEvent.OPEN_WIDGET, RoomEngineTriggerWidgetEvent.CLOSE_WIDGET); - - if(eventTypes && eventTypes.length) - { - for(const name of eventTypes) - { - if(!name) continue; - - let events = this._eventMap.get(name); - - if(!events) - { - events = []; - - this._eventMap.set(name, events); - } - - events.push(handler); - } - } - - const messageTypes = handler.messageTypes; - - if(messageTypes && messageTypes.length) - { - for(const name of messageTypes) - { - if(!name) continue; - - let messages = this._messageMap.get(name); - - if(!messages) - { - messages = []; - - this._messageMap.set(name, messages); - } - - messages.push(handler); - } - } - - handler.container = this; - - this._handlers.push(handler); - } - - public processEvent(event: NitroEvent): void - { - const handlers = this._eventMap.get(event.type); - - if(!handlers || !handlers.length) return null; - - for(const handler of handlers) - { - if(!handler) continue; - - let dispatch = true; - - if((event.type === RoomEngineTriggerWidgetEvent.OPEN_WIDGET) || (event.type === RoomEngineTriggerWidgetEvent.CLOSE_WIDGET)) - { - if(event instanceof RoomEngineTriggerWidgetEvent) - { - dispatch = (handler.type === event.widget); - } - } - - if(dispatch) handler.processEvent(event); - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - const handlers = this._messageMap.get(message.type); - - if(!handlers || !handlers.length) return null; - - for(const handler of handlers) - { - if(!handler) continue; - - const update = handler.processWidgetMessage(message); - - if(!update) continue; - - return update; - } - - return null; - } - - public get roomSession(): IRoomSession - { - return this._roomSession; - } - - public get eventDispatcher(): IEventDispatcher - { - return this._eventDispatcher; - } -} diff --git a/src/api/nitro/room/widgets/handlers/RoomWidgetInfostandHandler.ts b/src/api/nitro/room/widgets/handlers/RoomWidgetInfostandHandler.ts deleted file mode 100644 index 5641e6e7..00000000 --- a/src/api/nitro/room/widgets/handlers/RoomWidgetInfostandHandler.ts +++ /dev/null @@ -1,839 +0,0 @@ -import { IFurnitureData, NitroEvent, ObjectDataFactory, PetFigureData, PetRespectComposer, PetSupplementComposer, PetType, RoomControllerLevel, RoomModerationSettings, RoomObjectCategory, RoomObjectOperationType, RoomObjectType, RoomObjectVariable, RoomSessionPetInfoUpdateEvent, RoomSessionUserBadgesEvent, RoomSessionUserFigureUpdateEvent, RoomTradingLevelEnum, RoomUnitDropHandItemComposer, RoomUnitGiveHandItemComposer, RoomUnitGiveHandItemPetComposer, RoomUserData, RoomWidgetEnum, RoomWidgetEnumItemExtradataParameter, Vector3d } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '../../..'; -import { GetNitroInstance, GetRoomEngine, GetSessionDataManager, IsOwnerOfFurniture } from '../../../..'; -import { FriendsHelper } from '../../../../../components/friends/common/FriendsHelper'; -import { PetSupplementEnum } from '../../../../../components/room/widgets/avatar-info/common/PetSupplementEnum'; -import { FriendsSendFriendRequestEvent, HelpReportUserEvent, InventoryTradeRequestEvent, WiredSelectObjectEvent } from '../../../../../events'; -import { DispatchUiEvent } from '../../../../../hooks'; -import { LocalizeText } from '../../../../utils/LocalizeText'; -import { RoomWidgetObjectNameEvent, RoomWidgetUpdateChatInputContentEvent, RoomWidgetUpdateEvent, RoomWidgetUpdateInfostandFurniEvent, RoomWidgetUpdateInfostandPetEvent, RoomWidgetUpdateInfostandRentableBotEvent, RoomWidgetUpdateInfostandUserEvent } from '../events'; -import { RoomWidgetChangeMottoMessage, RoomWidgetFurniActionMessage, RoomWidgetMessage, RoomWidgetRoomObjectMessage, RoomWidgetUserActionMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class RoomWidgetInfostandHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomSessionPetInfoUpdateEvent.PET_INFO: - this.processPetInfoEvent((event as RoomSessionPetInfoUpdateEvent)); - return; - case RoomSessionUserBadgesEvent.RSUBE_BADGES: - this.container.eventDispatcher.dispatchEvent(event); - return; - case RoomSessionUserFigureUpdateEvent.USER_FIGURE: - this.processRoomSessionUserFigureUpdateEvent((event as RoomSessionUserFigureUpdateEvent)); - return; - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - let userId = 0; - let userData: RoomUserData = null; - let objectId = 0; - let category = 0; - - if(message instanceof RoomWidgetUserActionMessage) - { - userId = message.userId; - - const petMessages = [ - RoomWidgetUserActionMessage.REQUEST_PET_UPDATE, - RoomWidgetUserActionMessage.RESPECT_PET, - RoomWidgetUserActionMessage.PICKUP_PET, - RoomWidgetUserActionMessage.MOUNT_PET, - RoomWidgetUserActionMessage.TOGGLE_PET_RIDING_PERMISSION, - RoomWidgetUserActionMessage.TOGGLE_PET_BREEDING_PERMISSION, - RoomWidgetUserActionMessage.DISMOUNT_PET, - RoomWidgetUserActionMessage.SADDLE_OFF, - RoomWidgetUserActionMessage.GIVE_CARRY_ITEM_TO_PET, - RoomWidgetUserActionMessage.GIVE_WATER_TO_PET, - RoomWidgetUserActionMessage.GIVE_LIGHT_TO_PET, - RoomWidgetUserActionMessage.TREAT_PET - ]; - - if(petMessages.indexOf(message.type) >= 0) - { - userData = this.container.roomSession.userDataManager.getPetData(userId); - } - else - { - userData = this.container.roomSession.userDataManager.getUserData(userId); - } - - if(!userData) return null; - } - - else if(message instanceof RoomWidgetFurniActionMessage) - { - objectId = message.furniId; - category = message.furniCategory; - } - - switch(message.type) - { - case RoomWidgetRoomObjectMessage.GET_OBJECT_NAME: - return this.processObjectNameMessage((message as RoomWidgetRoomObjectMessage)); - case RoomWidgetRoomObjectMessage.GET_OBJECT_INFO: - return this.processObjectInfoMessage((message as RoomWidgetRoomObjectMessage)); - case RoomWidgetUserActionMessage.SEND_FRIEND_REQUEST: - DispatchUiEvent(new FriendsSendFriendRequestEvent(userData.webID, userData.name)); - break; - case RoomWidgetUserActionMessage.RESPECT_USER: - GetSessionDataManager().giveRespect(userId); - break; - case RoomWidgetUserActionMessage.RESPECT_PET: - GetSessionDataManager().givePetRespect(userId); - break; - case RoomWidgetUserActionMessage.WHISPER_USER: - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateChatInputContentEvent(RoomWidgetUpdateChatInputContentEvent.WHISPER, userData.name)); - break; - case RoomWidgetUserActionMessage.IGNORE_USER: - GetSessionDataManager().ignoreUser(userData.name); - break; - case RoomWidgetUserActionMessage.UNIGNORE_USER: - GetSessionDataManager().unignoreUser(userData.name); - break; - case RoomWidgetUserActionMessage.KICK_USER: - this.container.roomSession.sendKickMessage((message as RoomWidgetUserActionMessage).userId); - break; - case RoomWidgetUserActionMessage.BAN_USER_DAY: - case RoomWidgetUserActionMessage.BAN_USER_HOUR: - case RoomWidgetUserActionMessage.BAN_USER_PERM: - this.container.roomSession.sendBanMessage((message as RoomWidgetUserActionMessage).userId, message.type); - break; - case RoomWidgetUserActionMessage.MUTE_USER_2MIN: - this.container.roomSession.sendMuteMessage((message as RoomWidgetUserActionMessage).userId, 2); - break; - case RoomWidgetUserActionMessage.MUTE_USER_5MIN: - this.container.roomSession.sendMuteMessage((message as RoomWidgetUserActionMessage).userId, 5); - break; - case RoomWidgetUserActionMessage.MUTE_USER_10MIN: - this.container.roomSession.sendMuteMessage((message as RoomWidgetUserActionMessage).userId, 10); - break; - case RoomWidgetUserActionMessage.GIVE_RIGHTS: - this.container.roomSession.sendGiveRightsMessage((message as RoomWidgetUserActionMessage).userId); - break; - case RoomWidgetUserActionMessage.TAKE_RIGHTS: - this.container.roomSession.sendTakeRightsMessage((message as RoomWidgetUserActionMessage).userId); - break; - case RoomWidgetUserActionMessage.START_TRADING: - DispatchUiEvent(new InventoryTradeRequestEvent(userData.roomIndex, userData.name)); - break; - // case RoomWidgetUserActionMessage.RWUAM_OPEN_HOME_PAGE: - // this._container.sessionDataManager._Str_21275((message as RoomWidgetUserActionMessage).userId, _local_3.name); - // break; - case RoomWidgetUserActionMessage.PICKUP_PET: - this.container.roomSession.pickupPet(userId); - break; - case RoomWidgetUserActionMessage.MOUNT_PET: - this.container.roomSession.mountPet(userId); - break; - case RoomWidgetUserActionMessage.TOGGLE_PET_RIDING_PERMISSION: - this.container.roomSession.togglePetRiding(userId); - break; - case RoomWidgetUserActionMessage.TOGGLE_PET_BREEDING_PERMISSION: - this.container.roomSession.togglePetBreeding(userId); - break; - case RoomWidgetUserActionMessage.DISMOUNT_PET: - this.container.roomSession.dismountPet(userId); - break; - case RoomWidgetUserActionMessage.SADDLE_OFF: - this.container.roomSession.removePetSaddle(userId); - break; - case RoomWidgetUserActionMessage.PASS_CARRY_ITEM: - SendMessageComposer(new RoomUnitGiveHandItemComposer(userId)); - break; - case RoomWidgetUserActionMessage.GIVE_CARRY_ITEM_TO_PET: - SendMessageComposer(new RoomUnitGiveHandItemPetComposer(userId)); - break; - case RoomWidgetUserActionMessage.GIVE_WATER_TO_PET: - SendMessageComposer(new PetSupplementComposer(userId, PetSupplementEnum.WATER)); - break; - case RoomWidgetUserActionMessage.GIVE_LIGHT_TO_PET: - SendMessageComposer(new PetSupplementComposer(userId, PetSupplementEnum.LIGHT)); - break; - case RoomWidgetUserActionMessage.TREAT_PET: - SendMessageComposer(new PetRespectComposer(userId)); - break; - case RoomWidgetUserActionMessage.DROP_CARRY_ITEM: - SendMessageComposer(new RoomUnitDropHandItemComposer()); - break; - case RoomWidgetUserActionMessage.REQUEST_PET_UPDATE: - this.container.roomSession.userDataManager.requestPetInfo(userId); - return; - case RoomWidgetUserActionMessage.REPORT: - return; - case RoomWidgetUserActionMessage.REPORT_CFH_OTHER: - DispatchUiEvent(new HelpReportUserEvent(userId)); - return; - case RoomWidgetUserActionMessage.AMBASSADOR_ALERT_USER: - this.container.roomSession.sendAmbassadorAlertMessage(userId); - return; - case RoomWidgetUserActionMessage.AMBASSADOR_KICK_USER: - this.container.roomSession.sendKickMessage(userId); - return; - case RoomWidgetUserActionMessage.AMBASSADOR_MUTE_USER_2MIN: - this.container.roomSession.sendMuteMessage(userId, 2); - return; - case RoomWidgetUserActionMessage.AMBASSADOR_MUTE_USER_10MIN: - this.container.roomSession.sendMuteMessage(userId, 10); - return; - case RoomWidgetUserActionMessage.AMBASSADOR_MUTE_USER_60MIN: - this.container.roomSession.sendMuteMessage(userId, 60); - return; - case RoomWidgetUserActionMessage.AMBASSADOR_MUTE_USER_18HOUR: - this.container.roomSession.sendMuteMessage(userId, 1080); - return; - case RoomWidgetFurniActionMessage.ROTATE: - GetRoomEngine().processRoomObjectOperation(objectId, category, RoomObjectOperationType.OBJECT_ROTATE_POSITIVE); - return; - case RoomWidgetFurniActionMessage.MOVE: - GetRoomEngine().processRoomObjectOperation(objectId, category, RoomObjectOperationType.OBJECT_MOVE); - return; - case RoomWidgetFurniActionMessage.PICKUP: - GetRoomEngine().processRoomObjectOperation(objectId, category, RoomObjectOperationType.OBJECT_PICKUP); - return; - case RoomWidgetFurniActionMessage.EJECT: - GetRoomEngine().processRoomObjectOperation(objectId, category, RoomObjectOperationType.OBJECT_EJECT); - return; - case RoomWidgetFurniActionMessage.USE: - GetRoomEngine().useRoomObject(objectId, category); - return; - case RoomWidgetFurniActionMessage.SAVE_STUFF_DATA: { - const furniMessage = (message as RoomWidgetFurniActionMessage); - - if(!furniMessage.objectData) return; - - const mapData = new Map(); - const dataParts = furniMessage.objectData.split('\t'); - - if(dataParts) - { - for(const part of dataParts) - { - const [ key, value ] = part.split('=', 2); - - mapData.set(key, value); - } - } - - GetRoomEngine().modifyRoomObjectDataWithMap(objectId, category, RoomObjectOperationType.OBJECT_SAVE_STUFF_DATA, mapData); - - return; - } - case RoomWidgetChangeMottoMessage.CHANGE_MOTTO: - this.container.roomSession.sendMottoMessage((message as RoomWidgetChangeMottoMessage).motto); - return; - } - - return null; - } - - private processObjectNameMessage(message: RoomWidgetRoomObjectMessage): RoomWidgetUpdateEvent - { - let id = -1; - let name: string = null; - let userType = 0; - - switch(message.category) - { - case RoomObjectCategory.FLOOR: - case RoomObjectCategory.WALL: { - const roomObject = GetRoomEngine().getRoomObject(this.container.roomSession.roomId, message.id, message.category); - - if(!roomObject) break; - - if(roomObject.type.indexOf('poster') === 0) - { - name = LocalizeText('${poster_' + parseInt(roomObject.type.replace('poster', '')) + '_name}'); - } - else - { - let furniData: IFurnitureData = null; - - const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - - if(message.category === RoomObjectCategory.FLOOR) - { - furniData = GetSessionDataManager().getFloorItemData(typeId); - } - - else if(message.category === RoomObjectCategory.WALL) - { - furniData = GetSessionDataManager().getWallItemData(typeId); - } - - if(!furniData) break; - - id = furniData.id; - name = furniData.name; - } - break; - } - case RoomObjectCategory.UNIT: { - const userData = this.container.roomSession.userDataManager.getUserDataByIndex(message.id); - - if(!userData) break; - - id = userData.webID; - name = userData.name; - userType = userData.type; - break; - } - } - - if(name) this.container.eventDispatcher.dispatchEvent(new RoomWidgetObjectNameEvent(RoomWidgetObjectNameEvent.TYPE, message.id, message.category, id, name, userType)); - - return null; - } - - private processObjectInfoMessage(message: RoomWidgetRoomObjectMessage): RoomWidgetUpdateEvent - { - const roomId = this.container.roomSession.roomId; - - switch(message.category) - { - case RoomObjectCategory.FLOOR: - case RoomObjectCategory.WALL: - this.processFurniInfoMessage(message, roomId); - break; - case RoomObjectCategory.UNIT: { - const userData = this.container.roomSession.userDataManager.getUserDataByIndex(message.id); - - if(!userData) break; - - switch(userData.type) - { - case RoomObjectType.PET: - this.container.roomSession.userDataManager.requestPetInfo(userData.webID); - break; - case RoomObjectType.USER: - this.processUserInfoMessage(message, roomId, userData); - break; - case RoomObjectType.BOT: - this.processBotInfoMessage(message, roomId, userData); - break; - case RoomObjectType.RENTABLE_BOT: - this.processRentableBotInfoMessage(message, roomId, userData); - break; - } - } - - } - - return null; - } - - private processFurniInfoMessage(message: RoomWidgetRoomObjectMessage, roomId: number): void - { - const event = new RoomWidgetUpdateInfostandFurniEvent(RoomWidgetUpdateInfostandFurniEvent.FURNI); - - event.id = message.id; - event.category = message.category; - - const roomObject = GetRoomEngine().getRoomObject(roomId, message.id, message.category); - - if(!roomObject) return; - - const model = roomObject.model; - - if(model.getValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM)) - { - event.extraParam = model.getValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM); - } - - const dataFormat = model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT); - const objectData = ObjectDataFactory.getData(dataFormat); - - objectData.initializeFromRoomObjectModel(model); - - event.stuffData = objectData; - - const objectType = roomObject.type; - - if(objectType.indexOf('poster') === 0) - { - const posterId = parseInt(objectType.replace('poster', '')); - - event.name = LocalizeText(('${poster_' + posterId) + '_name}'); - event.description = LocalizeText(('${poster_' + posterId) + '_desc}'); - } - else - { - const typeId = model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); - - let furnitureData: IFurnitureData = null; - - if(message.category === RoomObjectCategory.FLOOR) - { - furnitureData = GetSessionDataManager().getFloorItemData(typeId); - } - - else if(message.category === RoomObjectCategory.WALL) - { - furnitureData = GetSessionDataManager().getWallItemData(typeId); - } - - if(furnitureData) - { - event.name = furnitureData.name; - event.description = furnitureData.description; - event.purchaseOfferId = furnitureData.purchaseOfferId; - event.purchaseCouldBeUsedForBuyout = furnitureData.purchaseCouldBeUsedForBuyout; - event.rentOfferId = furnitureData.rentOfferId; - event.rentCouldBeUsedForBuyout = furnitureData.rentCouldBeUsedForBuyout; - event.availableForBuildersClub = furnitureData.availableForBuildersClub; - event.tileSizeX = furnitureData.tileSizeX; - event.tileSizeY = furnitureData.tileSizeY; - - DispatchUiEvent(new WiredSelectObjectEvent(event.id, event.category)); - } - } - - if(objectType.indexOf('post_it') > -1) event.isStickie = true; - - const expiryTime = model.getValue(RoomObjectVariable.FURNITURE_EXPIRY_TIME); - const expiryTimestamp = model.getValue(RoomObjectVariable.FURNITURE_EXPIRTY_TIMESTAMP); - - event.expiration = ((expiryTime < 0) ? expiryTime : Math.max(0, (expiryTime - ((GetNitroInstance().time - expiryTimestamp) / 1000)))); - - let roomObjectImage = GetRoomEngine().getRoomObjectImage(roomId, message.id, message.category, new Vector3d(180), 64, null); - - if(!roomObjectImage.data || (roomObjectImage.data.width > 140) || (roomObjectImage.data.height > 200)) - { - roomObjectImage = GetRoomEngine().getRoomObjectImage(roomId, message.id, message.category, new Vector3d(180), 1, null); - } - - event.image = roomObjectImage.getImage(); - event.isWallItem = (message.category === RoomObjectCategory.WALL); - event.isRoomOwner = this.container.roomSession.isRoomOwner; - event.roomControllerLevel = this.container.roomSession.controllerLevel; - event.isAnyRoomController = GetSessionDataManager().isModerator; - event.ownerId = model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); - event.ownerName = model.getValue(RoomObjectVariable.FURNITURE_OWNER_NAME); - event.usagePolicy = model.getValue(RoomObjectVariable.FURNITURE_USAGE_POLICY); - - const guildId = model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_GUILD_ID); - - if(guildId !== 0) - { - event.groupId = guildId; - //this.container.connection.send(new _Str_2863(guildId, false)); - } - - if(IsOwnerOfFurniture(roomObject)) event.isOwner = true; - - this.container.eventDispatcher.dispatchEvent(event); - } - - private processUserInfoMessage(message: RoomWidgetRoomObjectMessage, roomId: number, userData: RoomUserData): void - { - let eventType = RoomWidgetUpdateInfostandUserEvent.OWN_USER; - - if(userData.webID !== GetSessionDataManager().userId) eventType = RoomWidgetUpdateInfostandUserEvent.PEER; - - const event = new RoomWidgetUpdateInfostandUserEvent(eventType); - - event.isSpectatorMode = this.container.roomSession.isSpectator; - event.name = userData.name; - event.motto = userData.custom; - event.achievementScore = userData.activityPoints; - event.webID = userData.webID; - event.roomIndex = userData.roomIndex; - event.userType = RoomObjectType.USER; - - const roomObject = GetRoomEngine().getRoomObject(roomId, userData.roomIndex, message.category); - - if(roomObject) event.carryItem = (roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT) || 0); - - if(eventType === RoomWidgetUpdateInfostandUserEvent.OWN_USER) - { - event.realName = GetSessionDataManager().realName; - event.allowNameChange = GetSessionDataManager().canChangeName; - } - - event.amIOwner = this.container.roomSession.isRoomOwner; - event.isGuildRoom = this.container.roomSession.isGuildRoom; - event.roomControllerLevel = this.container.roomSession.controllerLevel; - event.amIAnyRoomController = GetSessionDataManager().isModerator; - event.isAmbassador = GetSessionDataManager().isAmbassador; - - if(eventType === RoomWidgetUpdateInfostandUserEvent.PEER) - { - event.canBeAskedAsFriend = FriendsHelper.canRequestFriend(userData.webID); - - if(!event.canBeAskedAsFriend) - { - const friend = FriendsHelper.getFriend(userData.webID); - - if(friend) - { - event.realName = friend.realName; - event.isFriend = true; - } - } - - if(roomObject) - { - const flatControl = roomObject.model.getValue(RoomObjectVariable.FIGURE_FLAT_CONTROL); - - if(flatControl !== null) event.targetRoomControllerLevel = flatControl; - - event.canBeMuted = this.canBeMuted(event); - event.canBeKicked = this.canBeKicked(event); - event.canBeBanned = this.canBeBanned(event); - } - - event.isIgnored = GetSessionDataManager().isUserIgnored(userData.name); - event.respectLeft = GetSessionDataManager().respectsLeft; - - const isShuttingDown = GetSessionDataManager().isSystemShutdown; - const tradeMode = this.container.roomSession.tradeMode; - - if(isShuttingDown) - { - event.canTrade = false; - } - else - { - switch(tradeMode) - { - case RoomTradingLevelEnum.ROOM_CONTROLLER_REQUIRED: { - const roomController = ((event.roomControllerLevel !== RoomControllerLevel.NONE) && (event.roomControllerLevel !== RoomControllerLevel.GUILD_MEMBER)); - const targetController = ((event.targetRoomControllerLevel !== RoomControllerLevel.NONE) && (event.targetRoomControllerLevel !== RoomControllerLevel.GUILD_MEMBER)); - - event.canTrade = (roomController || targetController); - break; - } - case RoomTradingLevelEnum.NO_TRADING: - event.canTrade = true; - break; - default: - event.canTrade = false; - break; - } - } - - event.canTradeReason = RoomWidgetUpdateInfostandUserEvent.TRADE_REASON_OK; - - if(isShuttingDown) event.canTradeReason = RoomWidgetUpdateInfostandUserEvent.TRADE_REASON_SHUTDOWN; - - if(tradeMode !== RoomTradingLevelEnum.FREE_TRADING) event.canTradeReason = RoomWidgetUpdateInfostandUserEvent.TRADE_REASON_NO_TRADING; - - // const _local_12 = GetSessionDataManager().userId; - // _local_13 = GetSessionDataManager()._Str_18437(_local_12); - // this._Str_16287(_local_12, _local_13); - } - - event.groupId = parseInt(userData.guildId); - event.groupBadgeId = GetSessionDataManager().getGroupBadge(event.groupId); - event.groupName = userData.groupName; - event.badges = this.container.roomSession.userDataManager.getUserBadges(userData.webID); - event.figure = userData.figure; - //var _local_8:Array = GetSessionDataManager()._Str_18437(userData.webID); - //this._Str_16287(userData._Str_2394, _local_8); - //this._container._Str_8097._Str_14387(userData.webID); - //this._container.connection.send(new _Str_8049(userData._Str_2394)); - - this.container.eventDispatcher.dispatchEvent(event); - } - - private processBotInfoMessage(message: RoomWidgetRoomObjectMessage, roomId: number, userData: RoomUserData): void - { - const event = new RoomWidgetUpdateInfostandUserEvent(RoomWidgetUpdateInfostandUserEvent.BOT); - - event.name = userData.name; - event.motto = userData.custom; - event.webID = userData.webID; - event.roomIndex = userData.roomIndex; - event.userType = userData.type; - - const roomObject = GetRoomEngine().getRoomObject(roomId, userData.roomIndex, message.category); - - if(roomObject) event.carryItem = (roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT) || 0); - - event.amIOwner = this.container.roomSession.isRoomOwner; - event.isGuildRoom = this.container.roomSession.isGuildRoom; - event.roomControllerLevel = this.container.roomSession.controllerLevel; - event.amIAnyRoomController = GetSessionDataManager().isModerator; - event.isAmbassador = GetSessionDataManager().isAmbassador; - event.badges = [ RoomWidgetUpdateInfostandUserEvent.DEFAULT_BOT_BADGE_ID ]; - event.figure = userData.figure; - - this.container.eventDispatcher.dispatchEvent(event); - } - - private processRentableBotInfoMessage(message: RoomWidgetRoomObjectMessage, roomId: number, userData: RoomUserData): void - { - const event = new RoomWidgetUpdateInfostandRentableBotEvent(RoomWidgetUpdateInfostandRentableBotEvent.RENTABLE_BOT); - - event.name = userData.name; - event.motto = userData.custom; - event.webID = userData.webID; - event.roomIndex = userData.roomIndex; - event.ownerId = userData.ownerId; - event.ownerName = userData.ownerName; - event.botSkills = userData.botSkills; - - const roomObject = GetRoomEngine().getRoomObject(roomId, userData.roomIndex, message.category); - - if(roomObject) event.carryItem = (roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT) || 0); - - event.amIOwner = this.container.roomSession.isRoomOwner; - event.roomControllerLevel = this.container.roomSession.controllerLevel; - event.amIAnyRoomController = GetSessionDataManager().isModerator; - event.badges = [ RoomWidgetUpdateInfostandUserEvent.DEFAULT_BOT_BADGE_ID ]; - event.figure = userData.figure; - - this.container.eventDispatcher.dispatchEvent(event); - } - - private processPetInfoEvent(event: RoomSessionPetInfoUpdateEvent): void - { - const petData = event.petInfo; - - if(!petData) return; - - const roomPetData = this.container.roomSession.userDataManager.getPetData(petData.id); - - if(!roomPetData) return; - - const figure = new PetFigureData(roomPetData.figure); - - let posture: string = null; - - if(figure.typeId === PetType.MONSTERPLANT) - { - if(petData.level >= petData.adultLevel) posture = 'std'; - else posture = ('grw' + petData.level); - } - - const isOwner = (petData.ownerId === GetSessionDataManager().userId); - const infostandEvent = new RoomWidgetUpdateInfostandPetEvent(RoomWidgetUpdateInfostandPetEvent.PET_INFO); - - infostandEvent.name = roomPetData.name; - infostandEvent.id = petData.id; - infostandEvent.ownerId = petData.ownerId; - infostandEvent.ownerName = petData.ownerName; - infostandEvent.rarityLevel = petData.rarityLevel; - infostandEvent.petType = figure.typeId; - infostandEvent.petBreed = figure.paletteId; - infostandEvent.petFigure = roomPetData.figure; - infostandEvent.posture = posture; - infostandEvent.isOwner = isOwner; - infostandEvent.roomIndex = roomPetData.roomIndex; - infostandEvent.level = petData.level; - infostandEvent.maximumLevel = petData.maximumLevel; - infostandEvent.experience = petData.experience; - infostandEvent.levelExperienceGoal = petData.levelExperienceGoal; - infostandEvent.energy = petData.energy; - infostandEvent.maximumEnergy = petData.maximumEnergy; - infostandEvent.happyness = petData.happyness; - infostandEvent.maximumHappyness = petData.maximumHappyness; - infostandEvent.respect = petData.respect; - infostandEvent.respectsPetLeft = GetSessionDataManager().respectsPetLeft; - infostandEvent.age = petData.age; - infostandEvent.saddle = petData.saddle; - infostandEvent.rider = petData.rider; - infostandEvent.breedable = petData.breedable; - infostandEvent.fullyGrown = petData.fullyGrown; - infostandEvent.dead = petData.dead; - infostandEvent.rarityLevel = petData.rarityLevel; - infostandEvent.skillTresholds = petData.skillTresholds; - infostandEvent.canRemovePet = false; - infostandEvent.publiclyRideable = petData.publiclyRideable; - infostandEvent.maximumTimeToLive = petData.maximumTimeToLive; - infostandEvent.remainingTimeToLive = petData.remainingTimeToLive; - infostandEvent.remainingGrowTime = petData.remainingGrowTime; - infostandEvent.publiclyBreedable = petData.publiclyBreedable; - - if(isOwner) - { - infostandEvent.canRemovePet = true; - } - else - { - if(this.container.roomSession.isRoomOwner || GetSessionDataManager().isModerator || (this.container.roomSession.controllerLevel >= RoomControllerLevel.GUEST)) infostandEvent.canRemovePet = true; - } - - this.container.eventDispatcher.dispatchEvent(infostandEvent); - } - - private processRoomSessionUserFigureUpdateEvent(event: RoomSessionUserFigureUpdateEvent): void - { - const userData = this.container.roomSession.userDataManager.getUserDataByIndex(event.userId); - - if(!userData) return; - - // update active infostand figure - // update motto - // update activity points - } - - private checkGuildSetting(event: RoomWidgetUpdateInfostandUserEvent): boolean - { - if(event.isGuildRoom) return (event.roomControllerLevel >= RoomControllerLevel.GUILD_ADMIN); - - return (event.roomControllerLevel >= RoomControllerLevel.GUEST); - } - - private canBeMuted(event: RoomWidgetUpdateInfostandUserEvent): boolean - { - const checkSetting = (event: RoomWidgetUpdateInfostandUserEvent, moderation: RoomModerationSettings) => - { - switch(moderation.allowMute) - { - case RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS: - return this.checkGuildSetting(event); - default: - return (event.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); - } - } - - return this.isValidSetting(event, checkSetting); - } - - private canBeKicked(event: RoomWidgetUpdateInfostandUserEvent): boolean - { - const checkSetting = (event: RoomWidgetUpdateInfostandUserEvent, moderation: RoomModerationSettings) => - { - switch(moderation.allowKick) - { - case RoomModerationSettings.MODERATION_LEVEL_ALL: - return true; - case RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS: - return this.checkGuildSetting(event); - default: - return (event.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); - } - } - - return this.isValidSetting(event, checkSetting); - } - - private canBeBanned(event: RoomWidgetUpdateInfostandUserEvent): boolean - { - const checkSetting = (event: RoomWidgetUpdateInfostandUserEvent, moderation: RoomModerationSettings) => - { - switch(moderation.allowBan) - { - case RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS: - return this.checkGuildSetting(event); - default: - return (event.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); - } - } - - return this.isValidSetting(event, checkSetting); - } - - private isValidSetting(event: RoomWidgetUpdateInfostandUserEvent, checkSetting: (event: RoomWidgetUpdateInfostandUserEvent, moderation: RoomModerationSettings) => boolean): boolean - { - if(!this.container.roomSession._Str_7411) return false; - - const moderation = this.container.roomSession.moderationSettings; - - let flag = false; - - if(moderation) flag = checkSetting(event, moderation); - - return (flag && (event.roomControllerLevel < RoomControllerLevel.ROOM_OWNER)); - } - - private getPetType(figure: string): number - { - return this.getPetFigurePart(figure, 0); - } - - private getPetBreed(figure: string): number - { - return this.getPetFigurePart(figure, 1); - } - - private getPetColor(figure: string): number - { - return this.getPetFigurePart(figure, 2); - } - - private getPetFigurePart(figure: string, index: number): number - { - if(!figure || !figure.length) return -1; - - const parts = figure.split(' '); - - if(parts.length > 0) return parseInt(parts[index]); - - return -1; - } - - public get type(): string - { - return RoomWidgetEnum.INFOSTAND; - } - - public get eventTypes(): string[] - { - return [ - RoomSessionPetInfoUpdateEvent.PET_INFO, - RoomSessionUserBadgesEvent.RSUBE_BADGES, - RoomSessionUserFigureUpdateEvent.USER_FIGURE - ]; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetRoomObjectMessage.GET_OBJECT_INFO, - RoomWidgetRoomObjectMessage.GET_OBJECT_NAME, - RoomWidgetUserActionMessage.SEND_FRIEND_REQUEST, - RoomWidgetUserActionMessage.RESPECT_USER, - RoomWidgetUserActionMessage.WHISPER_USER, - RoomWidgetUserActionMessage.IGNORE_USER, - RoomWidgetUserActionMessage.UNIGNORE_USER, - RoomWidgetUserActionMessage.KICK_USER, - RoomWidgetUserActionMessage.BAN_USER_DAY, - RoomWidgetUserActionMessage.BAN_USER_HOUR, - RoomWidgetUserActionMessage.BAN_USER_PERM, - RoomWidgetUserActionMessage.MUTE_USER_2MIN, - RoomWidgetUserActionMessage.MUTE_USER_5MIN, - RoomWidgetUserActionMessage.MUTE_USER_10MIN, - RoomWidgetUserActionMessage.GIVE_RIGHTS, - RoomWidgetUserActionMessage.TAKE_RIGHTS, - RoomWidgetUserActionMessage.START_TRADING, - RoomWidgetUserActionMessage.OPEN_HOME_PAGE, - RoomWidgetUserActionMessage.PASS_CARRY_ITEM, - RoomWidgetUserActionMessage.GIVE_CARRY_ITEM_TO_PET, - RoomWidgetUserActionMessage.DROP_CARRY_ITEM, - RoomWidgetUserActionMessage.REPORT, - RoomWidgetUserActionMessage.PICKUP_PET, - RoomWidgetUserActionMessage.MOUNT_PET, - RoomWidgetUserActionMessage.TOGGLE_PET_RIDING_PERMISSION, - RoomWidgetUserActionMessage.TOGGLE_PET_BREEDING_PERMISSION, - RoomWidgetUserActionMessage.DISMOUNT_PET, - RoomWidgetUserActionMessage.SADDLE_OFF, - RoomWidgetUserActionMessage.TRAIN_PET, - RoomWidgetUserActionMessage.RESPECT_PET, - RoomWidgetUserActionMessage.REQUEST_PET_UPDATE, - RoomWidgetUserActionMessage.GIVE_LIGHT_TO_PET, - RoomWidgetUserActionMessage.GIVE_WATER_TO_PET, - RoomWidgetUserActionMessage.TREAT_PET, - RoomWidgetUserActionMessage.REPORT_CFH_OTHER, - RoomWidgetUserActionMessage.AMBASSADOR_ALERT_USER, - RoomWidgetUserActionMessage.AMBASSADOR_KICK_USER, - RoomWidgetUserActionMessage.AMBASSADOR_MUTE_USER_2MIN, - RoomWidgetUserActionMessage.AMBASSADOR_MUTE_USER_10MIN, - RoomWidgetUserActionMessage.AMBASSADOR_MUTE_USER_60MIN, - RoomWidgetUserActionMessage.AMBASSADOR_MUTE_USER_18HOUR, - RoomWidgetChangeMottoMessage.CHANGE_MOTTO, - RoomWidgetFurniActionMessage.MOVE, - RoomWidgetFurniActionMessage.ROTATE, - RoomWidgetFurniActionMessage.EJECT, - RoomWidgetFurniActionMessage.PICKUP, - RoomWidgetFurniActionMessage.USE, - RoomWidgetFurniActionMessage.SAVE_STUFF_DATA - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/RoomWidgetRoomToolsHandler.ts b/src/api/nitro/room/widgets/handlers/RoomWidgetRoomToolsHandler.ts deleted file mode 100644 index c99518da..00000000 --- a/src/api/nitro/room/widgets/handlers/RoomWidgetRoomToolsHandler.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { NitroEvent, RoomWidgetEnum, RoomZoomEvent } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../../../..'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage, RoomWidgetZoomToggleMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class RoomWidgetRoomToolsHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - {} - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - if(message instanceof RoomWidgetZoomToggleMessage) - { - GetRoomEngine().events.dispatchEvent(new RoomZoomEvent(GetRoomEngine().activeRoomId, message.zoomedIn ? 0 : 1, false)); - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.ROOM_TOOLS; - } - - public get eventTypes(): string[] - { - return []; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetZoomToggleMessage.ZOOM_TOGGLE - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/UserChooserWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/UserChooserWidgetHandler.ts deleted file mode 100644 index 67b00e06..00000000 --- a/src/api/nitro/room/widgets/handlers/UserChooserWidgetHandler.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { NitroEvent, RoomObjectCategory, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { RoomWidgetHandler } from '.'; -import { GetRoomEngine } from '../../../..'; -import { RoomObjectItem, RoomWidgetChooserContentEvent, RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage, RoomWidgetRequestWidgetMessage, RoomWidgetRoomObjectMessage } from '../messages'; - -export class UserChooserWidgetHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - if(!message) return null; - - switch(message.type) - { - case RoomWidgetRequestWidgetMessage.USER_CHOOSER: - this.processChooser(); - break; - case RoomWidgetRoomObjectMessage.SELECT_OBJECT: - this.selectRoomObject((message as RoomWidgetRoomObjectMessage)); - break; - } - - return null; - } - - private processChooser(): void - { - const roomId = this.container.roomSession.roomId; - const items: RoomObjectItem[] = []; - - const userItems = GetRoomEngine().getRoomObjects(roomId, RoomObjectCategory.UNIT); - - userItems.forEach(roomObject => - { - const userData = this.container.roomSession.userDataManager.getUserDataByIndex(roomObject.id); - - if(!userData) return; - - items.push(new RoomObjectItem(userData.roomIndex, RoomObjectCategory.UNIT, userData.name)); - }); - - items.sort((a, b) => - { - return (a.name < b.name) ? -1 : 1; - }); - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetChooserContentEvent(RoomWidgetChooserContentEvent.USER_CHOOSER_CONTENT, items)); - } - - private selectRoomObject(message: RoomWidgetRoomObjectMessage): void - { - if(message.category !== RoomObjectCategory.UNIT) return; - - GetRoomEngine().selectRoomObject(this.container.roomSession.roomId, message.id, message.category); - } - - public get type(): string - { - return RoomWidgetEnum.USER_CHOOSER; - } - - public get eventTypes(): string[] - { - return []; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetRequestWidgetMessage.USER_CHOOSER, - RoomWidgetRoomObjectMessage.SELECT_OBJECT - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/WordQuizWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/WordQuizWidgetHandler.ts deleted file mode 100644 index df24b06e..00000000 --- a/src/api/nitro/room/widgets/handlers/WordQuizWidgetHandler.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AvatarAction, NitroEvent, RoomSessionWordQuizEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { RoomWidgetHandler } from '.'; -import { GetRoomEngine } from '../../GetRoomEngine'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetWordQuizUpdateEvent } from '../events/RoomWidgetWordQuizUpdateEvent'; -import { RoomWidgetMessage } from '../messages'; - -export class WordQuizWidgetHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - const roomQuizEvent = (event as RoomSessionWordQuizEvent); - let widgetEvent: RoomWidgetWordQuizUpdateEvent; - switch(event.type) - { - case RoomSessionWordQuizEvent.ANSWERED: - const roomId = this.container.roomSession.roomId; - const userData = this.container.roomSession.userDataManager.getUserData(roomQuizEvent.userId); - if(!userData) return; - widgetEvent = new RoomWidgetWordQuizUpdateEvent(RoomWidgetWordQuizUpdateEvent.QUESTION_ANSWERED, roomQuizEvent.id); - widgetEvent.value = roomQuizEvent.value; - widgetEvent.userId = roomQuizEvent.userId; - widgetEvent.answerCounts = roomQuizEvent.answerCounts; - - if(widgetEvent.value === '0') - { - GetRoomEngine().updateRoomObjectUserGesture(roomId, userData.roomIndex, AvatarAction.getGestureId(AvatarAction.GESTURE_SAD)); - } - else - { - GetRoomEngine().updateRoomObjectUserGesture(roomId, userData.roomIndex, AvatarAction.getGestureId(AvatarAction.GESTURE_SMILE)); - } - break; - case RoomSessionWordQuizEvent.FINISHED: - widgetEvent = new RoomWidgetWordQuizUpdateEvent(RoomWidgetWordQuizUpdateEvent.QUESTION_FINISHED, roomQuizEvent.id); - widgetEvent.pollId = roomQuizEvent.pollId; - widgetEvent.questionId = roomQuizEvent.questionId; - widgetEvent.answerCounts = roomQuizEvent.answerCounts; - break; - case RoomSessionWordQuizEvent.QUESTION: - widgetEvent = new RoomWidgetWordQuizUpdateEvent(RoomWidgetWordQuizUpdateEvent.NEW_QUESTION, roomQuizEvent.id); - widgetEvent.question = roomQuizEvent.question; - widgetEvent.duration = roomQuizEvent.duration; - widgetEvent.pollType = roomQuizEvent.pollType; - widgetEvent.questionId = roomQuizEvent.questionId; - widgetEvent.pollId = roomQuizEvent.pollId; - break; - } - - if(!widgetEvent) return; - - this.container.eventDispatcher.dispatchEvent(widgetEvent); - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - return null; - } - - public get type(): string - { - return RoomWidgetEnum.WORD_QUIZZ; - } - - public get eventTypes(): string[] - { - return [RoomSessionWordQuizEvent.ANSWERED, RoomSessionWordQuizEvent.FINISHED, RoomSessionWordQuizEvent.QUESTION]; - } - - public get messageTypes(): string[] - { - return []; - } -} diff --git a/src/api/nitro/room/widgets/handlers/index.ts b/src/api/nitro/room/widgets/handlers/index.ts deleted file mode 100644 index 40fadc00..00000000 --- a/src/api/nitro/room/widgets/handlers/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -export * from './DoorbellWidgetHandler'; -export * from './FriendRequestHandler'; -export * from './FurniChooserWidgetHandler'; -export * from './FurnitureContextMenuWidgetHandler'; -export * from './FurnitureCreditWidgetHandler'; -export * from './FurnitureCustomStackHeightWidgetHandler'; -export * from './FurnitureDimmerWidgetHandler'; -export * from './FurnitureExternalImageWidgetHandler'; -export * from './FurnitureInternalLinkHandler'; -export * from './FurnitureMannequinWidgetHandler'; -export * from './FurniturePresentWidgetHandler'; -export * from './FurnitureRoomLinkHandler'; -export * from './FurnitureTrophyWidgetHandler'; -export * from './FurnitureYoutubeDisplayWidgetHandler'; -export * from './IRoomWidgetHandler'; -export * from './IRoomWidgetHandlerManager'; -export * from './PollWidgetHandler'; -export * from './RoomWidgetAvatarInfoHandler'; -export * from './RoomWidgetChatHandler'; -export * from './RoomWidgetChatInputHandler'; -export * from './RoomWidgetHandler'; -export * from './RoomWidgetHandlerManager'; -export * from './RoomWidgetInfostandHandler'; -export * from './RoomWidgetRoomToolsHandler'; -export * from './UserChooserWidgetHandler'; -export * from './WordQuizWidgetHandler'; diff --git a/src/api/nitro/room/widgets/index.ts b/src/api/nitro/room/widgets/index.ts deleted file mode 100644 index fcfa1085..00000000 --- a/src/api/nitro/room/widgets/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './events'; -export * from './handlers'; -export * from './messages'; diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetAvatarExpressionMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetAvatarExpressionMessage.ts deleted file mode 100644 index f93352dd..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetAvatarExpressionMessage.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AvatarExpressionEnum } from '@nitrots/nitro-renderer'; -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetAvatarExpressionMessage extends RoomWidgetMessage -{ - public static AVATAR_EXPRESSION: string = 'RWAEM_MESSAGE_AVATAR_EXPRESSION'; - - private _animation: AvatarExpressionEnum; - - constructor(animation: AvatarExpressionEnum) - { - super(RoomWidgetAvatarExpressionMessage.AVATAR_EXPRESSION); - - this._animation = animation; - } - - public get animation(): AvatarExpressionEnum - { - return this._animation; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetChangeMottoMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetChangeMottoMessage.ts deleted file mode 100644 index 2342da2a..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetChangeMottoMessage.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetChangeMottoMessage extends RoomWidgetMessage -{ - public static CHANGE_MOTTO: string = 'RWCMM_CHANGE_MOTTO'; - - private _motto: string; - - constructor(motto: string) - { - super(RoomWidgetChangeMottoMessage.CHANGE_MOTTO); - - this._motto = motto; - } - - public get motto(): string - { - return this._motto; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetChangePostureMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetChangePostureMessage.ts deleted file mode 100644 index 77daedfb..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetChangePostureMessage.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetChangePostureMessage extends RoomWidgetMessage -{ - public static CHANGE_POSTURE: string = 'RWCPM_MESSAGE_CHANGE_POSTURE'; - public static POSTURE_STAND: number = 0; - public static POSTURE_SIT: number = 1; - - private _posture: number; - - constructor(posture: number) - { - super(RoomWidgetChangePostureMessage.CHANGE_POSTURE); - - this._posture = posture; - } - - public get posture(): number - { - return this._posture; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetChatMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetChatMessage.ts deleted file mode 100644 index 59190a0d..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetChatMessage.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetChatMessage extends RoomWidgetMessage -{ - public static MESSAGE_CHAT: string = 'RWCM_MESSAGE_CHAT'; - public static CHAT_DEFAULT: number = 0; - public static CHAT_WHISPER: number = 1; - public static CHAT_SHOUT: number = 2; - - private _chatType: number; - private _text: string; - private _recipientName: string; - private _styleId: number; - - constructor(type: string, text: string, chatType: number, recipientName: string, styleId: number) - { - super(type); - - this._text = text; - this._chatType = chatType; - this._recipientName = recipientName; - this._styleId = styleId; - } - - public get text(): string - { - return this._text; - } - - public get chatType(): number - { - return this._chatType; - } - - public get recipientName(): string - { - return this._recipientName; - } - - public get styleId(): number - { - return this._styleId; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetChatSelectAvatarMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetChatSelectAvatarMessage.ts deleted file mode 100644 index 9abbbf90..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetChatSelectAvatarMessage.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetChatSelectAvatarMessage extends RoomWidgetMessage -{ - public static MESSAGE_SELECT_AVATAR: string = 'RWCSAM_MESSAGE_SELECT_AVATAR'; - - private _objectId: number; - private _userName: string; - private _roomId: number; - - constructor(type: string, objectId: number, userName: string, roomId: number) - { - super(type); - - this._objectId = objectId; - this._userName = userName; - this._roomId = roomId; - } - - public get objectId(): number - { - return this._objectId; - } - - public get userName(): string - { - return this._userName; - } - - public get roomId(): number - { - return this._roomId; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetChatTypingMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetChatTypingMessage.ts deleted file mode 100644 index b3b0aa06..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetChatTypingMessage.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetChatTypingMessage extends RoomWidgetMessage -{ - public static TYPING_STATUS: string = 'RWCTM_TYPING_STATUS'; - - private _isTyping: boolean; - - constructor(isTyping: boolean) - { - super(RoomWidgetChatTypingMessage.TYPING_STATUS); - - this._isTyping = isTyping; - } - - public get isTyping(): boolean - { - return this._isTyping; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetCreditFurniRedeemMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetCreditFurniRedeemMessage.ts deleted file mode 100644 index 7b77fdaa..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetCreditFurniRedeemMessage.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetCreditFurniRedeemMessage extends RoomWidgetMessage -{ - public static REDEEM: string = 'RWCFRM_REDEEM'; - - private _objectId: number; - - constructor(type: string, objectId: number) - { - super(type); - - this._objectId = objectId; - } - - public get objectId(): number - { - return this._objectId; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetDanceMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetDanceMessage.ts deleted file mode 100644 index 72f5c0eb..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetDanceMessage.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetDanceMessage extends RoomWidgetMessage -{ - public static DANCE: string = 'RWDM_MESSAGE_DANCE'; - public static NORMAL_STYLE: number = 0; - public static CLUB_STYLE: number[] = [2, 3, 4]; - - private _style: number = 0; - - constructor(style: number) - { - super(RoomWidgetDanceMessage.DANCE); - - this._style = style; - } - - public get style(): number - { - return this._style; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerChangeStateMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetDimmerChangeStateMessage.ts deleted file mode 100644 index de83f498..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerChangeStateMessage.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetDimmerChangeStateMessage extends RoomWidgetMessage -{ - public static CHANGE_STATE: string = 'RWCDSM_CHANGE_STATE'; - - constructor() - { - super(RoomWidgetDimmerChangeStateMessage.CHANGE_STATE); - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerPreviewMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetDimmerPreviewMessage.ts deleted file mode 100644 index 39708872..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerPreviewMessage.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetDimmerPreviewMessage extends RoomWidgetMessage -{ - public static PREVIEW_DIMMER_PRESET: string = 'RWDPM_PREVIEW_DIMMER_PRESET'; - - private _color: number; - private _brightness: number; - private _bgOnly: boolean; - - constructor(color: number, brightness: number, bgOnly: boolean) - { - super(RoomWidgetDimmerPreviewMessage.PREVIEW_DIMMER_PRESET); - - this._color = color; - this._brightness = brightness; - this._bgOnly = bgOnly; - } - - public get color(): number - { - return this._color; - } - - public get brightness(): number - { - return this._brightness; - } - - public get bgOnly(): boolean - { - return this._bgOnly; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerSavePresetMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetDimmerSavePresetMessage.ts deleted file mode 100644 index 8e7bd831..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerSavePresetMessage.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetDimmerSavePresetMessage extends RoomWidgetMessage -{ - public static SAVE_PRESET: string = 'RWSDPM_SAVE_PRESET'; - - private _presetNumber: number; - private _effectTypeId: number; - private _color: number; - private _brightness: number; - private _apply: boolean; - - constructor(presetNumber: number, effectTypeId: number, color: number, brightness: number, apply: boolean) - { - super(RoomWidgetDimmerSavePresetMessage.SAVE_PRESET); - - this._presetNumber = presetNumber; - this._effectTypeId = effectTypeId; - this._color = color; - this._brightness = brightness; - this._apply = apply; - } - - public get presetNumber(): number - { - return this._presetNumber; - } - - public get effectTypeId(): number - { - return this._effectTypeId; - } - - public get color(): number - { - return this._color; - } - - public get brightness(): number - { - return this._brightness; - } - - public get apply(): boolean - { - return this._apply; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetFriendRequestMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetFriendRequestMessage.ts deleted file mode 100644 index 898a042d..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetFriendRequestMessage.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetFriendRequestMessage extends RoomWidgetMessage -{ - public static ACCEPT: string = 'RWFRM_ACCEPT'; - public static DECLINE: string = 'RMFRM_DECLINE'; - - private _requestId: number; - - constructor(type: string, requestId: number) - { - super(type); - - this._requestId = requestId; - } - - public get requestId(): number - { - return this._requestId; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetFurniActionMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetFurniActionMessage.ts deleted file mode 100644 index d658d7d9..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetFurniActionMessage.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetFurniActionMessage extends RoomWidgetMessage -{ - public static ROTATE: string = 'RWFAM_ROTATE'; - public static MOVE: string = 'RWFAM_MOVE'; - public static PICKUP: string = 'RWFAM_PICKUP'; - public static EJECT: string = 'RWFAM_EJECT'; - public static USE: string = 'RWFAM_USE'; - public static OPEN_WELCOME_GIFT: string = 'RWFAM_OPEN_WELCOME_GIFT'; - public static SAVE_STUFF_DATA: string = 'RWFAM_SAVE_STUFF_DATA'; - - private _furniId: number; - private _furniCategory: number; - private _offerId: number; - private _objectData: string; - - constructor(type: string, id: number, category: number, offerId: number =- 1, objectData: string = null) - { - super(type); - - this._furniId = id; - this._furniCategory = category; - this._offerId = offerId; - this._objectData = objectData; - } - - public get furniId(): number - { - return this._furniId; - } - - public get furniCategory(): number - { - return this._furniCategory; - } - - public get objectData(): string - { - return this._objectData; - } - - public get offerId(): number - { - return this._offerId; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetFurniToWidgetMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetFurniToWidgetMessage.ts deleted file mode 100644 index 59054ff2..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetFurniToWidgetMessage.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetFurniToWidgetMessage extends RoomWidgetMessage -{ - public static REQUEST_CREDITFURNI: string = 'RWFWM_MESSAGE_REQUEST_CREDITFURNI'; - public static REQUEST_STICKIE: string = 'RWFWM_MESSAGE_REQUEST_STICKIE'; - public static REQUEST_PRESENT: string = 'RWFWM_MESSAGE_REQUEST_PRESENT'; - public static REQUEST_TROPHY: string = 'RWFWM_MESSAGE_REQUEST_TROPHY'; - public static REQUEST_TEASER: string = 'RWFWM_MESSAGE_REQUEST_TEASER'; - public static REQUEST_ECOTRONBOX: string = 'RWFWM_MESSAGE_REQUEST_ECOTRONBOX'; - public static REQUEST_DIMMER: string = 'RWFWM_MESSAGE_REQUEST_DIMMER'; - public static REQUEST_PLACEHOLDER: string = 'RWFWM_MESSAGE_REQUEST_PLACEHOLDER'; - public static REQUEST_CLOTHING_CHANGE: string = 'RWFWM_MESSAGE_REQUEST_CLOTHING_CHANGE'; - public static REQUEST_PLAYLIST_EDITOR: string = 'RWFWM_MESSAGE_REQUEST_PLAYLIST_EDITOR'; - public static REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING: string = 'RWFWM_WIDGET_MESSAGE_REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING'; - public static REQUEST_ACHIEVEMENT_RESOLUTION_FAILED: string = 'RWFWM_WIDGET_MESSAGE_REQUEST_ACHIEVEMENT_RESOLUTION_FAILED'; - public static REQUEST_BADGE_DISPLAY_ENGRAVING: string = 'RWFWM_WIDGET_MESSAGE_REQUEST_BADGE_DISPLAY_ENGRAVING'; - - private _objectId: number; - private _category: number; - private _roomId: number; - - constructor(type: string, objectId: number, category: number, roomId: number) - { - super(type); - - this._objectId = objectId; - this._category = category; - this._roomId = roomId; - } - - public get objectId(): number - { - return this._objectId; - } - - public get category(): number - { - return this._category; - } - - public get roomId(): number - { - return this._roomId; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetLetUserInMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetLetUserInMessage.ts deleted file mode 100644 index 9001fe2a..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetLetUserInMessage.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetLetUserInMessage extends RoomWidgetMessage -{ - public static LET_USER_IN: string = 'RWLUIM_LET_USER_IN'; - - private _userName: string; - private _canEnter: boolean; - - constructor(userName: string, canEnter: boolean) - { - super(RoomWidgetLetUserInMessage.LET_USER_IN); - - this._userName = userName; - this._canEnter = canEnter; - } - - public get userName(): string - { - return this._userName; - } - - public get canEnter(): boolean - { - return this._canEnter; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetMessage.ts deleted file mode 100644 index b57c4855..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetMessage.ts +++ /dev/null @@ -1,14 +0,0 @@ -export class RoomWidgetMessage -{ - private _type: string; - - constructor(type: string) - { - this._type = type; - } - - public get type(): string - { - return this._type; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetPollMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetPollMessage.ts deleted file mode 100644 index a74d97bf..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetPollMessage.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetPollMessage extends RoomWidgetMessage -{ - public static readonly START = 'RWPM_START'; - public static readonly REJECT = 'RWPM_REJECT'; - public static readonly ANSWER = 'RWPM_ANSWER'; - - private _id = -1; - private _questionId = 0; - private _answers: string[] = null; - - constructor(type: string, id: number) - { - super(type); - - this._id = id; - } - - public get id(): number - { - return this._id; - } - - public get questionId(): number - { - return this._questionId; - } - - public set questionId(k: number) - { - this._questionId = k; - } - - public get answers(): string[] - { - return this._answers; - } - - public set answers(k: string[]) - { - this._answers = k; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetPresentOpenMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetPresentOpenMessage.ts deleted file mode 100644 index 20f34f49..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetPresentOpenMessage.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetPresentOpenMessage extends RoomWidgetMessage -{ - public static OPEN_PRESENT: string = 'RWPOM_OPEN_PRESENT'; - - private _objectId: number; - - constructor(type: string, objectId: number) - { - super(type); - - this._objectId = objectId; - } - - public get objectId(): number - { - return this._objectId; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetRequestWidgetMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetRequestWidgetMessage.ts deleted file mode 100644 index 20d3f8b2..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetRequestWidgetMessage.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetRequestWidgetMessage extends RoomWidgetMessage -{ - public static USER_CHOOSER: string = 'RWRWM_USER_CHOOSER'; - public static FURNI_CHOOSER: string = 'RWRWM_FURNI_CHOOSER'; - public static ME_MENU: string = 'RWRWM_ME_MENU'; - public static EFFECTS: string = 'RWRWM_EFFECTS'; - public static FLOOR_EDITOR: string = 'RWRWM_FLOOR_EDITOR'; -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetRoomObjectMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetRoomObjectMessage.ts deleted file mode 100644 index cc82b85c..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetRoomObjectMessage.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetRoomObjectMessage extends RoomWidgetMessage -{ - public static GET_OBJECT_INFO: string = 'RWROM_GET_OBJECT_INFO'; - public static GET_OBJECT_NAME: string = 'RWROM_GET_OBJECT_NAME'; - public static SELECT_OBJECT: string = 'RWROM_SELECT_OBJECT'; - public static GET_OWN_CHARACTER_INFO: string = 'RWROM_GET_OWN_CHARACTER_INFO'; - public static GET_AVATAR_LIST: string = 'RWROM_GET_AVATAR_LIST'; - - private _id: number; - private _category: number; - - constructor(type: string, id: number, category: number) - { - super(type); - - this._id = id; - this._category = category; - } - - public get id(): number - { - return this._id; - } - - public get category(): number - { - return this._category; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetUseProductMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetUseProductMessage.ts deleted file mode 100644 index deef093c..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetUseProductMessage.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetUseProductMessage extends RoomWidgetMessage -{ - public static PET_PRODUCT: string = 'RWUPM_PET_PRODUCT'; - public static MONSTERPLANT_SEED: string = 'RWUPM_MONSTERPLANT_SEED'; - - private _objectId: number; - public _petId: number; - - constructor(type: string, objectId: number, petId: number = -1) - { - super(type); - - this._objectId = objectId; - this._petId = petId; - } - - public get objectId(): number - { - return this._objectId; - } - - public get petId(): number - { - return this._petId; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetUserActionMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetUserActionMessage.ts deleted file mode 100644 index 56fd89c7..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetUserActionMessage.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetUserActionMessage extends RoomWidgetMessage -{ - public static WHISPER_USER: string = 'RWUAM_WHISPER_USER'; - public static IGNORE_USER: string = 'RWUAM_IGNORE_USER'; - public static IGNORE_USER_BUBBLE: string = 'RWUAM_IGNORE_USER_BUBBLE'; - public static UNIGNORE_USER: string = 'RWUAM_UNIGNORE_USER'; - public static KICK_USER: string = 'RWUAM_KICK_USER'; - public static BAN_USER_HOUR: string = 'RWUAM_BAN_USER_HOUR'; - public static BAN_USER_DAY: string = 'RWUAM_BAN_USER_DAY'; - public static BAN_USER_PERM: string = 'RWUAM_BAN_USER_PERM'; - public static MUTE_USER_2MIN: string = 'RWUAM_MUTE_USER_2MIN'; - public static MUTE_USER_5MIN: string = 'RWUAM_MUTE_USER_5MIN'; - public static MUTE_USER_10MIN: string = 'RWUAM_MUTE_USER_10MIN'; - public static SEND_FRIEND_REQUEST: string = 'RWUAM_SEND_FRIEND_REQUEST'; - public static RESPECT_USER: string = 'RWUAM_RESPECT_USER'; - public static GIVE_RIGHTS: string = 'RWUAM_GIVE_RIGHTS'; - public static TAKE_RIGHTS: string = 'RWUAM_TAKE_RIGHTS'; - public static START_TRADING: string = 'RWUAM_START_TRADING'; - public static OPEN_HOME_PAGE: string = 'RWUAM_OPEN_HOME_PAGE'; - public static REPORT: string = 'RWUAM_REPORT'; - public static PICKUP_PET: string = 'RWUAM_PICKUP_PET'; - public static MOUNT_PET: string = 'RWUAM_MOUNT_PET'; - public static TOGGLE_PET_RIDING_PERMISSION: string = 'RWUAM_TOGGLE_PET_RIDING_PERMISSION'; - public static TOGGLE_PET_BREEDING_PERMISSION: string = 'RWUAM_TOGGLE_PET_BREEDING_PERMISSION'; - public static DISMOUNT_PET: string = 'RWUAM_DISMOUNT_PET'; - public static SADDLE_OFF: string = 'RWUAM_SADDLE_OFF'; - public static TRAIN_PET: string = 'RWUAM_TRAIN_PET'; - public static RESPECT_PET: string = ' RWUAM_RESPECT_PET'; - public static TREAT_PET: string = 'RWUAM_TREAT_PET'; - public static REQUEST_PET_UPDATE: string = 'RWUAM_REQUEST_PET_UPDATE'; - public static START_NAME_CHANGE: string = 'RWUAM_START_NAME_CHANGE'; - public static PASS_CARRY_ITEM: string = 'RWUAM_PASS_CARRY_ITEM'; - public static DROP_CARRY_ITEM: string = 'RWUAM_DROP_CARRY_ITEM'; - public static GIVE_CARRY_ITEM_TO_PET: string = 'RWUAM_GIVE_CARRY_ITEM_TO_PET'; - public static GIVE_WATER_TO_PET: string = 'RWUAM_GIVE_WATER_TO_PET'; - public static GIVE_LIGHT_TO_PET: string = 'RWUAM_GIVE_LIGHT_TO_PET'; - public static REQUEST_BREED_PET: string = 'RWUAM_REQUEST_BREED_PET'; - public static HARVEST_PET: string = 'RWUAM_HARVEST_PET'; - public static REVIVE_PET: string = 'RWUAM_REVIVE_PET'; - public static COMPOST_PLANT: string = 'RWUAM_COMPOST_PLANT'; - public static GET_BOT_INFO: string = 'RWUAM_GET_BOT_INFO'; - public static REPORT_CFH_OTHER: string = 'RWUAM_REPORT_CFH_OTHER'; - public static AMBASSADOR_ALERT_USER: string = 'RWUAM_AMBASSADOR_ALERT_USER'; - public static AMBASSADOR_KICK_USER: string = 'RWUAM_AMBASSADOR_KICK_USER'; - public static AMBASSADOR_MUTE_USER_2MIN: string = 'RWUAM_AMBASSADOR_MUTE_2MIN'; - public static AMBASSADOR_MUTE_USER_10MIN: string = 'RWUAM_AMBASSADOR_MUTE_10MIN'; - public static AMBASSADOR_MUTE_USER_60MIN: string = 'RWUAM_AMBASSADOR_MUTE_60MIN'; - public static AMBASSADOR_MUTE_USER_18HOUR: string = 'RWUAM_AMBASSADOR_MUTE_18HOUR'; - public static RELATIONSHIP_NONE: string = 'RWUAM_RELATIONSHIP_NONE'; - public static RELATIONSHIP_HEART: string = 'RWUAM_RELATIONSHIP_HEART'; - public static RELATIONSHIP_SMILE: string = 'RWUAM_RELATIONSHIP_SMILE'; - public static RELATIONSHIP_BOBBA: string = 'RWUAM_RELATIONSHIP_BOBBA'; - - - private _userId: number; - - constructor(type: string, userId: number) - { - super(type); - - this._userId = userId; - } - - public get userId(): number - { - return this._userId; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetZoomToggleMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetZoomToggleMessage.ts deleted file mode 100644 index dae47e5b..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetZoomToggleMessage.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { RoomWidgetMessage } from '.'; - -export class RoomWidgetZoomToggleMessage extends RoomWidgetMessage -{ - public static ZOOM_TOGGLE: string = 'RWZTM_ZOOM_TOGGLE'; - private _zoomedIn: boolean; - - constructor(zoomedIn: boolean) - { - super(RoomWidgetZoomToggleMessage.ZOOM_TOGGLE); - this._zoomedIn = zoomedIn; - } - - public get zoomedIn(): boolean - { - return this._zoomedIn; - } -} diff --git a/src/api/nitro/room/widgets/messages/index.ts b/src/api/nitro/room/widgets/messages/index.ts deleted file mode 100644 index 9fdaba24..00000000 --- a/src/api/nitro/room/widgets/messages/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -export * from './RoomWidgetAvatarExpressionMessage'; -export * from './RoomWidgetChangeMottoMessage'; -export * from './RoomWidgetChangePostureMessage'; -export * from './RoomWidgetChatMessage'; -export * from './RoomWidgetChatSelectAvatarMessage'; -export * from './RoomWidgetChatTypingMessage'; -export * from './RoomWidgetCreditFurniRedeemMessage'; -export * from './RoomWidgetDanceMessage'; -export * from './RoomWidgetDimmerChangeStateMessage'; -export * from './RoomWidgetDimmerPreviewMessage'; -export * from './RoomWidgetDimmerSavePresetMessage'; -export * from './RoomWidgetFriendRequestMessage'; -export * from './RoomWidgetFurniActionMessage'; -export * from './RoomWidgetFurniToWidgetMessage'; -export * from './RoomWidgetLetUserInMessage'; -export * from './RoomWidgetMessage'; -export * from './RoomWidgetPollMessage'; -export * from './RoomWidgetPresentOpenMessage'; -export * from './RoomWidgetRequestWidgetMessage'; -export * from './RoomWidgetRoomObjectMessage'; -export * from './RoomWidgetUseProductMessage'; -export * from './RoomWidgetUserActionMessage'; -export * from './RoomWidgetZoomToggleMessage'; diff --git a/src/api/nitro/session/CanManipulateFurniture.ts b/src/api/nitro/session/CanManipulateFurniture.ts index 0141f23a..8655292c 100644 --- a/src/api/nitro/session/CanManipulateFurniture.ts +++ b/src/api/nitro/session/CanManipulateFurniture.ts @@ -7,5 +7,5 @@ export function CanManipulateFurniture(roomSession: IRoomSession, objectId: numb { if(!roomSession) return false; - return ((roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator || IsOwnerOfFurniture(GetRoomEngine().getRoomObject(roomSession.roomId, objectId, category))); + return (roomSession.isRoomOwner || (roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator || IsOwnerOfFurniture(GetRoomEngine().getRoomObject(roomSession.roomId, objectId, category))); } diff --git a/src/api/nitro/session/GetFurnitureData.ts b/src/api/nitro/session/GetFurnitureData.ts index 4272dbd3..71afef86 100644 --- a/src/api/nitro/session/GetFurnitureData.ts +++ b/src/api/nitro/session/GetFurnitureData.ts @@ -1,6 +1,6 @@ import { IFurnitureData } from '@nitrots/nitro-renderer'; import { GetSessionDataManager } from '.'; -import { ProductTypeEnum } from '../../../components/catalog/common/ProductTypeEnum'; +import { ProductTypeEnum } from '../../catalog'; export function GetFurnitureData(furniClassId: number, productType: string): IFurnitureData { diff --git a/src/api/nitro/session/IsOwnerOfFurniture.ts b/src/api/nitro/session/IsOwnerOfFurniture.ts index 20c70f3e..56b7fc34 100644 --- a/src/api/nitro/session/IsOwnerOfFurniture.ts +++ b/src/api/nitro/session/IsOwnerOfFurniture.ts @@ -5,7 +5,7 @@ export function IsOwnerOfFurniture(roomObject: IRoomObject): boolean { if(!roomObject || !roomObject.model) return false; - const userId = GetSessionDataManager().userId; + const userId = GetSessionDataManager().userId; const objectOwnerId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); return (userId === objectOwnerId); diff --git a/src/api/notification/NotificationAlertItem.ts b/src/api/notification/NotificationAlertItem.ts index b3432276..2d7702c7 100644 --- a/src/api/notification/NotificationAlertItem.ts +++ b/src/api/notification/NotificationAlertItem.ts @@ -1,4 +1,4 @@ -import { NotificationBubbleType } from './NotificationBubbleType'; +import { NotificationAlertType } from './NotificationAlertType'; export class NotificationAlertItem { @@ -12,7 +12,7 @@ export class NotificationAlertItem private _title: string; private _imageUrl: string; - constructor(messages: string[], alertType: string = NotificationBubbleType.INFO, clickUrl: string = null, clickUrlText: string = null, title: string = null, imageUrl: string = null) + constructor(messages: string[], alertType: string = NotificationAlertType.DEFAULT, clickUrl: string = null, clickUrlText: string = null, title: string = null, imageUrl: string = null) { NotificationAlertItem.ITEM_ID += 1; @@ -35,6 +35,11 @@ export class NotificationAlertItem return this._messages; } + public set alertType(alertType: string) + { + this._alertType = alertType; + } + public get alertType(): string { return this._alertType; diff --git a/src/api/notification/NotificationAlertType.ts b/src/api/notification/NotificationAlertType.ts index 9a4b192b..ad804e80 100644 --- a/src/api/notification/NotificationAlertType.ts +++ b/src/api/notification/NotificationAlertType.ts @@ -4,4 +4,7 @@ export class NotificationAlertType public static MOTD: string = 'motd'; public static MODERATION: string = 'moderation'; public static EVENT: string = 'event'; + public static NITRO: string = 'nitro'; + public static SEARCH: string = 'search'; + public static ALERT: string = 'alert'; } diff --git a/src/api/notification/NotificationUtilities.ts b/src/api/notification/NotificationUtilities.ts deleted file mode 100644 index 7aeda5eb..00000000 --- a/src/api/notification/NotificationUtilities.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { HabboWebTools, RoomEnterEffect } from '@nitrots/nitro-renderer'; -import { CreateLinkEvent, GetConfiguration, GetNitroInstance, LocalizeText, PlaySound } from '..'; -import { NotificationAlertEvent, NotificationConfirmEvent } from '../../events'; -import { NotificationBubbleEvent } from '../../events/notification-center/NotificationBubbleEvent'; -import { DispatchUiEvent } from '../../hooks'; -import { NotificationAlertType } from './NotificationAlertType'; -import { NotificationBubbleType } from './NotificationBubbleType'; - -export class NotificationUtilities -{ - private static MODERATION_DISCLAIMER_SHOWN: boolean = false; - private static MODERATION_DISCLAIMER_DELAY_MS: number = 5000; - private static MODERATION_DISCLAIMER_TIMEOUT: ReturnType = null; - - public static BUBBLES_DISABLED: boolean = false; - - private static cleanText(text: string): string - { - return text.replace(/\\r/g, '\r') - } - - private static getTimeZeroPadded(time: number): string - { - const text = ('0' + time); - - return text.substr((text.length - 2), text.length); - } - - private static getMainNotificationConfig(): { [key: string]: { delivery?: string, display?: string; title?: string; image?: string }} - { - return GetConfiguration<{ [key: string]: { delivery?: string, display?: string; title?: string; image?: string }}>('notification', {}); - } - - private static getNotificationConfig(key: string): { delivery?: string, display?: string; title?: string; image?: string } - { - const mainConfig = this.getMainNotificationConfig(); - - if(!mainConfig) return null; - - return mainConfig[key]; - } - - public static getNotificationPart(options: Map, type: string, key: string, localize: boolean): string - { - if(options.has(key)) return options.get(key); - - const localizeKey = [ 'notification', type, key ].join('.'); - - if(GetNitroInstance().localization.hasValue(localizeKey) || localize) - { - return LocalizeText(localizeKey, Array.from(options.keys()), Array.from(options.values())); - } - - return null; - } - - public static getNotificationImageUrl(options: Map, type: string): string - { - let imageUrl = options.get('image'); - - if(!imageUrl) imageUrl = GetConfiguration('image.library.notifications.url', '').replace('%image%', type.replace(/\./g, '_')); - - return LocalizeText(imageUrl); - } - - public static showNotification(type: string, options: Map = null): void - { - if(!options) options = new Map(); - - const configuration = this.getNotificationConfig(('notification.' + type)); - - if(configuration) for(const key in configuration) options.set(key, configuration[key]); - - const title = this.getNotificationPart(options, type, 'title', true); - const message = this.getNotificationPart(options, type, 'message', true).replace(/\\r/g, '\r'); - const linkTitle = this.getNotificationPart(options, type, 'linkTitle', false); - const linkUrl = this.getNotificationPart(options, type, 'linkUrl', false); - const image = this.getNotificationImageUrl(options, type); - - if(options.get('display') === 'BUBBLE') - { - this.showSingleBubble(LocalizeText(message), NotificationBubbleType.INFO, image, linkUrl); - } - else - { - this.simpleAlert(message, NotificationAlertType.EVENT, linkUrl, linkTitle, title, image); - } - - if(options.get('sound')) PlaySound(options.get('sound')); - } - - public static showSingleBubble(message: string, type: string, imageUrl: string = null, internalLink: string = null): void - { - if(this.BUBBLES_DISABLED) return; - - DispatchUiEvent(new NotificationBubbleEvent(message, type, imageUrl, internalLink)); - } - - public static showClubGiftNotification(numGifts: number): void - { - if(numGifts <= 0) return; - - this.showSingleBubble(numGifts.toString(), NotificationBubbleType.CLUBGIFT, null, ('catalog/open/' + GetConfiguration('hc.center')['catalog.gifts'])); - } - - public static handleMOTD(messages: string[]): void - { - messages = messages.map(message => this.cleanText(message)); - - DispatchUiEvent(new NotificationAlertEvent(messages, NotificationAlertType.MOTD, null, null, LocalizeText('notifications.motd.title'))); - } - - public static confirm(message: string, onConfirm: Function, onCancel: Function, confirmText: string = null, cancelText: string = null, title: string = null, type: string = null): void - { - if(!confirmText || !confirmText.length) confirmText = LocalizeText('generic.confirm'); - - if(!cancelText || !cancelText.length) cancelText = LocalizeText('generic.cancel'); - - if(!title || !title.length) title = LocalizeText('notifications.broadcast.title'); - - DispatchUiEvent(new NotificationConfirmEvent(type, this.cleanText(message), onConfirm, onCancel, confirmText, cancelText, title)); - } - - public static simpleAlert(message: string, type: string = null, clickUrl: string = null, clickUrlText: string = null, title: string = null, imageUrl: string = null): void - { - if(!title || !title.length) title = LocalizeText('notifications.broadcast.title'); - - if(!type || !type.length) type = NotificationAlertType.DEFAULT; - - DispatchUiEvent(new NotificationAlertEvent([ this.cleanText(message) ], type, clickUrl, clickUrlText, title, imageUrl)); - } - - public static showModeratorMessage(message: string, url: string = null, showHabboWay: boolean = true): void - { - this.simpleAlert(message, NotificationAlertType.MODERATION, url, LocalizeText('mod.alert.link'), LocalizeText('mod.alert.title')); - } - - public static handleModeratorCaution(message: string, url: string = null): void - { - this.showModeratorMessage(message, url); - } - - public static handleModeratorMessage(message: string, url: string = null): void - { - this.showModeratorMessage(message, url, false); - } - - public static handleUserBannedMessage(message: string): void - { - this.showModeratorMessage(message); - } - - public static handleHotelClosedMessage(open: number, minute: number, thrownOut: boolean): void - { - this.simpleAlert( LocalizeText(('opening.hours.' + (thrownOut ? 'disconnected' : 'closed')), [ 'h', 'm'], [ this.getTimeZeroPadded(open), this.getTimeZeroPadded(minute) ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); - } - - public static handleHotelMaintenanceMessage(minutesUntilMaintenance: number, duration: number): void - { - this.simpleAlert(LocalizeText('maintenance.shutdown', [ 'm', 'd' ], [ minutesUntilMaintenance.toString(), duration.toString() ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); - } - - public static handleHotelClosingMessage(minutes: number): void - { - this.simpleAlert(LocalizeText('opening.hours.shutdown', [ 'm' ], [ minutes.toString() ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); - } - - public static handleLoginFailedHotelClosedMessage(openHour: number, openMinutes: number): void - { - this.simpleAlert(LocalizeText('opening.hours.disconnected', [ 'h', 'm' ], [ openHour.toString(), openMinutes.toString() ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); - } - - public static openUrl(url: string): void - { - if(!url || !url.length) return; - - if(url.startsWith('http')) - { - HabboWebTools.openWebPage(url); - } - else - { - CreateLinkEvent(url); - } - } - - public static showModerationDisclaimer(): void - { - if(RoomEnterEffect.isRunning()) - { - if(this.MODERATION_DISCLAIMER_TIMEOUT) return; - - this.MODERATION_DISCLAIMER_TIMEOUT = setTimeout(() => - { - this.showModerationDisclaimer(); - }, (RoomEnterEffect.totalRunningTime + this.MODERATION_DISCLAIMER_DELAY_MS)); - } - else - { - if(this.MODERATION_DISCLAIMER_SHOWN) return; - - this.showSingleBubble(LocalizeText('mod.chatdisclaimer'), NotificationBubbleType.INFO); - - this.MODERATION_DISCLAIMER_SHOWN = true; - } - } -} diff --git a/src/api/notification/index.ts b/src/api/notification/index.ts index 6489b87f..23476d35 100644 --- a/src/api/notification/index.ts +++ b/src/api/notification/index.ts @@ -4,4 +4,3 @@ export * from './NotificationBubbleItem'; export * from './NotificationBubbleType'; export * from './NotificationConfirmItem'; export * from './NotificationConfirmType'; -export * from './NotificationUtilities'; diff --git a/src/components/purse/common/IPurse.ts b/src/api/purse/IPurse.ts similarity index 100% rename from src/components/purse/common/IPurse.ts rename to src/api/purse/IPurse.ts diff --git a/src/components/purse/common/Purse.ts b/src/api/purse/Purse.ts similarity index 98% rename from src/components/purse/common/Purse.ts rename to src/api/purse/Purse.ts index f9ea045a..a0a54b4c 100644 --- a/src/components/purse/common/Purse.ts +++ b/src/api/purse/Purse.ts @@ -1,5 +1,5 @@ import { HabboClubLevelEnum } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../../../api'; +import { GetNitroInstance } from '..'; import { IPurse } from './IPurse'; export class Purse implements IPurse diff --git a/src/api/purse/index.ts b/src/api/purse/index.ts new file mode 100644 index 00000000..ed344804 --- /dev/null +++ b/src/api/purse/index.ts @@ -0,0 +1,2 @@ +export * from './IPurse'; +export * from './Purse'; diff --git a/src/api/nitro/room/widgets/events/RoomWidgetPollUpdateEvent.ts b/src/api/room/events/RoomWidgetPollUpdateEvent.ts similarity index 100% rename from src/api/nitro/room/widgets/events/RoomWidgetPollUpdateEvent.ts rename to src/api/room/events/RoomWidgetPollUpdateEvent.ts diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateBackgroundColorPreviewEvent.ts b/src/api/room/events/RoomWidgetUpdateBackgroundColorPreviewEvent.ts similarity index 100% rename from src/api/nitro/room/widgets/events/RoomWidgetUpdateBackgroundColorPreviewEvent.ts rename to src/api/room/events/RoomWidgetUpdateBackgroundColorPreviewEvent.ts diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateChatInputContentEvent.ts b/src/api/room/events/RoomWidgetUpdateChatInputContentEvent.ts similarity index 100% rename from src/api/nitro/room/widgets/events/RoomWidgetUpdateChatInputContentEvent.ts rename to src/api/room/events/RoomWidgetUpdateChatInputContentEvent.ts diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateEvent.ts b/src/api/room/events/RoomWidgetUpdateEvent.ts similarity index 100% rename from src/api/nitro/room/widgets/events/RoomWidgetUpdateEvent.ts rename to src/api/room/events/RoomWidgetUpdateEvent.ts diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateRentableBotChatEvent.ts b/src/api/room/events/RoomWidgetUpdateRentableBotChatEvent.ts similarity index 100% rename from src/api/nitro/room/widgets/events/RoomWidgetUpdateRentableBotChatEvent.ts rename to src/api/room/events/RoomWidgetUpdateRentableBotChatEvent.ts diff --git a/src/api/room/events/RoomWidgetUpdateRoomObjectEvent.ts b/src/api/room/events/RoomWidgetUpdateRoomObjectEvent.ts new file mode 100644 index 00000000..aa9b7258 --- /dev/null +++ b/src/api/room/events/RoomWidgetUpdateRoomObjectEvent.ts @@ -0,0 +1,42 @@ +import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; + +export class RoomWidgetUpdateRoomObjectEvent extends RoomWidgetUpdateEvent +{ + public static OBJECT_SELECTED: string = 'RWUROE_OBJECT_SELECTED'; + public static OBJECT_DESELECTED: string = 'RWUROE_OBJECT_DESELECTED'; + public static USER_REMOVED: string = 'RWUROE_USER_REMOVED'; + public static FURNI_REMOVED: string = 'RWUROE_FURNI_REMOVED'; + public static FURNI_ADDED: string = 'RWUROE_FURNI_ADDED'; + public static USER_ADDED: string = 'RWUROE_USER_ADDED'; + public static OBJECT_ROLL_OVER: string = 'RWUROE_OBJECT_ROLL_OVER'; + public static OBJECT_ROLL_OUT: string = 'RWUROE_OBJECT_ROLL_OUT'; + public static OBJECT_REQUEST_MANIPULATION: string = 'RWUROE_OBJECT_REQUEST_MANIPULATION'; + + private _id: number; + private _category: number; + private _roomId: number; + + constructor(type: string, id: number, category: number, roomId: number) + { + super(type); + + this._id = id; + this._category = category; + this._roomId = roomId; + } + + public get id(): number + { + return this._id; + } + + public get category(): number + { + return this._category; + } + + public get roomId(): number + { + return this._roomId; + } +} diff --git a/src/api/room/events/index.ts b/src/api/room/events/index.ts new file mode 100644 index 00000000..e5ed0d8c --- /dev/null +++ b/src/api/room/events/index.ts @@ -0,0 +1,6 @@ +export * from './RoomWidgetPollUpdateEvent'; +export * from './RoomWidgetUpdateBackgroundColorPreviewEvent'; +export * from './RoomWidgetUpdateChatInputContentEvent'; +export * from './RoomWidgetUpdateEvent'; +export * from './RoomWidgetUpdateRentableBotChatEvent'; +export * from './RoomWidgetUpdateRoomObjectEvent'; diff --git a/src/api/room/index.ts b/src/api/room/index.ts new file mode 100644 index 00000000..56aea79e --- /dev/null +++ b/src/api/room/index.ts @@ -0,0 +1,2 @@ +export * from './events'; +export * from './widgets'; diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandFurniEvent.ts b/src/api/room/widgets/AvatarInfoFurni.ts similarity index 83% rename from src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandFurniEvent.ts rename to src/api/room/widgets/AvatarInfoFurni.ts index 1df6fcdf..3380282a 100644 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandFurniEvent.ts +++ b/src/api/room/widgets/AvatarInfoFurni.ts @@ -1,9 +1,9 @@ import { IObjectData } from '@nitrots/nitro-renderer'; -import { RoomWidgetUpdateInfostandEvent } from './RoomWidgetUpdateInfostandEvent'; +import { IAvatarInfo } from './IAvatarInfo'; -export class RoomWidgetUpdateInfostandFurniEvent extends RoomWidgetUpdateInfostandEvent +export class AvatarInfoFurni implements IAvatarInfo { - public static FURNI: string = 'RWUIFE_FURNI'; + public static FURNI: string = 'IFI_FURNI'; public id: number = 0; public category: number = 0; @@ -32,4 +32,7 @@ export class RoomWidgetUpdateInfostandFurniEvent extends RoomWidgetUpdateInfosta public availableForBuildersClub: boolean = false; public tileSizeX: number = 1; public tileSizeY: number = 1; + + constructor(public readonly type: string) + {} } diff --git a/src/api/room/widgets/AvatarInfoName.ts b/src/api/room/widgets/AvatarInfoName.ts new file mode 100644 index 00000000..66a6a7e3 --- /dev/null +++ b/src/api/room/widgets/AvatarInfoName.ts @@ -0,0 +1,11 @@ +export class AvatarInfoName +{ + constructor( + public readonly roomIndex: number, + public readonly category: number, + public readonly id: number, + public readonly name: string, + public readonly userType: number, + public readonly isFriend: boolean = false) + {} +} diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandPetEvent.ts b/src/api/room/widgets/AvatarInfoPet.ts similarity index 85% rename from src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandPetEvent.ts rename to src/api/room/widgets/AvatarInfoPet.ts index be193d60..0c0435a9 100644 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandPetEvent.ts +++ b/src/api/room/widgets/AvatarInfoPet.ts @@ -1,8 +1,8 @@ -import { RoomWidgetUpdateInfostandEvent } from './RoomWidgetUpdateInfostandEvent'; +import { IAvatarInfo } from './IAvatarInfo'; -export class RoomWidgetUpdateInfostandPetEvent extends RoomWidgetUpdateInfostandEvent +export class AvatarInfoPet implements IAvatarInfo { - public static PET_INFO: string = 'RWUIPE_PET_INFO'; + public static PET_INFO: string = 'IPI_PET_INFO'; public level: number = 0; public maximumLevel: number = 0; @@ -40,4 +40,7 @@ export class RoomWidgetUpdateInfostandPetEvent extends RoomWidgetUpdateInfostand public remainingTimeToLive: number = 0; public remainingGrowTime: number = 0; public publiclyBreedable: boolean = false; + + constructor(public readonly type: string) + {} } diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandRentableBotEvent.ts b/src/api/room/widgets/AvatarInfoRentableBot.ts similarity index 66% rename from src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandRentableBotEvent.ts rename to src/api/room/widgets/AvatarInfoRentableBot.ts index a44f77f5..77fb10ca 100644 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandRentableBotEvent.ts +++ b/src/api/room/widgets/AvatarInfoRentableBot.ts @@ -1,8 +1,8 @@ -import { RoomWidgetUpdateInfostandEvent } from './RoomWidgetUpdateInfostandEvent'; +import { IAvatarInfo } from './IAvatarInfo'; -export class RoomWidgetUpdateInfostandRentableBotEvent extends RoomWidgetUpdateInfostandEvent +export class AvatarInfoRentableBot implements IAvatarInfo { - public static RENTABLE_BOT: string = 'RWUIRBE_RENTABLE_BOT'; + public static RENTABLE_BOT: string = 'IRBI_RENTABLE_BOT'; public name: string = ''; public motto: string = ''; @@ -17,4 +17,7 @@ export class RoomWidgetUpdateInfostandRentableBotEvent extends RoomWidgetUpdateI public ownerId: number = -1; public ownerName: string = ''; public botSkills: number[] = []; + + constructor(public readonly type: string) + {} } diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandUserEvent.ts b/src/api/room/widgets/AvatarInfoUser.ts similarity index 72% rename from src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandUserEvent.ts rename to src/api/room/widgets/AvatarInfoUser.ts index f54ecc9a..270bfbd4 100644 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateInfostandUserEvent.ts +++ b/src/api/room/widgets/AvatarInfoUser.ts @@ -1,10 +1,10 @@ -import { RoomWidgetUpdateInfostandEvent } from './RoomWidgetUpdateInfostandEvent'; +import { IAvatarInfo } from './IAvatarInfo'; -export class RoomWidgetUpdateInfostandUserEvent extends RoomWidgetUpdateInfostandEvent +export class AvatarInfoUser implements IAvatarInfo { - public static OWN_USER: string = 'RWUIUE_OWN_USER'; - public static PEER: string = 'RWUIUE_PEER'; - public static BOT: string = 'RWUIUE_BOT'; + public static OWN_USER: string = 'IUI_OWN_USER'; + public static PEER: string = 'IUI_PEER'; + public static BOT: string = 'IUI_BOT'; public static TRADE_REASON_OK: number = 0; public static TRADE_REASON_SHUTDOWN: number = 2; public static TRADE_REASON_NO_TRADING: number = 3; @@ -24,12 +24,10 @@ export class RoomWidgetUpdateInfostandUserEvent extends RoomWidgetUpdateInfostan public carryItem: number = 0; public roomIndex: number = 0; public isSpectatorMode: boolean = false; - public realName: string = ''; public allowNameChange: boolean = false; public amIOwner: boolean = false; public amIAnyRoomController: boolean = false; public roomControllerLevel: number = 0; - public canBeAskedAsFriend: boolean = false; public canBeKicked: boolean = false; public canBeBanned: boolean = false; public canBeMuted: boolean = false; @@ -39,11 +37,13 @@ export class RoomWidgetUpdateInfostandUserEvent extends RoomWidgetUpdateInfostan public canTrade: boolean = false; public canTradeReason: number = 0; public targetRoomControllerLevel: number = 0; - public isFriend: boolean = false; public isAmbassador: boolean = false; + constructor(public readonly type: string) + {} + public get isOwnUser(): boolean { - return (this.type === RoomWidgetUpdateInfostandUserEvent.OWN_USER); + return (this.type === AvatarInfoUser.OWN_USER); } } diff --git a/src/api/room/widgets/AvatarInfoUtilities.ts b/src/api/room/widgets/AvatarInfoUtilities.ts new file mode 100644 index 00000000..57501993 --- /dev/null +++ b/src/api/room/widgets/AvatarInfoUtilities.ts @@ -0,0 +1,454 @@ +import { IFurnitureData, ObjectDataFactory, PetFigureData, PetType, RoomControllerLevel, RoomModerationSettings, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomPetData, RoomTradingLevelEnum, RoomUserData, RoomWidgetEnumItemExtradataParameter, Vector3d } from '@nitrots/nitro-renderer'; +import { GetNitroInstance, GetRoomEngine, GetRoomSession, GetSessionDataManager, IsOwnerOfFurniture } from '../../nitro'; +import { LocalizeText } from '../../utils'; +import { AvatarInfoFurni } from './AvatarInfoFurni'; +import { AvatarInfoName } from './AvatarInfoName'; +import { AvatarInfoPet } from './AvatarInfoPet'; +import { AvatarInfoRentableBot } from './AvatarInfoRentableBot'; +import { AvatarInfoUser } from './AvatarInfoUser'; + +export class AvatarInfoUtilities +{ + public static getObjectName(objectId: number, category: number): AvatarInfoName + { + const roomSession = GetRoomSession(); + + let id = -1; + let name: string = null; + let userType = 0; + + switch(category) + { + case RoomObjectCategory.FLOOR: + case RoomObjectCategory.WALL: { + const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, objectId, category); + + if(!roomObject) break; + + if(roomObject.type.indexOf('poster') === 0) + { + name = LocalizeText('${poster_' + parseInt(roomObject.type.replace('poster', '')) + '_name}'); + } + else + { + let furniData: IFurnitureData = null; + + const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); + + if(category === RoomObjectCategory.FLOOR) + { + furniData = GetSessionDataManager().getFloorItemData(typeId); + } + + else if(category === RoomObjectCategory.WALL) + { + furniData = GetSessionDataManager().getWallItemData(typeId); + } + + if(!furniData) break; + + id = furniData.id; + name = furniData.name; + } + break; + } + case RoomObjectCategory.UNIT: { + const userData = roomSession.userDataManager.getUserDataByIndex(objectId); + + if(!userData) break; + + id = userData.webID; + name = userData.name; + userType = userData.type; + break; + } + } + + if(!name || !name.length) return null; + + return new AvatarInfoName(objectId, category, id, name, userType); + } + + public static getFurniInfo(objectId: number, category: number): AvatarInfoFurni + { + const roomSession = GetRoomSession(); + const furniInfo = new AvatarInfoFurni(AvatarInfoFurni.FURNI); + + furniInfo.id = objectId; + furniInfo.category = category; + + const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, objectId, category); + + if(!roomObject) return; + + const model = roomObject.model; + + if(model.getValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM)) + { + furniInfo.extraParam = model.getValue(RoomWidgetEnumItemExtradataParameter.INFOSTAND_EXTRA_PARAM); + } + + const dataFormat = model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT); + const objectData = ObjectDataFactory.getData(dataFormat); + + objectData.initializeFromRoomObjectModel(model); + + furniInfo.stuffData = objectData; + + const objectType = roomObject.type; + + if(objectType.indexOf('poster') === 0) + { + const posterId = parseInt(objectType.replace('poster', '')); + + furniInfo.name = LocalizeText(('${poster_' + posterId) + '_name}'); + furniInfo.description = LocalizeText(('${poster_' + posterId) + '_desc}'); + } + else + { + const typeId = model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); + + let furnitureData: IFurnitureData = null; + + if(category === RoomObjectCategory.FLOOR) + { + furnitureData = GetSessionDataManager().getFloorItemData(typeId); + } + + else if(category === RoomObjectCategory.WALL) + { + furnitureData = GetSessionDataManager().getWallItemData(typeId); + } + + if(furnitureData) + { + furniInfo.name = furnitureData.name; + furniInfo.description = furnitureData.description; + furniInfo.purchaseOfferId = furnitureData.purchaseOfferId; + furniInfo.purchaseCouldBeUsedForBuyout = furnitureData.purchaseCouldBeUsedForBuyout; + furniInfo.rentOfferId = furnitureData.rentOfferId; + furniInfo.rentCouldBeUsedForBuyout = furnitureData.rentCouldBeUsedForBuyout; + furniInfo.availableForBuildersClub = furnitureData.availableForBuildersClub; + furniInfo.tileSizeX = furnitureData.tileSizeX; + furniInfo.tileSizeY = furnitureData.tileSizeY; + } + } + + if(objectType.indexOf('post_it') > -1) furniInfo.isStickie = true; + + const expiryTime = model.getValue(RoomObjectVariable.FURNITURE_EXPIRY_TIME); + const expiryTimestamp = model.getValue(RoomObjectVariable.FURNITURE_EXPIRTY_TIMESTAMP); + + furniInfo.expiration = ((expiryTime < 0) ? expiryTime : Math.max(0, (expiryTime - ((GetNitroInstance().time - expiryTimestamp) / 1000)))); + + let roomObjectImage = GetRoomEngine().getRoomObjectImage(roomSession.roomId, objectId, category, new Vector3d(180), 64, null); + + if(!roomObjectImage.data || (roomObjectImage.data.width > 140) || (roomObjectImage.data.height > 200)) + { + roomObjectImage = GetRoomEngine().getRoomObjectImage(roomSession.roomId, objectId, category, new Vector3d(180), 1, null); + } + + furniInfo.image = roomObjectImage.getImage(); + furniInfo.isWallItem = (category === RoomObjectCategory.WALL); + furniInfo.isRoomOwner = roomSession.isRoomOwner; + furniInfo.roomControllerLevel = roomSession.controllerLevel; + furniInfo.isAnyRoomController = GetSessionDataManager().isModerator; + furniInfo.ownerId = model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); + furniInfo.ownerName = model.getValue(RoomObjectVariable.FURNITURE_OWNER_NAME); + furniInfo.usagePolicy = model.getValue(RoomObjectVariable.FURNITURE_USAGE_POLICY); + + const guildId = model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_GUILD_ID); + + if(guildId !== 0) + { + furniInfo.groupId = guildId; + //this.container.connection.send(new _Str_2863(guildId, false)); + } + + if(IsOwnerOfFurniture(roomObject)) furniInfo.isOwner = true; + + return furniInfo; + } + + public static getUserInfo(category: number, userData: RoomUserData): AvatarInfoUser + { + const roomSession = GetRoomSession(); + + let userInfoType = AvatarInfoUser.OWN_USER; + + if(userData.webID !== GetSessionDataManager().userId) userInfoType = AvatarInfoUser.PEER; + + const userInfo = new AvatarInfoUser(userInfoType); + + userInfo.isSpectatorMode = roomSession.isSpectator; + userInfo.name = userData.name; + userInfo.motto = userData.custom; + userInfo.achievementScore = userData.activityPoints; + userInfo.webID = userData.webID; + userInfo.roomIndex = userData.roomIndex; + userInfo.userType = RoomObjectType.USER; + + const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, userData.roomIndex, category); + + if(roomObject) userInfo.carryItem = (roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT) || 0); + + if(userInfoType === AvatarInfoUser.OWN_USER) userInfo.allowNameChange = GetSessionDataManager().canChangeName; + + userInfo.amIOwner = roomSession.isRoomOwner; + userInfo.isGuildRoom = roomSession.isGuildRoom; + userInfo.roomControllerLevel = roomSession.controllerLevel; + userInfo.amIAnyRoomController = GetSessionDataManager().isModerator; + userInfo.isAmbassador = GetSessionDataManager().isAmbassador; + + if(userInfoType === AvatarInfoUser.PEER) + { + if(roomObject) + { + const flatControl = roomObject.model.getValue(RoomObjectVariable.FIGURE_FLAT_CONTROL); + + if(flatControl !== null) userInfo.targetRoomControllerLevel = flatControl; + + userInfo.canBeMuted = this.canBeMuted(userInfo); + userInfo.canBeKicked = this.canBeKicked(userInfo); + userInfo.canBeBanned = this.canBeBanned(userInfo); + } + + userInfo.isIgnored = GetSessionDataManager().isUserIgnored(userData.name); + userInfo.respectLeft = GetSessionDataManager().respectsLeft; + + const isShuttingDown = GetSessionDataManager().isSystemShutdown; + const tradeMode = roomSession.tradeMode; + + if(isShuttingDown) + { + userInfo.canTrade = false; + } + else + { + switch(tradeMode) + { + case RoomTradingLevelEnum.ROOM_CONTROLLER_REQUIRED: { + const roomController = ((userInfo.roomControllerLevel !== RoomControllerLevel.NONE) && (userInfo.roomControllerLevel !== RoomControllerLevel.GUILD_MEMBER)); + const targetController = ((userInfo.targetRoomControllerLevel !== RoomControllerLevel.NONE) && (userInfo.targetRoomControllerLevel !== RoomControllerLevel.GUILD_MEMBER)); + + userInfo.canTrade = (roomController || targetController); + break; + } + case RoomTradingLevelEnum.NO_TRADING: + userInfo.canTrade = true; + break; + default: + userInfo.canTrade = false; + break; + } + } + + userInfo.canTradeReason = AvatarInfoUser.TRADE_REASON_OK; + + if(isShuttingDown) userInfo.canTradeReason = AvatarInfoUser.TRADE_REASON_SHUTDOWN; + + if(tradeMode !== RoomTradingLevelEnum.FREE_TRADING) userInfo.canTradeReason = AvatarInfoUser.TRADE_REASON_NO_TRADING; + + // const _local_12 = GetSessionDataManager().userId; + // _local_13 = GetSessionDataManager()._Str_18437(_local_12); + // this._Str_16287(_local_12, _local_13); + } + + userInfo.groupId = userData.groupId; + userInfo.groupBadgeId = GetSessionDataManager().getGroupBadge(userInfo.groupId); + userInfo.groupName = userData.groupName; + userInfo.badges = roomSession.userDataManager.getUserBadges(userData.webID); + userInfo.figure = userData.figure; + //var _local_8:Array = GetSessionDataManager()._Str_18437(userData.webID); + //this._Str_16287(userData._Str_2394, _local_8); + //this._container._Str_8097._Str_14387(userData.webID); + //this._container.connection.send(new _Str_8049(userData._Str_2394)); + + return userInfo; + } + + public static getBotInfo(category: number, userData: RoomUserData): AvatarInfoUser + { + const roomSession = GetRoomSession(); + const userInfo = new AvatarInfoUser(AvatarInfoUser.BOT); + + userInfo.name = userData.name; + userInfo.motto = userData.custom; + userInfo.webID = userData.webID; + userInfo.roomIndex = userData.roomIndex; + userInfo.userType = userData.type; + + const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, userData.roomIndex, category); + + if(roomObject) userInfo.carryItem = (roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT) || 0); + + userInfo.amIOwner = roomSession.isRoomOwner; + userInfo.isGuildRoom = roomSession.isGuildRoom; + userInfo.roomControllerLevel = roomSession.controllerLevel; + userInfo.amIAnyRoomController = GetSessionDataManager().isModerator; + userInfo.isAmbassador = GetSessionDataManager().isAmbassador; + userInfo.badges = [ AvatarInfoUser.DEFAULT_BOT_BADGE_ID ]; + userInfo.figure = userData.figure; + + return userInfo; + } + + public static getRentableBotInfo(category: number, userData: RoomUserData): AvatarInfoRentableBot + { + const roomSession = GetRoomSession(); + const botInfo = new AvatarInfoRentableBot(AvatarInfoRentableBot.RENTABLE_BOT); + + botInfo.name = userData.name; + botInfo.motto = userData.custom; + botInfo.webID = userData.webID; + botInfo.roomIndex = userData.roomIndex; + botInfo.ownerId = userData.ownerId; + botInfo.ownerName = userData.ownerName; + botInfo.botSkills = userData.botSkills; + + const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, userData.roomIndex, category); + + if(roomObject) botInfo.carryItem = (roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT) || 0); + + botInfo.amIOwner = roomSession.isRoomOwner; + botInfo.roomControllerLevel = roomSession.controllerLevel; + botInfo.amIAnyRoomController = GetSessionDataManager().isModerator; + botInfo.badges = [ AvatarInfoUser.DEFAULT_BOT_BADGE_ID ]; + botInfo.figure = userData.figure; + + return botInfo; + } + + public static getPetInfo(petData: RoomPetData): AvatarInfoPet + { + const roomSession = GetRoomSession(); + const userData = roomSession.userDataManager.getPetData(petData.id); + + if(!userData) return; + + const figure = new PetFigureData(userData.figure); + + let posture: string = null; + + if(figure.typeId === PetType.MONSTERPLANT) + { + if(petData.level >= petData.adultLevel) posture = 'std'; + else posture = ('grw' + petData.level); + } + + const isOwner = (petData.ownerId === GetSessionDataManager().userId); + const petInfo = new AvatarInfoPet(AvatarInfoPet.PET_INFO); + + petInfo.name = userData.name; + petInfo.id = petData.id; + petInfo.ownerId = petData.ownerId; + petInfo.ownerName = petData.ownerName; + petInfo.rarityLevel = petData.rarityLevel; + petInfo.petType = figure.typeId; + petInfo.petBreed = figure.paletteId; + petInfo.petFigure = userData.figure; + petInfo.posture = posture; + petInfo.isOwner = isOwner; + petInfo.roomIndex = userData.roomIndex; + petInfo.level = petData.level; + petInfo.maximumLevel = petData.maximumLevel; + petInfo.experience = petData.experience; + petInfo.levelExperienceGoal = petData.levelExperienceGoal; + petInfo.energy = petData.energy; + petInfo.maximumEnergy = petData.maximumEnergy; + petInfo.happyness = petData.happyness; + petInfo.maximumHappyness = petData.maximumHappyness; + petInfo.respect = petData.respect; + petInfo.respectsPetLeft = GetSessionDataManager().respectsPetLeft; + petInfo.age = petData.age; + petInfo.saddle = petData.saddle; + petInfo.rider = petData.rider; + petInfo.breedable = petData.breedable; + petInfo.fullyGrown = petData.fullyGrown; + petInfo.dead = petData.dead; + petInfo.rarityLevel = petData.rarityLevel; + petInfo.skillTresholds = petData.skillTresholds; + petInfo.canRemovePet = false; + petInfo.publiclyRideable = petData.publiclyRideable; + petInfo.maximumTimeToLive = petData.maximumTimeToLive; + petInfo.remainingTimeToLive = petData.remainingTimeToLive; + petInfo.remainingGrowTime = petData.remainingGrowTime; + petInfo.publiclyBreedable = petData.publiclyBreedable; + + if(isOwner || roomSession.isRoomOwner || GetSessionDataManager().isModerator || (roomSession.controllerLevel >= RoomControllerLevel.GUEST)) petInfo.canRemovePet = true; + + return petInfo; + } + + private static checkGuildSetting(userInfo: AvatarInfoUser): boolean + { + if(userInfo.isGuildRoom) return (userInfo.roomControllerLevel >= RoomControllerLevel.GUILD_ADMIN); + + return (userInfo.roomControllerLevel >= RoomControllerLevel.GUEST); + } + + private static isValidSetting(userInfo: AvatarInfoUser, checkSetting: (userInfo: AvatarInfoUser, moderation: RoomModerationSettings) => boolean): boolean + { + const roomSession = GetRoomSession(); + + if(!roomSession.isPrivateRoom) return false; + + const moderation = roomSession.moderationSettings; + + let flag = false; + + if(moderation) flag = checkSetting(userInfo, moderation); + + return (flag && (userInfo.targetRoomControllerLevel < RoomControllerLevel.ROOM_OWNER)); + } + + private static canBeMuted(userInfo: AvatarInfoUser): boolean + { + const checkSetting = (userInfo: AvatarInfoUser, moderation: RoomModerationSettings) => + { + switch(moderation.allowMute) + { + case RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS: + return this.checkGuildSetting(userInfo); + default: + return (userInfo.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); + } + } + + return this.isValidSetting(userInfo, checkSetting); + } + + private static canBeKicked(userInfo: AvatarInfoUser): boolean + { + const checkSetting = (userInfo: AvatarInfoUser, moderation: RoomModerationSettings) => + { + switch(moderation.allowKick) + { + case RoomModerationSettings.MODERATION_LEVEL_ALL: + return true; + case RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS: + return this.checkGuildSetting(userInfo); + default: + return (userInfo.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); + } + } + + return this.isValidSetting(userInfo, checkSetting); + } + + private static canBeBanned(userInfo: AvatarInfoUser): boolean + { + const checkSetting = (userInfo: AvatarInfoUser, moderation: RoomModerationSettings) => + { + switch(moderation.allowBan) + { + case RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS: + return this.checkGuildSetting(userInfo); + default: + return (userInfo.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); + } + } + + return this.isValidSetting(userInfo, checkSetting); + } +} diff --git a/src/api/room/widgets/BotSkillsEnum.ts b/src/api/room/widgets/BotSkillsEnum.ts new file mode 100644 index 00000000..b879cdc9 --- /dev/null +++ b/src/api/room/widgets/BotSkillsEnum.ts @@ -0,0 +1,18 @@ +export class BotSkillsEnum +{ + public static GENERIC_SKILL: number = 0; + public static DRESS_UP: number = 1; + public static SETUP_CHAT: number = 2; + public static RANDOM_WALK: number = 3; + public static DANCE: number = 4; + public static CHANGE_BOT_NAME: number = 5; + public static SERVE_BEVERAGE: number = 6; + public static INCLIENT_LINK: number = 7; + public static NUX_PROCEED: number = 8; + public static CHANGE_BOT_MOTTO: number = 9; + public static NUX_TAKE_TOUR: number = 10; + public static NO_PICK_UP: number = 12; + public static NAVIGATOR_SEARCH: number = 14; + public static DONATE_TO_USER: number = 24; + public static DONATE_TO_ALL: number = 25; +} diff --git a/src/components/room/widgets/chat/common/ChatBubbleMessage.ts b/src/api/room/widgets/ChatBubbleMessage.ts similarity index 96% rename from src/components/room/widgets/chat/common/ChatBubbleMessage.ts rename to src/api/room/widgets/ChatBubbleMessage.ts index 8846d3ca..cef0ff27 100644 --- a/src/components/room/widgets/chat/common/ChatBubbleMessage.ts +++ b/src/api/room/widgets/ChatBubbleMessage.ts @@ -9,6 +9,7 @@ export class ChatBubbleMessage public height: number = 0; public elementRef: HTMLDivElement = null; public visible: boolean = false; + public skipMovement: boolean = false; private _top: number = 0; private _left: number = 0; @@ -26,7 +27,7 @@ export class ChatBubbleMessage public imageUrl: string = null, public color: string = null ) -{ + { this.id = ++ChatBubbleMessage.BUBBLE_COUNTER; } diff --git a/src/api/room/widgets/ChatMessageTypeEnum.ts b/src/api/room/widgets/ChatMessageTypeEnum.ts new file mode 100644 index 00000000..1a5296b1 --- /dev/null +++ b/src/api/room/widgets/ChatMessageTypeEnum.ts @@ -0,0 +1,6 @@ +export class ChatMessageTypeEnum +{ + public static CHAT_DEFAULT: number = 0; + public static CHAT_WHISPER: number = 1; + public static CHAT_SHOUT: number = 2; +} diff --git a/src/components/room/widgets/furniture/dimmer/DimmerFurnitureWidgetPresetItem.ts b/src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts similarity index 79% rename from src/components/room/widgets/furniture/dimmer/DimmerFurnitureWidgetPresetItem.ts rename to src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts index 3e8009af..1a2759f6 100644 --- a/src/components/room/widgets/furniture/dimmer/DimmerFurnitureWidgetPresetItem.ts +++ b/src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts @@ -4,5 +4,6 @@ export class DimmerFurnitureWidgetPresetItem public id: number = 0, public type: number = 0, public color: number = 0, - public light: number = 0) {} + public light: number = 0) + {} } diff --git a/src/api/room/widgets/DoChatsOverlap.ts b/src/api/room/widgets/DoChatsOverlap.ts new file mode 100644 index 00000000..092ce5db --- /dev/null +++ b/src/api/room/widgets/DoChatsOverlap.ts @@ -0,0 +1,7 @@ +import { ChatBubbleMessage } from './ChatBubbleMessage'; + +export const DoChatsOverlap = (a: ChatBubbleMessage, b: ChatBubbleMessage, additionalBTop: number, padding: number = 0) => +{ + return !((((a.left + padding) + a.width) < (b.left + padding)) || ((a.left + padding) > ((b.left + padding) + b.width)) || ((a.top + a.height) < (b.top + additionalBTop)) || (a.top > ((b.top + additionalBTop) + b.height))); +} + \ No newline at end of file diff --git a/src/api/room/widgets/FurnitureDimmerUtilities.ts b/src/api/room/widgets/FurnitureDimmerUtilities.ts new file mode 100644 index 00000000..9d252d10 --- /dev/null +++ b/src/api/room/widgets/FurnitureDimmerUtilities.ts @@ -0,0 +1,29 @@ +import { GetRoomEngine, GetRoomSession } from '../../nitro'; + +export class FurnitureDimmerUtilities +{ + public static AVAILABLE_COLORS: number[] = [ 7665141, 21495, 15161822, 15353138, 15923281, 8581961, 0 ]; + public static HTML_COLORS: string[] = [ '#74F5F5', '#0053F7', '#E759DE', '#EA4532', '#F2F851', '#82F349', '#000000' ]; + public static MIN_BRIGHTNESS: number = 76; + public static MAX_BRIGHTNESS: number = 255; + + public static savePreset(presetNumber: number, effectTypeId: number, color: number, brightness: number, apply: boolean): void + { + GetRoomSession().updateMoodlightData(presetNumber, effectTypeId, color, brightness, apply); + } + + public static changeState(): void + { + GetRoomSession().toggleMoodlightState(); + } + + public static previewDimmer(color: number, brightness: number, bgOnly: boolean): void + { + GetRoomEngine().updateObjectRoomColor(GetRoomSession().roomId, color, brightness, bgOnly); + } + + public static scaleBrightness(value: number): number + { + return ~~((((value - this.MIN_BRIGHTNESS) * (100 - 0)) / (this.MAX_BRIGHTNESS - this.MIN_BRIGHTNESS)) + 0); + } +} diff --git a/src/api/room/widgets/IAvatarInfo.ts b/src/api/room/widgets/IAvatarInfo.ts new file mode 100644 index 00000000..23fb47ba --- /dev/null +++ b/src/api/room/widgets/IAvatarInfo.ts @@ -0,0 +1,4 @@ +export interface IAvatarInfo +{ + type: string; +} diff --git a/src/api/nitro/room/widgets/events/IPhotoData.ts b/src/api/room/widgets/IPhotoData.ts similarity index 100% rename from src/api/nitro/room/widgets/events/IPhotoData.ts rename to src/api/room/widgets/IPhotoData.ts diff --git a/src/api/room/widgets/MannequinUtilities.ts b/src/api/room/widgets/MannequinUtilities.ts new file mode 100644 index 00000000..5e82b9af --- /dev/null +++ b/src/api/room/widgets/MannequinUtilities.ts @@ -0,0 +1,39 @@ +import { AvatarFigurePartType, IAvatarFigureContainer } from '@nitrots/nitro-renderer'; +import { GetAvatarRenderManager } from '../../nitro'; + +export class MannequinUtilities +{ + public static MANNEQUIN_FIGURE = [ 'hd', 99999, [ 99998 ] ]; + public static MANNEQUIN_CLOTHING_PART_TYPES = [ + AvatarFigurePartType.CHEST_ACCESSORY, + AvatarFigurePartType.COAT_CHEST, + AvatarFigurePartType.CHEST, + AvatarFigurePartType.LEGS, + AvatarFigurePartType.SHOES, + AvatarFigurePartType.WAIST_ACCESSORY + ]; + + public static getMergedMannequinFigureContainer(figure: string, targetFigure: string): IAvatarFigureContainer + { + const figureContainer = GetAvatarRenderManager().createFigureContainer(figure); + const targetFigureContainer = GetAvatarRenderManager().createFigureContainer(targetFigure); + + for(const part of this.MANNEQUIN_CLOTHING_PART_TYPES) figureContainer.removePart(part); + + for(const part of targetFigureContainer.getPartTypeIds()) figureContainer.updatePart(part, targetFigureContainer.getPartSetId(part), targetFigureContainer.getPartColorIds(part)); + + return figureContainer; + } + + public static transformAsMannequinFigure(figureContainer: IAvatarFigureContainer): void + { + for(const part of figureContainer.getPartTypeIds()) + { + if(this.MANNEQUIN_CLOTHING_PART_TYPES.indexOf(part) >= 0) continue; + + figureContainer.removePart(part); + } + + figureContainer.updatePart((this.MANNEQUIN_FIGURE[0] as string), (this.MANNEQUIN_FIGURE[1] as number), (this.MANNEQUIN_FIGURE[2] as number[])); + }; +} diff --git a/src/components/room/widgets/avatar-info/common/PetSupplementEnum.ts b/src/api/room/widgets/PetSupplementEnum.ts similarity index 100% rename from src/components/room/widgets/avatar-info/common/PetSupplementEnum.ts rename to src/api/room/widgets/PetSupplementEnum.ts diff --git a/src/api/room/widgets/PostureTypeEnum.ts b/src/api/room/widgets/PostureTypeEnum.ts new file mode 100644 index 00000000..21352d78 --- /dev/null +++ b/src/api/room/widgets/PostureTypeEnum.ts @@ -0,0 +1,5 @@ +export class PostureTypeEnum +{ + public static POSTURE_STAND: number = 0; + public static POSTURE_SIT: number = 1; +} diff --git a/src/api/nitro/room/widgets/events/RoomDimmerPreset.ts b/src/api/room/widgets/RoomDimmerPreset.ts similarity index 100% rename from src/api/nitro/room/widgets/events/RoomDimmerPreset.ts rename to src/api/room/widgets/RoomDimmerPreset.ts diff --git a/src/api/nitro/room/widgets/events/RoomObjectItem.ts b/src/api/room/widgets/RoomObjectItem.ts similarity index 100% rename from src/api/nitro/room/widgets/events/RoomObjectItem.ts rename to src/api/room/widgets/RoomObjectItem.ts diff --git a/src/api/room/widgets/UseProductItem.ts b/src/api/room/widgets/UseProductItem.ts new file mode 100644 index 00000000..d3e20889 --- /dev/null +++ b/src/api/room/widgets/UseProductItem.ts @@ -0,0 +1,12 @@ +export class UseProductItem +{ + constructor( + public readonly id: number, + public readonly category: number, + public readonly name: string, + public readonly requestRoomObjectId: number, + public readonly targetRoomObjectId: number, + public readonly requestInventoryStripId: number, + public readonly replace: boolean) + {} +} diff --git a/src/components/room/widgets/word-quiz/common/VoteValue.ts b/src/api/room/widgets/VoteValue.ts similarity index 100% rename from src/components/room/widgets/word-quiz/common/VoteValue.ts rename to src/api/room/widgets/VoteValue.ts diff --git a/src/components/room/widgets/furniture/youtube-tv/utils/YoutubeVideoPlaybackStateEnum.ts b/src/api/room/widgets/YoutubeVideoPlaybackStateEnum.ts similarity index 100% rename from src/components/room/widgets/furniture/youtube-tv/utils/YoutubeVideoPlaybackStateEnum.ts rename to src/api/room/widgets/YoutubeVideoPlaybackStateEnum.ts diff --git a/src/api/room/widgets/index.ts b/src/api/room/widgets/index.ts new file mode 100644 index 00000000..14e561c3 --- /dev/null +++ b/src/api/room/widgets/index.ts @@ -0,0 +1,22 @@ +export * from './AvatarInfoFurni'; +export * from './AvatarInfoName'; +export * from './AvatarInfoPet'; +export * from './AvatarInfoRentableBot'; +export * from './AvatarInfoUser'; +export * from './AvatarInfoUtilities'; +export * from './BotSkillsEnum'; +export * from './ChatBubbleMessage'; +export * from './ChatMessageTypeEnum'; +export * from './DimmerFurnitureWidgetPresetItem'; +export * from './DoChatsOverlap'; +export * from './FurnitureDimmerUtilities'; +export * from './IAvatarInfo'; +export * from './IPhotoData'; +export * from './MannequinUtilities'; +export * from './PetSupplementEnum'; +export * from './PostureTypeEnum'; +export * from './RoomDimmerPreset'; +export * from './RoomObjectItem'; +export * from './UseProductItem'; +export * from './VoteValue'; +export * from './YoutubeVideoPlaybackStateEnum'; diff --git a/src/api/utils/CloneObject.ts b/src/api/utils/CloneObject.ts new file mode 100644 index 00000000..6cd8d3eb --- /dev/null +++ b/src/api/utils/CloneObject.ts @@ -0,0 +1,14 @@ +export const CloneObject = (object: T): T => +{ + if((object == null) || ('object' != typeof object)) return object; + + // @ts-ignore + const copy = new object.constructor(); + + for(const attr in object) + { + if(object.hasOwnProperty(attr)) copy[attr] = object[attr]; + } + + return copy; +} diff --git a/src/api/utils/ColorUtils.ts b/src/api/utils/ColorUtils.ts index ccb6e27a..9377255e 100644 --- a/src/api/utils/ColorUtils.ts +++ b/src/api/utils/ColorUtils.ts @@ -7,7 +7,16 @@ export class ColorUtils public static makeColorNumberHex(color: number): string { - return ( '#' + color.toString(16)); + let val = color.toString(16); + if(val.length < 6) + { + const diff = 6 - val.length; + for(let i = 0; i < diff; i++) + { + val = '0' + val; + } + } + return ( '#' + val); } public static convertFromHex(color: string): number diff --git a/src/api/utils/LocalStorageKeys.ts b/src/api/utils/LocalStorageKeys.ts new file mode 100644 index 00000000..6c922790 --- /dev/null +++ b/src/api/utils/LocalStorageKeys.ts @@ -0,0 +1,5 @@ +export class LocalStorageKeys +{ + public static CATALOG_PLACE_MULTIPLE_OBJECTS: string = 'catalogPlaceMultipleObjects'; + public static CATALOG_SKIP_PURCHASE_CONFIRMATION: string = 'catalogSkipPurchaseConfirmation'; +} diff --git a/src/api/utils/PlaySound.ts b/src/api/utils/PlaySound.ts index 94c50ee9..0f9a39d8 100644 --- a/src/api/utils/PlaySound.ts +++ b/src/api/utils/PlaySound.ts @@ -1,6 +1,5 @@ -import { MouseEventType } from '@nitrots/nitro-renderer'; -import { NitroSoundEvent } from '@nitrots/nitro-renderer/src/nitro/events/NitroSoundEvent'; -import { DispatchMainEvent } from '../../hooks'; +import { MouseEventType, NitroSoundEvent } from '@nitrots/nitro-renderer'; +import { DispatchMainEvent } from '../events'; let canPlaySound = false; diff --git a/src/api/common/ProductImageUtility.ts b/src/api/utils/ProductImageUtility.ts similarity index 91% rename from src/api/common/ProductImageUtility.ts rename to src/api/utils/ProductImageUtility.ts index 3dfd5ef7..59c8c4f4 100644 --- a/src/api/common/ProductImageUtility.ts +++ b/src/api/utils/ProductImageUtility.ts @@ -1,6 +1,6 @@ import { CatalogPageMessageProductData } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '..'; -import { FurniCategory } from '../../components/catalog/common/FurniCategory'; +import { FurniCategory } from '../inventory'; +import { GetRoomEngine } from '../nitro'; export class ProductImageUtility { @@ -34,7 +34,7 @@ export class ProductImageUtility } break; case CatalogPageMessageProductData.E: - // fx_icon_furniClassId_png + // fx_icon_furniClassId_png break; } diff --git a/src/api/utils/RoomChatFormatter.ts b/src/api/utils/RoomChatFormatter.ts index c20aa344..8da83aca 100644 --- a/src/api/utils/RoomChatFormatter.ts +++ b/src/api/utils/RoomChatFormatter.ts @@ -1,6 +1,7 @@ import * as joypixels from 'emoji-toolkit'; const allowedColours: Map = new Map(); + allowedColours.set('r', 'red'); allowedColours.set('b', 'blue'); allowedColours.set('g', 'green'); @@ -23,28 +24,26 @@ allowedColours.set('brown', 'brown'); allowedColours.set('purple', 'purple'); allowedColours.set('pink', 'pink'); -function encodeHTML(str: string) +const encodeHTML = (str: string) => { - return str.replace(/([\u00A0-\u9999<>&])(.|$)/g, function(full, char, next) -{ - if(char !== '&' || next !== '#') -{ - if(/[\u00A0-\u9999<>&]/.test(next)) - next = '&#' + next.charCodeAt(0) + ';'; + return str.replace(/([\u00A0-\u9999<>&])(.|$)/g, (full, char, next) => + { + if(char !== '&' || next !== '#') + { + if(/[\u00A0-\u9999<>&]/.test(next)) next = '&#' + next.charCodeAt(0) + ';'; - return '&#' + char.charCodeAt(0) + ';' + next; - } + return '&#' + char.charCodeAt(0) + ';' + next; + } - return full; + return full; }); } - -export function RoomChatFormatter(content: string): string +export const RoomChatFormatter = (content: string) => { let result = ''; - content = encodeHTML(content) + content = encodeHTML(content); content = (joypixels.shortnameToUnicode(content) as string) if(content.startsWith('@') && content.indexOf('@', 1) > -1) diff --git a/src/api/utils/index.ts b/src/api/utils/index.ts index 6e223495..eeb74fce 100644 --- a/src/api/utils/index.ts +++ b/src/api/utils/index.ts @@ -1,10 +1,13 @@ +export * from './CloneObject'; export * from './ColorUtils'; export * from './LocalizeBadgeDescription'; export * from './LocalizeBageName'; export * from './LocalizeFormattedNumber'; export * from './LocalizeShortNumber'; export * from './LocalizeText'; +export * from './LocalStorageKeys'; export * from './PlaySound'; +export * from './ProductImageUtility'; export * from './Randomizer'; export * from './RoomChatFormatter'; export * from './SoundNames'; diff --git a/src/components/wired/common/GetWiredTimeLocale.ts b/src/api/wired/GetWiredTimeLocale.ts similarity index 100% rename from src/components/wired/common/GetWiredTimeLocale.ts rename to src/api/wired/GetWiredTimeLocale.ts diff --git a/src/components/wired/common/WiredActionLayoutCode.ts b/src/api/wired/WiredActionLayoutCode.ts similarity index 97% rename from src/components/wired/common/WiredActionLayoutCode.ts rename to src/api/wired/WiredActionLayoutCode.ts index f15a527f..5282dc59 100644 --- a/src/components/wired/common/WiredActionLayoutCode.ts +++ b/src/api/wired/WiredActionLayoutCode.ts @@ -1,4 +1,4 @@ -export class WiredActionLayout +export class WiredActionLayoutCode { public static TOGGLE_FURNI_STATE: number = 0; public static RESET: number = 1; diff --git a/src/components/wired/common/WiredConditionLayoutCode.ts b/src/api/wired/WiredConditionLayoutCode.ts similarity index 100% rename from src/components/wired/common/WiredConditionLayoutCode.ts rename to src/api/wired/WiredConditionLayoutCode.ts diff --git a/src/api/wired/WiredDateToString.ts b/src/api/wired/WiredDateToString.ts new file mode 100644 index 00000000..825adc8e --- /dev/null +++ b/src/api/wired/WiredDateToString.ts @@ -0,0 +1 @@ +export const WiredDateToString = (date: Date) => `${ date.getFullYear() }/${ ('0' + (date.getMonth() + 1)).slice(-2) }/${ ('0' + date.getDate()).slice(-2) } ${ ('0' + date.getHours()).slice(-2) }:${ ('0' + date.getMinutes()).slice(-2) }`; diff --git a/src/components/wired/common/WiredFurniType.ts b/src/api/wired/WiredFurniType.ts similarity index 100% rename from src/components/wired/common/WiredFurniType.ts rename to src/api/wired/WiredFurniType.ts diff --git a/src/components/wired/common/WiredSelectionFilter.ts b/src/api/wired/WiredSelectionFilter.ts similarity index 94% rename from src/components/wired/common/WiredSelectionFilter.ts rename to src/api/wired/WiredSelectionFilter.ts index b0b5ae32..d661bcf7 100644 --- a/src/components/wired/common/WiredSelectionFilter.ts +++ b/src/api/wired/WiredSelectionFilter.ts @@ -38,9 +38,9 @@ export class WiredSelectionFilter extends NitroFilter super(vertex, fragment); this.uniforms.lineColor = new Float32Array(3); - this.uniforms.color = new Float32Array(3); - this.lineColor = lineColor; - this.color = color; + this.uniforms.color = new Float32Array(3); + this.lineColor = lineColor; + this.color = color; } public get lineColor(): number | number[] diff --git a/src/components/wired/common/WiredSelectionVisualizer.ts b/src/api/wired/WiredSelectionVisualizer.ts similarity index 95% rename from src/components/wired/common/WiredSelectionVisualizer.ts rename to src/api/wired/WiredSelectionVisualizer.ts index 527a246c..7f5c3328 100644 --- a/src/components/wired/common/WiredSelectionVisualizer.ts +++ b/src/api/wired/WiredSelectionVisualizer.ts @@ -1,6 +1,6 @@ import { IRoomObject, IRoomObjectSpriteVisualization, NitroFilter, RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../../../api'; -import { WiredSelectionFilter } from './WiredSelectionFilter'; +import { WiredSelectionFilter } from '.'; +import { GetRoomEngine } from '..'; export class WiredSelectionVisualizer { diff --git a/src/components/wired/common/WiredStringDelimeter.ts b/src/api/wired/WiredStringDelimeter.ts similarity index 100% rename from src/components/wired/common/WiredStringDelimeter.ts rename to src/api/wired/WiredStringDelimeter.ts diff --git a/src/components/wired/common/WiredTriggerLayoutCode.ts b/src/api/wired/WiredTriggerLayoutCode.ts similarity index 100% rename from src/components/wired/common/WiredTriggerLayoutCode.ts rename to src/api/wired/WiredTriggerLayoutCode.ts diff --git a/src/api/wired/index.ts b/src/api/wired/index.ts new file mode 100644 index 00000000..e8558813 --- /dev/null +++ b/src/api/wired/index.ts @@ -0,0 +1,9 @@ +export * from './GetWiredTimeLocale'; +export * from './WiredActionLayoutCode'; +export * from './WiredConditionLayoutCode'; +export * from './WiredDateToString'; +export * from './WiredFurniType'; +export * from './WiredSelectionFilter'; +export * from './WiredSelectionVisualizer'; +export * from './WiredStringDelimeter'; +export * from './WiredTriggerLayoutCode'; diff --git a/src/assets/images/friends/messenger_notification_icon.png b/src/assets/images/friends/messenger_notification_icon.png new file mode 100644 index 00000000..73f7e5ea Binary files /dev/null and b/src/assets/images/friends/messenger_notification_icon.png differ diff --git a/src/assets/images/notifications/frank.gif b/src/assets/images/notifications/frank.gif new file mode 100644 index 00000000..211634f7 Binary files /dev/null and b/src/assets/images/notifications/frank.gif differ diff --git a/src/assets/images/room-spectator/room_spectator_bottom_left.png b/src/assets/images/room-spectator/room_spectator_bottom_left.png new file mode 100644 index 00000000..01688cb2 Binary files /dev/null and b/src/assets/images/room-spectator/room_spectator_bottom_left.png differ diff --git a/src/assets/images/room-spectator/room_spectator_bottom_right.png b/src/assets/images/room-spectator/room_spectator_bottom_right.png new file mode 100644 index 00000000..59c8ef2c Binary files /dev/null and b/src/assets/images/room-spectator/room_spectator_bottom_right.png differ diff --git a/src/assets/images/room-spectator/room_spectator_middle_bottom.png b/src/assets/images/room-spectator/room_spectator_middle_bottom.png new file mode 100644 index 00000000..ba6fdecc Binary files /dev/null and b/src/assets/images/room-spectator/room_spectator_middle_bottom.png differ diff --git a/src/assets/images/room-spectator/room_spectator_middle_left.png b/src/assets/images/room-spectator/room_spectator_middle_left.png new file mode 100644 index 00000000..6d9aaa79 Binary files /dev/null and b/src/assets/images/room-spectator/room_spectator_middle_left.png differ diff --git a/src/assets/images/room-spectator/room_spectator_middle_right.png b/src/assets/images/room-spectator/room_spectator_middle_right.png new file mode 100644 index 00000000..9d963b3d Binary files /dev/null and b/src/assets/images/room-spectator/room_spectator_middle_right.png differ diff --git a/src/assets/images/room-spectator/room_spectator_middle_top.png b/src/assets/images/room-spectator/room_spectator_middle_top.png new file mode 100644 index 00000000..f6559cee Binary files /dev/null and b/src/assets/images/room-spectator/room_spectator_middle_top.png differ diff --git a/src/assets/images/room-spectator/room_spectator_top_left.png b/src/assets/images/room-spectator/room_spectator_top_left.png new file mode 100644 index 00000000..5e62a3c9 Binary files /dev/null and b/src/assets/images/room-spectator/room_spectator_top_left.png differ diff --git a/src/assets/images/room-spectator/room_spectator_top_right.png b/src/assets/images/room-spectator/room_spectator_top_right.png new file mode 100644 index 00000000..825f3fb1 Binary files /dev/null and b/src/assets/images/room-spectator/room_spectator_top_right.png differ diff --git a/src/assets/styles/bootstrap/_reboot.scss b/src/assets/styles/bootstrap/_reboot.scss index 7abee7e0..4345886d 100644 --- a/src/assets/styles/bootstrap/_reboot.scss +++ b/src/assets/styles/bootstrap/_reboot.scss @@ -65,7 +65,7 @@ body { hr { margin: $hr-margin-y 0; color: $hr-color; // 1 - background-color: currentColor; + background-color: rgba(black,.2); border: 0; opacity: $hr-opacity; } diff --git a/src/assets/styles/bootstrap/_variables.scss b/src/assets/styles/bootstrap/_variables.scss index 1fe7c21c..eb668b31 100644 --- a/src/assets/styles/bootstrap/_variables.scss +++ b/src/assets/styles/bootstrap/_variables.scss @@ -610,7 +610,7 @@ $aspect-ratios: ( // scss-docs-start font-variables // stylelint-disable value-keyword-case -$font-family-sans-serif: GameUbuntu, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; +$font-family-sans-serif: Ubuntu !default; $font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default; // stylelint-enable value-keyword-case $font-family-base: var(--#{$variable-prefix}font-sans-serif) !default; diff --git a/src/assets/styles/fonts.scss b/src/assets/styles/fonts.scss index 2dabd11f..de694df0 100644 --- a/src/assets/styles/fonts.scss +++ b/src/assets/styles/fonts.scss @@ -1,29 +1,4 @@ @font-face { font-family: Ubuntu; - src: url('../webfonts/Ubuntu.ttf'); -} - -@font-face { - font-family: GameUbuntu; src: url('../webfonts/Ubuntu-C.ttf'); } - -@font-face { - font-family: UbuntuItalics; - src: url('../webfonts/Ubuntu-i.ttf'); -} - -@font-face { - font-family: UbuntuItalicsBold; - src: url('../webfonts/Ubuntu-ib.ttf'); -} - -@font-face { - font-family: UbuntuBold; - src: url('../webfonts/Ubuntu-b.ttf'); -} - -@font-face { - font-family: UbuntuMedium; - src: url('../webfonts/Ubuntu-m.ttf'); -} diff --git a/src/assets/styles/icons.scss b/src/assets/styles/icons.scss index 11d20360..17c3657f 100644 --- a/src/assets/styles/icons.scss +++ b/src/assets/styles/icons.scss @@ -42,6 +42,10 @@ width: 32px; } + &.gray { + opacity: .5; + } + &.icon-inventory { background-image: url('../images/toolbar/icons/inventory.png'); height: 41px; diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index c909faf1..7427e6b4 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -7,7 +7,7 @@ @import './utils'; .btn-sm { - min-height: 28px; + min-height: 28px; } textarea { diff --git a/src/assets/styles/utils.scss b/src/assets/styles/utils.scss index c1a3be5b..f8710058 100644 --- a/src/assets/styles/utils.scss +++ b/src/assets/styles/utils.scss @@ -15,7 +15,7 @@ } .scale-1-50 { - transform: scale(1.50) translateZ(0); + transform: scale(1.5) translateZ(0); } .scale-2 { @@ -35,7 +35,6 @@ } ul { - &.columns-3 { display: block; columns: 3; @@ -92,7 +91,6 @@ ul { } .striped-children { - > :nth-child(1) { background-color: $table-striped-bg; } @@ -100,21 +98,25 @@ ul { @keyframes bounceIn { 0% { - opacity: 0; - transform: scale(.3); + opacity: 0; + transform: scale(0.3); } 50% { - opacity: 1; - transform: scale(1.1); + opacity: 1; + transform: scale(1.1); } 70% { - transform: scale(.9); + transform: scale(0.9); } 100% { - transform: scale(1); + transform: scale(1); } } .btn { pointer-events: all; } + +.no-resize { + resize: none !important; +} diff --git a/src/common/Base.tsx b/src/common/Base.tsx index 72ee2c27..c77bd9c4 100644 --- a/src/common/Base.tsx +++ b/src/common/Base.tsx @@ -1,11 +1,12 @@ -import { CSSProperties, DetailedHTMLProps, FC, HTMLAttributes, LegacyRef, useMemo } from 'react'; +import { CSSProperties, DetailedHTMLProps, FC, HTMLAttributes, MutableRefObject, ReactNode, useMemo } from 'react'; import { ColorVariantType, DisplayType, FloatType, OverflowType, PositionType } from './types'; export interface BaseProps extends DetailedHTMLProps, T> { - innerRef?: LegacyRef; + innerRef?: MutableRefObject; display?: DisplayType; fit?: boolean; + fitV?: boolean; grow?: boolean; shrink?: boolean; fullWidth?: boolean; @@ -17,11 +18,12 @@ export interface BaseProps extends DetailedHTMLProps> = props => { - const { ref = null, innerRef = null, display = null, fit = false, grow = false, shrink = false, fullWidth = false, fullHeight = false, overflow = null, position = null, float = null, pointer = false, visible = null, textColor = null, classNames = [], className = '', style = {}, ...rest } = props; + const { ref = null, innerRef = null, display = null, fit = false, fitV = false, grow = false, shrink = false, fullWidth = false, fullHeight = false, overflow = null, position = null, float = null, pointer = false, visible = null, textColor = null, classNames = [], className = '', style = {}, children = null, ...rest } = props; const getClassNames = useMemo(() => { @@ -33,6 +35,8 @@ export const Base: FC> = props => if(fit || fullHeight) newClassNames.push('h-100'); + if(fitV) newClassNames.push('vw-100', 'vh-100'); + if(grow) newClassNames.push('flex-grow-1'); if(shrink) newClassNames.push('flex-shrink-0'); @@ -52,7 +56,7 @@ export const Base: FC> = props => if(classNames.length) newClassNames.push(...classNames); return newClassNames; - }, [ display, fit, grow, shrink, fullWidth, fullHeight, overflow, position, float, pointer, visible, textColor, classNames ]); + }, [ display, fit, fitV, grow, shrink, fullWidth, fullHeight, overflow, position, float, pointer, visible, textColor, classNames ]); const getClassName = useMemo(() => { @@ -72,5 +76,9 @@ export const Base: FC> = props => return newStyle; }, [ style ]); - return
; + return ( +
+ { children } +
+ ); } diff --git a/src/common/card/NitroCardView.scss b/src/common/card/NitroCardView.scss index 0d886814..e942d516 100644 --- a/src/common/card/NitroCardView.scss +++ b/src/common/card/NitroCardView.scss @@ -100,6 +100,7 @@ $nitro-card-tabs-height: 33px; box-shadow: 0 2px white; width: 100%; margin: 0; + padding-top:2px; &:before { position: absolute; @@ -179,6 +180,7 @@ $nitro-card-tabs-height: 33px; .nitro-card-tabs { height: 100%; + min-height: $nitro-card-tabs-height; max-height: $nitro-card-tabs-height; border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color; } diff --git a/src/common/card/accordion/NitroCardAccordionSetView.tsx b/src/common/card/accordion/NitroCardAccordionSetView.tsx index 05dde76b..86eda4cb 100644 --- a/src/common/card/accordion/NitroCardAccordionSetView.tsx +++ b/src/common/card/accordion/NitroCardAccordionSetView.tsx @@ -22,7 +22,7 @@ export const NitroCardAccordionSetView: FC = pro setIsOpen(prevValue => !prevValue); } - const close = useCallback(() => setIsOpen(false), []); + const onClose = useCallback(() => setIsOpen(false), []); const getClassNames = useMemo(() => { @@ -42,31 +42,31 @@ export const NitroCardAccordionSetView: FC = pro useEffect(() => { - const closeFunction = close; + const closeFunction = onClose; setClosers(prevValue => - { - const newClosers = [ ...prevValue ]; + { + const newClosers = [ ...prevValue ]; - newClosers.push(closeFunction); + newClosers.push(closeFunction); - return newClosers; - }); + return newClosers; + }); return () => { setClosers(prevValue => - { - const newClosers = [ ...prevValue ]; + { + const newClosers = [ ...prevValue ]; - const index = newClosers.indexOf(closeFunction); + const index = newClosers.indexOf(closeFunction); - if(index >= 0) newClosers.splice(index, 1); + if(index >= 0) newClosers.splice(index, 1); - return newClosers; - }); + return newClosers; + }); } - }, [ close, setClosers ]); + }, [ onClose, setClosers ]); return ( diff --git a/src/common/draggable-window/DraggableWindow.tsx b/src/common/draggable-window/DraggableWindow.tsx index 498c5878..05813e42 100644 --- a/src/common/draggable-window/DraggableWindow.tsx +++ b/src/common/draggable-window/DraggableWindow.tsx @@ -1,8 +1,7 @@ import { MouseEventType, TouchEventType } from '@nitrots/nitro-renderer'; -import { CSSProperties, FC, Key, MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent, useCallback, useEffect, useRef, useState } from 'react'; +import { CSSProperties, FC, Key, MouseEvent as ReactMouseEvent, ReactNode, TouchEvent as ReactTouchEvent, useCallback, useEffect, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { Base } from '..'; -import { BatchUpdates } from '../../hooks'; import { DraggableWindowPosition } from './DraggableWindowPosition'; const CURRENT_WINDOWS: HTMLElement[] = []; @@ -19,6 +18,7 @@ export interface DraggableWindowProps dragStyle?: CSSProperties; offsetLeft?: number; offsetTop?: number; + children?: ReactNode; } export const DraggableWindow: FC = props => @@ -108,8 +108,8 @@ export const DraggableWindow: FC = props => { if(!elementRef.current || !dragHandler) return; - let offsetX = (offset.x + delta.x); - let offsetY = (offset.y + delta.y); + let offsetX = (offset.x + delta.x); + let offsetY = (offset.y + delta.y); const left = elementRef.current.offsetLeft + offsetX; const top = elementRef.current.offsetTop + offsetY; @@ -134,12 +134,9 @@ export const DraggableWindow: FC = props => offsetX = (document.body.offsetWidth - elementRef.current.offsetWidth) - elementRef.current.offsetLeft; } - BatchUpdates(() => - { - setDelta({ x: 0, y: 0 }); - setOffset({ x: offsetX, y: offsetY }); - setIsDragging(false); - }); + setDelta({ x: 0, y: 0 }); + setOffset({ x: offsetX, y: offsetY }); + setIsDragging(false); if(uniqueKey !== null) POS_MEMORY.set(uniqueKey, { x: offsetX, y: offsetY }); }, [ dragHandler, delta, offset, uniqueKey ]); @@ -201,11 +198,8 @@ export const DraggableWindow: FC = props => } } - BatchUpdates(() => - { - setDelta({ x: 0, y: 0 }); - setOffset({ x: offsetX, y: offsetY }); - }); + setDelta({ x: 0, y: 0 }); + setOffset({ x: offsetX, y: offsetY }); return () => { @@ -213,7 +207,7 @@ export const DraggableWindow: FC = props => if(index >= 0) CURRENT_WINDOWS.splice(index, 1); } - }, [ handleSelector, windowPosition, uniqueKey, disableDrag, bringToTop ]); + }, [ handleSelector, windowPosition, uniqueKey, disableDrag, offsetLeft, offsetTop, bringToTop ]); useEffect(() => { @@ -261,8 +255,8 @@ export const DraggableWindow: FC = props => return ( createPortal( - - { children } - , document.getElementById('draggable-windows-container')) + + { children } + , document.getElementById('draggable-windows-container')) ); } diff --git a/src/common/index.scss b/src/common/index.scss index e6740af7..3a08bf3c 100644 --- a/src/common/index.scss +++ b/src/common/index.scss @@ -16,7 +16,7 @@ cursor: not-allowed; img { - opacity: .5; + opacity: 0.5; filter: grayscale(1); } } @@ -30,9 +30,8 @@ } &.has-highlight { - &:after { - content: ''; + content: ""; z-index: 2; position: absolute; top: 0; @@ -48,7 +47,7 @@ .nitro-room-thumbnail-camera { width: 132px; height: 192px; - background-image: url('../assets/images/room-widgets/thumbnail-widget/thumbnail-camera-spritesheet.png'); + background-image: url("../assets/images/room-widgets/thumbnail-widget/thumbnail-camera-spritesheet.png"); .camera-frame { position: absolute; @@ -65,10 +64,10 @@ height: 173px; color: black; pointer-events: all; - + background-position: 0px 0px; - background-image: url('../assets/images/room-widgets/trophy-widget/trophy-spritesheet.png'); - + background-image: url("../assets/images/room-widgets/trophy-widget/trophy-spritesheet.png"); + &.trophy-2 { background-position: 0px 173px; } @@ -103,7 +102,7 @@ .nitro-gift-card { width: 306px; height: 159px; - background: url('../assets/images/gift/gift_tag.png') center no-repeat; + background: url("../assets/images/gift/gift_tag.png") center no-repeat; .gift-face { width: 65px; @@ -111,7 +110,8 @@ .gift-incognito { width: 37px; height: 48px; - background: url('../assets/images/gift/incognito.png') center no-repeat; + background: url("../assets/images/gift/incognito.png") center + no-repeat; } .gift-avatar { @@ -168,17 +168,26 @@ } @-webkit-keyframes sk-bouncedelay { - 0%, 80%, 100% { -webkit-transform: scale(0) } - 40% { -webkit-transform: scale(1.0) } + 0%, + 80%, + 100% { + -webkit-transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + } } - + @keyframes sk-bouncedelay { - 0%, 80%, 100% { - -webkit-transform: scale(0); - transform: scale(0); - } 40% { - -webkit-transform: scale(1.0); - transform: scale(1.0); + 0%, + 80%, + 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); } } @@ -186,27 +195,9 @@ position: relative; width: 110px; height: 110px; - background: url('../assets/images/navigator/thumbnail_placeholder.png') no-repeat center; - background-color: rgba($black, .125); -} - -.nitro-alert { - width: 350px; - min-height: 150px; - max-height: 350px; -} - -.nitro-notification-bubble { - pointer-events: all; - padding: 6px 5px; - background-color: rgba($dark,.95); - box-shadow: inset 0px 5px lighten(rgba($dark,.6),2.5), inset 0 -4px darken(rgba($dark,.6),4); - font-size: $font-size-sm; - - .bubble-image-container { - width: 50px; - height: 50px; - } + background: url("../assets/images/navigator/thumbnail_placeholder.png") + no-repeat center; + background-color: rgba($black, 0.125); } #draggable-windows-container { @@ -242,7 +233,7 @@ top: 2px; right: 2px; font-size: 9.5px; - padding:2px 3px; + padding: 2px 3px; z-index: 1; } @@ -253,16 +244,6 @@ background-repeat: no-repeat; background-position: center; - &.group-badge { - width: 39px; - height: 39px; - - &.scale-2 { - width: 80px; - height: 80px; - } - } - .badge-information { display: none; } @@ -282,10 +263,10 @@ background: $white; left: -220px; z-index: 100; - + &:before { position: absolute; - content: ' '; + content: " "; width: 0; height: 0; border-left: 10px solid $white; @@ -308,7 +289,7 @@ .nitro-rarity-level { width: 36px; height: 28px; - background: url('../assets/images/infostand/rarity-level.png'); + background: url("../assets/images/infostand/rarity-level.png"); div { line-height: 28px; @@ -325,12 +306,6 @@ background-repeat: no-repeat; background-position: center -8px; pointer-events: none; - image-rendering: pixelated; - - &.scale-0-5, - &.scale-0-75 { - image-rendering: -webkit-optimize-contrast; - } } .pet-image { @@ -356,7 +331,7 @@ background-repeat: no-repeat; background-position: center; overflow: hidden; - + &.border-0 { &::after { content: none; @@ -365,7 +340,7 @@ &::after { position: absolute; - content: ''; + content: ""; top: 0; bottom: 0; left: 0; @@ -373,13 +348,13 @@ border-radius: $border-radius; border-bottom: 2px solid white; border-right: 2px solid white; - box-shadow: -2px -2px rgba(0, 0, 0, .4), inset 3px 3px rgba(0, 0, 0, .2); + box-shadow: -2px -2px rgba(0, 0, 0, 0.4), + inset 3px 3px rgba(0, 0, 0, 0.2); } } } .unique-item { - .unique-bg-override { background-position: center; background-repeat: no-repeat; @@ -388,26 +363,28 @@ &:before { position: absolute; - content: ''; + content: ""; width: 100%; height: 100%; - background: url('../assets/images/unique/grid-bg.png') center no-repeat; + background: url("../assets/images/unique/grid-bg.png") center no-repeat; z-index: 1; } &:after { position: absolute; - content: ''; + content: ""; width: 100%; height: 100%; - background: url('../assets/images/unique/grid-bg-glass.png') center no-repeat; + background: url("../assets/images/unique/grid-bg-glass.png") center + no-repeat; bottom: 0; z-index: 4; } &.sold-out:after { - background: url('../assets/images/unique/grid-bg-sold-out.png') center no-repeat, - url('../assets/images/unique/grid-bg-glass.png') center no-repeat; + background: url("../assets/images/unique/grid-bg-sold-out.png") center + no-repeat, + url("../assets/images/unique/grid-bg-glass.png") center no-repeat; } .unique-item-counter { @@ -418,7 +395,8 @@ bottom: 1px; width: 100%; height: 9px; - background: url('../assets/images/unique/grid-count-bg.png') center no-repeat; + background: url("../assets/images/unique/grid-count-bg.png") center + no-repeat; z-index: 3; } } @@ -426,7 +404,7 @@ .unique-sold-out-blocker { width: 364px; height: 30px; - background: url('../assets/images/unique/catalog-info-sold-out.png'); + background: url("../assets/images/unique/catalog-info-sold-out.png"); div { float: right; @@ -447,7 +425,7 @@ right: 16px; width: 34px; height: 37px; - background: url('../assets/images/unique/inventory-info-amount-bg.png'); + background: url("../assets/images/unique/inventory-info-amount-bg.png"); div { display: flex; @@ -460,7 +438,8 @@ .unique-complete-plate { width: 170px; height: 29px; - background: url('../assets/images/unique/catalog-info-amount-bg.png') no-repeat center; + background: url("../assets/images/unique/catalog-info-amount-bg.png") + no-repeat center; z-index: 1; padding-top: 3px; @@ -481,7 +460,7 @@ outline: 0; height: 5px; margin-right: 1px; - background-image: url('../assets/images/unique/numbers.png'); + background-image: url("../assets/images/unique/numbers.png"); background-repeat: no-repeat; &:last-child { @@ -539,4 +518,35 @@ } } -@import './card/NitroCardView'; +.nitro-progress-bar { + border: 1px solid $white; + padding: 2px; + height: 20px; + border-radius: $border-radius; + overflow: hidden; + background: $primary; + + &.large { + height: 30px; + } + + .nitro-progress-bar-inner { + height: 100%; + z-index: 1; + transition: all 1s; + border-radius: calc(#{$border-radius} / 2); + background: repeating-linear-gradient( + $tertiary, + $tertiary 50%, + $quaternary 50%, + $quaternary 100% + ); + } + + .nitro-progress-bar-text { + text-shadow: 0px 4px 4px rgba($black, 0.25); + z-index: 2; + } +} + +@import "./card/NitroCardView"; diff --git a/src/common/layout/LayoutAvatarImageView.tsx b/src/common/layout/LayoutAvatarImageView.tsx index 814b201e..d127bd99 100644 --- a/src/common/layout/LayoutAvatarImageView.tsx +++ b/src/common/layout/LayoutAvatarImageView.tsx @@ -23,29 +23,10 @@ export const LayoutAvatarImageView: FC = props => { const newClassNames: string[] = [ 'avatar-image' ]; - switch(scale) - { - case .5: - newClassNames.push('scale-0-5'); - break; - case .75: - newClassNames.push('scale-0-75'); - break; - case 1.25: - newClassNames.push('scale-1-25'); - break; - case 1.50: - newClassNames.push('scale-1-50'); - break; - default: - newClassNames.push(`scale-${ scale }`); - break; - } - if(classNames.length) newClassNames.push(...classNames); return newClassNames; - }, [ scale, classNames ]); + }, [ classNames ]); const getStyle = useMemo(() => { @@ -53,10 +34,17 @@ export const LayoutAvatarImageView: FC = props => if(avatarUrl && avatarUrl.length) newStyle.backgroundImage = `url('${ avatarUrl }')`; + if(scale !== 1) + { + newStyle.transform = `scale(${ scale })`; + + if(!(scale % 1)) newStyle.imageRendering = 'pixelated'; + } + if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; return newStyle; - }, [ avatarUrl, style ]); + }, [ avatarUrl, scale, style ]); useEffect(() => { @@ -67,7 +55,8 @@ export const LayoutAvatarImageView: FC = props => setRandomValue(Math.random()); }, - dispose: () => {}, + dispose: () => + {}, disposed: false }, null); diff --git a/src/common/layout/LayoutBackgroundImage.tsx b/src/common/layout/LayoutBackgroundImage.tsx new file mode 100644 index 00000000..0900a260 --- /dev/null +++ b/src/common/layout/LayoutBackgroundImage.tsx @@ -0,0 +1,23 @@ +import { FC, useMemo } from 'react'; +import { Base, BaseProps } from '../Base'; + +export interface LayoutBackgroundImageProps extends BaseProps +{ + imageUrl?: string; +} + +export const LayoutBackgroundImage: FC = props => +{ + const { imageUrl = null, fit = true, style = null, ...rest } = props; + + const getStyle = useMemo(() => + { + const newStyle = { ...style }; + + if(imageUrl) newStyle.background = `url(${ imageUrl }) center no-repeat`; + + return newStyle; + }, [ style, imageUrl ]); + + return ; +} diff --git a/src/common/layout/LayoutBadgeImageView.tsx b/src/common/layout/LayoutBadgeImageView.tsx index 43a59f68..3445abc4 100644 --- a/src/common/layout/LayoutBadgeImageView.tsx +++ b/src/common/layout/LayoutBadgeImageView.tsx @@ -1,6 +1,6 @@ import { BadgeImageReadyEvent, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, useEffect, useMemo, useState } from 'react'; -import { GetSessionDataManager, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../api'; +import { GetConfiguration, GetSessionDataManager, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../api'; import { Base, BaseProps } from '../Base'; export interface LayoutBadgeImageViewProps extends BaseProps @@ -16,22 +16,7 @@ export interface LayoutBadgeImageViewProps extends BaseProps export const LayoutBadgeImageView: FC = props => { const { badgeCode = null, isGroup = false, showInfo = false, customTitle = null, isGrayscale = false, scale = 1, classNames = [], style = {}, children = null, ...rest } = props; - const [ badgeUrl, setBadgeUrl ] = useState(''); - - const getScaleClass = useMemo(() => - { - let scaleName = scale.toString(); - - if(scale === .5) scaleName = '0-5'; - - else if(scale === .75) scaleName = '0-75'; - - else if(scale === 1.25) scaleName = '1-25'; - - else if(scale === 1.50) scaleName = '1-50'; - - return `scale-${ scaleName }`; - }, [ scale ]); + const [ imageElement, setImageElement ] = useState(null); const getClassNames = useMemo(() => { @@ -41,23 +26,36 @@ export const LayoutBadgeImageView: FC = props => if(isGrayscale) newClassNames.push('grayscale'); - if((scale !== 1) && getScaleClass.length) newClassNames.push(getScaleClass); - if(classNames.length) newClassNames.push(...classNames); return newClassNames; - }, [ classNames, isGroup, isGrayscale, scale, getScaleClass ]); + }, [ classNames, isGroup, isGrayscale ]); const getStyle = useMemo(() => { let newStyle: CSSProperties = {}; - if(badgeUrl && badgeUrl.length) newStyle.backgroundImage = `url(${ badgeUrl })`; + if(imageElement) + { + newStyle.backgroundImage = `url('${ imageElement.src }')`; + newStyle.width = imageElement.width; + newStyle.height = imageElement.height; + + if(scale !== 1) + { + newStyle.transform = `scale(${ scale })`; + + if(!(scale % 1)) newStyle.imageRendering = 'pixelated'; + + newStyle.width = (imageElement.width * scale); + newStyle.height = (imageElement.height * scale); + } + } if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; return newStyle; - }, [ style, badgeUrl ]); + }, [ imageElement, scale, style ]); useEffect(() => { @@ -69,7 +67,9 @@ export const LayoutBadgeImageView: FC = props => { if(event.badgeId !== badgeCode) return; - setBadgeUrl(TextureUtils.generateImageUrl(new NitroSprite(event.image))); + const element = TextureUtils.generateImage(new NitroSprite(event.image)); + + element.onload = () => setImageElement(element); didSetBadge = true; @@ -80,27 +80,23 @@ export const LayoutBadgeImageView: FC = props => const texture = isGroup ? GetSessionDataManager().getGroupBadgeImage(badgeCode) : GetSessionDataManager().getBadgeImage(badgeCode); - if(texture && !didSetBadge) setBadgeUrl(TextureUtils.generateImageUrl(new NitroSprite(texture))); + if(texture && !didSetBadge) + { + const element = TextureUtils.generateImage(new NitroSprite(texture)); + + element.onload = () => setImageElement(element); + } return () => GetSessionDataManager().events.removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); }, [ badgeCode, isGroup ]); - const BadgeInformationView = (props: { title: string, description: string }) => - { - const { title = null, description = null } = props; - - return ( - -
{ title }
-
{ description }
- - ); - }; - return ( - { showInfo && - } + { (showInfo && GetConfiguration('badge.descriptions.enabled', true)) && + +
{ isGroup ? customTitle : LocalizeBadgeName(badgeCode) }
+
{ isGroup ? LocalizeText('group.badgepopup.body') : LocalizeBadgeDescription(badgeCode) }
+ } { children } ); diff --git a/src/common/layout/LayoutFurniIconImageView.tsx b/src/common/layout/LayoutFurniIconImageView.tsx new file mode 100644 index 00000000..b1191dbd --- /dev/null +++ b/src/common/layout/LayoutFurniIconImageView.tsx @@ -0,0 +1,17 @@ +import { FC } from 'react'; +import { LayoutImage, LayoutImageProps } from '.'; +import { GetImageIconUrlForProduct } from '../../api'; + +interface LayoutFurniIconImageViewProps extends LayoutImageProps +{ + productType: string; + productClassId: number; + extraData?: string; +} + +export const LayoutFurniIconImageView: FC = props => +{ + const { productType = 's', productClassId = -1, extraData = '', ...rest } = props; + + return ; +} diff --git a/src/common/layout/LayoutFurniImageView.tsx b/src/common/layout/LayoutFurniImageView.tsx index a9d81772..ed14d0af 100644 --- a/src/common/layout/LayoutFurniImageView.tsx +++ b/src/common/layout/LayoutFurniImageView.tsx @@ -1,10 +1,10 @@ import { IGetImageListener, ImageResult, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { GetRoomEngine } from '../../api'; -import { ProductTypeEnum } from '../../components/catalog/common/ProductTypeEnum'; +import { CSSProperties, FC, useCallback, useEffect, useMemo, useState } from 'react'; +import { BaseProps } from '..'; +import { GetRoomEngine, ProductTypeEnum } from '../../api'; import { Base } from '../Base'; -interface LayoutFurniImageViewProps +interface LayoutFurniImageViewProps extends BaseProps { productType: string; productClassId: number; @@ -15,9 +15,32 @@ interface LayoutFurniImageViewProps export const LayoutFurniImageView: FC = props => { - const { productType = 's', productClassId = -1, direction = 0, extraData = '', scale = 1 } = props; + const { productType = 's', productClassId = -1, direction = 2, extraData = '', scale = 1, style = {}, ...rest } = props; const [ imageElement, setImageElement ] = useState(null); + const getStyle = useMemo(() => + { + let newStyle: CSSProperties = {}; + + if(imageElement?.src?.length) + { + newStyle.backgroundImage = `url('${ imageElement.src }')`; + newStyle.width = imageElement.width; + newStyle.height = imageElement.height; + } + + if(scale !== 1) + { + newStyle.transform = `scale(${ scale })`; + + if(!(scale % 1)) newStyle.imageRendering = 'pixelated'; + } + + if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; + + return newStyle; + }, [ imageElement, scale, style ]); + const buildImage = useCallback(() => { let imageResult: ImageResult = null; @@ -60,7 +83,5 @@ export const LayoutFurniImageView: FC = props => if(!imageElement) return null; - const imageUrl = `url('${ imageElement.src }')`; - - return ; + return ; } diff --git a/src/common/layout/LayoutGiftTagView.tsx b/src/common/layout/LayoutGiftTagView.tsx index 0db589b0..8fcc405f 100644 --- a/src/common/layout/LayoutGiftTagView.tsx +++ b/src/common/layout/LayoutGiftTagView.tsx @@ -31,7 +31,7 @@ export const LayoutGiftTagView: FC = props => { editable && (onChange !== null) && } { userName && - { LocalizeText('catalog.gift_wrapping_new.message_from', ['name'], [userName]) } } + { LocalizeText('catalog.gift_wrapping_new.message_from', [ 'name' ], [ userName ]) } }
diff --git a/src/common/layout/LayoutGridItem.tsx b/src/common/layout/LayoutGridItem.tsx index 0a630d00..e1a32e5a 100644 --- a/src/common/layout/LayoutGridItem.tsx +++ b/src/common/layout/LayoutGridItem.tsx @@ -49,14 +49,14 @@ export const LayoutGridItem: FC = props => { let newStyle = { ...style }; - if(itemImage) newStyle.backgroundImage = `url(${ itemImage })`; + if(itemImage && !(itemUniqueSoldout || (itemUniqueNumber > 0))) newStyle.backgroundImage = `url(${ itemImage })`; if(itemColor) newStyle.backgroundColor = itemColor; if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; return newStyle; - }, [ style, itemImage, itemColor ]); + }, [ style, itemImage, itemColor, itemUniqueSoldout, itemUniqueNumber ]); return ( diff --git a/src/common/layout/LayoutImage.tsx b/src/common/layout/LayoutImage.tsx index d1ca7fe7..e6c6228e 100644 --- a/src/common/layout/LayoutImage.tsx +++ b/src/common/layout/LayoutImage.tsx @@ -1,23 +1,13 @@ -import { FC, useMemo } from 'react'; -import { Base, BaseProps } from '../Base'; +import { DetailedHTMLProps, FC, HTMLAttributes } from 'react'; -export interface LayoutImageProps extends BaseProps +export interface LayoutImageProps extends DetailedHTMLProps, HTMLImageElement> { imageUrl?: string; } export const LayoutImage: FC = props => { - const { imageUrl = null, fit = true, style = null, ...rest } = props; + const { imageUrl = null, className = '', ...rest } = props; - const getStyle = useMemo(() => - { - const newStyle = { ...style }; - - if(imageUrl) newStyle.background = `url(${ imageUrl }) center no-repeat`; - - return newStyle; - }, [ style, imageUrl ]); - - return ; + return ; } diff --git a/src/common/layout/LayoutMiniCameraView.tsx b/src/common/layout/LayoutMiniCameraView.tsx index 0a8fb07b..934e1cc8 100644 --- a/src/common/layout/LayoutMiniCameraView.tsx +++ b/src/common/layout/LayoutMiniCameraView.tsx @@ -1,7 +1,6 @@ import { NitroRectangle, NitroRenderTexture } from '@nitrots/nitro-renderer'; import { FC, useCallback, useRef } from 'react'; -import { GetRoomEngine, LocalizeText, SoundNames } from '../../api'; -import { PlaySound } from '../../api/utils/PlaySound'; +import { GetRoomEngine, LocalizeText, PlaySound, SoundNames } from '../../api'; import { DraggableWindow } from '../draggable-window'; interface LayoutMiniCameraViewProps diff --git a/src/common/layout/LayoutNotificationAlertView.tsx b/src/common/layout/LayoutNotificationAlertView.tsx index b534d37d..8db771af 100644 --- a/src/common/layout/LayoutNotificationAlertView.tsx +++ b/src/common/layout/LayoutNotificationAlertView.tsx @@ -1,29 +1,33 @@ import { FC, useMemo } from 'react'; +import { NotificationAlertType } from '../../api'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView, NitroCardViewProps } from '../card'; export interface LayoutNotificationAlertViewProps extends NitroCardViewProps { title?: string; - close: () => void; + type?: string; + onClose: () => void; } export const LayoutNotificationAlertView: FC = props => { - const { title = '', close = null, classNames = [], children = null, ...rest } = props; + const { title = '', onClose = null, classNames = [], children = null,type = NotificationAlertType.DEFAULT, ...rest } = props; const getClassNames = useMemo(() => { const newClassNames: string[] = [ 'nitro-alert' ]; + + newClassNames.push('nitro-alert-' + type); if(classNames.length) newClassNames.push(...classNames); return newClassNames; - }, [ classNames ]); + }, [ classNames, type ]); return ( - - + + { children } diff --git a/src/common/layout/LayoutNotificationBubbleView.tsx b/src/common/layout/LayoutNotificationBubbleView.tsx index 59771e7e..a4821664 100644 --- a/src/common/layout/LayoutNotificationBubbleView.tsx +++ b/src/common/layout/LayoutNotificationBubbleView.tsx @@ -6,12 +6,12 @@ export interface LayoutNotificationBubbleViewProps extends FlexProps { fadesOut?: boolean; timeoutMs?: number; - close: () => void; + onClose: () => void; } export const LayoutNotificationBubbleView: FC = props => { - const { fadesOut = true, timeoutMs = 8000, close = null, overflow = 'hidden', classNames = [], ...rest } = props; + const { fadesOut = true, timeoutMs = 8000, onClose = null, overflow = 'hidden', classNames = [], ...rest } = props; const [ isVisible, setIsVisible ] = useState(false); const getClassNames = useMemo(() => @@ -35,18 +35,18 @@ export const LayoutNotificationBubbleView: FC if(!fadesOut) return; const timeout = setTimeout(() => - { - setIsVisible(false); + { + setIsVisible(false); - setTimeout(() => close(), 300); - }, timeoutMs); + setTimeout(() => onClose(), 300); + }, timeoutMs); return () => clearTimeout(timeout); - }, [ fadesOut, timeoutMs, close ]); + }, [ fadesOut, timeoutMs, onClose ]); return ( - + ); } diff --git a/src/common/layout/LayoutPetImageView.tsx b/src/common/layout/LayoutPetImageView.tsx index ffe6c2d4..6d4677be 100644 --- a/src/common/layout/LayoutPetImageView.tsx +++ b/src/common/layout/LayoutPetImageView.tsx @@ -1,13 +1,14 @@ import { PetCustomPart, PetFigureData, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useRef, useState } from 'react'; +import { CSSProperties, FC, useEffect, useMemo, useRef, useState } from 'react'; import { GetRoomEngine } from '../../api'; +import { Base, BaseProps } from '../Base'; -interface LayoutPetImageViewProps +interface LayoutPetImageViewProps extends BaseProps { figure?: string; typeId?: number; paletteId?: number; - color?: number; + petColor?: number; customParts?: PetCustomPart[]; posture?: string; headOnly?: boolean; @@ -17,17 +18,35 @@ interface LayoutPetImageViewProps export const LayoutPetImageView: FC = props => { - const { figure = '', typeId = -1, paletteId = -1, color = 0xFFFFFF, customParts = [], posture = 'std', headOnly = false, direction = 0, scale = 1 } = props; + const { figure = '', typeId = -1, paletteId = -1, petColor = 0xFFFFFF, customParts = [], posture = 'std', headOnly = false, direction = 0, scale = 1, style = {}, ...rest } = props; const [ petUrl, setPetUrl ] = useState(null); const isDisposed = useRef(false); + const getStyle = useMemo(() => + { + let newStyle: CSSProperties = {}; + + if(petUrl && petUrl.length) newStyle.backgroundImage = `url(${ petUrl })`; + + if(scale !== 1) + { + newStyle.transform = `scale(${ scale })`; + + if(!(scale % 1)) newStyle.imageRendering = 'pixelated'; + } + + if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; + + return newStyle; + }, [ petUrl, scale, style ]); + useEffect(() => { let url = null; let petTypeId = typeId; let petPaletteId = paletteId; - let petColor = color; + let petColor1 = petColor; let petCustomParts = customParts; let petHeadOnly = headOnly; @@ -37,13 +56,13 @@ export const LayoutPetImageView: FC = props => petTypeId = petFigureData.typeId; petPaletteId = petFigureData.paletteId; - petColor = petFigureData.color; + petColor1 = petFigureData.color; petCustomParts = petFigureData.customParts; } if(petTypeId === 16) petHeadOnly = false; - const imageResult = GetRoomEngine().getRoomObjectPetImage(petTypeId, petPaletteId, petColor, new Vector3d((direction * 45)), 64, { + const imageResult = GetRoomEngine().getRoomObjectPetImage(petTypeId, petPaletteId, petColor1, new Vector3d((direction * 45)), 64, { imageReady: (id, texture, image) => { if(isDisposed.current) return; @@ -65,7 +84,7 @@ export const LayoutPetImageView: FC = props => } - }, [ figure, typeId, paletteId, color, customParts, posture, headOnly, direction ]); + }, [ figure, typeId, paletteId, petColor, customParts, posture, headOnly, direction ]); useEffect(() => { @@ -78,6 +97,6 @@ export const LayoutPetImageView: FC = props => }, []); const url = `url('${ petUrl }')`; - - return
; + + return ; } diff --git a/src/common/layout/LayoutProgressBar.tsx b/src/common/layout/LayoutProgressBar.tsx new file mode 100644 index 00000000..8f821717 --- /dev/null +++ b/src/common/layout/LayoutProgressBar.tsx @@ -0,0 +1,32 @@ +import { FC, useMemo } from 'react'; +import { Base, Column, ColumnProps, Flex } from '..'; + +interface LayoutProgressBarProps extends ColumnProps +{ + text?: string; + progress: number; + maxProgress?: number; +} + +export const LayoutProgressBar: FC = props => +{ + const { text = '', progress = 0, maxProgress = 100, position = 'relative', justifyContent = 'center', classNames = [], children = null, ...rest } = props; + + const getClassNames = useMemo(() => + { + const newClassNames: string[] = [ 'nitro-progress-bar', 'text-white' ]; + + if(classNames.length) newClassNames.push(...classNames); + + return newClassNames; + }, [ classNames ]); + + return ( + + { text && (text.length > 0) && + { text } } + + { children } + + ); +} diff --git a/src/common/layout/LayoutRoomPreviewerView.tsx b/src/common/layout/LayoutRoomPreviewerView.tsx index ff2caeb6..a45ca522 100644 --- a/src/common/layout/LayoutRoomPreviewerView.tsx +++ b/src/common/layout/LayoutRoomPreviewerView.tsx @@ -1,16 +1,17 @@ import { ColorConverter, IRoomRenderingCanvas, RoomPreviewer, TextureUtils } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, useCallback, useEffect, useRef, useState } from 'react'; +import { FC, MouseEvent, ReactNode, useCallback, useEffect, useRef, useState } from 'react'; import { GetNitroInstance } from '../../api'; export interface LayoutRoomPreviewerViewProps { roomPreviewer: RoomPreviewer; height?: number; + children?: ReactNode; } export const LayoutRoomPreviewerView: FC = props => { - const { roomPreviewer = null, height = 0 } = props; + const { roomPreviewer = null, height = 0, children = null } = props; const [ renderingCanvas, setRenderingCanvas ] = useState(null); const elementRef = useRef(); @@ -74,15 +75,15 @@ export const LayoutRoomPreviewerView: FC = props = GetNitroInstance().ticker.add(update); const resizeObserver = new ResizeObserver(() => - { - if(!roomPreviewer || !elementRef.current) return; + { + if(!roomPreviewer || !elementRef.current) return; - const width = elementRef.current.parentElement.offsetWidth; + const width = elementRef.current.parentElement.offsetWidth; - roomPreviewer.modifyRoomCanvas(width, height); + roomPreviewer.modifyRoomCanvas(width, height); - update(-1); - }); + update(-1); + }); resizeObserver.observe(elementRef.current); @@ -98,7 +99,7 @@ export const LayoutRoomPreviewerView: FC = props = return (
- { props.children } + { children }
); } diff --git a/src/common/layout/UserProfileIconView.tsx b/src/common/layout/UserProfileIconView.tsx index 769cf625..d31fa66b 100644 --- a/src/common/layout/UserProfileIconView.tsx +++ b/src/common/layout/UserProfileIconView.tsx @@ -10,7 +10,7 @@ export interface UserProfileIconViewProps extends BaseProps export const UserProfileIconView: FC = props => { - const { userId = 0, userName = null, classNames = [], pointer = true, children = null, ...rest } = props; + const { userId = 0, userName = null, classNames = [], pointer = true, children = null, ...rest } = props; const getClassNames = useMemo(() => { diff --git a/src/common/layout/index.ts b/src/common/layout/index.ts index 5fcdf07b..a7bdd15c 100644 --- a/src/common/layout/index.ts +++ b/src/common/layout/index.ts @@ -1,6 +1,8 @@ export * from './LayoutAvatarImageView'; +export * from './LayoutBackgroundImage'; export * from './LayoutBadgeImageView'; export * from './LayoutCurrencyIcon'; +export * from './LayoutFurniIconImageView'; export * from './LayoutFurniImageView'; export * from './LayoutGiftTagView'; export * from './LayoutGridItem'; @@ -11,6 +13,7 @@ export * from './LayoutMiniCameraView'; export * from './LayoutNotificationAlertView'; export * from './LayoutNotificationBubbleView'; export * from './LayoutPetImageView'; +export * from './LayoutProgressBar'; export * from './LayoutRarityLevelView'; export * from './LayoutRoomPreviewerView'; export * from './LayoutRoomThumbnailView'; diff --git a/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx b/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx index f4296538..c83e2307 100644 --- a/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx +++ b/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx @@ -29,11 +29,11 @@ export const LayoutLimitedEditionCompletePlateView: FC { LocalizeText('unique.items.left') } - +
{ LocalizeText('unique.items.number.sold') } - +
diff --git a/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx b/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx index 92e939d2..fe34ba41 100644 --- a/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx +++ b/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx @@ -8,15 +8,11 @@ interface LayoutLimitedEditionStyledNumberViewProps export const LayoutLimitedEditionStyledNumberView: FC = props => { const { value = 0 } = props; - const numbers = value.toString().split(''); return ( <> - { numbers.map((number, index) => - { - return ; - })} + { numbers.map((number, index) => ) } ); } diff --git a/src/common/transitions/TransitionAnimation.tsx b/src/common/transitions/TransitionAnimation.tsx index cc3c3d8d..6eefd2df 100644 --- a/src/common/transitions/TransitionAnimation.tsx +++ b/src/common/transitions/TransitionAnimation.tsx @@ -1,4 +1,4 @@ -import { FC, useEffect, useState } from 'react'; +import { FC, ReactNode, useEffect, useState } from 'react'; import { Transition } from 'react-transition-group'; import { getTransitionAnimationStyle } from './TransitionAnimationStyles'; @@ -8,6 +8,7 @@ interface TransitionAnimationProps inProp: boolean; timeout?: number; className?: string; + children?: ReactNode; } export const TransitionAnimation: FC = props => @@ -45,7 +46,7 @@ export const TransitionAnimation: FC = props =>
{ isChildrenVisible && children }
- )} + ) } ); } diff --git a/src/components/achievements/AchievementsView.tsx b/src/components/achievements/AchievementsView.tsx index 08521fb5..b4979006 100644 --- a/src/components/achievements/AchievementsView.tsx +++ b/src/components/achievements/AchievementsView.tsx @@ -1,239 +1,78 @@ -import { AchievementData, AchievementEvent, AchievementsEvent, AchievementsScoreEvent, RequestAchievementsMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { GetConfiguration, LocalizeText, SendMessageComposer } from '../../api'; -import { Base, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardSubHeaderView, NitroCardView, Text } from '../../common'; -import { AchievementsUIEvent, AchievementsUIUnseenCountEvent } from '../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook, UseUiEvent } from '../../hooks'; -import { AchievementCategory } from './common/AchievementCategory'; -import { AchievementUtilities } from './common/AchievementUtilities'; +import { ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useMemo, useState } from 'react'; +import { AchievementUtilities, AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker } from '../../api'; +import { Base, Column, LayoutImage, LayoutProgressBar, NitroCardContentView, NitroCardHeaderView, NitroCardSubHeaderView, NitroCardView, Text } from '../../common'; +import { useAchievements } from '../../hooks'; +import { AchievementCategoryView } from './views/AchievementCategoryView'; import { AchievementsCategoryListView } from './views/category-list/AchievementsCategoryListView'; -import { AchievementCategoryView } from './views/category/AchievementCategoryView'; export const AchievementsView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); - const [ isInitalized, setIsInitalized ] = useState(false); - const [ achievementCategories, setAchievementCategories ] = useState([]); - const [ selectedCategoryCode, setSelectedCategoryCode ] = useState(null); - const [ achievementScore, setAchievementScore ] = useState(0); + const { achievementCategories = [], selectedCategoryCode = null, setSelectedCategoryCode = null, selectedAchievementId = -1, setSelectedAchievementId = null, achievementScore = 0, getProgress = 0, getMaxProgress = 0, setAchievementSeen = null } = useAchievements(); - const onAchievementsUIEvent = useCallback((event: AchievementsUIEvent) => + const selectedCategory = useMemo(() => { - switch(event.type) - { - case AchievementsUIEvent.SHOW_ACHIEVEMENTS: - setIsVisible(true); - return; - case AchievementsUIEvent.HIDE_ACHIEVEMENTS: - setIsVisible(false); - return; - case AchievementsUIEvent.TOGGLE_ACHIEVEMENTS: - setIsVisible(value => !value); - return; - } - }, []); + if(selectedCategoryCode === null) return null; - UseUiEvent(AchievementsUIEvent.SHOW_ACHIEVEMENTS, onAchievementsUIEvent); - UseUiEvent(AchievementsUIEvent.HIDE_ACHIEVEMENTS, onAchievementsUIEvent); - UseUiEvent(AchievementsUIEvent.TOGGLE_ACHIEVEMENTS, onAchievementsUIEvent); - - const onAchievementEvent = useCallback((event: AchievementEvent) => - { - const parser = event.getParser(); - const achievement = parser.achievement; - const newCategories = [ ...achievementCategories ]; - const categoryName = achievement.category; - const categoryIndex = newCategories.findIndex(existing => (existing.code === categoryName)); - - if(categoryIndex === -1) - { - const category = new AchievementCategory(categoryName); - - category.achievements.push(achievement); - - newCategories.push(category); - } - else - { - const category = newCategories[categoryIndex]; - const newAchievements = [ ...category.achievements ]; - const achievementIndex = newAchievements.findIndex(existing => (existing.achievementId === achievement.achievementId)); - let previousAchievement: AchievementData = null; - - if(achievementIndex === -1) - { - newAchievements.push(achievement); - } - else - { - previousAchievement = newAchievements[achievementIndex]; - - newAchievements[achievementIndex] = achievement; - } - - if(!AchievementUtilities.isIgnoredAchievement(achievement)) - { - achievement.unseen++; - - if(previousAchievement) achievement.unseen += previousAchievement.unseen; - } - - category.achievements = newAchievements; - } - - setAchievementCategories(newCategories); - }, [ achievementCategories ]); - - UseMessageEventHook(AchievementEvent, onAchievementEvent); - - const onAchievementsEvent = useCallback((event: AchievementsEvent) => - { - const parser = event.getParser(); - - const categories: AchievementCategory[] = []; - - for(const achievement of parser.achievements) - { - const categoryName = achievement.category; - let existing = categories.find(category => (category.code === categoryName)); - - if(!existing) - { - existing = new AchievementCategory(categoryName); - - categories.push(existing); - } - - existing.achievements.push(achievement); - } - - BatchUpdates(() => - { - setAchievementCategories(categories); - setIsInitalized(true); - }); - }, []); - - UseMessageEventHook(AchievementsEvent, onAchievementsEvent); - - const onAchievementsScoreEvent = useCallback((event: AchievementsScoreEvent) => - { - const parser = event.getParser(); - - setAchievementScore(parser.score); - }, []); - - UseMessageEventHook(AchievementsScoreEvent, onAchievementsScoreEvent); - - const getTotalUnseen = useMemo(() => - { - let unseen = 0; - - for(const category of achievementCategories) - { - for(const achievement of category.achievements) unseen += achievement.unseen; - } - - return unseen; - }, [ achievementCategories ]); - - const getProgress = useMemo(() => - { - let progress = 0; - - for(const category of achievementCategories) progress += category.getProgress(); - - return progress; - }, [ achievementCategories ]); - - const getMaxProgress = useMemo(() => - { - let progress = 0; - - for(const category of achievementCategories) progress += category.getMaxProgress(); - - return progress; - }, [ achievementCategories ]); - - const scaledProgressPercent = useMemo(() => - { - return ~~((((getProgress - 0) * (100 - 0)) / (getMaxProgress - 0)) + 0); - }, [ getProgress, getMaxProgress ]); - - const getSelectedCategory = useMemo(() => - { - if(!achievementCategories || !achievementCategories.length) return null; - - return achievementCategories.find(existing => (existing.code === selectedCategoryCode)); + return achievementCategories.find(category => (category.code === selectedCategoryCode)); }, [ achievementCategories, selectedCategoryCode ]); - const getCategoryIcon = useMemo(() => + useEffect(() => { - if(!getSelectedCategory) return null; - - const imageUrl = GetConfiguration('achievements.images.url'); - - return imageUrl.replace('%image%', `achicon_${ getSelectedCategory.code }`); - }, [ getSelectedCategory ]); - - const setAchievementSeen = useCallback((code: string, achievementId: number) => - { - const newCategories = [ ...achievementCategories ]; - - for(const category of newCategories) - { - if(category.code !== code) continue; - - for(const achievement of category.achievements) + const linkTracker: ILinkEventTracker = { + linkReceived: (url: string) => { - if(achievement.achievementId !== achievementId) continue; + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'show': + setIsVisible(true); + return; + case 'hide': + setIsVisible(false); + return; + case 'toggle': + setIsVisible(prevValue => !prevValue); + return; + } + }, + eventUrlPrefix: 'achievements/' + }; - achievement.unseen = 0; - } - } + AddEventLinkTracker(linkTracker); - setAchievementCategories(newCategories); - }, [ achievementCategories ]); + return () => RemoveLinkEventTracker(linkTracker); + }, []); - useEffect(() => - { - if(!isVisible || isInitalized) return; - - SendMessageComposer(new RequestAchievementsMessageComposer()); - }, [ isVisible, isInitalized ]); - - useEffect(() => - { - DispatchUiEvent(new AchievementsUIUnseenCountEvent(getTotalUnseen)); - }, [ getTotalUnseen ]); - - if(!isVisible || !isInitalized) return null; + if(!isVisible) return null; return ( setIsVisible(false) } /> - { getSelectedCategory && + { selectedCategory && setSelectedCategoryCode(null) } className="nitro-achievements-back-arrow" /> - { LocalizeText(`quests.${ getSelectedCategory.code }.name`) } - { LocalizeText('achievements.details.categoryprogress', [ 'progress', 'limit' ], [ getSelectedCategory.getProgress().toString(), getSelectedCategory.getMaxProgress().toString() ]) } + { LocalizeText(`quests.${ selectedCategory.code }.name`) } + { LocalizeText('achievements.details.categoryprogress', [ 'progress', 'limit' ], [ selectedCategory.getProgress().toString(), selectedCategory.getMaxProgress().toString() ]) } + } - - { !getSelectedCategory && + + { !selectedCategory && <> - - - { LocalizeText('achievements.categories.totalprogress', [ 'progress', 'limit' ], [ getProgress.toString(), getMaxProgress.toString() ]) } - - - { LocalizeText('achievements.categories.score', [ 'score' ], [ achievementScore.toString() ]) } + + { LocalizeText('achievements.categories.score', [ 'score' ], [ achievementScore.toString() ]) } + } - { getSelectedCategory && - } + { selectedCategory && + } ); diff --git a/src/components/achievements/common/AchievementUtilities.ts b/src/components/achievements/common/AchievementUtilities.ts deleted file mode 100644 index f6c18ac3..00000000 --- a/src/components/achievements/common/AchievementUtilities.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; -import { GetConfiguration, GetLocalization } from '../../../api'; - -export class AchievementUtilities -{ - public static hasStarted(achievement: AchievementData): boolean - { - if(!achievement) return false; - - if(achievement.finalLevel || ((achievement.level - 1) > 0)) return true; - - return false; - } - - public static getBadgeCode(achievement: AchievementData): string - { - if(!achievement) return null; - - let badgeId = achievement.badgeId; - - if(!achievement.finalLevel) badgeId = GetLocalization().getPreviousLevelBadgeId(badgeId); - - return badgeId; - } - - public static isIgnoredAchievement(achievement: AchievementData): boolean - { - if(!achievement) return false; - - const ignored = GetConfiguration('achievements.unseen.ignored'); - const value = achievement.badgeId.replace(/[0-9]/g, ''); - const index = ignored.indexOf(value); - - if(index >= 0) return true; - - return false; - } -} diff --git a/src/components/achievements/common/GetAchievementLevel.ts b/src/components/achievements/common/GetAchievementLevel.ts deleted file mode 100644 index c62bf7aa..00000000 --- a/src/components/achievements/common/GetAchievementLevel.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; - -export const GetAchievementLevel = (achievement: AchievementData) => -{ - if(achievement.finalLevel) return achievement.level; - - return (achievement.level - 1); -} diff --git a/src/components/achievements/common/GetScaledProgressPercent.ts b/src/components/achievements/common/GetScaledProgressPercent.ts deleted file mode 100644 index 8708a709..00000000 --- a/src/components/achievements/common/GetScaledProgressPercent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; - -export const GetScaledProgressPercent = (achievement: AchievementData) => -{ - if(!achievement) return 0; - - return ~~(((((achievement.currentPoints + achievement.scoreAtStartOfLevel) - 0) * (100 - 0)) / ((achievement.scoreLimit + achievement.scoreAtStartOfLevel) - 0)) + 0); -} diff --git a/src/components/achievements/views/AchievementBadgeView.tsx b/src/components/achievements/views/AchievementBadgeView.tsx new file mode 100644 index 00000000..5b0d4f93 --- /dev/null +++ b/src/components/achievements/views/AchievementBadgeView.tsx @@ -0,0 +1,19 @@ +import { AchievementData } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; +import { AchievementUtilities } from '../../../api'; +import { BaseProps, LayoutBadgeImageView } from '../../../common'; + +interface AchievementBadgeViewProps extends BaseProps +{ + achievement: AchievementData; + scale?: number; +} + +export const AchievementBadgeView: FC = props => +{ + const { achievement = null, scale = 1, ...rest } = props; + + if(!achievement) return null; + + return ; +} diff --git a/src/components/achievements/views/AchievementCategoryView.tsx b/src/components/achievements/views/AchievementCategoryView.tsx new file mode 100644 index 00000000..d5834c7c --- /dev/null +++ b/src/components/achievements/views/AchievementCategoryView.tsx @@ -0,0 +1,50 @@ +import { Dispatch, FC, SetStateAction, useEffect, useMemo } from 'react'; +import { AchievementCategory } from '../../../api'; +import { Column } from '../../../common'; +import { AchievementListView } from './achievement-list/AchievementListView'; +import { AchievementDetailsView } from './AchievementDetailsView'; + +interface AchievementCategoryViewProps +{ + category: AchievementCategory; + selectedAchievementId: number; + setSelectedAchievementId: Dispatch>; + setAchievementSeen: (code: string, achievementId: number) => void; +} + +export const AchievementCategoryView: FC = props => +{ + const { category = null, selectedAchievementId = -1, setSelectedAchievementId = null, setAchievementSeen = null } = props; + + const selectedAchievement = useMemo(() => + { + if(selectedAchievementId === -1) return null; + + return category.achievements.find(achievement => (achievement.achievementId === selectedAchievementId)); + }, [ category, selectedAchievementId ]); + + useEffect(() => + { + if(!selectedAchievement) + { + if(category.achievements.length) setSelectedAchievementId(category.achievements[0].achievementId); + } + }, [ selectedAchievement, category, setSelectedAchievementId ]); + + useEffect(() => + { + if(!selectedAchievement) return; + + setAchievementSeen(category.code, selectedAchievement.achievementId); + }, [ selectedAchievement, category, setAchievementSeen ]); + + if(!category) return null; + + return ( + + + { !!selectedAchievement && + } + + ); +} diff --git a/src/components/achievements/views/achievement-details/AchievementDetailsView.tsx b/src/components/achievements/views/AchievementDetailsView.tsx similarity index 52% rename from src/components/achievements/views/achievement-details/AchievementDetailsView.tsx rename to src/components/achievements/views/AchievementDetailsView.tsx index 6687214d..6e978250 100644 --- a/src/components/achievements/views/achievement-details/AchievementDetailsView.tsx +++ b/src/components/achievements/views/AchievementDetailsView.tsx @@ -1,41 +1,35 @@ import { AchievementData } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../../api'; -import { Base, Column, Flex, LayoutCurrencyIcon, Text } from '../../../../common'; -import { AchievementUtilities } from '../../common/AchievementUtilities'; -import { GetAchievementLevel } from '../../common/GetAchievementLevel'; -import { GetScaledProgressPercent } from '../../common/GetScaledProgressPercent'; -import { AchievementBadgeView } from '../achievement-badge/AchievementBadgeView'; +import { FC, PropsWithChildren } from 'react'; +import { AchievementUtilities, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../api'; +import { Column, Flex, LayoutCurrencyIcon, LayoutProgressBar, Text } from '../../../common'; +import { AchievementBadgeView } from './AchievementBadgeView'; -export interface AchievementDetailsViewProps +interface AchievementDetailsViewProps { achievement: AchievementData; } -export const AchievementDetailsView: FC = props => +export const AchievementDetailsView: FC> = props => { - const { achievement = null } = props; + const { achievement = null, children = null, ...rest } = props; if(!achievement) return null; - const achievementLevel = GetAchievementLevel(achievement); - const scaledProgressPercent = GetScaledProgressPercent(achievement); - return ( - - + + - { LocalizeText('achievements.details.level', [ 'level', 'limit' ], [ achievementLevel.toString(), achievement.levelCount.toString() ]) } + { LocalizeText('achievements.details.level', [ 'level', 'limit' ], [ AchievementUtilities.getAchievementLevel(achievement).toString(), achievement.levelCount.toString() ]) } - { LocalizeBadgeName(AchievementUtilities.getBadgeCode(achievement)) } + { LocalizeBadgeName(AchievementUtilities.getAchievementBadgeCode(achievement)) } - - { LocalizeBadgeDescription(AchievementUtilities.getBadgeCode(achievement)) } + + { LocalizeBadgeDescription(AchievementUtilities.getAchievementBadgeCode(achievement)) } { ((achievement.levelRewardPoints > 0) || (achievement.scoreLimit > 0)) && @@ -51,12 +45,10 @@ export const AchievementDetailsView: FC = props => } { (achievement.scoreLimit > 0) && - - { LocalizeText('achievements.details.progress', [ 'progress', 'limit' ], [ (achievement.currentPoints + achievement.scoreAtStartOfLevel).toString(), (achievement.scoreLimit + achievement.scoreAtStartOfLevel).toString() ]) } - - } + } } + { children } ) } diff --git a/src/components/achievements/views/achievement-badge/AchievementBadgeView.tsx b/src/components/achievements/views/achievement-badge/AchievementBadgeView.tsx deleted file mode 100644 index 08de4de8..00000000 --- a/src/components/achievements/views/achievement-badge/AchievementBadgeView.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { BaseProps, LayoutBadgeImageView } from '../../../../common'; -import { AchievementUtilities } from '../../common/AchievementUtilities'; - -export interface AchievementBadgeViewProps extends BaseProps -{ - achievement: AchievementData; - scale?: number; -} - -export const AchievementBadgeView: FC = props => -{ - const { achievement = null, scale = 1, ...rest } = props; - - if(!achievement) return null; - - return ( - - ); -} diff --git a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx b/src/components/achievements/views/achievement-list/AchievementListItemView.tsx index 74975759..bf686088 100644 --- a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx +++ b/src/components/achievements/views/achievement-list/AchievementListItemView.tsx @@ -1,21 +1,23 @@ import { AchievementData } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { LayoutGridItem, LayoutGridItemProps } from '../../../../common/layout/LayoutGridItem'; -import { AchievementBadgeView } from '../achievement-badge/AchievementBadgeView'; +import { Dispatch, FC, PropsWithChildren, SetStateAction } from 'react'; +import { LayoutGridItem } from '../../../../common'; +import { AchievementBadgeView } from '../AchievementBadgeView'; -export interface AchievementListItemViewProps extends LayoutGridItemProps +interface AchievementListItemViewProps { achievement: AchievementData; + selectedAchievementId: number; + setSelectedAchievementId: Dispatch>; } -export const AchievementListItemView: FC = props => +export const AchievementListItemView: FC> = props => { - const { achievement = null, children = null, ...rest } = props; + const { achievement = null, selectedAchievementId = -1, setSelectedAchievementId = null, children = null, ...rest } = props; if(!achievement) return null; return ( - + 0) } onClick={ event => setSelectedAchievementId(achievement.achievementId) } { ...rest }> { children } diff --git a/src/components/achievements/views/achievement-list/AchievementListView.tsx b/src/components/achievements/views/achievement-list/AchievementListView.tsx index d0441aad..341af280 100644 --- a/src/components/achievements/views/achievement-list/AchievementListView.tsx +++ b/src/components/achievements/views/achievement-list/AchievementListView.tsx @@ -1,25 +1,22 @@ import { AchievementData } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, SetStateAction } from 'react'; -import { AutoGrid } from '../../../../common/AutoGrid'; +import { Dispatch, FC, PropsWithChildren, SetStateAction } from 'react'; +import { AutoGrid } from '../../../../common'; import { AchievementListItemView } from './AchievementListItemView'; -export interface AchievementListViewProps +interface AchievementListViewProps { achievements: AchievementData[]; selectedAchievementId: number; setSelectedAchievementId: Dispatch>; } -export const AchievementListView: FC = props => +export const AchievementListView: FC> = props => { - const { achievements = null, selectedAchievementId = 0, setSelectedAchievementId = null, children = null } = props; + const { achievements = null, selectedAchievementId = -1, setSelectedAchievementId = null, children = null, ...rest } = props; return ( - - { achievements && (achievements.length > 0) && achievements.map((achievement, index) => - { - return setSelectedAchievementId(achievement.achievementId) } />; - }) } + + { achievements && (achievements.length > 0) && achievements.map((achievement, index) => ) } { children } ); diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx index f9ccfcef..2af18b96 100644 --- a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx +++ b/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx @@ -1,44 +1,32 @@ -import { FC, useCallback, useMemo } from 'react'; -import { GetConfiguration, LocalizeText } from '../../../../api'; -import { LayoutGridItem, LayoutGridItemProps } from '../../../../common/layout/LayoutGridItem'; -import { LayoutImage } from '../../../../common/layout/LayoutImage'; -import { Text } from '../../../../common/Text'; -import { AchievementCategory } from '../../common/AchievementCategory'; +import { Dispatch, FC, PropsWithChildren, SetStateAction } from 'react'; +import { AchievementUtilities, IAchievementCategory, LocalizeText } from '../../../../api'; +import { LayoutBackgroundImage, LayoutGridItem, Text } from '../../../../common'; -export interface AchievementCategoryListItemViewProps extends LayoutGridItemProps +interface AchievementCategoryListItemViewProps { - category: AchievementCategory; + category: IAchievementCategory; + selectedCategoryCode: string; + setSelectedCategoryCode: Dispatch>; } -export const AchievementsCategoryListItemView: FC = props => +export const AchievementsCategoryListItemView: FC> = props => { - const { category = null, ...rest } = props; + const { category = null, selectedCategoryCode = null, setSelectedCategoryCode = null, children = null, ...rest } = props; - const progress = category.getProgress(); - const maxProgress = category.getMaxProgress(); + if(!category) return null; - const getCategoryImage = useMemo(() => - { - const imageUrl = GetConfiguration('achievements.images.url'); - - return imageUrl.replace('%image%', `achcategory_${ category.code }_${ ((progress > 0) ? 'active' : 'inactive') }`); - }, [ category, progress ]); - - const getTotalUnseen = useCallback(() => - { - let unseen = 0; - - for(const achievement of category.achievements) unseen += achievement.unseen; - - return unseen; - }, [ category ]); + const progress = AchievementUtilities.getAchievementCategoryProgress(category); + const maxProgress = AchievementUtilities.getAchievementCategoryMaxProgress(category); + const getCategoryImage = AchievementUtilities.getAchievementCategoryImageUrl(category, progress); + const getTotalUnseen = AchievementUtilities.getAchievementCategoryTotalUnseen(category); return ( - - { LocalizeText(`quests.${ category.code }.name`) } - + setSelectedCategoryCode(category.code) } { ...rest }> + { LocalizeText(`quests.${ category.code }.name`) } + { progress } / { maxProgress } - + + { children } ); } diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx index bcd7adaf..231cd4f4 100644 --- a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx +++ b/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx @@ -1,22 +1,22 @@ -import { Dispatch, FC, SetStateAction } from 'react'; -import { AutoGrid } from '../../../../common/AutoGrid'; -import { AchievementCategory } from '../../common/AchievementCategory'; +import { Dispatch, FC, PropsWithChildren, SetStateAction } from 'react'; +import { IAchievementCategory } from '../../../../api'; +import { AutoGrid } from '../../../../common'; import { AchievementsCategoryListItemView } from './AchievementsCategoryListItemView'; -export interface AchievementsCategoryListViewProps +interface AchievementsCategoryListViewProps { - categories: AchievementCategory[]; + categories: IAchievementCategory[]; selectedCategoryCode: string; setSelectedCategoryCode: Dispatch>; } -export const AchievementsCategoryListView: FC = props => +export const AchievementsCategoryListView: FC> = props => { - const { categories = null, selectedCategoryCode = null, setSelectedCategoryCode = null, children = null } = props; + const { categories = null, selectedCategoryCode = null, setSelectedCategoryCode = null, children = null, ...rest } = props; return ( - - { categories && (categories.length > 0) && categories.map((category, index) => setSelectedCategoryCode(category.code) } /> ) } + + { categories && (categories.length > 0) && categories.map((category, index) => ) } { children } ); diff --git a/src/components/achievements/views/category/AchievementCategoryView.tsx b/src/components/achievements/views/category/AchievementCategoryView.tsx deleted file mode 100644 index 5f535d2c..00000000 --- a/src/components/achievements/views/category/AchievementCategoryView.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { FC, useEffect, useMemo, useState } from 'react'; -import { Column } from '../../../../common/Column'; -import { AchievementCategory } from '../../common/AchievementCategory'; -import { AchievementDetailsView } from '../achievement-details/AchievementDetailsView'; -import { AchievementListView } from '../achievement-list/AchievementListView'; - -export class AchievementCategoryViewProps -{ - category: AchievementCategory; - setAchievementSeen: (code: string, achievementId: number) => void; -} - -export const AchievementCategoryView: FC = props => -{ - const { category = null, setAchievementSeen = null } = props; - const [ selectedAchievementId, setSelectedAchievementId ] = useState(0); - - const getSelectedAchievement = useMemo(() => - { - if(!category || !category.achievements.length) return null; - - return category.achievements.find(existing => (existing.achievementId === selectedAchievementId)); - }, [ category, selectedAchievementId ]); - - useEffect(() => - { - let achievementId = 0; - - if(!category || !category.achievements.length) - { - achievementId = 0; - } - else - { - achievementId = category.achievements[0].achievementId; - } - - setSelectedAchievementId(achievementId); - }, [ category ]); - - useEffect(() => - { - if(!getSelectedAchievement || !getSelectedAchievement.unseen) return; - - setAchievementSeen(category.code, getSelectedAchievement.achievementId); - }, [ category, getSelectedAchievement, setAchievementSeen ]); - - if(!category) return null; - - return ( - - - { getSelectedAchievement && - } - - ); -} diff --git a/src/components/avatar-editor/AvatarEditorView.tsx b/src/components/avatar-editor/AvatarEditorView.tsx index 98aa2d81..ad638ab2 100644 --- a/src/components/avatar-editor/AvatarEditorView.tsx +++ b/src/components/avatar-editor/AvatarEditorView.tsx @@ -1,25 +1,12 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { AvatarEditorFigureCategory, FigureSetIdsMessageEvent, GetWardrobeMessageComposer, IAvatarFigureContainer, ILinkEventTracker, UserFigureComposer, UserWardrobePageEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { AddEventLinkTracker, GetAvatarRenderManager, GetClubMemberLevel, GetConfiguration, GetSessionDataManager, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; -import { Button } from '../../common/Button'; -import { ButtonGroup } from '../../common/ButtonGroup'; -import { Column } from '../../common/Column'; -import { Grid } from '../../common/Grid'; -import { UseMessageEventHook } from '../../hooks'; -import { AvatarEditorAction } from './common/AvatarEditorAction'; -import { AvatarEditorUtilities } from './common/AvatarEditorUtilities'; -import { BodyModel } from './common/BodyModel'; -import { FigureData } from './common/FigureData'; -import { generateRandomFigure } from './common/FigureGenerator'; -import { HeadModel } from './common/HeadModel'; -import { IAvatarEditorCategoryModel } from './common/IAvatarEditorCategoryModel'; -import { LegModel } from './common/LegModel'; -import { TorsoModel } from './common/TorsoModel'; -import { AvatarEditorFigurePreviewView } from './views/figure-preview/AvatarEditorFigurePreviewView'; -import { AvatarEditorModelView } from './views/model/AvatarEditorModelView'; -import { AvatarEditorWardrobeView } from './views/wardrobe/AvatarEditorWardrobeView'; +import { AddEventLinkTracker, AvatarEditorAction, AvatarEditorUtilities, BodyModel, FigureData, generateRandomFigure, GetAvatarRenderManager, GetClubMemberLevel, GetConfiguration, GetSessionDataManager, HeadModel, IAvatarEditorCategoryModel, LegModel, LocalizeText, RemoveLinkEventTracker, SendMessageComposer, TorsoModel } from '../../api'; +import { Button, ButtonGroup, Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; +import { useMessageEvent } from '../../hooks'; +import { AvatarEditorFigurePreviewView } from './views/AvatarEditorFigurePreviewView'; +import { AvatarEditorModelView } from './views/AvatarEditorModelView'; +import { AvatarEditorWardrobeView } from './views/AvatarEditorWardrobeView'; const DEFAULT_MALE_FIGURE: string = 'hr-100.hd-180-7.ch-215-66.lg-270-79.sh-305-62.ha-1002-70.wa-2007'; const DEFAULT_FEMALE_FIGURE: string = 'hr-515-33.hd-600-1.ch-635-70.lg-716-66-62.sh-735-68'; @@ -42,17 +29,15 @@ export const AvatarEditorView: FC<{}> = props => const maxWardrobeSlots = useMemo(() => GetConfiguration('avatar.wardrobe.max.slots', 10), []); - const onFigureSetIdsMessageEvent = useCallback((event: FigureSetIdsMessageEvent) => + useMessageEvent(FigureSetIdsMessageEvent, event => { const parser = event.getParser(); setFigureSetIds(parser.figureSetIds); setBoundFurnitureNames(parser.boundsFurnitureNames); - }, []); + }); - UseMessageEventHook(FigureSetIdsMessageEvent, onFigureSetIdsMessageEvent); - - const onUserWardrobePageEvent = useCallback((event: UserWardrobePageEvent) => + useMessageEvent(UserWardrobePageEvent, event => { const parser = event.getParser(); const savedFigures: [ IAvatarFigureContainer, string ][] = []; @@ -73,10 +58,8 @@ export const AvatarEditorView: FC<{}> = props => savedFigures[(index - 1)] = [ container, gender ]; } - setSavedFigures(savedFigures) - }, [ maxWardrobeSlots ]); - - UseMessageEventHook(UserWardrobePageEvent, onUserWardrobePageEvent); + setSavedFigures(savedFigures); + }); const selectCategory = useCallback((name: string) => { @@ -165,37 +148,35 @@ export const AvatarEditorView: FC<{}> = props => setFigureData(figures.get(gender)); }, [ figures ]); - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setIsVisible(true); - return; - case 'hide': - setIsVisible(false); - return; - case 'toggle': - setIsVisible(prevValue => !prevValue); - return; - } - }, []); - useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'show': + setIsVisible(true); + return; + case 'hide': + setIsVisible(false); + return; + case 'toggle': + setIsVisible(prevValue => !prevValue); + return; + } + }, eventUrlPrefix: 'avatar-editor/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); + }, []); useEffect(() => { @@ -288,15 +269,15 @@ export const AvatarEditorView: FC<{}> = props => setIsVisible(false) } /> { categories && (categories.size > 0) && Array.from(categories.keys()).map(category => - { - const isActive = (activeCategory && (activeCategory.name === category)); + { + const isActive = (activeCategory && (activeCategory.name === category)); - return ( - selectCategory(category) }> - { LocalizeText(`avatareditor.category.${ category }`) } - - ); - })} + return ( + selectCategory(category) }> + { LocalizeText(`avatareditor.category.${ category }`) } + + ); + }) } setIsWardrobeVisible(true) }> { LocalizeText('avatareditor.category.wardrobe') } diff --git a/src/components/avatar-editor/views/figure-preview/AvatarEditorFigurePreviewView.tsx b/src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx similarity index 91% rename from src/components/avatar-editor/views/figure-preview/AvatarEditorFigurePreviewView.tsx rename to src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx index abe2866f..0c6afbf8 100644 --- a/src/components/avatar-editor/views/figure-preview/AvatarEditorFigurePreviewView.tsx +++ b/src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx @@ -1,8 +1,8 @@ import { AvatarDirectionAngle } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { Base, Column, LayoutAvatarImageView } from '../../../../common'; -import { FigureData } from '../../common/FigureData'; -import { AvatarEditorIcon } from '../AvatarEditorIcon'; +import { FigureData } from '../../../api'; +import { Base, Column, LayoutAvatarImageView } from '../../../common'; +import { AvatarEditorIcon } from './AvatarEditorIcon'; export interface AvatarEditorFigurePreviewViewProps { diff --git a/src/components/avatar-editor/views/AvatarEditorIcon.tsx b/src/components/avatar-editor/views/AvatarEditorIcon.tsx index b74ef3c9..a05baa1d 100644 --- a/src/components/avatar-editor/views/AvatarEditorIcon.tsx +++ b/src/components/avatar-editor/views/AvatarEditorIcon.tsx @@ -1,5 +1,5 @@ import { FC, useMemo } from 'react'; -import { Base, BaseProps } from '../../../common/Base'; +import { Base, BaseProps } from '../../../common'; type AvatarIconType = 'male' | 'female' | 'clear' | 'sellable' | string; diff --git a/src/components/avatar-editor/views/model/AvatarEditorModelView.tsx b/src/components/avatar-editor/views/AvatarEditorModelView.tsx similarity index 69% rename from src/components/avatar-editor/views/model/AvatarEditorModelView.tsx rename to src/components/avatar-editor/views/AvatarEditorModelView.tsx index c1d11164..6eb8fe3e 100644 --- a/src/components/avatar-editor/views/model/AvatarEditorModelView.tsx +++ b/src/components/avatar-editor/views/AvatarEditorModelView.tsx @@ -1,13 +1,9 @@ import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Grid } from '../../../../common/Grid'; -import { CategoryData } from '../../common/CategoryData'; -import { FigureData } from '../../common/FigureData'; -import { IAvatarEditorCategoryModel } from '../../common/IAvatarEditorCategoryModel'; -import { AvatarEditorIcon } from '../AvatarEditorIcon'; -import { AvatarEditorFigureSetView } from '../figure-set/AvatarEditorFigureSetView'; -import { AvatarEditorPaletteSetView } from '../palette-set/AvatarEditorPaletteSetView'; +import { CategoryData, FigureData, IAvatarEditorCategoryModel } from '../../../api'; +import { Column, Flex, Grid } from '../../../common'; +import { AvatarEditorIcon } from './AvatarEditorIcon'; +import { AvatarEditorFigureSetView } from './figure-set/AvatarEditorFigureSetView'; +import { AvatarEditorPaletteSetView } from './palette-set/AvatarEditorPaletteSetView'; export interface AvatarEditorModelViewProps { model: IAvatarEditorCategoryModel; @@ -67,16 +63,16 @@ export const AvatarEditorModelView: FC = props => } - { !model.canSetGender && model.categories && (model.categories.size > 0) && Array.from(model.categories.keys()).map(name => - { - const category = model.categories.get(name); + { !model.canSetGender && model.categories && (model.categories.size > 0) && Array.from(model.categories.keys()).map(name => + { + const category = model.categories.get(name); - return ( - selectCategory(name) }> - - - ); - })} + return ( + selectCategory(name) }> + + + ); + }) } diff --git a/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx b/src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx similarity index 56% rename from src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx rename to src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx index 78cc3506..9811ab88 100644 --- a/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx +++ b/src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx @@ -1,8 +1,7 @@ import { IAvatarFigureContainer, SaveWardrobeOutfitMessageComposer } from '@nitrots/nitro-renderer'; import { Dispatch, FC, SetStateAction, useCallback, useMemo } from 'react'; -import { GetAvatarRenderManager, GetClubMemberLevel, SendMessageComposer } from '../../../../api'; -import { AutoGrid, Base, Button, Flex, LayoutAvatarImageView, LayoutCurrencyIcon, LayoutGridItem } from '../../../../common'; -import { FigureData } from '../../common/FigureData'; +import { FigureData, GetAvatarRenderManager, GetClubMemberLevel, GetConfiguration, LocalizeText, SendMessageComposer } from '../../../api'; +import { AutoGrid, Base, Button, Flex, LayoutAvatarImageView, LayoutCurrencyIcon, LayoutGridItem } from '../../../common'; export interface AvatarEditorWardrobeViewProps { @@ -16,6 +15,8 @@ export const AvatarEditorWardrobeView: FC = props { const { figureData = null, savedFigures = [], setSavedFigures = null, loadAvatarInEditor = null } = props; + const hcDisabled = GetConfiguration('hc.disabled', false); + const wearFigureAtIndex = useCallback((index: number) => { if((index >= savedFigures.length) || (index < 0)) return; @@ -47,28 +48,28 @@ export const AvatarEditorWardrobeView: FC = props const items: JSX.Element[] = []; savedFigures.forEach(([ figureContainer, gender ], index) => - { - let clubLevel = 0; + { + let clubLevel = 0; - if(figureContainer) clubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender); + if(figureContainer) clubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender); - items.push( - + items.push( + + { figureContainer && + } + + { !hcDisabled && (clubLevel > 0) && } + + { figureContainer && - } - - { (clubLevel > 0) && } - - - { figureContainer && - } - - - ); - }); + } + + + ); + }); return items; - }, [ savedFigures, saveFigureAtWardrobeIndex, wearFigureAtIndex ]); + }, [ savedFigures, hcDisabled, saveFigureAtWardrobeIndex, wearFigureAtIndex ]); return ( diff --git a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx index 12d9c153..8df5b95d 100644 --- a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx +++ b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx @@ -1,6 +1,6 @@ import { FC, useCallback, useEffect, useState } from 'react'; +import { AvatarEditorGridPartItem, GetConfiguration } from '../../../../api'; import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common'; -import { AvatarEditorGridPartItem } from '../../common/AvatarEditorGridPartItem'; import { AvatarEditorIcon } from '../AvatarEditorIcon'; export interface AvatarEditorFigureSetItemViewProps extends LayoutGridItemProps @@ -13,6 +13,8 @@ export const AvatarEditorFigureSetItemView: FC('hc.disabled', false); + const rerender = useCallback(() => { setUpdateId(prevValue => (prevValue + 1)); @@ -30,7 +32,7 @@ export const AvatarEditorFigureSetItemView: FC - { partItem.isHC && } + { !hcDisabled && partItem.isHC && } { partItem.isClear && } { partItem.isSellable && } { children } diff --git a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetView.tsx b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetView.tsx index e99502f1..8a813a03 100644 --- a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetView.tsx +++ b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetView.tsx @@ -1,8 +1,6 @@ import { Dispatch, FC, SetStateAction, useCallback } from 'react'; -import { AutoGrid } from '../../../../common/AutoGrid'; -import { AvatarEditorGridPartItem } from '../../common/AvatarEditorGridPartItem'; -import { CategoryData } from '../../common/CategoryData'; -import { IAvatarEditorCategoryModel } from '../../common/IAvatarEditorCategoryModel'; +import { AvatarEditorGridPartItem, CategoryData, IAvatarEditorCategoryModel } from '../../../../api'; +import { AutoGrid } from '../../../../common'; import { AvatarEditorFigureSetItemView } from './AvatarEditorFigureSetItemView'; export interface AvatarEditorFigureSetViewProps diff --git a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx index 94ebb40c..8138e951 100644 --- a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx +++ b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx @@ -1,6 +1,6 @@ import { FC, useCallback, useEffect, useState } from 'react'; +import { AvatarEditorGridColorItem, GetConfiguration } from '../../../../api'; import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common'; -import { AvatarEditorGridColorItem } from '../../common/AvatarEditorGridColorItem'; export interface AvatarEditorPaletteSetItemProps extends LayoutGridItemProps { @@ -12,6 +12,8 @@ export const AvatarEditorPaletteSetItem: FC = p const { colorItem = null, children = null, ...rest } = props; const [ updateId, setUpdateId ] = useState(-1); + const hcDisabled = GetConfiguration('hc.disabled', false); + const rerender = useCallback(() => { setUpdateId(prevValue => (prevValue + 1)); @@ -26,7 +28,7 @@ export const AvatarEditorPaletteSetItem: FC = p return ( - { colorItem.isHC && } + { !hcDisabled && colorItem.isHC && } { children } ); diff --git a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetView.tsx b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetView.tsx index 6b715127..4ed984be 100644 --- a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetView.tsx +++ b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetView.tsx @@ -1,8 +1,6 @@ import { FC, useCallback } from 'react'; -import { AutoGrid } from '../../../../common/AutoGrid'; -import { AvatarEditorGridColorItem } from '../../common/AvatarEditorGridColorItem'; -import { CategoryData } from '../../common/CategoryData'; -import { IAvatarEditorCategoryModel } from '../../common/IAvatarEditorCategoryModel'; +import { AvatarEditorGridColorItem, CategoryData, IAvatarEditorCategoryModel } from '../../../../api'; +import { AutoGrid } from '../../../../common'; import { AvatarEditorPaletteSetItem } from './AvatarEditorPaletteSetItemView'; export interface AvatarEditorPaletteSetViewProps diff --git a/src/components/camera/CameraWidgetContext.tsx b/src/components/camera/CameraWidgetContext.tsx deleted file mode 100644 index 5f574029..00000000 --- a/src/components/camera/CameraWidgetContext.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { createContext, Dispatch, FC, ProviderProps, SetStateAction, useContext } from 'react'; -import { CameraPicture } from './common/CameraPicture'; - -export interface ICameraWidgetContext -{ - cameraRoll: CameraPicture[], - setCameraRoll: Dispatch>; - selectedPictureIndex: number, - setSelectedPictureIndex: Dispatch>; -} - -const CameraWidgetContext = createContext({ - cameraRoll: null, - setCameraRoll: null, - selectedPictureIndex: null, - setSelectedPictureIndex: null -}); - -export const CameraWidgetContextProvider: FC> = props => -{ - return { props.children } -} - -export const useCameraWidgetContext = () => useContext(CameraWidgetContext); diff --git a/src/components/camera/CameraWidgetView.scss b/src/components/camera/CameraWidgetView.scss index 6ad9b68a..18b18d8a 100644 --- a/src/components/camera/CameraWidgetView.scss +++ b/src/components/camera/CameraWidgetView.scss @@ -7,15 +7,20 @@ border-radius: $border-radius; box-shadow: 0 0 0 1.5px $white; border: 2px solid #921911; - background: repeating-linear-gradient(rgba(245,80,65,1), rgba(245,80,65,1) 50%, rgba(194,48,39,1) 50%, rgba(194,48,39,1) 100%); + background: repeating-linear-gradient( + rgba(245, 80, 65, 1), + rgba(245, 80, 65, 1) 50%, + rgba(194, 48, 39, 1) 50%, + rgba(194, 48, 39, 1) 100% + ); cursor: pointer; line-height: 1; padding: 1px 3px; - + &:hover { filter: brightness(1.2); } - + &:active { filter: brightness(0.8); } @@ -28,42 +33,41 @@ width: 320px; height: 320px; } - + .camera-canvas { position: relative; width: 340px; height: 462px; - background-image: url('../../assets/images/room-widgets/camera-widget/camera-spritesheet.png'); + background-image: url("../../assets/images/room-widgets/camera-widget/camera-spritesheet.png"); background-position: -1px -1px; z-index: 2; - + .camera-button { width: 94px; height: 94px; cursor: pointer; margin-top: 362px; - - background-image: url('../../assets/images/room-widgets/camera-widget/camera-spritesheet.png'); + + background-image: url("../../assets/images/room-widgets/camera-widget/camera-spritesheet.png"); background-position: -343px -321px; - + &:hover { background-position: -535px -321px; } - + &:active { background-position: -439px -321px; } } .camera-view-finder { - background-image: url('../../assets/images/room-widgets/camera-widget/camera-spritesheet.png'); + background-image: url("../../assets/images/room-widgets/camera-widget/camera-spritesheet.png"); background-position: -343px -1px; } .camera-frame { - .camera-frame-preview-actions { - background: rgba(0, 0, 0, .5); + background: rgba(0, 0, 0, 0.5); } } } @@ -80,6 +84,8 @@ width: 56px; height: 56px; border: 1px solid black; + object-fit: contain; + image-rendering: initial; } } } @@ -87,7 +93,7 @@ .nitro-camera-editor { width: $camera-editor-width; height: $camera-editor-height; - + .picture-preview { width: 320px; height: 320px; @@ -99,7 +105,6 @@ } .effect-thumbnail-image { - img { width: 50px; height: 50px; diff --git a/src/components/camera/CameraWidgetView.tsx b/src/components/camera/CameraWidgetView.tsx index aab9d341..db168554 100644 --- a/src/components/camera/CameraWidgetView.tsx +++ b/src/components/camera/CameraWidgetView.tsx @@ -1,11 +1,9 @@ -import { ILinkEventTracker, InitCameraMessageEvent, IRoomCameraWidgetEffect, RequestCameraConfigurationComposer, RoomCameraWidgetManagerEvent, RoomSessionEvent } from '@nitrots/nitro-renderer'; +import { ILinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { AddEventLinkTracker, GetRoomCameraWidgetManager, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; -import { UseCameraEvent, UseMessageEventHook, UseRoomSessionManagerEvent } from '../../hooks'; -import { CameraWidgetContextProvider } from './CameraWidgetContext'; -import { CameraPicture } from './common/CameraPicture'; -import { CameraWidgetCaptureView } from './views/capture/CameraWidgetCaptureView'; -import { CameraWidgetCheckoutView } from './views/checkout/CameraWidgetCheckoutView'; +import { AddEventLinkTracker, RemoveLinkEventTracker } from '../../api'; +import { useCamera, useRoomSessionManagerEvent } from '../../hooks'; +import { CameraWidgetCaptureView } from './views/CameraWidgetCaptureView'; +import { CameraWidgetCheckoutView } from './views/CameraWidgetCheckoutView'; import { CameraWidgetEditorView } from './views/editor/CameraWidgetEditorView'; const MODE_NONE: number = 0; @@ -16,49 +14,10 @@ const MODE_CHECKOUT: number = 3; export const CameraWidgetView: FC<{}> = props => { const [ mode, setMode ] = useState(MODE_NONE); - const [ availableEffects, setAvailableEffects ] = useState([]); - const [ cameraRoll, setCameraRoll ] = useState([]); - const [ selectedPictureIndex, setSelectedPictureIndex ] = useState(-1); - const [ myLevel, setMyLevel ] = useState(10); const [ base64Url, setSavedPictureUrl ] = useState(null); - const [ price, setPrice ] = useState<{ credits: number, duckets: number, publishDucketPrice: number }>(null); + const { availableEffects = [], selectedPictureIndex = -1, cameraRoll = [], setCameraRoll = null, myLevel = 0, price = { credits: 0, duckets: 0, publishDucketPrice: 0 }} = useCamera(); - const onRoomCameraWidgetManagerEvent = useCallback((event: RoomCameraWidgetManagerEvent) => - { - setAvailableEffects(Array.from(GetRoomCameraWidgetManager().effects.values())) - }, []); - - UseCameraEvent(RoomCameraWidgetManagerEvent.INITIALIZED, onRoomCameraWidgetManagerEvent); - - const onCameraConfigurationEvent = useCallback((event: InitCameraMessageEvent) => - { - const parser = event.getParser(); - - setPrice({ credits: parser.creditPrice, duckets: parser.ducketPrice, publishDucketPrice: parser.publishDucketPrice }); - }, []); - - UseMessageEventHook(InitCameraMessageEvent, onCameraConfigurationEvent); - - const onRoomSessionEvent = useCallback((event: RoomSessionEvent) => - { - setMode(MODE_NONE); - }, []); - - UseRoomSessionManagerEvent(RoomSessionEvent.ENDED, onRoomSessionEvent); - - useEffect(() => - { - if(!GetRoomCameraWidgetManager().isLoaded) - { - GetRoomCameraWidgetManager().init(); - - SendMessageComposer(new RequestCameraConfigurationComposer()); - - return; - } - }, []); - - const processAction = useCallback((type: string) => + const processAction = (type: string) => { switch(type) { @@ -70,19 +29,19 @@ export const CameraWidgetView: FC<{}> = props => return; case 'delete': setCameraRoll(prevValue => - { - const clone = [ ...prevValue ]; + { + const clone = [ ...prevValue ]; - clone.splice(selectedPictureIndex, 1); + clone.splice(selectedPictureIndex, 1); - return clone; - }); + return clone; + }); return; case 'editor_cancel': setMode(MODE_CAPTURE); return; } - }, [ selectedPictureIndex ]); + } const checkoutPictureUrl = useCallback((pictureUrl: string) => { @@ -90,49 +49,49 @@ export const CameraWidgetView: FC<{}> = props => setMode(MODE_CHECKOUT); }, []); - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setMode(MODE_CAPTURE); - return; - case 'hide': - setMode(MODE_NONE); - return; - case 'toggle': - setMode(prevValue => - { - if(!prevValue) return MODE_CAPTURE; - else return MODE_NONE; - }); - return; - } - }, []); + useRoomSessionManagerEvent(RoomSessionEvent.ENDED, event => setMode(MODE_NONE)); useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'show': + setMode(MODE_CAPTURE); + return; + case 'hide': + setMode(MODE_NONE); + return; + case 'toggle': + setMode(prevValue => + { + if(!prevValue) return MODE_CAPTURE; + else return MODE_NONE; + }); + return; + } + }, eventUrlPrefix: 'camera/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); + }, []); if(mode === MODE_NONE) return null; return ( - + <> { (mode === MODE_CAPTURE) && processAction('close') } onEdit={ () => processAction('edit') } onDelete={ () => processAction('delete') } /> } { (mode === MODE_EDITOR) && processAction('close') } onCancel={ () => processAction('editor_cancel') } onCheckout={ checkoutPictureUrl } availableEffects={ availableEffects } /> } { (mode === MODE_CHECKOUT) && processAction('close') } onCancelClick={ () => processAction('editor_cancel') } price={ price }> } - + ); } diff --git a/src/components/camera/views/capture/CameraWidgetCaptureView.tsx b/src/components/camera/views/CameraWidgetCaptureView.tsx similarity index 82% rename from src/components/camera/views/capture/CameraWidgetCaptureView.tsx rename to src/components/camera/views/CameraWidgetCaptureView.tsx index a7f16f60..e6c6a3fa 100644 --- a/src/components/camera/views/capture/CameraWidgetCaptureView.tsx +++ b/src/components/camera/views/CameraWidgetCaptureView.tsx @@ -1,10 +1,9 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { NitroRectangle, TextureUtils } from '@nitrots/nitro-renderer'; import { FC, useCallback, useRef } from 'react'; -import { GetRoomEngine, GetRoomSession, LocalizeText, NotificationUtilities, PlaySound, SoundNames } from '../../../../api'; -import { Column, DraggableWindow, Flex } from '../../../../common'; -import { useCameraWidgetContext } from '../../CameraWidgetContext'; -import { CameraPicture } from '../../common/CameraPicture'; +import { CameraPicture, GetRoomEngine, GetRoomSession, LocalizeText, PlaySound, SoundNames } from '../../../api'; +import { Column, DraggableWindow, Flex } from '../../../common'; +import { useCamera, useNotification } from '../../../hooks'; export interface CameraWidgetCaptureViewProps { @@ -18,7 +17,8 @@ const CAMERA_ROLL_LIMIT: number = 5; export const CameraWidgetCaptureView: FC = props => { const { onClose = null, onEdit = null, onDelete = null } = props; - const { cameraRoll = null, setCameraRoll = null, selectedPictureIndex = -1, setSelectedPictureIndex = null } = useCameraWidgetContext(); + const { cameraRoll = null, setCameraRoll = null, selectedPictureIndex = -1, setSelectedPictureIndex = null } = useCamera(); + const { simpleAlert = null } = useNotification(); const elementRef = useRef(); const selectedPicture = ((selectedPictureIndex > -1) ? cameraRoll[selectedPictureIndex] : null); @@ -46,7 +46,7 @@ export const CameraWidgetCaptureView: FC = props = if(clone.length >= CAMERA_ROLL_LIMIT) { - NotificationUtilities.simpleAlert(LocalizeText('camera.full.body')); + simpleAlert(LocalizeText('camera.full.body')); clone.pop(); } @@ -55,7 +55,7 @@ export const CameraWidgetCaptureView: FC = props = clone.push(new CameraPicture(texture, TextureUtils.generateImageUrl(texture))); setCameraRoll(clone); - }, [ cameraRoll, selectedPictureIndex, getCameraBounds, setCameraRoll, setSelectedPictureIndex ]); + }, [ cameraRoll, selectedPictureIndex, getCameraBounds, setCameraRoll, setSelectedPictureIndex, simpleAlert ]); return ( @@ -80,9 +80,9 @@ export const CameraWidgetCaptureView: FC = props = { (cameraRoll.length > 0) && { cameraRoll.map((picture, index) => - { - return setSelectedPictureIndex(index) } />; - }) } + { + return setSelectedPictureIndex(index) } />; + }) } } diff --git a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx b/src/components/camera/views/CameraWidgetCheckoutView.tsx similarity index 81% rename from src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx rename to src/components/camera/views/CameraWidgetCheckoutView.tsx index fd460c9c..6ee92f5a 100644 --- a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx +++ b/src/components/camera/views/CameraWidgetCheckoutView.tsx @@ -1,9 +1,8 @@ import { CameraPublishStatusMessageEvent, CameraPurchaseOKMessageEvent, CameraStorageUrlMessageEvent, PublishPhotoMessageComposer, PurchasePhotoMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { GetConfiguration, GetRoomEngine, LocalizeText, SendMessageComposer } from '../../../../api'; -import { Button, Column, Flex, LayoutCurrencyIcon, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { InventoryEvent } from '../../../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook } from '../../../../hooks'; +import { FC, useEffect, useMemo, useState } from 'react'; +import { CreateLinkEvent, GetConfiguration, GetRoomEngine, LocalizeText, SendMessageComposer } from '../../../api'; +import { Button, Column, Flex, LayoutCurrencyIcon, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; +import { useMessageEvent } from '../../../hooks'; export interface CameraWidgetCheckoutViewProps { @@ -25,40 +24,28 @@ export const CameraWidgetCheckoutView: FC = props const publishDisabled = useMemo(() => GetConfiguration('camera.publish.disabled', false), []); - const onCameraPurchaseOKMessageEvent = useCallback((event: CameraPurchaseOKMessageEvent) => + useMessageEvent(CameraPurchaseOKMessageEvent, event => { - BatchUpdates(() => - { - setPicturesBought(value => (value + 1)); - setIsWaiting(false); - }); - }, []); + setPicturesBought(value => (value + 1)); + setIsWaiting(false); + }); - UseMessageEventHook(CameraPurchaseOKMessageEvent, onCameraPurchaseOKMessageEvent); - - const onCameraPublishStatusMessageEvent = useCallback((event: CameraPublishStatusMessageEvent) => + useMessageEvent(CameraPublishStatusMessageEvent, event => { const parser = event.getParser(); - BatchUpdates(() => - { - setPublishUrl(parser.extraDataId); - setPublishCooldown(parser.secondsToWait); - setWasPicturePublished(parser.ok); - setIsWaiting(false); - }); - }, []); + setPublishUrl(parser.extraDataId); + setPublishCooldown(parser.secondsToWait); + setWasPicturePublished(parser.ok); + setIsWaiting(false); + }); - UseMessageEventHook(CameraPublishStatusMessageEvent, onCameraPublishStatusMessageEvent); - - const onCameraStorageUrlMessageEvent = useCallback((event: CameraStorageUrlMessageEvent) => + useMessageEvent(CameraStorageUrlMessageEvent, event => { const parser = event.getParser(); setPictureUrl(GetConfiguration('camera.url') + '/' + parser.url); - }, []); - - UseMessageEventHook(CameraStorageUrlMessageEvent, onCameraStorageUrlMessageEvent); + }); const processAction = (type: string, value: string | number = null) => { @@ -100,7 +87,7 @@ export const CameraWidgetCheckoutView: FC = props { (pictureUrl && pictureUrl.length) && - } + } { (!pictureUrl || !pictureUrl.length) && { LocalizeText('camera.loading') } @@ -128,7 +115,7 @@ export const CameraWidgetCheckoutView: FC = props { (picturesBought > 0) && { LocalizeText('camera.purchase.count.info') } { picturesBought } - DispatchUiEvent(new InventoryEvent(InventoryEvent.SHOW_INVENTORY)) }>{ LocalizeText('camera.open.inventory') } + CreateLinkEvent('inventory/toggle') }>{ LocalizeText('camera.open.inventory') } } diff --git a/src/components/camera/views/editor/CameraWidgetEditorView.tsx b/src/components/camera/views/editor/CameraWidgetEditorView.tsx index 1ca3e3cf..0c059b82 100644 --- a/src/components/camera/views/editor/CameraWidgetEditorView.tsx +++ b/src/components/camera/views/editor/CameraWidgetEditorView.tsx @@ -2,11 +2,8 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { IRoomCameraWidgetEffect, IRoomCameraWidgetSelectedEffect, RoomCameraWidgetSelectedEffect } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import ReactSlider from 'react-slider'; -import { GetRoomCameraWidgetManager, LocalizeText } from '../../../../api'; +import { CameraEditorTabs, CameraPicture, CameraPictureThumbnail, GetRoomCameraWidgetManager, LocalizeText } from '../../../../api'; import { Button, ButtonGroup, Column, Flex, Grid, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../../common'; -import { CameraEditorTabs } from '../../common/CameraEditorTabs'; -import { CameraPicture } from '../../common/CameraPicture'; -import { CameraPictureThumbnail } from '../../common/CameraPictureThumbnail'; import { CameraWidgetEffectListView } from './effect-list/CameraWidgetEffectListView'; export interface CameraWidgetEditorViewProps @@ -76,14 +73,14 @@ export const CameraWidgetEditorView: FC = props => if(index === -1) return; setSelectedEffects(prevValue => - { - const clone = [ ...prevValue ]; - const currentEffect = clone[index]; + { + const clone = [ ...prevValue ]; + const currentEffect = clone[index]; - clone[getCurrentEffectIndex] = new RoomCameraWidgetSelectedEffect(currentEffect.effect, alpha); + clone[getCurrentEffectIndex] = new RoomCameraWidgetSelectedEffect(currentEffect.effect, alpha); - return clone; - }); + return clone; + }); }, [ getCurrentEffectIndex, setSelectedEffects ]); const getCurrentPictureUrl = useMemo(() => @@ -117,9 +114,9 @@ export const CameraWidgetEditorView: FC = props => if(!effect) return; setSelectedEffects(prevValue => - { - return [ ...prevValue, new RoomCameraWidgetSelectedEffect(effect, 1) ]; - }); + { + return [ ...prevValue, new RoomCameraWidgetSelectedEffect(effect, 1) ]; + }); setSelectedEffectName(effect.name); return; @@ -130,13 +127,13 @@ export const CameraWidgetEditorView: FC = props => if(existingIndex === -1) return; setSelectedEffects(prevValue => - { - const clone = [ ...prevValue ]; + { + const clone = [ ...prevValue ]; - clone.splice(existingIndex, 1); + clone.splice(existingIndex, 1); - return clone; - }); + return clone; + }); if(selectedEffectName === effectName) setSelectedEffectName(null); return; @@ -177,9 +174,9 @@ export const CameraWidgetEditorView: FC = props => processAction('close') } /> { TABS.map(tab => - { - return processAction('change_tab', tab) }> - }) } + { + return processAction('change_tab', tab) }> + }) } @@ -188,7 +185,7 @@ export const CameraWidgetEditorView: FC = props => - + { selectedEffectName && { LocalizeText('camera.effect.name.' + selectedEffectName) } diff --git a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx index 7451ab75..79971457 100644 --- a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx +++ b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx @@ -2,9 +2,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { IRoomCameraWidgetEffect } from '@nitrots/nitro-renderer'; import { FC } from 'react'; import { LocalizeText } from '../../../../../api'; -import { Button } from '../../../../../common/Button'; -import { LayoutGridItem } from '../../../../../common/layout/LayoutGridItem'; -import { Text } from '../../../../../common/Text'; +import { Button, LayoutGridItem, Text } from '../../../../../common'; export interface CameraWidgetEffectListItemViewProps { diff --git a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx index 3c007676..3f67cea7 100644 --- a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx +++ b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx @@ -1,7 +1,7 @@ import { IRoomCameraWidgetEffect, IRoomCameraWidgetSelectedEffect } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { AutoGrid } from '../../../../../common/AutoGrid'; -import { CameraPictureThumbnail } from '../../../common/CameraPictureThumbnail'; +import { CameraPictureThumbnail } from '../../../../../api'; +import { Grid } from '../../../../../common'; import { CameraWidgetEffectListItemView } from './CameraWidgetEffectListItemView'; export interface CameraWidgetEffectListViewProps @@ -18,14 +18,14 @@ export const CameraWidgetEffectListView: FC = p const { myLevel = 0, selectedEffects = [], effects = [], thumbnails = [], processAction = null } = props; return ( - + { effects && (effects.length > 0) && effects.map((effect, index) => - { - const thumbnailUrl = (thumbnails.find(thumbnail => (thumbnail.effectName === effect.name))); - const isActive = (selectedEffects.findIndex(selectedEffect => (selectedEffect.effect.name === effect.name)) > -1); + { + const thumbnailUrl = (thumbnails.find(thumbnail => (thumbnail.effectName === effect.name))); + const isActive = (selectedEffects.findIndex(selectedEffect => (selectedEffect.effect.name === effect.name)) > -1); - return myLevel) } selectEffect={ () => processAction('select_effect', effect.name) } removeEffect={ () => processAction('remove_effect', effect.name) } /> - }) } - + return myLevel) } selectEffect={ () => processAction('select_effect', effect.name) } removeEffect={ () => processAction('remove_effect', effect.name) } /> + }) } + ); } diff --git a/src/components/campaign/CalendarItemView.tsx b/src/components/campaign/CalendarItemView.tsx index ae81dd34..816fa75b 100644 --- a/src/components/campaign/CalendarItemView.tsx +++ b/src/components/campaign/CalendarItemView.tsx @@ -1,8 +1,6 @@ import { FC } from 'react'; -import { GetConfiguration, GetRoomEngine, GetSessionDataManager } from '../../api'; +import { CalendarItemState, GetConfiguration, GetRoomEngine, GetSessionDataManager, ICalendarItem } from '../../api'; import { Base, Column, Flex, LayoutImage } from '../../common'; -import { CalendarItemState } from './common/CalendarItemState'; -import { ICalendarItem } from './common/ICalendarItem'; interface CalendarItemViewProps { @@ -34,7 +32,7 @@ export const CalendarItemView: FC = props => } return ( - onClick(itemId) }> + onClick(itemId) }> { (state === CalendarItemState.STATE_UNLOCKED) && diff --git a/src/components/campaign/CalendarView.tsx b/src/components/campaign/CalendarView.tsx index 40675056..e2961294 100644 --- a/src/components/campaign/CalendarView.tsx +++ b/src/components/campaign/CalendarView.tsx @@ -1,13 +1,11 @@ import { FC, useState } from 'react'; -import { GetSessionDataManager, LocalizeText } from '../../api'; +import { CalendarItemState, GetSessionDataManager, ICalendarItem, LocalizeText } from '../../api'; import { Base, Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; import { CalendarItemView } from './CalendarItemView'; -import { CalendarItemState } from './common/CalendarItemState'; -import { ICalendarItem } from './common/ICalendarItem'; interface CalendarViewProps { - close(): void; + onClose(): void; openPackage(id: number, asStaff: boolean): void; receivedProducts: Map; campaignName: string; @@ -21,7 +19,7 @@ const TOTAL_SHOWN_ITEMS = 5; export const CalendarView: FC = props => { - const { close = null, campaignName = null, currentDay = null, numDays = null, missedDays = null, openedDays = null, openPackage = null, receivedProducts = null } = props; + const { onClose = null, campaignName = null, currentDay = null, numDays = null, missedDays = null, openedDays = null, openPackage = null, receivedProducts = null } = props; const [ selectedDay, setSelectedDay ] = useState(currentDay); const [ index, setIndex ] = useState(Math.max(0, (selectedDay - 1))); @@ -99,14 +97,14 @@ export const CalendarView: FC = props => return ( - + - { LocalizeText('campaign.calendar.heading.day', ['number'], [(selectedDay + 1).toString()]) } + { LocalizeText('campaign.calendar.heading.day', [ 'number' ], [ (selectedDay + 1).toString() ]) } { dayMessage(selectedDay) }
@@ -123,16 +121,16 @@ export const CalendarView: FC = props => - { [...Array(TOTAL_SHOWN_ITEMS)].map((e, i) => - { - const day = (index + i); + { [ ...Array(TOTAL_SHOWN_ITEMS) ].map((e, i) => + { + const day = (index + i); - return ( - - - - ); - }) } + return ( + + + + ); + }) } diff --git a/src/components/campaign/CampaignView.tsx b/src/components/campaign/CampaignView.tsx index 3464f29f..dec8aea4 100644 --- a/src/components/campaign/CampaignView.tsx +++ b/src/components/campaign/CampaignView.tsx @@ -1,9 +1,8 @@ -import { CampaignCalendarData, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer } from '@nitrots/nitro-renderer'; +import { CampaignCalendarData, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, ILinkEventTracker, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { AddEventLinkTracker, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; -import { BatchUpdates, UseMessageEventHook } from '../../hooks'; +import { AddEventLinkTracker, CalendarItem, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; +import { useMessageEvent } from '../../hooks'; import { CalendarView } from './CalendarView'; -import { CalendarItem } from './common/CalendarItem'; export const CampaignView: FC<{}> = props => { @@ -11,18 +10,16 @@ export const CampaignView: FC<{}> = props => const [ lastOpenAttempt, setLastOpenAttempt ] = useState(-1); const [ receivedProducts, setReceivedProducts ] = useState>(new Map()); const [ isCalendarOpen, setCalendarOpen ] = useState(false); - - const onCampaignCalendarDataMessageEvent = useCallback((event: CampaignCalendarDataMessageEvent) => + + useMessageEvent(CampaignCalendarDataMessageEvent, event => { const parser = event.getParser(); if(!parser) return; setCalendarData(parser.calendarData); - }, []); + }); - UseMessageEventHook(CampaignCalendarDataMessageEvent, onCampaignCalendarDataMessageEvent); - - const onCampaignCalendarDoorOpenedMessageEvent = useCallback((event: CampaignCalendarDoorOpenedMessageEvent) => + useMessageEvent(CampaignCalendarDoorOpenedMessageEvent, event => { const parser = event.getParser(); @@ -32,30 +29,25 @@ export const CampaignView: FC<{}> = props => if(parser.doorOpened) { - BatchUpdates(() => + setCalendarData(prev => { - setCalendarData(prev => - { - const copy = prev.clone(); - copy.openedDays.push(lastOpenAttempt); - - return copy; - }); - - setReceivedProducts(prev => - { - const copy = new Map(prev); - copy.set(lastAttempt, new CalendarItem(parser.productName, parser.customImage,parser.furnitureClassName)); - - return copy; - }); + const copy = prev.clone(); + copy.openedDays.push(lastOpenAttempt); + + return copy; + }); + + setReceivedProducts(prev => + { + const copy = new Map(prev); + copy.set(lastAttempt, new CalendarItem(parser.productName, parser.customImage,parser.furnitureClassName)); + + return copy; }); } setLastOpenAttempt(-1); - }, [lastOpenAttempt]); - - UseMessageEventHook(CampaignCalendarDoorOpenedMessageEvent, onCampaignCalendarDoorOpenedMessageEvent); + }); const openPackage = useCallback((id: number, asStaff = false) => { @@ -72,42 +64,41 @@ export const CampaignView: FC<{}> = props => { SendMessageComposer(new OpenCampaignCalendarDoorComposer(calendarData.campaignName, id)); } - }, [calendarData]); + }, [ calendarData ]); const onCalendarClose = useCallback(() => { setCalendarOpen(false); }, []); - const onLinkReceived = useCallback((link: string) => - { - const value = link.split('/'); - - if(value.length < 2) return; - - switch(value[1]) - { - case 'calendar': - setCalendarOpen(true); - break; - } - }, []); - useEffect(() => { - const linkTracker = { linkReceived: onLinkReceived, eventUrlPrefix: 'openView/' }; + const linkTracker: ILinkEventTracker = { + linkReceived: (url: string) => + { + const value = url.split('/'); + + if(value.length < 2) return; + + switch(value[1]) + { + case 'calendar': + setCalendarOpen(true); + break; + } + }, + eventUrlPrefix: 'openView/' + }; + AddEventLinkTracker(linkTracker); - return () => - { - RemoveLinkEventTracker(linkTracker); - } - }, [onLinkReceived]); + return () => RemoveLinkEventTracker(linkTracker); + }, []); return ( <> - {(calendarData && isCalendarOpen) && - + { (calendarData && isCalendarOpen) && + } ) diff --git a/src/components/catalog/CatalogContext.tsx b/src/components/catalog/CatalogContext.tsx deleted file mode 100644 index 6d6f9492..00000000 --- a/src/components/catalog/CatalogContext.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { FrontPageItem, RoomPreviewer } from '@nitrots/nitro-renderer'; -import { createContext, Dispatch, FC, ProviderProps, SetStateAction, useContext } from 'react'; -import { ICatalogNode } from './common/ICatalogNode'; -import { ICatalogOptions } from './common/ICatalogOptions'; -import { ICatalogPage } from './common/ICatalogPage'; -import { IPageLocalization } from './common/IPageLocalization'; -import { IPurchasableOffer } from './common/IPurchasableOffer'; -import { IPurchaseOptions } from './common/IPurchaseOptions'; -import { SearchResult } from './common/SearchResult'; - -interface ICatalogContext -{ - isVisible: boolean; - isBusy: boolean; - setIsBusy: Dispatch>; - pageId: number; - currentType: string; - setCurrentType: Dispatch>; - rootNode: ICatalogNode; - setRootNode: Dispatch>; - offersToNodes: Map; - setOffersToNodes: Dispatch>>; - currentPage: ICatalogPage; - setCurrentPage: Dispatch>; - currentOffer: IPurchasableOffer; - setCurrentOffer: Dispatch>; - activeNodes: ICatalogNode[]; - setActiveNodes: Dispatch>; - searchResult: SearchResult; - setSearchResult: Dispatch>; - frontPageItems: FrontPageItem[]; - setFrontPageItems: Dispatch>; - roomPreviewer: RoomPreviewer; - purchaseOptions: IPurchaseOptions; - setPurchaseOptions: Dispatch>; - catalogOptions: ICatalogOptions; - setCatalogOptions: Dispatch>; - resetState: () => void; - getNodesByOfferId: (offerId: number, flag?: boolean) => ICatalogNode[]; - loadCatalogPage: (pageId: number, offerId: number) => void; - showCatalogPage: (pageId: number, layoutCode: string, localization: IPageLocalization, offers: IPurchasableOffer[], offerId: number, acceptSeasonCurrencyAsCredits: boolean) => void; - activateNode: (targetNode: ICatalogNode) => void; -} - -const CatalogContext = createContext({ - isVisible: null, - isBusy: null, - setIsBusy: null, - pageId: null, - currentType: null, - setCurrentType: null, - rootNode: null, - setRootNode: null, - offersToNodes: null, - setOffersToNodes: null, - currentPage: null, - setCurrentPage: null, - currentOffer: null, - setCurrentOffer: null, - activeNodes: null, - setActiveNodes: null, - searchResult: null, - setSearchResult: null, - frontPageItems: null, - setFrontPageItems: null, - roomPreviewer: null, - purchaseOptions: null, - setPurchaseOptions: null, - catalogOptions: null, - setCatalogOptions: null, - resetState: null, - getNodesByOfferId: null, - loadCatalogPage: null, - showCatalogPage: null, - activateNode: null -}); - -export const CatalogContextProvider: FC> = props => -{ - return { props.children } -} - -export const useCatalogContext = () => useContext(CatalogContext); diff --git a/src/components/catalog/CatalogMessageHandler.tsx b/src/components/catalog/CatalogMessageHandler.tsx deleted file mode 100644 index 9de5b0ce..00000000 --- a/src/components/catalog/CatalogMessageHandler.tsx +++ /dev/null @@ -1,326 +0,0 @@ -import { ApproveNameMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, ClubGiftInfoEvent, GiftReceiverNotFoundEvent, GiftWrappingConfigurationEvent, HabboClubOffersMessageEvent, LimitedEditionSoldOutEvent, MarketplaceConfigurationEvent, MarketplaceMakeOfferResult, NodeData, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, SellablePetPalettesMessageEvent, UserSubscriptionEvent } from '@nitrots/nitro-renderer'; -import { GuildMembershipsMessageEvent } from '@nitrots/nitro-renderer/src/nitro/communication/messages/incoming/user/GuildMembershipsMessageEvent'; -import { FC, useCallback } from 'react'; -import { GetFurnitureData, GetProductDataForLocalization, LocalizeText, NotificationAlertType, NotificationUtilities } from '../../api'; -import { CatalogGiftReceiverNotFoundEvent, CatalogNameResultEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent, CatalogSetExtraPurchaseParameterEvent } from '../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook } from '../../hooks'; -import { useCatalogContext } from './CatalogContext'; -import { CatalogNode } from './common/CatalogNode'; -import { CatalogPetPalette } from './common/CatalogPetPalette'; -import { CatalogType } from './common/CatalogType'; -import { GiftWrappingConfiguration } from './common/GiftWrappingConfiguration'; -import { ICatalogNode } from './common/ICatalogNode'; -import { IProduct } from './common/IProduct'; -import { IPurchasableOffer } from './common/IPurchasableOffer'; -import { Offer } from './common/Offer'; -import { PageLocalization } from './common/PageLocalization'; -import { Product } from './common/Product'; -import { ProductTypeEnum } from './common/ProductTypeEnum'; -import { SubscriptionInfo } from './common/SubscriptionInfo'; - -export const CatalogMessageHandler: FC<{}> = props => -{ - const { setIsBusy, pageId, currentType, setRootNode, setOffersToNodes, currentPage, setCurrentOffer, setFrontPageItems, resetState, showCatalogPage, setCatalogOptions = null } = useCatalogContext(); - - const onCatalogPagesListEvent = useCallback((event: CatalogPagesListEvent) => - { - const parser = event.getParser(); - const offers: Map = new Map(); - - const getCatalogNode = (node: NodeData, depth: number, parent: ICatalogNode) => - { - const catalogNode = (new CatalogNode(node, depth, parent) as ICatalogNode); - - for(const offerId of catalogNode.offerIds) - { - if(offers.has(offerId)) offers.get(offerId).push(catalogNode); - else offers.set(offerId, [ catalogNode ]); - } - - depth++; - - for(const child of node.children) catalogNode.addChild(getCatalogNode(child, depth, catalogNode)); - - return catalogNode; - } - - BatchUpdates(() => - { - setRootNode(getCatalogNode(parser.root, 0, null)); - setOffersToNodes(offers); - }); - }, [ setRootNode, setOffersToNodes ]); - - const onCatalogPageMessageEvent = useCallback((event: CatalogPageMessageEvent) => - { - const parser = event.getParser(); - - if(parser.catalogType !== currentType) return; - - const purchasableOffers: IPurchasableOffer[] = []; - - for(const offer of parser.offers) - { - const products: IProduct[] = []; - const productData = GetProductDataForLocalization(offer.localizationId); - - for(const product of offer.products) - { - const furnitureData = GetFurnitureData(product.furniClassId, product.productType); - - products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft)); - } - - if(!products.length) continue; - - const purchasableOffer = new Offer(offer.offerId, offer.localizationId, offer.rent, offer.priceCredits, offer.priceActivityPoints, offer.priceActivityPointsType, offer.giftable, offer.clubLevel, products, offer.bundlePurchaseAllowed); - - if((currentType === CatalogType.NORMAL) || ((purchasableOffer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (purchasableOffer.pricingModel !== Offer.PRICING_MODEL_MULTI))) purchasableOffers.push(purchasableOffer); - } - - BatchUpdates(() => - { - if(parser.frontPageItems && parser.frontPageItems.length) setFrontPageItems(parser.frontPageItems); - - setIsBusy(false); - - if(pageId === parser.pageId) - { - showCatalogPage(parser.pageId, parser.layoutCode, new PageLocalization(parser.localization.images.concat(), parser.localization.texts.concat()), purchasableOffers, parser.offerId, parser.acceptSeasonCurrencyAsCredits); - } - }); - }, [ currentType, pageId, setFrontPageItems, setIsBusy, showCatalogPage ]); - - const onPurchaseOKMessageEvent = useCallback((event: PurchaseOKMessageEvent) => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchasedEvent(parser.offer)); - }, []); - - const onPurchaseErrorMessageEvent = useCallback((event: PurchaseErrorMessageEvent) => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchaseFailureEvent(parser.code)); - }, []); - - const onPurchaseNotAllowedMessageEvent = useCallback((event: PurchaseNotAllowedMessageEvent) => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchaseNotAllowedEvent(parser.code)); - }, []); - - const onLimitedEditionSoldOutEvent = useCallback((event: LimitedEditionSoldOutEvent) => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchaseSoldOutEvent()); - }, []); - - const onProductOfferEvent = useCallback((event: ProductOfferEvent) => - { - const parser = event.getParser(); - const offerData = parser.offer; - - if(!offerData || !offerData.products.length) return; - - const offerProductData = offerData.products[0]; - - if(offerProductData.uniqueLimitedItem) - { - // update unique - } - - const products: IProduct[] = []; - const productData = GetProductDataForLocalization(offerData.localizationId); - - for(const product of offerData.products) - { - const furnitureData = GetFurnitureData(product.furniClassId, product.productType); - - products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft)); - } - - const offer = new Offer(offerData.offerId, offerData.localizationId, offerData.rent, offerData.priceCredits, offerData.priceActivityPoints, offerData.priceActivityPointsType, offerData.giftable, offerData.clubLevel, products, offerData.bundlePurchaseAllowed); - - if(!((currentType === CatalogType.NORMAL) || ((offer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (offer.pricingModel !== Offer.PRICING_MODEL_MULTI)))) return; - - offer.page = currentPage; - - setCurrentOffer(offer); - - if(offer.product && (offer.product.productType === ProductTypeEnum.WALL)) - { - DispatchUiEvent(new CatalogSetExtraPurchaseParameterEvent(offer.product.extraParam)); - } - - // (this._isObjectMoverRequested) && (this._purchasableOffer) - }, [ currentType, currentPage, setCurrentOffer ]); - - const onSellablePetPalettesMessageEvent = useCallback((event: SellablePetPalettesMessageEvent) => - { - const parser = event.getParser(); - const petPalette = new CatalogPetPalette(parser.productCode, parser.palettes.slice()); - - setCatalogOptions(prevValue => - { - const petPalettes = []; - - if(prevValue.petPalettes) petPalettes.push(...prevValue.petPalettes); - - for(let i = 0; i < petPalettes.length; i++) - { - const palette = petPalettes[i]; - - if(palette.breed === petPalette.breed) - { - petPalettes.splice(i, 1); - - break; - } - } - - petPalettes.push(petPalette); - - return { ...prevValue, petPalettes }; - }); - }, [ setCatalogOptions ]); - - const onApproveNameMessageEvent = useCallback((event: ApproveNameMessageEvent) => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogNameResultEvent(parser.result, parser.validationInfo)); - }, []); - - const onGiftReceiverNotFoundEvent = useCallback(() => - { - DispatchUiEvent(new CatalogGiftReceiverNotFoundEvent()); - }, []); - - const onHabboClubOffersMessageEvent = useCallback((event: HabboClubOffersMessageEvent) => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const clubOffers = parser.offers; - - return { ...prevValue, clubOffers }; - }); - }, [ setCatalogOptions ]); - - const onGuildMembershipsMessageEvent = useCallback((event: GuildMembershipsMessageEvent) => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const groups = parser.groups; - - return { ...prevValue, groups }; - }); - }, [ setCatalogOptions ]); - - const onUserSubscriptionEvent = useCallback((event: UserSubscriptionEvent) => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const subscriptionInfo = new SubscriptionInfo( - Math.max(0, parser.daysToPeriodEnd), - Math.max(0, parser.periodsSubscribedAhead), - parser.isVip, - parser.pastClubDays, - parser.pastVipDays); - - return { ...prevValue, subscriptionInfo }; - }); - }, [ setCatalogOptions ]); - - const onCatalogPublishedMessageEvent = useCallback((event: CatalogPublishedMessageEvent) => - { - resetState(); - }, [ resetState ]); - - const onGiftWrappingConfigurationEvent = useCallback((event: GiftWrappingConfigurationEvent) => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const giftConfiguration = new GiftWrappingConfiguration(parser); - - return { ...prevValue, giftConfiguration }; - }); - }, [ setCatalogOptions ]); - - const onMarketplaceMakeOfferResult = useCallback((event: MarketplaceMakeOfferResult) => - { - const parser = event.getParser(); - - if(!parser) return; - - let title = ''; - if(parser.result === 1) - { - title = LocalizeText('inventory.marketplace.result.title.success'); - } - else - { - title = LocalizeText('inventory.marketplace.result.title.failure'); - } - - const message = LocalizeText(`inventory.marketplace.result.${parser.result}`); - - NotificationUtilities.simpleAlert(message, NotificationAlertType.DEFAULT, null, null, title); - }, []); - - const onMarketplaceConfigurationEvent = useCallback((event: MarketplaceConfigurationEvent) => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const marketplaceConfiguration = parser; - - return { ...prevValue, marketplaceConfiguration }; - }); - }, [ setCatalogOptions ]); - - const onClubGiftInfoEvent = useCallback((event: ClubGiftInfoEvent) => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const clubGifts = parser; - - return { ...prevValue, clubGifts }; - }); - }, [ setCatalogOptions ]); - - UseMessageEventHook(CatalogPagesListEvent, onCatalogPagesListEvent); - UseMessageEventHook(CatalogPageMessageEvent, onCatalogPageMessageEvent); - UseMessageEventHook(PurchaseOKMessageEvent, onPurchaseOKMessageEvent); - UseMessageEventHook(PurchaseErrorMessageEvent, onPurchaseErrorMessageEvent); - UseMessageEventHook(PurchaseNotAllowedMessageEvent, onPurchaseNotAllowedMessageEvent); - UseMessageEventHook(LimitedEditionSoldOutEvent, onLimitedEditionSoldOutEvent); - UseMessageEventHook(ProductOfferEvent, onProductOfferEvent); - UseMessageEventHook(GuildMembershipsMessageEvent, onGuildMembershipsMessageEvent); - UseMessageEventHook(SellablePetPalettesMessageEvent, onSellablePetPalettesMessageEvent); - UseMessageEventHook(ApproveNameMessageEvent, onApproveNameMessageEvent); - UseMessageEventHook(GiftReceiverNotFoundEvent, onGiftReceiverNotFoundEvent); - UseMessageEventHook(HabboClubOffersMessageEvent, onHabboClubOffersMessageEvent); - UseMessageEventHook(UserSubscriptionEvent, onUserSubscriptionEvent); - UseMessageEventHook(CatalogPublishedMessageEvent, onCatalogPublishedMessageEvent); - UseMessageEventHook(GiftWrappingConfigurationEvent, onGiftWrappingConfigurationEvent); - UseMessageEventHook(ClubGiftInfoEvent, onClubGiftInfoEvent); - UseMessageEventHook(MarketplaceMakeOfferResult, onMarketplaceMakeOfferResult); - UseMessageEventHook(MarketplaceConfigurationEvent, onMarketplaceConfigurationEvent); - - return null; -} diff --git a/src/components/catalog/CatalogView.scss b/src/components/catalog/CatalogView.scss index 7657fa17..4101cd13 100644 --- a/src/components/catalog/CatalogView.scss +++ b/src/components/catalog/CatalogView.scss @@ -20,13 +20,6 @@ } } -.catalog-icon-image { - width: 20px; - height: 20px; - min-width: 20px; - min-height: 20px; -} - .nitro-catalog-gift { width: 325px; diff --git a/src/components/catalog/CatalogView.tsx b/src/components/catalog/CatalogView.tsx index 1cfbe184..3af9b189 100644 --- a/src/components/catalog/CatalogView.tsx +++ b/src/components/catalog/CatalogView.tsx @@ -1,426 +1,91 @@ -import { FrontPageItem, GetCatalogIndexComposer, GetCatalogPageComposer, GetClubGiftInfo, GetGiftWrappingConfigurationComposer, GetMarketplaceConfigurationMessageComposer, ILinkEventTracker, RoomPreviewer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { AddEventLinkTracker, GetRoomEngine, LocalizeText, PlaySound, RemoveLinkEventTracker, SendMessageComposer, SoundNames } from '../../api'; +import { ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { FC, useEffect } from 'react'; +import { AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker } from '../../api'; import { Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; -import { CatalogPurchasedEvent } from '../../events'; -import { BatchUpdates, UseUiEvent } from '../../hooks'; -import { CatalogContextProvider } from './CatalogContext'; -import { CatalogMessageHandler } from './CatalogMessageHandler'; -import { CatalogPage } from './common/CatalogPage'; -import { CatalogType } from './common/CatalogType'; -import { ICatalogNode } from './common/ICatalogNode'; -import { ICatalogOptions } from './common/ICatalogOptions'; -import { ICatalogPage } from './common/ICatalogPage'; -import { IPageLocalization } from './common/IPageLocalization'; -import { IPurchasableOffer } from './common/IPurchasableOffer'; -import { IPurchaseOptions } from './common/IPurchaseOptions'; -import { RequestedPage } from './common/RequestedPage'; -import { SearchResult } from './common/SearchResult'; +import { useCatalog } from '../../hooks'; import { CatalogGiftView } from './views/gift/CatalogGiftView'; import { CatalogNavigationView } from './views/navigation/CatalogNavigationView'; import { GetCatalogLayout } from './views/page/layout/GetCatalogLayout'; import { MarketplacePostOfferView } from './views/page/layout/marketplace/MarketplacePostOfferView'; -const REQUESTED_PAGE = new RequestedPage(); - export const CatalogView: FC<{}> = props => { - const [ isVisible, setIsVisible ] = useState(false); - const [ isBusy, setIsBusy ] = useState(false); - const [ pageId, setPageId ] = useState(-1); - const [ previousPageId, setPreviousPageId ] = useState(-1); - const [ currentType, setCurrentType ] = useState(CatalogType.NORMAL); - const [ rootNode, setRootNode ] = useState(null); - const [ offersToNodes, setOffersToNodes ] = useState>(null); - const [ currentPage, setCurrentPage ] = useState(null); - const [ currentOffer, setCurrentOffer ] = useState(null); - const [ activeNodes, setActiveNodes ] = useState([]); - const [ searchResult, setSearchResult ] = useState(null); - const [ frontPageItems, setFrontPageItems ] = useState([]); - const [ roomPreviewer, setRoomPreviewer ] = useState(null); - const [ navigationHidden, setNavigationHidden ] = useState(false); - const [ purchaseOptions, setPurchaseOptions ] = useState({}); - const [ catalogOptions, setCatalogOptions ] = useState({}); - - const resetState = useCallback(() => - { - BatchUpdates(() => - { - setPageId(-1); - setPreviousPageId(-1); - setRootNode(null); - setOffersToNodes(null); - setCurrentPage(null); - setCurrentOffer(null); - setActiveNodes([]); - setSearchResult(null); - setFrontPageItems([]); - }); - }, []); - - const getNodeById = useCallback((id: number, node: ICatalogNode) => - { - if((node.pageId === id) && (node !== rootNode)) return node; - - for(const child of node.children) - { - const found = (getNodeById(id, child) as ICatalogNode); - - if(found) return found; - } - - return null; - }, [ rootNode ]); - - const getNodeByName = useCallback((name: string, node: ICatalogNode) => - { - if((node.pageName === name) && (node !== rootNode)) return node; - - for(const child of node.children) - { - const found = (getNodeByName(name, child) as ICatalogNode); - - if(found) return found; - } - - return null; - }, [ rootNode ]); - - const getNodesByOfferId = useCallback((offerId: number, flag: boolean = false) => - { - if(!offersToNodes || !offersToNodes.size) return null; - - if(flag) - { - const nodes: ICatalogNode[] = []; - const offers = offersToNodes.get(offerId); - - if(offers && offers.length) for(const offer of offers) (offer.isVisible && nodes.push(offer)); - - if(nodes.length) return nodes; - } - - return offersToNodes.get(offerId); - }, [ offersToNodes ]); - - const loadCatalogPage = useCallback((pageId: number, offerId: number) => - { - if(pageId < 0) return; - - BatchUpdates(() => - { - setIsBusy(true); - setPageId(pageId); - }); - - if(pageId > -1) SendMessageComposer(new GetCatalogPageComposer(pageId, offerId, currentType)); - }, [ currentType ]); - - const showCatalogPage = useCallback((pageId: number, layoutCode: string, localization: IPageLocalization, offers: IPurchasableOffer[], offerId: number, acceptSeasonCurrencyAsCredits: boolean) => - { - const catalogPage = (new CatalogPage(pageId, layoutCode, localization, offers, acceptSeasonCurrencyAsCredits) as ICatalogPage); - - BatchUpdates(() => - { - setCurrentPage(catalogPage); - setPreviousPageId(prevValue => ((pageId !== -1) ? pageId : prevValue)); - setNavigationHidden(false); - - if((offerId > -1) && catalogPage.offers.length) - { - for(const offer of catalogPage.offers) - { - if(offer.offerId !== offerId) continue; - - setCurrentOffer(offer) - - break; - } - } - }); - }, []); - - const activateNode = useCallback((targetNode: ICatalogNode, offerId: number = -1) => - { - if(targetNode.parent.pageName === 'root') - { - if(targetNode.children.length) - { - for(const child of targetNode.children) - { - if(!child.isVisible) continue; - - targetNode = child; - - break; - } - } - } - - const nodes: ICatalogNode[] = []; - - let node = targetNode; - - while(node && (node.pageName !== 'root')) - { - nodes.push(node); - - node = node.parent; - } - - nodes.reverse(); - - setActiveNodes(prevValue => - { - const isActive = (prevValue.indexOf(targetNode) >= 0); - const isOpen = targetNode.isOpen; - - for(const existing of prevValue) - { - existing.deactivate(); - - if(nodes.indexOf(existing) === -1) existing.close(); - } - - for(const n of nodes) - { - n.activate(); - - if(n.parent) n.open(); - - if((n === targetNode.parent) && n.children.length) n.open(); - } - - if(isActive && isOpen) targetNode.close(); - else targetNode.open(); - - return nodes; - }); - - if(targetNode.pageId > -1) loadCatalogPage(targetNode.pageId, offerId); - }, [ setActiveNodes, loadCatalogPage ]); - - const openPageById = useCallback((id: number) => - { - BatchUpdates(() => - { - setSearchResult(null); - - if(!isVisible) - { - REQUESTED_PAGE.requestById = id; - - setIsVisible(true); - } - else - { - const node = getNodeById(id, rootNode); - - if(node) activateNode(node); - } - }); - }, [ isVisible, rootNode, getNodeById, activateNode ]); - - const openPageByName = useCallback((name: string) => - { - BatchUpdates(() => - { - setSearchResult(null); - - if(!isVisible) - { - REQUESTED_PAGE.requestByName = name; - - setIsVisible(true); - } - else - { - const node = getNodeByName(name, rootNode); - - if(node) activateNode(node); - } - }); - }, [ isVisible, rootNode, getNodeByName, activateNode ]); - - const openPageByOfferId = useCallback((offerId: number) => - { - BatchUpdates(() => - { - setSearchResult(null); - - if(!isVisible) - { - REQUESTED_PAGE.requestedByOfferId = offerId; - - setIsVisible(true); - } - else - { - const nodes = getNodesByOfferId(offerId); - - if(!nodes || !nodes.length) return; - - activateNode(nodes[0], offerId); - } - }); - }, [ isVisible, getNodesByOfferId, activateNode ]); - - const onCatalogPurchasedEvent = useCallback((event: CatalogPurchasedEvent) => - { - PlaySound(SoundNames.CREDITS); - }, []); - - UseUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, onCatalogPurchasedEvent); - - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setIsVisible(true); - return; - case 'hide': - setIsVisible(false); - return; - case 'toggle': - setIsVisible(prevValue => !prevValue); - return; - case 'open': - if(parts.length > 2) - { - if(parts.length === 4) - { - switch(parts[2]) - { - case 'offerId': - openPageByOfferId(parseInt(parts[3])); - return; - } - } - else - { - openPageByName(parts[2]); - } - } - else - { - setIsVisible(true); - } - - return; - } - }, [ openPageByOfferId, openPageByName ]); + const { isVisible = false, setIsVisible = null, rootNode = null, currentPage = null, navigationHidden = false, setNavigationHidden = null, activeNodes = [], searchResult = null, setSearchResult = null, openPageByName = null, openPageByOfferId = null, activateNode = null } = useCatalog(); useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'show': + setIsVisible(true); + return; + case 'hide': + setIsVisible(false); + return; + case 'toggle': + setIsVisible(prevValue => !prevValue); + return; + case 'open': + if(parts.length > 2) + { + if(parts.length === 4) + { + switch(parts[2]) + { + case 'offerId': + openPageByOfferId(parseInt(parts[3])); + return; + } + } + else + { + openPageByName(parts[2]); + } + } + else + { + setIsVisible(true); + } + + return; + } + }, eventUrlPrefix: 'catalog/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); - - useEffect(() => - { - setRoomPreviewer(new RoomPreviewer(GetRoomEngine(), ++RoomPreviewer.PREVIEW_COUNTER)); - - return () => - { - setRoomPreviewer(prevValue => - { - prevValue.dispose(); - - return null; - }); - } - }, []); - - useEffect(() => - { - if(!isVisible || rootNode) return; - - SendMessageComposer(new GetMarketplaceConfigurationMessageComposer()); - SendMessageComposer(new GetGiftWrappingConfigurationComposer()); - SendMessageComposer(new GetClubGiftInfo()); - SendMessageComposer(new GetCatalogIndexComposer(currentType)); - }, [ isVisible, rootNode, currentType ]); - - useEffect(() => - { - if(!isVisible || !rootNode) return; - - switch(REQUESTED_PAGE.requestType) - { - case RequestedPage.REQUEST_TYPE_NONE: - if(activeNodes && activeNodes.length) return; - - if(rootNode.isBranch) - { - for(const child of rootNode.children) - { - if(child && child.isVisible) - { - activateNode(child); - - return; - } - } - } - return; - case RequestedPage.REQUEST_TYPE_ID: - openPageById(REQUESTED_PAGE.requestById); - REQUESTED_PAGE.resetRequest(); - return; - case RequestedPage.REQUEST_TYPE_OFFER: - openPageByOfferId(REQUESTED_PAGE.requestedByOfferId); - REQUESTED_PAGE.resetRequest(); - return; - case RequestedPage.REQUEST_TYPE_NAME: - openPageByName(REQUESTED_PAGE.requestByName); - REQUESTED_PAGE.resetRequest(); - return; - } - }, [ isVisible, rootNode, activeNodes, activateNode, openPageById, openPageByOfferId, openPageByName ]); - - useEffect(() => - { - if(!searchResult && currentPage && (currentPage.pageId === -1)) openPageById(previousPageId); - }, [ searchResult, currentPage, previousPageId, openPageById ]); - - useEffect(() => - { - return () => setCurrentOffer(null); - }, [ currentPage ]); + }, [ setIsVisible, openPageByOfferId, openPageByName ]); return ( - - + <> { isVisible && - { setIsVisible(false); } } /> + setIsVisible(false) } /> { rootNode && (rootNode.children.length > 0) && rootNode.children.map(child => - { - if(!child.isVisible) return null; + { + if(!child.isVisible) return null; - return ( - - { - if(searchResult) setSearchResult(null); + return ( + + { + if(searchResult) setSearchResult(null); - activateNode(child); - } }> - { child.localization } - - ); - }) } + activateNode(child); + } }> + { child.localization } + + ); + }) } @@ -435,8 +100,8 @@ export const CatalogView: FC<{}> = props => } - - - + + + ); } diff --git a/src/components/catalog/common/AttemptCatalogPlacement.ts b/src/components/catalog/common/AttemptCatalogPlacement.ts deleted file mode 100644 index af342ee3..00000000 --- a/src/components/catalog/common/AttemptCatalogPlacement.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CatalogPageMessageOfferData, RoomObjectCategory, RoomObjectPlacementSource } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../../../api'; -import { IsCatalogOfferDraggable } from './IsCatalogOfferDraggable'; -import { ProductTypeEnum } from './ProductTypeEnum'; - -export const AttemptCatalogPlacement = (offer: CatalogPageMessageOfferData) => -{ - if(!IsCatalogOfferDraggable(offer)) return; - - const product = offer.products[0]; - - let category: number = -1; - - switch(product.productType) - { - case ProductTypeEnum.FLOOR: - category = RoomObjectCategory.FLOOR; - break; - case ProductTypeEnum.WALL: - category = RoomObjectCategory.WALL; - break; - } - - if(category === -1) return; - - if(GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.CATALOG, -(offer.offerId), category, product.furniClassId, (product.extraParam) ? product.extraParam.toString() : null)) - { - - } -} diff --git a/src/components/catalog/common/FurniCategory.ts b/src/components/catalog/common/FurniCategory.ts deleted file mode 100644 index 7eeeca24..00000000 --- a/src/components/catalog/common/FurniCategory.ts +++ /dev/null @@ -1,26 +0,0 @@ -export class FurniCategory -{ - public static DEFAULT: number = 1; - public static WALL_PAPER: number = 2; - public static FLOOR: number = 3; - public static LANDSCAPE: number = 4; - public static POST_IT: number = 5; - public static POSTER: number = 6; - public static SOUND_SET: number = 7; - public static TRAX_SONG: number = 8; - public static PRESENT: number = 9; - public static ECOTRON_BOX: number = 10; - public static TROPHY: number = 11; - public static CREDIT_FURNI: number = 12; - public static PET_SHAMPOO: number = 13; - public static PET_CUSTOM_PART: number = 14; - public static PET_CUSTOM_PART_SHAMPOO: number = 15; - public static PET_SADDLE: number = 16; - public static GUILD_FURNI: number = 17; - public static GAME_FURNI: number = 18; - public static MONSTERPLANT_SEED: number = 19; - public static MONSTERPLANT_REVIVAL: number = 20; - public static MONSTERPLANT_REBREED: number = 21; - public static MONSTERPLANT_FERTILIZE: number = 22; - public static FIGURE_PURCHASABLE_SET: number = 23; -} \ No newline at end of file diff --git a/src/components/catalog/common/IPurse.ts b/src/components/catalog/common/IPurse.ts deleted file mode 100644 index bd365ba6..00000000 --- a/src/components/catalog/common/IPurse.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface IPurse -{ - _Str_14389: boolean; - _Str_4458: number; - credits: number; - clubDays: number; - clubPeriods: number; - _Str_13571: boolean; - _Str_3738: boolean; - _Str_6288: number; - _Str_4605: number; - _Str_6312: number; - _Str_5590(_arg_1: number): number; -} diff --git a/src/components/catalog/common/IsCatalogOfferDraggable.ts b/src/components/catalog/common/IsCatalogOfferDraggable.ts deleted file mode 100644 index 174ce4d0..00000000 --- a/src/components/catalog/common/IsCatalogOfferDraggable.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { CatalogPageMessageOfferData, RoomControllerLevel } from '@nitrots/nitro-renderer'; -import { GetRoomSession } from '../../../api'; -import { ProductTypeEnum } from './ProductTypeEnum'; - -export const IsCatalogOfferDraggable = (offer: CatalogPageMessageOfferData) => -{ - return ((GetRoomSession().isRoomOwner || (GetRoomSession().isGuildRoom && (GetRoomSession().controllerLevel >= RoomControllerLevel.GUILD_MEMBER))) && (offer.products.length === 1) && (offer.products[0].productType !== ProductTypeEnum.EFFECT) && (offer.products[0].productType !== ProductTypeEnum.HABBO_CLUB)) -} diff --git a/src/components/catalog/common/ProductTypeEnum.ts b/src/components/catalog/common/ProductTypeEnum.ts deleted file mode 100644 index 75257e55..00000000 --- a/src/components/catalog/common/ProductTypeEnum.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class ProductTypeEnum -{ - public static WALL: string = 'i'; - public static FLOOR: string = 's'; - public static EFFECT: string = 'e'; - public static HABBO_CLUB: string = 'h'; - public static BADGE: string = 'b'; - public static GAME_TOKEN: string = 'GAME_TOKEN'; - public static PET: string = 'p'; - public static ROBOT: string = 'r'; -} \ No newline at end of file diff --git a/src/components/catalog/common/Purse.ts b/src/components/catalog/common/Purse.ts deleted file mode 100644 index eebaacf8..00000000 --- a/src/components/catalog/common/Purse.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { GetNitroInstance } from '../../../api'; -import { IPurse } from './IPurse'; - -export class Purse implements IPurse -{ - private _credits: number = 0; - private _activityPoints: Map; - private _clubDays: number = 0; - private _clubPeriods: number = 0; - private _isVIP: boolean = false; - private _pastClubDays: number = 0; - private _pastVipDays: number = 0; - private _isExpiring: boolean = false; - private _minutesUntilExpiration: number = 0; - private _minutesSinceLastModified: number; - private _lastUpdated: number; - - public get credits(): number - { - return this._credits; - } - - public set credits(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._credits = k; - } - - public get clubDays(): number - { - return this._clubDays; - } - - public set clubDays(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._clubDays = k; - } - - public get clubPeriods(): number - { - return this._clubPeriods; - } - - public set clubPeriods(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._clubPeriods = k; - } - - public get _Str_13571(): boolean - { - return (this._clubDays > 0) || (this._clubPeriods > 0); - } - - public get _Str_3738(): boolean - { - return this._isVIP; - } - - public get _Str_14389(): boolean - { - return this._isExpiring; - } - - public set _Str_14389(k: boolean) - { - this._isExpiring = k; - } - - public set _Str_3738(k: boolean) - { - this._isVIP = k; - } - - public get _Str_6288(): number - { - return this._pastClubDays; - } - - public set _Str_6288(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._pastClubDays = k; - } - - public get _Str_4605(): number - { - return this._pastVipDays; - } - - public set _Str_4605(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._pastVipDays = k; - } - - public get _Str_18527(): Map - { - return this._activityPoints; - } - - public set _Str_18527(k: Map) - { - this._lastUpdated = GetNitroInstance().time; - this._activityPoints = k; - } - - public _Str_5590(k: number): number - { - return this._activityPoints[k]; - } - - public set _Str_4458(k: number) - { - this._lastUpdated = GetNitroInstance().time; - - this._minutesUntilExpiration = k; - } - - public get _Str_4458(): number - { - const k = ((GetNitroInstance().time - this._lastUpdated) / (1000 * 60)); - const _local_2 = (this._minutesUntilExpiration - k); - - return (_local_2 > 0) ? _local_2 : 0; - } - - public set _Str_6312(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._minutesSinceLastModified = k; - } - - public get _Str_6312(): number - { - return this._minutesSinceLastModified; - } - - public get _Str_26225(): number - { - return this._lastUpdated; - } -} diff --git a/src/components/catalog/common/SubscriptionInfo.ts b/src/components/catalog/common/SubscriptionInfo.ts deleted file mode 100644 index 29d4b358..00000000 --- a/src/components/catalog/common/SubscriptionInfo.ts +++ /dev/null @@ -1,17 +0,0 @@ - -export class SubscriptionInfo -{ - private _lastUpdated: number; - - constructor( - public readonly clubDays: number = 0, - public readonly clubPeriods: number = 0, - public readonly isVip: boolean = false, - public readonly pastDays: number = 0, - public readonly pastVipDays: number = 0) {} - - public get lastUpdated(): number - { - return this._lastUpdated; - } -} diff --git a/src/components/catalog/views/CatalogPurchaseConfirmView.tsx b/src/components/catalog/views/CatalogPurchaseConfirmView.tsx new file mode 100644 index 00000000..30dcfc3b --- /dev/null +++ b/src/components/catalog/views/CatalogPurchaseConfirmView.tsx @@ -0,0 +1,10 @@ +import { FC } from 'react'; + +export const CatalogPurchaseConfirmView: FC<{}> = props => +{ + const {} = props; + + return ( +
+ ); +} diff --git a/src/components/catalog/views/catalog-icon/CatalogIconView.tsx b/src/components/catalog/views/catalog-icon/CatalogIconView.tsx index e287d9cf..7c28ac94 100644 --- a/src/components/catalog/views/catalog-icon/CatalogIconView.tsx +++ b/src/components/catalog/views/catalog-icon/CatalogIconView.tsx @@ -16,5 +16,5 @@ export const CatalogIconView: FC = props => return ((GetConfiguration('catalog.asset.icon.url')).replace('%name%', icon.toString())); }, [ icon ]); - return ; + return ; } diff --git a/src/components/catalog/views/catalog-room-previewer/CatalogRoomPreviewerView.tsx b/src/components/catalog/views/catalog-room-previewer/CatalogRoomPreviewerView.tsx index 24f2f073..e364b281 100644 --- a/src/components/catalog/views/catalog-room-previewer/CatalogRoomPreviewerView.tsx +++ b/src/components/catalog/views/catalog-room-previewer/CatalogRoomPreviewerView.tsx @@ -3,7 +3,7 @@ import { FC, useCallback, useRef } from 'react'; import { GetRoomEngine } from '../../../../api'; import { LayoutRoomPreviewerView, LayoutRoomPreviewerViewProps } from '../../../../common'; import { CatalogPurchasedEvent } from '../../../../events'; -import { UseUiEvent } from '../../../../hooks'; +import { useUiEvent } from '../../../../hooks'; export const CatalogRoomPreviewerView: FC = props => { @@ -39,7 +39,7 @@ export const CatalogRoomPreviewerView: FC = props animatePurchase(); }, [ animatePurchase ]); - UseUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, onCatalogPurchasedEvent); + useUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, onCatalogPurchasedEvent); return (
diff --git a/src/components/catalog/views/gift/CatalogGiftView.tsx b/src/components/catalog/views/gift/CatalogGiftView.tsx index 2da5ee13..a169a55c 100644 --- a/src/components/catalog/views/gift/CatalogGiftView.tsx +++ b/src/components/catalog/views/gift/CatalogGiftView.tsx @@ -1,13 +1,11 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { PurchaseFromCatalogAsGiftComposer } from '@nitrots/nitro-renderer'; +import { GiftReceiverNotFoundEvent, PurchaseFromCatalogAsGiftComposer } from '@nitrots/nitro-renderer'; import classNames from 'classnames'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { GetSessionDataManager, LocalizeText, SendMessageComposer } from '../../../../api'; +import { GetSessionDataManager, LocalizeText, ProductTypeEnum, SendMessageComposer } from '../../../../api'; import { Base, Button, ButtonGroup, Column, Flex, FormGroup, LayoutCurrencyIcon, LayoutFurniImageView, LayoutGiftTagView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { CatalogEvent, CatalogInitGiftEvent, CatalogPurchasedEvent } from '../../../../events'; -import { BatchUpdates, UseUiEvent } from '../../../../hooks'; -import { useCatalogContext } from '../../CatalogContext'; -import { ProductTypeEnum } from '../../common/ProductTypeEnum'; +import { useCatalog, useMessageEvent, useUiEvent } from '../../../../hooks'; export const CatalogGiftView: FC<{}> = props => { @@ -25,25 +23,22 @@ export const CatalogGiftView: FC<{}> = props => const [ maxBoxIndex, setMaxBoxIndex ] = useState(0); const [ maxRibbonIndex, setMaxRibbonIndex ] = useState(0); const [ receiverNotFound, setReceiverNotFound ] = useState(false); - const { catalogOptions = null } = useCatalogContext(); + const { catalogOptions = null } = useCatalog(); const { giftConfiguration = null } = catalogOptions; - const close = useCallback(() => + const onClose = useCallback(() => { - BatchUpdates(() => - { - setIsVisible(false); - setPageId(0); - setOfferId(0); - setExtraData(''); - setReceiverName(''); - setShowMyFace(true); - setMessage(''); - setSelectedBoxIndex(0); - setSelectedRibbonIndex(0); - - if(colors.length) setSelectedColorId(colors[0].id); - }); + setIsVisible(false); + setPageId(0); + setOfferId(0); + setExtraData(''); + setReceiverName(''); + setShowMyFace(true); + setMessage(''); + setSelectedBoxIndex(0); + setSelectedRibbonIndex(0); + + if(colors.length) setSelectedColorId(colors[0].id); }, [ colors ]); const onCatalogEvent = useCallback((event: CatalogEvent) => @@ -51,30 +46,23 @@ export const CatalogGiftView: FC<{}> = props => switch(event.type) { case CatalogPurchasedEvent.PURCHASE_SUCCESS: - close(); + onClose(); return; case CatalogEvent.INIT_GIFT: const castedEvent = (event as CatalogInitGiftEvent); - BatchUpdates(() => - { - close(); + onClose(); - setPageId(castedEvent.pageId); - setOfferId(castedEvent.offerId); - setExtraData(castedEvent.extraData); - setIsVisible(true); - }); - return; - case CatalogEvent.GIFT_RECEIVER_NOT_FOUND: - setReceiverNotFound(true); + setPageId(castedEvent.pageId); + setOfferId(castedEvent.offerId); + setExtraData(castedEvent.extraData); + setIsVisible(true); return; } - }, [ close ]); + }, [ onClose ]); - UseUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, onCatalogEvent); - UseUiEvent(CatalogEvent.INIT_GIFT, onCatalogEvent); - UseUiEvent(CatalogEvent.GIFT_RECEIVER_NOT_FOUND, onCatalogEvent); + useUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, onCatalogEvent); + useUiEvent(CatalogEvent.INIT_GIFT, onCatalogEvent); const isBoxDefault = useMemo(() => { @@ -125,6 +113,8 @@ export const CatalogGiftView: FC<{}> = props => } }, [ extraData, maxBoxIndex, maxRibbonIndex, message, offerId, pageId, receiverName, selectedBoxIndex, selectedColorId, selectedRibbonIndex, showMyFace ]); + useMessageEvent(GiftReceiverNotFoundEvent, event => setReceiverNotFound(true)); + useEffect(() => { setReceiverNotFound(false); @@ -142,20 +132,17 @@ export const CatalogGiftView: FC<{}> = props => if(!giftData) continue; - if(giftData.colors && giftData.colors.length > 0) newColors.push({ id: colorId, color: `#${giftData.colors[0].toString(16)}` }); + if(giftData.colors && giftData.colors.length > 0) newColors.push({ id: colorId, color: `#${ giftData.colors[0].toString(16) }` }); } - BatchUpdates(() => - { - setMaxBoxIndex(giftConfiguration.boxTypes.length - 1); - setMaxRibbonIndex(giftConfiguration.ribbonTypes.length - 1); + setMaxBoxIndex(giftConfiguration.boxTypes.length - 1); + setMaxRibbonIndex(giftConfiguration.ribbonTypes.length - 1); - if(newColors.length) - { - setSelectedColorId(newColors[0].id); - setColors(newColors); - } - }); + if(newColors.length) + { + setSelectedColorId(newColors[0].id); + setColors(newColors); + } }, [ giftConfiguration ]); if(!giftConfiguration || !giftConfiguration.isEnabled || !isVisible) return null; @@ -166,7 +153,7 @@ export const CatalogGiftView: FC<{}> = props => return ( - + { LocalizeText('catalog.gift_wrapping.receiver') } @@ -197,7 +184,7 @@ export const CatalogGiftView: FC<{}> = props => { LocalizeText(boxName) } - { LocalizeText(priceText, ['price'], [giftConfiguration.price.toString()]) } + { LocalizeText(priceText, [ 'price' ], [ giftConfiguration.price.toString() ]) } @@ -220,11 +207,11 @@ export const CatalogGiftView: FC<{}> = props => { LocalizeText('catalog.gift_wrapping.pick_color') } - { colors.map(color => } + + + { currentOffer.localizationName } + + + + + + + + + } + + + ); } diff --git a/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx index c47584d1..262685ae 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx @@ -1,10 +1,7 @@ import { FC } from 'react'; -import { Base } from '../../../../../common/Base'; -import { Column } from '../../../../../common/Column'; -import { Flex } from '../../../../../common/Flex'; -import { Grid } from '../../../../../common/Grid'; -import { Text } from '../../../../../common/Text'; -import { useCatalogContext } from '../../../CatalogContext'; +import { ProductTypeEnum } from '../../../../../api'; +import { Column, Flex, Grid, Text } from '../../../../../common'; +import { useCatalog } from '../../../../../hooks'; import { CatalogAddOnBadgeWidgetView } from '../widgets/CatalogAddOnBadgeWidgetView'; import { CatalogItemGridWidgetView } from '../widgets/CatalogItemGridWidgetView'; import { CatalogLimitedItemWidgetView } from '../widgets/CatalogLimitedItemWidgetView'; @@ -17,7 +14,7 @@ import { CatalogLayoutProps } from './CatalogLayout.types'; export const CatalogLayoutDefaultView: FC = props => { const { page = null } = props; - const { currentOffer = null } = useCatalogContext(); + const { currentOffer = null } = useCatalog(); return ( @@ -32,11 +29,15 @@ export const CatalogLayoutDefaultView: FC = props => } { currentOffer && <> - - - - - + + { (currentOffer.product.productType !== ProductTypeEnum.BADGE) && + <> + + + + } + { (currentOffer.product.productType === ProductTypeEnum.BADGE) && } + { currentOffer.localizationName } diff --git a/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx index 9016f004..cf129517 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx @@ -1,10 +1,6 @@ import { FC } from 'react'; -import { Base } from '../../../../../common/Base'; -import { Column } from '../../../../../common/Column'; -import { Flex } from '../../../../../common/Flex'; -import { Grid } from '../../../../../common/Grid'; -import { Text } from '../../../../../common/Text'; -import { useCatalogContext } from '../../../CatalogContext'; +import { Base, Column, Flex, Grid, Text } from '../../../../../common'; +import { useCatalog } from '../../../../../hooks'; import { CatalogGuildBadgeWidgetView } from '../widgets/CatalogGuildBadgeWidgetView'; import { CatalogGuildSelectorWidgetView } from '../widgets/CatalogGuildSelectorWidgetView'; import { CatalogItemGridWidgetView } from '../widgets/CatalogItemGridWidgetView'; @@ -16,7 +12,7 @@ import { CatalogLayoutProps } from './CatalogLayout.types'; export const CatalogLayouGuildCustomFurniView: FC = props => { const { page = null } = props; - const { currentOffer = null } = useCatalogContext(); + const { currentOffer = null } = useCatalog(); return ( diff --git a/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx index 2e63e14d..b5a89ca6 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx @@ -2,7 +2,7 @@ import { CatalogGroupsComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { SendMessageComposer } from '../../../../../api'; import { Base, Column, Flex, Grid, Text } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; +import { useCatalog } from '../../../../../hooks'; import { CatalogFirstProductSelectorWidgetView } from '../widgets/CatalogFirstProductSelectorWidgetView'; import { CatalogGuildSelectorWidgetView } from '../widgets/CatalogGuildSelectorWidgetView'; import { CatalogPurchaseWidgetView } from '../widgets/CatalogPurchaseWidgetView'; @@ -13,7 +13,7 @@ export const CatalogLayouGuildForumView: FC = props => { const { page = null } = props; const [ selectedGroupIndex, setSelectedGroupIndex ] = useState(0); - const { currentOffer = null, setCurrentOffer = null, catalogOptions = null } = useCatalogContext(); + const { currentOffer = null, setCurrentOffer = null, catalogOptions = null } = useCatalog(); const { groups = null } = catalogOptions; useEffect(() => diff --git a/src/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsx new file mode 100644 index 00000000..67724c81 --- /dev/null +++ b/src/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsx @@ -0,0 +1,92 @@ +import { GetRoomAdPurchaseInfoComposer, GetUserEventCatsMessageComposer, PurchaseRoomAdMessageComposer, RoomAdPurchaseInfoEvent, RoomEntryData, UserEventCatsEvent } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useState } from 'react'; +import { LocalizeText, SendMessageComposer } from '../../../../../api'; +import { Base, Button, Column, Text } from '../../../../../common'; +import { useMessageEvent } from '../../../../../hooks'; +import { CatalogLayoutProps } from './CatalogLayout.types'; + +export const CatalogLayoutRoomAdsView: FC = props => +{ + const { page = null } = props; + const [ eventName, setEventName ] = useState(''); + const [ eventDesc, setEventDesc ] = useState(''); + const [ roomId, setRoomId ] = useState(-1); + const [ availableRooms, setAvailableRooms ] = useState([]); + const [ extended, setExtended ] = useState(false); + const [ categoryId, setCategoryId ] = useState(1); + const [ categories, setCategories ] = useState(null); + + useMessageEvent(RoomAdPurchaseInfoEvent, event => + { + const parser = event.getParser(); + + if(!parser) return; + + setAvailableRooms(parser.rooms); + }); + + const purchaseAd = useCallback(() => + { + const pageId = page.pageId; + const offerId = page.offers.length >= 1 ? page.offers[0].offerId : -1; + const flatId = roomId; + const name = eventName; + const desc = eventDesc; + const catId = categoryId; + + SendMessageComposer(new PurchaseRoomAdMessageComposer(pageId, offerId, flatId, name, extended, desc, catId)) + }, [ categoryId, eventDesc, eventName, extended, page.offers, page.pageId, roomId ]); + + useMessageEvent(UserEventCatsEvent, event => + { + const parser = event.getParser(); + + setCategories(parser.categories); + }); + + useEffect(() => + { + SendMessageComposer(new GetRoomAdPurchaseInfoComposer()); + // TODO: someone needs to fix this for morningstar + SendMessageComposer(new GetUserEventCatsMessageComposer()); + }, []); + + return (<> + { LocalizeText('roomad.catalog_header') } + + { LocalizeText('roomad.catalog_text') } + + + + + + { LocalizeText('roomad.catalog_name') } + setEventName(event.target.value) } /> + + + < Text bold>{ LocalizeText('roomad.catalog_description') } + + { LocalizeText('friendlist.invite.note') } diff --git a/src/components/friends/views/friends-list/FriendsSearchView.tsx b/src/components/friends/views/friends-list/FriendsListSearchView.tsx similarity index 52% rename from src/components/friends/views/friends-list/FriendsSearchView.tsx rename to src/components/friends/views/friends-list/FriendsListSearchView.tsx index 30079e1d..69073a22 100644 --- a/src/components/friends/views/friends-list/FriendsSearchView.tsx +++ b/src/components/friends/views/friends-list/FriendsListSearchView.tsx @@ -1,9 +1,8 @@ import { HabboSearchComposer, HabboSearchResultData, HabboSearchResultEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import { LocalizeText, OpenMessengerChat, SendMessageComposer } from '../../../../api'; import { Base, Column, Flex, NitroCardAccordionItemView, NitroCardAccordionSetView, NitroCardAccordionSetViewProps, Text, UserProfileIconView } from '../../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../../hooks'; -import { useFriendsContext } from '../../FriendsContext'; +import { useFriends, useMessageEvent } from '../../../../hooks'; interface FriendsSearchViewProps extends NitroCardAccordionSetViewProps { @@ -16,20 +15,15 @@ export const FriendsSearchView: FC = props => const [ searchValue, setSearchValue ] = useState(''); const [ friendResults, setFriendResults ] = useState(null); const [ otherResults, setOtherResults ] = useState(null); - const { canRequestFriend = null, requestFriend = null } = useFriendsContext(); + const { canRequestFriend = null, requestFriend = null } = useFriends(); - const onHabboSearchResultEvent = useCallback((event: HabboSearchResultEvent) => + useMessageEvent(HabboSearchResultEvent, event => { const parser = event.getParser(); - BatchUpdates(() => - { - setFriendResults(parser.friends); - setOtherResults(parser.others); - }); - }, []); - - UseMessageEventHook(HabboSearchResultEvent, onHabboSearchResultEvent); + setFriendResults(parser.friends); + setOtherResults(parser.others); + }); useEffect(() => { @@ -59,20 +53,20 @@ export const FriendsSearchView: FC = props =>
{ friendResults.map(result => - { - return ( - - - -
{ result.avatarName }
-
- - { result.isAvatarOnline && - OpenMessengerChat(result.avatarId) } title={ LocalizeText('friendlist.tip.im') } /> } - -
- ) - }) } + { + return ( + + + +
{ result.avatarName }
+
+ + { result.isAvatarOnline && + OpenMessengerChat(result.avatarId) } title={ LocalizeText('friendlist.tip.im') } /> } + +
+ ) + }) }
} } @@ -86,20 +80,20 @@ export const FriendsSearchView: FC = props =>
{ otherResults.map(result => - { - return ( - - - -
{ result.avatarName }
-
- - { canRequestFriend(result.avatarId) && - requestFriend(result.avatarId, result.avatarName) } title={ LocalizeText('friendlist.tip.addfriend') } /> } - -
- ) - }) } + { + return ( + + + +
{ result.avatarName }
+
+ + { canRequestFriend(result.avatarId) && + requestFriend(result.avatarId, result.avatarName) } title={ LocalizeText('friendlist.tip.addfriend') } /> } + +
+ ) + }) }
} } diff --git a/src/components/friends/views/friends-list/FriendsListView.tsx b/src/components/friends/views/friends-list/FriendsListView.tsx index 33905847..d98e93a6 100644 --- a/src/components/friends/views/friends-list/FriendsListView.tsx +++ b/src/components/friends/views/friends-list/FriendsListView.tsx @@ -1,29 +1,21 @@ -import { RemoveFriendComposer, SendRoomInviteComposer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useMemo, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../../api'; +import { ILinkEventTracker, RemoveFriendComposer, SendRoomInviteComposer } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; +import { AddEventLinkTracker, LocalizeText, MessengerFriend, RemoveLinkEventTracker, SendMessageComposer } from '../../../../api'; import { Button, Flex, NitroCardAccordionSetView, NitroCardAccordionView, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; -import { MessengerFriend } from '../../common/MessengerFriend'; -import { MessengerRequest } from '../../common/MessengerRequest'; +import { useFriends } from '../../../../hooks'; import { FriendsListGroupView } from './friends-list-group/FriendsListGroupView'; import { FriendsListRequestView } from './friends-list-request/FriendsListRequestView'; -import { FriendsRemoveConfirmationView } from './FriendsRemoveConfirmationView'; -import { FriendsRoomInviteView } from './FriendsRoomInviteView'; -import { FriendsSearchView } from './FriendsSearchView'; +import { FriendsRemoveConfirmationView } from './FriendsListRemoveConfirmationView'; +import { FriendsRoomInviteView } from './FriendsListRoomInviteView'; +import { FriendsSearchView } from './FriendsListSearchView'; -interface FriendsListViewProps +export const FriendsListView: FC<{}> = props => { - onCloseClick: () => void; - onlineFriends: MessengerFriend[]; - offlineFriends: MessengerFriend[]; - friendRequests: MessengerRequest[]; -} - -export const FriendsListView: FC = props => -{ - const { onlineFriends = [], offlineFriends = [], friendRequests = [], onCloseClick = null } = props; + const [ isVisible, setIsVisible ] = useState(false); const [ selectedFriendsIds, setSelectedFriendsIds ] = useState([]); const [ showRoomInvite, setShowRoomInvite ] = useState(false); const [ showRemoveFriendsConfirmation, setShowRemoveFriendsConfirmation ] = useState(false); + const { onlineFriends = [], offlineFriends = [], requests = [], requestFriend = null } = useFriends(); const removeFriendsText = useMemo(() => { @@ -43,36 +35,37 @@ export const FriendsListView: FC = props => } return LocalizeText('friendlist.removefriendconfirm.userlist', [ 'user_names' ], [ userNames.join(', ') ]); - }, [offlineFriends, onlineFriends, selectedFriendsIds]); + }, [ offlineFriends, onlineFriends, selectedFriendsIds ]); const selectFriend = useCallback((userId: number) => { if(userId < 0) return; setSelectedFriendsIds(prevValue => + { + const newValue = [ ...prevValue ]; + + const existingUserIdIndex: number = newValue.indexOf(userId); + + if(existingUserIdIndex > -1) { - const newValue = [ ...prevValue ]; + newValue.splice(existingUserIdIndex, 1) + } + else + { + newValue.push(userId); + } - const existingUserIdIndex: number = newValue.indexOf(userId); - - if(existingUserIdIndex > -1) - { - newValue.splice(existingUserIdIndex, 1) - } - else - { - newValue.push(userId); - } - - return newValue; - }); + return newValue; + }); }, [ setSelectedFriendsIds ]); const sendRoomInvite = (message: string) => { - if(selectedFriendsIds.length === 0 || !message || message.length === 0) return; + if(!selectedFriendsIds.length || !message || !message.length || (message.length > 255)) return; - SendMessageComposer(new SendRoomInviteComposer(message, ...selectedFriendsIds)); + SendMessageComposer(new SendRoomInviteComposer(message, selectedFriendsIds)); + setShowRoomInvite(false); } @@ -81,28 +74,64 @@ export const FriendsListView: FC = props => if(selectedFriendsIds.length === 0) return; setSelectedFriendsIds(prevValue => - { - SendMessageComposer(new RemoveFriendComposer(...prevValue)); + { + SendMessageComposer(new RemoveFriendComposer(...prevValue)); - return []; - }); + return []; + }); setShowRemoveFriendsConfirmation(false); } + useEffect(() => + { + const linkTracker: ILinkEventTracker = { + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'show': + setIsVisible(true); + return; + case 'hide': + setIsVisible(false); + return; + case 'toggle': + setIsVisible(prevValue => !prevValue); + return; + case 'request': + if(parts.length < 4) return; + + requestFriend(parseInt(parts[2]), parts[3]); + } + }, + eventUrlPrefix: 'friends/' + }; + + AddEventLinkTracker(linkTracker); + + return () => RemoveLinkEventTracker(linkTracker); + }, [ requestFriend ]); + + if(!isVisible) return null; + return ( <> - + setIsVisible(false) } /> - + - + - + { selectedFriendsIds && selectedFriendsIds.length > 0 && diff --git a/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupItemView.tsx b/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupItemView.tsx index d1978a46..03cd7e98 100644 --- a/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupItemView.tsx +++ b/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupItemView.tsx @@ -1,26 +1,19 @@ -import { FollowFriendMessageComposer, SetRelationshipStatusComposer } from '@nitrots/nitro-renderer'; import { FC, MouseEvent, useState } from 'react'; -import { LocalizeText, OpenMessengerChat, SendMessageComposer } from '../../../../../api'; -import { Base, Flex, NitroCardAccordionItemView, NitroCardAccordionItemViewProps, UserProfileIconView } from '../../../../../common'; -import { MessengerFriend } from '../../../common/MessengerFriend'; +import { LocalizeText, MessengerFriend, OpenMessengerChat } from '../../../../../api'; +import { Base, Flex, NitroCardAccordionItemView, UserProfileIconView } from '../../../../../common'; +import { useFriends } from '../../../../../hooks'; -interface FriendsListGroupItemViewProps extends NitroCardAccordionItemViewProps +export const FriendsListGroupItemView: FC<{ friend: MessengerFriend, selected: boolean, selectFriend: (userId: number) => void }> = props => { - friend: MessengerFriend; - selected?: boolean; - selectFriend: () => void; -} - -export const FriendsListGroupItemView: FC = props => -{ - const { friend = null, selected = false, selectFriend = null, children = null, ...rest } = props; + const { friend = null, selected = false, selectFriend = null } = props; const [ isRelationshipOpen, setIsRelationshipOpen ] = useState(false); + const { followFriend = null, updateRelationship = null } = useFriends(); - const followFriend = (event: MouseEvent) => + const clickFollowFriend = (event: MouseEvent) => { event.stopPropagation(); - SendMessageComposer(new FollowFriendMessageComposer(friend.id)); + followFriend(friend); } const openMessengerChat = (event: MouseEvent) => @@ -37,11 +30,11 @@ export const FriendsListGroupItemView: FC = props setIsRelationshipOpen(true); } - const updateRelationship = (event: MouseEvent, type: number) => + const clickUpdateRelationship = (event: MouseEvent, type: number) => { event.stopPropagation(); - if(type !== friend.relationshipStatus) SendMessageComposer(new SetRelationshipStatusComposer(friend.id, type)); + updateRelationship(friend, type); setIsRelationshipOpen(false); } @@ -62,7 +55,7 @@ export const FriendsListGroupItemView: FC = props if(!friend) return null; return ( - + selectFriend(friend.id) }> event.stopPropagation() }> @@ -73,7 +66,7 @@ export const FriendsListGroupItemView: FC = props { !isRelationshipOpen && <> { friend.followingAllowed && - } + } { friend.online && } { (friend.id > 0) && @@ -81,13 +74,12 @@ export const FriendsListGroupItemView: FC = props } { isRelationshipOpen && <> - updateRelationship(event, MessengerFriend.RELATIONSHIP_HEART) } /> - updateRelationship(event, MessengerFriend.RELATIONSHIP_SMILE) } /> - updateRelationship(event, MessengerFriend.RELATIONSHIP_BOBBA) } /> - updateRelationship(event, MessengerFriend.RELATIONSHIP_NONE) } /> + clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_HEART) } /> + clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_SMILE) } /> + clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_BOBBA) } /> + clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_NONE) } /> } - { children } ); } diff --git a/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupView.tsx b/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupView.tsx index be5ef658..c593003a 100644 --- a/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupView.tsx +++ b/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupView.tsx @@ -1,5 +1,5 @@ import { FC } from 'react'; -import { MessengerFriend } from '../../../common/MessengerFriend'; +import { MessengerFriend } from '../../../../../api'; import { FriendsListGroupItemView } from './FriendsListGroupItemView'; interface FriendsListGroupViewProps @@ -17,8 +17,7 @@ export const FriendsListGroupView: FC = props => return ( <> - { list.map((item, index) => selectFriend(item.id) } />) } - - + { list.map((item, index) => = 0) } selectFriend={ selectFriend } />) } + ); } diff --git a/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestItemView.tsx b/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestItemView.tsx index 57a33e52..de5d3a3b 100644 --- a/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestItemView.tsx +++ b/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestItemView.tsx @@ -1,31 +1,25 @@ import { FC } from 'react'; -import { Base, Flex, NitroCardAccordionItemView, NitroCardAccordionItemViewProps, UserProfileIconView } from '../../../../../common'; -import { MessengerRequest } from '../../../common/MessengerRequest'; -import { useFriendsContext } from '../../../FriendsContext'; +import { MessengerRequest } from '../../../../../api'; +import { Base, Flex, NitroCardAccordionItemView, UserProfileIconView } from '../../../../../common'; +import { useFriends } from '../../../../../hooks'; -interface FriendsListRequestItemViewProps extends NitroCardAccordionItemViewProps +export const FriendsListRequestItemView: FC<{ request: MessengerRequest }> = props => { - request: MessengerRequest; -} - -export const FriendsListRequestItemView: FC = props => -{ - const { request = null, children = null, ...rest } = props; - const { acceptFriend = null, declineFriend = null } = useFriendsContext(); + const { request = null } = props; + const { requestResponse = null } = useFriends(); if(!request) return null; return ( - +
{ request.name }
- acceptFriend(request.requesterUserId) } /> - declineFriend(request.requesterUserId) } /> + requestResponse(request.id, true) } /> + requestResponse(request.id, false) } /> - { children }
); -}; +} diff --git a/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestView.tsx b/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestView.tsx index 7b99131f..5f6e9918 100644 --- a/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestView.tsx +++ b/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestView.tsx @@ -1,19 +1,13 @@ import { FC } from 'react'; import { LocalizeText } from '../../../../../api'; import { Button, Column, Flex, NitroCardAccordionSetView, NitroCardAccordionSetViewProps } from '../../../../../common'; -import { MessengerRequest } from '../../../common/MessengerRequest'; -import { useFriendsContext } from '../../../FriendsContext'; +import { useFriends } from '../../../../../hooks'; import { FriendsListRequestItemView } from './FriendsListRequestItemView'; -interface FriendsListRequestViewProps extends NitroCardAccordionSetViewProps +export const FriendsListRequestView: FC = props => { - requests: MessengerRequest[]; -} - -export const FriendsListRequestView: FC = props => -{ - const { requests = [], children = null, ...rest } = props; - const { declineFriend = null } = useFriendsContext(); + const { children = null, ...rest } = props; + const { requests = [], requestResponse = null } = useFriends(); if(!requests.length) return null; @@ -24,7 +18,7 @@ export const FriendsListRequestView: FC = props => { requests.map((request, index) => ) }
- diff --git a/src/components/friends/views/messenger/FriendsMessengerThreadGroup.tsx b/src/components/friends/views/messenger/FriendsMessengerThreadGroup.tsx deleted file mode 100644 index a9adf7d8..00000000 --- a/src/components/friends/views/messenger/FriendsMessengerThreadGroup.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { FC, useMemo } from 'react'; -import { GetSessionDataManager } from '../../../../api'; -import { Base, Flex, LayoutAvatarImageView } from '../../../../common'; -import { GroupType } from '../../common/GroupType'; -import { MessengerThread } from '../../common/MessengerThread'; -import { MessengerThreadChat } from '../../common/MessengerThreadChat'; -import { MessengerThreadChatGroup } from '../../common/MessengerThreadChatGroup'; -import { getGroupChatData } from '../../common/Utils'; - -interface FriendsMessengerThreadGroupProps -{ - thread: MessengerThread; - group: MessengerThreadChatGroup; -} - -export const FriendsMessengerThreadGroup: FC = props => -{ - const { thread = null, group = null } = props; - - const isOwnChat = useMemo(() => - { - if(!thread || !group) return false; - - if(group.type === GroupType.PRIVATE_CHAT && (group.userId === GetSessionDataManager().userId)) return true; - - if( (group.type === GroupType.GROUP_CHAT) && (group.chats.length && getGroupChatData(group.chats[0].extraData).userId === GetSessionDataManager().userId)) return true; - - return false; - }, [group, thread]); - - if(!thread || !group) return null; - - if(!group.userId) - { - return ( -
- { group.chats.map((chat, index) => - { - return ( - - { chat.type === MessengerThreadChat.SECURITY_NOTIFICATION && - - - { chat.message } - } - - ); - }) } -
- ); - } - - return ( - - - { (group.type === GroupType.PRIVATE_CHAT && !isOwnChat) && - - } - { (group.type === GroupType.GROUP_CHAT && !isOwnChat) && - - } - - - - { (isOwnChat) && GetSessionDataManager().userName } - { (!isOwnChat) && ((group.type === GroupType.GROUP_CHAT) ? getGroupChatData(group.chats[0].extraData).username : thread.participant.name) - } - - { group.chats.map((chat, index) =>{ chat.message }) } - - { (isOwnChat) && - - - } - - ); -} diff --git a/src/components/friends/views/messenger/FriendsMessengerThreadView.tsx b/src/components/friends/views/messenger/FriendsMessengerThreadView.tsx deleted file mode 100644 index 98e34965..00000000 --- a/src/components/friends/views/messenger/FriendsMessengerThreadView.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { FC } from 'react'; -import { MessengerThread } from '../../common/MessengerThread'; -import { FriendsMessengerThreadGroup } from './FriendsMessengerThreadGroup'; - -interface FriendsMessengerThreadViewProps -{ - thread: MessengerThread; -} - -export const FriendsMessengerThreadView: FC = props => -{ - const { thread = null } = props; - - return ( - <> - { (thread.groups.length > 0) && thread.groups.map((group, index) => - { - return ; - }) } - - ); -} diff --git a/src/components/friends/views/messenger/FriendsMessengerView.tsx b/src/components/friends/views/messenger/FriendsMessengerView.tsx index c56e282e..8e3e6c69 100644 --- a/src/components/friends/views/messenger/FriendsMessengerView.tsx +++ b/src/components/friends/views/messenger/FriendsMessengerView.tsx @@ -1,271 +1,122 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { FollowFriendMessageComposer, ILinkEventTracker, NewConsoleMessageEvent, RoomInviteEvent, SendMessageComposer as SendMessageComposerPacket } from '@nitrots/nitro-renderer'; -import { FC, KeyboardEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { AddEventLinkTracker, GetSessionDataManager, GetUserProfile, LocalizeText, PlaySound, RemoveLinkEventTracker, SendMessageComposer, SoundNames } from '../../../../api'; +import { FollowFriendMessageComposer, ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { FC, KeyboardEvent, useEffect, useRef, useState } from 'react'; +import { AddEventLinkTracker, GetSessionDataManager, GetUserProfile, LocalizeText, RemoveLinkEventTracker, ReportType, SendMessageComposer } from '../../../../api'; import { Base, Button, ButtonGroup, Column, Flex, Grid, LayoutAvatarImageView, LayoutBadgeImageView, LayoutGridItem, LayoutItemCountView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { FriendsMessengerIconEvent } from '../../../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook } from '../../../../hooks'; -import { MessengerThread } from '../../common/MessengerThread'; -import { MessengerThreadChat } from '../../common/MessengerThreadChat'; -import { useFriendsContext } from '../../FriendsContext'; -import { FriendsMessengerThreadView } from './FriendsMessengerThreadView'; +import { useHelp, useMessenger } from '../../../../hooks'; +import { FriendsMessengerThreadView } from './messenger-thread/FriendsMessengerThreadView'; export const FriendsMessengerView: FC<{}> = props => { - const [isVisible, setIsVisible] = useState(false); - const [messageThreads, setMessageThreads] = useState([]); - const [activeThreadIndex, setActiveThreadIndex] = useState(-1); - const [hiddenThreadIndexes, setHiddenThreadIndexes] = useState([]); - const [messageText, setMessageText] = useState(''); - const [updateValue, setUpdateValue] = useState({}); - const { friends = [] } = useFriendsContext(); + const [ isVisible, setIsVisible ] = useState(false); + const [ lastThreadId, setLastThreadId ] = useState(-1); + const [ messageText, setMessageText ] = useState(''); + const { visibleThreads = [], activeThread = null, getMessageThread = null, sendMessage = null, setActiveThreadId = null, closeThread = null } = useMessenger(); + const { report = null } = useHelp(); const messagesBox = useRef(); - const followFriend = useCallback(() => + const followFriend = () => (activeThread && activeThread.participant && SendMessageComposer(new FollowFriendMessageComposer(activeThread.participant.id))); + const openProfile = () => (activeThread && activeThread.participant && GetUserProfile(activeThread.participant.id)); + + const send = () => { - SendMessageComposer(new FollowFriendMessageComposer(messageThreads[activeThreadIndex].participant.id)); - }, [messageThreads, activeThreadIndex]); + if(!activeThread || !messageText.length) return; - const openProfile = useCallback(() => - { - GetUserProfile(messageThreads[activeThreadIndex].participant.id); - }, [messageThreads, activeThreadIndex]); + sendMessage(activeThread, GetSessionDataManager().userId, messageText); - const getFriend = useCallback((userId: number) => - { - return ((friends.find(friend => (friend.id === userId))) || null); - }, [friends]); + setMessageText(''); + } - const visibleThreads = useMemo(() => - { - return messageThreads.filter((thread, index) => - { - if(hiddenThreadIndexes.indexOf(index) >= 0) return false; - - return true; - }); - }, [messageThreads, hiddenThreadIndexes]); - - const getMessageThreadWithIndex = useCallback<(userId: number) => [number, MessengerThread]>((userId: number) => - { - if(messageThreads.length > 0) - { - for(let i = 0; i < messageThreads.length; i++) - { - const thread = messageThreads[i]; - - if(thread.participant && (thread.participant.id === userId)) - { - const hiddenIndex = hiddenThreadIndexes.indexOf(i); - - if(hiddenIndex >= 0) - { - setHiddenThreadIndexes(prevValue => - { - const newIndexes = [...prevValue]; - - newIndexes.splice(hiddenIndex, 1); - - return newIndexes; - }); - } - - return [i, thread]; - } - } - } - - const friend = getFriend(userId); - - if(!friend) return [-1, null]; - - const thread = new MessengerThread(friend); - const newThreads = [...messageThreads, thread]; - - setMessageThreads(newThreads); - - return [(newThreads.length - 1), thread]; - }, [messageThreads, hiddenThreadIndexes, getFriend]); - - const onNewConsoleMessageEvent = useCallback((event: NewConsoleMessageEvent) => - { - const parser = event.getParser(); - const [threadIndex, thread] = getMessageThreadWithIndex(parser.senderId); - - if((threadIndex === -1) || !thread) return; - - thread.addMessage(parser.senderId, parser.messageText, parser.secondsSinceSent, parser.extraData); - - setMessageThreads(prevValue => [...prevValue]); - }, [getMessageThreadWithIndex]); - - UseMessageEventHook(NewConsoleMessageEvent, onNewConsoleMessageEvent); - - const onRoomInviteEvent = useCallback((event: RoomInviteEvent) => - { - const parser = event.getParser(); - - const [threadIndex, thread] = getMessageThreadWithIndex(parser.senderId); - - if((threadIndex === -1) || !thread) return; - - thread.addMessage(parser.senderId, parser.messageText, 0, null, MessengerThreadChat.ROOM_INVITE); - - setMessageThreads(prevValue => [...prevValue]); - }, [getMessageThreadWithIndex]); - - UseMessageEventHook(RoomInviteEvent, onRoomInviteEvent); - - const sendMessage = useCallback(() => - { - if(!messageText || !messageText.length) return; - - if(activeThreadIndex === -1) return; - - const thread = messageThreads[activeThreadIndex]; - - if(!thread) return; - - SendMessageComposer(new SendMessageComposerPacket(thread.participant.id, messageText)); - - if(messageThreads.length === 1 && thread.groups.length === 1) PlaySound(SoundNames.MESSENGER_NEW_THREAD); - - thread.addMessage(GetSessionDataManager().userId, messageText, 0, null, MessengerThreadChat.CHAT); - - BatchUpdates(() => - { - setMessageThreads(prevValue => [...prevValue]); - setMessageText(''); - }); - }, [messageThreads, activeThreadIndex, messageText]); - - const onKeyDown = useCallback((event: KeyboardEvent) => + const onKeyDown = (event: KeyboardEvent) => { if(event.key !== 'Enter') return; - sendMessage(); - }, [sendMessage]); - - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 3) return; - - if(parts[2] === 'open') - { - setIsVisible(true); - - return; - } - - const [threadIndex] = getMessageThreadWithIndex(parseInt(parts[2])); - - if(threadIndex === -1) return; - - BatchUpdates(() => - { - setActiveThreadIndex(threadIndex); - setIsVisible(true); - }); - }, [getMessageThreadWithIndex]); - - const closeThread = useCallback((threadIndex: number) => - { - setHiddenThreadIndexes(prevValue => - { - const values = [...prevValue]; - - if(values.indexOf(threadIndex) === -1) values.push(threadIndex); - - return values; - }); - }, []); + send(); + } useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, - eventUrlPrefix: 'friends/messenger/' + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length === 2) + { + if(parts[1] === 'open') + { + setIsVisible(true); + + return; + } + + if(parts[1] === 'toggle') + { + setIsVisible(prevValue => !prevValue); + + return; + } + + const thread = getMessageThread(parseInt(parts[1])); + + if(!thread) return; + + setActiveThreadId(thread.threadId); + setIsVisible(true); + } + }, + eventUrlPrefix: 'friends-messenger/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [linkReceived]); + }, [ getMessageThread, setActiveThreadId ]); useEffect(() => { - if(!isVisible) return; + if(!isVisible || !activeThread) return; - if(activeThreadIndex === -1) setActiveThreadIndex(0); - }, [isVisible, activeThreadIndex]); + messagesBox.current.scrollTop = messagesBox.current.scrollHeight; + }, [ isVisible, activeThread ]); useEffect(() => { - if(hiddenThreadIndexes.indexOf(activeThreadIndex) >= 0) setActiveThreadIndex(0); - }, [activeThreadIndex, hiddenThreadIndexes]); - - useEffect(() => - { - if(!isVisible || (activeThreadIndex === -1)) return; - - const activeThread = messageThreads[activeThreadIndex]; - - if(!activeThread) return; - - if(activeThread.unread) + if(isVisible && !activeThread) { - messagesBox.current.scrollTop = messagesBox.current.scrollHeight; - activeThread.setRead(); - setUpdateValue({}); - } - }, [isVisible, messageThreads, activeThreadIndex]); - - useEffect(() => - { - if(!visibleThreads.length) - { - setIsVisible(false); - - DispatchUiEvent(new FriendsMessengerIconEvent(FriendsMessengerIconEvent.UPDATE_ICON, FriendsMessengerIconEvent.HIDE_ICON)); + if(lastThreadId > 0) + { + setActiveThreadId(lastThreadId); + } + else + { + if(visibleThreads.length > 0) setActiveThreadId(visibleThreads[0].threadId); + } return; } - let isUnread = false; - - for(const thread of visibleThreads) + if(!isVisible && activeThread) { - if(thread.unreadCount > 0) - { - isUnread = true; - - break; - } + setLastThreadId(activeThread.threadId); + setActiveThreadId(-1); } - - if(isUnread) PlaySound(SoundNames.MESSENGER_MESSAGE_RECEIVED); - - DispatchUiEvent(new FriendsMessengerIconEvent(FriendsMessengerIconEvent.UPDATE_ICON, isUnread ? FriendsMessengerIconEvent.UNREAD_ICON : FriendsMessengerIconEvent.SHOW_ICON)); - }, [visibleThreads, updateValue]); + }, [ isVisible, activeThread, lastThreadId, visibleThreads, setActiveThreadId ]); if(!isVisible) return null; return ( - setIsVisible(false)} /> + setIsVisible(false) } /> { LocalizeText('toolbar.icon.label.messenger') } - { visibleThreads && (visibleThreads.length > 0) && visibleThreads.map((thread, index) => + { visibleThreads && (visibleThreads.length > 0) && visibleThreads.map(thread => { - const messageThreadIndex = messageThreads.indexOf(thread); - return ( - setActiveThreadIndex(messageThreadIndex) }> + setActiveThreadId(thread.threadId) }> { thread.unread && } @@ -279,13 +130,13 @@ export const FriendsMessengerView: FC<{}> = props => ); - })} + }) } - { visibleThreads && (visibleThreads.length > 0) && (activeThreadIndex >= 0) && + { activeThread && <> - { LocalizeText('messenger.window.separator', [ 'FRIEND_NAME' ], [ messageThreads[activeThreadIndex].participant.name ]) } + { LocalizeText('messenger.window.separator', [ 'FRIEND_NAME' ], [ activeThread.participant.name ]) } @@ -296,22 +147,22 @@ export const FriendsMessengerView: FC<{}> = props => - - - + - setMessageText(event.target.value) } onKeyDown={ onKeyDown } /> - diff --git a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx new file mode 100644 index 00000000..ad3d755b --- /dev/null +++ b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx @@ -0,0 +1,72 @@ +import { FC, useMemo } from 'react'; +import { GetGroupChatData, GetSessionDataManager, LocalizeText, MessengerGroupType, MessengerThread, MessengerThreadChat, MessengerThreadChatGroup } from '../../../../../api'; +import { Base, Flex, LayoutAvatarImageView } from '../../../../../common'; + +export const FriendsMessengerThreadGroup: FC<{ thread: MessengerThread, group: MessengerThreadChatGroup }> = props => +{ + const { thread = null, group = null } = props; + + const groupChatData = useMemo(() => ((group.type === MessengerGroupType.GROUP_CHAT) && GetGroupChatData(group.chats[0].extraData)), [ group ]); + + const isOwnChat = useMemo(() => + { + if(!thread || !group) return false; + + if((group.type === MessengerGroupType.PRIVATE_CHAT) && (group.userId === GetSessionDataManager().userId)) return true; + + if(groupChatData && group.chats.length && (groupChatData.userId === GetSessionDataManager().userId)) return true; + + return false; + }, [ thread, group, groupChatData ]); + + if(!thread || !group) return null; + + if(!group.userId) + { + return ( + <> + { group.chats.map((chat, index) => + { + return ( + + + { (chat.type === MessengerThreadChat.SECURITY_NOTIFICATION) && + + + { chat.message } + } + { (chat.type === MessengerThreadChat.ROOM_INVITE) && + + + { (LocalizeText('messenger.invitation') + ' ') }{ chat.message } + } + + + ); + }) } + + ); + } + + return ( + + + { ((group.type === MessengerGroupType.PRIVATE_CHAT) && !isOwnChat) && + } + { (groupChatData && !isOwnChat) && + } + + + + { isOwnChat && GetSessionDataManager().userName } + { !isOwnChat && (groupChatData ? groupChatData.username : thread.participant.name) } + + { group.chats.map((chat, index) => { chat.message }) } + + { isOwnChat && + + + } + + ); +} diff --git a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx new file mode 100644 index 00000000..962a6682 --- /dev/null +++ b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx @@ -0,0 +1,16 @@ +import { FC } from 'react'; +import { MessengerThread } from '../../../../../api'; +import { FriendsMessengerThreadGroup } from './FriendsMessengerThreadGroup'; + +export const FriendsMessengerThreadView: FC<{ thread: MessengerThread }> = props => +{ + const { thread = null } = props; + + thread.setRead(); + + return ( + <> + { (thread.groups.length > 0) && thread.groups.map((group, index) => ) } + + ); +} diff --git a/src/components/groups/GroupsContext.tsx b/src/components/groups/GroupsContext.tsx deleted file mode 100644 index 7a19e688..00000000 --- a/src/components/groups/GroupsContext.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { createContext, Dispatch, FC, ProviderProps, SetStateAction, useContext } from 'react'; -import { IGroupCustomize } from './common/IGroupCustomize'; - -interface IGroupsContext -{ - groupCustomize: IGroupCustomize; - setGroupCustomize: Dispatch>; -} - -const GroupsContext = createContext({ - groupCustomize: null, - setGroupCustomize: null -}); - -export const GroupsContextProvider: FC> = props => -{ - return { props.children } -} - -export const useGroupsContext = () => useContext(GroupsContext); diff --git a/src/components/groups/GroupsView.tsx b/src/components/groups/GroupsView.tsx index 224fbc20..bbaee28b 100644 --- a/src/components/groups/GroupsView.tsx +++ b/src/components/groups/GroupsView.tsx @@ -1,10 +1,7 @@ -import { GroupBadgePartsComposer, GroupBadgePartsEvent, GroupPurchasedEvent, GroupSettingsComposer, ILinkEventTracker } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { GroupPurchasedEvent, GroupSettingsComposer, ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; import { AddEventLinkTracker, RemoveLinkEventTracker, SendMessageComposer, TryVisitRoom } from '../../api'; -import { UseMessageEventHook } from '../../hooks'; -import { CompareId } from './common/CompareId'; -import { IGroupCustomize } from './common/IGroupCustomize'; -import { GroupsContextProvider } from './GroupsContext'; +import { useGroup, useMessageEvent } from '../../hooks'; import { GroupCreatorView } from './views/GroupCreatorView'; import { GroupInformationStandaloneView } from './views/GroupInformationStandaloneView'; import { GroupManagerView } from './views/GroupManagerView'; @@ -13,94 +10,54 @@ import { GroupMembersView } from './views/GroupMembersView'; export const GroupsView: FC<{}> = props => { const [ isCreatorVisible, setCreatorVisible ] = useState(false); - const [ groupCustomize, setGroupCustomize ] = useState(null); + const {} = useGroup(); - const onGroupPurchasedEvent = useCallback((event: GroupPurchasedEvent) => + useMessageEvent(GroupPurchasedEvent, event => { const parser = event.getParser(); setCreatorVisible(false); TryVisitRoom(parser.roomId); - }, []); - - UseMessageEventHook(GroupPurchasedEvent, onGroupPurchasedEvent); - - const onGroupBadgePartsEvent = useCallback((event: GroupBadgePartsEvent) => - { - const parser = event.getParser(); - - const customize: IGroupCustomize = { - badgeBases: [], - badgeSymbols: [], - badgePartColors: [], - groupColorsA: [], - groupColorsB: [] - }; - - parser.bases.forEach((images, id) => customize.badgeBases.push({ id, images })); - parser.symbols.forEach((images, id) => customize.badgeSymbols.push({ id, images })); - parser.partColors.forEach((color, id) => customize.badgePartColors.push({ id, color })); - parser.colorsA.forEach((color, id) => customize.groupColorsA.push({ id, color })); - parser.colorsB.forEach((color, id) => customize.groupColorsB.push({ id, color })); - - customize.badgeBases.sort(CompareId); - customize.badgeSymbols.sort(CompareId); - customize.badgePartColors.sort(CompareId); - customize.groupColorsA.sort(CompareId); - customize.groupColorsB.sort(CompareId); - - setGroupCustomize(customize); - }, [ setGroupCustomize ]); - - UseMessageEventHook(GroupBadgePartsEvent, onGroupBadgePartsEvent); - - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'create': - setCreatorVisible(true); - return; - case 'manage': - if(!parts[2]) return; - - setCreatorVisible(false); - SendMessageComposer(new GroupSettingsComposer(Number(parts[2]))); - return; - } - }, []); + }); useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'create': + setCreatorVisible(true); + return; + case 'manage': + if(!parts[2]) return; + + setCreatorVisible(false); + SendMessageComposer(new GroupSettingsComposer(Number(parts[2]))); + return; + } + }, eventUrlPrefix: 'groups/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); - - useEffect(() => - { - SendMessageComposer(new GroupBadgePartsComposer()); }, []); return ( - -
- { isCreatorVisible && - setCreatorVisible(false) } /> } - { !isCreatorVisible && - } - - -
-
+ <> + { isCreatorVisible && + setCreatorVisible(false) } /> } + { !isCreatorVisible && + } + + + ); }; diff --git a/src/components/groups/common/CompareId.ts b/src/components/groups/common/CompareId.ts deleted file mode 100644 index c6fdda40..00000000 --- a/src/components/groups/common/CompareId.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const CompareId = (a, b) => -{ - if(a.id < b.id) return -1; - - if(a.id > b.id) return 1; - - return 0; -} diff --git a/src/components/groups/views/GroupBadgeCreatorView.tsx b/src/components/groups/views/GroupBadgeCreatorView.tsx index 04d7b864..45d5d7bc 100644 --- a/src/components/groups/views/GroupBadgeCreatorView.tsx +++ b/src/components/groups/views/GroupBadgeCreatorView.tsx @@ -1,8 +1,8 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { Dispatch, FC, SetStateAction, useState } from 'react'; +import { GroupBadgePart } from '../../../api'; import { Base, Column, Flex, Grid, LayoutBadgeImageView } from '../../../common'; -import { GroupBadgePart } from '../common/GroupBadgePart'; -import { useGroupsContext } from '../GroupsContext'; +import { useGroup } from '../../../hooks'; interface GroupBadgeCreatorViewProps { @@ -16,7 +16,7 @@ export const GroupBadgeCreatorView: FC = props => { const { badgeParts = [], setBadgeParts = null } = props; const [ selectedIndex, setSelectedIndex ] = useState(-1); - const { groupCustomize = null } = useGroupsContext(); + const { groupCustomize = null } = useGroup(); const setPartProperty = (partIndex: number, property: string, value: number) => { @@ -34,33 +34,33 @@ export const GroupBadgeCreatorView: FC = props => return ( <> { ((selectedIndex < 0) && badgeParts && (badgeParts.length > 0)) && badgeParts.map((part, index) => - { - return ( - - setSelectedIndex(index) }> - { (badgeParts[index].code && (badgeParts[index].code.length > 0)) && + { + return ( + + setSelectedIndex(index) }> + { (badgeParts[index].code && (badgeParts[index].code.length > 0)) && } - { (!badgeParts[index].code || !badgeParts[index].code.length) && - - - } - - { (part.type !== GroupBadgePart.BASE) && - - { POSITIONS.map((position, posIndex) => - { - return setPartProperty(index, 'position', position) }> - }) } - } - - { (groupCustomize.badgePartColors.length > 0) && groupCustomize.badgePartColors.map((item, colorIndex) => - { - return setPartProperty(index, 'color', (colorIndex + 1)) }> - }) } - + { (!badgeParts[index].code || !badgeParts[index].code.length) && + + + } - ); - }) } + { (part.type !== GroupBadgePart.BASE) && + + { POSITIONS.map((position, posIndex) => + { + return setPartProperty(index, 'position', position) }> + }) } + } + + { (groupCustomize.badgePartColors.length > 0) && groupCustomize.badgePartColors.map((item, colorIndex) => + { + return setPartProperty(index, 'color', (colorIndex + 1)) }> + }) } + + + ); + }) } { (selectedIndex >= 0) && { (badgeParts[selectedIndex].type === GroupBadgePart.SYMBOL) && @@ -70,13 +70,13 @@ export const GroupBadgeCreatorView: FC = props =>
} { ((badgeParts[selectedIndex].type === GroupBadgePart.BASE) ? groupCustomize.badgeBases : groupCustomize.badgeSymbols).map((item, index) => - { - return ( - setPartProperty(selectedIndex, 'key', item.id) }> - - - ); - }) } + { + return ( + setPartProperty(selectedIndex, 'key', item.id) }> + + + ); + }) }
} ); diff --git a/src/components/groups/views/GroupCreatorView.tsx b/src/components/groups/views/GroupCreatorView.tsx index 059e71f1..cd64ef3a 100644 --- a/src/components/groups/views/GroupCreatorView.tsx +++ b/src/components/groups/views/GroupCreatorView.tsx @@ -1,9 +1,8 @@ import { GroupBuyComposer, GroupBuyDataComposer, GroupBuyDataEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { HasHabboClub, LocalizeText, SendMessageComposer } from '../../../api'; +import { FC, useEffect, useState } from 'react'; +import { HasHabboClub, IGroupData, LocalizeText, SendMessageComposer } from '../../../api'; import { Base, Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../hooks'; -import { IGroupData } from '../common/IGroupData'; +import { useMessageEvent } from '../../../hooks'; import { GroupTabBadgeView } from './tabs/GroupTabBadgeView'; import { GroupTabColorsView } from './tabs/GroupTabColorsView'; import { GroupTabCreatorConfirmationView } from './tabs/GroupTabCreatorConfirmationView'; @@ -25,7 +24,7 @@ export const GroupCreatorView: FC = props => const [ availableRooms, setAvailableRooms ] = useState<{ id: number, name: string }[]>(null); const [ purchaseCost, setPurchaseCost ] = useState(0); - const close = () => + const onCloseClose = () => { setCloseAction(null); setGroupData(null); @@ -86,7 +85,7 @@ export const GroupCreatorView: FC = props => setCurrentTab(value => (value === 4 ? value : value + 1)); } - const onGroupBuyDataEvent = useCallback((event: GroupBuyDataEvent) => + useMessageEvent(GroupBuyDataEvent, event => { const parser = event.getParser(); @@ -94,31 +93,23 @@ export const GroupCreatorView: FC = props => parser.availableRooms.forEach((name, id) => rooms.push({ id, name })); - BatchUpdates(() => - { - setAvailableRooms(rooms); - setPurchaseCost(parser.groupCost); - }); - }, []); - - UseMessageEventHook(GroupBuyDataEvent, onGroupBuyDataEvent); + setAvailableRooms(rooms); + setPurchaseCost(parser.groupCost); + }); useEffect(() => { - BatchUpdates(() => - { - setCurrentTab(1); + setCurrentTab(1); - setGroupData({ - groupId: -1, - groupName: null, - groupDescription: null, - groupHomeroomId: -1, - groupState: 1, - groupCanMembersDecorate: true, - groupColors: null, - groupBadgeParts: null - }); + setGroupData({ + groupId: -1, + groupName: null, + groupDescription: null, + groupHomeroomId: -1, + groupState: 1, + groupCanMembersDecorate: true, + groupColors: null, + groupBadgeParts: null }); SendMessageComposer(new GroupBuyDataComposer()); @@ -128,21 +119,21 @@ export const GroupCreatorView: FC = props => return ( - + { TABS.map((tab, index) => - { - return ( - - { LocalizeText(`group.create.steplabel.${ tab }`) } - - ); - }) } + { + return ( + + { LocalizeText(`group.create.steplabel.${ tab }`) } + + ); + }) } - + { LocalizeText(`group.create.stepcaption.${ currentTab }`) } { LocalizeText(`group.create.stepdesc.${ currentTab }`) } @@ -150,7 +141,7 @@ export const GroupCreatorView: FC = props => { (currentTab === 1) && - } + } { (currentTab === 2) && } { (currentTab === 3) && diff --git a/src/components/groups/views/GroupInformationStandaloneView.tsx b/src/components/groups/views/GroupInformationStandaloneView.tsx index 89be7dcf..d4206d7f 100644 --- a/src/components/groups/views/GroupInformationStandaloneView.tsx +++ b/src/components/groups/views/GroupInformationStandaloneView.tsx @@ -1,22 +1,20 @@ import { GroupInformationEvent, GroupInformationParser } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; +import { FC, useState } from 'react'; import { LocalizeText } from '../../../api'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../common'; -import { UseMessageEventHook } from '../../../hooks'; +import { useMessageEvent } from '../../../hooks'; import { GroupInformationView } from './GroupInformationView'; export const GroupInformationStandaloneView: FC<{}> = props => { const [ groupInformation, setGroupInformation ] = useState(null); - const onGroupInformationEvent = useCallback((event: GroupInformationEvent) => + useMessageEvent(GroupInformationEvent, event => { const parser = event.getParser(); if((groupInformation && (groupInformation.id === parser.id)) || parser.flag) setGroupInformation(parser); - }, [ groupInformation ]); - - UseMessageEventHook(GroupInformationEvent, onGroupInformationEvent); + }); if(!groupInformation) return null; diff --git a/src/components/groups/views/GroupInformationView.tsx b/src/components/groups/views/GroupInformationView.tsx index 51ffceb7..ce7469e5 100644 --- a/src/components/groups/views/GroupInformationView.tsx +++ b/src/components/groups/views/GroupInformationView.tsx @@ -1,10 +1,8 @@ import { GroupInformationParser, GroupRemoveMemberComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; -import { CreateLinkEvent, GetGroupManager, GetGroupMembers, GetSessionDataManager, LocalizeText, NotificationUtilities, SendMessageComposer, TryJoinGroup, TryVisitRoom } from '../../../api'; +import { CatalogPageName, CreateLinkEvent, GetGroupManager, GetGroupMembers, GetSessionDataManager, GroupMembershipType, GroupType, LocalizeText, SendMessageComposer, TryJoinGroup, TryVisitRoom } from '../../../api'; import { Button, Column, Flex, Grid, GridProps, LayoutBadgeImageView, Text } from '../../../common'; -import { CatalogPageName } from '../../catalog/common/CatalogPageName'; -import { GroupMembershipType } from '../common/GroupMembershipType'; -import { GroupType } from '../common/GroupType'; +import { useNotification } from '../../../hooks'; const STATES: string[] = [ 'regular', 'exclusive', 'private' ]; @@ -17,20 +15,21 @@ interface GroupInformationViewProps extends GridProps export const GroupInformationView: FC = props => { - const { groupInformation = null, onClose = null, overflow = 'hidden', ...rest } = props; + const { groupInformation = null, onClose = null, overflow = 'hidden', ...rest } = props; + const { showConfirm = null } = useNotification(); const isRealOwner = (groupInformation && (groupInformation.ownerName === GetSessionDataManager().userName)); - + const joinGroup = () => (groupInformation && TryJoinGroup(groupInformation.id)); const leaveGroup = () => { - NotificationUtilities.confirm(LocalizeText('group.leaveconfirm.desc'), () => - { - SendMessageComposer(new GroupRemoveMemberComposer(groupInformation.id, GetSessionDataManager().userId)); + showConfirm(LocalizeText('group.leaveconfirm.desc'), () => + { + SendMessageComposer(new GroupRemoveMemberComposer(groupInformation.id, GetSessionDataManager().userId)); - if(onClose) onClose(); - }, null); + if(onClose) onClose(); + }, null); } const getRoleIcon = () => @@ -69,7 +68,7 @@ export const GroupInformationView: FC = props => return; } - + joinGroup(); } @@ -92,9 +91,12 @@ export const GroupInformationView: FC = props => case 'furniture': CreateLinkEvent('catalog/open/' + CatalogPageName.GUILD_CUSTOM_FURNI); break; + case 'popular_groups': + CreateLinkEvent('navigator/search/groups'); + break; } }, [ groupInformation ]); - + if(!groupInformation) return null; return ( @@ -118,12 +120,12 @@ export const GroupInformationView: FC = props => { groupInformation.title } - + { groupInformation.canMembersDecorate && } - { LocalizeText('group.created', ['date', 'owner'], [groupInformation.createdAt, groupInformation.ownerName]) } + { LocalizeText('group.created', [ 'date', 'owner' ], [ groupInformation.createdAt, groupInformation.ownerName ]) } { groupInformation.description } @@ -131,9 +133,9 @@ export const GroupInformationView: FC = props => handleAction('homeroom') }>{ LocalizeText('group.linktobase') } handleAction('furniture') }>{ LocalizeText('group.buyfurni') } - { LocalizeText('group.showgroups') } + handleAction('popular_groups') }>{ LocalizeText('group.showgroups') } - { (groupInformation.type !== GroupType.PRIVATE) && + { (groupInformation.type !== GroupType.PRIVATE) && } diff --git a/src/components/groups/views/GroupManagerView.tsx b/src/components/groups/views/GroupManagerView.tsx index 4d23e8af..9e1d6254 100644 --- a/src/components/groups/views/GroupManagerView.tsx +++ b/src/components/groups/views/GroupManagerView.tsx @@ -1,9 +1,8 @@ import { GroupBadgePart, GroupInformationEvent, GroupSettingsEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { LocalizeText } from '../../../api'; +import { FC, useState } from 'react'; +import { IGroupData, LocalizeText } from '../../../api'; import { Base, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../common'; -import { UseMessageEventHook } from '../../../hooks'; -import { IGroupData } from '../common/IGroupData'; +import { useMessageEvent } from '../../../hooks'; import { GroupTabBadgeView } from './tabs/GroupTabBadgeView'; import { GroupTabColorsView } from './tabs/GroupTabColorsView'; import { GroupTabIdentityView } from './tabs/GroupTabIdentityView'; @@ -17,14 +16,14 @@ export const GroupManagerView: FC<{}> = props => const [ closeAction, setCloseAction ] = useState<{ action: () => boolean }>(null); const [ groupData, setGroupData ] = useState(null); - const close = () => + const onClose = () => { setCloseAction(prevValue => - { - if(prevValue && prevValue.action) prevValue.action(); + { + if(prevValue && prevValue.action) prevValue.action(); - return null; - }); + return null; + }); setGroupData(null); } @@ -36,28 +35,26 @@ export const GroupManagerView: FC<{}> = props => setCurrentTab(tab); } - const onGroupInformationEvent = useCallback((event: GroupInformationEvent) => + useMessageEvent(GroupInformationEvent, event => { const parser = event.getParser(); if(!groupData || (groupData.groupId !== parser.id)) return; setGroupData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.groupName = parser.title; - newValue.groupDescription = parser.description; - newValue.groupState = parser.type; - newValue.groupCanMembersDecorate = parser.canMembersDecorate; + newValue.groupName = parser.title; + newValue.groupDescription = parser.description; + newValue.groupState = parser.type; + newValue.groupCanMembersDecorate = parser.canMembersDecorate; - return newValue; - }); - }, [ groupData ]); + return newValue; + }); + }); - UseMessageEventHook(GroupInformationEvent, onGroupInformationEvent); - - const onGroupSettingsEvent = useCallback((event: GroupSettingsEvent) => + useMessageEvent(GroupSettingsEvent, event => { const parser = event.getParser(); @@ -83,39 +80,37 @@ export const GroupManagerView: FC<{}> = props => groupColors: [ parser.colorA, parser.colorB ], groupBadgeParts }); - }, [ setGroupData ]); - - UseMessageEventHook(GroupSettingsEvent, onGroupSettingsEvent); + }); if(!groupData || (groupData.groupId <= 0)) return null; return ( - + { TABS.map(tab => - { - return ( changeTab(tab) }> - { LocalizeText(`group.edit.tab.${tab}`) } - ); - }) } + { + return ( changeTab(tab) }> + { LocalizeText(`group.edit.tab.${ tab }`) } + ); + }) } - + { LocalizeText(`group.edit.tabcaption.${ currentTab }`) } { LocalizeText(`group.edit.tabdesc.${ currentTab }`) } - { currentTab === 1 && - } - { currentTab === 2 && + { (currentTab === 1) && + } + { (currentTab === 2) && } - { currentTab === 3 && + { (currentTab === 3) && } - { currentTab === 5 && + { (currentTab === 5) && } diff --git a/src/components/groups/views/GroupMembersView.tsx b/src/components/groups/views/GroupMembersView.tsx index 5bafa369..a7e97abc 100644 --- a/src/components/groups/views/GroupMembersView.tsx +++ b/src/components/groups/views/GroupMembersView.tsx @@ -1,9 +1,9 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { GroupAdminGiveComposer, GroupAdminTakeComposer, GroupConfirmMemberRemoveEvent, GroupConfirmRemoveMemberComposer, GroupMemberParser, GroupMembersComposer, GroupMembersEvent, GroupMembershipAcceptComposer, GroupMembershipDeclineComposer, GroupMembersParser, GroupRank, GroupRemoveMemberComposer, ILinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { AddEventLinkTracker, GetSessionDataManager, GetUserProfile, LocalizeText, NotificationUtilities, RemoveLinkEventTracker, SendMessageComposer } from '../../../api'; +import { AddEventLinkTracker, GetSessionDataManager, GetUserProfile, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../../api'; import { Base, Button, Column, Flex, Grid, LayoutAvatarImageView, LayoutBadgeImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../hooks'; +import { useMessageEvent, useNotification } from '../../../hooks'; export const GroupMembersView: FC<{}> = props => { @@ -14,6 +14,7 @@ export const GroupMembersView: FC<{}> = props => const [ totalPages, setTotalPages ] = useState(0); const [ searchQuery, setSearchQuery ] = useState(''); const [ removingMemberName, setRemovingMemberName ] = useState(null); + const { showConfirm = null } = useNotification(); const getRankDescription = (member: GroupMemberParser) => { @@ -72,63 +73,52 @@ export const GroupMembersView: FC<{}> = props => SendMessageComposer(new GroupConfirmRemoveMemberComposer(membersData.groupId, member.id)); } - const onGroupMembersEvent = useCallback((event: GroupMembersEvent) => + useMessageEvent(GroupMembersEvent, event => { const parser = event.getParser(); - BatchUpdates(() => + setMembersData(parser); + setLevelId(parser.level); + setTotalPages(Math.ceil(parser.totalMembersCount / parser.pageSize)); + }); + + useMessageEvent(GroupConfirmMemberRemoveEvent, event => + { + const parser = event.getParser(); + + showConfirm(LocalizeText(((parser.furnitureCount > 0) ? 'group.kickconfirm.desc' : 'group.kickconfirm_nofurni.desc'), [ 'user', 'amount' ], [ removingMemberName, parser.furnitureCount.toString() ]), () => { - setMembersData(parser); - setLevelId(parser.level); - setTotalPages(Math.ceil(parser.totalMembersCount / parser.pageSize)); - }); - }, []); + SendMessageComposer(new GroupRemoveMemberComposer(membersData.groupId, parser.userId)); - UseMessageEventHook(GroupMembersEvent, onGroupMembersEvent); - - const onGroupConfirmMemberRemoveEvent = useCallback((event: GroupConfirmMemberRemoveEvent) => - { - const parser = event.getParser(); - - NotificationUtilities.confirm(LocalizeText(((parser.furnitureCount > 0) ? 'group.kickconfirm.desc' : 'group.kickconfirm_nofurni.desc'), [ 'user', 'amount' ], [ removingMemberName, parser.furnitureCount.toString() ]), () => - { - SendMessageComposer(new GroupRemoveMemberComposer(membersData.groupId, parser.userId)); - - refreshMembers(); - }, null); + refreshMembers(); + }, null); setRemovingMemberName(null); - }, [ membersData, removingMemberName, refreshMembers ]); - - UseMessageEventHook(GroupConfirmMemberRemoveEvent, onGroupConfirmMemberRemoveEvent); - - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - const groupId = (parseInt(parts[1]) || -1); - const levelId = (parseInt(parts[2]) || 3); - - BatchUpdates(() => - { - setGroupId(groupId); - setLevelId(levelId); - }); - }, []); + }); useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + const groupId = (parseInt(parts[1]) || -1); + const levelId = (parseInt(parts[2]) || 3); + + setGroupId(groupId); + setLevelId(levelId); + setPageId(0); + }, eventUrlPrefix: 'group-members/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); + }, []); useEffect(() => { @@ -146,21 +136,18 @@ export const GroupMembersView: FC<{}> = props => { if(groupId === -1) return; - BatchUpdates(() => - { - setLevelId(-1); - setMembersData(null); - setTotalPages(0); - setSearchQuery(''); - setRemovingMemberName(null); - }) + setLevelId(-1); + setMembersData(null); + setTotalPages(0); + setSearchQuery(''); + setRemovingMemberName(null); }, [ groupId ]); if((groupId === -1) || !membersData) return null; return ( - setGroupId(-1) } /> + setGroupId(-1) } /> @@ -177,41 +164,41 @@ export const GroupMembersView: FC<{}> = props => { membersData.result.map((member, index) => - { - return ( - -
GetUserProfile(member.id) }> - -
- - GetUserProfile(member.id) }>{ member.name } - { (member.rank !== GroupRank.REQUESTED) && - { LocalizeText('group.members.since', [ 'date' ], [ member.joinedAt ]) } } - - - { (member.rank !== GroupRank.REQUESTED) && - - toggleAdmin(member) } /> - } - { membersData.admin && (member.rank === GroupRank.REQUESTED) && - - acceptMembership(member) }> - } - { membersData.admin && (member.rank !== GroupRank.OWNER) && (member.id !== GetSessionDataManager().userId) && - - removeMemberOrDeclineMembership(member) }> - } - -
- ); - }) } + { + return ( + +
GetUserProfile(member.id) }> + +
+ + GetUserProfile(member.id) }>{ member.name } + { (member.rank !== GroupRank.REQUESTED) && + { LocalizeText('group.members.since', [ 'date' ], [ member.joinedAt ]) } } + + + { (member.rank !== GroupRank.REQUESTED) && + + toggleAdmin(member) } /> + } + { membersData.admin && (member.rank === GroupRank.REQUESTED) && + + acceptMembership(member) }> + } + { membersData.admin && (member.rank !== GroupRank.OWNER) && (member.id !== GetSessionDataManager().userId) && + + removeMemberOrDeclineMembership(member) }> + } + +
+ ); + }) }
- { LocalizeText('group.members.pageinfo', ['amount', 'page', 'totalPages'], [membersData.totalMembersCount.toString(), (membersData.pageIndex + 1).toString(), totalPages.toString()]) } + { LocalizeText('group.members.pageinfo', [ 'amount', 'page', 'totalPages' ], [ membersData.totalMembersCount.toString(), (membersData.pageIndex + 1).toString(), totalPages.toString() ]) } - } + } } diff --git a/src/components/groups/views/tabs/GroupTabBadgeView.tsx b/src/components/groups/views/tabs/GroupTabBadgeView.tsx index 75d6214b..73d65c08 100644 --- a/src/components/groups/views/tabs/GroupTabBadgeView.tsx +++ b/src/components/groups/views/tabs/GroupTabBadgeView.tsx @@ -1,10 +1,8 @@ import { GroupSaveBadgeComposer } from '@nitrots/nitro-renderer'; import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { SendMessageComposer } from '../../../../api'; +import { GroupBadgePart, IGroupData, SendMessageComposer } from '../../../../api'; import { Column, Flex, Grid, LayoutBadgeImageView } from '../../../../common'; -import { GroupBadgePart } from '../../common/GroupBadgePart'; -import { IGroupData } from '../../common/IGroupData'; -import { useGroupsContext } from '../../GroupsContext'; +import { useGroup } from '../../../../hooks'; import { GroupBadgeCreatorView } from '../GroupBadgeCreatorView'; interface GroupTabBadgeViewProps @@ -19,7 +17,7 @@ export const GroupTabBadgeView: FC = props => { const { groupData = null, setGroupData = null, setCloseAction = null, skipDefault = null } = props; const [ badgeParts, setBadgeParts ] = useState(null); - const { groupCustomize = null } = useGroupsContext(); + const { groupCustomize = null } = useGroup(); const getModifiedBadgeCode = () => { @@ -41,13 +39,13 @@ export const GroupTabBadgeView: FC = props => if(groupData.groupId <= 0) { setGroupData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.groupBadgeParts = badgeParts; + newValue.groupBadgeParts = badgeParts; - return newValue; - }); + return newValue; + }); return true; } @@ -81,11 +79,11 @@ export const GroupTabBadgeView: FC = props => ]; setGroupData(prevValue => - { - const groupBadgeParts = badgeParts; + { + const groupBadgeParts = badgeParts; - return { ...prevValue, groupBadgeParts }; - }); + return { ...prevValue, groupBadgeParts }; + }); }, [ groupData.groupBadgeParts, groupCustomize, setGroupData ]); useEffect(() => diff --git a/src/components/groups/views/tabs/GroupTabColorsView.tsx b/src/components/groups/views/tabs/GroupTabColorsView.tsx index 416f975a..41ad29d5 100644 --- a/src/components/groups/views/tabs/GroupTabColorsView.tsx +++ b/src/components/groups/views/tabs/GroupTabColorsView.tsx @@ -1,10 +1,9 @@ import { GroupSaveColorsComposer } from '@nitrots/nitro-renderer'; import classNames from 'classnames'; import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../../api'; +import { IGroupData, LocalizeText, SendMessageComposer } from '../../../../api'; import { AutoGrid, Base, Column, Flex, Grid, Text } from '../../../../common'; -import { IGroupData } from '../../common/IGroupData'; -import { useGroupsContext } from '../../GroupsContext'; +import { useGroup } from '../../../../hooks'; interface GroupTabColorsViewProps { @@ -17,7 +16,7 @@ export const GroupTabColorsView: FC = props => { const { groupData = null, setGroupData = null, setCloseAction = null } = props; const [ colors, setColors ] = useState(null); - const { groupCustomize = null } = useGroupsContext(); + const { groupCustomize = null } = useGroup(); const getGroupColor = (colorIndex: number) => { @@ -29,13 +28,13 @@ export const GroupTabColorsView: FC = props => const selectColor = (colorIndex: number, colorId: number) => { setColors(prevValue => - { - const newColors = [ ...prevValue ]; + { + const newColors = [ ...prevValue ]; - newColors[colorIndex] = colorId; + newColors[colorIndex] = colorId; - return newColors; - }); + return newColors; + }); } const saveColors = useCallback(() => @@ -47,13 +46,13 @@ export const GroupTabColorsView: FC = props => if(groupData.groupId <= 0) { setGroupData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.groupColors = [ ...colors ]; + newValue.groupColors = [ ...colors ]; - return newValue; - }); + return newValue; + }); return true; } @@ -70,9 +69,9 @@ export const GroupTabColorsView: FC = props => const groupColors = [ groupCustomize.groupColorsA[0].id, groupCustomize.groupColorsB[0].id ]; setGroupData(prevValue => - { - return { ...prevValue, groupColors }; - }); + { + return { ...prevValue, groupColors }; + }); }, [ groupCustomize, groupData.groupColors, setGroupData ]); useEffect(() => @@ -102,26 +101,26 @@ export const GroupTabColorsView: FC = props => { LocalizeText('group.edit.color.guild.color') } { groupData.groupColors && (groupData.groupColors.length > 0) && - - + + } { LocalizeText('group.edit.color.primary.color') } { groupData.groupColors && groupCustomize.groupColorsA && groupCustomize.groupColorsA.map((item, index) => - { - return
selectColor(0, item.id) }>
- }) } + { + return
selectColor(0, item.id) }>
+ }) }
{ LocalizeText('group.edit.color.secondary.color') } { groupData.groupColors && groupCustomize.groupColorsB && groupCustomize.groupColorsB.map((item, index) => - { - return
selectColor(1, item.id) }>
- }) } + { + return
selectColor(1, item.id) }>
+ }) }
diff --git a/src/components/groups/views/tabs/GroupTabCreatorConfirmationView.tsx b/src/components/groups/views/tabs/GroupTabCreatorConfirmationView.tsx index 083075b8..30460385 100644 --- a/src/components/groups/views/tabs/GroupTabCreatorConfirmationView.tsx +++ b/src/components/groups/views/tabs/GroupTabCreatorConfirmationView.tsx @@ -1,8 +1,7 @@ import { Dispatch, FC, SetStateAction } from 'react'; -import { LocalizeText } from '../../../../api'; +import { IGroupData, LocalizeText } from '../../../../api'; import { Base, Column, Flex, Grid, LayoutBadgeImageView, Text } from '../../../../common'; -import { IGroupData } from '../../common/IGroupData'; -import { useGroupsContext } from '../../GroupsContext'; +import { useGroup } from '../../../../hooks'; interface GroupTabCreatorConfirmationViewProps { @@ -14,7 +13,7 @@ interface GroupTabCreatorConfirmationViewProps export const GroupTabCreatorConfirmationView: FC = props => { const { groupData = null, setGroupData = null, purchaseCost = 0 } = props; - const { groupCustomize = null } = useGroupsContext(); + const { groupCustomize = null } = useGroup(); const getCompleteBadgeCode = () => { @@ -46,8 +45,8 @@ export const GroupTabCreatorConfirmationView: FC { LocalizeText('group.edit.color.guild.color') } - - + + diff --git a/src/components/groups/views/tabs/GroupTabIdentityView.tsx b/src/components/groups/views/tabs/GroupTabIdentityView.tsx index 24f1af33..025babb9 100644 --- a/src/components/groups/views/tabs/GroupTabIdentityView.tsx +++ b/src/components/groups/views/tabs/GroupTabIdentityView.tsx @@ -1,34 +1,37 @@ import { GroupDeleteComposer, GroupSaveInformationComposer } from '@nitrots/nitro-renderer'; import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { CreateLinkEvent, LocalizeText, NotificationUtilities, SendMessageComposer } from '../../../../api'; +import { CreateLinkEvent, IGroupData, LocalizeText, SendMessageComposer } from '../../../../api'; import { Base, Button, Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; -import { IGroupData } from '../../common/IGroupData'; +import { useNotification } from '../../../../hooks'; interface GroupTabIdentityViewProps { groupData: IGroupData; setGroupData: Dispatch>; setCloseAction: Dispatch boolean }>>; + onClose: () => void; isCreator?: boolean; availableRooms?: { id: number, name: string }[]; } export const GroupTabIdentityView: FC = props => { - const { groupData = null, setGroupData = null, setCloseAction = null, isCreator = false, availableRooms = [] } = props; + const { groupData = null, setGroupData = null, setCloseAction = null, onClose = null, isCreator = false, availableRooms = [] } = props; const [ groupName, setGroupName ] = useState(''); const [ groupDescription, setGroupDescription ] = useState(''); const [ groupHomeroomId, setGroupHomeroomId ] = useState(-1); + const { showConfirm = null } = useNotification(); const deleteGroup = () => { if(!groupData || (groupData.groupId <= 0)) return; - NotificationUtilities.confirm(LocalizeText('group.deleteconfirm.desc'), () => - { - SendMessageComposer(new GroupDeleteComposer(groupData.groupId)); - }, null, null, null, LocalizeText('group.deleteconfirm.title')); + showConfirm(LocalizeText('group.deleteconfirm.desc'), () => + { + SendMessageComposer(new GroupDeleteComposer(groupData.groupId)); + + if(onClose) onClose(); + }, null, null, null, LocalizeText('group.deleteconfirm.title')); } const saveIdentity = useCallback(() => @@ -42,15 +45,15 @@ export const GroupTabIdentityView: FC = props => if(groupHomeroomId <= 0) return false; setGroupData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.groupName = groupName; - newValue.groupDescription = groupDescription; - newValue.groupHomeroomId = groupHomeroomId; + newValue.groupName = groupName; + newValue.groupDescription = groupDescription; + newValue.groupHomeroomId = groupHomeroomId; - return newValue; - }); + return newValue; + }); return true; } @@ -62,12 +65,9 @@ export const GroupTabIdentityView: FC = props => useEffect(() => { - BatchUpdates(() => - { - setGroupName(groupData.groupName || ''); - setGroupDescription(groupData.groupDescription || ''); - setGroupHomeroomId(groupData.groupHomeroomId); - }); + setGroupName(groupData.groupName || ''); + setGroupDescription(groupData.groupDescription || ''); + setGroupHomeroomId(groupData.groupHomeroomId); }, [ groupData ]); useEffect(() => diff --git a/src/components/groups/views/tabs/GroupTabSettingsView.tsx b/src/components/groups/views/tabs/GroupTabSettingsView.tsx index f9ba86fe..64785e0f 100644 --- a/src/components/groups/views/tabs/GroupTabSettingsView.tsx +++ b/src/components/groups/views/tabs/GroupTabSettingsView.tsx @@ -1,10 +1,7 @@ import { GroupSavePreferencesComposer } from '@nitrots/nitro-renderer'; import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { SendMessageComposer } from '../../../../api'; -import { LocalizeText } from '../../../../api/utils/LocalizeText'; +import { IGroupData, LocalizeText, SendMessageComposer } from '../../../../api'; import { Column, Flex, HorizontalRule, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; -import { IGroupData } from '../../common/IGroupData'; const STATES: string[] = [ 'regular', 'exclusive', 'private' ]; @@ -30,14 +27,14 @@ export const GroupTabSettingsView: FC = props => if(groupData.groupId <= 0) { setGroupData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.groupState = groupState; - newValue.groupCanMembersDecorate = groupDecorate; + newValue.groupState = groupState; + newValue.groupCanMembersDecorate = groupDecorate; - return newValue; - }); + return newValue; + }); return true; } @@ -49,11 +46,8 @@ export const GroupTabSettingsView: FC = props => useEffect(() => { - BatchUpdates(() => - { - setGroupState(groupData.groupState); - setGroupDecorate(groupData.groupCanMembersDecorate); - }); + setGroupState(groupData.groupState); + setGroupDecorate(groupData.groupCanMembersDecorate); }, [ groupData ]); useEffect(() => @@ -67,20 +61,20 @@ export const GroupTabSettingsView: FC = props => { STATES.map((state, index) => - { - return ( - - setGroupState(index) } /> - - - - { LocalizeText(`group.edit.settings.type.${ state }.label`) } - - { LocalizeText(`group.edit.settings.type.${ state }.help`) } - - - ); - }) } + { + return ( + + setGroupState(index) } /> + + + + { LocalizeText(`group.edit.settings.type.${ state }.label`) } + + { LocalizeText(`group.edit.settings.type.${ state }.help`) } + + + ); + }) } diff --git a/src/components/guide-tool/GuideToolView.tsx b/src/components/guide-tool/GuideToolView.tsx index b09dd692..cec4f5f7 100644 --- a/src/components/guide-tool/GuideToolView.tsx +++ b/src/components/guide-tool/GuideToolView.tsx @@ -1,12 +1,9 @@ import { GuideOnDutyStatusMessageEvent, GuideSessionAttachedMessageEvent, GuideSessionDetachedMessageEvent, GuideSessionEndedMessageEvent, GuideSessionInvitedToGuideRoomMessageEvent, GuideSessionMessageMessageEvent, GuideSessionOnDutyUpdateMessageComposer, GuideSessionPartnerIsTypingMessageEvent, GuideSessionStartedMessageEvent, ILinkEventTracker, PerkAllowancesMessageEvent, PerkEnum } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { AddEventLinkTracker, GetConfiguration, GetSessionDataManager, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; +import { AddEventLinkTracker, GetConfiguration, GetSessionDataManager, GuideSessionState, GuideToolMessage, GuideToolMessageGroup, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../common'; -import { GuideToolEvent, NotificationAlertEvent } from '../../events'; -import { DispatchUiEvent, UseMessageEventHook, UseUiEvent } from '../../hooks'; -import { GuideSessionState } from './common/GuideSessionState'; -import { GuideToolMessage } from './common/GuideToolMessage'; -import { GuideToolMessageGroup } from './common/GuideToolMessageGroup'; +import { GuideToolEvent } from '../../events'; +import { useMessageEvent, useNotification, useUiEvent } from '../../hooks'; import { GuideToolAcceptView } from './views/GuideToolAcceptView'; import { GuideToolMenuView } from './views/GuideToolMenuView'; import { GuideToolOngoingView } from './views/GuideToolOngoingView'; @@ -42,6 +39,8 @@ export const GuideToolView: FC<{}> = props => const [ ongoingIsTyping, setOngoingIsTyping ] = useState(false); const [ ongoingMessageGroups, setOngoingMessageGroups ] = useState([]); + const { simpleAlert = null } = useNotification(); + const updateSessionState = useCallback((newState: string, replacement?: string) => { switch(newState) @@ -55,7 +54,7 @@ export const GuideToolView: FC<{}> = props => setNoCloseButton(true); break; case GuideSessionState.GUIDE_ONGOING: - setHeaderText(LocalizeText('guide.help.request.guide.ongoing.title', ['name'], [replacement])); + setHeaderText(LocalizeText('guide.help.request.guide.ongoing.title', [ 'name' ], [ replacement ])); setNoCloseButton(true); break; case GuideSessionState.USER_CREATE: @@ -67,7 +66,7 @@ export const GuideToolView: FC<{}> = props => setNoCloseButton(true); break; case GuideSessionState.USER_ONGOING: - setHeaderText(LocalizeText('guide.help.request.user.ongoing.title', ['name'], [replacement])); + setHeaderText(LocalizeText('guide.help.request.user.ongoing.title', [ 'name' ], [ replacement ])); setNoCloseButton(true); break; case GuideSessionState.USER_FEEDBACK: @@ -103,12 +102,12 @@ export const GuideToolView: FC<{}> = props => } }, [ updateSessionState ]); - UseUiEvent(GuideToolEvent.SHOW_GUIDE_TOOL, onGuideToolEvent); - UseUiEvent(GuideToolEvent.HIDE_GUIDE_TOOL, onGuideToolEvent); - UseUiEvent(GuideToolEvent.TOGGLE_GUIDE_TOOL, onGuideToolEvent); - UseUiEvent(GuideToolEvent.CREATE_HELP_REQUEST, onGuideToolEvent); + useUiEvent(GuideToolEvent.SHOW_GUIDE_TOOL, onGuideToolEvent); + useUiEvent(GuideToolEvent.HIDE_GUIDE_TOOL, onGuideToolEvent); + useUiEvent(GuideToolEvent.TOGGLE_GUIDE_TOOL, onGuideToolEvent); + useUiEvent(GuideToolEvent.CREATE_HELP_REQUEST, onGuideToolEvent); - const onPerkAllowancesMessageEvent = useCallback((event: PerkAllowancesMessageEvent) => + useMessageEvent(PerkAllowancesMessageEvent, event => { const parser = event.getParser(); @@ -117,11 +116,9 @@ export const GuideToolView: FC<{}> = props => setIsOnDuty(false); SendMessageComposer(new GuideSessionOnDutyUpdateMessageComposer(false, false, false, false)); } - }, [ isOnDuty, setIsOnDuty ]); + }); - UseMessageEventHook(PerkAllowancesMessageEvent, onPerkAllowancesMessageEvent); - - const onGuideOnDutyStatusMessageEvent = useCallback((event: GuideOnDutyStatusMessageEvent) => + useMessageEvent(GuideOnDutyStatusMessageEvent, event => { const parser = event.getParser(); @@ -129,11 +126,9 @@ export const GuideToolView: FC<{}> = props => setGuidesOnDuty(parser.guidesOnDuty); setHelpersOnDuty(parser.helpersOnDuty); setGuardiansOnDuty(parser.guardiansOnDuty); - }, [ setIsOnDuty, setHelpersOnDuty, setGuidesOnDuty, setGuardiansOnDuty ]); + }); - UseMessageEventHook(GuideOnDutyStatusMessageEvent, onGuideOnDutyStatusMessageEvent); - - const onGuideSessionAttachedMessageEvent = useCallback((event: GuideSessionAttachedMessageEvent) => + useMessageEvent(GuideSessionAttachedMessageEvent, event => { const parser = event.getParser(); @@ -143,12 +138,9 @@ export const GuideToolView: FC<{}> = props => if(parser.asGuide && isOnDuty) updateSessionState(GuideSessionState.GUIDE_ACCEPT); if(!parser.asGuide) updateSessionState(GuideSessionState.USER_PENDING); - - }, [ isOnDuty, updateSessionState ]); + }); - UseMessageEventHook(GuideSessionAttachedMessageEvent, onGuideSessionAttachedMessageEvent); - - const onGuideSessionStartedMessageEvent = useCallback((event: GuideSessionStartedMessageEvent) => + useMessageEvent(GuideSessionStartedMessageEvent, event => { const parser = event.getParser(); @@ -166,24 +158,20 @@ export const GuideToolView: FC<{}> = props => setOngoingFigure(parser.guideFigure); updateSessionState(GuideSessionState.USER_ONGOING, parser.guideName); } - }, [ isOnDuty, updateSessionState ]); + }); - UseMessageEventHook(GuideSessionStartedMessageEvent, onGuideSessionStartedMessageEvent); - - const onGuideSessionPartnerIsTypingMessageEvent = useCallback((event: GuideSessionPartnerIsTypingMessageEvent) => + useMessageEvent(GuideSessionPartnerIsTypingMessageEvent, event => { const parser = event.getParser(); setOngoingIsTyping(parser.isTyping); - }, []); + }); - UseMessageEventHook(GuideSessionPartnerIsTypingMessageEvent, onGuideSessionPartnerIsTypingMessageEvent); - - const onGuideSessionMessageMessageEvent = useCallback((event: GuideSessionMessageMessageEvent) => + useMessageEvent(GuideSessionMessageMessageEvent, event => { const parser = event.getParser(); - const messageGroups = [...ongoingMessageGroups]; + const messageGroups = [ ...ongoingMessageGroups ]; let lastGroup = messageGroups[messageGroups.length - 1]; @@ -195,15 +183,13 @@ export const GuideToolView: FC<{}> = props => lastGroup.addChat(new GuideToolMessage(parser.chatMessage)); setOngoingMessageGroups(messageGroups); - }, [ ongoingMessageGroups ]); + }); - UseMessageEventHook(GuideSessionMessageMessageEvent, onGuideSessionMessageMessageEvent); - - const onGuideSessionInvitedToGuideRoomMessageEvent = useCallback((event: GuideSessionInvitedToGuideRoomMessageEvent) => + useMessageEvent(GuideSessionInvitedToGuideRoomMessageEvent, event => { const parser = event.getParser(); - const messageGroups = [...ongoingMessageGroups]; + const messageGroups = [ ...ongoingMessageGroups ]; let lastGroup = messageGroups[messageGroups.length - 1]; @@ -217,11 +203,9 @@ export const GuideToolView: FC<{}> = props => lastGroup.addChat(new GuideToolMessage(parser.roomName, parser.roomId)); setOngoingMessageGroups(messageGroups); - }, [isOnDuty, ongoingMessageGroups, ongoingUserId]); + }); - UseMessageEventHook(GuideSessionInvitedToGuideRoomMessageEvent, onGuideSessionInvitedToGuideRoomMessageEvent); - - const onGuideSessionEndedMessageEvent = useCallback((event: GuideSessionEndedMessageEvent) => + useMessageEvent(GuideSessionEndedMessageEvent, event => { if(isOnDuty) { @@ -236,11 +220,9 @@ export const GuideToolView: FC<{}> = props => { updateSessionState(GuideSessionState.USER_FEEDBACK); } - }, [ isOnDuty, updateSessionState ]); + }); - UseMessageEventHook(GuideSessionEndedMessageEvent, onGuideSessionEndedMessageEvent); - - const onGuideSessionDetachedMessageEvent = useCallback((event: GuideSessionDetachedMessageEvent) => + useMessageEvent(GuideSessionDetachedMessageEvent, event => { setOngoingUserId(0); setOngoingUsername(null); @@ -257,35 +239,31 @@ export const GuideToolView: FC<{}> = props => { updateSessionState(GuideSessionState.USER_THANKS); } - }, [ isOnDuty, updateSessionState ]); - - UseMessageEventHook(GuideSessionDetachedMessageEvent, onGuideSessionDetachedMessageEvent); - - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'tour': - //Create Tour Request - return; - } - }, []); + }); useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'tour': + //Create Tour Request + return; + } + }, eventUrlPrefix: 'help/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); + }, []); const processAction = useCallback((action: string) => { @@ -299,15 +277,15 @@ export const GuideToolView: FC<{}> = props => case 'toggle_duty': if(!isHandlingBullyReports && !isHandlingGuideRequests && !isHandlingHelpRequests) { - DispatchUiEvent(new NotificationAlertEvent([LocalizeText('guide.help.guide.tool.noqueueselected.message')], null, null, null, LocalizeText('guide.help.guide.tool.noqueueselected.caption'), null)); + simpleAlert(LocalizeText('guide.help.guide.tool.noqueueselected.message'), null, null, null, LocalizeText('guide.help.guide.tool.noqueueselected.caption'), null); return; } setIsOnDuty(v => - { - SendMessageComposer(new GuideSessionOnDutyUpdateMessageComposer(!v, v ? false : isHandlingGuideRequests, v ? false : isHandlingHelpRequests, v ? false : isHandlingBullyReports)); - return !v; - }); + { + SendMessageComposer(new GuideSessionOnDutyUpdateMessageComposer(!v, v ? false : isHandlingGuideRequests, v ? false : isHandlingHelpRequests, v ? false : isHandlingBullyReports)); + return !v; + }); return; case 'forum_link': @@ -315,7 +293,7 @@ export const GuideToolView: FC<{}> = props => window.open(url); return; } - }, [isHandlingBullyReports, isHandlingGuideRequests, isHandlingHelpRequests]); + }, [ isHandlingBullyReports, isHandlingGuideRequests, isHandlingHelpRequests, simpleAlert ]); if(!isVisible) return null; diff --git a/src/components/guide-tool/views/GuideToolAcceptView.tsx b/src/components/guide-tool/views/GuideToolAcceptView.tsx index 05f6f6fc..b9a9fcf7 100644 --- a/src/components/guide-tool/views/GuideToolAcceptView.tsx +++ b/src/components/guide-tool/views/GuideToolAcceptView.tsx @@ -24,8 +24,8 @@ export const GuideToolAcceptView: FC = props => + { LocalizeText('guide.help.request.guide.accept.accept.button') } + diff --git a/src/components/guide-tool/views/GuideToolOngoingView.tsx b/src/components/guide-tool/views/GuideToolOngoingView.tsx index 21ef8ce3..7dd01850 100644 --- a/src/components/guide-tool/views/GuideToolOngoingView.tsx +++ b/src/components/guide-tool/views/GuideToolOngoingView.tsx @@ -1,9 +1,8 @@ import { GuideSessionGetRequesterRoomMessageComposer, GuideSessionInviteRequesterMessageComposer, GuideSessionMessageMessageComposer, GuideSessionRequesterRoomMessageEvent, GuideSessionResolvedMessageComposer } from '@nitrots/nitro-renderer'; import { FC, KeyboardEvent, useCallback, useState } from 'react'; -import { GetSessionDataManager, LocalizeText, SendMessageComposer, TryVisitRoom } from '../../../api'; +import { GetSessionDataManager, GuideToolMessageGroup, LocalizeText, SendMessageComposer, TryVisitRoom } from '../../../api'; import { Base, Button, ButtonGroup, Column, Flex, LayoutAvatarImageView, Text } from '../../../common'; -import { UseMessageEventHook } from '../../../hooks'; -import { GuideToolMessageGroup } from '../common/GuideToolMessageGroup'; +import { useMessageEvent } from '../../../hooks'; interface GuideToolOngoingViewProps { @@ -36,14 +35,12 @@ export const GuideToolOngoingView: FC = props => SendMessageComposer(new GuideSessionResolvedMessageComposer()); }, []); - const onGuideSessionRequesterRoomMessageEvent = useCallback((event: GuideSessionRequesterRoomMessageEvent) => + useMessageEvent(GuideSessionRequesterRoomMessageEvent, event => { const parser = event.getParser(); TryVisitRoom(parser.requesterRoomId); - }, []); - - UseMessageEventHook(GuideSessionRequesterRoomMessageEvent, onGuideSessionRequesterRoomMessageEvent); + }); const sendMessage = useCallback(() => { @@ -83,27 +80,27 @@ export const GuideToolOngoingView: FC = props => { messageGroups.map((group, index) => - { - return ( - - - { (!isOwnChat(group.userId)) && - } - - - - { (isOwnChat(group.userId)) && GetSessionDataManager().userName } - { (!isOwnChat(group.userId)) && userName } - - { group.messages.map((chat, index) => { chat.message }) } - - { (isOwnChat(group.userId)) && - - - } - - ); - }) } + { + return ( + + + { (!isOwnChat(group.userId)) && + } + + + + { (isOwnChat(group.userId)) && GetSessionDataManager().userName } + { (!isOwnChat(group.userId)) && userName } + + { group.messages.map((chat, index) => { chat.message }) } + + { (isOwnChat(group.userId)) && + + + } + + ); + }) } diff --git a/src/components/hc-center/HcCenterView.tsx b/src/components/hc-center/HcCenterView.tsx index 5236443c..2c94d395 100644 --- a/src/components/hc-center/HcCenterView.tsx +++ b/src/components/hc-center/HcCenterView.tsx @@ -1,43 +1,31 @@ -import { BadgesEvent, ClubGiftInfoEvent, FigureUpdateEvent, FriendlyTime, GetClubGiftInfo, ILinkEventTracker, RequestBadgesComposer, ScrGetKickbackInfoMessageComposer, ScrKickbackData, ScrSendKickbackInfoMessageEvent, UserInfoEvent, UserSubscriptionEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { ClubGiftInfoEvent, FriendlyTime, GetClubGiftInfo, ILinkEventTracker, ScrGetKickbackInfoMessageComposer, ScrKickbackData, ScrSendKickbackInfoMessageEvent } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; import { OverlayTrigger, Popover } from 'react-bootstrap'; -import { AddEventLinkTracker, CreateLinkEvent, GetConfiguration, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; +import { AddEventLinkTracker, ClubStatus, CreateLinkEvent, GetClubBadge, GetConfiguration, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; import { Base, Button, Column, Flex, LayoutAvatarImageView, LayoutBadgeImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { HcCenterEvent } from '../../events'; -import { UseMessageEventHook, UseUiEvent } from '../../hooks'; -import { BadgeResolver } from './common/BadgeResolver'; -import { ClubStatus } from './common/ClubStatus'; +import { useInventoryBadges, useMessageEvent, usePurse, useSessionInfo } from '../../hooks'; export const HcCenterView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); - const [ userFigure, setUserFigure ] = useState(null); const [ kickbackData, setKickbackData ] = useState(null); - const [ clubDays, setClubDays ] = useState(0); - const [ pastClubDays, setPastClubDays ] = useState(0); - const [ clubPeriods, setPastClubPeriods ] = useState(0); - const [ minsTillExpire, setMinsTillExpire ] = useState(0); - const [ clubStatus, setClubStatus ] = useState(ClubStatus.NONE); const [ unclaimedGifts, setUnclaimedGifts ] = useState(0); - const [ badgeCode, setBadgeCode ] = useState(BadgeResolver.default_badge); + const [ badgeCode, setBadgeCode ] = useState(null); + const { userFigure = null } = useSessionInfo(); + const { purse = null, clubStatus = null } = usePurse(); + const { badgeCodes = [], activate = null, deactivate = null } = useInventoryBadges(); const getClubText = () => { - const totalDays = ((clubPeriods * 31) + clubDays); - const minutesUntilExpiration = minsTillExpire; - - if(clubStatus !== ClubStatus.ACTIVE) + if(purse.clubDays <= 0) return LocalizeText('purse.clubdays.zero.amount.text'); + + if((purse.minutesUntilExpiration > -1) && (purse.minutesUntilExpiration < (60 * 24))) { - return LocalizeText('purse.clubdays.zero.amount.text'); + return FriendlyTime.shortFormat(purse.minutesUntilExpiration * 60); } - if((minutesUntilExpiration > -1) && (minutesUntilExpiration < (60 * 24))) - { - return FriendlyTime.shortFormat(minutesUntilExpiration * 60); - } - - return FriendlyTime.shortFormat(totalDays * 86400); + return FriendlyTime.shortFormat(((purse.clubPeriods * 31) + purse.clubDays) * 86400); } const getInfoText = () => @@ -53,146 +41,73 @@ export const HcCenterView: FC<{}> = props => } } - const getHcPaydayTime = () => - { - if(kickbackData.timeUntilPayday < 60) return LocalizeText('hccenter.special.time.soon'); - return FriendlyTime.shortFormat(kickbackData.timeUntilPayday * 60); - } + const getHcPaydayTime = () => (kickbackData.timeUntilPayday < 60) ? LocalizeText('hccenter.special.time.soon') : FriendlyTime.shortFormat(kickbackData.timeUntilPayday * 60); + const getHcPaydayAmount = () => LocalizeText('hccenter.special.sum', [ 'credits' ], [ (kickbackData.creditRewardForStreakBonus + kickbackData.creditRewardForMonthlySpent).toString() ]); - const getHcPaydayAmount = () => - { - return LocalizeText('hccenter.special.sum', [ 'credits' ], [ (kickbackData.creditRewardForStreakBonus + kickbackData.creditRewardForMonthlySpent).toString() ]); - } - - const onUserInfoEvent = useCallback((event: UserInfoEvent) => - { - const parser = event.getParser(); - - setUserFigure(parser.userInfo.figure); - }, []); - - UseMessageEventHook(UserInfoEvent, onUserInfoEvent); - - const onUserFigureEvent = useCallback((event: FigureUpdateEvent) => - { - const parser = event.getParser(); - - setUserFigure(parser.figure); - }, []); - - UseMessageEventHook(FigureUpdateEvent, onUserFigureEvent); - - const onHcCenterEvent = useCallback((event: HcCenterEvent) => - { - switch(event.type) - { - case HcCenterEvent.TOGGLE_HC_CENTER: - setIsVisible(!isVisible); - break; - } - }, [isVisible]); - - UseUiEvent(HcCenterEvent.TOGGLE_HC_CENTER, onHcCenterEvent); - - const onClubGiftInfoEvent = useCallback((event: ClubGiftInfoEvent) => + useMessageEvent(ClubGiftInfoEvent, event => { const parser = event.getParser(); setUnclaimedGifts(parser.giftsAvailable); - }, []); + }); - UseMessageEventHook(ClubGiftInfoEvent, onClubGiftInfoEvent); - - const onScrSendKickbackInfo = useCallback((event: ScrSendKickbackInfoMessageEvent) => + useMessageEvent(ScrSendKickbackInfoMessageEvent, event => { const parser = event.getParser(); setKickbackData(parser.data); - }, []); - - UseMessageEventHook(ScrSendKickbackInfoMessageEvent, onScrSendKickbackInfo); - - const onBadges = useCallback((event: BadgesEvent) => - { - const parser = event.getParser(); - - setBadgeCode(BadgeResolver.getClubBadge(parser.getAllBadgeCodes())); - }, []); - - UseMessageEventHook(BadgesEvent, onBadges); - - const onUserSubscriptionEvent = useCallback((event: UserSubscriptionEvent) => - { - const parser = event.getParser(); - - const productName = parser.productName; - - if((productName !== 'club_habbo') && (productName !== 'habbo_club')) return; - - setClubDays(Math.max(0, parser.daysToPeriodEnd)); - setPastClubPeriods(Math.max(0, parser.periodsSubscribedAhead)); - setPastClubDays(Math.max(0, parser.pastClubDays)); - setMinsTillExpire(Math.max(0, parser.minutesUntilExpiration)); - }, []); - - UseMessageEventHook(UserSubscriptionEvent, onUserSubscriptionEvent); - - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'open': - if(parts.length > 2) - { - switch(parts[2]) - { - case 'hccenter': - setIsVisible(true); - break; - } - } - return; - } - }, []); + }); useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'open': + if(parts.length > 2) + { + switch(parts[2]) + { + case 'hccenter': + setIsVisible(true); + break; + } + } + return; + } + }, eventUrlPrefix: 'habboUI/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived]); + }, []); useEffect(() => { - if(clubDays > 0) - { - setClubStatus(ClubStatus.ACTIVE); + setBadgeCode(GetClubBadge(badgeCodes)); + }, [ badgeCodes ]); - return; - } + useEffect(() => + { + if(!isVisible) return; - if(pastClubDays > 0) - { - setClubStatus(ClubStatus.EXPIRED); + const id = activate(); - return; - } - }, [ clubDays, pastClubDays ]); + return () => deactivate(id); + }, [ isVisible, activate, deactivate ]); useEffect(() => { SendMessageComposer(new GetClubGiftInfo()); SendMessageComposer(new ScrGetKickbackInfoMessageComposer()); - SendMessageComposer(new RequestBadgesComposer()); }, []); if(!isVisible) return null; @@ -200,15 +115,14 @@ export const HcCenterView: FC<{}> = props => const popover = ( -
{LocalizeText('hccenter.breakdown.title')}
-
{LocalizeText('hccenter.breakdown.creditsspent', ['credits'], [kickbackData.totalCreditsSpent.toString()])}
-
{LocalizeText('hccenter.breakdown.paydayfactor.percent', ['percent'], [(kickbackData.kickbackPercentage * 100).toString()])}
-
{LocalizeText('hccenter.breakdown.streakbonus', ['credits'], [kickbackData.creditRewardForStreakBonus.toString()])}
+
{ LocalizeText('hccenter.breakdown.title') }
+
{ LocalizeText('hccenter.breakdown.creditsspent', [ 'credits' ], [ kickbackData.totalCreditsSpent.toString() ]) }
+
{ LocalizeText('hccenter.breakdown.paydayfactor.percent', [ 'percent' ], [ (kickbackData.kickbackPercentage * 100).toString() ]) }
+
{ LocalizeText('hccenter.breakdown.streakbonus', [ 'credits' ], [ kickbackData.creditRewardForStreakBonus.toString() ]) }

-
{LocalizeText('hccenter.breakdown.total', ['credits', 'actual'], [getHcPaydayAmount(), - ((((kickbackData.kickbackPercentage * kickbackData.totalCreditsSpent) + kickbackData.creditRewardForStreakBonus) * 100) / 100).toString()])}
-
{ CreateLinkEvent('habbopages/' + GetConfiguration('hc.center')['payday.habbopage']) }}>{ - LocalizeText('hccenter.special.infolink')} +
{ LocalizeText('hccenter.breakdown.total', [ 'credits', 'actual' ], [ getHcPaydayAmount(), ((((kickbackData.kickbackPercentage * kickbackData.totalCreditsSpent) + kickbackData.creditRewardForStreakBonus) * 100) / 100).toString() ]) }
+
CreateLinkEvent('habbopages/' + GetConfiguration('hc.center')['payday.habbopage']) }> + { LocalizeText('hccenter.special.infolink') }
@@ -221,7 +135,7 @@ export const HcCenterView: FC<{}> = props =>
- @@ -232,57 +146,58 @@ export const HcCenterView: FC<{}> = props => - + { LocalizeText('hccenter.status.' + clubStatus) } - + { GetConfiguration('hc.center')['payday.info'] && + -

{LocalizeText('hccenter.special.title')}

-
{LocalizeText('hccenter.special.info')}
-
{ CreateLinkEvent('habbopages/' + GetConfiguration('hc.center')['payday.habbopage']) }}>{LocalizeText('hccenter.special.infolink')}
+

{ LocalizeText('hccenter.special.title') }

+
{ LocalizeText('hccenter.special.info') }
+
CreateLinkEvent('habbopages/' + GetConfiguration('hc.center')['payday.habbopage']) }>{ LocalizeText('hccenter.special.infolink') }
-
{LocalizeText('hccenter.special.time.title')}
+
{ LocalizeText('hccenter.special.time.title') }
-
{getHcPaydayTime()}
+
{ getHcPaydayTime() }
- {clubStatus === ClubStatus.ACTIVE && + { clubStatus === ClubStatus.ACTIVE &&
-
{LocalizeText('hccenter.special.amount.title')}
+
{ LocalizeText('hccenter.special.amount.title') }
-
{getHcPaydayAmount()}
- +
{ getHcPaydayAmount() }
+
- {LocalizeText('hccenter.breakdown.infolink')} + { LocalizeText('hccenter.breakdown.infolink') }
-
- } +
}
-
- } - {GetConfiguration('hc.center')['gift.info'] && + } + { GetConfiguration('hc.center')['gift.info'] &&
-

{LocalizeText('hccenter.gift.title')}

-
0 ? LocalizeText('hccenter.unclaimedgifts', ['unclaimedgifts'], [unclaimedGifts.toString()]) : LocalizeText('hccenter.gift.info') }}>
+

{ LocalizeText('hccenter.gift.title') }

+
0 ? LocalizeText('hccenter.unclaimedgifts', [ 'unclaimedgifts' ], [ unclaimedGifts.toString() ]) : LocalizeText('hccenter.gift.info') } }>
- -
- } - {GetConfiguration('hc.center')['benefits.info'] && + +
} + { GetConfiguration('hc.center')['benefits.info'] &&
-
{LocalizeText('hccenter.general.title')}
-
- -
- } +
{ LocalizeText('hccenter.general.title') }
+
+ +
} ); diff --git a/src/components/hc-center/common/BadgeResolver.ts b/src/components/hc-center/common/BadgeResolver.ts deleted file mode 100644 index d61d66da..00000000 --- a/src/components/hc-center/common/BadgeResolver.ts +++ /dev/null @@ -1,23 +0,0 @@ - -export class BadgeResolver -{ - public static default_badge: string = 'HC1'; - public static badges: string[] = ['ACH_VipHC1', 'ACH_VipHC2', 'ACH_VipHC3', 'ACH_VipHC4', 'ACH_VipHC5', 'HC1', 'HC2', 'HC3', 'HC4', 'HC5']; - - - public static getClubBadge(k: string[]): string - { - var badgeCode: string = null; - - this.badges.forEach(badge => - { - if (k.indexOf(badge) > -1) - { - badgeCode = badge; - } - }); - - return badgeCode || this.default_badge; - } - -} diff --git a/src/components/help/HelpContext.tsx b/src/components/help/HelpContext.tsx deleted file mode 100644 index 2905830b..00000000 --- a/src/components/help/HelpContext.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { createContext, Dispatch, FC, ProviderProps, SetStateAction, useContext } from 'react'; -import { IHelpReportState } from './common/IHelpReportState'; - -interface IHelpContext -{ - helpReportState: IHelpReportState; - setHelpReportState: Dispatch>; -} - -const HelpContext = createContext({ - helpReportState: null, - setHelpReportState: null -}); - -export const HelpContextProvider: FC> = props => -{ - return { props.children } -} - -export const useHelpContext = () => useContext(HelpContext); diff --git a/src/components/help/HelpMessageHandler.tsx b/src/components/help/HelpMessageHandler.tsx deleted file mode 100644 index c28dbd96..00000000 --- a/src/components/help/HelpMessageHandler.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { CallForHelpResultMessageEvent, GetPendingCallsForHelpMessageComposer, IssueCloseNotificationMessageEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback } from 'react'; -import { LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer } from '../../api'; -import { UseMessageEventHook } from '../../hooks'; -import { CallForHelpResult } from './common/CallForHelpResult'; -import { GetCloseReasonKey } from './common/GetCloseReasonKey'; - -export const HelpMessageHandler: FC<{}> = props => -{ - const onCallForHelpResultMessageEvent = useCallback((event: CallForHelpResultMessageEvent) => - { - const parser = event.getParser(); - - let message = parser.messageText; - - switch(parser.resultType) - { - case CallForHelpResult.TOO_MANY_PENDING_CALLS_CODE: - SendMessageComposer(new GetPendingCallsForHelpMessageComposer()); - NotificationUtilities.simpleAlert(LocalizeText('help.cfh.error.pending'), NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.error.title')); - break; - case CallForHelpResult.HAS_ABUSIVE_CALL_CODE: - NotificationUtilities.simpleAlert(LocalizeText('help.cfh.error.abusive'), NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.error.title')); - break; - default: - if(message.trim().length === 0) - { - message = LocalizeText('help.cfh.sent.text'); - } - NotificationUtilities.simpleAlert(message, NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.sent.title')); - } - }, []); - - UseMessageEventHook(CallForHelpResultMessageEvent, onCallForHelpResultMessageEvent); - - const onIssueCloseNotificationMessageEvent = useCallback((event: IssueCloseNotificationMessageEvent) => - { - const parser = event.getParser(); - - const message = parser.messageText.length === 0 ? LocalizeText('help.cfh.closed.' + GetCloseReasonKey(parser.closeReason)) : parser.messageText; - - NotificationUtilities.simpleAlert(message, NotificationAlertType.MODERATION, null, null, LocalizeText('mod.alert.title')); - }, []); - - UseMessageEventHook(IssueCloseNotificationMessageEvent, onIssueCloseNotificationMessageEvent); - - return null; -} diff --git a/src/components/help/HelpView.tsx b/src/components/help/HelpView.tsx index cae699cd..7a257be7 100644 --- a/src/components/help/HelpView.tsx +++ b/src/components/help/HelpView.tsx @@ -1,15 +1,12 @@ import { ILinkEventTracker } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker } from '../../api'; +import { FC, useEffect, useState } from 'react'; +import { AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker, ReportState } from '../../api'; import { Base, Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../common'; -import { HelpReportUserEvent } from '../../events/help/HelpReportUserEvent'; -import { UseUiEvent } from '../../hooks'; -import { IHelpReportState } from './common/IHelpReportState'; -import { HelpContextProvider } from './HelpContext'; -import { HelpMessageHandler } from './HelpMessageHandler'; +import { useHelp } from '../../hooks'; import { DescribeReportView } from './views/DescribeReportView'; import { HelpIndexView } from './views/HelpIndexView'; import { NameChangeView } from './views/name-change/NameChangeView'; +import { ReportSummaryView } from './views/ReportSummaryView'; import { SanctionSatusView } from './views/SanctionStatusView'; import { SelectReportedChatsView } from './views/SelectReportedChatsView'; import { SelectReportedUserView } from './views/SelectReportedUserView'; @@ -18,113 +15,103 @@ import { SelectTopicView } from './views/SelectTopicView'; export const HelpView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); - const [ helpReportState, setHelpReportState ] = useState({ - reportedUserId: -1, - reportedChats: [], - cfhCategory: -1, - cfhTopic: -1, - roomId: -1, - message: '', - currentStep: 0 - }); + const { activeReport = null, setActiveReport = null, report = null } = useHelp(); - const linkReceived = useCallback((url: string) => + const onClose = () => { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': - setIsVisible(true); - return; - case 'hide': - setIsVisible(false); - return; - case 'toggle': - setIsVisible(prevValue => !prevValue); - return; - } - }, []); - - const onHelpReportUserEvent = useCallback((event: HelpReportUserEvent) => - { - setHelpReportState({ - reportedUserId: event.reportedUserId, - reportedChats: [], - cfhCategory: -1, - cfhTopic: -1, - roomId: -1, - message: '', - currentStep: 2 - }); - - setIsVisible(true); - }, []); - - UseUiEvent(HelpReportUserEvent.REPORT_USER, onHelpReportUserEvent); + setActiveReport(null); + setIsVisible(false); + } useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'show': + setIsVisible(true); + return; + case 'hide': + setIsVisible(false); + return; + case 'toggle': + setIsVisible(prevValue => !prevValue); + return; + case 'tour': + // todo: launch tour + return; + case 'report': + if((parts.length >= 5) && (parts[2] === 'room')) + { + const roomId = parseInt(parts[3]); + const unknown = unescape(parts.splice(4).join('/')); + //this.reportRoom(roomId, unknown, ""); + } + return; + } + }, eventUrlPrefix: 'help/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); + }, []); useEffect(() => { - if(!isVisible) return; + if(!activeReport) return; - setHelpReportState({ - reportedUserId: -1, - reportedChats: [], - cfhCategory: -1, - cfhTopic: -1, - roomId: -1, - message: '', - currentStep: 0 - }); - }, [ isVisible ]); + setIsVisible(true); + }, [ activeReport ]); - const CurrentStepView = useCallback(() => + if(!isVisible && !activeReport) return null; + + const CurrentStepView = () => { - switch(helpReportState.currentStep) + if(activeReport) { - case 0: return - case 1: return - case 2: return - case 3: return - case 4: return + switch(activeReport.currentStep) + { + case ReportState.SELECT_USER: + return ; + case ReportState.SELECT_CHATS: + return ; + case ReportState.SELECT_TOPICS: + return ; + case ReportState.INPUT_REPORT_MESSAGE: + return ; + case ReportState.REPORT_SUMMARY: + return ; + } } - return null; - }, [helpReportState.currentStep]); + return ; + } return ( - - - { isVisible && - - setIsVisible(false) } /> - - - - - - - - - - - } + <> + + + + + + + + + + + + + - + ); } diff --git a/src/components/help/common/IHelpReportState.ts b/src/components/help/common/IHelpReportState.ts deleted file mode 100644 index 26aba823..00000000 --- a/src/components/help/common/IHelpReportState.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IChatEntry } from '../../chat-history/common/IChatEntry'; - -export interface IHelpReportState -{ - reportedUserId: number; - reportedChats: IChatEntry[]; - cfhCategory: number; - cfhTopic: number; - roomId: number; - message: string; - currentStep: number; -} diff --git a/src/components/help/views/DescribeReportView.tsx b/src/components/help/views/DescribeReportView.tsx index 420c2019..5f231d3a 100644 --- a/src/components/help/views/DescribeReportView.tsx +++ b/src/components/help/views/DescribeReportView.tsx @@ -1,31 +1,31 @@ -import { CallForHelpMessageComposer } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; -import { CreateLinkEvent, LocalizeText, SendMessageComposer } from '../../../api'; -import { Button, Column, Text } from '../../../common'; -import { useHelpContext } from '../HelpContext'; +import { LocalizeText, ReportState, ReportType } from '../../../api'; +import { Button, Column, Flex, Text } from '../../../common'; +import { useHelp } from '../../../hooks'; export const DescribeReportView: FC<{}> = props => { const [ message, setMessage ] = useState(''); - const { helpReportState = null, setHelpReportState = null } = useHelpContext(); - const { reportedChats, cfhTopic, reportedUserId } = helpReportState; + const { activeReport = null, setActiveReport = null } = useHelp(); - const submitReport = () => + const submitMessage = () => { if(message.length < 15) return; - const roomId = reportedChats[0].roomId; - const chats: (string | number )[] = []; - - reportedChats.forEach(entry => + setActiveReport(prevValue => { - chats.push(entry.entityId); - chats.push(entry.message); + const currentStep = ReportState.REPORT_SUMMARY; + + return { ...prevValue, message, currentStep }; }); + } - SendMessageComposer(new CallForHelpMessageComposer(message, cfhTopic, reportedUserId, roomId, chats)); - - CreateLinkEvent('help/hide'); + const back = () => + { + setActiveReport(prevValue => + { + return { ...prevValue, currentStep: (prevValue.currentStep - 1) }; + }); } return ( @@ -35,9 +35,14 @@ export const DescribeReportView: FC<{}> = props => { LocalizeText('help.cfh.input.text') } diff --git a/src/components/mod-tools/views/user/ModToolsUserView.tsx b/src/components/mod-tools/views/user/ModToolsUserView.tsx index 322aee1a..4454a0c9 100644 --- a/src/components/mod-tools/views/user/ModToolsUserView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserView.tsx @@ -1,9 +1,8 @@ import { FriendlyTime, GetModeratorUserInfoMessageComposer, ModeratorUserInfoData, ModeratorUserInfoEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../../api'; +import { FC, useEffect, useMemo, useState } from 'react'; +import { CreateLinkEvent, LocalizeText, SendMessageComposer } from '../../../../api'; import { Button, Column, DraggableWindowPosition, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; -import { ModToolsOpenUserChatlogEvent } from '../../../../events'; -import { DispatchUiEvent, UseMessageEventHook } from '../../../../hooks'; +import { useMessageEvent } from '../../../../hooks'; import { ModToolsUserModActionView } from './ModToolsUserModActionView'; import { ModToolsUserRoomVisitsView } from './ModToolsUserRoomVisitsView'; import { ModToolsUserSendMessageView } from './ModToolsUserSendMessageView'; @@ -22,17 +21,6 @@ export const ModToolsUserView: FC = props => const [ modActionVisible, setModActionVisible ] = useState(false); const [ roomVisitsVisible, setRoomVisitsVisible ] = useState(false); - const onModtoolUserInfoEvent = useCallback((event: ModeratorUserInfoEvent) => - { - const parser = event.getParser(); - - if(!parser || parser.data.userId !== userId) return; - - setUserInfo(parser.data); - }, [ userId ]); - - UseMessageEventHook(ModeratorUserInfoEvent, onModtoolUserInfoEvent); - const userProperties = useMemo(() => { if(!userInfo) return null; @@ -98,6 +86,15 @@ export const ModToolsUserView: FC = props => ]; }, [ userInfo ]); + useMessageEvent(ModeratorUserInfoEvent, event => + { + const parser = event.getParser(); + + if(!parser || parser.data.userId !== userId) return; + + setUserInfo(parser.data); + }); + useEffect(() => { SendMessageComposer(new GetModeratorUserInfoMessageComposer(userId)); @@ -107,7 +104,7 @@ export const ModToolsUserView: FC = props => return ( <> - + onCloseClick() } /> @@ -115,24 +112,24 @@ export const ModToolsUserView: FC = props => { userProperties.map( (property, index) => - { + { - return ( - - - - - ); - }) } + return ( + + + + + ); + }) }
{ LocalizeText(property.localeKey) } - { property.value } - { property.showOnline && - } -
{ LocalizeText(property.localeKey) } + { property.value } + { property.showOnline && + } +
- } + + } + { !isDoorbell && + <> + + { LocalizeText('navigator.password.enter') } + setPassword(event.target.value) } /> + + + + + + } +
+
+ ); +} diff --git a/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx b/src/components/navigator/views/NavigatorRoomCreatorView.tsx similarity index 61% rename from src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx rename to src/components/navigator/views/NavigatorRoomCreatorView.tsx index 4158d1da..516fd09e 100644 --- a/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx +++ b/src/components/navigator/views/NavigatorRoomCreatorView.tsx @@ -1,11 +1,9 @@ /* eslint-disable no-template-curly-in-string */ -import { HabboClubLevelEnum, RoomCreateComposer } from '@nitrots/nitro-renderer'; +import { CreateFlatMessageComposer, HabboClubLevelEnum } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { GetClubMemberLevel, GetConfiguration, LocalizeText, SendMessageComposer } from '../../../../api'; -import { Button, Column, Flex, Grid, LayoutCurrencyIcon, LayoutGridItem, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; -import { IRoomModel, RoomModels } from '../../common/RoomModels'; -import { useNavigatorContext } from '../../NavigatorContext'; +import { GetClubMemberLevel, GetConfiguration, IRoomModel, LocalizeText, SendMessageComposer } from '../../../api'; +import { Button, Column, Flex, Grid, LayoutCurrencyIcon, LayoutGridItem, Text } from '../../../common'; +import { useNavigator } from '../../../hooks'; export const NavigatorRoomCreatorView: FC<{}> = props => { @@ -15,9 +13,11 @@ export const NavigatorRoomCreatorView: FC<{}> = props => 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 [ roomModels, setRoomModels ] = useState([]); + const [ selectedModelName, setSelectedModelName ] = useState(''); + const { categories = null } = useNavigator(); + + const hcDisabled = GetConfiguration('hc.disabled', false); const getRoomModelImage = (name: string) => GetConfiguration('images.url') + `/navigator/models/model_${ name }.png`; @@ -25,13 +25,13 @@ export const NavigatorRoomCreatorView: FC<{}> = props => { if(!model || (model.clubLevel > GetClubMemberLevel())) return; - setSelectedModelName(RoomModels[index].name); - } + setSelectedModelName(roomModels[index].name); + }; const createRoom = () => { - SendMessageComposer(new RoomCreateComposer(name, description, 'model_' + selectedModelName, Number(category), Number(visitorsCount), tradesSetting)); - } + SendMessageComposer(new CreateFlatMessageComposer(name, description, 'model_' + selectedModelName, Number(category), Number(visitorsCount), tradesSetting)); + }; useEffect(() => { @@ -41,11 +41,8 @@ export const NavigatorRoomCreatorView: FC<{}> = props => for(let i = 10; i <= 100; i = i + 10) list.push(i); - BatchUpdates(() => - { - setMaxVisitorsList(list); - setVisitorsCount(list[0]); - }); + setMaxVisitorsList(list); + setVisitorsCount(list[0]); } }, [ maxVisitorsList ]); @@ -54,6 +51,17 @@ export const NavigatorRoomCreatorView: FC<{}> = props => if(categories && categories.length) setCategory(categories[0].id); }, [ categories ]); + useEffect(() => + { + const models = GetConfiguration('navigator.room.models'); + + if(models && models.length) + { + setRoomModels(models); + setSelectedModelName(models[0].name); + } + }, []); + return ( @@ -64,24 +72,24 @@ export const NavigatorRoomCreatorView: FC<{}> = props => { LocalizeText('navigator.createroom.roomdescinfo') } - +
+
+ + ); +} diff --git a/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx b/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx new file mode 100644 index 00000000..f3a73b6c --- /dev/null +++ b/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx @@ -0,0 +1,41 @@ +import { FurnitureStackHeightComposer } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; +import ReactSlider from 'react-slider'; +import { LocalizeText, SendMessageComposer } from '../../../../api'; +import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; +import { useFurnitureStackHeightWidget } from '../../../../hooks'; + +export const FurnitureStackHeightView: FC<{}> = props => +{ + const { objectId = -1, height = 0, maxHeight = 40, onClose = null, updateHeight = null } = useFurnitureStackHeightWidget(); + + if(objectId === -1) return null; + + return ( + + + + { LocalizeText('widget.custom.stack.height.text') } + + updateHeight(event) } + renderThumb={ (props, state) =>
{ state.valueNow }
} /> + updateHeight(parseFloat(event.target.value)) } /> +
+ + + + +
+
+ ); +} diff --git a/src/components/room/widgets/furniture/FurnitureStickieView.tsx b/src/components/room/widgets/furniture/FurnitureStickieView.tsx new file mode 100644 index 00000000..cfa23e26 --- /dev/null +++ b/src/components/room/widgets/furniture/FurnitureStickieView.tsx @@ -0,0 +1,52 @@ +import { FC, useEffect, useState } from 'react'; +import { ColorUtils } from '../../../../api'; +import { DraggableWindow, DraggableWindowPosition } from '../../../../common'; +import { useFurnitureStickieWidget } from '../../../../hooks'; + +const STICKIE_COLORS = [ '9CCEFF','FF9CFF', '9CFF9C','FFFF33' ]; +const STICKIE_COLOR_NAMES = [ 'blue', 'pink', 'green', 'yellow' ]; + +const getStickieColorName = (color: string) => +{ + let index = STICKIE_COLORS.indexOf(color); + + if(index === -1) index = 0; + + return STICKIE_COLOR_NAMES[index]; +} + +export const FurnitureStickieView: FC<{}> = props => +{ + const { objectId = -1, color = '0', text = '', canModify = false, updateColor = null, updateText = null, trash = null, onClose = null } = useFurnitureStickieWidget(); + const [ isEditing, setIsEditing ] = useState(false); + + useEffect(() => + { + setIsEditing(false); + }, [ objectId, color, text ]); + + if(objectId === -1) return null; + + return ( + +
+
+
+ { canModify && + <> +
+ { STICKIE_COLORS.map(color => + { + return
updateColor(color) } style={ { backgroundColor: ColorUtils.makeColorHex(color) } } /> + }) } + } +
+
+
+
+ { (!isEditing || !canModify) ?
(canModify && setIsEditing(true)) }>{ text }
: } +
+
+ + ); +} diff --git a/src/components/room/widgets/furniture/FurnitureTrophyView.tsx b/src/components/room/widgets/furniture/FurnitureTrophyView.tsx new file mode 100644 index 00000000..7977097e --- /dev/null +++ b/src/components/room/widgets/furniture/FurnitureTrophyView.tsx @@ -0,0 +1,12 @@ +import { FC } from 'react'; +import { LayoutTrophyView } from '../../../../common'; +import { useFurnitureTrophyWidget } from '../../../../hooks'; + +export const FurnitureTrophyView: FC<{}> = props => +{ + const { objectId = -1, color = '1', senderName = '', date = '', message = '', onClose = null } = useFurnitureTrophyWidget(); + + if(objectId === -1) return null; + + return ; +} diff --git a/src/components/room/widgets/furniture/FurnitureWidgets.scss b/src/components/room/widgets/furniture/FurnitureWidgets.scss index b6a09bcf..a129da04 100644 --- a/src/components/room/widgets/furniture/FurnitureWidgets.scss +++ b/src/components/room/widgets/furniture/FurnitureWidgets.scss @@ -17,13 +17,14 @@ .dimmer-banner { width: 56px; height: 79px; - background: url('../../../../assets/images/room-widgets/dimmer-widget/dimmer_banner.png') center no-repeat; + background: url("../../../../assets/images/room-widgets/dimmer-widget/dimmer_banner.png") + center no-repeat; } .color-swatch { height: 30px; border: 2px solid $white; - box-shadow: inset 3px 3px rgba(0, 0, 0, .2); + box-shadow: inset 3px 3px rgba(0, 0, 0, 0.2); &.active { box-shadow: none; @@ -36,14 +37,13 @@ height: $nitro-widget-exchange-credit-height; .exchange-image { - background-image: url('../../../../assets/images/room-widgets/exchange-credit/exchange-credit-image.png'); + background-image: url("../../../../assets/images/room-widgets/exchange-credit/exchange-credit-image.png"); width: 103px; height: 103px; } } .nitro-external-image-widget { - .picture-preview { width: 320px; height: 320px; @@ -51,24 +51,262 @@ } .nitro-gift-opening { - + width: 340px; + resize: none; } .nitro-mannequin { + width: 300px; + + .mannequin-preview { + display: flex; + justify-content: center; + align-items: center; + width: 83px; + height: 130px; + background-image: url("../../../../assets/images/room-widgets/mannequin-widget/mannequin-spritesheet.png"); + overflow: hidden; + + .avatar-image { + background-position: unset; + top: -8px; + } + } } -.mannequin-preview { - display: flex; - justify-content: center; - align-items: center; - width: 83px; - height: 130px; - background-image: url('../../../../assets/images/room-widgets/mannequin-widget/mannequin-spritesheet.png'); - overflow: hidden; +.nitro-stickie { + position: relative; + width: 185px; + height: 178px; + top: 25px; + left: 25px; + padding: 1px; + pointer-events: all; + + .stickie-header { + width: 183px; + height: 18px; + padding: 0 7px; + + .header-trash, + .header-close { + cursor: pointer; + } + + .stickie-color { + width: 10px; + height: 10px; + cursor: pointer; + } + } + + .stickie-context { + width: 183px; + height: 145px; + padding: 2px 7px; + font-size: 12px; + color: $black; + + .context-text { + width: 100%; + height: 100%; + padding: 0; + overflow-wrap: break-word; + white-space: break-spaces; + overflow-y: auto; + } + + textarea { + background: transparent; + border: 0; + outline: none; + box-shadow: none; + resize: none; + font-style: italic; + + &:active { + border: 0; + outline: none; + box-shadow: none; + } + } + } } -@import './friend-furni/FurnitureFriendFurniView'; -@import './manipulation-menu/FurnitureManipulationMenuView'; -@import './stickie/FurnitureStickieView'; -@import './high-score/FurnitureHighScoreView'; -@import './youtube-tv/FurnitureYoutubeDisplayView'; +.nitro-stickie-image { + background-image: url("../../../../assets/images/room-widgets/stickie-widget/stickie-spritesheet.png"); + + &.stickie-blue, + &.stickie-yellow, + &.stickie-green, + &.stickie-pink { + width: 185px; + height: 178px; + } + + &.stickie-blue { + background-position: -2px -2px; + } + + &.stickie-yellow { + background-image: url("../../../../assets/images/room-widgets/stickie-widget/stickie-yellow.png"); + //background-position: -191px -184px; + } + + &.stickie-green { + background-position: -191px -2px; + } + + &.stickie-pink { + background-position: -2px -184px; + } + + &.stickie-close { + width: 10px; + height: 10px; + background-position: -2px -366px; + } + + &.stickie-trash { + width: 9px; + height: 10px; + background-position: -16px -366px; + } +} + +.nitro-engraving-lock { + width: 300px; + + .engraving-lock-stage-1 { + width: 31px; + height: 39px; + background-position: -380px -43px; + background-image: url('../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); + } + + .engraving-lock-stage-2 { + width: 36px; + height: 43px; + background-position: -375px 0px; + background-image: url('../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); + } +} + +.nitro-engraving-lock-view { + width: 375px; + height: 210px; + background-position: 0px 0px; + background-image: url('../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); + + color: #622e54; + font-weight: bold; + font-size: 16px; + text-shadow: 0px 1px white; + + &.engraving-lock-3 { + background-position: 0px -210px; + color: #614110; + } + + &.engraving-lock-4 { + background-position: 0px -420px; + color: #f1dcc8; + text-shadow: 0px 2px rgba(0, 0, 0, .4); + + .engraving-lock-avatar { + margin-bottom: 10px; + } + } + + .engraving-lock-close { + position: absolute; + cursor: pointer; + width: 15px; + height: 15px; + top: 34px; + right: 27px; + } + + .engraving-lock-avatar { + width: 70px; + height: 120px; + + div { + position: absolute; + margin-top: -5px; + } + + &:nth-child(1) { + div { + margin-left: -10px; + } + } + + &:nth-child(2) { + div { + margin-left: -15px; + } + } + } +} + +.nitro-widget-high-score { + width: 250px; + max-width: 250px; + height: 200px; +} + +.youtube-tv-widget { + width: 600px; + height: 380px; + + .youtube-video-container { + //min-height: 366px; + + .empty-video { + background-color: black; + color: white; + width: 100%; + height: 100%; + text-align: center; + } + + .youtubeContainer { + position: relative; + width: 100%; + height: 100%; + //height: 0; + //padding-bottom: 56.25%; + overflow: hidden; + margin-bottom: 50px; + } + + .youtubeContainer iframe { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + } + } + + .playlist-container { + overflow-y: hidden; + margin-right: -10px; + color: black; + height: 100%; + + .playlist-controls { + width: 100%; + .icon { + margin-right: 10px; + margin-bottom: 10px; + } + } + + .playlist-grid { + height: 100%; + width: 100%; + } + } +} diff --git a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx index 553965d6..207d934a 100644 --- a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx +++ b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx @@ -1,39 +1,44 @@ import { FC } from 'react'; -import { FurnitureBackgroundColorView } from './background-color/FurnitureBackgroundColorView'; -import { FurnitureBadgeDisplayView } from './badge-display/FurnitureBadgeDisplayView'; +import { Base } from '../../../../common'; import { FurnitureContextMenuView } from './context-menu/FurnitureContextMenuView'; -import { FurnitureCustomStackHeightView } from './custom-stack-height/FurnitureCustomStackHeightView'; -import { FurnitureDimmerView } from './dimmer/FurnitureDimmerView'; -import { FurnitureExchangeCreditView } from './exchange-credit/FurnitureExchangeCreditView'; -import { FurnitureExternalImageView } from './external-image/FurnitureExternalImageView'; -import { FurnitureFriendFurniView } from './friend-furni/FurnitureFriendFurniView'; -import { FurnitureGiftOpeningView } from './gift-opening/FurnitureGiftOpeningView'; -import { FurnitureHighScoreView } from './high-score/FurnitureHighScoreView'; -import { FurnitureManipulationMenuView } from './manipulation-menu/FurnitureManipulationMenuView'; -import { FurnitureMannequinView } from './mannequin/FurnitureMannequinView'; -import { FurnitureStickieView } from './stickie/FurnitureStickieView'; -import { FurnitureTrophyView } from './trophy/FurnitureTrophyView'; -import { FurnitureYoutubeDisplayView } from './youtube-tv/FurnitureYoutubeDisplayView'; +import { FurnitureBackgroundColorView } from './FurnitureBackgroundColorView'; +import { FurnitureBadgeDisplayView } from './FurnitureBadgeDisplayView'; +import { FurnitureDimmerView } from './FurnitureDimmerView'; +import { FurnitureExchangeCreditView } from './FurnitureExchangeCreditView'; +import { FurnitureExternalImageView } from './FurnitureExternalImageView'; +import { FurnitureFriendFurniView } from './FurnitureFriendFurniView'; +import { FurnitureGiftOpeningView } from './FurnitureGiftOpeningView'; +import { FurnitureHighScoreView } from './FurnitureHighScoreView'; +import { FurnitureInternalLinkView } from './FurnitureInternalLinkView'; +import { FurnitureMannequinView } from './FurnitureMannequinView'; +import { FurnitureRoomLinkView } from './FurnitureRoomLinkView'; +import { FurnitureSpamWallPostItView } from './FurnitureSpamWallPostItView'; +import { FurnitureStackHeightView } from './FurnitureStackHeightView'; +import { FurnitureStickieView } from './FurnitureStickieView'; +import { FurnitureTrophyView } from './FurnitureTrophyView'; +import { FurnitureYoutubeDisplayView } from './FurnitureYoutubeDisplayView'; export const FurnitureWidgetsView: FC<{}> = props => { return ( -
+ - - + + + - - + + + + - - + -
+ ); } diff --git a/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx b/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx new file mode 100644 index 00000000..a235f25b --- /dev/null +++ b/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx @@ -0,0 +1,104 @@ +import { FC, useCallback, useEffect, useState } from 'react'; +import YouTube, { Options } from 'react-youtube'; +import { YouTubePlayer } from 'youtube-player/dist/types'; +import { LocalizeText, YoutubeVideoPlaybackStateEnum } from '../../../../api'; +import { Grid, LayoutGridItem, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; +import { useFurnitureYoutubeWidget } from '../../../../hooks'; + +export const FurnitureYoutubeDisplayView: FC<{}> = props => +{ + const [ player, setPlayer ] = useState(null); + const { objectId = -1, videoId = null, videoStart = 0, videoEnd = 0, currentVideoState = null, selectedVideo = null, playlists = [], onClose = null, previous = null, next = null, pause = null, play = null, selectVideo = null } = useFurnitureYoutubeWidget(); + + const onStateChange = useCallback((event: { target: YouTubePlayer; data: number }) => + { + setPlayer(event.target); + + if(objectId === -1) return; + + switch(event.target.getPlayerState()) + { + case -1: + case 1: + if(currentVideoState === 2) + { + //event.target.pauseVideo(); + } + + if(currentVideoState !== 1) play(); + return; + case 2: + if(currentVideoState !== 2) pause(); + } + }, [ objectId, currentVideoState, play, pause ]); + + useEffect(() => + { + if((currentVideoState === null) || !player) return; + + if((currentVideoState === YoutubeVideoPlaybackStateEnum.PLAYING) && (player.getPlayerState() !== YoutubeVideoPlaybackStateEnum.PLAYING)) + { + player.playVideo(); + + return; + } + + if((currentVideoState === YoutubeVideoPlaybackStateEnum.PAUSED) && (player.getPlayerState() !== YoutubeVideoPlaybackStateEnum.PAUSED)) + { + player.pauseVideo(); + + return; + } + }, [ currentVideoState, player ]); + + if(objectId === -1) return null; + + const youtubeOptions: Options = { + height: '375', + width: '500', + playerVars: { + autoplay: 1, + disablekb: 1, + controls: 0, + origin: window.origin, + modestbranding: 1, + start: videoStart, + end: videoEnd + } + } + + return ( + + + +
+
+ { (videoId && videoId.length > 0) && + setPlayer(event.target) } onStateChange={ onStateChange } containerClassName={ 'youtubeContainer' } /> + } + { (!videoId || videoId.length === 0) && +
{ LocalizeText('widget.furni.video_viewer.no_videos') }
+ } +
+
+ + + + +
{ LocalizeText('widget.furni.video_viewer.playlists') }
+ + { playlists && playlists.map((entry, index) => + { + return ( + selectVideo(entry.video) } itemActive={ (entry.video === selectedVideo) }> + { entry.title } - { entry.description } + + ) + }) } + +
+
+
+
+ ) +} diff --git a/src/components/room/widgets/furniture/background-color/FurnitureBackgroundColorView.tsx b/src/components/room/widgets/furniture/background-color/FurnitureBackgroundColorView.tsx deleted file mode 100644 index de6b1e54..00000000 --- a/src/components/room/widgets/furniture/background-color/FurnitureBackgroundColorView.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import { ApplyTonerComposer, RoomControllerLevel, RoomEngineObjectEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { GetRoomEngine, GetSessionDataManager, LocalizeText, RoomWidgetUpdateBackgroundColorPreviewEvent, RoomWidgetUpdateRoomObjectEvent, SendMessageComposer } from '../../../../../api'; -import { Button, Column, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook, UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; - -export const FurnitureBackgroundColorView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ hue, setHue ] = useState(0); - const [ saturation, setSaturation ] = useState(0); - const [ lightness, setLightness ] = useState(0); - const { roomSession = null, eventDispatcher = null } = useRoomContext(); - - const close = useCallback(() => - { - eventDispatcher.dispatchEvent(new RoomWidgetUpdateBackgroundColorPreviewEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.CLEAR_PREVIEW)); - - setObjectId(-1); - }, [ eventDispatcher ]); - - const canOpenBackgroundToner = useCallback(() => - { - const isRoomOwner = roomSession.isRoomOwner; - const hasLevel = (roomSession.controllerLevel >= RoomControllerLevel.GUEST); - const isGodMode = GetSessionDataManager().isGodMode; - - return (isRoomOwner || hasLevel || isGodMode); - }, [ roomSession ]); - - const onRoomEngineObjectEvent = useCallback((event: RoomEngineObjectEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR: { - if(!canOpenBackgroundToner()) return; - - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - const model = roomObject.model; - - BatchUpdates(() => - { - setObjectId(roomObject.id); - setHue(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_HUE))); - setSaturation(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION))); - setLightness(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS))); - }); - - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - if(objectId !== event.objectId) return; - - close(); - return; - } - } - }, [ objectId, canOpenBackgroundToner, close ]); - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR, onRoomEngineObjectEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, eventDispatcher, onRoomEngineObjectEvent); - - const processAction = useCallback((name: string) => - { - switch(name) - { - case 'apply': - SendMessageComposer(new ApplyTonerComposer(objectId, hue, saturation, lightness)); - break; - case 'toggle': - roomSession.useMultistateItem(objectId); - break; - } - }, [ roomSession, objectId, hue, saturation, lightness ]); - - useEffect(() => - { - if(objectId === -1) return; - - eventDispatcher.dispatchEvent(new RoomWidgetUpdateBackgroundColorPreviewEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.PREVIEW, hue, saturation, lightness)); - }, [ eventDispatcher, objectId, hue, saturation, lightness ]); - - if(objectId === -1) return null; - - return ( - - - - - - { LocalizeText('widget.backgroundcolor.hue') } - setHue(event) } - thumbClassName={ 'thumb degree' } - renderThumb={ (props, state) =>
{ state.valueNow }
} /> -
- - { LocalizeText('widget.backgroundcolor.saturation') } - setSaturation(event) } - thumbClassName={ 'thumb percent' } - renderThumb={ (props, state) =>
{ state.valueNow }
} /> -
- - { LocalizeText('widget.backgroundcolor.lightness') } - setLightness(event) } - thumbClassName={ 'thumb percent' } - renderThumb={ (props, state) =>
{ state.valueNow }
} /> -
-
- - - - -
-
- ); -} diff --git a/src/components/room/widgets/furniture/badge-display/FurnitureBadgeDisplayView.tsx b/src/components/room/widgets/furniture/badge-display/FurnitureBadgeDisplayView.tsx deleted file mode 100644 index 079fc733..00000000 --- a/src/components/room/widgets/furniture/badge-display/FurnitureBadgeDisplayView.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, StringDataType } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { GetRoomEngine, LocalizeBadgeDescription, LocalizeBadgeName, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { LayoutTrophyView } from '../../../../../common'; -import { UseEventDispatcherHook, UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { FurnitureTrophyData } from '../trophy/FurnitureTrophyData'; - -export const FurnitureBadgeDisplayView: FC<{}> = props => -{ - const [ trophyData, setTrophyData ] = useState(null); - const { widgetHandler = null } = useRoomContext(); - - const onNitroEvent = useCallback((event: NitroEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING: - case RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - const stringStuff = new StringDataType(); - - stringStuff.initializeFromRoomObjectModel(roomObject.model); - - const badgeName = LocalizeBadgeName(stringStuff.getValue(1)); - const badgeDesc = LocalizeBadgeDescription(stringStuff.getValue(1)); - const date = stringStuff.getValue(2); - const senderName = stringStuff.getValue(3); - - setTrophyData(new FurnitureTrophyData(widgetEvent.objectId, widgetEvent.category, '1', senderName, date, badgeDesc, badgeName)); - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); - - setTrophyData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - - return null; - }); - return; - } - } - }, []); - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING, onNitroEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING, onNitroEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, widgetHandler.eventDispatcher, onNitroEvent); - - const processAction = useCallback((type: string, value: string = null) => - { - switch(type) - { - case 'close': - setTrophyData(null); - return; - } - }, []); - - if(!trophyData) return null; - - return processAction('close') } />; -} diff --git a/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx b/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx index 79662119..f7e35b91 100644 --- a/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx +++ b/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx @@ -1,35 +1,35 @@ import { FC } from 'react'; import { LocalizeText } from '../../../../../api'; import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { useRoomContext } from '../../../RoomContext'; +import { useRoom } from '../../../../../hooks'; interface EffectBoxConfirmViewProps { objectId: number; - close: () => void; + onClose: () => void; } export const EffectBoxConfirmView: FC = props => { - const { objectId = -1, close = null } = props; - const { roomSession = null } = useRoomContext(); + const { objectId = -1, onClose = null } = props; + const { roomSession = null } = useRoom(); const useProduct = () => { roomSession.useMultistateItem(objectId); - close(); + onClose(); } return ( - + { LocalizeText('effectbox.header.description') } - + diff --git a/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx b/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx index 2bb70ff2..4ea67733 100644 --- a/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx +++ b/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx @@ -1,8 +1,7 @@ -import { ContextMenuEnum, GroupFurniContextMenuInfoMessageEvent, GroupFurniContextMenuInfoMessageParser, RoomEngineTriggerWidgetEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { GetGroupInformation, GetRoomEngine, IsOwnerOfFurniture, LocalizeText, RoomWidgetFurniActionMessage, TryJoinGroup, TryVisitRoom } from '../../../../../api'; -import { BatchUpdates, UseMessageEventHook, UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; +import { ContextMenuEnum, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; +import { GetGroupInformation, LocalizeText } from '../../../../../api'; +import { useFurnitureContextMenuWidget } from '../../../../../hooks'; import { ContextMenuHeaderView } from '../../context-menu/ContextMenuHeaderView'; import { ContextMenuListItemView } from '../../context-menu/ContextMenuListItemView'; import { ContextMenuView } from '../../context-menu/ContextMenuView'; @@ -17,165 +16,18 @@ const EFFECTBOX_OPEN: string = 'EFFECTBOX_OPEN'; export const FurnitureContextMenuView: FC<{}> = props => { - const [ objectId, setObjectId ] = useState(-1); - const [ mode, setMode ] = useState(null); - const [ confirmMode, setConfirmMode ] = useState(null); - const [ confirmingObjectId, setConfirmingObjectId ] = useState(-1); - const [ groupData, setGroupData ] = useState(null); - const [ isGroupMember, setIsGroupMember ] = useState(false); - const { roomSession = null, widgetHandler = null } = useRoomContext(); - - const close = useCallback(() => - { - BatchUpdates(() => - { - setObjectId(-1); - setGroupData(null); - setIsGroupMember(false); - setMode(null); - }); - }, []); - - const closeConfirm = () => - { - setConfirmMode(null); - setConfirmingObjectId(-1); - } - - const onRoomEngineTriggerWidgetEvent = useCallback((event: RoomEngineTriggerWidgetEvent) => - { - const object = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, event.category); - - if(!object) return; - - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG: - if(!IsOwnerOfFurniture(object)) return; - - BatchUpdates(() => - { - setConfirmingObjectId(object.id); - setConfirmMode(MONSTERPLANT_SEED_CONFIRMATION); - }); - - close(); - return; - case RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG: - if(!IsOwnerOfFurniture(object)) return; - - BatchUpdates(() => - { - setConfirmingObjectId(object.id); - setConfirmMode(EFFECTBOX_OPEN); - }); - - close(); - return; - case RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG: - if(!IsOwnerOfFurniture(object)) return; - - BatchUpdates(() => - { - setConfirmingObjectId(object.id); - setConfirmMode(PURCHASABLE_CLOTHING_CONFIRMATION); - }); - - close(); - return; - case RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU: - - BatchUpdates(() => - { - setObjectId(object.id); - - switch(event.contextMenu) - { - case ContextMenuEnum.FRIEND_FURNITURE: - setMode(ContextMenuEnum.FRIEND_FURNITURE); - return; - case ContextMenuEnum.MONSTERPLANT_SEED: - if(IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.MONSTERPLANT_SEED); - return; - case ContextMenuEnum.MYSTERY_BOX: - return; - case ContextMenuEnum.RANDOM_TELEPORT: - setMode(ContextMenuEnum.RANDOM_TELEPORT); - return; - case ContextMenuEnum.PURCHASABLE_CLOTHING: - if(IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.PURCHASABLE_CLOTHING); - return; - } - }); - - return; - case RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU: - if(object.id === objectId) close(); - return; - } - }, [ roomSession, objectId, close ]); - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU, onRoomEngineTriggerWidgetEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU, onRoomEngineTriggerWidgetEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG, onRoomEngineTriggerWidgetEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG, onRoomEngineTriggerWidgetEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG, onRoomEngineTriggerWidgetEvent); - - const onGroupFurniContextMenuInfoMessageEvent = useCallback((event: GroupFurniContextMenuInfoMessageEvent) => - { - const parser = event.getParser(); - - BatchUpdates(() => - { - setObjectId(parser.objectId); - setGroupData(parser); - setIsGroupMember(parser.userIsMember); - setMode(GROUP_FURNITURE); - }); - }, []); - - UseMessageEventHook(GroupFurniContextMenuInfoMessageEvent, onGroupFurniContextMenuInfoMessageEvent); - - const processAction = (name: string) => - { - if(name) - { - switch(name) - { - case 'use_friend_furni': - roomSession.useMultistateItem(objectId); - break; - case 'use_monsterplant_seed': - setConfirmMode(MONSTERPLANT_SEED_CONFIRMATION); - setConfirmingObjectId(objectId); - break; - case 'use_random_teleport': - widgetHandler.processWidgetMessage(new RoomWidgetFurniActionMessage(RoomWidgetFurniActionMessage.USE, objectId, RoomObjectCategory.FLOOR)); - break; - case 'use_purchaseable_clothing': - setConfirmMode(PURCHASABLE_CLOTHING_CONFIRMATION); - setConfirmingObjectId(objectId); - break; - case 'join_group': - TryJoinGroup(groupData.guildId); - setIsGroupMember(true); - return; - case 'go_to_group_homeroom': - if(groupData) TryVisitRoom(groupData.guildHomeRoomId); - break; - } - } - - close(); - } + const { closeConfirm = null, processAction = null, onClose = null, objectId = -1, mode = null, confirmMode = null, confirmingObjectId = -1, groupData = null, isGroupMember = false } = useFurnitureContextMenuWidget(); return ( <> - { (confirmMode === MONSTERPLANT_SEED_CONFIRMATION) && } - { (confirmMode === PURCHASABLE_CLOTHING_CONFIRMATION) && } - { (confirmMode === EFFECTBOX_OPEN) && } + { (confirmMode === MONSTERPLANT_SEED_CONFIRMATION) && + } + { (confirmMode === PURCHASABLE_CLOTHING_CONFIRMATION) && + } + { (confirmMode === EFFECTBOX_OPEN) && + } { (objectId >= 0) && mode && - + { (mode === ContextMenuEnum.FRIEND_FURNITURE) && <> @@ -217,15 +69,17 @@ export const FurnitureContextMenuView: FC<{}> = props => GetGroupInformation(groupData.guildId) }> { groupData.guildName } - { !isGroupMember && processAction('join_group') }> - { LocalizeText('widget.furniture.button.join.group') } - } + { !isGroupMember && + processAction('join_group') }> + { LocalizeText('widget.furniture.button.join.group') } + } processAction('go_to_group_homeroom') }> { LocalizeText('widget.furniture.button.go.to.group.home.room') } - { groupData.guildHasReadableForum && processAction('open_forum') }> - { LocalizeText('widget.furniture.button.open_group_forum') } - } + { groupData.guildHasReadableForum && + processAction('open_forum') }> + { LocalizeText('widget.furniture.button.open_group_forum') } + } } } diff --git a/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx b/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx index 2c040ef2..b7163cc5 100644 --- a/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx +++ b/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx @@ -1,14 +1,13 @@ import { IFurnitureData, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { GetFurnitureDataForRoomObject, LocalizeText, RoomWidgetUseProductMessage } from '../../../../../api'; +import { FurniCategory, GetFurnitureDataForRoomObject, LocalizeText } from '../../../../../api'; import { Base, Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { FurniCategory } from '../../../../inventory/common/FurniCategory'; -import { useRoomContext } from '../../../RoomContext'; +import { useRoom } from '../../../../../hooks'; interface MonsterPlantSeedConfirmViewProps { objectId: number; - close: () => void; + onClose: () => void; } const MODE_DEFAULT: number = -1; @@ -16,16 +15,16 @@ const MODE_MONSTERPLANT_SEED: number = 0; export const MonsterPlantSeedConfirmView: FC = props => { - const { objectId = -1, close = null } = props; + const { objectId = -1, onClose = null } = props; const [ furniData, setFurniData ] = useState(null); const [ mode, setMode ] = useState(MODE_DEFAULT); - const { roomSession = null, widgetHandler = null } = useRoomContext(); + const { roomSession = null } = useRoom(); const useProduct = () => { - widgetHandler.processWidgetMessage(new RoomWidgetUseProductMessage(RoomWidgetUseProductMessage.MONSTERPLANT_SEED, objectId)); + roomSession.useMultistateItem(objectId); - close(); + onClose(); } useEffect(() => @@ -49,19 +48,19 @@ export const MonsterPlantSeedConfirmView: FC = if(mode === MODE_DEFAULT) { - close(); + onClose(); return; } setMode(mode); - }, [ roomSession, objectId, close ]); + }, [ roomSession, objectId, onClose ]); if(mode === MODE_DEFAULT) return null; return ( - + @@ -75,7 +74,7 @@ export const MonsterPlantSeedConfirmView: FC = { LocalizeText('useproduct.widget.info.plant_seed') } - + diff --git a/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx b/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx index 0ca105cb..d07d5e82 100644 --- a/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx +++ b/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx @@ -1,15 +1,13 @@ import { RedeemItemClothingComposer, RoomObjectCategory, UserFigureComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { GetAvatarRenderManager, GetConnection, GetFurnitureDataForRoomObject, GetSessionDataManager, LocalizeText } from '../../../../../api'; +import { FigureData, FurniCategory, GetAvatarRenderManager, GetConnection, GetFurnitureDataForRoomObject, GetSessionDataManager, LocalizeText } from '../../../../../api'; import { Base, Button, Column, Flex, LayoutAvatarImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { FigureData } from '../../../../avatar-editor/common/FigureData'; -import { FurniCategory } from '../../../../inventory/common/FurniCategory'; -import { useRoomContext } from '../../../RoomContext'; +import { useRoom } from '../../../../../hooks'; interface PurchasableClothingConfirmViewProps { objectId: number; - close: () => void; + onClose: () => void; } const MODE_DEFAULT: number = -1; @@ -17,18 +15,18 @@ const MODE_PURCHASABLE_CLOTHING: number = 0; export const PurchasableClothingConfirmView: FC = props => { - const { objectId = -1, close = null } = props; + const { objectId = -1, onClose = null } = props; const [ mode, setMode ] = useState(MODE_DEFAULT); const [ gender, setGender ] = useState(FigureData.MALE); const [ newFigure, setNewFigure ] = useState(null); - const { roomSession = null } = useRoomContext(); + const { roomSession = null } = useRoom(); const useProduct = () => { GetConnection().send(new RedeemItemClothingComposer(objectId)); GetConnection().send(new UserFigureComposer(gender, newFigure)); - close(); + onClose(); } useEffect(() => @@ -64,7 +62,7 @@ export const PurchasableClothingConfirmView: FC - + @@ -95,7 +93,7 @@ export const PurchasableClothingConfirmView: FC{ LocalizeText('useproduct.widget.info.bind_clothing') } - + diff --git a/src/components/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx b/src/components/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx deleted file mode 100644 index 9aa2fb4f..00000000 --- a/src/components/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import { FurnitureStackHeightComposer, FurnitureStackHeightEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { LocalizeText, RoomWidgetUpdateCustomStackHeightEvent, SendMessageComposer } from '../../../../../api'; -import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook, UseMessageEventHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; - -const MAX_HEIGHT: number = 40; - -export const FurnitureCustomStackHeightView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ height, setHeight ] = useState(0); - const [ pendingHeight, setPendingHeight ] = useState(-1); - const { eventDispatcher = null } = useRoomContext(); - - const close = () => - { - BatchUpdates(() => - { - setObjectId(-1); - setHeight(0); - }); - } - - const updateHeight = useCallback((height: number, fromServer: boolean = false) => - { - if(!height) height = 0; - - height = Math.abs(height); - - if(!fromServer) ((height > MAX_HEIGHT) && (height = MAX_HEIGHT)); - - BatchUpdates(() => - { - setHeight(parseFloat(height.toFixed(2))); - - if(!fromServer) setPendingHeight(height * 100); - }); - }, []); - - const onRoomWidgetUpdateCustomStackHeightEvent = useCallback((event: RoomWidgetUpdateCustomStackHeightEvent) => - { - switch(event.type) - { - case RoomWidgetUpdateCustomStackHeightEvent.UPDATE_CUSTOM_STACK_HEIGHT: { - setObjectId(event.objectId); - updateHeight(event.height, true); - } - } - }, [ updateHeight ]); - - UseEventDispatcherHook(RoomWidgetUpdateCustomStackHeightEvent.UPDATE_CUSTOM_STACK_HEIGHT, eventDispatcher, onRoomWidgetUpdateCustomStackHeightEvent); - - const onFurnitureStackHeightEvent = useCallback((event: FurnitureStackHeightEvent) => - { - const parser = event.getParser(); - - if(objectId !== parser.furniId) return; - - updateHeight(parser.height, true); - }, [ objectId, updateHeight ]); - - UseMessageEventHook(FurnitureStackHeightEvent, onFurnitureStackHeightEvent); - - const sendUpdate = useCallback((height: number) => - { - SendMessageComposer(new FurnitureStackHeightComposer(objectId, ~~(height))); - }, [ objectId ]); - - useEffect(() => - { - if((objectId === -1) || (pendingHeight === -1)) return; - - const timeout = setTimeout(() => sendUpdate(~~(pendingHeight)), 10); - - return () => clearTimeout(timeout); - }, [ objectId, pendingHeight, sendUpdate ]); - - if(objectId === -1) return null; - - return ( - - - - { LocalizeText('widget.custom.stack.height.text') } - - updateHeight(event) } - renderThumb={ (props, state) =>
{ state.valueNow }
} /> - updateHeight(parseFloat(event.target.value)) } /> -
- - - - -
-
- ); -} diff --git a/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx b/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx deleted file mode 100644 index 4b1b4182..00000000 --- a/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx +++ /dev/null @@ -1,200 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import classNames from 'classnames'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { ColorUtils, GetConfiguration, LocalizeText, RoomWidgetDimmerChangeStateMessage, RoomWidgetDimmerPreviewMessage, RoomWidgetDimmerSavePresetMessage, RoomWidgetUpdateDimmerEvent, RoomWidgetUpdateDimmerStateEvent } from '../../../../../api'; -import { Base, Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { DimmerFurnitureWidgetPresetItem } from './DimmerFurnitureWidgetPresetItem'; - -const AVAILABLE_COLORS: number[] = [7665141, 21495, 15161822, 15353138, 15923281, 8581961, 0]; -const HTML_COLORS: string[] = ['#74F5F5', '#0053F7', '#E759DE', '#EA4532', '#F2F851', '#82F349', '#000000']; -const MIN_BRIGHTNESS: number = 76; -const MAX_BRIGHTNESS: number = 255; - -export const FurnitureDimmerView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ presets, setPresets ] = useState([]); - const [ selectedPresetId, setSelectedPresetId ] = useState(0); - const [ dimmerState, setDimmerState ] = useState(0); - const [ lastDimmerState, setLastDimmerState ] = useState(0); - const [ effectId, setEffectId ] = useState(0); - const [ color, setColor ] = useState(0xFFFFFF); - const [ brightness, setBrightness ] = useState(0xFF); - const [ selectedEffectId, setSelectedEffectId ] = useState(0); - const [ selectedColor, setSelectedColor ] = useState(0); - const [ selectedBrightness, setSelectedBrightness ] = useState(0); - const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); - - const onNitroEvent = useCallback((event: NitroEvent) => - { - switch(event.type) - { - case RoomWidgetUpdateDimmerEvent.PRESETS: { - const widgetEvent = (event as RoomWidgetUpdateDimmerEvent); - - const presets: DimmerFurnitureWidgetPresetItem[] = []; - - for(const preset of widgetEvent.presets) presets.push(new DimmerFurnitureWidgetPresetItem(preset.id, preset.type, preset.color, preset.brightness)); - - BatchUpdates(() => - { - setPresets(presets); - setSelectedPresetId(widgetEvent.selectedPresetId); - setIsVisible(true); - }); - return; - } - case RoomWidgetUpdateDimmerEvent.HIDE: { - setIsVisible(false); - - return; - } - case RoomWidgetUpdateDimmerStateEvent.DIMMER_STATE: { - const widgetEvent = (event as RoomWidgetUpdateDimmerStateEvent); - - BatchUpdates(() => - { - setLastDimmerState(dimmerState); - setDimmerState(widgetEvent.state); - setSelectedPresetId(widgetEvent.presetId); - setEffectId(widgetEvent.effectId); - setSelectedEffectId(widgetEvent.effectId); - setColor(widgetEvent.color); - setSelectedColor(widgetEvent.color); - setBrightness(widgetEvent.brightness); - setSelectedBrightness(widgetEvent.brightness); - }); - - return; - } - } - }, [ dimmerState ]); - - UseEventDispatcherHook(RoomWidgetUpdateDimmerEvent.PRESETS, eventDispatcher, onNitroEvent); - UseEventDispatcherHook(RoomWidgetUpdateDimmerEvent.HIDE, eventDispatcher, onNitroEvent); - UseEventDispatcherHook(RoomWidgetUpdateDimmerStateEvent.DIMMER_STATE, eventDispatcher, onNitroEvent); - - const selectPresetId = useCallback((id: number) => - { - const preset = presets[(id - 1)]; - - if(!preset) return; - - BatchUpdates(() => - { - setSelectedPresetId(preset.id); - setSelectedEffectId(preset.type); - setSelectedColor(preset.color); - setSelectedBrightness(preset.light); - }); - }, [ presets ]); - - const close = useCallback(() => - { - widgetHandler.processWidgetMessage(new RoomWidgetDimmerPreviewMessage(color, brightness, (effectId === 2))); - - setIsVisible(false); - }, [ widgetHandler, color, brightness, effectId ]); - - const toggleState = useCallback(() => - { - widgetHandler.processWidgetMessage(new RoomWidgetDimmerChangeStateMessage()); - }, [ widgetHandler ]); - - const applyChanges = useCallback(() => - { - if(dimmerState === 0) return; - - const selectedPresetIndex = (selectedPresetId - 1); - - if((selectedPresetId < 1) || (selectedPresetId > presets.length)) return; - - const preset = presets[selectedPresetIndex]; - - if(!preset || ((selectedEffectId === preset.type) && (selectedColor === preset.color) && (selectedBrightness === preset.light))) return; - - setPresets(prevValue => - { - const newValue = [ ...prevValue ]; - - newValue[selectedPresetIndex] = new DimmerFurnitureWidgetPresetItem(preset.id, selectedEffectId, selectedColor, selectedBrightness); - - return newValue; - }); - - widgetHandler.processWidgetMessage(new RoomWidgetDimmerSavePresetMessage(preset.id, selectedEffectId, selectedColor, selectedBrightness, true)); - }, [ widgetHandler, dimmerState, selectedPresetId, presets, selectedEffectId, selectedColor, selectedBrightness ]); - - const scaledBrightness = useCallback((value: number) => - { - return ~~((((value - MIN_BRIGHTNESS) * (100 - 0)) / (MAX_BRIGHTNESS - MIN_BRIGHTNESS)) + 0); - }, []); - - const isFreeColorMode = useMemo(() => GetConfiguration('widget.dimmer.colorwheel', false), []); - - useEffect(() => - { - if((dimmerState === 0) && (lastDimmerState === 0)) return; - - widgetHandler.processWidgetMessage(new RoomWidgetDimmerPreviewMessage(selectedColor, selectedBrightness, (selectedEffectId === 2))); - }, [ widgetHandler, dimmerState, lastDimmerState, selectedColor, selectedBrightness, selectedEffectId ]); - - if(!isVisible) return null; - - return ( - - - { (dimmerState === 1) && - - { presets.map(preset => selectPresetId(preset.id) }>{ LocalizeText(`widget.dimmer.tab.${preset.id}`) }) } - } - - { (dimmerState === 0) && - - - { LocalizeText('widget.dimmer.info.off') } - - } - { (dimmerState === 1) && - <> - - { LocalizeText('widget.backgroundcolor.hue') } - { isFreeColorMode && - setSelectedColor(ColorUtils.convertFromHex(event.target.value)) } /> } - { !isFreeColorMode && - - { AVAILABLE_COLORS.map((color, index) => - { - return ( - setSelectedColor(color) } style={{ backgroundColor: HTML_COLORS[index] }} /> - ); - }) } - } - - - { LocalizeText('widget.backgroundcolor.lightness') } - setSelectedBrightness(value) } - thumbClassName={ 'thumb percent' } - renderThumb={ (props, state) =>
{ scaledBrightness(state.valueNow) }
} /> -
- - setSelectedEffectId(event.target.checked ? 2 : 1) } /> - { LocalizeText('widget.dimmer.type.checkbox') } - - - - - - } -
-
- ); -} diff --git a/src/components/room/widgets/furniture/exchange-credit/FurnitureExchangeCreditView.tsx b/src/components/room/widgets/furniture/exchange-credit/FurnitureExchangeCreditView.tsx deleted file mode 100644 index 7c2ac8c2..00000000 --- a/src/components/room/widgets/furniture/exchange-credit/FurnitureExchangeCreditView.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { FC, useCallback, useState } from 'react'; -import { LocalizeText, RoomWidgetCreditFurniRedeemMessage, RoomWidgetUpdateCreditFurniEvent } from '../../../../../api'; -import { Base, Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; - -export const FurnitureExchangeCreditView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ value, setValue ] = useState(0); - const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); - - const onRoomWidgetUpdateCreditFurniEvent = useCallback((event: RoomWidgetUpdateCreditFurniEvent) => - { - BatchUpdates(() => - { - setObjectId(event.objectId); - setValue(event.value); - }); - }, []); - - UseEventDispatcherHook(RoomWidgetUpdateCreditFurniEvent.CREDIT_FURNI_UPDATE, eventDispatcher, onRoomWidgetUpdateCreditFurniEvent); - - const close = () => - { - BatchUpdates(() => - { - setObjectId(-1); - setValue(0); - }); - } - - const redeem = () => - { - widgetHandler.processWidgetMessage(new RoomWidgetCreditFurniRedeemMessage(RoomWidgetCreditFurniRedeemMessage.REDEEM, objectId)); - - close(); - } - - if(objectId === -1) return null; - - return ( - - - - - - - - - - { LocalizeText('creditfurni.description', [ 'credits' ], [ value.toString() ]) } - { LocalizeText('creditfurni.prompt') } - - - - - - - ); -} diff --git a/src/components/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx b/src/components/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx deleted file mode 100644 index 65e192b6..00000000 --- a/src/components/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { FC, useCallback, useState } from 'react'; -import { IPhotoData, LocalizeText, RoomWidgetUpdateExternalImageEvent } from '../../../../../api'; -import { Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; - -export const FurnitureExternalImageView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ photoData, setPhotoData ] = useState(null); - const { eventDispatcher = null } = useRoomContext(); - - const close = () => - { - setObjectId(-1); - setPhotoData(null) - } - - const onRoomWidgetUpdateExternalImageEvent = useCallback((event: RoomWidgetUpdateExternalImageEvent) => - { - switch(event.type) - { - case RoomWidgetUpdateExternalImageEvent.UPDATE_EXTERNAL_IMAGE: { - - BatchUpdates(() => - { - setObjectId(event.objectId); - setPhotoData(event.photoData); - }); - } - } - }, []); - - UseEventDispatcherHook(RoomWidgetUpdateExternalImageEvent.UPDATE_EXTERNAL_IMAGE, eventDispatcher, onRoomWidgetUpdateExternalImageEvent); - - if((objectId === -1) || !photoData) return null; - - return ( - - - - - { !photoData.w && - { LocalizeText('camera.loading') } } - - { photoData.m && photoData.m.length && - { photoData.m } } - - { (photoData.n || '') } - { new Date(photoData.t * 1000).toLocaleDateString() } - - - - ); -} diff --git a/src/components/room/widgets/furniture/friend-furni/FriendFurniLockData.ts b/src/components/room/widgets/furniture/friend-furni/FriendFurniLockData.ts deleted file mode 100644 index 7a58ecdc..00000000 --- a/src/components/room/widgets/furniture/friend-furni/FriendFurniLockData.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class FurnitureEngravingLockData -{ - constructor( - public objectId: number, - public category: number = 0, - public type: number = 0, - public usernames: string[] = [], - public figures: string[] = [], - public date: string = null) {} -} diff --git a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.scss b/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.scss deleted file mode 100644 index eb6d8987..00000000 --- a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.scss +++ /dev/null @@ -1,76 +0,0 @@ -.nitro-engraving-lock { - width: 300px; - - .engraving-lock-stage-1 { - width: 31px; - height: 39px; - background-position: -380px -43px; - background-image: url('../../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); - } - - .engraving-lock-stage-2 { - width: 36px; - height: 43px; - background-position: -375px 0px; - background-image: url('../../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); - } -} - -.nitro-engraving-lock-view { - width: 375px; - height: 210px; - background-position: 0px 0px; - background-image: url('../../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); - - color: #622e54; - font-weight: bold; - font-size: 16px; - text-shadow: 0px 1px white; - - &.engraving-lock-3 { - background-position: 0px -210px; - color: #614110; - } - - &.engraving-lock-4 { - background-position: 0px -420px; - color: #f1dcc8; - text-shadow: 0px 2px rgba(0, 0, 0, .4); - - .engraving-lock-avatar { - margin-bottom: 10px; - } - } - - .engraving-lock-close { - position: absolute; - cursor: pointer; - width: 15px; - height: 15px; - top: 34px; - right: 27px; - } - - .engraving-lock-avatar { - width: 70px; - height: 120px; - - div { - position: absolute; - margin-top: -5px; - } - - &:nth-child(1) { - div { - margin-left: -10px; - } - } - - &:nth-child(2) { - div { - margin-left: -15px; - } - } - } - -} diff --git a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx b/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx deleted file mode 100644 index bb2176bb..00000000 --- a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx +++ /dev/null @@ -1,142 +0,0 @@ -import { FriendFurniConfirmLockMessageComposer, LoveLockFurniFinishedEvent, LoveLockFurniFriendConfirmedEvent, LoveLockFurniStartEvent, NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { GetRoomEngine, GetRoomSession, LocalizeText, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { DraggableWindow, LayoutAvatarImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../common'; -import { UseEventDispatcherHook, UseMessageEventHook, UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { FurnitureEngravingLockData } from './FriendFurniLockData'; - -export const FurnitureFriendFurniView: FC<{}> = props => -{ - const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); - const [ engravingLockData, setEngravingLockData ] = useState(null); - const [ engravingStage, setEngravingStage ] = useState(0); - - const onNitroEvent = (event: NitroEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); - const type = roomObject.model.getValue(RoomObjectVariable.FURNITURE_FRIENDFURNI_ENGRAVING); - - if(data[0] === '1') - { - if(data.length !== 6) return; - - setEngravingLockData(new FurnitureEngravingLockData(widgetEvent.objectId, widgetEvent.category, type, [ data[1], data[2] ], [ data[3], data[4] ], data[5])); - } - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); - - setEngravingLockData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - - return null; - }); - return; - } - } - }; - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, onNitroEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, eventDispatcher, onNitroEvent); - - const onLoveLockFurniStartEvent = useCallback((event: LoveLockFurniStartEvent) => - { - const parser = event.getParser(); - - setEngravingLockData(new FurnitureEngravingLockData(parser.furniId)); - - if(parser.start) - setEngravingStage(1); - else - setEngravingStage(2); - - }, []); - - UseMessageEventHook(LoveLockFurniStartEvent, onLoveLockFurniStartEvent); - - const processAction = useCallback((type: string, value: string = null) => - { - switch(type) - { - case 'close_view': - setEngravingLockData(null); - return; - case 'accept_request': - GetRoomSession().connection.send(new FriendFurniConfirmLockMessageComposer(engravingLockData.objectId, true)); - return; - case 'reject_request': - GetRoomSession().connection.send(new FriendFurniConfirmLockMessageComposer(engravingLockData.objectId, false)); - processAction('close_request'); - return; - case 'close_request': - setEngravingStage(0); - setEngravingLockData(null); - return; - } - }, [ engravingLockData ]); - - const onLoveLockDoneEvent = useCallback((event: LoveLockFurniFinishedEvent | LoveLockFurniFriendConfirmedEvent) => - { - processAction('close_request'); - }, [ processAction ]); - - UseMessageEventHook(LoveLockFurniFinishedEvent, onLoveLockDoneEvent); - UseMessageEventHook(LoveLockFurniFriendConfirmedEvent, onLoveLockDoneEvent); - - return ( - <> - { engravingStage > 0 && - processAction('close_request') } /> - -
- { LocalizeText('friend.furniture.confirm.lock.subtitle') } -
-
-
-
- { engravingStage === 2 &&
{ LocalizeText('friend.furniture.confirm.lock.other.locked') }
} -
- - -
-
-
} - { engravingLockData && engravingLockData.usernames.length > 0 && -
-
processAction('close_view') }>
-
-
- -
-
- -
-
-
-
- { engravingLockData.type === 0 && LocalizeText('lovelock.engraving.caption') } - { engravingLockData.type === 3 && LocalizeText('wildwest.engraving.caption') } -
-
{ engravingLockData.date }
-
-
{ engravingLockData.usernames[0] }
-
{ engravingLockData.usernames[1] }
-
-
-
-
} - - ); -} diff --git a/src/components/room/widgets/furniture/gift-opening/FurnitureGiftOpeningView.tsx b/src/components/room/widgets/furniture/gift-opening/FurnitureGiftOpeningView.tsx deleted file mode 100644 index 2cd425a7..00000000 --- a/src/components/room/widgets/furniture/gift-opening/FurnitureGiftOpeningView.tsx +++ /dev/null @@ -1,258 +0,0 @@ -import { RoomObjectCategory, RoomObjectOperationType } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useMemo, useState } from 'react'; -import { CreateLinkEvent, GetRoomEngine, GetSessionDataManager, LocalizeText, RoomWidgetPresentOpenMessage, RoomWidgetUpdatePresentDataEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { Button, Column, Flex, LayoutGiftTagView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates } from '../../../../../hooks'; -import { UseEventDispatcherHook } from '../../../../../hooks/events/UseEventDispatcherHook'; -import { ProductTypeEnum } from '../../../../catalog/common/ProductTypeEnum'; -import { useRoomContext } from '../../../RoomContext'; - -const FLOOR: string = 'floor'; -const WALLPAPER: string = 'wallpaper'; -const LANDSCAPE: string = 'landscape'; - -const ACTION_GIVE_GIFT = 0; -const ACTION_OPEN = 1; -const ACTION_PLACE = 2; -const ACTION_INVENTORY = 3; - -export const FurnitureGiftOpeningView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ classId, setClassId ] = useState(-1); - const [ itemType, setItemType ] = useState(null); - const [ text, setText ] = useState(null); - const [ isOwnerOfFurniture, setIsOwnerOfFurniture ] = useState(false); - const [ senderName, setSenderName ] = useState(null); - const [ senderFigure, setSenderFigure ] = useState(null); - const [ placedItemId, setPlacedItemId ] = useState(-1); - const [ placedItemType, setPlacedItemType ] = useState(null); - const [ placedInRoom, setPlacedInRoom ] = useState(false); - const [ imageUrl, setImageUrl ] = useState(null); - const [ openRequested, setOpenRequested ] = useState(false); - const { roomSession = null, eventDispatcher = null, widgetHandler = null } = useRoomContext(); - - const clearGift = useCallback(() => - { - if(!openRequested) setObjectId(-1); - - setText(null); - setIsOwnerOfFurniture(false); - }, [ openRequested ]); - - const getGiftImageUrl = useCallback((name: string) => - { - return ''; - }, []); - - const onRoomWidgetUpdatePresentDataEvent = useCallback((event: RoomWidgetUpdatePresentDataEvent) => - { - switch(event.type) - { - case RoomWidgetUpdatePresentDataEvent.PACKAGEINFO: { - BatchUpdates(() => - { - setOpenRequested(false); - setObjectId(event.objectId); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setSenderName(event.purchaserName); - setSenderFigure(event.purchaserFigure); - setImageUrl(event.imageUrl); - }); - return; - } - case RoomWidgetUpdatePresentDataEvent.CONTENTS_FLOOR: - case RoomWidgetUpdatePresentDataEvent.CONTENTS_LANDSCAPE: - case RoomWidgetUpdatePresentDataEvent.CONTENTS_WALLPAPER: { - let imageType: string = null; - - if(event.type === RoomWidgetUpdatePresentDataEvent.CONTENTS_FLOOR) imageType = 'packagecard_icon_floor'; - else if(event.type === RoomWidgetUpdatePresentDataEvent.CONTENTS_LANDSCAPE) imageType = 'packagecard_icon_landscape'; - else if(event.type === RoomWidgetUpdatePresentDataEvent.CONTENTS_WALLPAPER) imageType = 'packagecard_icon_wallpaper'; - - BatchUpdates(() => - { - setObjectId(event.objectId); - setClassId(event.classId); - setItemType(event.itemType); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setPlacedItemId(event.placedItemId); - setPlacedItemType(event.placedItemType); - setPlacedInRoom(event.placedInRoom); - setImageUrl(getGiftImageUrl(imageType)); - }); - return; - } - case RoomWidgetUpdatePresentDataEvent.CONTENTS_CLUB: { - BatchUpdates(() => - { - setObjectId(event.objectId); - setClassId(event.classId); - setItemType(event.itemType); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setImageUrl(getGiftImageUrl('packagecard_icon_hc')); - }); - return; - } - case RoomWidgetUpdatePresentDataEvent.CONTENTS: { - if(!openRequested) return; - - BatchUpdates(() => - { - setObjectId(event.objectId); - setClassId(event.classId); - setItemType(event.itemType); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setPlacedItemId(event.placedItemId); - setPlacedItemType(event.placedItemType); - setPlacedInRoom(event.placedInRoom); - setImageUrl(event.imageUrl); - }); - return; - } - case RoomWidgetUpdatePresentDataEvent.CONTENTS_IMAGE: { - if(!openRequested) return; - - setImageUrl(event.imageUrl); - } - } - }, [ openRequested, getGiftImageUrl ]); - - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.PACKAGEINFO, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS_FLOOR, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS_LANDSCAPE, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS_WALLPAPER, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS_CLUB, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS_IMAGE, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - - const onRoomWidgetRoomObjectUpdateEvent = useCallback((event: RoomWidgetUpdateRoomObjectEvent) => - { - if(event.id === objectId) clearGift(); - - if(event.id === placedItemId) - { - if(placedInRoom) setPlacedInRoom(false); - } - }, [ objectId, placedItemId, placedInRoom, clearGift ]); - - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, eventDispatcher, onRoomWidgetRoomObjectUpdateEvent); - - const close = useCallback(() => - { - BatchUpdates(() => - { - setObjectId(-1); - setOpenRequested(false); - setPlacedItemId(-1); - setPlacedInRoom(false); - setText(null); - setIsOwnerOfFurniture(false); - }); - }, []); - - const isSpaces = useMemo(() => - { - if(itemType !== ProductTypeEnum.WALL) return false; - - const furniData = GetSessionDataManager().getWallItemData(classId); - - if(!furniData) return false; - - const className = furniData.className; - - return (className === FLOOR || className === LANDSCAPE || className === WALLPAPER); - }, [ classId, itemType ]); - - const productName = useMemo(() => - { - if(objectId === -1) return ''; - - if(isSpaces) return 'widget.furni.present.spaces.message_opened'; - - return 'widget.furni.present.message_opened'; - }, [ objectId, isSpaces ]); - - const handleAction = useCallback((action: number) => - { - switch(action) - { - case ACTION_GIVE_GIFT: - CreateLinkEvent('catalog/open'); - return; - case ACTION_OPEN: - setOpenRequested(true); - widgetHandler.processWidgetMessage(new RoomWidgetPresentOpenMessage(RoomWidgetPresentOpenMessage.OPEN_PRESENT, objectId)); - return; - case ACTION_PLACE: - return; - case ACTION_INVENTORY: - if((placedItemId > 0) && placedInRoom) - { - if(placedItemType === ProductTypeEnum.PET) - { - roomSession.pickupPet(placedItemId); - } - else - { - const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, placedItemId, RoomObjectCategory.FLOOR); - - if(roomObject) GetRoomEngine().processRoomObjectOperation(roomObject.id, RoomObjectCategory.FLOOR, RoomObjectOperationType.OBJECT_PICKUP); - } - } - - close(); - return; - } - }, [ roomSession, widgetHandler, objectId, placedInRoom, placedItemId, placedItemType, close ]); - - if(objectId === -1) return null; - - return ( - - - - { (placedItemId === -1) && - - - - - - { senderName && - } - - - } - { (placedItemId > -1) && - - - - { LocalizeText(productName, [ 'product' ], [ text ]) } - - - - - - - { (senderName && senderName.length) && - } - - } - - - ); -} diff --git a/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.scss b/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.scss deleted file mode 100644 index a02f8b69..00000000 --- a/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.scss +++ /dev/null @@ -1,6 +0,0 @@ -.nitro-widget-high-score -{ - width: 250px; - max-width: 250px; - height: 200px; -} diff --git a/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.tsx b/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.tsx deleted file mode 100644 index 75949428..00000000 --- a/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { HighScoreDataType, ObjectDataFactory, RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { GetRoomEngine, LocalizeText } from '../../../../../api'; -import { Column, Flex, Text } from '../../../../../common'; -import { UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { ContextMenuHeaderView } from '../../context-menu/ContextMenuHeaderView'; -import { ContextMenuListView } from '../../context-menu/ContextMenuListView'; -import { ObjectLocationView } from '../../object-location/ObjectLocationView'; - -const SCORE_TYPES = ['perteam', 'mostwins', 'classic']; -const CLEAR_TYPES = ['alltime', 'daily', 'weekly', 'monthly']; - -export const FurnitureHighScoreView: FC<{}> = props => -{ - const [objectId, setObjectId] = useState(-1); - const [stuffData, setStuffData] = useState(null); - const { roomSession = null } = useRoomContext(); - - const close = useCallback(() => - { - setObjectId(-1); - setStuffData(null); - }, []); - - const onRoomEngineTriggerWidgetEvent = useCallback((event: RoomEngineTriggerWidgetEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY: { - const object = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, event.category); - - if(!object) return; - - setObjectId(object.id); - - const formatKey = object.model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT); - const stuffData = (ObjectDataFactory.getData(formatKey) as HighScoreDataType); - - stuffData.initializeFromRoomObjectModel(object.model); - - setStuffData(stuffData); - return; - } - case RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY: - if((event.roomId !== roomSession.roomId) || (event.objectId !== objectId)) return; - - close(); - return; - } - }, [roomSession, objectId, close]); - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY, onRoomEngineTriggerWidgetEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY, onRoomEngineTriggerWidgetEvent); - - if((objectId === -1) || !stuffData) return null; - - return ( - -
- - { LocalizeText('high.score.display.caption', [ 'scoretype', 'cleartype' ], [ LocalizeText(`high.score.display.scoretype.${ SCORE_TYPES[stuffData.scoreType] }`), LocalizeText(`high.score.display.cleartype.${ CLEAR_TYPES[stuffData.clearType] }`)]) } - - - - - - { LocalizeText('high.score.display.users.header') } - - - { LocalizeText('high.score.display.score.header') } - - -
-
- - { stuffData.entries.map((entry, index) => - { - return ( - - - { entry.users.join(', ') } - - - { entry.score } - - - ); - }) } - -
-
-
- - ); -} diff --git a/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.scss b/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.tsx b/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.tsx deleted file mode 100644 index 3a54ed02..00000000 --- a/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { RoomObjectOperationType } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { ProcessRoomObjectOperation, RoomWidgetUpdateDecorateModeEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { ObjectLocationView } from '../../object-location/ObjectLocationView'; - -export const FurnitureManipulationMenuView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ objectId, setObjectId ] = useState(-1); - const [ objectType, setObjectType ] = useState(-1); - const { roomSession = null, eventDispatcher = null, widgetHandler = null } = useRoomContext(); - - const rotateFurniture = useCallback(() => - { - ProcessRoomObjectOperation(objectId, objectType, RoomObjectOperationType.OBJECT_ROTATE_POSITIVE); - }, [ objectId, objectType ]); - - const moveFurniture = useCallback(() => - { - ProcessRoomObjectOperation(objectId, objectType, RoomObjectOperationType.OBJECT_MOVE); - }, [ objectId, objectType ]); - - const pickupFurniture = useCallback(() => - { - ProcessRoomObjectOperation(objectId, objectType, RoomObjectOperationType.OBJECT_PICKUP); - }, [ objectId, objectType ]); - - const onRoomWidgetRoomObjectUpdateEvent = useCallback((event: RoomWidgetUpdateRoomObjectEvent) => - { - switch(event.type) - { - case RoomWidgetUpdateRoomObjectEvent.OBJECT_REQUEST_MANIPULATION: { - BatchUpdates(() => - { - setIsVisible(true); - setObjectId(event.id); - setObjectType(event.category); - }); - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - if(event.id === objectId) - { - BatchUpdates(() => - { - setIsVisible(false); - setObjectId(-1); - setObjectType(-1); - }); - } - return; - } - case RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED: { - BatchUpdates(() => - { - setIsVisible(false); - setObjectId(-1); - setObjectType(-1); - }); - return; - } - } - }, [ objectId ]); - - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.OBJECT_REQUEST_MANIPULATION, eventDispatcher, onRoomWidgetRoomObjectUpdateEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED, eventDispatcher, onRoomWidgetRoomObjectUpdateEvent); - - const onRoomWidgetUpdateDecorateModeEvent = useCallback((event: RoomWidgetUpdateDecorateModeEvent) => - { - if(event.isDecorating) return; - - moveFurniture(); - - BatchUpdates(() => - { - setIsVisible(false); - setObjectId(-1); - setObjectType(-1); - }); - }, [ moveFurniture ]); - - UseEventDispatcherHook(RoomWidgetUpdateDecorateModeEvent.UPDATE_DECORATE, eventDispatcher, onRoomWidgetUpdateDecorateModeEvent); - - useEffect(() => - { - if(!isVisible) - { - eventDispatcher.dispatchEvent(new RoomWidgetUpdateDecorateModeEvent(false)); - - return; - } - - eventDispatcher.dispatchEvent(new RoomWidgetUpdateDecorateModeEvent(true)); - - moveFurniture(); - }, [ eventDispatcher, isVisible, moveFurniture ]); - - if(!isVisible) return null; - - return ( - -
- - -
-
- ); -} diff --git a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinData.ts b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinData.ts deleted file mode 100644 index 10928618..00000000 --- a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinData.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class FurnitureMannequinData -{ - constructor( - public objectId: number, - public category: number, - public name: string, - public figure: string, - public gender: string, - public clubLevel: number, - public renderedFigure: string = null) {} -} diff --git a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinPreviewView.tsx b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinPreviewView.tsx deleted file mode 100644 index 4b5732db..00000000 --- a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinPreviewView.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { FC } from 'react'; -import { Base, LayoutAvatarImageView, LayoutCurrencyIcon } from '../../../../../common'; - -interface FurnitureMannequinPreviewViewProps -{ - figure: string; - clubLevel: number; -} - -export const FurnitureMannequinPreviewView: FC = props => -{ - const { figure = null, clubLevel = 0 } = props; - - return ( - - - { (clubLevel > 0) && - } - - ); -} diff --git a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx deleted file mode 100644 index ec83fe99..00000000 --- a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx +++ /dev/null @@ -1,233 +0,0 @@ -import { AvatarFigurePartType, FurnitureMannequinSaveLookComposer, FurnitureMannequinSaveNameComposer, FurnitureMultiStateComposer, HabboClubLevelEnum, IAvatarFigureContainer, RoomControllerLevel } from '@nitrots/nitro-renderer'; -import { FC, KeyboardEvent, useCallback, useEffect, useState } from 'react'; -import { GetAvatarRenderManager, GetClubMemberLevel, GetSessionDataManager, LocalizeText, RoomWidgetUpdateMannequinEvent, SendMessageComposer } from '../../../../../api'; -import { Base, Button, Column, Flex, LayoutAvatarImageView, LayoutCurrencyIcon, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; - -const MODE_NONE: number = -1; -const MODE_CONTROLLER: number = 0; -const MODE_UPDATE: number = 1; -const MODE_PEER: number = 2; -const MODE_NO_CLUB: number = 3; -const MODE_WRONG_GENDER: number = 4; - -const ACTION_SET_NAME: number = 1; -const ACTION_WEAR: number = 2; -const ACTION_SAVE: number = 3; - -const MANNEQUIN_FIGURE = ['hd', 99999, [ 99998 ]]; -const MANNEQUIN_CLOTHING_PART_TYPES = [ - AvatarFigurePartType.CHEST_ACCESSORY, - AvatarFigurePartType.COAT_CHEST, - AvatarFigurePartType.CHEST, - AvatarFigurePartType.LEGS, - AvatarFigurePartType.SHOES, - AvatarFigurePartType.WAIST_ACCESSORY -]; - -export const FurnitureMannequinView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ figure, setFigure ] = useState(null); - const [ gender, setGender ] = useState(null); - const [ name, setName ] = useState(null); - const [ clubLevel, setClubLevel ] = useState(HabboClubLevelEnum.NO_CLUB); - const [ renderedFigure, setRenderedFigure ] = useState(null); - const [ renderedClubLevel, setRenderedClubLevel ] = useState(HabboClubLevelEnum.NO_CLUB); - const [ mode, setMode ] = useState(MODE_NONE); - const { roomSession = null, eventDispatcher = null } = useRoomContext(); - - const onRoomWidgetUpdateMannequinEvent = useCallback((event: RoomWidgetUpdateMannequinEvent) => - { - const figureContainer = GetAvatarRenderManager().createFigureContainer(event.figure); - const figureClubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, event.gender, MANNEQUIN_CLOTHING_PART_TYPES); - - BatchUpdates(() => - { - setObjectId(event.objectId); - setFigure(event.figure); - setGender(event.gender); - setName(event.name); - setClubLevel(figureClubLevel); - - if(roomSession.isRoomOwner || (roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator) - { - setMode(MODE_CONTROLLER); - } - - else if(GetSessionDataManager().gender.toLowerCase() !== event.gender.toLowerCase()) - { - setMode(MODE_WRONG_GENDER); - } - - else if(GetClubMemberLevel() < figureClubLevel) - { - setMode(MODE_NO_CLUB); - } - else - { - setMode(MODE_PEER); - } - }); - }, [ roomSession ]); - - UseEventDispatcherHook(RoomWidgetUpdateMannequinEvent.MANNEQUIN_UPDATE, eventDispatcher, onRoomWidgetUpdateMannequinEvent); - - const getMergedFigureContainer = (figure: string, targetFigure: string) => - { - const figureContainer = GetAvatarRenderManager().createFigureContainer(figure); - const targetFigureContainer = GetAvatarRenderManager().createFigureContainer(targetFigure); - - for(const part of MANNEQUIN_CLOTHING_PART_TYPES) figureContainer.removePart(part); - - for(const part of targetFigureContainer.getPartTypeIds()) - { - figureContainer.updatePart(part, targetFigureContainer.getPartSetId(part), targetFigureContainer.getPartColorIds(part)); - } - - return figureContainer; - } - - const transformAsMannequinFigure = (figureContainer: IAvatarFigureContainer) => - { - for(const part of figureContainer.getPartTypeIds()) - { - if(MANNEQUIN_CLOTHING_PART_TYPES.indexOf(part) >= 0) continue; - - figureContainer.removePart(part); - } - - figureContainer.updatePart((MANNEQUIN_FIGURE[0] as string), (MANNEQUIN_FIGURE[1] as number), (MANNEQUIN_FIGURE[2] as number[])); - }; - - const processAction = useCallback((action: number, value: string = null) => - { - switch(action) - { - case ACTION_SAVE: - SendMessageComposer(new FurnitureMannequinSaveLookComposer(objectId)); - break; - case ACTION_WEAR: - SendMessageComposer(new FurnitureMultiStateComposer(objectId)); - break; - case ACTION_SET_NAME: - SendMessageComposer(new FurnitureMannequinSaveNameComposer(objectId, name)); - return; - } - - setMode(MODE_NONE); - }, [ objectId, name ]); - - const handleKeyDown = (event: KeyboardEvent) => - { - if(event.key !== 'Enter') return; - - processAction(ACTION_SET_NAME); - }; - - useEffect(() => - { - switch(mode) - { - case MODE_CONTROLLER: - case MODE_WRONG_GENDER: { - const figureContainer = GetAvatarRenderManager().createFigureContainer(figure); - - transformAsMannequinFigure(figureContainer); - - BatchUpdates(() => - { - setRenderedFigure(figureContainer.getFigureString()); - setRenderedClubLevel(clubLevel); - }); - break; - } - case MODE_UPDATE: { - const figureContainer = GetAvatarRenderManager().createFigureContainer(GetSessionDataManager().figure); - - transformAsMannequinFigure(figureContainer); - - BatchUpdates(() => - { - setRenderedFigure(figureContainer.getFigureString()); - setRenderedClubLevel(GetAvatarRenderManager().getFigureClubLevel(figureContainer, GetSessionDataManager().gender, MANNEQUIN_CLOTHING_PART_TYPES)); - }); - break; - } - case MODE_PEER: - case MODE_NO_CLUB: { - const figureContainer = getMergedFigureContainer(GetSessionDataManager().figure, figure); - - BatchUpdates(() => - { - setRenderedFigure(figureContainer.getFigureString()); - setRenderedClubLevel(clubLevel); - }); - break; - } - } - }, [ mode, figure, clubLevel ]); - - if(mode === MODE_NONE) return null; - - return ( - - setMode(MODE_NONE) } /> - - - - - - { (clubLevel > 0) && - } - - - - { (mode === MODE_CONTROLLER) && - <> - setName(event.target.value) } onKeyDown={ event => handleKeyDown(event) } /> - - - - - } - { (mode === MODE_UPDATE) && - <> - - { name } - { LocalizeText('mannequin.widget.savetext') } - - - setMode(MODE_CONTROLLER) }> - { LocalizeText('mannequin.widget.back') } - - - - } - { (mode === MODE_PEER) && - <> - - { name } - { LocalizeText('mannequin.widget.weartext') } - - - } - { (mode === MODE_NO_CLUB) && - { LocalizeText('mannequin.widget.clubnotification') } } - { (mode === MODE_WRONG_GENDER) && - { LocalizeText('mannequin.widget.wronggender') } } - - - - - ); -} diff --git a/src/components/room/widgets/furniture/stickie/FurnitureStickieData.ts b/src/components/room/widgets/furniture/stickie/FurnitureStickieData.ts deleted file mode 100644 index dde5d714..00000000 --- a/src/components/room/widgets/furniture/stickie/FurnitureStickieData.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class FurnitureStickieData -{ - constructor( - public objectId: number, - public category: number, - public color: string, - public text: string, - public canModify: boolean = false, - public isEditing: boolean = false) {} -} diff --git a/src/components/room/widgets/furniture/stickie/FurnitureStickieUtils.ts b/src/components/room/widgets/furniture/stickie/FurnitureStickieUtils.ts deleted file mode 100644 index ed953c87..00000000 --- a/src/components/room/widgets/furniture/stickie/FurnitureStickieUtils.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const STICKIE_COLORS = ['9CCEFF','FF9CFF', '9CFF9C','FFFF33']; -export const STICKIE_COLOR_NAMES = [ 'blue', 'pink', 'green', 'yellow' ]; - -export function getStickieColorName(color: string): string -{ - let index = STICKIE_COLORS.indexOf(color); - - if(index === -1) index = 0; - - return STICKIE_COLOR_NAMES[index]; -} diff --git a/src/components/room/widgets/furniture/stickie/FurnitureStickieView.scss b/src/components/room/widgets/furniture/stickie/FurnitureStickieView.scss deleted file mode 100644 index 95c8aecd..00000000 --- a/src/components/room/widgets/furniture/stickie/FurnitureStickieView.scss +++ /dev/null @@ -1,99 +0,0 @@ -.nitro-stickie { - position: relative; - width: 185px; - height: 178px; - top: 25px; - left: 25px; - padding: 1px; - pointer-events: all; - - .stickie-header { - width: 183px; - height: 18px; - padding: 0 7px; - - .header-trash, - .header-close { - cursor: pointer; - } - - .stickie-color { - width: 10px; - height: 10px; - cursor: pointer; - } - } - - .stickie-context { - width: 183px; - height: 145px; - padding: 2px 7px; - font-size: 12px; - color: $black; - - .context-text { - width: 100%; - height: 100%; - padding: 0; - overflow-wrap: break-word; - white-space: break-spaces; - overflow-y: auto; - } - - textarea { - background: transparent; - border: 0; - outline: none; - box-shadow: none; - resize: none; - font-style: italic; - - &:active { - border: 0; - outline: none; - box-shadow: none; - } - } - } -} - -.nitro-stickie-image { - background-image: url('../../../../../assets/images/room-widgets/stickie-widget/stickie-spritesheet.png'); - - &.stickie-blue, - &.stickie-yellow, - &.stickie-green, - &.stickie-pink { - width: 185px; - height: 178px; - } - - &.stickie-blue { - background-position: -2px -2px; - } - - &.stickie-yellow { - background-image: url('../../../../../assets/images/room-widgets/stickie-widget/stickie-yellow.png'); - //background-position: -191px -184px; - } - - &.stickie-green { - background-position: -191px -2px; - } - - &.stickie-pink { - background-position: -2px -184px; - } - - &.stickie-close { - width: 10px; - height: 10px; - background-position: -2px -366px; - } - - &.stickie-trash { - width: 9px; - height: 10px; - background-position: -16px -366px; - } -} diff --git a/src/components/room/widgets/furniture/stickie/FurnitureStickieView.tsx b/src/components/room/widgets/furniture/stickie/FurnitureStickieView.tsx deleted file mode 100644 index 4d591075..00000000 --- a/src/components/room/widgets/furniture/stickie/FurnitureStickieView.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { ColorUtils, GetRoomEngine, GetRoomSession, GetSessionDataManager, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { DraggableWindow, DraggableWindowPosition } from '../../../../../common'; -import { UseEventDispatcherHook, UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { FurnitureStickieData } from './FurnitureStickieData'; -import { getStickieColorName, STICKIE_COLORS } from './FurnitureStickieUtils'; - -export const FurnitureStickieView: FC<{}> = props => -{ - const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); - const [ stickieData, setStickieData ] = useState(null); - - const onNitroEvent = useCallback((event: NitroEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_STICKIE: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_ITEMDATA); - - if(data.length < 6) return; - - let color: string = null; - let text: string = null; - - if(data.indexOf(' ') > 0) - { - color = data.slice(0, data.indexOf(' ')); - text = data.slice((data.indexOf(' ') + 1), data.length); - } - else - { - color = data; - } - - setStickieData(new FurnitureStickieData(widgetEvent.objectId, widgetEvent.category, color, text, (GetRoomSession().isRoomOwner || GetSessionDataManager().isModerator), false)); - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); - - setStickieData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - - return null; - }); - return; - } - } - }, []); - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_STICKIE, onNitroEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, eventDispatcher, onNitroEvent); - - const processAction = useCallback((type: string, value: string = null) => - { - switch(type) - { - case 'close': - setStickieData(null); - return; - case 'trash': - setStickieData(prevState => - { - if(!prevState) return null; - - GetRoomEngine().deleteRoomObject(prevState.objectId, prevState.category); - - return null; - }); - return; - case 'changeColor': - setStickieData(prevState => - { - const newStickieData = new FurnitureStickieData(prevState.objectId, prevState.category, value, prevState.text, prevState.canModify); - - GetRoomEngine().modifyRoomObjectData(newStickieData.objectId, newStickieData.category, newStickieData.color, newStickieData.text); - - return newStickieData; - }); - return; - case 'changeText': - setStickieData(prevState => - { - const newStickieData = new FurnitureStickieData(prevState.objectId, prevState.category, prevState.color, value, prevState.canModify); - - GetRoomEngine().modifyRoomObjectData(newStickieData.objectId, newStickieData.category, newStickieData.color, newStickieData.text); - - return newStickieData; - }); - return; - case 'editMode': - setStickieData(prevValue => - { - if(!prevValue.canModify) return prevValue; - - return new FurnitureStickieData(prevValue.objectId, prevValue.category, prevValue.color, prevValue.text, prevValue.canModify, true); - }); - return; - } - }, []); - - if(!stickieData) return null; - - return ( - -
-
-
- { stickieData.canModify && - <> -
processAction('trash') }>
- { STICKIE_COLORS.map(color => - { - return
processAction('changeColor', color) } style={ { backgroundColor: ColorUtils.makeColorHex(color) } } /> - })} - } -
-
processAction('close') }>
-
-
- { !stickieData.isEditing ?
processAction('editMode') }>{ stickieData.text }
: } -
-
- - ); -} diff --git a/src/components/room/widgets/furniture/trophy/FurnitureTrophyData.ts b/src/components/room/widgets/furniture/trophy/FurnitureTrophyData.ts deleted file mode 100644 index c1411c24..00000000 --- a/src/components/room/widgets/furniture/trophy/FurnitureTrophyData.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class FurnitureTrophyData -{ - constructor( - public objectId: number, - public category: number, - public color: string, - public ownerName: string, - public date: string, - public message: string, - public customTitle?: string) {} -} diff --git a/src/components/room/widgets/furniture/trophy/FurnitureTrophyView.tsx b/src/components/room/widgets/furniture/trophy/FurnitureTrophyView.tsx deleted file mode 100644 index 0ad805d9..00000000 --- a/src/components/room/widgets/furniture/trophy/FurnitureTrophyView.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { GetRoomEngine, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { LayoutTrophyView } from '../../../../../common'; -import { UseEventDispatcherHook, UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { FurnitureTrophyData } from './FurnitureTrophyData'; - -export const FurnitureTrophyView: FC<{}> = props => -{ - - const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); - const [ trophyData, setTrophyData ] = useState(null); - - const onNitroEvent = useCallback((event: NitroEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_TROPHY: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - let data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); - let extra = roomObject.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS); - - if(!extra) extra = '0'; - - const color = roomObject.model.getValue(RoomObjectVariable.FURNITURE_COLOR); - const ownerName = data.substring(0, data.indexOf('\t')); - - data = data.substring((ownerName.length + 1), data.length); - - const trophyDate = data.substring(0, data.indexOf('\t')); - const trophyText = data.substr((trophyDate.length + 1), data.length); - - setTrophyData(new FurnitureTrophyData(widgetEvent.objectId, widgetEvent.category, color, ownerName, trophyDate, trophyText)); - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); - - setTrophyData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - - return null; - }); - return; - } - } - }, []); - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_TROPHY, onNitroEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, widgetHandler.eventDispatcher, onNitroEvent); - - const processAction = useCallback((type: string, value: string = null) => - { - switch(type) - { - case 'close': - setTrophyData(null); - return; - } - }, []); - - if(!trophyData) return null; - - return processAction('close') } />; -} diff --git a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.scss b/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.scss deleted file mode 100644 index c782b781..00000000 --- a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.scss +++ /dev/null @@ -1,54 +0,0 @@ -.youtube-tv-widget { - width: 600px; - height: 380px; - - .youtube-video-container { - //min-height: 366px; - - .empty-video { - background-color: black; - color: white; - width: 100%; - height: 100%; - text-align: center; - } - - .youtubeContainer { - position: relative; - width: 100%; - height: 100%; - //height: 0; - //padding-bottom: 56.25%; - overflow: hidden; - margin-bottom: 50px; - } - - .youtubeContainer iframe { - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - } - } - - .playlist-container { - overflow-y: hidden; - margin-right: -10px; - color: black; - height: 100%; - - .playlist-controls { - width: 100%; - .icon { - margin-right: 10px; - margin-bottom: 10px; - } - } - - .playlist-grid { - height: 100%; - width: 100%; - } - } -} diff --git a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx b/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx deleted file mode 100644 index 15e90b7c..00000000 --- a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx +++ /dev/null @@ -1,245 +0,0 @@ -import { ControlYoutubeDisplayPlaybackMessageComposer, SetYoutubeDisplayPlaylistMessageComposer, YoutubeControlVideoMessageEvent, YoutubeDisplayPlaylist, YoutubeDisplayPlaylistsEvent, YoutubeDisplayVideoMessageEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useMemo, useState } from 'react'; -import YouTube, { Options } from 'react-youtube'; -import { FurnitureYoutubeDisplayWidgetHandler, LocalizeText, RoomWidgetUpdateYoutubeDisplayEvent, SendMessageComposer } from '../../../../../api'; -import { Grid, LayoutGridItem, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook, UseMessageEventHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { YoutubeVideoPlaybackStateEnum } from './utils/YoutubeVideoPlaybackStateEnum'; - -export const FurnitureYoutubeDisplayView: FC<{}> = props => -{ - const [objectId, setObjectId] = useState(-1); - const [videoId, setVideoId] = useState(null); - const [videoStart, setVideoStart] = useState(null); - const [videoEnd, setVideoEnd] = useState(null); - const [currentVideoState, setCurrentVideoState] = useState(-1); - const [selectedItem, setSelectedItem] = useState(null); - const [playlists, setPlaylists] = useState(null); - const [hasControl, setHasControl] = useState(false); - const [player, setPlayer] = useState(null); - const { eventDispatcher = null } = useRoomContext(); - - const onRoomWidgetUpdateYoutubeDisplayEvent = useCallback((event: RoomWidgetUpdateYoutubeDisplayEvent) => - { - switch(event.type) - { - case RoomWidgetUpdateYoutubeDisplayEvent.UPDATE_YOUTUBE_DISPLAY: { - setObjectId(event.objectId); - setHasControl(event.hasControl); - } - } - }, []); - - const close = useCallback(() => - { - setObjectId(-1); - setSelectedItem(null); - setPlaylists(null); - setHasControl(false); - setVideoId(null); - setVideoEnd(null); - setVideoStart(null); - setCurrentVideoState(-1); - }, []); - - UseEventDispatcherHook(RoomWidgetUpdateYoutubeDisplayEvent.UPDATE_YOUTUBE_DISPLAY, eventDispatcher, onRoomWidgetUpdateYoutubeDisplayEvent); - - const onVideo = useCallback((event: YoutubeDisplayVideoMessageEvent) => - { - if(objectId === -1) return; - - const parser = event.getParser(); - - if(objectId !== parser.furniId) return; - - BatchUpdates(() => - { - setVideoId(parser.videoId); - setVideoStart(parser.startAtSeconds); - setVideoEnd(parser.endAtSeconds); - setCurrentVideoState(parser.state); - }); - }, [objectId]); - - const onPlaylists = useCallback((event: YoutubeDisplayPlaylistsEvent) => - { - if(objectId === -1) return; - - const parser = event.getParser(); - - if(objectId !== parser.furniId) return; - - BatchUpdates(() => - { - setPlaylists(parser.playlists); - setSelectedItem(parser.selectedPlaylistId); - setVideoId(null); - setCurrentVideoState(-1); - setVideoEnd(null); - setVideoStart(null); - }); - }, [objectId]); - - const onControlVideo = useCallback((event: YoutubeControlVideoMessageEvent) => - { - if(objectId === -1) return; - - const parser = event.getParser(); - - if(objectId !== parser.furniId) return; - - switch(parser.commandId) - { - case 1: - setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PLAYING); - if(player.getPlayerState() !== YoutubeVideoPlaybackStateEnum.PLAYING) - player.playVideo(); - break; - case 2: - setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PAUSED); - if(player.getPlayerState() !== YoutubeVideoPlaybackStateEnum.PAUSED) - player.pauseVideo(); - break; - } - }, [objectId, player]); - - UseMessageEventHook(YoutubeDisplayVideoMessageEvent, onVideo); - UseMessageEventHook(YoutubeDisplayPlaylistsEvent, onPlaylists); - UseMessageEventHook(YoutubeControlVideoMessageEvent, onControlVideo); - - const processAction = useCallback((action: string) => - { - switch(action) - { - case 'playlist_prev': - SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, FurnitureYoutubeDisplayWidgetHandler.CONTROL_COMMAND_PREVIOUS_VIDEO)); - break; - case 'playlist_next': - SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, FurnitureYoutubeDisplayWidgetHandler.CONTROL_COMMAND_NEXT_VIDEO)); - break; - case 'video_pause': - if(hasControl && videoId && videoId.length) - { - SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, FurnitureYoutubeDisplayWidgetHandler.CONTROL_COMMAND_PAUSE_VIDEO)); - } - break; - case 'video_play': - if(hasControl && videoId && videoId.length) - { - SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, FurnitureYoutubeDisplayWidgetHandler.CONTROL_COMMAND_CONTINUE_VIDEO)); - } - break; - default: - if(selectedItem === action) - { - setSelectedItem(null); - SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, '')); - return; - } - SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, action)); - setSelectedItem(action); - } - }, [hasControl, objectId, selectedItem, videoId]); - - const onReady = useCallback((event: any) => - { - setPlayer(event.target); - }, []); - - const onStateChange = useCallback((event: any) => - { - setPlayer(event.target); - if(objectId) - { - switch(event.target.getPlayerState()) - { - case -1: - case 1: - if(currentVideoState === 2) - { - //event.target.pauseVideo(); - } - if(currentVideoState !== 1) - { - processAction('video_play'); - } - return; - case 2: - if(currentVideoState !== 2) - { - processAction('video_pause'); - } - } - } - }, [currentVideoState, objectId, processAction]); - - const getYoutubeOpts = useMemo( () => - { - if(!videoStart && !videoEnd) - { - return { - height: '375', - width: '500', - playerVars: { - autoplay: 1, - disablekb: 1, - controls: 0, - origin: window.origin, - modestbranding: 1 - } - } - } - - return { - height: '375', - width: '500', - playerVars: { - autoplay: 1, - disablekb: 1, - controls: 0, - origin: window.origin, - modestbranding: 1, - start: videoStart, - end: videoEnd - } - } - }, [videoEnd, videoStart]); - - if((objectId === -1)) return null; - - return ( - - - -
-
- {(videoId && videoId.length > 0) && - - } - {(!videoId || videoId.length === 0) && -
{LocalizeText('widget.furni.video_viewer.no_videos')}
- } -
-
- - processAction('playlist_prev')} /> - processAction('playlist_next')} /> - -
{LocalizeText('widget.furni.video_viewer.playlists')}
- - {playlists && playlists.map((entry, index) => - { - return ( - processAction(entry.video)} itemActive={entry.video === selectedItem}> - {entry.title} - {entry.description} - - ) - })} - -
-
-
-
- ) -} diff --git a/src/components/room/widgets/infostand/InfoStandWidgetUserRelationshipsView.tsx b/src/components/room/widgets/infostand/InfoStandWidgetUserRelationshipsView.tsx deleted file mode 100644 index ced56dd2..00000000 --- a/src/components/room/widgets/infostand/InfoStandWidgetUserRelationshipsView.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { RelationshipStatusEnum, RelationshipStatusInfoMessageParser } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { GetUserProfile, LocalizeText } from '../../../../api'; -import { Flex, Text } from '../../../../common'; - -interface InfoStandWidgetUserRelationshipsViewProps -{ - relationships: RelationshipStatusInfoMessageParser; -} - -interface InfoStandWidgetUserRelationshipsRelationshipViewProps -{ - type: number; -} - -export const InfoStandWidgetUserRelationshipsView: FC = props => -{ - const { relationships = null } = props; - - const RelationshipComponent = ({ type }: InfoStandWidgetUserRelationshipsRelationshipViewProps) => - { - const relationshipInfo = (relationships && relationships.relationshipStatusMap.hasKey(type)) ? relationships.relationshipStatusMap.getValue(type) : null; - - if(!relationshipInfo || !relationshipInfo.friendCount) return null; - - const relationshipName = RelationshipStatusEnum.RELATIONSHIP_NAMES[type].toLocaleLowerCase(); - - return ( - - - - GetUserProfile(relationshipInfo.randomFriendId) }> - { relationshipInfo.randomFriendName } - { (relationshipInfo.friendCount > 1) && (' ' + LocalizeText(`extendedprofile.relstatus.others.${ relationshipName }`, [ 'count' ], [ (relationshipInfo.friendCount - 1).toString() ])) } - - - - ); - } - - return ( - <> - - - - - ); -} diff --git a/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx b/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx deleted file mode 100644 index a39d2f5b..00000000 --- a/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx +++ /dev/null @@ -1,175 +0,0 @@ -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { RelationshipStatusInfoEvent, RelationshipStatusInfoMessageParser, RoomSessionUserBadgesEvent, UserRelationshipsComposer } from '@nitrots/nitro-renderer'; -import { FC, FocusEvent, KeyboardEvent, useCallback, useEffect, useState } from 'react'; -import { GetConfiguration, GetGroupInformation, LocalizeText, RoomWidgetChangeMottoMessage, RoomWidgetUpdateInfostandUserEvent, SendMessageComposer } from '../../../../api'; -import { Base, Column, Flex, LayoutAvatarImageView, LayoutBadgeImageView, Text, UserProfileIconView } from '../../../../common'; -import { BatchUpdates, UseEventDispatcherHook, UseMessageEventHook } from '../../../../hooks'; -import { useRoomContext } from '../../RoomContext'; -import { InfoStandWidgetUserRelationshipsView } from './InfoStandWidgetUserRelationshipsView'; - -interface InfoStandWidgetUserViewProps -{ - userData: RoomWidgetUpdateInfostandUserEvent; - close: () => void; -} - -export const InfoStandWidgetUserView: FC = props => -{ - const { userData = null, close = null } = props; - const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); - const [ badges, setBadges ] = useState([]); - const [ motto, setMotto ] = useState(null); - const [ isEditingMotto, setIsEditingMotto ] = useState(false); - const [ userRelationships, setUserRelationships ] = useState(null); - - const maxBadgeCount = GetConfiguration('user.badges.max.slots', 5); - - const saveMotto = (motto: string) => - { - if(motto.length > 38) return; - - widgetHandler.processWidgetMessage(new RoomWidgetChangeMottoMessage(motto)); - - setIsEditingMotto(false); - } - - const onMottoBlur = (event: FocusEvent) => saveMotto(event.target.value); - - const onMottoKeyDown = (event: KeyboardEvent) => - { - event.stopPropagation(); - - switch(event.key) - { - case 'Enter': - saveMotto((event.target as HTMLInputElement).value); - return; - } - } - - const onRoomSessionUserBadgesEvent = useCallback((event: RoomSessionUserBadgesEvent) => - { - if(!userData || (userData.webID !== event.userId)) return; - - setBadges(event.badges); - }, [ userData ]); - - UseEventDispatcherHook(RoomSessionUserBadgesEvent.RSUBE_BADGES, eventDispatcher, onRoomSessionUserBadgesEvent); - - const onUserRelationshipsEvent = useCallback((event: RelationshipStatusInfoEvent) => - { - const parser = event.getParser(); - - if(!userData || (userData.webID !== parser.userId)) return; - - setUserRelationships(parser); - }, [ userData ]); - - UseMessageEventHook(RelationshipStatusInfoEvent, onUserRelationshipsEvent); - - useEffect(() => - { - BatchUpdates(() => - { - setBadges(userData.badges); - setIsEditingMotto(false); - setMotto(userData.motto); - }); - - SendMessageComposer(new UserRelationshipsComposer(userData.webID)); - - return () => - { - setBadges([]); - setUserRelationships(null); - } - }, [ userData ]); - - if(!userData) return null; - - return ( - - - - - - - { userData.name } - - - -
-
- - - - - - - - - { badges[0] && } - - 0) } className="badge-image" onClick={ event => GetGroupInformation(userData.groupId) }> - { userData.groupId > 0 && - } - - - - - { badges[1] && } - - - { badges[2] && } - - - - - { badges[3] && } - - - { badges[4] && } - - - - -
-
- - - { (userData.type !== RoomWidgetUpdateInfostandUserEvent.OWN_USER) && - - { motto } - } - { userData.type === RoomWidgetUpdateInfostandUserEvent.OWN_USER && - - - - { !isEditingMotto && - setIsEditingMotto(true) }>{ motto }  } - { isEditingMotto && - setMotto(event.target.value) } onBlur={ onMottoBlur } onKeyDown={ onMottoKeyDown } autoFocus={ true } /> } - - } - -
-
- - - { LocalizeText('infostand.text.achievement_score') + ' ' + userData.achievementScore } - - { (userData.carryItem > 0) && - <> -
- - { LocalizeText('infostand.text.handitem', [ 'item' ], [ LocalizeText('handitem' + userData.carryItem) ]) } - - } -
- - - -
-
- ); -} diff --git a/src/components/room/widgets/infostand/InfoStandWidgetView.scss b/src/components/room/widgets/infostand/InfoStandWidgetView.scss deleted file mode 100644 index 2e57c0c0..00000000 --- a/src/components/room/widgets/infostand/InfoStandWidgetView.scss +++ /dev/null @@ -1,83 +0,0 @@ -.nitro-infostand-container { - position: absolute; - right: 10px; - bottom: $toolbar-height + 10px; - pointer-events: none; - z-index: $infostand-zindex; - color: $white; - - .nitro-infostand { - position: relative; - min-width: 190px; - max-width: 190px; - z-index: $infostand-zindex; - pointer-events: auto; - background: rgba($dark,.95); - box-shadow: inset 0px 5px lighten(rgba($dark,.6),2.5), inset 0 -4px darken(rgba($dark,.6),4); - - .form-control-sm { - height: 25px; - min-height: 25px; - padding: 0.1rem 0.25rem; - } - - .body-image { - display: flex; - align-items: center; - justify-content: center; - background-color: rgba($light-dark, 1); - width: 100%; - max-width: 68px; - border-radius: $border-radius; - - &.pet { - max-width: 75px; - } - - &.bot { - background-image: url('../../../../assets/images/infostand/bot_background.png'); - background-repeat: no-repeat; - background-position: center; - } - - &.furni { - background-color: transparent; - margin-right: 0; - } - } - - .badge-image { - width: 45px; - height: 45px; - } - - .motto-content { - min-height: 18px; - } - - .motto-input { - width: 100%; - height: 100%; - font-size: 12px; - padding: 0; - outline: 0; - border: 0; - color: rgba($white, 1); - position: relative; - background: transparent; - resize: none; - - &:focus { - font-style: italic; - } - } - } - - .button-container { - pointer-events: auto; - } - - .pet-stats { - height: 18px; - } -} diff --git a/src/components/room/widgets/infostand/InfoStandWidgetView.tsx b/src/components/room/widgets/infostand/InfoStandWidgetView.tsx deleted file mode 100644 index fae40a4e..00000000 --- a/src/components/room/widgets/infostand/InfoStandWidgetView.tsx +++ /dev/null @@ -1,124 +0,0 @@ -import { FC, useCallback, useState } from 'react'; -import { RoomWidgetRoomObjectMessage, RoomWidgetUpdateEvent, RoomWidgetUpdateInfostandEvent, RoomWidgetUpdateInfostandFurniEvent, RoomWidgetUpdateInfostandPetEvent, RoomWidgetUpdateInfostandRentableBotEvent, RoomWidgetUpdateInfostandUserEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../../api'; -import { Column } from '../../../../common'; -import { UseEventDispatcherHook } from '../../../../hooks'; -import { useRoomContext } from '../../RoomContext'; -import { InfoStandWidgetBotView } from './InfoStandWidgetBotView'; -import { InfoStandWidgetFurniView } from './InfoStandWidgetFurniView'; -import { InfoStandWidgetPetView } from './InfoStandWidgetPetView'; -import { InfoStandWidgetRentableBotView } from './InfoStandWidgetRentableBotView'; -import { InfoStandWidgetUserView } from './InfoStandWidgetUserView'; - -export const InfoStandWidgetView: FC<{}> = props => -{ - const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); - const [ infoStandEvent, setInfoStandEvent ] = useState(null); - - const closeInfostand = useCallback(() => - { - setInfoStandEvent(null); - }, []); - - const onRoomWidgetUpdateEvent = useCallback((event: RoomWidgetUpdateEvent) => - { - switch(event.type) - { - case RoomWidgetUpdateRoomObjectEvent.OBJECT_SELECTED: { - const roomObjectEvent = (event as RoomWidgetUpdateRoomObjectEvent); - - widgetHandler.processWidgetMessage(new RoomWidgetRoomObjectMessage(RoomWidgetRoomObjectMessage.GET_OBJECT_INFO, roomObjectEvent.id, roomObjectEvent.category)); - return; - } - case RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED: { - const roomObjectEvent = (event as RoomWidgetUpdateRoomObjectEvent); - - closeInfostand(); - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: - case RoomWidgetUpdateRoomObjectEvent.USER_REMOVED: { - const roomObjectEvent = (event as RoomWidgetUpdateRoomObjectEvent); - - setInfoStandEvent(prevValue => - { - switch(event.type) - { - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: - if(prevValue instanceof RoomWidgetUpdateInfostandFurniEvent) - { - if(prevValue.id === roomObjectEvent.id) return null; - } - break; - case RoomWidgetUpdateRoomObjectEvent.USER_REMOVED: - if(prevValue instanceof RoomWidgetUpdateInfostandUserEvent || prevValue instanceof RoomWidgetUpdateInfostandRentableBotEvent) - { - if(prevValue.roomIndex === roomObjectEvent.id) return null; - } - - else if(prevValue instanceof RoomWidgetUpdateInfostandPetEvent) - { - if(prevValue.roomIndex === roomObjectEvent.id) return null; - } - break; - } - - return prevValue; - }); - return; - } - case RoomWidgetUpdateInfostandFurniEvent.FURNI: - case RoomWidgetUpdateInfostandUserEvent.OWN_USER: - case RoomWidgetUpdateInfostandUserEvent.PEER: - case RoomWidgetUpdateInfostandUserEvent.BOT: - case RoomWidgetUpdateInfostandRentableBotEvent.RENTABLE_BOT: - case RoomWidgetUpdateInfostandPetEvent.PET_INFO: { - setInfoStandEvent((event as RoomWidgetUpdateInfostandEvent)); - return; - } - default: - console.log(event); - return; - } - }, [ widgetHandler, closeInfostand ]); - - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.OBJECT_SELECTED, eventDispatcher, onRoomWidgetUpdateEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED, eventDispatcher, onRoomWidgetUpdateEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.USER_REMOVED, eventDispatcher, onRoomWidgetUpdateEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, eventDispatcher, onRoomWidgetUpdateEvent); - UseEventDispatcherHook(RoomWidgetUpdateInfostandFurniEvent.FURNI, eventDispatcher, onRoomWidgetUpdateEvent); - UseEventDispatcherHook(RoomWidgetUpdateInfostandUserEvent.OWN_USER, eventDispatcher, onRoomWidgetUpdateEvent); - UseEventDispatcherHook(RoomWidgetUpdateInfostandUserEvent.PEER, eventDispatcher, onRoomWidgetUpdateEvent); - UseEventDispatcherHook(RoomWidgetUpdateInfostandUserEvent.BOT, eventDispatcher, onRoomWidgetUpdateEvent); - UseEventDispatcherHook(RoomWidgetUpdateInfostandRentableBotEvent.RENTABLE_BOT, eventDispatcher, onRoomWidgetUpdateEvent); - UseEventDispatcherHook(RoomWidgetUpdateInfostandPetEvent.PET_INFO, eventDispatcher, onRoomWidgetUpdateEvent); - - const getInfostandView = useCallback(() => - { - if(!infoStandEvent) return null; - - switch(infoStandEvent.type) - { - case RoomWidgetUpdateInfostandFurniEvent.FURNI: - return ; - case RoomWidgetUpdateInfostandUserEvent.OWN_USER: - case RoomWidgetUpdateInfostandUserEvent.PEER: - return ; - case RoomWidgetUpdateInfostandUserEvent.BOT: - return ; - case RoomWidgetUpdateInfostandRentableBotEvent.RENTABLE_BOT: - return ; - case RoomWidgetUpdateInfostandPetEvent.PET_INFO: - return - } - - return null; - }, [ infoStandEvent, closeInfostand ]); - - if(!infoStandEvent) return null; - - return ( - - { getInfostandView() } - - ); -} diff --git a/src/components/room/widgets/object-location/ObjectLocationView.tsx b/src/components/room/widgets/object-location/ObjectLocationView.tsx index d28d2a4e..acd21fb1 100644 --- a/src/components/room/widgets/object-location/ObjectLocationView.tsx +++ b/src/components/room/widgets/object-location/ObjectLocationView.tsx @@ -1,5 +1,5 @@ -import { FC, useCallback, useEffect, useRef, useState } from 'react'; -import { GetNitroInstance, GetRoomEngine, GetRoomSession } from '../../../../api'; +import { FC, useEffect, useRef, useState } from 'react'; +import { GetNitroInstance, GetRoomObjectBounds, GetRoomSession } from '../../../../api'; import { Base, BaseProps } from '../../../../common'; interface ObjectLocationViewProps extends BaseProps @@ -15,30 +15,30 @@ export const ObjectLocationView: FC = props => const [ pos, setPos ] = useState<{ x: number, y: number }>({ x: -1, y: -1 }); const elementRef = useRef(); - const getObjectLocation = useCallback(() => - { - const roomSession = GetRoomSession(); - const objectBounds = GetRoomEngine().getRoomObjectBoundingRectangle(roomSession.roomId, objectId, category, 1); - - return objectBounds; - }, [ objectId, category ]); - - const updatePosition = useCallback(() => - { - const bounds = getObjectLocation(); - - if(!bounds || !elementRef.current) return; - - setPos({ - x: Math.round(((bounds.left + (bounds.width / 2)) - (elementRef.current.offsetWidth / 2))), - y: Math.round((bounds.top - elementRef.current.offsetHeight) + 10) - }); - }, [ getObjectLocation ]); - useEffect(() => { let remove = false; + const getObjectLocation = () => + { + const roomSession = GetRoomSession(); + const objectBounds = GetRoomObjectBounds(roomSession.roomId, objectId, category, 1); + + return objectBounds; + } + + const updatePosition = () => + { + const bounds = getObjectLocation(); + + if(!bounds || !elementRef.current) return; + + setPos({ + x: Math.round(((bounds.left + (bounds.width / 2)) - (elementRef.current.offsetWidth / 2))), + y: Math.round((bounds.top - elementRef.current.offsetHeight) + 10) + }); + } + if(noFollow) { updatePosition(); @@ -54,7 +54,7 @@ export const ObjectLocationView: FC = props => { if(remove) GetNitroInstance().ticker.remove(updatePosition); } - }, [ updatePosition, noFollow ]); + }, [ objectId, category, noFollow ]); return -1 } className="object-location" style={ { left: pos.x, top: pos.y } } { ...rest } />; } diff --git a/src/components/room/widgets/room-thumbnail/RoomThumbnailWidgetView.tsx b/src/components/room/widgets/room-thumbnail/RoomThumbnailWidgetView.tsx index c7b4b253..20fc171c 100644 --- a/src/components/room/widgets/room-thumbnail/RoomThumbnailWidgetView.tsx +++ b/src/components/room/widgets/room-thumbnail/RoomThumbnailWidgetView.tsx @@ -3,13 +3,12 @@ import { FC, useCallback, useState } from 'react'; import { GetRoomEngine } from '../../../../api'; import { LayoutMiniCameraView } from '../../../../common'; import { RoomWidgetThumbnailEvent } from '../../../../events'; -import { UseUiEvent } from '../../../../hooks'; -import { useRoomContext } from '../../RoomContext'; +import { useRoom, useUiEvent } from '../../../../hooks'; export const RoomThumbnailWidgetView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); - const { roomSession = null } = useRoomContext(); + const { roomSession = null } = useRoom(); const onNitroEvent = useCallback((event: RoomWidgetThumbnailEvent) => { @@ -27,9 +26,9 @@ export const RoomThumbnailWidgetView: FC<{}> = props => } }, []); - UseUiEvent(RoomWidgetThumbnailEvent.SHOW_THUMBNAIL, onNitroEvent); - UseUiEvent(RoomWidgetThumbnailEvent.HIDE_THUMBNAIL, onNitroEvent); - UseUiEvent(RoomWidgetThumbnailEvent.TOGGLE_THUMBNAIL, onNitroEvent); + useUiEvent(RoomWidgetThumbnailEvent.SHOW_THUMBNAIL, onNitroEvent); + useUiEvent(RoomWidgetThumbnailEvent.HIDE_THUMBNAIL, onNitroEvent); + useUiEvent(RoomWidgetThumbnailEvent.TOGGLE_THUMBNAIL, onNitroEvent); const receiveTexture = useCallback((texture: NitroRenderTexture) => { diff --git a/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx b/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx index 7041d349..683e1ec0 100644 --- a/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx +++ b/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx @@ -1,64 +1,62 @@ -import { GetGuestRoomResultEvent, RoomLikeRoomComposer } from '@nitrots/nitro-renderer'; +import { GetGuestRoomResultEvent, RateFlatMessageComposer } from '@nitrots/nitro-renderer'; import classNames from 'classnames'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { CreateLinkEvent, LocalizeText, RoomWidgetZoomToggleMessage, SendMessageComposer } from '../../../../api'; +import { FC, useEffect, useState } from 'react'; +import { CreateLinkEvent, GetRoomEngine, LocalizeText, SendMessageComposer } from '../../../../api'; import { Base, Column, Flex, Text, TransitionAnimation, TransitionAnimationTypes } from '../../../../common'; -import { NavigatorEvent } from '../../../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook } from '../../../../hooks'; -import { useRoomContext } from '../../RoomContext'; +import { useMessageEvent, useNavigator, useRoom } from '../../../../hooks'; export const RoomToolsWidgetView: FC<{}> = props => { - const [ isZoomedIn, setIsZoomedIn ] = useState(false); - const [ isLiked, setIsLiked ] = useState(false); - const [ roomName, setRoomName ] = useState(null); - const [ roomOwner, setRoomOwner ] = useState(null); - const [ roomTags, setRoomTags ] = useState(null); - const [ roomInfoDisplay, setRoomInfoDisplay ] = useState(false); - const [ isOpen, setIsOpen ] = useState(false); - const { widgetHandler = null } = useRoomContext(); + const [ isZoomedIn, setIsZoomedIn ] = useState(false); + const [ roomName, setRoomName ] = useState(null); + const [ roomOwner, setRoomOwner ] = useState(null); + const [ roomTags, setRoomTags ] = useState(null); + const [ isOpen, setIsOpen ] = useState(false); + const { navigatorData = null } = useNavigator(); + const { roomSession = null } = useRoom(); const handleToolClick = (action: string) => { switch(action) { case 'settings': - DispatchUiEvent(new NavigatorEvent(NavigatorEvent.TOGGLE_ROOM_INFO)); + CreateLinkEvent('navigator/toggle-room-info'); return; case 'zoom': - widgetHandler.processWidgetMessage(new RoomWidgetZoomToggleMessage(!isZoomedIn)); - setIsZoomedIn(value => !value); + setIsZoomedIn(prevValue => + { + let scale = GetRoomEngine().getRoomInstanceRenderingCanvasScale(roomSession.roomId, 1); + + if(!prevValue) scale /= 2; + else scale *= 2; + + GetRoomEngine().setRoomInstanceRenderingCanvasScale(roomSession.roomId, 1, scale); + + return !prevValue; + }); return; case 'chat_history': CreateLinkEvent('chat-history/toggle'); return; case 'like_room': - if(isLiked) return; - - SendMessageComposer(new RoomLikeRoomComposer(1)); - setIsLiked(true); + SendMessageComposer(new RateFlatMessageComposer(1)); return; case 'toggle_room_link': - DispatchUiEvent(new NavigatorEvent(NavigatorEvent.TOGGLE_ROOM_LINK)); + CreateLinkEvent('navigator/toggle-room-link'); return; } } - const onGetGuestRoomResultEvent = useCallback((event: GetGuestRoomResultEvent) => + useMessageEvent(GetGuestRoomResultEvent, event => { const parser = event.getParser(); - if(!parser.roomEnter) return; + if(!parser.roomEnter || (parser.data.roomId !== roomSession.roomId)) return; - BatchUpdates(() => - { - if(roomName !== parser.data.roomName) setRoomName(parser.data.roomName); - if(roomOwner !== parser.data.ownerName) setRoomOwner(parser.data.ownerName); - if(roomTags !== parser.data.tags) setRoomTags(parser.data.tags); - }); - }, [ roomName, roomOwner, roomTags ]); - - UseMessageEventHook(GetGuestRoomResultEvent, onGetGuestRoomResultEvent); + if(roomName !== parser.data.roomName) setRoomName(parser.data.roomName); + if(roomOwner !== parser.data.ownerName) setRoomOwner(parser.data.ownerName); + if(roomTags !== parser.data.tags) setRoomTags(parser.data.tags); + }); useEffect(() => { @@ -75,7 +73,8 @@ export const RoomToolsWidgetView: FC<{}> = props => handleToolClick('settings') } /> handleToolClick('zoom') } className={ 'icon ' + classNames({ 'icon-zoom-less': !isZoomedIn, 'icon-zoom-more': isZoomedIn }) } /> handleToolClick('chat_history') } className="icon icon-chat-history" /> - { !isLiked && handleToolClick('like_room') } className="icon icon-like-room" /> } + { navigatorData.canRate && + handleToolClick('like_room') } className="icon icon-like-room" /> } @@ -87,7 +86,7 @@ export const RoomToolsWidgetView: FC<{}> = props => { roomTags && roomTags.length > 0 && - { roomTags.map((tag: string) => #{ tag }) } + { roomTags.map((tag, index) => #{ tag }) } } diff --git a/src/components/room/widgets/user-location/UserLocationView.tsx b/src/components/room/widgets/user-location/UserLocationView.tsx index d750f26a..ca281ec9 100644 --- a/src/components/room/widgets/user-location/UserLocationView.tsx +++ b/src/components/room/widgets/user-location/UserLocationView.tsx @@ -1,7 +1,7 @@ import { RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC } from 'react'; import { BaseProps } from '../../../../common'; -import { useRoomContext } from '../../RoomContext'; +import { useRoom } from '../../../../hooks'; import { ObjectLocationView } from '../object-location/ObjectLocationView'; interface UserLocationViewProps extends BaseProps @@ -12,7 +12,7 @@ interface UserLocationViewProps extends BaseProps export const UserLocationView: FC = props => { const { userId = -1, ...rest } = props; - const { roomSession = null } = useRoomContext(); + const { roomSession = null } = useRoom(); if((userId === -1) || !roomSession) return null; diff --git a/src/components/room/widgets/word-quiz/WordQuizQuestionView.tsx b/src/components/room/widgets/word-quiz/WordQuizQuestionView.tsx index 83421ea1..3b4d051e 100644 --- a/src/components/room/widgets/word-quiz/WordQuizQuestionView.tsx +++ b/src/components/room/widgets/word-quiz/WordQuizQuestionView.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; +import { VALUE_KEY_DISLIKE, VALUE_KEY_LIKE } from '../../../../api'; import { Base, Column, Flex, Text } from '../../../../common'; -import { VALUE_KEY_DISLIKE, VALUE_KEY_LIKE } from './common/VoteValue'; interface WordQuizQuestionViewProps { diff --git a/src/components/room/widgets/word-quiz/WordQuizVoteView.tsx b/src/components/room/widgets/word-quiz/WordQuizVoteView.tsx index 5511b284..8437d763 100644 --- a/src/components/room/widgets/word-quiz/WordQuizVoteView.tsx +++ b/src/components/room/widgets/word-quiz/WordQuizVoteView.tsx @@ -1,8 +1,8 @@ -import { RoomObjectCategory } from '@nitrots/nitro-renderer/src'; +import { RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC } from 'react'; +import { VALUE_KEY_DISLIKE } from '../../../../api'; import { Base, BaseProps, Flex } from '../../../../common'; import { ObjectLocationView } from '../object-location/ObjectLocationView'; -import { VALUE_KEY_DISLIKE } from './common/VoteValue'; interface WordQuizVoteViewProps extends BaseProps { diff --git a/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx b/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx index b4220560..a04cfd8a 100644 --- a/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx +++ b/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx @@ -1,173 +1,19 @@ -import { IQuestion } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { RoomWidgetPollMessage, RoomWidgetWordQuizUpdateEvent } from '../../../../api'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../hooks'; -import { useRoomContext } from '../../RoomContext'; -import { VALUE_KEY_DISLIKE, VALUE_KEY_LIKE, VoteValue } from './common/VoteValue'; +import { FC } from 'react'; +import { VALUE_KEY_DISLIKE, VALUE_KEY_LIKE } from '../../../../api'; +import { useWordQuizWidget } from '../../../../hooks'; import { WordQuizQuestionView } from './WordQuizQuestionView'; import { WordQuizVoteView } from './WordQuizVoteView'; -const DEFAULT_DISPLAY_DELAY = 4000; -const SIGN_FADE_DELAY = 3; - export const WordQuizWidgetView: FC<{}> = props => { - const [ pollId, setPollId ] = useState(-1); - const [ question, setQuestion ] = useState(null); - const [ answerSent, setAnswerSent ] = useState(false); - const [ questionClearTimeout, setQuestionClearTimeout ] = useState(null); - const [ answerCounts, setAnswerCounts ] = useState>(new Map()); - const [ userAnswers, setUserAnswers ] = useState>(new Map()); - const { eventDispatcher = null, widgetHandler = null, roomSession = null } = useRoomContext(); - - const clearQuestion = useCallback(() => - { - setPollId(-1); - setQuestion(null); - }, []); - - const onRoomWidgetWordQuizUpdateEvent = useCallback((event: RoomWidgetWordQuizUpdateEvent) => - { - switch(event.type) - { - case RoomWidgetWordQuizUpdateEvent.NEW_QUESTION: - BatchUpdates(() => - { - setPollId(event.id); - setQuestion(event.question); - setAnswerSent(false); - setAnswerCounts(new Map()); - setUserAnswers(new Map()); - - setQuestionClearTimeout(prevValue => - { - if(prevValue) clearTimeout(prevValue); - - if(event.duration > 0) - { - const delay = event.duration < 1000 ? DEFAULT_DISPLAY_DELAY : event.duration; - - return setTimeout(() => clearQuestion(), delay) as unknown as number; - } - - return null; - }); - }); - break; - case RoomWidgetWordQuizUpdateEvent.QUESTION_ANSWERED: { - const userData = roomSession.userDataManager.getUserData(event.userId); - - if(!userData) return; - - BatchUpdates(() => - { - setAnswerCounts(event.answerCounts); - - setUserAnswers(prevValue => - { - if(!prevValue.has(userData.roomIndex)) - { - const newValue = new Map(userAnswers); - - newValue.set(userData.roomIndex, { value: event.value, secondsLeft: SIGN_FADE_DELAY }); - - return newValue; - } - - return prevValue; - }); - }); - break; - } - case RoomWidgetWordQuizUpdateEvent.QUESTION_FINISHED: - if(question && question.id === event.questionId) - { - BatchUpdates(() => - { - setAnswerCounts(event.answerCounts); - setAnswerSent(true); - - setQuestionClearTimeout(prevValue => - { - if(prevValue) clearTimeout(prevValue); - - return setTimeout(() => clearQuestion(), DEFAULT_DISPLAY_DELAY) as unknown as number; - }); - }); - } - - setUserAnswers(new Map()); - break; - } - }, [ question, roomSession.userDataManager, userAnswers, clearQuestion ]); - - UseEventDispatcherHook(RoomWidgetWordQuizUpdateEvent.NEW_QUESTION, eventDispatcher, onRoomWidgetWordQuizUpdateEvent); - UseEventDispatcherHook(RoomWidgetWordQuizUpdateEvent.QUESTION_ANSWERED, eventDispatcher, onRoomWidgetWordQuizUpdateEvent); - UseEventDispatcherHook(RoomWidgetWordQuizUpdateEvent.QUESTION_FINISHED, eventDispatcher, onRoomWidgetWordQuizUpdateEvent); - - const vote = useCallback((vote: string) => - { - if(answerSent || !question) return; - - const updateMessage = new RoomWidgetPollMessage(RoomWidgetPollMessage.ANSWER, pollId); - - updateMessage.questionId = question.id; - updateMessage.answers = [vote]; - - widgetHandler.processWidgetMessage(updateMessage); - - setAnswerSent(true); - }, [ answerSent, pollId, question, widgetHandler ]); - - const checkSignFade = useCallback(() => - { - setUserAnswers(prevValue => - { - const keysToRemove: number[] = []; - - prevValue.forEach((value, key) => - { - value.secondsLeft--; - - if(value.secondsLeft <= 0) keysToRemove.push(key); - }); - - if(keysToRemove.length === 0) return prevValue; - - const copy = new Map(prevValue); - - keysToRemove.forEach(key => copy.delete(key)); - - return copy; - }); - }, []); - - useEffect(() => - { - const interval = setInterval(() => checkSignFade(), 1000); - - return () => clearInterval(interval); - }, [ checkSignFade ]); - - useEffect(() => - { - return () => - { - setQuestionClearTimeout(prev => - { - if(prev) clearTimeout(prev); - - return null; - }); - } - }, []); + const { question = null, answerSent = false, answerCounts = null, userAnswers = null, vote = null } = useWordQuizWidget(); return ( <> { question && - } + } { userAnswers && - Array.from(userAnswers.entries()).map(([key, value], index) => ) } + Array.from(userAnswers.entries()).map(([ key, value ], index) => ) } ); } diff --git a/src/components/toolbar/ToolbarMeView.tsx b/src/components/toolbar/ToolbarMeView.tsx index 6e0b7a3e..eea60bf2 100644 --- a/src/components/toolbar/ToolbarMeView.tsx +++ b/src/components/toolbar/ToolbarMeView.tsx @@ -1,19 +1,20 @@ -import { RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { FC, useEffect } from 'react'; -import { CreateLinkEvent, GetRoomEngine, GetRoomSession } from '../../api'; +import { MouseEventType, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { Dispatch, FC, PropsWithChildren, SetStateAction, useEffect, useRef } from 'react'; +import { CreateLinkEvent, DispatchUiEvent, GetRoomEngine, GetRoomSession, GetSessionDataManager, GetUserProfile } from '../../api'; import { Base, Flex, LayoutItemCountView } from '../../common'; -import { ToolbarViewItems } from './common/ToolbarViewItems'; +import { GuideToolEvent } from '../../events'; -export interface ToolbarMeViewProps +interface ToolbarMeViewProps { useGuideTool: boolean; unseenAchievementCount: number; - handleToolbarItemClick: (item: string) => void; + setMeExpanded: Dispatch>; } -export const ToolbarMeView: FC = props => +export const ToolbarMeView: FC> = props => { - const { useGuideTool = false, unseenAchievementCount = 0, handleToolbarItemClick = null } = props; + const { useGuideTool = false, unseenAchievementCount = 0, setMeExpanded = null, children = null, ...rest } = props; + const elementRef = useRef(); useEffect(() => { @@ -24,18 +25,28 @@ export const ToolbarMeView: FC = props => GetRoomEngine().selectRoomObject(roomSession.roomId, roomSession.ownRoomIndex, RoomObjectCategory.UNIT); }, []); + useEffect(() => + { + const onClick = (event: MouseEvent) => setMeExpanded(false); + + document.addEventListener('click', onClick); + + return () => document.removeEventListener(MouseEventType.MOUSE_CLICK, onClick); + }, [ setMeExpanded ]); + return ( - + { useGuideTool && - handleToolbarItemClick(ToolbarViewItems.GUIDE_TOOL_ITEM) } /> } - handleToolbarItemClick(ToolbarViewItems.ACHIEVEMENTS_ITEM) }> + DispatchUiEvent(new GuideToolEvent(GuideToolEvent.TOGGLE_GUIDE_TOOL)) } /> } + CreateLinkEvent('achievements/toggle') }> { (unseenAchievementCount > 0) && } - handleToolbarItemClick(ToolbarViewItems.PROFILE_ITEM) } /> - CreateLinkEvent('navigator/search/myworld_view')} /> - handleToolbarItemClick(ToolbarViewItems.CLOTHING_ITEM) } /> - handleToolbarItemClick(ToolbarViewItems.SETTINGS_ITEM) } /> + GetUserProfile(GetSessionDataManager().userId) } /> + CreateLinkEvent('navigator/search/myworld_view') } /> + CreateLinkEvent('avatar-editor/toggle') } /> + CreateLinkEvent('user-settings/toggle') } /> + { children } ); } diff --git a/src/components/toolbar/ToolbarView.tsx b/src/components/toolbar/ToolbarView.tsx index 70decda4..4a67374b 100644 --- a/src/components/toolbar/ToolbarView.tsx +++ b/src/components/toolbar/ToolbarView.tsx @@ -1,93 +1,29 @@ -import { Dispose, DropBounce, EaseOut, FigureUpdateEvent, JumpBy, Motions, NitroToolbarAnimateIconEvent, PerkAllowancesMessageEvent, PerkEnum, Queue, UserInfoDataParser, UserInfoEvent, Wait } from '@nitrots/nitro-renderer'; +import { Dispose, DropBounce, EaseOut, JumpBy, Motions, NitroToolbarAnimateIconEvent, PerkAllowancesMessageEvent, PerkEnum, Queue, Wait } from '@nitrots/nitro-renderer'; import { FC, useCallback, useState } from 'react'; -import { CreateLinkEvent, GetSessionDataManager, GetUserProfile, OpenMessengerChat, VisitDesktop } from '../../api'; +import { CreateLinkEvent, GetSessionDataManager, MessengerIconState, OpenMessengerChat, VisitDesktop } from '../../api'; import { Base, Flex, LayoutAvatarImageView, LayoutItemCountView, TransitionAnimation, TransitionAnimationTypes } from '../../common'; -import { AchievementsUIEvent, AchievementsUIUnseenCountEvent, FriendsEvent, FriendsMessengerIconEvent, FriendsRequestCountEvent, GuideToolEvent, InventoryEvent, ModToolsEvent, NavigatorEvent, UnseenItemTrackerUpdateEvent, UserSettingsUIEvent } from '../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook, UseRoomEngineEvent, UseUiEvent } from '../../hooks'; -import { ToolbarViewItems } from './common/ToolbarViewItems'; +import { useAchievements, useFriends, useInventoryUnseenTracker, useMessageEvent, useMessenger, useRoomEngineEvent, useSessionInfo } from '../../hooks'; import { ToolbarMeView } from './ToolbarMeView'; -export interface ToolbarViewProps -{ - isInRoom: boolean; -} - -const CHAT_ICON_HIDDEN: number = 0; -const CHAT_ICON_SHOWING: number = 1; -const CHAT_ICON_UNREAD: number = 2; - -export const ToolbarView: FC = props => +export const ToolbarView: FC<{ isInRoom: boolean }> = props => { const { isInRoom } = props; - const [ userInfo, setUserInfo ] = useState(null); - const [ userFigure, setUserFigure ] = useState(null); const [ isMeExpanded, setMeExpanded ] = useState(false); const [ useGuideTool, setUseGuideTool ] = useState(false); - const [ chatIconType, setChatIconType ] = useState(CHAT_ICON_HIDDEN); - const [ unseenInventoryCount, setUnseenInventoryCount ] = useState(0); - const [ unseenAchievementCount, setUnseenAchievementCount ] = useState(0); - const [ unseenFriendRequestCount, setFriendRequestCount ] = useState(0); + const { userFigure = null } = useSessionInfo(); + const { getFullCount = 0 } = useInventoryUnseenTracker(); + const { getTotalUnseen = 0 } = useAchievements(); + const { requests = [] } = useFriends(); + const { iconState = MessengerIconState.HIDDEN } = useMessenger(); const isMod = GetSessionDataManager().isModerator; - - const onUserInfoEvent = useCallback((event: UserInfoEvent) => - { - const parser = event.getParser(); - - BatchUpdates(() => - { - setUserInfo(parser.userInfo); - setUserFigure(parser.userInfo.figure); - }); - }, []); - - UseMessageEventHook(UserInfoEvent, onUserInfoEvent); - - const onUserFigureEvent = useCallback((event: FigureUpdateEvent) => - { - const parser = event.getParser(); - - setUserFigure(parser.figure); - }, []); - UseMessageEventHook(FigureUpdateEvent, onUserFigureEvent); - - const onPerkAllowancesMessageEvent = useCallback((event: PerkAllowancesMessageEvent) => + useMessageEvent(PerkAllowancesMessageEvent, event => { const parser = event.getParser(); setUseGuideTool(parser.isAllowed(PerkEnum.USE_GUIDE_TOOL)); - }, [ setUseGuideTool ]); - - UseMessageEventHook(PerkAllowancesMessageEvent, onPerkAllowancesMessageEvent); - - const onFriendsMessengerIconEvent = useCallback((event: FriendsMessengerIconEvent) => - { - setChatIconType(event.iconType); - }, []); - - UseUiEvent(FriendsMessengerIconEvent.UPDATE_ICON, onFriendsMessengerIconEvent); - - const onUnseenItemTrackerUpdateEvent = useCallback((event: UnseenItemTrackerUpdateEvent) => - { - setUnseenInventoryCount(event.count); - }, []); - - UseUiEvent(UnseenItemTrackerUpdateEvent.UPDATE_COUNT, onUnseenItemTrackerUpdateEvent); - - const onAchievementsUIUnseenCountEvent = useCallback((event: AchievementsUIUnseenCountEvent) => - { - setUnseenAchievementCount(event.count); - }, []); - - UseUiEvent(AchievementsUIUnseenCountEvent.UNSEEN_COUNT, onAchievementsUIUnseenCountEvent); - - const onFriendsRequestCountEvent = useCallback((event: FriendsRequestCountEvent) => - { - setFriendRequestCount(event.count); - }, []); - - UseUiEvent(FriendsRequestCountEvent.UPDATE_COUNT, onFriendsRequestCountEvent); + }); const animationIconToToolbar = useCallback((iconName: string, image: HTMLImageElement, x: number, y: number) => { @@ -102,8 +38,8 @@ export const ToolbarView: FC = props => document.body.append(image); - const targetBounds = target.getBoundingClientRect(); - const imageBounds = image.getBoundingClientRect(); + const targetBounds = target.getBoundingClientRect(); + const imageBounds = image.getBoundingClientRect(); const left = (imageBounds.x - targetBounds.x); const top = (imageBounds.y - targetBounds.y); @@ -123,99 +59,49 @@ export const ToolbarView: FC = props => Motions.runMotion(motion); }, []); - const onNitroToolbarAnimateIconEvent = useCallback((event: NitroToolbarAnimateIconEvent) => + useRoomEngineEvent(NitroToolbarAnimateIconEvent.ANIMATE_ICON, event => { animationIconToToolbar('icon-inventory', event.image, event.x, event.y); - }, [ animationIconToToolbar ]); - - UseRoomEngineEvent(NitroToolbarAnimateIconEvent.ANIMATE_ICON, onNitroToolbarAnimateIconEvent); - - const handleToolbarItemClick = useCallback((item: string) => - { - switch(item) - { - case ToolbarViewItems.NAVIGATOR_ITEM: - DispatchUiEvent(new NavigatorEvent(NavigatorEvent.TOGGLE_NAVIGATOR)); - return; - case ToolbarViewItems.INVENTORY_ITEM: - DispatchUiEvent(new InventoryEvent(InventoryEvent.TOGGLE_INVENTORY)); - return; - case ToolbarViewItems.CATALOG_ITEM: - CreateLinkEvent('catalog/toggle'); - return; - case ToolbarViewItems.FRIEND_LIST_ITEM: - DispatchUiEvent(new FriendsEvent(FriendsEvent.TOGGLE_FRIEND_LIST)); - return; - case ToolbarViewItems.CAMERA_ITEM: - CreateLinkEvent('camera/toggle'); - return; - case ToolbarViewItems.CLOTHING_ITEM: - CreateLinkEvent('avatar-editor/toggle'); - setMeExpanded(false); - return; - case ToolbarViewItems.MOD_TOOLS_ITEM: - DispatchUiEvent(new ModToolsEvent(ModToolsEvent.TOGGLE_MOD_TOOLS)); - return; - case ToolbarViewItems.ACHIEVEMENTS_ITEM: - DispatchUiEvent(new AchievementsUIEvent(AchievementsUIEvent.TOGGLE_ACHIEVEMENTS)); - setMeExpanded(false); - return; - case ToolbarViewItems.PROFILE_ITEM: - GetUserProfile(GetSessionDataManager().userId); - setMeExpanded(false); - return; - case ToolbarViewItems.SETTINGS_ITEM: - DispatchUiEvent(new UserSettingsUIEvent(UserSettingsUIEvent.TOGGLE_USER_SETTINGS)); - setMeExpanded(false); - return; - case ToolbarViewItems.GUIDE_TOOL_ITEM: - DispatchUiEvent(new GuideToolEvent(GuideToolEvent.TOGGLE_GUIDE_TOOL)); - setMeExpanded(false); - return; - case ToolbarViewItems.FRIEND_CHAT_ITEM: - OpenMessengerChat(); - return; - } - }, []); + }); return ( <> - + setMeExpanded(!isMeExpanded) }> - - { (unseenAchievementCount > 0) && - } + + { (getTotalUnseen > 0) && + } { isInRoom && VisitDesktop() } /> } { !isInRoom && CreateLinkEvent('navigator/goto/home') } /> } - handleToolbarItemClick(ToolbarViewItems.NAVIGATOR_ITEM) } /> - handleToolbarItemClick(ToolbarViewItems.CATALOG_ITEM) } /> - handleToolbarItemClick(ToolbarViewItems.INVENTORY_ITEM) }> - { (unseenInventoryCount > 0) && - } + CreateLinkEvent('navigator/toggle') } /> + CreateLinkEvent('catalog/toggle') } /> + CreateLinkEvent('inventory/toggle') }> + { (getFullCount > 0) && + } { isInRoom && - handleToolbarItemClick(ToolbarViewItems.CAMERA_ITEM) } /> } + CreateLinkEvent('camera/toggle') } /> } { isMod && - handleToolbarItemClick(ToolbarViewItems.MOD_TOOLS_ITEM) } /> } + CreateLinkEvent('mod-tools/toggle') } /> } - handleToolbarItemClick(ToolbarViewItems.FRIEND_LIST_ITEM) }> - { (unseenFriendRequestCount > 0) && - } + CreateLinkEvent('friends/toggle') }> + { (requests.length > 0) && + } - { ((chatIconType === CHAT_ICON_SHOWING) || (chatIconType === CHAT_ICON_UNREAD)) && - handleToolbarItemClick(ToolbarViewItems.FRIEND_CHAT_ITEM) } /> } + { ((iconState === MessengerIconState.SHOW) || (iconState === MessengerIconState.UNREAD)) && + OpenMessengerChat() } /> } diff --git a/src/components/toolbar/common/ToolbarViewItems.ts b/src/components/toolbar/common/ToolbarViewItems.ts deleted file mode 100644 index 9833dd72..00000000 --- a/src/components/toolbar/common/ToolbarViewItems.ts +++ /dev/null @@ -1,15 +0,0 @@ -export class ToolbarViewItems -{ - public static NAVIGATOR_ITEM: string = 'TVI_NAVIGATOR_ITEM'; - public static INVENTORY_ITEM: string = 'TVI_INVENTORY_ITEM'; - public static CATALOG_ITEM: string = 'TVI_CATALOG_ITEM'; - public static FRIEND_LIST_ITEM: string = 'TVI_FRIEND_LIST_ITEM'; - public static FRIEND_CHAT_ITEM: string = 'TVI_FRIEND_CHAT_ITEM'; - public static CLOTHING_ITEM: string = 'TVI_CLOTHING_ITEM'; - public static CAMERA_ITEM: string = 'TVI_CAMERA_ITEM'; - public static MOD_TOOLS_ITEM: string = 'TVI_MOD_TOOLS_ITEM'; - public static ACHIEVEMENTS_ITEM: string = 'TVI_ACHIEVEMENTS_ITEM'; - public static PROFILE_ITEM: string = 'TVI_PROFILE_ITEM'; - public static SETTINGS_ITEM: string = 'TVI_SETTINGS_ITEM'; - public static GUIDE_TOOL_ITEM: string = 'TVI_GUIDE_TOOL_ITEM'; -} diff --git a/src/components/user-profile/UserProfileView.tsx b/src/components/user-profile/UserProfileView.tsx index bfc1892e..59f426da 100644 --- a/src/components/user-profile/UserProfileView.tsx +++ b/src/components/user-profile/UserProfileView.tsx @@ -2,7 +2,7 @@ import { RelationshipStatusInfoEvent, RelationshipStatusInfoMessageParser, RoomE import { FC, useCallback, useState } from 'react'; import { CreateLinkEvent, GetRoomSession, GetSessionDataManager, GetUserProfile, LocalizeText, SendMessageComposer } from '../../api'; import { Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { BatchUpdates, UseMessageEventHook, UseRoomEngineEvent } from '../../hooks'; +import { useMessageEvent, useRoomEngineEvent } from '../../hooks'; import { BadgesContainerView } from './views/BadgesContainerView'; import { FriendsContainerView } from './views/FriendsContainerView'; import { GroupsContainerView } from './views/GroupsContainerView'; @@ -16,12 +16,9 @@ export const UserProfileView: FC<{}> = props => const onClose = () => { - BatchUpdates(() => - { - setUserProfile(null); - setUserBadges([]); - setUserRelationships(null); - }); + setUserProfile(null); + setUserBadges([]); + setUserRelationships(null); } const onLeaveGroup = useCallback(() => @@ -30,47 +27,49 @@ export const UserProfileView: FC<{}> = props => GetUserProfile(userProfile.id); }, [ userProfile ]); - - const onUserCurrentBadgesEvent = useCallback((event: UserCurrentBadgesEvent) => + + useMessageEvent(UserCurrentBadgesEvent, event => { const parser = event.getParser(); if(!userProfile || (parser.userId !== userProfile.id)) return; setUserBadges(parser.badges); - }, [ userProfile ]); + }); - UseMessageEventHook(UserCurrentBadgesEvent, onUserCurrentBadgesEvent); - - const onUserRelationshipsEvent = useCallback((event: RelationshipStatusInfoEvent) => + useMessageEvent(RelationshipStatusInfoEvent, event => { const parser = event.getParser(); if(!userProfile || (parser.userId !== userProfile.id)) return; setUserRelationships(parser); - }, [ userProfile ]); + }); - UseMessageEventHook(RelationshipStatusInfoEvent, onUserRelationshipsEvent); - - const onUserProfileEvent = useCallback((event: UserProfileEvent) => + useMessageEvent(UserProfileEvent, event => { const parser = event.getParser(); + + let isSameProfile = false; - BatchUpdates(() => + setUserProfile(prevValue => + { + if(prevValue && prevValue.id) isSameProfile = (prevValue.id === parser.id); + + return parser; + }); + + if(!isSameProfile) { - setUserProfile(parser); setUserBadges([]); setUserRelationships(null); - }); + } SendMessageComposer(new UserCurrentBadgesComposer(parser.id)); SendMessageComposer(new UserRelationshipsComposer(parser.id)); - }, []); + }); - UseMessageEventHook(UserProfileEvent, onUserProfileEvent); - - const onRoomEngineObjectEvent = useCallback((event: RoomEngineObjectEvent) => + useRoomEngineEvent(RoomEngineObjectEvent.SELECTED, event => { if(!userProfile) return; @@ -81,9 +80,7 @@ export const UserProfileView: FC<{}> = props => if(userData.type !== RoomObjectType.USER) return; GetUserProfile(userData.webID); - }, [ userProfile ]); - - UseRoomEngineEvent(RoomEngineObjectEvent.SELECTED, onRoomEngineObjectEvent); + }); if(!userProfile) return null; @@ -104,7 +101,7 @@ export const UserProfileView: FC<{}> = props => - CreateLinkEvent(`navigator/search/hotel_view/owner:${ userProfile.username }`)}> + CreateLinkEvent(`navigator/search/hotel_view/owner:${ userProfile.username }`) }> { LocalizeText('extendedprofile.rooms') } diff --git a/src/components/user-profile/views/BadgesContainerView.tsx b/src/components/user-profile/views/BadgesContainerView.tsx index 06180be6..ca59fc21 100644 --- a/src/components/user-profile/views/BadgesContainerView.tsx +++ b/src/components/user-profile/views/BadgesContainerView.tsx @@ -12,7 +12,7 @@ export const BadgesContainerView: FC = props => return ( <> - { badges && (badges.length > 0) && badges.map((badge, index) => + { badges && (badges.length > 0) && badges.map((badge, index) => { return ( diff --git a/src/components/user-profile/views/FriendsContainerView.tsx b/src/components/user-profile/views/FriendsContainerView.tsx index 756616e6..f5449d17 100644 --- a/src/components/user-profile/views/FriendsContainerView.tsx +++ b/src/components/user-profile/views/FriendsContainerView.tsx @@ -21,7 +21,7 @@ export const FriendsContainerView: FC = props => { LocalizeText('extendedprofile.relstatus') } - + ) diff --git a/src/components/user-profile/views/GroupsContainerView.tsx b/src/components/user-profile/views/GroupsContainerView.tsx index 56643e46..bd598ee1 100644 --- a/src/components/user-profile/views/GroupsContainerView.tsx +++ b/src/components/user-profile/views/GroupsContainerView.tsx @@ -1,8 +1,8 @@ import { GroupInformationComposer, GroupInformationEvent, GroupInformationParser, HabboGroupEntryData } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import { SendMessageComposer, ToggleFavoriteGroup } from '../../../api'; import { AutoGrid, Base, Column, Flex, Grid, GridProps, LayoutBadgeImageView, LayoutGridItem } from '../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../hooks'; +import { useMessageEvent } from '../../../hooks'; import { GroupInformationView } from '../../groups/views/GroupInformationView'; interface GroupsContainerViewProps extends GridProps @@ -18,16 +18,14 @@ export const GroupsContainerView: FC = props => const [ selectedGroupId, setSelectedGroupId ] = useState(null); const [ groupInformation, setGroupInformation ] = useState(null); - const onGroupInformationEvent = useCallback((event: GroupInformationEvent) => + useMessageEvent(GroupInformationEvent, event => { const parser = event.getParser(); if(!selectedGroupId || (selectedGroupId !== parser.id) || parser.flag) return; setGroupInformation(parser); - }, [ selectedGroupId ]); - - UseMessageEventHook(GroupInformationEvent, onGroupInformationEvent); + }); useEffect(() => { @@ -38,23 +36,20 @@ export const GroupsContainerView: FC = props => useEffect(() => { - BatchUpdates(() => - { - setGroupInformation(null); + setGroupInformation(null); - if(groups.length > 0) + if(groups.length > 0) + { + setSelectedGroupId(prevValue => { - setSelectedGroupId(prevValue => - { - if(prevValue === groups[0].groupId) - { - SendMessageComposer(new GroupInformationComposer(groups[0].groupId, false)); - } - - return groups[0].groupId; - }); - } - }); + if(prevValue === groups[0].groupId) + { + SendMessageComposer(new GroupInformationComposer(groups[0].groupId, false)); + } + + return groups[0].groupId; + }); + } }, [ groups ]); if(!groups || !groups.length) @@ -75,15 +70,15 @@ export const GroupsContainerView: FC = props => { groups.map((group, index) => - { - return ( - setSelectedGroupId(group.groupId) } className="p-1"> - { itsMe && - ToggleFavoriteGroup(group) } /> } - - - ) - }) } + { + return ( + setSelectedGroupId(group.groupId) } className="p-1"> + { itsMe && + ToggleFavoriteGroup(group) } /> } + + + ) + }) } diff --git a/src/components/user-profile/views/UserContainerView.tsx b/src/components/user-profile/views/UserContainerView.tsx index 97cef6cc..ceba4bfc 100644 --- a/src/components/user-profile/views/UserContainerView.tsx +++ b/src/components/user-profile/views/UserContainerView.tsx @@ -33,7 +33,7 @@ export const UserContainerView: FC = props => - + { userProfile.username } { userProfile.motto }  diff --git a/src/components/user-settings/UserSettingsView.tsx b/src/components/user-settings/UserSettingsView.tsx index 368657c7..d8f4efa2 100644 --- a/src/components/user-settings/UserSettingsView.tsx +++ b/src/components/user-settings/UserSettingsView.tsx @@ -1,55 +1,16 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { NitroSettingsEvent, UserSettingsCameraFollowComposer, UserSettingsEvent, UserSettingsOldChatComposer, UserSettingsRoomInvitesComposer, UserSettingsSoundComposer } from '@nitrots/nitro-renderer'; +import { ILinkEventTracker, NitroSettingsEvent, UserSettingsCameraFollowComposer, UserSettingsEvent, UserSettingsOldChatComposer, UserSettingsRoomInvitesComposer, UserSettingsSoundComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../api'; +import { AddEventLinkTracker, DispatchMainEvent, DispatchUiEvent, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; import { Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { UserSettingsUIEvent } from '../../events'; -import { DispatchMainEvent, DispatchUiEvent, UseMessageEventHook, UseUiEvent } from '../../hooks'; +import { useCatalogPlaceMultipleItems, useCatalogSkipPurchaseConfirmation, useMessageEvent } from '../../hooks'; export const UserSettingsView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); const [ userSettings, setUserSettings ] = useState(null); - - const onUserSettingsUIEvent = useCallback((event: UserSettingsUIEvent) => - { - switch(event.type) - { - case UserSettingsUIEvent.SHOW_USER_SETTINGS: - setIsVisible(true); - return; - case UserSettingsUIEvent.HIDE_USER_SETTINGS: - setIsVisible(false); - return; - case UserSettingsUIEvent.TOGGLE_USER_SETTINGS: - setIsVisible(value => !value); - return; - } - }, []); - - UseUiEvent(UserSettingsUIEvent.SHOW_USER_SETTINGS, onUserSettingsUIEvent); - UseUiEvent(UserSettingsUIEvent.HIDE_USER_SETTINGS, onUserSettingsUIEvent); - UseUiEvent(UserSettingsUIEvent.TOGGLE_USER_SETTINGS, onUserSettingsUIEvent); - - const onUserSettingsEvent = useCallback((event: UserSettingsEvent) => - { - const parser = event.getParser(); - const settingsEvent = new NitroSettingsEvent(); - - settingsEvent.volumeSystem = parser.volumeSystem; - settingsEvent.volumeFurni = parser.volumeFurni; - settingsEvent.volumeTrax = parser.volumeTrax; - settingsEvent.oldChat = parser.oldChat; - settingsEvent.roomInvites = parser.roomInvites; - settingsEvent.cameraFollow = parser.cameraFollow; - settingsEvent.flags = parser.flags; - settingsEvent.chatType = parser.chatType; - - setUserSettings(settingsEvent); - DispatchMainEvent(settingsEvent); - }, []); - - UseMessageEventHook(UserSettingsEvent, onUserSettingsEvent); + const [ catalogPlaceMultipleObjects, setCatalogPlaceMultipleObjects ] = useCatalogPlaceMultipleItems(); + const [ catalogSkipPurchaseConfirmation, setCatalogSkipPurchaseConfirmation ] = useCatalogSkipPurchaseConfirmation(); const processAction = useCallback((type: string, value?: boolean | number | string) => { @@ -93,8 +54,9 @@ export const UserSettingsView: FC<{}> = props => } if(doUpdate) setUserSettings(clone); + DispatchMainEvent(clone) - }, [userSettings]); + }, [ userSettings ]); const saveRangeSlider = useCallback((type: string) => { @@ -104,20 +66,68 @@ export const UserSettingsView: FC<{}> = props => SendMessageComposer(new UserSettingsSoundComposer(Math.round(userSettings.volumeSystem), Math.round(userSettings.volumeFurni), Math.round(userSettings.volumeTrax))); break; } - }, [userSettings]); + }, [ userSettings ]); + + useMessageEvent(UserSettingsEvent, event => + { + const parser = event.getParser(); + const settingsEvent = new NitroSettingsEvent(); + + settingsEvent.volumeSystem = parser.volumeSystem; + settingsEvent.volumeFurni = parser.volumeFurni; + settingsEvent.volumeTrax = parser.volumeTrax; + settingsEvent.oldChat = parser.oldChat; + settingsEvent.roomInvites = parser.roomInvites; + settingsEvent.cameraFollow = parser.cameraFollow; + settingsEvent.flags = parser.flags; + settingsEvent.chatType = parser.chatType; + + setUserSettings(settingsEvent); + DispatchMainEvent(settingsEvent); + }); + + useEffect(() => + { + const linkTracker: ILinkEventTracker = { + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'show': + setIsVisible(true); + return; + case 'hide': + setIsVisible(false); + return; + case 'toggle': + setIsVisible(prevValue => !prevValue); + return; + } + }, + eventUrlPrefix: 'user-settings/' + }; + + AddEventLinkTracker(linkTracker); + + return () => RemoveLinkEventTracker(linkTracker); + }, []); useEffect(() => { if(!userSettings) return; DispatchUiEvent(userSettings); - }, [userSettings]); + }, [ userSettings ]); - if(!isVisible) return null; + if(!isVisible || !userSettings) return null; return ( - processAction('close_view')} /> + processAction('close_view') } /> @@ -132,6 +142,14 @@ export const UserSettingsView: FC<{}> = props => processAction('camera_follow', event.target.checked) } /> { LocalizeText('memenu.settings.other.disable.room.camera.follow') } + + setCatalogPlaceMultipleObjects(event.target.checked) } /> + { LocalizeText('memenu.settings.other.place.multiple.objects') } + + + setCatalogSkipPurchaseConfirmation(event.target.checked) } /> + { LocalizeText('memenu.settings.other.skip.purchase.confirmation') } + { LocalizeText('widget.memenu.settings.volume') } diff --git a/src/components/wired/WiredMessageHandler.tsx b/src/components/wired/WiredMessageHandler.tsx deleted file mode 100644 index 0819f9b1..00000000 --- a/src/components/wired/WiredMessageHandler.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { WiredFurniActionEvent, WiredFurniConditionEvent, WiredFurniTriggerEvent, WiredOpenEvent, WiredRewardResultMessageEvent, WiredSaveSuccessEvent, WiredValidationErrorEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback } from 'react'; -import { UseMessageEventHook } from '../../hooks/messages'; -import { useWiredContext } from './context/WiredContext'; - -export const WiredMessageHandler: FC<{}> = props => -{ - const { setTrigger = null } = useWiredContext(); - - const onWiredFurniActionEvent = useCallback((event: WiredFurniActionEvent) => - { - const parser = event.getParser(); - - setTrigger(parser.definition); - }, [ setTrigger ]); - - const onWiredFurniConditionEvent = useCallback((event: WiredFurniConditionEvent) => - { - const parser = event.getParser(); - - setTrigger(parser.definition); - }, [ setTrigger ]); - - const onWiredFurniTriggerEvent = useCallback((event: WiredFurniTriggerEvent) => - { - const parser = event.getParser(); - - setTrigger(parser.definition); - }, [ setTrigger ]); - - const onWiredOpenEvent = useCallback((event: WiredOpenEvent) => - { - const parser = event.getParser(); - - console.log(parser); - }, []); - - const onWiredRewardResultMessageEvent = useCallback((event: WiredRewardResultMessageEvent) => - { - const parser = event.getParser(); - - console.log(parser); - }, []); - - const onWiredSaveSuccessEvent = useCallback((event: WiredSaveSuccessEvent) => - { - setTrigger(null); - }, [ setTrigger ]); - - const onWiredValidationErrorEvent = useCallback((event: WiredValidationErrorEvent) => - { - const parser = event.getParser(); - - console.log(parser); - }, []); - - UseMessageEventHook(WiredFurniActionEvent, onWiredFurniActionEvent); - UseMessageEventHook(WiredFurniConditionEvent, onWiredFurniConditionEvent); - UseMessageEventHook(WiredFurniTriggerEvent, onWiredFurniTriggerEvent); - UseMessageEventHook(WiredOpenEvent, onWiredOpenEvent); - UseMessageEventHook(WiredRewardResultMessageEvent, onWiredRewardResultMessageEvent); - UseMessageEventHook(WiredSaveSuccessEvent, onWiredSaveSuccessEvent); - UseMessageEventHook(WiredValidationErrorEvent, onWiredValidationErrorEvent); - - return null; -}; diff --git a/src/components/wired/WiredView.tsx b/src/components/wired/WiredView.tsx index 97bc67c6..cb3b4baf 100644 --- a/src/components/wired/WiredView.tsx +++ b/src/components/wired/WiredView.tsx @@ -1,54 +1,21 @@ -import { ConditionDefinition, Triggerable, TriggerDefinition, UpdateActionMessageComposer, UpdateConditionMessageComposer, UpdateTriggerMessageComposer, WiredActionDefinition } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useMemo, useState } from 'react'; -import { IsOwnerOfFloorFurniture, SendMessageComposer } from '../../api'; -import { WiredEvent } from '../../events'; -import { UseUiEvent } from '../../hooks'; -import { GetWiredLayout } from './common/GetWiredLayout'; -import { WiredContextProvider } from './context/WiredContext'; -import { WiredMessageHandler } from './WiredMessageHandler'; +import { ConditionDefinition, TriggerDefinition, WiredActionDefinition } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; +import { useWired } from '../../hooks'; +import { WiredActionLayoutView } from './views/actions/WiredActionLayoutView'; +import { WiredConditionLayoutView } from './views/conditions/WiredConditionLayoutView'; +import { WiredTriggerLayoutView } from './views/triggers/WiredTriggerLayoutView'; export const WiredView: FC<{}> = props => { - const [ trigger, setTrigger ] = useState(null); - const [ intParams, setIntParams ] = useState(null); - const [ stringParam, setStringParam ] = useState(null); - const [ furniIds, setFurniIds ] = useState([]); - const [ actionDelay, setActionDelay ] = useState(null); + const { trigger = null } = useWired(); - const wiredLayout = useMemo(() => - { - return GetWiredLayout(trigger); - }, [ trigger ]); + if(!trigger) return null; - const onWiredEvent = useCallback((event: WiredEvent) => - { - if(!IsOwnerOfFloorFurniture(trigger.id)) - { - - } - - if(trigger instanceof WiredActionDefinition) - { - SendMessageComposer(new UpdateActionMessageComposer(trigger.id, intParams, stringParam, furniIds, actionDelay, trigger.stuffTypeSelectionCode)); - } + if(trigger instanceof WiredActionDefinition) return WiredActionLayoutView(trigger.code); - else if(trigger instanceof TriggerDefinition) - { - SendMessageComposer(new UpdateTriggerMessageComposer(trigger.id, intParams, stringParam, furniIds, trigger.stuffTypeSelectionCode)); - } - - else if(trigger instanceof ConditionDefinition) - { - SendMessageComposer(new UpdateConditionMessageComposer(trigger.id, intParams, stringParam, furniIds, trigger.stuffTypeSelectionCode)); - } - }, [ trigger, intParams, stringParam, furniIds, actionDelay ]); - - UseUiEvent(WiredEvent.SAVE_WIRED, onWiredEvent); - - return ( - - - { wiredLayout } - - ); + if(trigger instanceof TriggerDefinition) return WiredTriggerLayoutView(trigger.code); + + if(trigger instanceof ConditionDefinition) return WiredConditionLayoutView(trigger.code); + + return null; }; diff --git a/src/components/wired/common/GetWiredActionLayout.tsx b/src/components/wired/common/GetWiredActionLayout.tsx deleted file mode 100644 index a5072141..00000000 --- a/src/components/wired/common/GetWiredActionLayout.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { WiredActionBotChangeFigureView } from '../views/actions/WiredActionBotChangeFigureView'; -import { WiredActionBotFollowAvatarView } from '../views/actions/WiredActionBotFollowAvatarView'; -import { WiredActionBotGiveHandItemView } from '../views/actions/WiredActionBotGiveHandItemView'; -import { WiredActionBotMoveView } from '../views/actions/WiredActionBotMoveView'; -import { WiredActionBotTalkToAvatarView } from '../views/actions/WiredActionBotTalkToAvatarView'; -import { WiredActionBotTalkView } from '../views/actions/WiredActionBotTalkView'; -import { WiredActionBotTeleportView } from '../views/actions/WiredActionBotTeleportView'; -import { WiredActionCallAnotherStackView } from '../views/actions/WiredActionCallAnotherStackView'; -import { WiredActionChaseView } from '../views/actions/WiredActionChaseView'; -import { WiredActionChatView } from '../views/actions/WiredActionChatView'; -import { WiredActionFleeView } from '../views/actions/WiredActionFleeView'; -import { WiredActionGiveRewardView } from '../views/actions/WiredActionGiveRewardView'; -import { WiredActionGiveScoreToPredefinedTeamView } from '../views/actions/WiredActionGiveScoreToPredefinedTeamView'; -import { WiredActionGiveScoreView } from '../views/actions/WiredActionGiveScoreView'; -import { WiredActionJoinTeamView } from '../views/actions/WiredActionJoinTeamView'; -import { WiredActionKickFromRoomView } from '../views/actions/WiredActionKickFromRoomView'; -import { WiredActionLeaveTeamView } from '../views/actions/WiredActionLeaveTeamView'; -import { WiredActionMoveAndRotateFurniView } from '../views/actions/WiredActionMoveAndRotateFurniView'; -import { WiredActionMoveFurniToView } from '../views/actions/WiredActionMoveFurniToView'; -import { WiredActionMoveFurniView } from '../views/actions/WiredActionMoveFurniView'; -import { WiredActionMuteUserView } from '../views/actions/WiredActionMuteUserView'; -import { WiredActionResetView } from '../views/actions/WiredActionResetView'; -import { WiredActionSetFurniStateToView } from '../views/actions/WiredActionSetFurniStateToView'; -import { WiredActionTeleportView } from '../views/actions/WiredActionTeleportView'; -import { WiredActionToggleFurniStateView } from '../views/actions/WiredActionToggleFurniStateView'; -import { WiredActionLayout } from './WiredActionLayoutCode'; - -export const GetWiredActionLayout = (code: number) => -{ - switch(code) - { - case WiredActionLayout.BOT_CHANGE_FIGURE: - return ; - case WiredActionLayout.BOT_FOLLOW_AVATAR: - return ; - case WiredActionLayout.BOT_GIVE_HAND_ITEM: - return ; - case WiredActionLayout.BOT_MOVE: - return ; - case WiredActionLayout.BOT_TALK: - return ; - case WiredActionLayout.BOT_TALK_DIRECT_TO_AVTR: - return ; - case WiredActionLayout.BOT_TELEPORT: - return ; - case WiredActionLayout.CALL_ANOTHER_STACK: - return ; - case WiredActionLayout.CHASE: - return ; - case WiredActionLayout.CHAT: - return ; - case WiredActionLayout.FLEE: - return ; - case WiredActionLayout.GIVE_REWARD: - return ; - case WiredActionLayout.GIVE_SCORE: - return ; - case WiredActionLayout.GIVE_SCORE_TO_PREDEFINED_TEAM: - return ; - case WiredActionLayout.JOIN_TEAM: - return ; - case WiredActionLayout.KICK_FROM_ROOM: - return ; - case WiredActionLayout.LEAVE_TEAM: - return ; - case WiredActionLayout.MOVE_FURNI: - return ; - case WiredActionLayout.MOVE_AND_ROTATE_FURNI: - return ; - case WiredActionLayout.MOVE_FURNI_TO: - return ; - case WiredActionLayout.MUTE_USER: - return ; - case WiredActionLayout.RESET: - return ; - case WiredActionLayout.SET_FURNI_STATE: - return ; - case WiredActionLayout.TELEPORT: - return ; - case WiredActionLayout.TOGGLE_FURNI_STATE: - return ; - } - - return null; -} diff --git a/src/components/wired/common/GetWiredLayout.tsx b/src/components/wired/common/GetWiredLayout.tsx deleted file mode 100644 index 5b5a6bed..00000000 --- a/src/components/wired/common/GetWiredLayout.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { ConditionDefinition, Triggerable, TriggerDefinition, WiredActionDefinition } from '@nitrots/nitro-renderer'; -import { GetWiredActionLayout } from './GetWiredActionLayout'; -import { GetWiredConditionLayout } from './GetWiredConditionLayout'; -import { GetWiredTriggerLayout } from './GetWiredTriggerLayout'; - -export const GetWiredLayout = (trigger: Triggerable) => -{ - if(trigger instanceof WiredActionDefinition) return GetWiredActionLayout(trigger.code); - - if(trigger instanceof TriggerDefinition) return GetWiredTriggerLayout(trigger.code); - - if(trigger instanceof ConditionDefinition) return GetWiredConditionLayout(trigger.code); - - return null; -} diff --git a/src/components/wired/context/WiredContext.tsx b/src/components/wired/context/WiredContext.tsx deleted file mode 100644 index d2046048..00000000 --- a/src/components/wired/context/WiredContext.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { Triggerable } from '@nitrots/nitro-renderer'; -import { createContext, Dispatch, FC, ProviderProps, SetStateAction, useContext } from 'react'; - -export interface IWiredContext -{ - trigger: Triggerable; - setTrigger: Dispatch>; - intParams: number[], - setIntParams: Dispatch>; - stringParam: string; - setStringParam: Dispatch>; - furniIds: number[]; - setFurniIds: Dispatch>; - actionDelay: number; - setActionDelay: Dispatch>; -} - -const WiredContext = createContext({ - trigger: null, - setTrigger: null, - intParams: null, - setIntParams: null, - stringParam: null, - setStringParam: null, - furniIds: null, - setFurniIds: null, - actionDelay: null, - setActionDelay: null -}); - -export const WiredContextProvider: FC> = props => -{ - return { props.children } -} - -export const useWiredContext = () => useContext(WiredContext); diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx index 5bec7477..6227c669 100644 --- a/src/components/wired/views/WiredBaseView.tsx +++ b/src/components/wired/views/WiredBaseView.tsx @@ -1,41 +1,45 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { GetSessionDataManager, LocalizeText } from '../../../api'; +import { FC, PropsWithChildren, useEffect, useState } from 'react'; +import { GetSessionDataManager, LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../api'; import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { WiredEvent } from '../../../events'; -import { BatchUpdates, DispatchUiEvent } from '../../../hooks'; -import { WiredFurniType } from '../common/WiredFurniType'; -import { WiredSelectionVisualizer } from '../common/WiredSelectionVisualizer'; -import { useWiredContext } from '../context/WiredContext'; +import { useWired } from '../../../hooks'; import { WiredFurniSelectorView } from './WiredFurniSelectorView'; export interface WiredBaseViewProps { wiredType: string; requiresFurni: number; + hasSpecialInput: boolean; save: () => void; validate?: () => boolean; } -export const WiredBaseView: FC = props => +export const WiredBaseView: FC> = props => { - const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null } = props; + const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false } = props; const [ wiredName, setWiredName ] = useState(null); const [ wiredDescription, setWiredDescription ] = useState(null); - const { trigger = null, setTrigger = null, setIntParams = null, setStringParam = null, setFurniIds = null } = useWiredContext(); + const [ needsSave, setNeedsSave ] = useState(false); + const { trigger = null, setTrigger = null, setIntParams = null, setStringParam = null, setFurniIds = null, saveWired = null } = useWired(); - const onSave = useCallback(() => + const onClose = () => setTrigger(null); + + const onSave = () => { if(validate && !validate()) return; if(save) save(); - setTimeout(() => DispatchUiEvent(new WiredEvent(WiredEvent.SAVE_WIRED)), 1); - }, [ save, validate ]); + setNeedsSave(true); + } - const close = useCallback(() => + useEffect(() => { - setTrigger(null); - }, [ setTrigger ]); + if(!needsSave) return; + + saveWired(); + + setNeedsSave(false); + }, [ needsSave, saveWired ]); useEffect(() => { @@ -44,40 +48,44 @@ export const WiredBaseView: FC = props => const spriteId = (trigger.spriteId || -1); const furniData = GetSessionDataManager().getFloorItemData(spriteId); - BatchUpdates(() => + if(!furniData) { - if(!furniData) - { - setWiredName(('NAME: ' + spriteId)); - setWiredDescription(('NAME: ' + spriteId)); - } - else - { - setWiredName(furniData.name); - setWiredDescription(furniData.description); - } + setWiredName(('NAME: ' + spriteId)); + setWiredDescription(('NAME: ' + spriteId)); + } + else + { + setWiredName(furniData.name); + setWiredDescription(furniData.description); + } + if(hasSpecialInput) + { setIntParams(trigger.intData); setStringParam(trigger.stringData); + } + + if(requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) + { setFurniIds(prevValue => + { + if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); + + if(trigger.selectedItems && trigger.selectedItems.length) { - if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); + WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); - if(trigger.selectedItems && trigger.selectedItems.length) - { - WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); + return trigger.selectedItems; + } - return trigger.selectedItems; - } - - return []; - }); - }); - }, [ trigger, setIntParams, setStringParam, setFurniIds ]); + return []; + }); + } + }, [ trigger, hasSpecialInput, requiresFurni, setIntParams, setStringParam, setFurniIds ]); return ( - + @@ -95,7 +103,7 @@ export const WiredBaseView: FC = props => } - + diff --git a/src/components/wired/views/WiredFurniSelectorView.tsx b/src/components/wired/views/WiredFurniSelectorView.tsx index 616261a2..9b38f972 100644 --- a/src/components/wired/views/WiredFurniSelectorView.tsx +++ b/src/components/wired/views/WiredFurniSelectorView.tsx @@ -1,83 +1,15 @@ -import { FC, useCallback, useEffect } from 'react'; +import { FC } from 'react'; import { LocalizeText } from '../../../api'; import { Column, Text } from '../../../common'; -import { WiredSelectObjectEvent } from '../../../events'; -import { UseUiEvent } from '../../../hooks'; -import { WiredSelectionVisualizer } from '../common/WiredSelectionVisualizer'; -import { useWiredContext } from '../context/WiredContext'; +import { useWired } from '../../../hooks'; export const WiredFurniSelectorView: FC<{}> = props => { - const { trigger = null, furniIds = [], setFurniIds = null } = useWiredContext(); - - const onWiredSelectObjectEvent = useCallback((event: WiredSelectObjectEvent) => - { - const furniId = event.objectId; - - if(furniId === -1) return; - - let newFurniIds: number[] = null; - - setFurniIds(prevValue => - { - newFurniIds = [ ...prevValue ]; - - const index = prevValue.indexOf(furniId); - - if(index >= 0) - { - newFurniIds.splice(index, 1); - - WiredSelectionVisualizer.hide(furniId); - } - else - { - if(newFurniIds.length < trigger.maximumItemSelectionCount) - { - newFurniIds.push(furniId); - - WiredSelectionVisualizer.show(furniId); - } - } - - return newFurniIds; - }); - }, [ trigger, setFurniIds ]); - - UseUiEvent(WiredSelectObjectEvent.SELECT_OBJECT, onWiredSelectObjectEvent); - - useEffect(() => - { - if(!trigger) return; - - setFurniIds(prevValue => - { - if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); - - if(trigger.selectedItems && trigger.selectedItems.length) - { - WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); - - return trigger.selectedItems; - } - - return []; - }); - - return () => - { - setFurniIds(prevValue => - { - WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); - - return []; - }); - } - }, [ trigger, setFurniIds ]); + const { trigger = null, furniIds = [] } = useWired(); return ( - { LocalizeText('wiredfurni.pickfurnis.caption', ['count', 'limit'], [ furniIds.length.toString(), trigger.maximumItemSelectionCount.toString() ]) } + { LocalizeText('wiredfurni.pickfurnis.caption', [ 'count', 'limit' ], [ furniIds.length.toString(), trigger.maximumItemSelectionCount.toString() ]) } { LocalizeText('wiredfurni.pickfurnis.desc') } ); diff --git a/src/components/wired/views/actions/WiredActionBaseView.tsx b/src/components/wired/views/actions/WiredActionBaseView.tsx index 0d3a6076..6c7a86eb 100644 --- a/src/components/wired/views/actions/WiredActionBaseView.tsx +++ b/src/components/wired/views/actions/WiredActionBaseView.tsx @@ -1,50 +1,40 @@ import { WiredActionDefinition } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, PropsWithChildren, useEffect } from 'react'; import ReactSlider from 'react-slider'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { GetWiredTimeLocale } from '../../common/GetWiredTimeLocale'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredBaseView } from '../WiredBaseView'; export interface WiredActionBaseViewProps { + hasSpecialInput: boolean; requiresFurni: number; save: () => void; } -export const WiredActionBaseView: FC = props => +export const WiredActionBaseView: FC> = props => { - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, children = null } = props; - const [ delay, setDelay ] = useState(-1); - const { trigger = null, setActionDelay = null } = useWiredContext(); + const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; + const { trigger = null, actionDelay = 0, setActionDelay = null } = useWired(); useEffect(() => { - setDelay((trigger as WiredActionDefinition).delayInPulses); - }, [ trigger ]); - - const onSave = useCallback(() => - { - if(save) save(); - - setActionDelay(delay); - }, [ delay, save, setActionDelay ]); + setActionDelay((trigger as WiredActionDefinition).delayInPulses); + }, [ trigger, setActionDelay ]); return ( - + { children } { !!children &&
} - { LocalizeText('wiredfurni.params.delay', [ 'seconds' ], [ GetWiredTimeLocale(delay) ]) } + { LocalizeText('wiredfurni.params.delay', [ 'seconds' ], [ GetWiredTimeLocale(actionDelay) ]) } setDelay(event) } /> + value={ actionDelay } + onChange={ event => setActionDelay(event) } />
); diff --git a/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx b/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx index 06ada2ef..4289f951 100644 --- a/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx +++ b/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx @@ -1,10 +1,7 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { GetSessionDataManager, LocalizeText } from '../../../../api'; +import { FC, useEffect, useState } from 'react'; +import { GetSessionDataManager, LocalizeText, WiredFurniType, WIRED_STRING_DELIMETER } from '../../../../api'; import { Button, Column, Flex, LayoutAvatarImageView, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { WIRED_STRING_DELIMETER } from '../../common/WiredStringDelimeter'; -import { useWiredContext } from '../../context/WiredContext'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; const DEFAULT_FIGURE: string = 'hd-180-1.ch-210-66.lg-270-82.sh-290-81'; @@ -13,38 +10,27 @@ export const WiredActionBotChangeFigureView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); const [ figure, setFigure ] = useState(''); - const { trigger = null, setStringParam = null } = useWiredContext(); + const { trigger = null, setStringParam = null } = useWired(); - const copyLooks = useCallback(() => - { - setFigure(GetSessionDataManager().figure); - }, []); - - const save = useCallback(() => - { - setStringParam((botName + WIRED_STRING_DELIMETER + figure)); - }, [ botName, figure, setStringParam ]); + const save = () => setStringParam((botName + WIRED_STRING_DELIMETER + figure)); useEffect(() => { const data = trigger.stringData.split(WIRED_STRING_DELIMETER); - BatchUpdates(() => - { - if(data.length > 0) setBotName(data[0]); - if(data.length > 1) setFigure(data[1].length > 0 ? data[1] : DEFAULT_FIGURE); - }); + if(data.length > 0) setBotName(data[0]); + if(data.length > 1) setFigure(data[1].length > 0 ? data[1] : DEFAULT_FIGURE); }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> - + ); diff --git a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx index db19a24f..2acb5cc1 100644 --- a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx @@ -1,41 +1,31 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionBotFollowAvatarView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); const [ followMode, setFollowMode ] = useState(-1); - const { trigger = null, setStringParam = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - const save = useCallback(() => + const save = () => { - BatchUpdates(() => - { - setStringParam(botName); - setIntParams([followMode]); - }); - }, [ followMode, botName, setStringParam, setIntParams ]); + setStringParam(botName); + setIntParams([ followMode ]); + } useEffect(() => { - BatchUpdates(() => - { - setBotName(trigger.stringData); - setFollowMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }); + setBotName(trigger.stringData); + setFollowMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); return ( - + - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx index 3a36ae75..c93d0de3 100644 --- a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx +++ b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx @@ -1,10 +1,7 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; const ALLOWED_HAND_ITEM_IDS: number[] = [ 2, 5, 7, 8, 9, 10, 27 ]; @@ -13,28 +10,22 @@ export const WiredActionBotGiveHandItemView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); const [ handItemId, setHandItemId ] = useState(-1); - const { trigger = null, setStringParam = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - const save = useCallback(() => + const save = () => { - BatchUpdates(() => - { - setStringParam(botName); - setIntParams([ handItemId ]); - }); - }, [ handItemId, botName, setStringParam, setIntParams ]); + setStringParam(botName); + setIntParams([ handItemId ]); + } useEffect(() => { - BatchUpdates(() => - { - setBotName(trigger.stringData); - setHandItemId((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }); + setBotName(trigger.stringData); + setHandItemId((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> @@ -43,10 +34,7 @@ export const WiredActionBotGiveHandItemView: FC<{}> = props => { LocalizeText('wiredfurni.params.handitem') } diff --git a/src/components/wired/views/actions/WiredActionBotMoveView.tsx b/src/components/wired/views/actions/WiredActionBotMoveView.tsx index d03b42ea..d09a359a 100644 --- a/src/components/wired/views/actions/WiredActionBotMoveView.tsx +++ b/src/components/wired/views/actions/WiredActionBotMoveView.tsx @@ -1,20 +1,15 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionBotMoveView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWiredContext(); + const { trigger = null, setStringParam = null } = useWired(); - const save = useCallback(() => - { - setStringParam(botName); - }, [ botName, setStringParam ]); + const save = () => setStringParam(botName); useEffect(() => { @@ -22,7 +17,7 @@ export const WiredActionBotMoveView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx index 55cb3d31..f2866e05 100644 --- a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx @@ -1,12 +1,7 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { WIRED_STRING_DELIMETER } from '../../common/WiredStringDelimeter'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType, WIRED_STRING_DELIMETER } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionBotTalkToAvatarView: FC<{}> = props => @@ -14,32 +9,26 @@ export const WiredActionBotTalkToAvatarView: FC<{}> = props => const [ botName, setBotName ] = useState(''); const [ message, setMessage ] = useState(''); const [ talkMode, setTalkMode ] = useState(-1); - const { trigger = null, setStringParam = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - const save = useCallback(() => + const save = () => { - BatchUpdates(() => - { - setStringParam(botName + WIRED_STRING_DELIMETER + message); - setIntParams([ talkMode ]); - }); - }, [ botName, message, talkMode, setStringParam, setIntParams ]); + setStringParam(botName + WIRED_STRING_DELIMETER + message); + setIntParams([ talkMode ]); + } useEffect(() => { const data = trigger.stringData.split(WIRED_STRING_DELIMETER); - BatchUpdates(() => - { - if(data.length > 0) setBotName(data[0]); - if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); + if(data.length > 0) setBotName(data[0]); + if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); - setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }); + setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotTalkView.tsx b/src/components/wired/views/actions/WiredActionBotTalkView.tsx index 86c83fb9..b457c431 100644 --- a/src/components/wired/views/actions/WiredActionBotTalkView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTalkView.tsx @@ -1,12 +1,7 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { WIRED_STRING_DELIMETER } from '../../common/WiredStringDelimeter'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType, WIRED_STRING_DELIMETER } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionBotTalkView: FC<{}> = props => @@ -14,32 +9,26 @@ export const WiredActionBotTalkView: FC<{}> = props => const [ botName, setBotName ] = useState(''); const [ message, setMessage ] = useState(''); const [ talkMode, setTalkMode ] = useState(-1); - const { trigger = null, setStringParam = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - const save = useCallback(() => + const save = () => { - BatchUpdates(() => - { - setStringParam(botName + WIRED_STRING_DELIMETER + message); - setIntParams([ talkMode ]); - }); - }, [ botName, message, talkMode, setStringParam, setIntParams ]); + setStringParam(botName + WIRED_STRING_DELIMETER + message); + setIntParams([ talkMode ]); + } useEffect(() => { const data = trigger.stringData.split(WIRED_STRING_DELIMETER); - BatchUpdates(() => - { - if(data.length > 0) setBotName(data[0]); - if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); + if(data.length > 0) setBotName(data[0]); + if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); - setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }); + setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotTeleportView.tsx b/src/components/wired/views/actions/WiredActionBotTeleportView.tsx index bf929e98..5d767b1c 100644 --- a/src/components/wired/views/actions/WiredActionBotTeleportView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTeleportView.tsx @@ -1,20 +1,15 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionBotTeleportView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWiredContext(); + const { trigger = null, setStringParam = null } = useWired(); - const save = useCallback(() => - { - setStringParam(botName); - }, [ botName, setStringParam ]); + const save = () => setStringParam(botName); useEffect(() => { @@ -22,7 +17,7 @@ export const WiredActionBotTeleportView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx b/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx index c3d310e2..ee6d5476 100644 --- a/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx +++ b/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionCallAnotherStackView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionChaseView.tsx b/src/components/wired/views/actions/WiredActionChaseView.tsx index 5f5dbaac..c4945038 100644 --- a/src/components/wired/views/actions/WiredActionChaseView.tsx +++ b/src/components/wired/views/actions/WiredActionChaseView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionChaseView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionChatView.tsx b/src/components/wired/views/actions/WiredActionChatView.tsx index a67ec482..b570af7f 100644 --- a/src/components/wired/views/actions/WiredActionChatView.tsx +++ b/src/components/wired/views/actions/WiredActionChatView.tsx @@ -1,20 +1,15 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionChatView: FC<{}> = props => { const [ message, setMessage ] = useState(''); - const { trigger = null, setStringParam = null } = useWiredContext(); + const { trigger = null, setStringParam = null } = useWired(); - const save = useCallback(() => - { - setStringParam(message); - }, [ message, setStringParam ]); + const save = () => setStringParam(message); useEffect(() => { @@ -22,7 +17,7 @@ export const WiredActionChatView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.message') } setMessage(event.target.value) } maxLength={ 100 } /> diff --git a/src/components/wired/views/actions/WiredActionFleeView.tsx b/src/components/wired/views/actions/WiredActionFleeView.tsx index fcc76360..a80ab434 100644 --- a/src/components/wired/views/actions/WiredActionFleeView.tsx +++ b/src/components/wired/views/actions/WiredActionFleeView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionFleeView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx index 5da167d7..937a175d 100644 --- a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx @@ -1,14 +1,9 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FC, useCallback, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; -import { LocalizeText } from '../../../../api'; -import { Button } from '../../../../common/Button'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Button, Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionGiveRewardView: FC<{}> = props => @@ -19,23 +14,23 @@ export const WiredActionGiveRewardView: FC<{}> = props => const [ rewardsLimit, setRewardsLimit ] = useState(1); const [ limitationInterval, setLimitationInterval ] = useState(1); const [ rewards, setRewards ] = useState<{ isBadge: boolean, itemCode: string, probability: number }[]>([]); - const { trigger = null, setIntParams = null, setStringParam = null } = useWiredContext(); + const { trigger = null, setIntParams = null, setStringParam = null } = useWired(); const addReward = useCallback(() => { - setRewards(rewards => [...rewards, { isBadge: false, itemCode: '', probability: null }]); + setRewards(rewards => [ ...rewards, { isBadge: false, itemCode: '', probability: null } ]); }, [ setRewards ]); const removeReward = useCallback((index: number) => { setRewards(prevValue => - { - const newValues = Array.from(prevValue); + { + const newValues = Array.from(prevValue); - newValues.splice(index, 1); + newValues.splice(index, 1); - return newValues; - }); + return newValues; + }); }, [ setRewards ]); const updateReward = useCallback((index: number, isBadge: boolean, itemCode: string, probability: number) => @@ -60,17 +55,14 @@ export const WiredActionGiveRewardView: FC<{}> = props => { if(!reward.itemCode) continue; - const rewardsString = [reward.isBadge ? '0' : '1', reward.itemCode, reward.probability.toString()]; + const rewardsString = [ reward.isBadge ? '0' : '1', reward.itemCode, reward.probability.toString() ]; stringRewards.push(rewardsString.join(',')); } if(stringRewards.length > 0) { - BatchUpdates(() => - { - setStringParam(stringRewards.join(';')); - setIntParams([rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval]); - }); + setStringParam(stringRewards.join(';')); + setIntParams([ rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval ]); } }, [ rewardTime, uniqueRewards, rewardsLimit, limitationInterval, rewards, setIntParams, setStringParam ]); @@ -94,22 +86,19 @@ export const WiredActionGiveRewardView: FC<{}> = props => if(readRewards.length === 0) readRewards.push({ isBadge: false, itemCode: '', probability: null }); - BatchUpdates(() => - { - setRewardTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); - setUniqueRewards((trigger.intData.length > 1) ? (trigger.intData[1] === 1) : false); - setRewardsLimit((trigger.intData.length > 2) ? trigger.intData[2] : 0); - setLimitationInterval((trigger.intData.length > 3) ? trigger.intData[3] : 0); - setLimitEnabled((trigger.intData.length > 3) ? trigger.intData[3] > 0 : false); - setRewards(readRewards); - }); + setRewardTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUniqueRewards((trigger.intData.length > 1) ? (trigger.intData[1] === 1) : false); + setRewardsLimit((trigger.intData.length > 2) ? trigger.intData[2] : 0); + setLimitationInterval((trigger.intData.length > 3) ? trigger.intData[3] : 0); + setLimitEnabled((trigger.intData.length > 3) ? trigger.intData[3] > 0 : false); + setRewards(readRewards); }, [ trigger ]); return ( - + - setLimitEnabled(event.target.checked)} /> - { LocalizeText('wiredfurni.params.prizelimit', ['amount'], [limitEnabled ? rewardsLimit.toString() : '']) } + setLimitEnabled(event.target.checked) } /> + { LocalizeText('wiredfurni.params.prizelimit', [ 'amount' ], [ limitEnabled ? rewardsLimit.toString() : '' ]) } { !limitEnabled && @@ -137,7 +126,7 @@ export const WiredActionGiveRewardView: FC<{}> = props =>
- setUniqueRewards(e.target.checked)} /> + setUniqueRewards(e.target.checked) } /> Unique rewards @@ -152,22 +141,22 @@ export const WiredActionGiveRewardView: FC<{}> = props =>
{ rewards && rewards.map((reward, index) => - { - return ( - - - updateReward(index, e.target.checked, reward.itemCode, reward.probability)} /> - Badge? - - updateReward(index, reward.isBadge, e.target.value, reward.probability) } placeholder="Item Code" /> - updateReward(index, reward.isBadge, reward.itemCode, Number(e.target.value)) } placeholder="Probability" /> - { (index > 0) && - } + { + return ( + + + updateReward(index, e.target.checked, reward.itemCode, reward.probability) } /> + Badge? - ) - }) } + updateReward(index, reward.isBadge, e.target.value, reward.probability) } placeholder="Item Code" /> + updateReward(index, reward.isBadge, reward.itemCode, Number(e.target.value)) } placeholder="Probability" /> + { (index > 0) && + } + + ) + }) } ); diff --git a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx b/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx index 1e5c2d38..43ab240a 100644 --- a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx @@ -1,12 +1,8 @@ -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionGiveScoreToPredefinedTeamView: FC<{}> = props => @@ -14,34 +10,28 @@ export const WiredActionGiveScoreToPredefinedTeamView: FC<{}> = props => const [ points, setPoints ] = useState(1); const [ time, setTime ] = useState(1); const [ selectedTeam, setSelectedTeam ] = useState(1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ points, time, selectedTeam ]); - }, [ points, time, selectedTeam, setIntParams ]); + const save = () => setIntParams([ points, time, selectedTeam ]); useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setPoints(trigger.intData[0]); - setTime(trigger.intData[1]); - setSelectedTeam(trigger.intData[2]); - } - else - { - setPoints(1); - setTime(1); - setSelectedTeam(1); - } - }); + setPoints(trigger.intData[0]); + setTime(trigger.intData[1]); + setSelectedTeam(trigger.intData[2]); + } + else + { + setPoints(1); + setTime(1); + setSelectedTeam(1); + } }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.setpoints', [ 'points' ], [ points.toString() ]) } = props => { LocalizeText('wiredfurni.params.team') } - { [1, 2, 3, 4].map(value => - { - return ( - - setSelectedTeam(value) } /> - { LocalizeText('wiredfurni.params.team.' + value) } - - ); - }) } + { [ 1, 2, 3, 4 ].map(value => + { + return ( + + setSelectedTeam(value) } /> + { LocalizeText('wiredfurni.params.team.' + value) } + + ); + }) } ); diff --git a/src/components/wired/views/actions/WiredActionGiveScoreView.tsx b/src/components/wired/views/actions/WiredActionGiveScoreView.tsx index b82f2d0c..28bfb0b2 100644 --- a/src/components/wired/views/actions/WiredActionGiveScoreView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveScoreView.tsx @@ -1,43 +1,34 @@ -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionGiveScoreView: FC<{}> = props => { const [ points, setPoints ] = useState(1); const [ time, setTime ] = useState(1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ points, time ]); - }, [ points, time, setIntParams ]); + const save = () => setIntParams([ points, time ]); useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setPoints(trigger.intData[0]); - setTime(trigger.intData[1]); - } - else - { - setPoints(1); - setTime(1); - } - }); + setPoints(trigger.intData[0]); + setTime(trigger.intData[1]); + } + else + { + setPoints(1); + setTime(1); + } }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.setpoints', [ 'points' ], [ points.toString() ]) } = props => { const [ selectedTeam, setSelectedTeam ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ selectedTeam ]); - }, [ selectedTeam, setIntParams ]); + const save = () => setIntParams([ selectedTeam ]); useEffect(() => { @@ -23,18 +17,18 @@ export const WiredActionJoinTeamView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.team') } - { [1, 2, 3, 4].map(team => - { - return ( - - setSelectedTeam(team) } /> - { LocalizeText(`wiredfurni.params.team.${ team }`) } - - ) - }) } + { [ 1, 2, 3, 4 ].map(team => + { + return ( + + setSelectedTeam(team) } /> + { LocalizeText(`wiredfurni.params.team.${ team }`) } + + ) + }) } ); diff --git a/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx b/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx index 25dc5b82..e16b6684 100644 --- a/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx +++ b/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx @@ -1,20 +1,15 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionKickFromRoomView: FC<{}> = props => { const [ message, setMessage ] = useState(''); - const { trigger = null, setStringParam = null } = useWiredContext(); + const { trigger = null, setStringParam = null } = useWired(); - const save = useCallback(() => - { - setStringParam(message); - }, [ message, setStringParam ]); + const save = () => setStringParam(message); useEffect(() => { @@ -22,7 +17,7 @@ export const WiredActionKickFromRoomView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.message') } setMessage(event.target.value) } maxLength={ 100 } /> diff --git a/src/components/wired/views/actions/WiredActionLayoutView.tsx b/src/components/wired/views/actions/WiredActionLayoutView.tsx new file mode 100644 index 00000000..f43666ab --- /dev/null +++ b/src/components/wired/views/actions/WiredActionLayoutView.tsx @@ -0,0 +1,85 @@ +import { WiredActionLayoutCode } from '../../../../api'; +import { WiredActionBotChangeFigureView } from './WiredActionBotChangeFigureView'; +import { WiredActionBotFollowAvatarView } from './WiredActionBotFollowAvatarView'; +import { WiredActionBotGiveHandItemView } from './WiredActionBotGiveHandItemView'; +import { WiredActionBotMoveView } from './WiredActionBotMoveView'; +import { WiredActionBotTalkToAvatarView } from './WiredActionBotTalkToAvatarView'; +import { WiredActionBotTalkView } from './WiredActionBotTalkView'; +import { WiredActionBotTeleportView } from './WiredActionBotTeleportView'; +import { WiredActionCallAnotherStackView } from './WiredActionCallAnotherStackView'; +import { WiredActionChaseView } from './WiredActionChaseView'; +import { WiredActionChatView } from './WiredActionChatView'; +import { WiredActionFleeView } from './WiredActionFleeView'; +import { WiredActionGiveRewardView } from './WiredActionGiveRewardView'; +import { WiredActionGiveScoreToPredefinedTeamView } from './WiredActionGiveScoreToPredefinedTeamView'; +import { WiredActionGiveScoreView } from './WiredActionGiveScoreView'; +import { WiredActionJoinTeamView } from './WiredActionJoinTeamView'; +import { WiredActionKickFromRoomView } from './WiredActionKickFromRoomView'; +import { WiredActionLeaveTeamView } from './WiredActionLeaveTeamView'; +import { WiredActionMoveAndRotateFurniView } from './WiredActionMoveAndRotateFurniView'; +import { WiredActionMoveFurniToView } from './WiredActionMoveFurniToView'; +import { WiredActionMoveFurniView } from './WiredActionMoveFurniView'; +import { WiredActionMuteUserView } from './WiredActionMuteUserView'; +import { WiredActionResetView } from './WiredActionResetView'; +import { WiredActionSetFurniStateToView } from './WiredActionSetFurniStateToView'; +import { WiredActionTeleportView } from './WiredActionTeleportView'; +import { WiredActionToggleFurniStateView } from './WiredActionToggleFurniStateView'; + +export const WiredActionLayoutView = (code: number) => +{ + switch(code) + { + case WiredActionLayoutCode.BOT_CHANGE_FIGURE: + return ; + case WiredActionLayoutCode.BOT_FOLLOW_AVATAR: + return ; + case WiredActionLayoutCode.BOT_GIVE_HAND_ITEM: + return ; + case WiredActionLayoutCode.BOT_MOVE: + return ; + case WiredActionLayoutCode.BOT_TALK: + return ; + case WiredActionLayoutCode.BOT_TALK_DIRECT_TO_AVTR: + return ; + case WiredActionLayoutCode.BOT_TELEPORT: + return ; + case WiredActionLayoutCode.CALL_ANOTHER_STACK: + return ; + case WiredActionLayoutCode.CHASE: + return ; + case WiredActionLayoutCode.CHAT: + return ; + case WiredActionLayoutCode.FLEE: + return ; + case WiredActionLayoutCode.GIVE_REWARD: + return ; + case WiredActionLayoutCode.GIVE_SCORE: + return ; + case WiredActionLayoutCode.GIVE_SCORE_TO_PREDEFINED_TEAM: + return ; + case WiredActionLayoutCode.JOIN_TEAM: + return ; + case WiredActionLayoutCode.KICK_FROM_ROOM: + return ; + case WiredActionLayoutCode.LEAVE_TEAM: + return ; + case WiredActionLayoutCode.MOVE_FURNI: + return ; + case WiredActionLayoutCode.MOVE_AND_ROTATE_FURNI: + return ; + case WiredActionLayoutCode.MOVE_FURNI_TO: + return ; + case WiredActionLayoutCode.MUTE_USER: + return ; + case WiredActionLayoutCode.RESET: + return ; + case WiredActionLayoutCode.SET_FURNI_STATE: + return ; + case WiredActionLayoutCode.TELEPORT: + return ; + case WiredActionLayoutCode.TOGGLE_FURNI_STATE: + return ; + } + + return null; +} diff --git a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx b/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx index 45e9be5f..eaa834ff 100644 --- a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionLeaveTeamView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx index 4b322d03..62801af8 100644 --- a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx @@ -1,11 +1,7 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; const directionOptions: { value: number, icon: string }[] = [ @@ -27,65 +23,59 @@ const directionOptions: { value: number, icon: string }[] = [ } ]; -const rotationOptions: number[] = [0, 1, 2, 3, 4, 5, 6]; +const rotationOptions: number[] = [ 0, 1, 2, 3, 4, 5, 6 ]; export const WiredActionMoveAndRotateFurniView: FC<{}> = props => { const [ movement, setMovement ] = useState(-1); const [ rotation, setRotation ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ movement, rotation ]); - }, [ movement, rotation, setIntParams ]); + const save = () => setIntParams([ movement, rotation ]); useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setMovement(trigger.intData[0]); - setRotation(trigger.intData[1]); - } - else - { - setMovement(-1); - setRotation(-1); - } - }); + setMovement(trigger.intData[0]); + setRotation(trigger.intData[1]); + } + else + { + setMovement(-1); + setRotation(-1); + } }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.startdir') } { directionOptions.map(option => - { - return ( - - setMovement(option.value) } /> - - - - - ) - }) } + { + return ( + + setMovement(option.value) } /> + + + + + ) + }) } { LocalizeText('wiredfurni.params.turn') } { rotationOptions.map(option => - { - return ( - - setRotation(option) } /> - { LocalizeText(`wiredfurni.params.turn.${ option }`) } - - ) - }) } + { + return ( + + setRotation(option) } /> + { LocalizeText(`wiredfurni.params.turn.${ option }`) } + + ) + }) } ); diff --git a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx index bea80976..56bdb6b4 100644 --- a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx @@ -1,12 +1,8 @@ -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; const directionOptions: { value: number, icon: string }[] = [ @@ -32,32 +28,26 @@ export const WiredActionMoveFurniToView: FC<{}> = props => { const [ spacing, setSpacing ] = useState(-1); const [ movement, setMovement ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ movement, spacing ]); - }, [ movement, spacing, setIntParams ]); + const save = () => setIntParams([ movement, spacing ]); useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setSpacing(trigger.intData[1]); - setMovement(trigger.intData[0]); - } - else - { - setSpacing(-1); - setMovement(-1); - } - }); + setSpacing(trigger.intData[1]); + setMovement(trigger.intData[0]); + } + else + { + setSpacing(-1); + setMovement(-1); + } }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.emptytiles', [ 'tiles' ], [ spacing.toString() ]) } = props => { LocalizeText('wiredfurni.params.startdir') } { directionOptions.map(value => - { - return ( - - setMovement(value.value) } /> - - - ) - }) } + { + return ( + + setMovement(value.value) } /> + + + ) + }) } diff --git a/src/components/wired/views/actions/WiredActionMoveFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniView.tsx index 8919d5f5..b5a08887 100644 --- a/src/components/wired/views/actions/WiredActionMoveFurniView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveFurniView.tsx @@ -1,11 +1,7 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; const directionOptions: { value: number, icon: string }[] = [ @@ -39,38 +35,32 @@ const directionOptions: { value: number, icon: string }[] = [ } ]; -const rotationOptions: number[] = [0, 1, 2, 3]; +const rotationOptions: number[] = [ 0, 1, 2, 3 ]; export const WiredActionMoveFurniView: FC<{}> = props => { const [ movement, setMovement ] = useState(-1); const [ rotation, setRotation ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ movement, rotation ]); - }, [ movement, rotation, setIntParams ]); + const save = () => setIntParams([ movement, rotation ]); useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setMovement(trigger.intData[0]); - setRotation(trigger.intData[1]); - } - else - { - setMovement(-1); - setRotation(-1); - } - }); + setMovement(trigger.intData[0]); + setRotation(trigger.intData[1]); + } + else + { + setMovement(-1); + setRotation(-1); + } }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.movefurni') } @@ -79,31 +69,31 @@ export const WiredActionMoveFurniView: FC<{}> = props => { directionOptions.map(option => - { - return ( - - setMovement(option.value) } /> - - - ) - }) } + { + return ( + + setMovement(option.value) } /> + + + ) + }) }
{ LocalizeText('wiredfurni.params.rotatefurni') } { rotationOptions.map(option => - { - return ( - - setRotation(option) } /> - - { [1, 2].includes(option) && } - { LocalizeText(`wiredfurni.params.rotatefurni.${ option }`) } - - - ) - }) } + { + return ( + + setRotation(option) } /> + + { [ 1, 2 ].includes(option) && } + { LocalizeText(`wiredfurni.params.rotatefurni.${ option }`) } + + + ) + }) } ); diff --git a/src/components/wired/views/actions/WiredActionMuteUserView.tsx b/src/components/wired/views/actions/WiredActionMuteUserView.tsx index ed087d7d..e34bd60a 100644 --- a/src/components/wired/views/actions/WiredActionMuteUserView.tsx +++ b/src/components/wired/views/actions/WiredActionMuteUserView.tsx @@ -1,41 +1,32 @@ -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionMuteUserView: FC<{}> = props => { const [ time, setTime ] = useState(-1); const [ message, setMessage ] = useState(''); - const { trigger = null, setIntParams = null, setStringParam = null } = useWiredContext(); + const { trigger = null, setIntParams = null, setStringParam = null } = useWired(); - const save = useCallback(() => + const save = () => { - BatchUpdates(() => - { - setIntParams([ time ]); - setStringParam(message); - }); - }, [ time, message, setIntParams, setStringParam ]); + setIntParams([ time ]); + setStringParam(message); + } useEffect(() => { - BatchUpdates(() => - { - setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); - setMessage(trigger.stringData); - }); + setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setMessage(trigger.stringData); }, [ trigger ]); return ( - + - { LocalizeText('wiredfurni.params.length.minutes', ['minutes'], [ time.toString() ]) } + { LocalizeText('wiredfurni.params.length.minutes', [ 'minutes' ], [ time.toString() ]) } = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx index 3b334784..587254c8 100644 --- a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx +++ b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx @@ -1,49 +1,39 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionSetFurniStateToView: FC<{}> = props => { - const [ stateFlag, setStateFlag ] = useState(-1); - const [ directionFlag, setDirectionFlag ] = useState(-1); - const [ positionFlag, setPositionFlag ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const [ stateFlag, setStateFlag ] = useState(0); + const [ directionFlag, setDirectionFlag ] = useState(0); + const [ positionFlag, setPositionFlag ] = useState(0); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ stateFlag, directionFlag, positionFlag ]); - }, [ directionFlag, positionFlag, stateFlag, setIntParams ]); + const save = () => setIntParams([ stateFlag, directionFlag, positionFlag ]); useEffect(() => { - BatchUpdates(() => - { - setStateFlag(trigger.getBoolean(0) ? 1 : 0); - setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); - setPositionFlag(trigger.getBoolean(2) ? 1 : 0); - }); + setStateFlag(trigger.getBoolean(0) ? 1 : 0); + setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); + setPositionFlag(trigger.getBoolean(2) ? 1 : 0); }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.conditions') } - setStateFlag(event.target.checked ? 1 : 0) } /> + setStateFlag(event.target.checked ? 1 : 0) } /> { LocalizeText('wiredfurni.params.condition.state') } - setDirectionFlag(event.target.checked ? 1 : 0) } /> + setDirectionFlag(event.target.checked ? 1 : 0) } /> { LocalizeText('wiredfurni.params.condition.direction') } - setPositionFlag(event.target.checked ? 1 : 0) } /> + setPositionFlag(event.target.checked ? 1 : 0) } /> { LocalizeText('wiredfurni.params.condition.position') } diff --git a/src/components/wired/views/actions/WiredActionTeleportView.tsx b/src/components/wired/views/actions/WiredActionTeleportView.tsx index 3ab7b330..652da616 100644 --- a/src/components/wired/views/actions/WiredActionTeleportView.tsx +++ b/src/components/wired/views/actions/WiredActionTeleportView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionTeleportView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx b/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx index 93a26197..37b5d2e2 100644 --- a/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx +++ b/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionToggleFurniStateView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx b/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx index 57574db0..24e89ed1 100644 --- a/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx @@ -1,9 +1,7 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; const ALLOWED_HAND_ITEM_IDS: number[] = [ 2, 5, 7, 8, 9, 10, 27 ]; @@ -11,12 +9,9 @@ const ALLOWED_HAND_ITEM_IDS: number[] = [ 2, 5, 7, 8, 9, 10, 27 ]; export const WiredConditionActorHasHandItemView: FC<{}> = props => { const [ handItemId, setHandItemId ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ handItemId ]); - }, [ handItemId, setIntParams ]); + const save = () => setIntParams([ handItemId ]); useEffect(() => { @@ -24,14 +19,14 @@ export const WiredConditionActorHasHandItemView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.handitem') } diff --git a/src/components/wired/views/conditions/WiredConditionActorIsGroupMemberView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsGroupMemberView.tsx index 8e5e59c2..e278eabe 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsGroupMemberView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsGroupMemberView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionActorIsGroupMemberView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/conditions/WiredConditionActorIsOnFurniView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsOnFurniView.tsx index 5bdac45e..10cddf56 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsOnFurniView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsOnFurniView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionActorIsOnFurniView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx index ab079ff8..20db3ac3 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx @@ -1,10 +1,7 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; const teamIds: number[] = [ 1, 2, 3, 4 ]; @@ -12,12 +9,9 @@ const teamIds: number[] = [ 1, 2, 3, 4 ]; export const WiredConditionActorIsTeamMemberView: FC<{}> = props => { const [ selectedTeam, setSelectedTeam ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ selectedTeam ]); - }, [ selectedTeam, setIntParams ]); + const save = () => setIntParams([ selectedTeam ]); useEffect(() => { @@ -25,18 +19,18 @@ export const WiredConditionActorIsTeamMemberView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.team') } { teamIds.map(value => - { - return ( - - setSelectedTeam(value) } /> - { LocalizeText(`wiredfurni.params.team.${ value }`) } - - ) - }) } + { + return ( + + setSelectedTeam(value) } /> + { LocalizeText(`wiredfurni.params.team.${ value }`) } + + ) + }) } ); diff --git a/src/components/wired/views/conditions/WiredConditionActorIsWearingBadgeView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsWearingBadgeView.tsx index e0566ec3..01e6d3b1 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsWearingBadgeView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsWearingBadgeView.tsx @@ -1,20 +1,15 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionActorIsWearingBadgeView: FC<{}> = props => { const [ badge, setBadge ] = useState(''); - const { trigger = null, setStringParam = null } = useWiredContext(); + const { trigger = null, setStringParam = null } = useWired(); - const save = useCallback(() => - { - setStringParam(badge); - }, [ badge, setStringParam ]); + const save = () => setStringParam(badge); useEffect(() => { @@ -22,7 +17,7 @@ export const WiredConditionActorIsWearingBadgeView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.badgecode') } setBadge(event.target.value) } /> diff --git a/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx index c3b48361..0909018e 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx @@ -1,20 +1,15 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionActorIsWearingEffectView: FC<{}> = props => { const [ effect, setEffect ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ effect ]); - }, [ effect, setIntParams ]); + const save = () => setIntParams([ effect ]); useEffect(() => { @@ -22,7 +17,7 @@ export const WiredConditionActorIsWearingEffectView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.effectid') } setEffect(parseInt(event.target.value)) } /> diff --git a/src/components/wired/views/conditions/WiredConditionBaseView.tsx b/src/components/wired/views/conditions/WiredConditionBaseView.tsx index f2c6edfa..fc492150 100644 --- a/src/components/wired/views/conditions/WiredConditionBaseView.tsx +++ b/src/components/wired/views/conditions/WiredConditionBaseView.tsx @@ -1,24 +1,22 @@ -import { FC, useCallback } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { FC, PropsWithChildren } from 'react'; +import { WiredFurniType } from '../../../../api'; import { WiredBaseView } from '../WiredBaseView'; export interface WiredConditionBaseViewProps { + hasSpecialInput: boolean; requiresFurni: number; save: () => void; } -export const WiredConditionBaseView: FC = props => +export const WiredConditionBaseView: FC> = props => { - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, children = null } = props; + const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; - const onSave = useCallback(() => - { - if(save) save(); - }, [ save ]); + const onSave = () => (save && save()); return ( - + { children } ); diff --git a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx b/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx index 4d613d7a..36832e11 100644 --- a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx +++ b/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx @@ -1,24 +1,16 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredDateToString, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionDateRangeView: FC<{}> = props => { const [ startDate, setStartDate ] = useState(''); const [ endDate, setEndDate ] = useState(''); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const dateToString = useCallback((date: Date) => - { - return `${date.getFullYear()}/${('0' + (date.getMonth() + 1)).slice(-2)}/${('0' + date.getDate()).slice(-2)}${('0' + date.getHours()).slice(-2)}:${('0' + date.getMinutes()).slice(-2)}`; - }, []); - - const save = useCallback(() => + const save = () => { let startDateMili = 0; let endDateMili = 0; @@ -32,8 +24,8 @@ export const WiredConditionDateRangeView: FC<{}> = props => endDateMili = endDateInstance.getTime() / 1000; } - setIntParams([startDateMili, endDateMili]); - }, [ startDate, endDate, setIntParams ]); + setIntParams([ startDateMili, endDateMili ]); + } useEffect(() => { @@ -46,16 +38,13 @@ export const WiredConditionDateRangeView: FC<{}> = props => if(trigger.intData[1] > 0) endDate = new Date((trigger.intData[1] * 1000)); - BatchUpdates(() => - { - setStartDate(dateToString(startDate)); - setEndDate(dateToString(endDate)); - }); + setStartDate(WiredDateToString(startDate)); + setEndDate(WiredDateToString(endDate)); } - }, [ trigger, dateToString ]); + }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.startdate') } setStartDate(e.target.value) } /> diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx index 4a79952a..aa3ba141 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionFurniHasAvatarOnView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx index 5fab235a..1a9d0ef6 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx @@ -1,21 +1,15 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionFurniHasFurniOnView: FC<{}> = props => { const [ requireAll, setRequireAll ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ requireAll ]); - }, [ requireAll, setIntParams ]); + const save = () => setIntParams([ requireAll ]); useEffect(() => { @@ -23,18 +17,18 @@ export const WiredConditionFurniHasFurniOnView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.requireall') } - { [0, 1].map(value => - { - return ( - - setRequireAll(value) } /> - { LocalizeText('wiredfurni.params.requireall.' + value) } - - ) - }) } + { [ 0, 1 ].map(value => + { + return ( + + setRequireAll(value) } /> + { LocalizeText('wiredfurni.params.requireall.' + value) } + + ) + }) } ); diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx index 1e9d8efe..031ec08f 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx @@ -1,21 +1,15 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionFurniHasNotFurniOnView: FC<{}> = props => { const [ requireAll, setRequireAll ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ requireAll ]); - }, [ requireAll, setIntParams ]); + const save = () => setIntParams([ requireAll ]); useEffect(() => { @@ -23,18 +17,18 @@ export const WiredConditionFurniHasNotFurniOnView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.not_requireall') } - { [0, 1].map(value => - { - return ( - - setRequireAll(value) } /> - { LocalizeText(`wiredfurni.params.not_requireall.${ value }`) } - - ) - }) } + { [ 0, 1 ].map(value => + { + return ( + + setRequireAll(value) } /> + { LocalizeText(`wiredfurni.params.not_requireall.${ value }`) } + + ) + }) } ); diff --git a/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx b/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx index 47d97cca..2b0ddf4d 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionFurniIsOfTypeView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx b/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx index 2924cc60..47a555e5 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx @@ -1,49 +1,39 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionFurniMatchesSnapshotView: FC<{}> = props => { - const [ stateFlag, setStateFlag ] = useState(-1); - const [ directionFlag, setDirectionFlag ] = useState(-1); - const [ positionFlag, setPositionFlag ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const [ stateFlag, setStateFlag ] = useState(0); + const [ directionFlag, setDirectionFlag ] = useState(0); + const [ positionFlag, setPositionFlag ] = useState(0); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ stateFlag, directionFlag, positionFlag ]); - }, [ directionFlag, positionFlag, stateFlag, setIntParams ]); + const save = () => setIntParams([ stateFlag, directionFlag, positionFlag ]); useEffect(() => { - BatchUpdates(() => - { - setStateFlag(trigger.getBoolean(0) ? 1 : 0); - setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); - setPositionFlag(trigger.getBoolean(2) ? 1 : 0); - }); + setStateFlag(trigger.getBoolean(0) ? 1 : 0); + setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); + setPositionFlag(trigger.getBoolean(2) ? 1 : 0); }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.conditions') } - setStateFlag(event.target.checked ? 1 : 0) } /> + setStateFlag(event.target.checked ? 1 : 0) } /> { LocalizeText('wiredfurni.params.condition.state') } - setDirectionFlag(event.target.checked ? 1 : 0) } /> + setDirectionFlag(event.target.checked ? 1 : 0) } /> { LocalizeText('wiredfurni.params.condition.direction') } - setPositionFlag(event.target.checked ? 1 : 0) } /> + setPositionFlag(event.target.checked ? 1 : 0) } /> { LocalizeText('wiredfurni.params.condition.position') } diff --git a/src/components/wired/common/GetWiredConditionLayout.tsx b/src/components/wired/views/conditions/WiredConditionLayoutView.tsx similarity index 56% rename from src/components/wired/common/GetWiredConditionLayout.tsx rename to src/components/wired/views/conditions/WiredConditionLayoutView.tsx index 71dcd62c..c7c49b2a 100644 --- a/src/components/wired/common/GetWiredConditionLayout.tsx +++ b/src/components/wired/views/conditions/WiredConditionLayoutView.tsx @@ -1,21 +1,21 @@ -import { WiredConditionActorHasHandItemView } from '../views/conditions/WiredConditionActorHasHandItem'; -import { WiredConditionActorIsGroupMemberView } from '../views/conditions/WiredConditionActorIsGroupMemberView'; -import { WiredConditionActorIsOnFurniView } from '../views/conditions/WiredConditionActorIsOnFurniView'; -import { WiredConditionActorIsTeamMemberView } from '../views/conditions/WiredConditionActorIsTeamMemberView'; -import { WiredConditionActorIsWearingBadgeView } from '../views/conditions/WiredConditionActorIsWearingBadgeView'; -import { WiredConditionActorIsWearingEffectView } from '../views/conditions/WiredConditionActorIsWearingEffectView'; -import { WiredConditionDateRangeView } from '../views/conditions/WiredConditionDateRangeView'; -import { WiredConditionFurniHasAvatarOnView } from '../views/conditions/WiredConditionFurniHasAvatarOnView'; -import { WiredConditionFurniHasFurniOnView } from '../views/conditions/WiredConditionFurniHasFurniOnView'; -import { WiredConditionFurniHasNotFurniOnView } from '../views/conditions/WiredConditionFurniHasNotFurniOnView'; -import { WiredConditionFurniIsOfTypeView } from '../views/conditions/WiredConditionFurniIsOfTypeView'; -import { WiredConditionFurniMatchesSnapshotView } from '../views/conditions/WiredConditionFurniMatchesSnapshotView'; -import { WiredConditionTimeElapsedLessView } from '../views/conditions/WiredConditionTimeElapsedLessView'; -import { WiredConditionTimeElapsedMoreView } from '../views/conditions/WiredConditionTimeElapsedMoreView'; -import { WiredConditionUserCountInRoomView } from '../views/conditions/WiredConditionUserCountInRoomView'; -import { WiredConditionlayout } from './WiredConditionLayoutCode'; +import { WiredConditionlayout } from '../../../../api'; +import { WiredConditionActorHasHandItemView } from './WiredConditionActorHasHandItem'; +import { WiredConditionActorIsGroupMemberView } from './WiredConditionActorIsGroupMemberView'; +import { WiredConditionActorIsOnFurniView } from './WiredConditionActorIsOnFurniView'; +import { WiredConditionActorIsTeamMemberView } from './WiredConditionActorIsTeamMemberView'; +import { WiredConditionActorIsWearingBadgeView } from './WiredConditionActorIsWearingBadgeView'; +import { WiredConditionActorIsWearingEffectView } from './WiredConditionActorIsWearingEffectView'; +import { WiredConditionDateRangeView } from './WiredConditionDateRangeView'; +import { WiredConditionFurniHasAvatarOnView } from './WiredConditionFurniHasAvatarOnView'; +import { WiredConditionFurniHasFurniOnView } from './WiredConditionFurniHasFurniOnView'; +import { WiredConditionFurniHasNotFurniOnView } from './WiredConditionFurniHasNotFurniOnView'; +import { WiredConditionFurniIsOfTypeView } from './WiredConditionFurniIsOfTypeView'; +import { WiredConditionFurniMatchesSnapshotView } from './WiredConditionFurniMatchesSnapshotView'; +import { WiredConditionTimeElapsedLessView } from './WiredConditionTimeElapsedLessView'; +import { WiredConditionTimeElapsedMoreView } from './WiredConditionTimeElapsedMoreView'; +import { WiredConditionUserCountInRoomView } from './WiredConditionUserCountInRoomView'; -export const GetWiredConditionLayout = (code: number) => +export const WiredConditionLayoutView = (code: number) => { switch(code) { diff --git a/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx b/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx index bbe084b1..31d6d79c 100644 --- a/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx +++ b/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx @@ -1,22 +1,16 @@ -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { GetWiredTimeLocale } from '../../common/GetWiredTimeLocale'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionTimeElapsedLessView: FC<{}> = props => { const [ time, setTime ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ time ]); - }, [ time, setIntParams ]); + const save = () => setIntParams([ time ]); useEffect(() => { @@ -24,7 +18,7 @@ export const WiredConditionTimeElapsedLessView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.allowbefore', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } = props => { const [ time, setTime ] = useState(-1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ time ]); - }, [ time, setIntParams ]); + const save = () => setIntParams([ time ]); useEffect(() => { @@ -24,7 +18,7 @@ export const WiredConditionTimeElapsedMoreView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.allowafter', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } = props => { const [ min, setMin ] = useState(1); const [ max, setMax ] = useState(1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ min, max ]); - }, [ min, max, setIntParams ]); + const save = () => setIntParams([ min, max ]); useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setMin(trigger.intData[0]); - setMax(trigger.intData[1]); - } - else - { - setMin(1); - setMax(1); - } - }); + setMin(trigger.intData[0]); + setMax(trigger.intData[1]); + } + else + { + setMin(1); + setMax(1); + } }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.usercountmin', [ 'value' ], [ min.toString() ]) } = props => { const [ username, setUsername ] = useState(''); const [ avatarMode, setAvatarMode ] = useState(0); - const { trigger = null, setStringParam = null } = useWiredContext(); + const { trigger = null, setStringParam = null } = useWired(); - const save = useCallback(() => - { - if(avatarMode === 1) setStringParam(username); - else setStringParam(''); - }, [ username, avatarMode, setStringParam ]); + const save = () => setStringParam((avatarMode === 1) ? username : ''); useEffect(() => { - BatchUpdates(() => - { - setUsername(trigger.stringData); - setAvatarMode(trigger.stringData ? 1 : 0); - }); + setUsername(trigger.stringData); + setAvatarMode(trigger.stringData ? 1 : 0); }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.picktriggerer') } diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx index edc55a50..d8bc6210 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx @@ -1,39 +1,29 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { GetSessionDataManager, LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Flex } from '../../../../common/Flex'; -import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { GetSessionDataManager, LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerAvatarSaysSomethingView: FC<{}> = props => { const [ message, setMessage ] = useState(''); const [ triggererAvatar, setTriggererAvatar ] = useState(-1); - const { trigger = null, setStringParam = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - const save = useCallback(() => + const save = () => { - BatchUpdates(() => - { - setStringParam(message); - setIntParams([ triggererAvatar ]); - }); - }, [ message, triggererAvatar, setStringParam, setIntParams ]); + setStringParam(message); + setIntParams([ triggererAvatar ]); + } useEffect(() => { - BatchUpdates(() => - { - setMessage(trigger.stringData); - setTriggererAvatar((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }); + setMessage(trigger.stringData); + setTriggererAvatar((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.whatissaid') } setMessage(event.target.value) } /> diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx index a436cee7..0b98a566 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerAvatarWalksOffFurniView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx index 4644babf..25572e7c 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerAvatarWalksOnFurniView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/triggers/WiredTriggerBaseView.tsx b/src/components/wired/views/triggers/WiredTriggerBaseView.tsx index 47b5f669..f8f15759 100644 --- a/src/components/wired/views/triggers/WiredTriggerBaseView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerBaseView.tsx @@ -1,24 +1,22 @@ -import { FC, useCallback } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { FC, PropsWithChildren } from 'react'; +import { WiredFurniType } from '../../../../api'; import { WiredBaseView } from '../WiredBaseView'; export interface WiredTriggerBaseViewProps { + hasSpecialInput: boolean; requiresFurni: number; save: () => void; } -export const WiredTriggerBaseView: FC = props => +export const WiredTriggerBaseView: FC> = props => { - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, children = null } = props; + const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; - const onSave = useCallback(() => - { - if(save) save(); - }, [ save ]); + const onSave = () => (save && save()); return ( - + { children } ); diff --git a/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx b/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx index 9ff1a0e5..6984dc6d 100644 --- a/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx @@ -1,20 +1,15 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerBotReachedAvatarView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWiredContext(); + const { trigger = null, setStringParam = null } = useWired(); - const save = useCallback(() => - { - setStringParam(botName); - }, [ botName, setStringParam ]); + const save = () => setStringParam(botName); useEffect(() => { @@ -22,7 +17,7 @@ export const WiredTriggerBotReachedAvatarView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx b/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx index 909afe6f..9cde1737 100644 --- a/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx @@ -1,20 +1,15 @@ -import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerBotReachedStuffView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWiredContext(); + const { trigger = null, setStringParam = null } = useWired(); - const save = useCallback(() => - { - setStringParam(botName); - }, [ botName, setStringParam ]); + const save = () => setStringParam(botName); useEffect(() => { @@ -22,7 +17,7 @@ export const WiredTriggerBotReachedStuffView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx b/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx index 2f7cb067..be23a6b1 100644 --- a/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerCollisionView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx b/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx index 22b6ae22..ea3d61bf 100644 --- a/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx @@ -1,22 +1,16 @@ -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { GetWiredTimeLocale } from '../../common/GetWiredTimeLocale'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggeExecuteOnceView: FC<{}> = props => { const [ time, setTime ] = useState(1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ time ]); - }, [ time, setIntParams ]); + const save = () => setIntParams([ time ]); useEffect(() => { @@ -24,7 +18,7 @@ export const WiredTriggeExecuteOnceView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.settime', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } = props => { const [ time, setTime ] = useState(1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ time ]); - }, [ time, setIntParams ]); + const save = () => setIntParams([ time ]); useEffect(() => { @@ -24,7 +19,7 @@ export const WiredTriggeExecutePeriodicallyLongView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.setlongtime', [ 'time' ], [ FriendlyTime.format(time * 5).toString() ]) } = props => { const [ time, setTime ] = useState(1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ time ]); - }, [ time, setIntParams ]); + const save = () => setIntParams([ time ]); useEffect(() => { @@ -24,7 +18,7 @@ export const WiredTriggeExecutePeriodicallyView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.settime', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } = props => { - return ; + return ; } diff --git a/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx b/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx index 57650fa8..6e43a2ce 100644 --- a/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx @@ -1,8 +1,8 @@ import { FC } from 'react'; -import { WiredFurniType } from '../../common/WiredFurniType'; +import { WiredFurniType } from '../../../../api'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerGameStartsView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/common/GetWiredTriggerLayout.tsx b/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx similarity index 50% rename from src/components/wired/common/GetWiredTriggerLayout.tsx rename to src/components/wired/views/triggers/WiredTriggerLayoutView.tsx index c6c9b452..e45b2eac 100644 --- a/src/components/wired/common/GetWiredTriggerLayout.tsx +++ b/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx @@ -1,20 +1,20 @@ -import { WiredTriggerAvatarEnterRoomView } from '../views/triggers/WiredTriggerAvatarEnterRoomView'; -import { WiredTriggerAvatarSaysSomethingView } from '../views/triggers/WiredTriggerAvatarSaysSomethingView'; -import { WiredTriggerAvatarWalksOffFurniView } from '../views/triggers/WiredTriggerAvatarWalksOffFurniView'; -import { WiredTriggerAvatarWalksOnFurniView } from '../views/triggers/WiredTriggerAvatarWalksOnFurni'; -import { WiredTriggerBotReachedAvatarView } from '../views/triggers/WiredTriggerBotReachedAvatarView'; -import { WiredTriggerBotReachedStuffView } from '../views/triggers/WiredTriggerBotReachedStuffView'; -import { WiredTriggerCollisionView } from '../views/triggers/WiredTriggerCollisionView'; -import { WiredTriggeExecuteOnceView } from '../views/triggers/WiredTriggerExecuteOnceView'; -import { WiredTriggeExecutePeriodicallyLongView } from '../views/triggers/WiredTriggerExecutePeriodicallyLongView'; -import { WiredTriggeExecutePeriodicallyView } from '../views/triggers/WiredTriggerExecutePeriodicallyView'; -import { WiredTriggerGameEndsView } from '../views/triggers/WiredTriggerGameEndsView'; -import { WiredTriggerGameStartsView } from '../views/triggers/WiredTriggerGameStartsView'; -import { WiredTriggeScoreAchievedView } from '../views/triggers/WiredTriggerScoreAchievedView'; -import { WiredTriggerToggleFurniView } from '../views/triggers/WiredTriggerToggleFurniView'; -import { WiredTriggerLayout } from './WiredTriggerLayoutCode'; +import { WiredTriggerLayout } from '../../../../api'; +import { WiredTriggerAvatarEnterRoomView } from './WiredTriggerAvatarEnterRoomView'; +import { WiredTriggerAvatarSaysSomethingView } from './WiredTriggerAvatarSaysSomethingView'; +import { WiredTriggerAvatarWalksOffFurniView } from './WiredTriggerAvatarWalksOffFurniView'; +import { WiredTriggerAvatarWalksOnFurniView } from './WiredTriggerAvatarWalksOnFurni'; +import { WiredTriggerBotReachedAvatarView } from './WiredTriggerBotReachedAvatarView'; +import { WiredTriggerBotReachedStuffView } from './WiredTriggerBotReachedStuffView'; +import { WiredTriggerCollisionView } from './WiredTriggerCollisionView'; +import { WiredTriggeExecuteOnceView } from './WiredTriggerExecuteOnceView'; +import { WiredTriggeExecutePeriodicallyLongView } from './WiredTriggerExecutePeriodicallyLongView'; +import { WiredTriggeExecutePeriodicallyView } from './WiredTriggerExecutePeriodicallyView'; +import { WiredTriggerGameEndsView } from './WiredTriggerGameEndsView'; +import { WiredTriggerGameStartsView } from './WiredTriggerGameStartsView'; +import { WiredTriggeScoreAchievedView } from './WiredTriggerScoreAchievedView'; +import { WiredTriggerToggleFurniView } from './WiredTriggerToggleFurniView'; -export const GetWiredTriggerLayout = (code: number) => +export const WiredTriggerLayoutView = (code: number) => { switch(code) { diff --git a/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx b/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx index f4043937..883503b8 100644 --- a/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx @@ -1,21 +1,16 @@ -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; -import { LocalizeText } from '../../../../api'; -import { Column } from '../../../../common/Column'; -import { Text } from '../../../../common/Text'; -import { WiredFurniType } from '../../common/WiredFurniType'; -import { useWiredContext } from '../../context/WiredContext'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Text } from '../../../../common'; +import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggeScoreAchievedView: FC<{}> = props => { const [ points, setPoints ] = useState(1); - const { trigger = null, setIntParams = null } = useWiredContext(); + const { trigger = null, setIntParams = null } = useWired(); - const save = useCallback(() => - { - setIntParams([ points ]); - }, [ points, setIntParams ]); + const save = () => setIntParams([ points ]); useEffect(() => { @@ -23,7 +18,7 @@ export const WiredTriggeScoreAchievedView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.setscore', [ 'points' ], [ points.toString() ]) } = props => { - return ; + return ; } diff --git a/src/events/achievements/AchievementsUIEvent.ts b/src/events/achievements/AchievementsUIEvent.ts deleted file mode 100644 index 7854bf28..00000000 --- a/src/events/achievements/AchievementsUIEvent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class AchievementsUIEvent extends NitroEvent -{ - public static SHOW_ACHIEVEMENTS: string = 'AE_SHOW_ACHIEVEMENTS'; - public static HIDE_ACHIEVEMENTS: string = 'AE_HIDE_ACHIEVEMENTS'; - public static TOGGLE_ACHIEVEMENTS: string = 'AE_TOGGLE_ACHIEVEMENTS'; -} diff --git a/src/events/achievements/AchievementsUIUnseenCountEvent.ts b/src/events/achievements/AchievementsUIUnseenCountEvent.ts deleted file mode 100644 index 330e991c..00000000 --- a/src/events/achievements/AchievementsUIUnseenCountEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class AchievementsUIUnseenCountEvent extends NitroEvent -{ - public static UNSEEN_COUNT: string = 'AUUCE_UNSEEN_COUNT'; - - private _count: number; - - constructor(count: number) - { - super(AchievementsUIUnseenCountEvent.UNSEEN_COUNT); - - this._count = count; - } - - public get count(): number - { - return this._count; - } -} diff --git a/src/events/achievements/index.ts b/src/events/achievements/index.ts deleted file mode 100644 index a8c548f4..00000000 --- a/src/events/achievements/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './AchievementsUIEvent'; -export * from './AchievementsUIUnseenCountEvent'; diff --git a/src/events/catalog/CatalogEvent.ts b/src/events/catalog/CatalogEvent.ts index 58ef7b7b..893775a5 100644 --- a/src/events/catalog/CatalogEvent.ts +++ b/src/events/catalog/CatalogEvent.ts @@ -7,7 +7,6 @@ export class CatalogEvent extends NitroEvent public static TOGGLE_CATALOG: string = 'CE_TOGGLE_CATALOG'; public static SOLD_OUT: string = 'CE_SOLD_OUT'; public static APPROVE_NAME_RESULT: string = 'CE_APPROVE_NAME_RESULT'; - public static GIFT_RECEIVER_NOT_FOUND: string = 'CE_GIFT_RECEIVER_NOT_FOUND'; public static PURCHASE_APPROVED: string = 'CE_PURCHASE_APPROVED'; public static INIT_GIFT: string = 'CE_INIT_GIFT'; public static CATALOG_RESET: string = 'CE_RESET'; diff --git a/src/events/catalog/CatalogGiftReceiverNotFoundEvent.ts b/src/events/catalog/CatalogGiftReceiverNotFoundEvent.ts deleted file mode 100644 index 611eaff7..00000000 --- a/src/events/catalog/CatalogGiftReceiverNotFoundEvent.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { CatalogEvent } from './CatalogEvent'; - -export class CatalogGiftReceiverNotFoundEvent extends CatalogEvent -{ - constructor() - { - super(CatalogEvent.GIFT_RECEIVER_NOT_FOUND); - } -} diff --git a/src/events/catalog/CatalogInitPurchaseEvent.ts b/src/events/catalog/CatalogInitPurchaseEvent.ts deleted file mode 100644 index 2b2661fa..00000000 --- a/src/events/catalog/CatalogInitPurchaseEvent.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { CatalogWidgetEvent } from './CatalogWidgetEvent'; - -export class CatalogInitPurchaseEvent extends NitroEvent -{ - private _enableBuyAsGift: boolean = true; - private _userName: string; - - constructor(enableBuyAsGift: boolean = true, userName: string = null) - { - super(CatalogWidgetEvent.INIT_PURCHASE); - - this._enableBuyAsGift = enableBuyAsGift; - this._userName = userName; - } - - public get enableBuyAsGift(): boolean - { - return this._enableBuyAsGift; - } - - public get userName(): string - { - return this._userName; - } -} diff --git a/src/events/catalog/CatalogNameResultEvent.ts b/src/events/catalog/CatalogNameResultEvent.ts deleted file mode 100644 index 70e4c0ec..00000000 --- a/src/events/catalog/CatalogNameResultEvent.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { CatalogWidgetEvent } from './CatalogWidgetEvent'; - -export class CatalogNameResultEvent extends NitroEvent -{ - private _result: number; - private _validationInfo: string; - - constructor(result: number, validationInfo: string) - { - super(CatalogWidgetEvent.APPROVE_RESULT); - - this._result = result; - this._validationInfo = validationInfo; - } - - public get result(): number - { - return this._result; - } - - public get validationInfo(): string - { - return this._validationInfo; - } -} diff --git a/src/events/catalog/CatalogPostMarketplaceOfferEvent.ts b/src/events/catalog/CatalogPostMarketplaceOfferEvent.ts index 75e7abea..d54c6c45 100644 --- a/src/events/catalog/CatalogPostMarketplaceOfferEvent.ts +++ b/src/events/catalog/CatalogPostMarketplaceOfferEvent.ts @@ -1,5 +1,5 @@ import { CatalogEvent } from '.'; -import { FurnitureItem } from '../../components/inventory/common/FurnitureItem'; +import { FurnitureItem } from '../../api'; export class CatalogPostMarketplaceOfferEvent extends CatalogEvent { diff --git a/src/events/catalog/CatalogSetExtraPurchaseParameterEvent.ts b/src/events/catalog/CatalogSetExtraPurchaseParameterEvent.ts deleted file mode 100644 index d7f9ca8d..00000000 --- a/src/events/catalog/CatalogSetExtraPurchaseParameterEvent.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { CatalogWidgetEvent } from './CatalogWidgetEvent'; - -export class CatalogSetExtraPurchaseParameterEvent extends NitroEvent -{ - private _parameter: string; - - constructor(parameter: string) - { - super(CatalogWidgetEvent.SET_EXTRA_PARM); - - this._parameter = parameter; - } - - public get parameter(): string - { - return this._parameter; - } -} diff --git a/src/events/catalog/CatalogWidgetEvent.ts b/src/events/catalog/CatalogWidgetEvent.ts index 57df2d7b..fd0e6026 100644 --- a/src/events/catalog/CatalogWidgetEvent.ts +++ b/src/events/catalog/CatalogWidgetEvent.ts @@ -11,10 +11,8 @@ export class CatalogWidgetEvent extends NitroEvent public static COLOUR_INDEX: string = 'CWE_COLOUR_INDEX'; public static TEXT_INPUT: string = 'CWE_TEXT_INPUT'; public static DROPMENU_SELECT: string = 'CWE_CWE_DROPMENU_SELECT'; - public static APPROVE_RESULT: string = 'CWE_CWE_APPROVE_RESULT'; public static PURCHASE_OVERRIDE: string = 'CWE_PURCHASE_OVERRIDE'; public static SELLABLE_PET_PALETTES: string = 'CWE_SELLABLE_PET_PALETTES'; - public static INIT_PURCHASE: string = 'CWE_INIT_PURCHASE'; public static UPDATE_ROOM_PREVIEW: string = 'CWE_UPDATE_ROOM_PREVIEW'; public static GUILD_SELECTED: string = 'CWE_GUILD_SELECTED'; public static TOTAL_PRICE_WIDGET_INITIALIZED: string = 'CWE_TOTAL_PRICE_WIDGET_INITIALIZED'; diff --git a/src/events/catalog/SetRoomPreviewerStuffDataEvent.ts b/src/events/catalog/SetRoomPreviewerStuffDataEvent.ts index 03e11862..5332dfd9 100644 --- a/src/events/catalog/SetRoomPreviewerStuffDataEvent.ts +++ b/src/events/catalog/SetRoomPreviewerStuffDataEvent.ts @@ -1,5 +1,5 @@ import { IObjectData, NitroEvent } from '@nitrots/nitro-renderer'; -import { IPurchasableOffer } from '../../components/catalog/common/IPurchasableOffer'; +import { IPurchasableOffer } from '../../api'; export class SetRoomPreviewerStuffDataEvent extends NitroEvent { diff --git a/src/events/catalog/index.ts b/src/events/catalog/index.ts index ff38a456..a7c15725 100644 --- a/src/events/catalog/index.ts +++ b/src/events/catalog/index.ts @@ -1,15 +1,11 @@ export * from './CatalogEvent'; -export * from './CatalogGiftReceiverNotFoundEvent'; export * from './CatalogInitGiftEvent'; -export * from './CatalogInitPurchaseEvent'; -export * from './CatalogNameResultEvent'; export * from './CatalogPostMarketplaceOfferEvent'; export * from './CatalogPurchasedEvent'; export * from './CatalogPurchaseFailureEvent'; export * from './CatalogPurchaseNotAllowedEvent'; export * from './CatalogPurchaseOverrideEvent'; export * from './CatalogPurchaseSoldOutEvent'; -export * from './CatalogSetExtraPurchaseParameterEvent'; export * from './CatalogSetRoomPreviewerStuffDataEvent'; export * from './CatalogWidgetEvent'; export * from './SetRoomPreviewerStuffDataEvent'; diff --git a/src/events/floorplan-editor/FloorplanEditorEvent.ts b/src/events/floorplan-editor/FloorplanEditorEvent.ts deleted file mode 100644 index 62f7f3bf..00000000 --- a/src/events/floorplan-editor/FloorplanEditorEvent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class FloorplanEditorEvent extends NitroEvent -{ - public static SHOW_FLOORPLAN_EDITOR: string = 'FPEE_SHOW_FLOORPLAN_EDITOR'; - public static HIDE_FLOORPLAN_EDITOR: string = 'FPEE_HIDE_FLOORPLAN_EDITOR'; - public static TOGGLE_FLOORPLAN_EDITOR: string = 'FPEE_TOGGLE_FLOORPLAN_EDITOR'; -} diff --git a/src/events/floorplan-editor/index.ts b/src/events/floorplan-editor/index.ts deleted file mode 100644 index f429f780..00000000 --- a/src/events/floorplan-editor/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './FloorplanEditorEvent'; diff --git a/src/events/friends/FriendEnteredRoomEvent.ts b/src/events/friends/FriendEnteredRoomEvent.ts deleted file mode 100644 index 698e5407..00000000 --- a/src/events/friends/FriendEnteredRoomEvent.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class FriendEnteredRoomEvent extends NitroEvent -{ - public static ENTERED: string = 'FERE_ENTERED'; - - private _roomIndex: number; - private _category: number; - private _id: number; - private _name: string; - private _userType: number; - - constructor(roomIndex: number, category: number, id: number, name: string, userType: number) - { - super(FriendEnteredRoomEvent.ENTERED); - - this._roomIndex = roomIndex; - this._category = category; - this._id = id; - this._name = name; - this._userType = userType; - } - - public get roomIndex(): number - { - return this._roomIndex; - } - - public get category(): number - { - return this._category; - } - - public get id(): number - { - return this._id; - } - - public get name(): string - { - return this._name; - } - - public get userType(): number - { - return this._userType; - } -} diff --git a/src/events/friends/FriendListContentEvent.ts b/src/events/friends/FriendListContentEvent.ts deleted file mode 100644 index 61d509c9..00000000 --- a/src/events/friends/FriendListContentEvent.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { MessengerFriend } from '../../components/friends/common/MessengerFriend'; - -export class FriendListContentEvent extends NitroEvent -{ - public static FRIEND_LIST_CONTENT: string = 'FLSFRE_FRIEND_LIST_CONTENT'; - - private _friends: Map; - - constructor(friends: MessengerFriend[]) - { - super(FriendListContentEvent.FRIEND_LIST_CONTENT); - - this._friends = new Map(); - - friends.forEach(entry => - { - this._friends.set(entry.id, entry.name); - }); - } - - public get friends(): Map - { - return this._friends; - } -} diff --git a/src/events/friends/FriendRequestEvent.ts b/src/events/friends/FriendRequestEvent.ts deleted file mode 100644 index 33c78132..00000000 --- a/src/events/friends/FriendRequestEvent.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class FriendRequestEvent extends NitroEvent -{ - public static ACCEPTED: string = 'FRE_ACCEPTED'; - public static DECLINED: string = 'FRE_DECLINED'; - - private _requestId: number; - - constructor(type: string, requestId: number) - { - super(type); - - this._requestId = requestId; - } - - public get requestId(): number - { - return this._requestId; - } -} diff --git a/src/events/friends/FriendsAcceptFriendRequestEvent.ts b/src/events/friends/FriendsAcceptFriendRequestEvent.ts deleted file mode 100644 index 565cd5f0..00000000 --- a/src/events/friends/FriendsAcceptFriendRequestEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class FriendsAcceptFriendRequestEvent extends NitroEvent -{ - public static ACCEPT_FRIEND_REQUEST: string = 'FAFRE_ACCEPT_FRIEND_REQUEST'; - - private _requestId: number; - - constructor(requestId: number) - { - super(FriendsAcceptFriendRequestEvent.ACCEPT_FRIEND_REQUEST); - - this._requestId = requestId; - } - - public get requestId(): number - { - return this._requestId; - } -} diff --git a/src/events/friends/FriendsDeclineFriendRequestEvent.ts b/src/events/friends/FriendsDeclineFriendRequestEvent.ts deleted file mode 100644 index 3fa71ac6..00000000 --- a/src/events/friends/FriendsDeclineFriendRequestEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class FriendsDeclineFriendRequestEvent extends NitroEvent -{ - public static DECLINE_FRIEND_REQUEST: string = 'FAFRE_DECLINE_FRIEND_REQUEST'; - - private _requestId: number; - - constructor(requestId: number) - { - super(FriendsDeclineFriendRequestEvent.DECLINE_FRIEND_REQUEST); - - this._requestId = requestId; - } - - public get requestId(): number - { - return this._requestId; - } -} diff --git a/src/events/friends/FriendsEvent.ts b/src/events/friends/FriendsEvent.ts deleted file mode 100644 index 0f8be1d7..00000000 --- a/src/events/friends/FriendsEvent.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class FriendsEvent extends NitroEvent -{ - public static SHOW_FRIEND_LIST: string = 'IE_SHOW_FRIEND_LIST'; - public static TOGGLE_FRIEND_LIST: string = 'IE_TOGGLE_FRIEND_LIST'; - public static SHOW_FRIEND_MESSENGER: string = 'IE_SHOW_FRIEND_MESSENGER'; - public static TOGGLE_FRIEND_MESSENGER: string = 'IE_TOGGLE_FRIEND_MESSENGER'; - public static REQUEST_FRIEND_LIST: string = 'FLSFRE_REQUEST_FRIEND_LIST'; -} diff --git a/src/events/friends/FriendsMessengerIconEvent.ts b/src/events/friends/FriendsMessengerIconEvent.ts deleted file mode 100644 index 602eb726..00000000 --- a/src/events/friends/FriendsMessengerIconEvent.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class FriendsMessengerIconEvent extends NitroEvent -{ - public static UPDATE_ICON: string = 'FMIE_UPDATE_ICON'; - public static HIDE_ICON: number = 0; - public static SHOW_ICON: number = 1; - public static UNREAD_ICON: number = 2; - - private _iconType: number; - - constructor(type: string, subType: number = FriendsMessengerIconEvent.SHOW_ICON) - { - super(type); - - this._iconType = subType; - } - - public get iconType(): number - { - return this._iconType; - } -} diff --git a/src/events/friends/FriendsRequestCountEvent.ts b/src/events/friends/FriendsRequestCountEvent.ts deleted file mode 100644 index 884819e0..00000000 --- a/src/events/friends/FriendsRequestCountEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class FriendsRequestCountEvent extends NitroEvent -{ - public static UPDATE_COUNT: string = 'FRCE_UPDATE_COUNT'; - - private _count: number; - - constructor(count: number) - { - super(FriendsRequestCountEvent.UPDATE_COUNT); - - this._count = count; - } - - public get count(): number - { - return this._count; - } -} diff --git a/src/events/friends/FriendsSendFriendRequestEvent.ts b/src/events/friends/FriendsSendFriendRequestEvent.ts deleted file mode 100644 index 177ce5b7..00000000 --- a/src/events/friends/FriendsSendFriendRequestEvent.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class FriendsSendFriendRequestEvent extends NitroEvent -{ - public static SEND_FRIEND_REQUEST: string = 'FLSFRE_SEND_FRIEND_REQUEST'; - - private _userId: number; - private _userName: string; - - constructor(userId: number, userName: string) - { - super(FriendsSendFriendRequestEvent.SEND_FRIEND_REQUEST); - - this._userId = userId; - this._userName = userName; - } - - public get userId(): number - { - return this._userId; - } - - public get userName(): string - { - return this._userName; - } -} diff --git a/src/events/friends/index.ts b/src/events/friends/index.ts deleted file mode 100644 index 21f764ef..00000000 --- a/src/events/friends/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './FriendEnteredRoomEvent'; -export * from './FriendListContentEvent'; -export * from './FriendRequestEvent'; -export * from './FriendsAcceptFriendRequestEvent'; -export * from './FriendsDeclineFriendRequestEvent'; -export * from './FriendsEvent'; -export * from './FriendsMessengerIconEvent'; -export * from './FriendsRequestCountEvent'; -export * from './FriendsSendFriendRequestEvent'; diff --git a/src/events/hc-center/HcCenterEvent.ts b/src/events/hc-center/HcCenterEvent.ts deleted file mode 100644 index 1beec349..00000000 --- a/src/events/hc-center/HcCenterEvent.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class HcCenterEvent extends NitroEvent -{ - public static TOGGLE_HC_CENTER: string = 'HCC_TOGGLE'; -} diff --git a/src/events/hc-center/index.ts b/src/events/hc-center/index.ts deleted file mode 100644 index 8bea7bdc..00000000 --- a/src/events/hc-center/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './HcCenterEvent'; diff --git a/src/events/help/HelpNameChangeEvent.ts b/src/events/help/HelpNameChangeEvent.ts index 076f5b51..44597d0e 100644 --- a/src/events/help/HelpNameChangeEvent.ts +++ b/src/events/help/HelpNameChangeEvent.ts @@ -1,4 +1,4 @@ -import { NitroEvent } from '@nitrots/nitro-renderer/src/core/events/NitroEvent'; +import { NitroEvent } from '@nitrots/nitro-renderer'; export class HelpNameChangeEvent extends NitroEvent { diff --git a/src/events/help/HelpReportUserEvent.ts b/src/events/help/HelpReportUserEvent.ts deleted file mode 100644 index 82148610..00000000 --- a/src/events/help/HelpReportUserEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class HelpReportUserEvent extends NitroEvent -{ - public static REPORT_USER: string = 'HCE_HELP_CENTER_REPORT_USER'; - - private _reportedUserId: number; - - constructor(userId: number) - { - super(HelpReportUserEvent.REPORT_USER); - - this._reportedUserId = userId; - } - - public get reportedUserId(): number - { - return this._reportedUserId; - } -} diff --git a/src/events/help/index.ts b/src/events/help/index.ts index c6abfbe6..e89f3070 100644 --- a/src/events/help/index.ts +++ b/src/events/help/index.ts @@ -1,2 +1 @@ export * from './HelpNameChangeEvent'; -export * from './HelpReportUserEvent'; diff --git a/src/events/index.ts b/src/events/index.ts index 8a7625ea..4c5e757d 100644 --- a/src/events/index.ts +++ b/src/events/index.ts @@ -1,15 +1,6 @@ -export * from './achievements'; export * from './catalog'; -export * from './floorplan-editor'; -export * from './friends'; export * from './guide-tool'; -export * from './hc-center'; export * from './help'; export * from './inventory'; -export * from './mod-tools'; -export * from './navigator'; -export * from './notification-center'; export * from './room-widgets'; export * from './room-widgets/thumbnail'; -export * from './user-settings'; -export * from './wired'; diff --git a/src/events/inventory/InventoryBadgesRequestEvent.ts b/src/events/inventory/InventoryBadgesRequestEvent.ts deleted file mode 100644 index 21ae1002..00000000 --- a/src/events/inventory/InventoryBadgesRequestEvent.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class InventoryBadgesRequestEvent extends NitroEvent -{ - public static REQUEST_BADGES: string = 'IBRE_REQUEST_BADGES'; -} diff --git a/src/events/inventory/InventoryBadgesUpdatedEvent.ts b/src/events/inventory/InventoryBadgesUpdatedEvent.ts deleted file mode 100644 index 4fb8d6af..00000000 --- a/src/events/inventory/InventoryBadgesUpdatedEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class InventoryBadgesUpdatedEvent extends NitroEvent -{ - public static BADGES_UPDATED: string = 'IBUE_BADGES_UPDATED'; - - private _badges: string[] = []; - - constructor(type: string, badges: string[] = []) - { - super(type); - - this._badges = badges; - } - - public get badges(): string[] - { - return this._badges; - } -} diff --git a/src/events/inventory/InventoryEvent.ts b/src/events/inventory/InventoryEvent.ts deleted file mode 100644 index 94d242dd..00000000 --- a/src/events/inventory/InventoryEvent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class InventoryEvent extends NitroEvent -{ - public static SHOW_INVENTORY: string = 'IE_SHOW_INVENTORY'; - public static HIDE_INVENTORY: string = 'IE_HIDE_INVENTORY'; - public static TOGGLE_INVENTORY: string = 'IE_TOGGLE_INVENTORY'; -} diff --git a/src/events/inventory/InventoryFurniAddedEvent.ts b/src/events/inventory/InventoryFurniAddedEvent.ts new file mode 100644 index 00000000..409f0be8 --- /dev/null +++ b/src/events/inventory/InventoryFurniAddedEvent.ts @@ -0,0 +1,14 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; + +export class InventoryFurniAddedEvent extends NitroEvent +{ + public static FURNI_ADDED: string = 'IFAE_FURNI_ADDED'; + + constructor( + public readonly id: number, + public readonly spriteId: number, + public readonly category: number) + { + super(InventoryFurniAddedEvent.FURNI_ADDED); + } +} diff --git a/src/events/inventory/InventoryTradeRequestEvent.ts b/src/events/inventory/InventoryTradeRequestEvent.ts deleted file mode 100644 index 8cc0ee9f..00000000 --- a/src/events/inventory/InventoryTradeRequestEvent.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { InventoryEvent } from './InventoryEvent'; - -export class InventoryTradeRequestEvent extends InventoryEvent -{ - public static REQUEST_TRADE: string = 'ITSE_REQUEST_TRADE'; - - private _objectId: number; - private _username: string; - - constructor(objectId: number, username: string) - { - super(InventoryTradeRequestEvent.REQUEST_TRADE); - - this._objectId = objectId; - this._username = username; - } - - public get objectId(): number - { - return this._objectId; - } - - public get username(): string - { - return this._username; - } -} diff --git a/src/events/inventory/InventoryTradeStartEvent.ts b/src/events/inventory/InventoryTradeStartEvent.ts deleted file mode 100644 index 53a01f15..00000000 --- a/src/events/inventory/InventoryTradeStartEvent.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { TradeUserData } from '../../components/inventory/common/TradeUserData'; -import { InventoryEvent } from './InventoryEvent'; - -export class InventoryTradeStartEvent extends InventoryEvent -{ - public static START_TRADE: string = 'ITSE_START_TRADE'; - - private _ownUserTradeData: TradeUserData; - private _otherUserTradeData: TradeUserData; - - constructor(ownUserTradeData: TradeUserData, otherUserTradeData: TradeUserData) - { - super(InventoryTradeStartEvent.START_TRADE); - - this._ownUserTradeData = ownUserTradeData; - this._otherUserTradeData = otherUserTradeData; - } - - public get ownUserTradeData(): TradeUserData - { - return this._ownUserTradeData; - } - - public get otherUserTradeData(): TradeUserData - { - return this._otherUserTradeData; - } -} diff --git a/src/events/inventory/UnseenItemTrackerUpdateEvent.ts b/src/events/inventory/UnseenItemTrackerUpdateEvent.ts deleted file mode 100644 index 0f100a5f..00000000 --- a/src/events/inventory/UnseenItemTrackerUpdateEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class UnseenItemTrackerUpdateEvent extends NitroEvent -{ - public static UPDATE_COUNT: string = 'UITUE_UPDATE_COUNTER'; - - private _count: number; - - constructor(count: number) - { - super(UnseenItemTrackerUpdateEvent.UPDATE_COUNT); - - this._count = count; - } - - public get count(): number - { - return this._count; - } -} diff --git a/src/events/inventory/index.ts b/src/events/inventory/index.ts index db16b5dc..58503ead 100644 --- a/src/events/inventory/index.ts +++ b/src/events/inventory/index.ts @@ -1,6 +1 @@ -export * from './InventoryBadgesRequestEvent'; -export * from './InventoryBadgesUpdatedEvent'; -export * from './InventoryEvent'; -export * from './InventoryTradeRequestEvent'; -export * from './InventoryTradeStartEvent'; -export * from './UnseenItemTrackerUpdateEvent'; +export * from './InventoryFurniAddedEvent'; diff --git a/src/events/mod-tools/ModToolsEvent.ts b/src/events/mod-tools/ModToolsEvent.ts deleted file mode 100644 index ac7dc7d8..00000000 --- a/src/events/mod-tools/ModToolsEvent.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class ModToolsEvent extends NitroEvent -{ - public static SHOW_MOD_TOOLS: string = 'MTE_SHOW_MOD_TOOLS'; - public static HIDE_MOD_TOOLS: string = 'MTE_HIDE_MOD_TOOLS'; - public static TOGGLE_MOD_TOOLS: string = 'MTE_TOGGLE_MOD_TOOLS'; - public static OPEN_ROOM_INFO: string = 'MTE_OPEN_ROOM_INFO'; - public static OPEN_ROOM_CHATLOG: string = 'MTE_OPEN_ROOM_CHATLOG'; - public static OPEN_USER_INFO: string = 'MTE_OPEN_USER_INFO'; - public static OPEN_USER_CHATLOG: string = 'MTE_OPEN_USER_CHATLOG'; -} diff --git a/src/events/mod-tools/ModToolsOpenRoomChatlogEvent.ts b/src/events/mod-tools/ModToolsOpenRoomChatlogEvent.ts deleted file mode 100644 index 692e687d..00000000 --- a/src/events/mod-tools/ModToolsOpenRoomChatlogEvent.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ModToolsEvent } from './ModToolsEvent'; - -export class ModToolsOpenRoomChatlogEvent extends ModToolsEvent -{ - private _roomId: number; - - constructor(roomId: number) - { - super(ModToolsEvent.OPEN_ROOM_CHATLOG); - - this._roomId = roomId; - } - - public get roomId(): number - { - return this._roomId; - } -} diff --git a/src/events/mod-tools/ModToolsOpenRoomInfoEvent.ts b/src/events/mod-tools/ModToolsOpenRoomInfoEvent.ts deleted file mode 100644 index 24465610..00000000 --- a/src/events/mod-tools/ModToolsOpenRoomInfoEvent.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ModToolsEvent } from './ModToolsEvent'; - -export class ModToolsOpenRoomInfoEvent extends ModToolsEvent -{ - private _roomId: number; - - constructor(roomId: number) - { - super(ModToolsEvent.OPEN_ROOM_INFO); - - this._roomId = roomId; - } - - public get roomId(): number - { - return this._roomId; - } -} diff --git a/src/events/mod-tools/ModToolsOpenUserChatlogEvent.ts b/src/events/mod-tools/ModToolsOpenUserChatlogEvent.ts deleted file mode 100644 index aa8858e8..00000000 --- a/src/events/mod-tools/ModToolsOpenUserChatlogEvent.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ModToolsEvent } from './ModToolsEvent'; - -export class ModToolsOpenUserChatlogEvent extends ModToolsEvent -{ - private _userId: number; - - constructor(userId: number) - { - super(ModToolsEvent.OPEN_USER_CHATLOG); - - this._userId = userId; - } - - public get userId(): number - { - return this._userId; - } -} diff --git a/src/events/mod-tools/ModToolsOpenUserInfoEvent.ts b/src/events/mod-tools/ModToolsOpenUserInfoEvent.ts deleted file mode 100644 index 58148ee9..00000000 --- a/src/events/mod-tools/ModToolsOpenUserInfoEvent.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ModToolsEvent } from './ModToolsEvent'; - -export class ModToolsOpenUserInfoEvent extends ModToolsEvent -{ - private _userId: number; - - constructor(userId: number) - { - super(ModToolsEvent.OPEN_USER_INFO); - - this._userId = userId; - } - - public get userId(): number - { - return this._userId; - } -} diff --git a/src/events/mod-tools/index.ts b/src/events/mod-tools/index.ts deleted file mode 100644 index 7a61fe71..00000000 --- a/src/events/mod-tools/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './ModToolsEvent'; -export * from './ModToolsOpenRoomChatlogEvent'; -export * from './ModToolsOpenRoomInfoEvent'; -export * from './ModToolsOpenUserChatlogEvent'; -export * from './ModToolsOpenUserInfoEvent'; diff --git a/src/events/navigator/NavigatorEvent.ts b/src/events/navigator/NavigatorEvent.ts deleted file mode 100644 index 848e6747..00000000 --- a/src/events/navigator/NavigatorEvent.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class NavigatorEvent extends NitroEvent -{ - public static SHOW_NAVIGATOR: string = 'NE_SHOW_NAVIGATOR'; - public static HIDE_NAVIGATOR: string = 'NE_HIDE_NAVIGATOR'; - public static TOGGLE_NAVIGATOR: string = 'NE_TOGGLE_NAVIGATOR'; - public static TOGGLE_ROOM_INFO: string = 'NE_TOGGLE_ROOM_INFO'; - public static TOGGLE_ROOM_LINK: string = 'NE_TOGGLE_ROOM_LINK'; - public static TOGGLE_ROOM_SETTINGS: string = 'NE_TOGGLE_ROOM_SETTINGS'; - public static SHOW_ROOM_CREATOR: string = 'NE_TOGGLE_CREATOR'; - - private _roomId: number; - private _password: string; - - constructor(type: string, roomId: number = -1, password = null) - { - super(type); - - this._roomId = roomId; - this._password = password; - } - - public get roomId(): number - { - return this._roomId; - } - - public get password(): string - { - return this._password; - } -} diff --git a/src/events/navigator/UpdateDoorStateEvent.ts b/src/events/navigator/UpdateDoorStateEvent.ts deleted file mode 100644 index 0c4bdfca..00000000 --- a/src/events/navigator/UpdateDoorStateEvent.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NitroEvent, RoomDataParser } from '@nitrots/nitro-renderer'; - -export class UpdateDoorStateEvent extends NitroEvent -{ - public static START_DOORBELL: string = 'UDSE_START_DOORBELL'; - public static START_PASSWORD: string = 'UDSE_START_PASSWORD'; - public static STATE_PENDING_SERVER: string = 'UDSE_STATE_PENDING_SERVER'; - public static UPDATE_STATE: string = 'UDSE_UPDATE_STATE'; - public static STATE_WAITING: string = 'UDSE_STATE_WAITING'; - public static STATE_NO_ANSWER: string = 'UDSE_STATE_NO_ANSWER'; - public static STATE_WRONG_PASSWORD: string = 'UDSE_STATE_WRONG_PASSWORD'; - public static STATE_ACCEPTED: string = 'UDSE_STATE_ACCEPTED'; - - private _roomData: RoomDataParser - - constructor(type: string, roomData: RoomDataParser = null) - { - super(type); - - this._roomData = roomData; - } - - public get roomData(): RoomDataParser - { - return this._roomData; - } -} diff --git a/src/events/navigator/index.ts b/src/events/navigator/index.ts deleted file mode 100644 index 892c758a..00000000 --- a/src/events/navigator/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './NavigatorEvent'; -export * from './UpdateDoorStateEvent'; diff --git a/src/events/notification-center/NotificationAlertEvent.ts b/src/events/notification-center/NotificationAlertEvent.ts deleted file mode 100644 index 4f64acc9..00000000 --- a/src/events/notification-center/NotificationAlertEvent.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class NotificationAlertEvent extends NitroEvent -{ - public static ALERT: string = 'NAE_ALERT'; - - private _messages: string[]; - private _alertType: string; - private _clickUrl: string; - private _clickUrlText: string; - private _title: string; - private _imageUrl: string; - - constructor(messages: string[], alertType: string = null, clickUrl: string = null, clickUrlText: string = null, title: string = null, imageUrl: string = null) - { - super(NotificationAlertEvent.ALERT); - - this._messages = messages; - this._alertType = alertType; - this._clickUrl = clickUrl; - this._clickUrlText = clickUrlText; - this._title = title; - this._imageUrl = imageUrl; - } - - public get messages(): string[] - { - return this._messages; - } - - public get alertType(): string - { - return this._alertType; - } - - public get clickUrl(): string - { - return this._clickUrl; - } - - public get clickUrlText(): string - { - return this._clickUrlText; - } - - public get title(): string - { - return this._title; - } - - public get imageUrl(): string - { - return this._imageUrl; - } -} diff --git a/src/events/notification-center/NotificationBubbleEvent.ts b/src/events/notification-center/NotificationBubbleEvent.ts deleted file mode 100644 index 55383655..00000000 --- a/src/events/notification-center/NotificationBubbleEvent.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class NotificationBubbleEvent extends NitroEvent -{ - public static NEW_BUBBLE: string = 'NBE_NEW_BUBBLE'; - - private _message: string; - private _notificationType: string; - private _imageUrl: string; - private _linkUrl: string; - - constructor(message: string, notificationType: string, imageUrl: string, linkUrl: string) - { - super(NotificationBubbleEvent.NEW_BUBBLE); - - this._message = message; - this._notificationType = notificationType; - this._imageUrl = imageUrl; - this._linkUrl = linkUrl; - } - - public get message(): string - { - return this._message; - } - - public get notificationType(): string - { - return this._notificationType; - } - - public get imageUrl(): string - { - return this._imageUrl; - } - - public get linkUrl(): string - { - return this._linkUrl; - } -} diff --git a/src/events/notification-center/NotificationCenterAlertEvent.ts b/src/events/notification-center/NotificationCenterAlertEvent.ts deleted file mode 100644 index 44a97b8c..00000000 --- a/src/events/notification-center/NotificationCenterAlertEvent.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class NotificationCenterAlertEvent extends NitroEvent -{ - public static HOTEL_ALERT: string = 'NCAE_HOTEL_ALERT'; - - private _message: string[]; - private _clickUrl: string; - private _headerText: string; - - constructor(type: string, message: string[], clickUrl = null, headerText = null) - { - super(type); - - this._message = message; - this._clickUrl = clickUrl; - this._headerText = headerText; - } - - public get message(): string[] - { - return this._message; - } - - public get clickUrl(): string - { - return this._clickUrl; - } - - public get headerText(): string - { - return this._headerText; - } -} diff --git a/src/events/notification-center/NotificationCenterEvent.ts b/src/events/notification-center/NotificationCenterEvent.ts deleted file mode 100644 index ad01268f..00000000 --- a/src/events/notification-center/NotificationCenterEvent.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class NotificationCenterEvent extends NitroEvent -{ - public static SHOW_NOTIFICATION_CENTER: string = 'NCE_SHOW_NOTIFICATION_CENTER'; - public static HIDE_NOTIFICATION_CENTER: string = 'NCE_HIDE_NOTIFICATION_CENTER'; - public static TOGGLE_NOTIFICATION_CENTER: string = 'NCE_TOGGLE_NOTIFICATION_CENTER'; - public static ADD_NOTIFICATION: string = 'NCE_ADD_NOTIFICATION'; -} diff --git a/src/events/notification-center/NotificationConfirmEvent.ts b/src/events/notification-center/NotificationConfirmEvent.ts deleted file mode 100644 index 6dc1638b..00000000 --- a/src/events/notification-center/NotificationConfirmEvent.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class NotificationConfirmEvent extends NitroEvent -{ - public static CONFIRM: string = 'NCE_CONFIRM'; - - private _confirmType: string; - private _message: string; - private _onConfirm: Function; - private _onCancel: Function; - private _confirmText: string; - private _cancelText: string; - private _title: string; - - constructor(confirmType: string, message: string, onConfirm: Function, onCancel: Function, confirmText: string, cancelText: string, title: string) - { - super(NotificationConfirmEvent.CONFIRM); - - this._confirmType = confirmType; - this._message = message; - this._onConfirm = onConfirm; - this._onCancel = onCancel; - this._confirmText = confirmText; - this._cancelText = cancelText; - this._title = title; - } - - public get confirmType(): string - { - return this._confirmType; - } - - public get message(): string - { - return this._message; - } - - public get onConfirm(): Function - { - return this._onConfirm; - } - - public get onCancel(): Function - { - return this._onCancel; - } - - public get confirmText(): string - { - return this._confirmText; - } - - public get cancelText(): string - { - return this._cancelText; - } - - public get title(): string - { - return this._title; - } -} diff --git a/src/events/notification-center/index.ts b/src/events/notification-center/index.ts deleted file mode 100644 index 7eaa0ab2..00000000 --- a/src/events/notification-center/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './NotificationAlertEvent'; -export * from './NotificationBubbleEvent'; -export * from './NotificationCenterAlertEvent'; -export * from './NotificationCenterEvent'; -export * from './NotificationConfirmEvent'; diff --git a/src/events/user-settings/UserSettingsUIEvent.ts b/src/events/user-settings/UserSettingsUIEvent.ts deleted file mode 100644 index 4ce30d88..00000000 --- a/src/events/user-settings/UserSettingsUIEvent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class UserSettingsUIEvent extends NitroEvent -{ - public static SHOW_USER_SETTINGS: string = 'NE_SHOW_USER_SETTINGS'; - public static HIDE_USER_SETTINGS: string = 'NE_HIDE_USER_SETTINGS'; - public static TOGGLE_USER_SETTINGS: string = 'NE_TOGGLE_USER_SETTINGS'; -} diff --git a/src/events/user-settings/index.ts b/src/events/user-settings/index.ts deleted file mode 100644 index 5879374c..00000000 --- a/src/events/user-settings/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './UserSettingsUIEvent'; diff --git a/src/events/wired/WiredEvent.ts b/src/events/wired/WiredEvent.ts deleted file mode 100644 index 6020680b..00000000 --- a/src/events/wired/WiredEvent.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class WiredEvent extends NitroEvent -{ - public static SAVE_WIRED: string = 'WE_SAVE_WIRED'; -} diff --git a/src/events/wired/WiredSelectObjectEvent.ts b/src/events/wired/WiredSelectObjectEvent.ts deleted file mode 100644 index e82fc9d1..00000000 --- a/src/events/wired/WiredSelectObjectEvent.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { WiredEvent } from './WiredEvent'; - -export class WiredSelectObjectEvent extends WiredEvent -{ - public static SELECT_OBJECT: string = 'WE_SELECT_OBJECT'; - - private _objectId: number; - private _category: number; - - constructor(objectId = -1, category = -1) - { - super(WiredSelectObjectEvent.SELECT_OBJECT); - - this._objectId = objectId; - this._category = category; - } - - public get objectId(): number - { - return this._objectId; - } - - public get category(): number - { - return this._category; - } -} diff --git a/src/events/wired/index.ts b/src/events/wired/index.ts deleted file mode 100644 index 63ab5775..00000000 --- a/src/events/wired/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './WiredEvent'; -export * from './WiredSelectObjectEvent'; diff --git a/src/hooks/BatchUpdates.ts b/src/hooks/BatchUpdates.ts deleted file mode 100644 index d5f2501a..00000000 --- a/src/hooks/BatchUpdates.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { unstable_batchedUpdates } from 'react-dom'; - -export const BatchUpdates = (callback: () => any) => -{ - return unstable_batchedUpdates(callback); -} diff --git a/src/hooks/UseMountEffect.tsx b/src/hooks/UseMountEffect.tsx index 7b33ea72..0ead14b1 100644 --- a/src/hooks/UseMountEffect.tsx +++ b/src/hooks/UseMountEffect.tsx @@ -1,6 +1,7 @@ import { EffectCallback, useEffect } from 'react'; +// eslint-disable-next-line react-hooks/exhaustive-deps const useEffectOnce = (effect: EffectCallback) => useEffect(effect, []); export const UseMountEffect = (fn: Function) => useEffectOnce(() => fn()); diff --git a/src/hooks/achievements/index.ts b/src/hooks/achievements/index.ts new file mode 100644 index 00000000..1a2a81e1 --- /dev/null +++ b/src/hooks/achievements/index.ts @@ -0,0 +1 @@ +export * from './useAchievements'; diff --git a/src/hooks/achievements/useAchievements.ts b/src/hooks/achievements/useAchievements.ts new file mode 100644 index 00000000..8c3dceee --- /dev/null +++ b/src/hooks/achievements/useAchievements.ts @@ -0,0 +1,163 @@ +import { AchievementData, AchievementEvent, AchievementsEvent, AchievementsScoreEvent, RequestAchievementsMessageComposer } from '@nitrots/nitro-renderer'; +import { useEffect, useMemo, useState } from 'react'; +import { AchievementCategory, AchievementUtilities, CloneObject, SendMessageComposer } from '../../api'; +import { useMessageEvent } from '../events'; + +const useAchievementsState = () => +{ + const [ needsUpdate, setNeedsUpdate ] = useState(true); + const [ achievementCategories, setAchievementCategories ] = useState([]); + const [ selectedCategoryCode, setSelectedCategoryCode ] = useState(null); + const [ selectedAchievementId, setSelectedAchievementId ] = useState(-1); + const [ achievementScore, setAchievementScore ] = useState(0); + + const getTotalUnseen = useMemo(() => + { + let unseen = 0; + + achievementCategories.forEach(category => unseen += AchievementUtilities.getAchievementCategoryTotalUnseen(category)); + + return unseen; + }, [ achievementCategories ]); + + const getProgress = useMemo(() => + { + let progress = 0; + + achievementCategories.forEach(category => (progress += category.getProgress())); + + return progress; + }, [ achievementCategories ]); + + const getMaxProgress = useMemo(() => + { + let progress = 0; + + achievementCategories.forEach(category => (progress += category.getMaxProgress())); + + return progress; + }, [ achievementCategories ]); + + const scaledProgressPercent = useMemo(() => + { + return ~~((((getProgress - 0) * (100 - 0)) / (getMaxProgress - 0)) + 0); + }, [ getProgress, getMaxProgress ]); + + const setAchievementSeen = (categoryCode: string, achievementId: number) => + { + setAchievementCategories(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const category of newValue) + { + if(category.code !== categoryCode) continue; + + for(const achievement of category.achievements) + { + if(achievement.achievementId !== achievementId) continue; + + achievement.unseen = 0; + } + } + + return newValue; + }); + } + + useMessageEvent(AchievementEvent, event => + { + const parser = event.getParser(); + const achievement = parser.achievement; + + setAchievementCategories(prevValue => + { + const newValue = [ ...prevValue ]; + const categoryIndex = newValue.findIndex(existing => (existing.code === achievement.category)); + + if(categoryIndex === -1) + { + const category = new AchievementCategory(achievement.category); + + category.achievements.push(achievement); + + newValue.push(category); + } + else + { + const category = CloneObject(newValue[categoryIndex]); + const newAchievements = [ ...category.achievements ]; + const achievementIndex = newAchievements.findIndex(existing => (existing.achievementId === achievement.achievementId)); + let previousAchievement: AchievementData = null; + + if(achievementIndex === -1) + { + newAchievements.push(achievement); + } + else + { + previousAchievement = newAchievements[achievementIndex]; + + newAchievements[achievementIndex] = achievement; + } + + if(!AchievementUtilities.getAchievementIsIgnored(achievement)) + { + achievement.unseen++; + + if(previousAchievement) achievement.unseen += previousAchievement.unseen; + } + + category.achievements = newAchievements; + + newValue[categoryIndex] = category; + } + + return newValue; + }); + }); + + useMessageEvent(AchievementsEvent, event => + { + const parser = event.getParser(); + const categories: AchievementCategory[] = []; + + for(const achievement of parser.achievements) + { + const categoryName = achievement.category; + + let existing = categories.find(category => (category.code === categoryName)); + + if(!existing) + { + existing = new AchievementCategory(categoryName); + + categories.push(existing); + } + + existing.achievements.push(achievement); + } + + setAchievementCategories(categories); + }); + + useMessageEvent(AchievementsScoreEvent, event => + { + const parser = event.getParser(); + + setAchievementScore(parser.score); + }); + + useEffect(() => + { + if(!needsUpdate) return; + + SendMessageComposer(new RequestAchievementsMessageComposer()); + + setNeedsUpdate(false); + }, [ needsUpdate ]); + + return { achievementCategories, selectedCategoryCode, setSelectedCategoryCode, selectedAchievementId, setSelectedAchievementId, achievementScore, getTotalUnseen, getProgress, getMaxProgress, scaledProgressPercent, setAchievementSeen }; +} + +export const useAchievements = useAchievementsState; diff --git a/src/hooks/camera/index.ts b/src/hooks/camera/index.ts new file mode 100644 index 00000000..20bea9c8 --- /dev/null +++ b/src/hooks/camera/index.ts @@ -0,0 +1 @@ +export * from './useCamera'; diff --git a/src/hooks/camera/useCamera.ts b/src/hooks/camera/useCamera.ts new file mode 100644 index 00000000..e2449c80 --- /dev/null +++ b/src/hooks/camera/useCamera.ts @@ -0,0 +1,42 @@ +import { InitCameraMessageEvent, IRoomCameraWidgetEffect, RequestCameraConfigurationComposer, RoomCameraWidgetManagerEvent } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { useBetween } from 'use-between'; +import { CameraPicture, GetRoomCameraWidgetManager, SendMessageComposer } from '../../api'; +import { useCameraEvent, useMessageEvent } from '../events'; + +const useCameraState = () => +{ + const [ availableEffects, setAvailableEffects ] = useState([]); + const [ cameraRoll, setCameraRoll ] = useState([]); + const [ selectedPictureIndex, setSelectedPictureIndex ] = useState(-1); + const [ myLevel, setMyLevel ] = useState(10); + const [ price, setPrice ] = useState<{ credits: number, duckets: number, publishDucketPrice: number }>(null); + + useCameraEvent(RoomCameraWidgetManagerEvent.INITIALIZED, event => + { + setAvailableEffects(Array.from(GetRoomCameraWidgetManager().effects.values())); + }); + + useMessageEvent(InitCameraMessageEvent, event => + { + const parser = event.getParser(); + + setPrice({ credits: parser.creditPrice, duckets: parser.ducketPrice, publishDucketPrice: parser.publishDucketPrice }); + }); + + useEffect(() => + { + if(!GetRoomCameraWidgetManager().isLoaded) + { + GetRoomCameraWidgetManager().init(); + + SendMessageComposer(new RequestCameraConfigurationComposer()); + + return; + } + }, []); + + return { availableEffects, cameraRoll, setCameraRoll, selectedPictureIndex, setSelectedPictureIndex, myLevel, price }; +} + +export const useCamera = () => useBetween(useCameraState); diff --git a/src/hooks/catalog/index.ts b/src/hooks/catalog/index.ts new file mode 100644 index 00000000..75d29849 --- /dev/null +++ b/src/hooks/catalog/index.ts @@ -0,0 +1,3 @@ +export * from './useCatalog'; +export * from './useCatalogPlaceMultipleItems'; +export * from './useCatalogSkipPurchaseConfirmation'; diff --git a/src/hooks/catalog/useCatalog.ts b/src/hooks/catalog/useCatalog.ts new file mode 100644 index 00000000..25d0d26d --- /dev/null +++ b/src/hooks/catalog/useCatalog.ts @@ -0,0 +1,906 @@ +import { BuildersClubFurniCountMessageEvent, BuildersClubPlaceRoomItemMessageComposer, BuildersClubPlaceWallItemMessageComposer, BuildersClubQueryFurniCountMessageComposer, BuildersClubSubscriptionStatusMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, ClubGiftInfoEvent, FrontPageItem, FurniturePlaceComposer, FurniturePlacePaintComposer, GetCatalogIndexComposer, GetCatalogPageComposer, GetClubGiftInfo, GetGiftWrappingConfigurationComposer, GiftWrappingConfigurationEvent, GuildMembershipsMessageEvent, HabboClubOffersMessageEvent, LegacyDataType, LimitedEditionSoldOutEvent, MarketplaceMakeOfferResult, NodeData, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseFromCatalogComposer, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, RoomControllerLevel, RoomEngineObjectPlacedEvent, RoomObjectCategory, RoomObjectPlacementSource, RoomObjectType, RoomObjectVariable, RoomPreviewer, SellablePetPalettesMessageEvent, Vector3d } from '@nitrots/nitro-renderer'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import { useBetween } from 'use-between'; +import { BuilderFurniPlaceableStatus, CatalogNode, CatalogPage, CatalogPetPalette, CatalogType, CreateLinkEvent, DispatchUiEvent, FurniCategory, GetFurnitureData, GetNitroInstance, GetProductDataForLocalization, GetRoomEngine, GetRoomSession, GiftWrappingConfiguration, ICatalogNode, ICatalogOptions, ICatalogPage, IPageLocalization, IProduct, IPurchasableOffer, IPurchaseOptions, LocalizeText, NotificationAlertType, Offer, PageLocalization, PlacedObjectPurchaseData, PlaySound, Product, ProductTypeEnum, RequestedPage, SearchResult, SendMessageComposer, SoundNames } from '../../api'; +import { CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent, InventoryFurniAddedEvent } from '../../events'; +import { useMessageEvent, useRoomEngineEvent, useUiEvent } from '../events'; +import { useNotification } from '../notification'; +import { useCatalogPlaceMultipleItems } from './useCatalogPlaceMultipleItems'; +import { useCatalogSkipPurchaseConfirmation } from './useCatalogSkipPurchaseConfirmation'; + +const DUMMY_PAGE_ID_FOR_OFFER_SEARCH = -12345678; +const DRAG_AND_DROP_ENABLED = true; + +const useCatalogState = () => +{ + const [ isVisible, setIsVisible ] = useState(false); + const [ isBusy, setIsBusy ] = useState(false); + const [ pageId, setPageId ] = useState(-1); + const [ previousPageId, setPreviousPageId ] = useState(-1); + const [ currentType, setCurrentType ] = useState(CatalogType.NORMAL); + const [ rootNode, setRootNode ] = useState(null); + const [ offersToNodes, setOffersToNodes ] = useState>(null); + const [ currentPage, setCurrentPage ] = useState(null); + const [ currentOffer, setCurrentOffer ] = useState(null); + const [ activeNodes, setActiveNodes ] = useState([]); + const [ searchResult, setSearchResult ] = useState(null); + const [ frontPageItems, setFrontPageItems ] = useState([]); + const [ roomPreviewer, setRoomPreviewer ] = useState(null); + const [ navigationHidden, setNavigationHidden ] = useState(false); + const [ purchaseOptions, setPurchaseOptions ] = useState({ quantity: 1, extraData: null, extraParamRequired: false, previewStuffData: null }); + const [ catalogOptions, setCatalogOptions ] = useState({}); + const [ objectMoverRequested, setObjectMoverRequested ] = useState(false); + const [ catalogPlaceMultipleObjects, setCatalogPlaceMultipleObjects ] = useCatalogPlaceMultipleItems(); + const [ catalogSkipPurchaseConfirmation, setCatalogSkipPurchaseConfirmation ] = useCatalogSkipPurchaseConfirmation(); + const [ purchasableOffer, setPurchaseableOffer ] = useState(null); + const [ placedObjectPurchaseData, setPlacedObjectPurchaseData ] = useState(null); + const [ furniCount, setFurniCount ] = useState(0); + const [ furniLimit, setFurniLimit ] = useState(0); + const [ maxFurniLimit, setMaxFurniLimit ] = useState(0); + const [ secondsLeft, setSecondsLeft ] = useState(0); + const [ updateTime, setUpdateTime ] = useState(0); + const [ secondsLeftWithGrace, setSecondsLeftWithGrace ] = useState(0); + const { simpleAlert = null } = useNotification(); + const requestedPage = useRef(new RequestedPage()); + + const resetState = useCallback(() => + { + setPageId(-1); + setPreviousPageId(-1); + setRootNode(null); + setOffersToNodes(null); + setCurrentPage(null); + setCurrentOffer(null); + setActiveNodes([]); + setSearchResult(null); + setFrontPageItems([]); + setIsVisible(false); + }, []); + + const getBuilderFurniPlaceableStatus = useCallback((offer: IPurchasableOffer) => + { + if(!offer) return BuilderFurniPlaceableStatus.MISSING_OFFER; + + if((furniCount < 0) || (furniCount >= furniLimit)) return BuilderFurniPlaceableStatus.FURNI_LIMIT_REACHED; + + const roomSession = GetRoomSession(); + + if(!roomSession) return BuilderFurniPlaceableStatus.NOT_IN_ROOM; + + if(!roomSession.isRoomOwner) return BuilderFurniPlaceableStatus.NOT_ROOM_OWNER; + + if(secondsLeft <= 0) + { + const roomEngine = GetRoomEngine(); + + let objectCount = roomEngine.getRoomObjectCount(roomSession.roomId, RoomObjectCategory.UNIT); + + while(objectCount > 0) + { + const roomObject = roomEngine.getRoomObjectByIndex(roomSession.roomId, objectCount, RoomObjectCategory.UNIT); + const userData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); + + if(userData && (userData.type === RoomObjectType.USER) && (userData.roomIndex !== roomSession.ownRoomIndex) && !userData.isModerator) return BuilderFurniPlaceableStatus.VISITORS_IN_ROOM; + + objectCount--; + } + } + + return BuilderFurniPlaceableStatus.OKAY; + }, [ furniCount, furniLimit, secondsLeft ]); + + const isDraggable = useCallback((offer: IPurchasableOffer) => + { + const roomSession = GetRoomSession(); + + if(((DRAG_AND_DROP_ENABLED && roomSession && offer.page && (offer.page.layoutCode !== 'sold_ltd_items') && (currentType === CatalogType.NORMAL) && (roomSession.isRoomOwner || (roomSession.isGuildRoom && (roomSession.controllerLevel >= RoomControllerLevel.GUILD_MEMBER)))) || ((currentType === CatalogType.BUILDER) && (getBuilderFurniPlaceableStatus(offer) === BuilderFurniPlaceableStatus.OKAY))) && (offer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (offer.product.productType !== ProductTypeEnum.EFFECT) && (offer.product.productType !== ProductTypeEnum.HABBO_CLUB)) return true; + + return false; + }, [ currentType, getBuilderFurniPlaceableStatus ]); + + const requestOfferToMover = useCallback((offer: IPurchasableOffer) => + { + if(!isDraggable(offer)) return; + + const product = offer.product; + + if(!product) return; + + let category = 0; + + switch(product.productType) + { + case ProductTypeEnum.FLOOR: + category = RoomObjectCategory.FLOOR; + break; + case ProductTypeEnum.WALL: + category = RoomObjectCategory.WALL; + break; + } + + if(GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.CATALOG, -(offer.offerId), category, product.productClassId, product.extraParam)) + { + setPurchaseableOffer(offer); + setObjectMoverRequested(true); + + setIsVisible(false); + } + }, [ isDraggable ]); + + const resetRoomPaint = useCallback((planeType: string, type: string) => + { + const roomEngine = GetRoomEngine(); + + let wallType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_WALL_TYPE); + let floorType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_FLOOR_TYPE); + let landscapeType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_LANDSCAPE_TYPE); + + wallType = (wallType && wallType.length) ? wallType : '101'; + floorType = (floorType && floorType.length) ? floorType : '101'; + landscapeType = (landscapeType && landscapeType.length) ? landscapeType : '1.1'; + + switch(planeType) + { + case 'floor': + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, type, wallType, landscapeType, true); + return; + case 'wallpaper': + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, type, landscapeType, true); + return; + case 'landscape': + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, wallType, type, true); + return; + default: + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, wallType, landscapeType, true); + return; + } + }, []); + + const cancelObjectMover = useCallback(() => + { + if(!purchasableOffer) return; + + GetRoomEngine().cancelRoomObjectInsert(); + + setObjectMoverRequested(false); + setPurchaseableOffer(null); + }, [ purchasableOffer ]); + + const resetObjectMover = useCallback((flag: boolean = true) => + { + setObjectMoverRequested(prevValue => + { + if(prevValue && flag) + { + CreateLinkEvent('catalog/open'); + } + + return false; + }); + }, []); + + const resetPlacedOfferData = useCallback((flag: boolean = false) => + { + if(!flag) resetObjectMover(); + + setPlacedObjectPurchaseData(prevValue => + { + if(prevValue) + { + switch(prevValue.category) + { + case RoomObjectCategory.FLOOR: + GetRoomEngine().removeRoomObjectFloor(prevValue.roomId, prevValue.objectId); + break; + case RoomObjectCategory.WALL: { + + switch(prevValue.furniData.className) + { + case 'floor': + case 'wallpaper': + case 'landscape': + resetRoomPaint('reset', ''); + break; + default: + GetRoomEngine().removeRoomObjectWall(prevValue.roomId, prevValue.objectId); + break; + } + break; + } + default: + GetRoomEngine().deleteRoomObject(prevValue.objectId, prevValue.category); + break; + } + } + + return null; + }); + }, [ resetObjectMover, resetRoomPaint ]); + + const getNodeById = useCallback((id: number, node: ICatalogNode) => + { + if((node.pageId === id) && (node !== rootNode)) return node; + + for(const child of node.children) + { + const found = (getNodeById(id, child) as ICatalogNode); + + if(found) return found; + } + + return null; + }, [ rootNode ]); + + const getNodeByName = useCallback((name: string, node: ICatalogNode) => + { + if((node.pageName === name) && (node !== rootNode)) return node; + + for(const child of node.children) + { + const found = (getNodeByName(name, child) as ICatalogNode); + + if(found) return found; + } + + return null; + }, [ rootNode ]); + + const getNodesByOfferId = useCallback((offerId: number, flag: boolean = false) => + { + if(!offersToNodes || !offersToNodes.size) return null; + + if(flag) + { + const nodes: ICatalogNode[] = []; + const offers = offersToNodes.get(offerId); + + if(offers && offers.length) for(const offer of offers) (offer.isVisible && nodes.push(offer)); + + if(nodes.length) return nodes; + } + + return offersToNodes.get(offerId); + }, [ offersToNodes ]); + + const loadCatalogPage = useCallback((pageId: number, offerId: number) => + { + if(pageId < 0) return; + + setIsBusy(true); + setPageId(pageId); + + if(pageId > -1) SendMessageComposer(new GetCatalogPageComposer(pageId, offerId, currentType)); + }, [ currentType ]); + + const showCatalogPage = useCallback((pageId: number, layoutCode: string, localization: IPageLocalization, offers: IPurchasableOffer[], offerId: number, acceptSeasonCurrencyAsCredits: boolean) => + { + const catalogPage = (new CatalogPage(pageId, layoutCode, localization, offers, acceptSeasonCurrencyAsCredits) as ICatalogPage); + + setCurrentPage(catalogPage); + setPreviousPageId(prevValue => ((pageId !== -1) ? pageId : prevValue)); + setNavigationHidden(false); + + if((offerId > -1) && catalogPage.offers.length) + { + for(const offer of catalogPage.offers) + { + if(offer.offerId !== offerId) continue; + + setCurrentOffer(offer) + + break; + } + } + }, []); + + const activateNode = useCallback((targetNode: ICatalogNode, offerId: number = -1) => + { + cancelObjectMover(); + + if(targetNode.parent.pageName === 'root') + { + if(targetNode.children.length) + { + for(const child of targetNode.children) + { + if(!child.isVisible) continue; + + targetNode = child; + + break; + } + } + } + + const nodes: ICatalogNode[] = []; + + let node = targetNode; + + while(node && (node.pageName !== 'root')) + { + nodes.push(node); + + node = node.parent; + } + + nodes.reverse(); + + setActiveNodes(prevValue => + { + const isActive = (prevValue.indexOf(targetNode) >= 0); + const isOpen = targetNode.isOpen; + + for(const existing of prevValue) + { + existing.deactivate(); + + if(nodes.indexOf(existing) === -1) existing.close(); + } + + for(const n of nodes) + { + n.activate(); + + if(n.parent) n.open(); + + if((n === targetNode.parent) && n.children.length) n.open(); + } + + if(isActive && isOpen) targetNode.close(); + else targetNode.open(); + + return nodes; + }); + + if(targetNode.pageId > -1) loadCatalogPage(targetNode.pageId, offerId); + }, [ setActiveNodes, loadCatalogPage, cancelObjectMover ]); + + const openPageById = useCallback((id: number) => + { + setSearchResult(null); + + if(!isVisible) + { + requestedPage.current.requestById = id; + + setIsVisible(true); + } + else + { + const node = getNodeById(id, rootNode); + + if(node) activateNode(node); + } + }, [ isVisible, rootNode, getNodeById, activateNode ]); + + const openPageByName = useCallback((name: string) => + { + setSearchResult(null); + + if(!isVisible) + { + requestedPage.current.requestByName = name; + + setIsVisible(true); + } + else + { + const node = getNodeByName(name, rootNode); + + if(node) activateNode(node); + } + }, [ isVisible, rootNode, getNodeByName, activateNode ]); + + const openPageByOfferId = useCallback((offerId: number) => + { + setSearchResult(null); + + if(!isVisible) + { + requestedPage.current.requestedByOfferId = offerId; + + setIsVisible(true); + } + else + { + const nodes = getNodesByOfferId(offerId); + + if(!nodes || !nodes.length) return; + + activateNode(nodes[0], offerId); + } + }, [ isVisible, getNodesByOfferId, activateNode ]); + + const refreshBuilderStatus = useCallback(() => + { + + }, []); + + useMessageEvent(CatalogPagesListEvent, event => + { + const parser = event.getParser(); + const offers: Map = new Map(); + + const getCatalogNode = (node: NodeData, depth: number, parent: ICatalogNode) => + { + const catalogNode = (new CatalogNode(node, depth, parent) as ICatalogNode); + + for(const offerId of catalogNode.offerIds) + { + if(offers.has(offerId)) offers.get(offerId).push(catalogNode); + else offers.set(offerId, [ catalogNode ]); + } + + depth++; + + for(const child of node.children) catalogNode.addChild(getCatalogNode(child, depth, catalogNode)); + + return catalogNode; + } + + setRootNode(getCatalogNode(parser.root, 0, null)); + setOffersToNodes(offers); + }); + + useMessageEvent(CatalogPageMessageEvent, event => + { + const parser = event.getParser(); + + if(parser.catalogType !== currentType) return; + + const purchasableOffers: IPurchasableOffer[] = []; + + for(const offer of parser.offers) + { + const products: IProduct[] = []; + const productData = GetProductDataForLocalization(offer.localizationId); + + for(const product of offer.products) + { + const furnitureData = GetFurnitureData(product.furniClassId, product.productType); + + products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft)); + } + + if(!products.length) continue; + + const purchasableOffer = new Offer(offer.offerId, offer.localizationId, offer.rent, offer.priceCredits, offer.priceActivityPoints, offer.priceActivityPointsType, offer.giftable, offer.clubLevel, products, offer.bundlePurchaseAllowed); + + if((currentType === CatalogType.NORMAL) || ((purchasableOffer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (purchasableOffer.pricingModel !== Offer.PRICING_MODEL_MULTI))) purchasableOffers.push(purchasableOffer); + } + + if(parser.frontPageItems && parser.frontPageItems.length) setFrontPageItems(parser.frontPageItems); + + setIsBusy(false); + + if(pageId === parser.pageId) + { + showCatalogPage(parser.pageId, parser.layoutCode, new PageLocalization(parser.localization.images.concat(), parser.localization.texts.concat()), purchasableOffers, parser.offerId, parser.acceptSeasonCurrencyAsCredits); + } + }); + + useMessageEvent(PurchaseOKMessageEvent, event => + { + const parser = event.getParser(); + + DispatchUiEvent(new CatalogPurchasedEvent(parser.offer)); + }); + + useMessageEvent(PurchaseErrorMessageEvent, event => + { + const parser = event.getParser(); + + DispatchUiEvent(new CatalogPurchaseFailureEvent(parser.code)); + }); + + useMessageEvent(PurchaseNotAllowedMessageEvent, event => + { + const parser = event.getParser(); + + DispatchUiEvent(new CatalogPurchaseNotAllowedEvent(parser.code)); + }); + + useMessageEvent(LimitedEditionSoldOutEvent, event => + { + const parser = event.getParser(); + + DispatchUiEvent(new CatalogPurchaseSoldOutEvent()); + }); + + useMessageEvent(ProductOfferEvent, event => + { + const parser = event.getParser(); + const offerData = parser.offer; + + if(!offerData || !offerData.products.length) return; + + const offerProductData = offerData.products[0]; + + if(offerProductData.uniqueLimitedItem) + { + // update unique + } + + const products: IProduct[] = []; + const productData = GetProductDataForLocalization(offerData.localizationId); + + for(const product of offerData.products) + { + const furnitureData = GetFurnitureData(product.furniClassId, product.productType); + + products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft)); + } + + const offer = new Offer(offerData.offerId, offerData.localizationId, offerData.rent, offerData.priceCredits, offerData.priceActivityPoints, offerData.priceActivityPointsType, offerData.giftable, offerData.clubLevel, products, offerData.bundlePurchaseAllowed); + + if(!((currentType === CatalogType.NORMAL) || ((offer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (offer.pricingModel !== Offer.PRICING_MODEL_MULTI)))) return; + + offer.page = currentPage; + + setCurrentOffer(offer); + + if(offer.product && (offer.product.productType === ProductTypeEnum.WALL)) + { + setPurchaseOptions(prevValue => + { + const newValue = { ...prevValue }; + + newValue.extraData =( offer.product.extraParam || null); + + return newValue; + }); + } + + // (this._isObjectMoverRequested) && (this._purchasableOffer) + }); + + useMessageEvent(SellablePetPalettesMessageEvent, event => + { + const parser = event.getParser(); + const petPalette = new CatalogPetPalette(parser.productCode, parser.palettes.slice()); + + setCatalogOptions(prevValue => + { + const petPalettes = []; + + if(prevValue.petPalettes) petPalettes.push(...prevValue.petPalettes); + + for(let i = 0; i < petPalettes.length; i++) + { + const palette = petPalettes[i]; + + if(palette.breed === petPalette.breed) + { + petPalettes.splice(i, 1); + + break; + } + } + + petPalettes.push(petPalette); + + return { ...prevValue, petPalettes }; + }); + }); + + useMessageEvent(HabboClubOffersMessageEvent, event => + { + const parser = event.getParser(); + + setCatalogOptions(prevValue => + { + const clubOffers = parser.offers; + + return { ...prevValue, clubOffers }; + }); + }); + + useMessageEvent(GuildMembershipsMessageEvent, event => + { + const parser = event.getParser(); + + setCatalogOptions(prevValue => + { + const groups = parser.groups; + + return { ...prevValue, groups }; + }); + }); + + useMessageEvent(GiftWrappingConfigurationEvent, event => + { + const parser = event.getParser(); + + setCatalogOptions(prevValue => + { + const giftConfiguration = new GiftWrappingConfiguration(parser); + + return { ...prevValue, giftConfiguration }; + }); + }); + + useMessageEvent(MarketplaceMakeOfferResult, event => + { + const parser = event.getParser(); + + if(!parser) return; + + let title = ''; + if(parser.result === 1) + { + title = LocalizeText('inventory.marketplace.result.title.success'); + } + else + { + title = LocalizeText('inventory.marketplace.result.title.failure'); + } + + const message = LocalizeText(`inventory.marketplace.result.${ parser.result }`); + + simpleAlert(message, NotificationAlertType.DEFAULT, null, null, title); + }); + + useMessageEvent(ClubGiftInfoEvent, event => + { + const parser = event.getParser(); + + setCatalogOptions(prevValue => + { + const clubGifts = parser; + + return { ...prevValue, clubGifts }; + }); + }); + + useMessageEvent(CatalogPublishedMessageEvent, event => + { + const wasVisible = isVisible; + + resetState(); + + if(wasVisible) simpleAlert(LocalizeText('catalog.alert.published.description'), NotificationAlertType.ALERT, null, null, LocalizeText('catalog.alert.published.title')); + }); + + useMessageEvent(BuildersClubFurniCountMessageEvent, event => + { + const parser = event.getParser(); + + setFurniCount(parser.furniCount); + + refreshBuilderStatus(); + }); + + useMessageEvent(BuildersClubSubscriptionStatusMessageEvent, event => + { + const parser = event.getParser(); + + setFurniLimit(parser._Str_15864); + setMaxFurniLimit(parser._Str_24094); + setSecondsLeft(parser._Str_3709); + setUpdateTime(GetNitroInstance().time); + setSecondsLeftWithGrace(parser._Str_24379); + + refreshBuilderStatus(); + }); + + useUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, event => PlaySound(SoundNames.CREDITS)); + + useRoomEngineEvent(RoomEngineObjectPlacedEvent.PLACED, event => + { + if(!objectMoverRequested || (event.type !== RoomEngineObjectPlacedEvent.PLACED)) return; + + resetPlacedOfferData(true); + + if(!purchasableOffer) + { + resetObjectMover(); + + return; + } + + let placed = false; + + const product = purchasableOffer.product; + + if(event.category === RoomObjectCategory.WALL) + { + switch(product.furnitureData.className) + { + case 'floor': + case 'wallpaper': + case 'landscape': + placed = (event.placedOnFloor || event.placedOnWall); + break; + default: + placed = event.placedInRoom; + break; + } + } + else + { + placed = event.placedInRoom; + } + + if(!placed) + { + resetObjectMover(); + + return; + } + + setPlacedObjectPurchaseData(new PlacedObjectPurchaseData(event.roomId, event.objectId, event.category, event.wallLocation, event.x, event.y, event.direction, purchasableOffer)); + + switch(currentType) + { + case CatalogType.NORMAL: { + switch(event.category) + { + case RoomObjectCategory.FLOOR: + GetRoomEngine().addFurnitureFloor(event.roomId, event.objectId, product.productClassId, new Vector3d(event.x, event.y, event.z), new Vector3d(event.direction), 0, new LegacyDataType()); + break; + case RoomObjectCategory.WALL: { + switch(product.furnitureData.className) + { + case 'floor': + case 'wallpaper': + case 'landscape': + resetRoomPaint(product.furnitureData.className, product.extraParam); + break; + default: + GetRoomEngine().addFurnitureWall(event.roomId, event.objectId, product.productClassId, new Vector3d(event.x, event.y, event.z), new Vector3d(event.direction * 45), 0, event.instanceData, 0); + break; + } + } + } + + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(roomObject) roomObject.model.setValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER, 0.5); + + if(catalogSkipPurchaseConfirmation) + { + SendMessageComposer(new PurchaseFromCatalogComposer(pageId, purchasableOffer.offerId, product.extraParam, 1)); + + if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); + } + else + { + // confirm + + if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); + } + break; + } + case CatalogType.BUILDER: { + let pageId = purchasableOffer.page.pageId; + + if(pageId === DUMMY_PAGE_ID_FOR_OFFER_SEARCH) + { + pageId = -1; + } + + switch(event.category) + { + case RoomObjectCategory.FLOOR: + SendMessageComposer(new BuildersClubPlaceRoomItemMessageComposer(pageId, purchasableOffer.offerId, product.extraParam, event.x, event.y, event.direction)); + break; + case RoomObjectCategory.WALL: + SendMessageComposer(new BuildersClubPlaceWallItemMessageComposer(pageId, purchasableOffer.offerId, product.extraParam, event.wallLocation)); + break; + } + + if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); + break; + } + } + }); + + useUiEvent(InventoryFurniAddedEvent.FURNI_ADDED, event => + { + const roomEngine = GetRoomEngine(); + + if(!placedObjectPurchaseData || (placedObjectPurchaseData.productClassId !== event.spriteId) || (placedObjectPurchaseData.roomId !== roomEngine.activeRoomId)) return; + + switch(event.category) + { + case FurniCategory.FLOOR: { + const floorType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_FLOOR_TYPE); + + if(placedObjectPurchaseData.extraParam !== floorType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); + break; + } + case FurniCategory.WALL_PAPER: { + const wallType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_WALL_TYPE); + + if(placedObjectPurchaseData.extraParam !== wallType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); + break; + } + case FurniCategory.LANDSCAPE: { + const landscapeType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_LANDSCAPE_TYPE); + + if(placedObjectPurchaseData.extraParam !== landscapeType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); + break; + } + default: + SendMessageComposer(new FurniturePlaceComposer(event.id, placedObjectPurchaseData.category, placedObjectPurchaseData.wallLocation, placedObjectPurchaseData.x, placedObjectPurchaseData.y, placedObjectPurchaseData.direction)); + } + + if(!catalogPlaceMultipleObjects) resetPlacedOfferData(); + }); + + useEffect(() => + { + return () => setCurrentOffer(null); + }, [ currentPage ]); + + useEffect(() => + { + if(!isVisible || !rootNode || !requestedPage.current) return; + + switch(requestedPage.current.requestType) + { + case RequestedPage.REQUEST_TYPE_NONE: + if(currentPage) return; + + if(rootNode.isBranch) + { + for(const child of rootNode.children) + { + if(child && child.isVisible) + { + activateNode(child); + + return; + } + } + } + return; + case RequestedPage.REQUEST_TYPE_ID: + openPageById(requestedPage.current.requestById); + requestedPage.current.resetRequest(); + return; + case RequestedPage.REQUEST_TYPE_OFFER: + openPageByOfferId(requestedPage.current.requestedByOfferId); + requestedPage.current.resetRequest(); + return; + case RequestedPage.REQUEST_TYPE_NAME: + openPageByName(requestedPage.current.requestByName); + requestedPage.current.resetRequest(); + return; + } + }, [ isVisible, rootNode, currentPage, activateNode, openPageById, openPageByOfferId, openPageByName ]); + + useEffect(() => + { + if(!searchResult && currentPage && (currentPage.pageId === -1)) openPageById(previousPageId); + }, [ searchResult, currentPage, previousPageId, openPageById ]); + + useEffect(() => + { + if(!isVisible || rootNode) return; + + SendMessageComposer(new GetGiftWrappingConfigurationComposer()); + SendMessageComposer(new GetClubGiftInfo()); + SendMessageComposer(new GetCatalogIndexComposer(currentType)); + SendMessageComposer(new BuildersClubQueryFurniCountMessageComposer()); + }, [ isVisible, rootNode, currentType ]); + + useEffect(() => + { + setRoomPreviewer(new RoomPreviewer(GetRoomEngine(), ++RoomPreviewer.PREVIEW_COUNTER)); + + return () => + { + setRoomPreviewer(prevValue => + { + prevValue.dispose(); + + return null; + }); + } + }, []); + + return { isVisible, setIsVisible, isBusy, pageId, previousPageId, currentType, rootNode, offersToNodes, currentPage, setCurrentPage, currentOffer, setCurrentOffer, activeNodes, searchResult, setSearchResult, frontPageItems, roomPreviewer, navigationHidden, setNavigationHidden, purchaseOptions, setPurchaseOptions, catalogOptions, setCatalogOptions, getNodeById, getNodeByName, activateNode, openPageById, openPageByName, openPageByOfferId, requestOfferToMover }; +} + +export const useCatalog = () => useBetween(useCatalogState); diff --git a/src/hooks/catalog/useCatalogPlaceMultipleItems.ts b/src/hooks/catalog/useCatalogPlaceMultipleItems.ts new file mode 100644 index 00000000..39cfd28c --- /dev/null +++ b/src/hooks/catalog/useCatalogPlaceMultipleItems.ts @@ -0,0 +1,7 @@ +import { useBetween } from 'use-between'; +import { LocalStorageKeys } from '../../api'; +import { useLocalStorage } from '../useLocalStorage'; + +const useCatalogPlaceMultipleItemsState = () => useLocalStorage(LocalStorageKeys.CATALOG_PLACE_MULTIPLE_OBJECTS, false); + +export const useCatalogPlaceMultipleItems = () => useBetween(useCatalogPlaceMultipleItemsState); diff --git a/src/hooks/catalog/useCatalogSkipPurchaseConfirmation.ts b/src/hooks/catalog/useCatalogSkipPurchaseConfirmation.ts new file mode 100644 index 00000000..b2d69a2a --- /dev/null +++ b/src/hooks/catalog/useCatalogSkipPurchaseConfirmation.ts @@ -0,0 +1,7 @@ +import { useBetween } from 'use-between'; +import { LocalStorageKeys } from '../../api'; +import { useLocalStorage } from '../useLocalStorage'; + +const useCatalogSkipPurchaseConfirmationState = () => useLocalStorage(LocalStorageKeys.CATALOG_SKIP_PURCHASE_CONFIRMATION, false); + +export const useCatalogSkipPurchaseConfirmation = () => useBetween(useCatalogSkipPurchaseConfirmationState); diff --git a/src/hooks/chat-history/index.ts b/src/hooks/chat-history/index.ts new file mode 100644 index 00000000..970d90f2 --- /dev/null +++ b/src/hooks/chat-history/index.ts @@ -0,0 +1 @@ +export * from './useChatHistory'; diff --git a/src/hooks/chat-history/useChatHistory.ts b/src/hooks/chat-history/useChatHistory.ts new file mode 100644 index 00000000..7b7292fb --- /dev/null +++ b/src/hooks/chat-history/useChatHistory.ts @@ -0,0 +1,117 @@ +import { GetGuestRoomResultEvent, NewConsoleMessageEvent, RoomInviteEvent, RoomSessionChatEvent, RoomSessionEvent } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { useBetween } from 'use-between'; +import { ChatEntryType, ChatHistoryCurrentDate, GetRoomSession, IChatEntry, IRoomHistoryEntry, MessengerHistoryCurrentDate } from '../../api'; +import { useMessageEvent, useRoomSessionManagerEvent } from '../events'; + +const CHAT_HISTORY_MAX = 1000; +const ROOM_HISTORY_MAX = 10; +const MESSENGER_HISTORY_MAX = 1000; + +let CHAT_HISTORY_COUNTER: number = 0; +let MESSENGER_HISTORY_COUNTER: number = 0; + +const useChatHistoryState = () => +{ + const [ chatHistory, setChatHistory ] = useState([]); + const [ roomHistory, setRoomHistory ] = useState([]); + const [ messengerHistory, setMessengerHistory ] = useState([]); + const [ needsRoomInsert, setNeedsRoomInsert ] = useState(false); + + const addChatEntry = (entry: IChatEntry) => + { + entry.id = CHAT_HISTORY_COUNTER++; + + setChatHistory(prevValue => + { + const newValue = [ ...prevValue ]; + + newValue.push(entry); + + if(newValue.length > CHAT_HISTORY_MAX) newValue.shift(); + + return newValue; + }); + } + + const addRoomHistoryEntry = (entry: IRoomHistoryEntry) => + { + setRoomHistory(prevValue => + { + const newValue = [ ...prevValue ]; + + newValue.push(entry); + + if(newValue.length > ROOM_HISTORY_MAX) newValue.shift(); + + return newValue; + }); + } + + const addMessengerEntry = (entry: IChatEntry) => + { + entry.id = MESSENGER_HISTORY_COUNTER++; + + setMessengerHistory(prevValue => + { + const newValue = [ ...prevValue ]; + + newValue.push(entry); + + if(newValue.length > MESSENGER_HISTORY_MAX) newValue.shift(); + + return newValue; + }); + } + + useRoomSessionManagerEvent(RoomSessionChatEvent.CHAT_EVENT, event => + { + const roomSession = GetRoomSession(); + + if(!roomSession) return; + + const userData = roomSession.userDataManager.getUserDataByIndex(event.objectId); + + if(!userData) return; + + addChatEntry({ id: -1, entityId: userData.webID, name: userData.name, look: userData.figure, entityType: userData.type, message: event.message, timestamp: ChatHistoryCurrentDate(), type: ChatEntryType.TYPE_CHAT, roomId: roomSession.roomId }); + }); + + useRoomSessionManagerEvent(RoomSessionEvent.STARTED, event => setNeedsRoomInsert(true)); + + useMessageEvent(GetGuestRoomResultEvent, event => + { + if(!needsRoomInsert) return; + + const parser = event.getParser(); + + if(roomHistory.length) + { + if(roomHistory[(roomHistory.length - 1)].id === parser.data.roomId) return; + } + + addChatEntry({ id: -1, entityId: parser.data.roomId, name: parser.data.roomName, timestamp: ChatHistoryCurrentDate(), type: ChatEntryType.TYPE_ROOM_INFO, roomId: parser.data.roomId }); + + addRoomHistoryEntry({ id: parser.data.roomId, name: parser.data.roomName }); + + setNeedsRoomInsert(false); + }); + + useMessageEvent(NewConsoleMessageEvent, event => + { + const parser = event.getParser(); + + addMessengerEntry({ id: -1, entityId: parser.senderId, name: '', message: parser.messageText, roomId: -1, timestamp: MessengerHistoryCurrentDate(parser.secondsSinceSent), type: ChatEntryType.TYPE_IM }); + }); + + useMessageEvent(RoomInviteEvent, event => + { + const parser = event.getParser(); + + addMessengerEntry({ id: -1, entityId: parser.senderId, name: '', message: parser.messageText, roomId: -1, timestamp: MessengerHistoryCurrentDate(), type: ChatEntryType.TYPE_IM }); + }); + + return { chatHistory, roomHistory, messengerHistory }; +} + +export const useChatHistory = () => useBetween(useChatHistoryState); diff --git a/src/hooks/events/DispatchEventHook.ts b/src/hooks/events/DispatchEventHook.ts deleted file mode 100644 index 97d291fc..00000000 --- a/src/hooks/events/DispatchEventHook.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { IEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer'; - -export const DispatchEventHook = (eventDispatcher: IEventDispatcher, event: NitroEvent) => eventDispatcher.dispatchEvent(event); diff --git a/src/hooks/events/UseEventDispatcherHook.tsx b/src/hooks/events/UseEventDispatcherHook.tsx deleted file mode 100644 index 36664c1c..00000000 --- a/src/hooks/events/UseEventDispatcherHook.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { IEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer'; -import { useEffect } from 'react'; - -export const UseEventDispatcherHook = (type: string, eventDispatcher: IEventDispatcher, handler: (event: NitroEvent) => void) => -{ - useEffect(() => - { - eventDispatcher.addEventListener(type, handler); - - return () => eventDispatcher.removeEventListener(type, handler); - }, [ type, eventDispatcher, handler ]); -} diff --git a/src/hooks/events/core/UseCommunicationEvent.tsx b/src/hooks/events/core/UseCommunicationEvent.tsx deleted file mode 100644 index ee196afb..00000000 --- a/src/hooks/events/core/UseCommunicationEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetCommunication } from '../../../api'; -import { UseEventDispatcherHook } from '../UseEventDispatcherHook'; - -export const UseCommunicationEvent = (type: string, handler: (event: NitroEvent) => void) => UseEventDispatcherHook(type, GetCommunication().events, handler); diff --git a/src/hooks/events/core/UseConfigurationEvent.tsx b/src/hooks/events/core/UseConfigurationEvent.tsx deleted file mode 100644 index 2abbad07..00000000 --- a/src/hooks/events/core/UseConfigurationEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetConfigurationManager } from '../../../api'; -import { UseEventDispatcherHook } from '../UseEventDispatcherHook'; - -export const UseConfigurationEvent = (type: string, handler: (event: NitroEvent) => void) => UseEventDispatcherHook(type, GetConfigurationManager().events, handler); diff --git a/src/hooks/events/core/index.ts b/src/hooks/events/core/index.ts index eca8c2d4..b69a57e3 100644 --- a/src/hooks/events/core/index.ts +++ b/src/hooks/events/core/index.ts @@ -1,2 +1,2 @@ -export * from './UseCommunicationEvent'; -export * from './UseConfigurationEvent'; +export * from './useCommunicationEvent'; +export * from './useConfigurationEvent'; diff --git a/src/hooks/events/core/useCommunicationEvent.tsx b/src/hooks/events/core/useCommunicationEvent.tsx new file mode 100644 index 00000000..83d6ed5c --- /dev/null +++ b/src/hooks/events/core/useCommunicationEvent.tsx @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { GetCommunication } from '../../../api'; +import { useEventDispatcher } from '../useEventDispatcher'; + +export const useCommunicationEvent = (type: string | string[], handler: (event: T) => void) => useEventDispatcher(type, GetCommunication().events, handler); diff --git a/src/hooks/events/core/useConfigurationEvent.tsx b/src/hooks/events/core/useConfigurationEvent.tsx new file mode 100644 index 00000000..617e9a23 --- /dev/null +++ b/src/hooks/events/core/useConfigurationEvent.tsx @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { GetConfigurationManager } from '../../../api'; +import { useEventDispatcher } from '../useEventDispatcher'; + +export const useConfigurationEvent = (type: string | string[], handler: (event: T) => void) => useEventDispatcher(type, GetConfigurationManager().events, handler); diff --git a/src/hooks/events/index.ts b/src/hooks/events/index.ts index 2d7040fe..cafd7933 100644 --- a/src/hooks/events/index.ts +++ b/src/hooks/events/index.ts @@ -1,5 +1,5 @@ export * from './core'; -export * from './DispatchEventHook'; export * from './nitro'; -export * from './ui'; -export * from './UseEventDispatcherHook'; +export * from './useEventDispatcher'; +export * from './useMessageEvent'; +export * from './useUiEvent'; diff --git a/src/hooks/events/nitro/DispatchMainEvent.ts b/src/hooks/events/nitro/DispatchMainEvent.ts deleted file mode 100644 index d212c666..00000000 --- a/src/hooks/events/nitro/DispatchMainEvent.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../../../api'; -import { DispatchEventHook } from '../DispatchEventHook'; - -export const DispatchMainEvent = (event: NitroEvent) => DispatchEventHook(GetNitroInstance().events, event); diff --git a/src/hooks/events/nitro/UseAvatarEvent.tsx b/src/hooks/events/nitro/UseAvatarEvent.tsx deleted file mode 100644 index a7eed8a0..00000000 --- a/src/hooks/events/nitro/UseAvatarEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetAvatarRenderManager } from '../../../api'; -import { UseEventDispatcherHook } from '../UseEventDispatcherHook'; - -export const UseAvatarEvent = (type: string, handler: (event: NitroEvent) => void) => UseEventDispatcherHook(type, GetAvatarRenderManager().events, handler); diff --git a/src/hooks/events/nitro/UseCameraEvent.tsx b/src/hooks/events/nitro/UseCameraEvent.tsx deleted file mode 100644 index 635b4879..00000000 --- a/src/hooks/events/nitro/UseCameraEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../../../api'; -import { UseEventDispatcherHook } from '../UseEventDispatcherHook'; - -export const UseCameraEvent = (type: string, handler: (event: NitroEvent) => void) => UseEventDispatcherHook(type, GetNitroInstance().cameraManager.events, handler); diff --git a/src/hooks/events/nitro/UseLocalizationEvent.tsx b/src/hooks/events/nitro/UseLocalizationEvent.tsx deleted file mode 100644 index 5bd91090..00000000 --- a/src/hooks/events/nitro/UseLocalizationEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../../../api'; -import { UseEventDispatcherHook } from '../UseEventDispatcherHook'; - -export const UseLocalizationEvent = (type: string, handler: (event: NitroEvent) => void) => UseEventDispatcherHook(type, GetNitroInstance().localization.events, handler); diff --git a/src/hooks/events/nitro/UseMainEvent.tsx b/src/hooks/events/nitro/UseMainEvent.tsx deleted file mode 100644 index 41f8203b..00000000 --- a/src/hooks/events/nitro/UseMainEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../../../api'; -import { UseEventDispatcherHook } from '../UseEventDispatcherHook'; - -export const UseMainEvent = (type: string, handler: (event: NitroEvent) => void) => UseEventDispatcherHook(type, GetNitroInstance().events, handler); diff --git a/src/hooks/events/nitro/UseRoomEngineEvent.tsx b/src/hooks/events/nitro/UseRoomEngineEvent.tsx deleted file mode 100644 index e0c4b547..00000000 --- a/src/hooks/events/nitro/UseRoomEngineEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../../../api'; -import { UseEventDispatcherHook } from '../UseEventDispatcherHook'; - -export const UseRoomEngineEvent = (type: string, handler: (event: NitroEvent) => void) => UseEventDispatcherHook(type, GetRoomEngine().events, handler); diff --git a/src/hooks/events/nitro/UseRoomSessionManagerEvent.tsx b/src/hooks/events/nitro/UseRoomSessionManagerEvent.tsx deleted file mode 100644 index 02d65be7..00000000 --- a/src/hooks/events/nitro/UseRoomSessionManagerEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetRoomSessionManager } from '../../../api'; -import { UseEventDispatcherHook } from '../UseEventDispatcherHook'; - -export const UseRoomSessionManagerEvent = (type: string, handler: (event: NitroEvent) => void) => UseEventDispatcherHook(type, GetRoomSessionManager().events, handler); diff --git a/src/hooks/events/nitro/UseSessionDataManagerEvent.tsx b/src/hooks/events/nitro/UseSessionDataManagerEvent.tsx deleted file mode 100644 index 79f4267d..00000000 --- a/src/hooks/events/nitro/UseSessionDataManagerEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetSessionDataManager } from '../../../api'; -import { UseEventDispatcherHook } from '../UseEventDispatcherHook'; - -export const UseSessionDataManagerEvent = (type: string, handler: (event: NitroEvent) => void) => UseEventDispatcherHook(type, GetSessionDataManager().events, handler); diff --git a/src/hooks/events/nitro/index.ts b/src/hooks/events/nitro/index.ts index 56862a78..82431221 100644 --- a/src/hooks/events/nitro/index.ts +++ b/src/hooks/events/nitro/index.ts @@ -1,8 +1,7 @@ -export * from './DispatchMainEvent'; -export * from './UseAvatarEvent'; -export * from './UseCameraEvent'; -export * from './UseLocalizationEvent'; -export * from './UseMainEvent'; -export * from './UseRoomEngineEvent'; -export * from './UseRoomSessionManagerEvent'; -export * from './UseSessionDataManagerEvent'; +export * from './useAvatarEvent'; +export * from './useCameraEvent'; +export * from './useLocalizationEvent'; +export * from './useMainEvent'; +export * from './useRoomEngineEvent'; +export * from './useRoomSessionManagerEvent'; +export * from './useSessionDataManagerEvent'; diff --git a/src/hooks/events/nitro/useAvatarEvent.tsx b/src/hooks/events/nitro/useAvatarEvent.tsx new file mode 100644 index 00000000..9212a688 --- /dev/null +++ b/src/hooks/events/nitro/useAvatarEvent.tsx @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { GetAvatarRenderManager } from '../../../api'; +import { useEventDispatcher } from '../useEventDispatcher'; + +export const useAvatarEvent = (type: string | string[], handler: (event: T) => void) => useEventDispatcher(type, GetAvatarRenderManager().events, handler); diff --git a/src/hooks/events/nitro/useCameraEvent.tsx b/src/hooks/events/nitro/useCameraEvent.tsx new file mode 100644 index 00000000..42bee39e --- /dev/null +++ b/src/hooks/events/nitro/useCameraEvent.tsx @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { GetNitroInstance } from '../../../api'; +import { useEventDispatcher } from '../useEventDispatcher'; + +export const useCameraEvent = (type: string | string[], handler: (event: T) => void) => useEventDispatcher(type, GetNitroInstance().cameraManager.events, handler); diff --git a/src/hooks/events/nitro/useLocalizationEvent.tsx b/src/hooks/events/nitro/useLocalizationEvent.tsx new file mode 100644 index 00000000..0dccbdc6 --- /dev/null +++ b/src/hooks/events/nitro/useLocalizationEvent.tsx @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { GetNitroInstance } from '../../../api'; +import { useEventDispatcher } from '../useEventDispatcher'; + +export const useLocalizationEvent = (type: string | string[], handler: (event: T) => void) => useEventDispatcher(type, GetNitroInstance().localization.events, handler); diff --git a/src/hooks/events/nitro/useMainEvent.tsx b/src/hooks/events/nitro/useMainEvent.tsx new file mode 100644 index 00000000..8a2ad8b9 --- /dev/null +++ b/src/hooks/events/nitro/useMainEvent.tsx @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { GetNitroInstance } from '../../../api'; +import { useEventDispatcher } from '../useEventDispatcher'; + +export const useMainEvent = (type: string | string[], handler: (event: T) => void) => useEventDispatcher(type, GetNitroInstance().events, handler); diff --git a/src/hooks/events/nitro/useRoomEngineEvent.tsx b/src/hooks/events/nitro/useRoomEngineEvent.tsx new file mode 100644 index 00000000..6d2d4199 --- /dev/null +++ b/src/hooks/events/nitro/useRoomEngineEvent.tsx @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { GetRoomEngine } from '../../../api'; +import { useEventDispatcher } from '../useEventDispatcher'; + +export const useRoomEngineEvent = (type: string | string[], handler: (event: T) => void) => useEventDispatcher(type, GetRoomEngine().events, handler); diff --git a/src/hooks/events/nitro/useRoomSessionManagerEvent.tsx b/src/hooks/events/nitro/useRoomSessionManagerEvent.tsx new file mode 100644 index 00000000..5cccb98c --- /dev/null +++ b/src/hooks/events/nitro/useRoomSessionManagerEvent.tsx @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { GetRoomSessionManager } from '../../../api'; +import { useEventDispatcher } from '../useEventDispatcher'; + +export const useRoomSessionManagerEvent = (type: string | string[], handler: (event: T) => void) => useEventDispatcher(type, GetRoomSessionManager().events, handler); diff --git a/src/hooks/events/nitro/useSessionDataManagerEvent.tsx b/src/hooks/events/nitro/useSessionDataManagerEvent.tsx new file mode 100644 index 00000000..fa49271a --- /dev/null +++ b/src/hooks/events/nitro/useSessionDataManagerEvent.tsx @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { GetSessionDataManager } from '../../../api'; +import { useEventDispatcher } from '../useEventDispatcher'; + +export const useSessionDataManagerEvent = (type: string | string, handler: (event: T) => void) => useEventDispatcher(type, GetSessionDataManager().events, handler); diff --git a/src/hooks/events/ui/DispatchUiEvent.ts b/src/hooks/events/ui/DispatchUiEvent.ts deleted file mode 100644 index bd88e3ba..00000000 --- a/src/hooks/events/ui/DispatchUiEvent.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { DispatchEventHook } from '../DispatchEventHook'; -import { UI_EVENT_DISPATCHER } from './UiEventDispatcher'; - -export const DispatchUiEvent = (event: NitroEvent) => DispatchEventHook(UI_EVENT_DISPATCHER, event); diff --git a/src/hooks/events/ui/UseUiEvent.tsx b/src/hooks/events/ui/UseUiEvent.tsx deleted file mode 100644 index 56797d8f..00000000 --- a/src/hooks/events/ui/UseUiEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { UseEventDispatcherHook } from '../UseEventDispatcherHook'; -import { UI_EVENT_DISPATCHER } from './UiEventDispatcher'; - -export const UseUiEvent = (type: string, handler: (event: NitroEvent) => void) => UseEventDispatcherHook(type, UI_EVENT_DISPATCHER, handler); diff --git a/src/hooks/events/ui/index.ts b/src/hooks/events/ui/index.ts deleted file mode 100644 index 5da2c747..00000000 --- a/src/hooks/events/ui/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './DispatchUiEvent'; -export * from './UiEventDispatcher'; -export * from './UseUiEvent'; diff --git a/src/hooks/events/useEventDispatcher.tsx b/src/hooks/events/useEventDispatcher.tsx new file mode 100644 index 00000000..60555f2e --- /dev/null +++ b/src/hooks/events/useEventDispatcher.tsx @@ -0,0 +1,31 @@ +import { IEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer'; +import { useEffect } from 'react'; + +export const useEventDispatcher = (type: string | string[], eventDispatcher: IEventDispatcher, handler: (event: T) => void, enabled: boolean = true) => +{ + useEffect(() => + { + if(!enabled) return; + + if(Array.isArray(type)) + { + type.map(name => eventDispatcher.addEventListener(name, handler)); + } + else + { + eventDispatcher.addEventListener(type, handler); + } + + return () => + { + if(Array.isArray(type)) + { + type.map(name => eventDispatcher.removeEventListener(name, handler)); + } + else + { + eventDispatcher.removeEventListener(type, handler); + } + } + }, [ type, eventDispatcher, enabled, handler ]); +} diff --git a/src/hooks/messages/UseMessageEventHook.tsx b/src/hooks/events/useMessageEvent.tsx similarity index 77% rename from src/hooks/messages/UseMessageEventHook.tsx rename to src/hooks/events/useMessageEvent.tsx index cc785573..3a62ebe4 100644 --- a/src/hooks/messages/UseMessageEventHook.tsx +++ b/src/hooks/events/useMessageEvent.tsx @@ -2,7 +2,7 @@ import { IMessageEvent, MessageEvent } from '@nitrots/nitro-renderer'; import { useEffect } from 'react'; import { GetCommunication } from '../../api'; -export function UseMessageEventHook(eventType: typeof MessageEvent, handler: (event: IMessageEvent) => void): void +export const useMessageEvent = (eventType: typeof MessageEvent, handler: (event: T) => void) => { useEffect(() => { diff --git a/src/hooks/events/useUiEvent.tsx b/src/hooks/events/useUiEvent.tsx new file mode 100644 index 00000000..02c0aff4 --- /dev/null +++ b/src/hooks/events/useUiEvent.tsx @@ -0,0 +1,5 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; +import { UI_EVENT_DISPATCHER } from '../../api'; +import { useEventDispatcher } from './useEventDispatcher'; + +export const useUiEvent = (type: string | string[], handler: (event: T) => void, enabled: boolean = true) => useEventDispatcher(type, UI_EVENT_DISPATCHER, handler, enabled); diff --git a/src/hooks/friends/index.ts b/src/hooks/friends/index.ts new file mode 100644 index 00000000..45c983f9 --- /dev/null +++ b/src/hooks/friends/index.ts @@ -0,0 +1,2 @@ +export * from './useFriends'; +export * from './useMessenger'; diff --git a/src/hooks/friends/useFriends.ts b/src/hooks/friends/useFriends.ts new file mode 100644 index 00000000..05437b2a --- /dev/null +++ b/src/hooks/friends/useFriends.ts @@ -0,0 +1,266 @@ +import { AcceptFriendMessageComposer, DeclineFriendMessageComposer, FollowFriendMessageComposer, FriendListFragmentEvent, FriendListUpdateComposer, FriendListUpdateEvent, FriendParser, FriendRequestsEvent, GetFriendRequestsComposer, MessengerInitComposer, MessengerInitEvent, NewFriendRequestEvent, RequestFriendComposer, SetRelationshipStatusComposer } from '@nitrots/nitro-renderer'; +import { useEffect, useMemo, useState } from 'react'; +import { useBetween } from 'use-between'; +import { CloneObject, GetSessionDataManager, MessengerFriend, MessengerRequest, MessengerSettings, SendMessageComposer } from '../../api'; +import { useMessageEvent } from '../events'; + +const useFriendsState = () => +{ + const [ friends, setFriends ] = useState([]); + const [ requests, setRequests ] = useState([]); + const [ sentRequests, setSentRequests ] = useState([]); + const [ dismissedRequestIds, setDismissedRequestIds ] = useState([]); + const [ settings, setSettings ] = useState(null); + + const onlineFriends = useMemo(() => + { + const onlineFriends = friends.filter(friend => friend.online); + + onlineFriends.sort((a, b) => + { + if( a.name < b.name ) return -1; + + if( a.name > b.name ) return 1; + + return 0; + }); + + return onlineFriends; + }, [ friends ]); + + const offlineFriends = useMemo(() => + { + const offlineFriends = friends.filter(friend => !friend.online); + + offlineFriends.sort((a, b) => + { + if( a.name < b.name ) return -1; + + if( a.name > b.name ) return 1; + + return 0; + }); + + return offlineFriends; + }, [ friends ]); + + const followFriend = (friend: MessengerFriend) => SendMessageComposer(new FollowFriendMessageComposer(friend.id)); + + const updateRelationship = (friend: MessengerFriend, type: number) => ((type !== friend.relationshipStatus) && SendMessageComposer(new SetRelationshipStatusComposer(friend.id, type))); + + const getFriend = (userId: number) => + { + for(const friend of friends) + { + if(friend.id === userId) return friend; + } + + return null; + } + + const canRequestFriend = (userId: number) => + { + if(userId === GetSessionDataManager().userId) return false; + + if(getFriend(userId)) return false; + + if(requests.find(request => (request.requesterUserId === userId))) return false; + + if(sentRequests.indexOf(userId) >= 0) return false; + + return true; + } + + const requestFriend = (userId: number, userName: string) => + { + if(!canRequestFriend(userId)) return false; + + setSentRequests(prevValue => + { + const newSentRequests = [ ...prevValue ]; + + newSentRequests.push(userId); + + return newSentRequests; + }); + + SendMessageComposer(new RequestFriendComposer(userName)); + } + + const requestResponse = (requestId: number, flag: boolean) => + { + if(requestId === -1 && !flag) + { + SendMessageComposer(new DeclineFriendMessageComposer(true)); + + setRequests([]); + } + else + { + setRequests(prevValue => + { + const newRequests = [ ...prevValue ]; + const index = newRequests.findIndex(request => (request.id === requestId)); + + if(index === -1) return prevValue; + + if(flag) + { + SendMessageComposer(new AcceptFriendMessageComposer(newRequests[index].id)); + } + else + { + SendMessageComposer(new DeclineFriendMessageComposer(false, newRequests[index].id)); + } + + newRequests.splice(index, 1); + + return newRequests; + }); + } + } + + useMessageEvent(MessengerInitEvent, event => + { + const parser = event.getParser(); + + setSettings(new MessengerSettings( + parser.userFriendLimit, + parser.normalFriendLimit, + parser.extendedFriendLimit, + parser.categories)); + + SendMessageComposer(new GetFriendRequestsComposer()); + }); + + useMessageEvent(FriendListFragmentEvent, event => + { + const parser = event.getParser(); + + setFriends(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const friend of parser.fragment) + { + const index = newValue.findIndex(existingFriend => (existingFriend.id === friend.id)); + const newFriend = new MessengerFriend(); + newFriend.populate(friend); + + if(index > -1) newValue[index] = newFriend; + else newValue.push(newFriend); + } + + return newValue; + }); + }); + + useMessageEvent(FriendListUpdateEvent, event => + { + const parser = event.getParser(); + + setFriends(prevValue => + { + const newValue = [ ...prevValue ]; + + const processUpdate = (friend: FriendParser) => + { + const index = newValue.findIndex(existingFriend => (existingFriend.id === friend.id)); + + if(index === -1) + { + const newFriend = new MessengerFriend(); + newFriend.populate(friend); + + newValue.unshift(newFriend); + } + else + { + newValue[index].populate(friend); + } + } + + for(const friend of parser.addedFriends) processUpdate(friend); + + for(const friend of parser.updatedFriends) processUpdate(friend); + + for(const removedFriendId of parser.removedFriendIds) + { + const index = newValue.findIndex(existingFriend => (existingFriend.id === removedFriendId)); + + if(index > -1) newValue.splice(index, 1); + } + + return newValue; + }); + }); + + useMessageEvent(FriendRequestsEvent, event => + { + const parser = event.getParser(); + + setRequests(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const request of parser.requests) + { + const index = newValue.findIndex(existing => (existing.requesterUserId === request.requesterUserId)); + + if(index > 0) + { + newValue[index] = CloneObject(newValue[index]); + newValue[index].populate(request); + } + else + { + const newRequest = new MessengerRequest(); + newRequest.populate(request); + + newValue.push(newRequest); + } + } + + return newValue; + }); + }); + + useMessageEvent(NewFriendRequestEvent, event => + { + const parser = event.getParser(); + const request = parser.request; + + setRequests(prevValue => + { + const newRequests = [ ...prevValue ]; + + const index = newRequests.findIndex(existing => (existing.requesterUserId === request.requesterUserId)); + + if(index === -1) + { + const newRequest = new MessengerRequest(); + newRequest.populate(request); + + newRequests.push(newRequest); + } + + return newRequests; + }); + }); + + useEffect(() => + { + SendMessageComposer(new MessengerInitComposer()); + + const interval = setInterval(() => SendMessageComposer(new FriendListUpdateComposer()), 120000); + + return () => + { + clearInterval(interval); + } + }, []); + + return { friends, requests, sentRequests, dismissedRequestIds, setDismissedRequestIds, settings, onlineFriends, offlineFriends, getFriend, canRequestFriend, requestFriend, requestResponse, followFriend, updateRelationship }; +} + +export const useFriends = () => useBetween(useFriendsState); diff --git a/src/hooks/friends/useMessenger.ts b/src/hooks/friends/useMessenger.ts new file mode 100644 index 00000000..a48b6cf1 --- /dev/null +++ b/src/hooks/friends/useMessenger.ts @@ -0,0 +1,187 @@ +import { NewConsoleMessageEvent, RoomInviteErrorEvent, RoomInviteEvent, SendMessageComposer as SendMessageComposerPacket } from '@nitrots/nitro-renderer'; +import { useEffect, useMemo, useState } from 'react'; +import { useBetween } from 'use-between'; +import { CloneObject, GetSessionDataManager, LocalizeText, MessengerIconState, MessengerThread, MessengerThreadChat, NotificationAlertType, PlaySound, SendMessageComposer, SoundNames } from '../../api'; +import { useMessageEvent } from '../events'; +import { useNotification } from '../notification'; +import { useFriends } from './useFriends'; + +const useMessengerState = () => +{ + const [ messageThreads, setMessageThreads ] = useState([]); + const [ activeThreadId, setActiveThreadId ] = useState(-1); + const [ hiddenThreadIds, setHiddenThreadIds ] = useState([]); + const [ iconState, setIconState ] = useState(MessengerIconState.HIDDEN); + const { getFriend = null } = useFriends(); + const { simpleAlert = null } = useNotification(); + + const visibleThreads = useMemo(() => messageThreads.filter(thread => (hiddenThreadIds.indexOf(thread.threadId) === -1)), [ messageThreads, hiddenThreadIds ]); + const activeThread = useMemo(() => ((activeThreadId > 0) && visibleThreads.find(thread => (thread.threadId === activeThreadId) || null)), [ activeThreadId, visibleThreads ]); + + const getMessageThread = (userId: number) => + { + let thread = messageThreads.find(thread => (thread.participant && (thread.participant.id === userId))); + + if(!thread) + { + const friend = getFriend(userId); + + if(!friend) return null; + + thread = new MessengerThread(friend); + + thread.addMessage(null, LocalizeText('messenger.moderationinfo'), 0, null, MessengerThreadChat.SECURITY_NOTIFICATION); + + thread.setRead(); + + setMessageThreads(prevValue => + { + const newValue = [ ...prevValue ]; + + newValue.push(thread); + + return newValue; + }); + } + else + { + const hiddenIndex = hiddenThreadIds.indexOf(thread.threadId); + + if(hiddenIndex >= 0) + { + setHiddenThreadIds(prevValue => + { + const newValue = [ ...prevValue ]; + + newValue.splice(hiddenIndex, 1); + + return newValue; + }) + } + } + + return thread; + } + + const closeThread = (threadId: number) => + { + setHiddenThreadIds(prevValue => + { + const newValue = [ ...prevValue ]; + + if(newValue.indexOf(threadId) >= 0) return prevValue; + + newValue.push(threadId); + + return newValue; + }); + + if(activeThreadId === threadId) setActiveThreadId(-1); + } + + const sendMessage = (thread: MessengerThread, senderId: number, messageText: string, secondsSinceSent: number = 0, extraData: string = null, messageType: number = MessengerThreadChat.CHAT) => + { + if(!thread || !messageText || !messageText.length) return; + + const ownMessage = (senderId === GetSessionDataManager().userId); + + if(ownMessage && (messageText.length <= 255)) SendMessageComposer(new SendMessageComposerPacket(thread.participant.id, messageText)); + + setMessageThreads(prevValue => + { + const newValue = [ ...prevValue ]; + const index = newValue.findIndex(newThread => (newThread.threadId === thread.threadId)); + + if(index === -1) return prevValue; + + thread = CloneObject(newValue[index]); + + if(ownMessage && (thread.groups.length === 1)) PlaySound(SoundNames.MESSENGER_NEW_THREAD); + + thread.addMessage(((messageType === MessengerThreadChat.ROOM_INVITE) ? null : senderId), messageText, secondsSinceSent, extraData, messageType); + + if(activeThreadId === thread.threadId) thread.setRead(); + + newValue[index] = thread; + + if(!ownMessage && thread.unread) PlaySound(SoundNames.MESSENGER_MESSAGE_RECEIVED); + + return newValue; + }); + } + + useMessageEvent(NewConsoleMessageEvent, event => + { + const parser = event.getParser(); + const thread = getMessageThread(parser.senderId); + + if(!thread) return; + + sendMessage(thread, parser.senderId, parser.messageText, parser.secondsSinceSent, parser.extraData); + }); + + useMessageEvent(RoomInviteEvent, event => + { + const parser = event.getParser(); + const thread = getMessageThread(parser.senderId); + + if(!thread) return; + + sendMessage(thread, parser.senderId, parser.messageText, 0, null, MessengerThreadChat.ROOM_INVITE); + }); + + useMessageEvent(RoomInviteErrorEvent, event => + { + const parser = event.getParser(); + + simpleAlert(`Received room invite error: ${ parser.errorCode },recipients: ${ parser.failedRecipients }`, NotificationAlertType.DEFAULT, null, null, LocalizeText('friendlist.alert.title')); + }); + + useEffect(() => + { + if(activeThreadId <= 0) return; + + setMessageThreads(prevValue => + { + const newValue = [ ...prevValue ]; + const index = newValue.findIndex(newThread => (newThread.threadId === activeThreadId)); + + if(index >= 0) + { + newValue[index] = CloneObject(newValue[index]); + + newValue[index].setRead(); + } + + return newValue; + }); + }, [ activeThreadId ]); + + useEffect(() => + { + setIconState(prevValue => + { + if(!visibleThreads.length) return MessengerIconState.HIDDEN; + + let isUnread = false; + + for(const thread of visibleThreads) + { + if(thread.unreadCount > 0) + { + isUnread = true; + + break; + } + } + + if(isUnread) return MessengerIconState.UNREAD; + + return MessengerIconState.SHOW; + }); + }, [ visibleThreads ]); + + return { messageThreads, activeThread, iconState, visibleThreads, getMessageThread, setActiveThreadId, closeThread, sendMessage }; +} + +export const useMessenger = () => useBetween(useMessengerState); diff --git a/src/hooks/groups/index.ts b/src/hooks/groups/index.ts new file mode 100644 index 00000000..95ef7334 --- /dev/null +++ b/src/hooks/groups/index.ts @@ -0,0 +1 @@ +export * from './useGroup'; diff --git a/src/hooks/groups/useGroup.ts b/src/hooks/groups/useGroup.ts new file mode 100644 index 00000000..7a9fd22e --- /dev/null +++ b/src/hooks/groups/useGroup.ts @@ -0,0 +1,55 @@ +import { GroupBadgePartsComposer, GroupBadgePartsEvent } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { useBetween } from 'use-between'; +import { IGroupCustomize, SendMessageComposer } from '../../api'; +import { useMessageEvent } from '../events'; + +const useGroupState = () => +{ + const [ groupCustomize, setGroupCustomize ] = useState(null); + + useMessageEvent(GroupBadgePartsEvent, event => + { + const parser = event.getParser(); + + const customize: IGroupCustomize = { + badgeBases: [], + badgeSymbols: [], + badgePartColors: [], + groupColorsA: [], + groupColorsB: [] + }; + + parser.bases.forEach((images, id) => customize.badgeBases.push({ id, images })); + parser.symbols.forEach((images, id) => customize.badgeSymbols.push({ id, images })); + parser.partColors.forEach((color, id) => customize.badgePartColors.push({ id, color })); + parser.colorsA.forEach((color, id) => customize.groupColorsA.push({ id, color })); + parser.colorsB.forEach((color, id) => customize.groupColorsB.push({ id, color })); + + const CompareId = (a: { id: number }, b: { id: number }) => + { + if(a.id < b.id) return -1; + + if(a.id > b.id) return 1; + + return 0; + } + + customize.badgeBases.sort(CompareId); + customize.badgeSymbols.sort(CompareId); + customize.badgePartColors.sort(CompareId); + customize.groupColorsA.sort(CompareId); + customize.groupColorsB.sort(CompareId); + + setGroupCustomize(customize); + }); + + useEffect(() => + { + SendMessageComposer(new GroupBadgePartsComposer()); + }, []); + + return { groupCustomize }; +} + +export const useGroup = () => useBetween(useGroupState); diff --git a/src/hooks/help/index.ts b/src/hooks/help/index.ts new file mode 100644 index 00000000..f03e7541 --- /dev/null +++ b/src/hooks/help/index.ts @@ -0,0 +1 @@ +export * from './useHelp'; diff --git a/src/hooks/help/useHelp.ts b/src/hooks/help/useHelp.ts new file mode 100644 index 00000000..9a67fb7f --- /dev/null +++ b/src/hooks/help/useHelp.ts @@ -0,0 +1,144 @@ +import { CallForHelpDisabledNotifyMessageEvent, CallForHelpPendingCallsDeletedMessageEvent, CallForHelpPendingCallsMessageEvent, CallForHelpReplyMessageEvent, CallForHelpResultMessageEvent, DeletePendingCallsForHelpMessageComposer, GetPendingCallsForHelpMessageComposer, IssueCloseNotificationMessageEvent, SanctionStatusEvent, SanctionStatusMessageParser } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { useBetween } from 'use-between'; +import { CallForHelpResult, GetCloseReasonKey, IHelpReport, LocalizeText, NotificationAlertType, ReportState, ReportType, SendMessageComposer } from '../../api'; +import { useMessageEvent } from '../events'; +import { useNotification } from '../notification'; + +const useHelpState = () => +{ + const [ activeReport, setActiveReport ] = useState(null); + const [ sanctionInfo, setSanctionInfo ] = useState(null); + const { simpleAlert = null, showConfirm = null } = useNotification(); + + const report = (type: number, options: Partial) => + { + const newReport: IHelpReport = { + reportType: type, + reportedUserId: -1, + reportedChats: [], + cfhCategory: -1, + cfhTopic: -1, + roomId: -1, + roomName: '', + messageId: -1, + threadId: -1, + groupId: -1, + extraData: '', + roomObjectId: -1, + message: '', + currentStep: 0 + }; + + switch(type) + { + case ReportType.BULLY: + case ReportType.EMERGENCY: + case ReportType.IM: + newReport.reportedUserId = options.reportedUserId; + newReport.currentStep = ReportState.SELECT_CHATS; + break; + case ReportType.ROOM: + newReport.roomId = options.roomId; + newReport.roomName = options.roomName; + newReport.currentStep = ReportState.SELECT_TOPICS; + break; + case ReportType.THREAD: + newReport.groupId = options.groupId; + newReport.threadId = options.threadId; + newReport.currentStep = ReportState.SELECT_TOPICS; + break; + case ReportType.MESSAGE: + newReport.groupId = options.groupId; + newReport.threadId = options.threadId; + newReport.messageId = options.messageId; + newReport.currentStep = ReportState.SELECT_TOPICS; + break; + case ReportType.PHOTO: + break; + case ReportType.GUIDE: + break; + } + + setActiveReport(newReport); + } + + useMessageEvent(CallForHelpResultMessageEvent, event => + { + const parser = event.getParser(); + + let message = parser.messageText; + + switch(parser.resultType) + { + case CallForHelpResult.TOO_MANY_PENDING_CALLS_CODE: + SendMessageComposer(new GetPendingCallsForHelpMessageComposer()); + simpleAlert(LocalizeText('help.cfh.error.pending'), NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.error.title')); + break; + case CallForHelpResult.HAS_ABUSIVE_CALL_CODE: + simpleAlert(LocalizeText('help.cfh.error.abusive'), NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.error.title')); + break; + default: + if(message.trim().length === 0) + { + message = LocalizeText('help.cfh.sent.text'); + } + + simpleAlert(message, NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.sent.title')); + } + }); + + useMessageEvent(IssueCloseNotificationMessageEvent, event => + { + const parser = event.getParser(); + + const message = parser.messageText.length === 0 ? LocalizeText('help.cfh.closed.' + GetCloseReasonKey(parser.closeReason)) : parser.messageText; + + simpleAlert(message, NotificationAlertType.MODERATION, null, null, LocalizeText('mod.alert.title')); + }); + + useMessageEvent(CallForHelpPendingCallsMessageEvent, event => + { + const parser = event.getParser(); + + if(parser.count > 0) + { + showConfirm(LocalizeText('help.emergency.pending.title') + '\n' + parser.pendingCalls[0].message, () => + { + SendMessageComposer(new DeletePendingCallsForHelpMessageComposer()); + }, null, LocalizeText('help.emergency.pending.button.discard'), LocalizeText('help.emergency.pending.button.keep'), LocalizeText('help.emergency.pending.message.subtitle')); + } + }); + + useMessageEvent(CallForHelpPendingCallsDeletedMessageEvent, event => + { + const message = 'Your pending calls were deleted'; // todo: add localization + + simpleAlert(message, NotificationAlertType.MODERATION, null, null, LocalizeText('mod.alert.title')); + }); + + useMessageEvent(CallForHelpReplyMessageEvent, event => + { + const parser = event.getParser(); + + simpleAlert(parser.message, NotificationAlertType.MODERATION, null, null, LocalizeText('help.cfh.reply.title')); + }); + + useMessageEvent(CallForHelpDisabledNotifyMessageEvent, event => + { + const parser = event.getParser(); + + simpleAlert(LocalizeText('help.emergency.global_mute.message'), NotificationAlertType.MODERATION, parser.infoUrl, LocalizeText('help.emergency.global_mute.link'), LocalizeText('help.emergency.global_mute.subtitle')) + }); + + useMessageEvent(SanctionStatusEvent, event => + { + const parser = event.getParser(); + + setSanctionInfo(parser); + }); + + return { activeReport, setActiveReport, sanctionInfo, setSanctionInfo, report }; +} + +export const useHelp = () => useBetween(useHelpState); diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 4a1a3914..91a23d23 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1,7 +1,21 @@ -export * from './BatchUpdates'; +export * from './achievements'; +export * from './camera'; +export * from './catalog'; +export * from './chat-history'; export * from './events'; export * from './events/core'; export * from './events/nitro'; -export * from './events/ui'; -export * from './messages'; +export * from './friends'; +export * from './groups'; +export * from './help'; +export * from './inventory'; +export * from './mod-tools'; +export * from './navigator'; +export * from './notification'; +export * from './purse'; +export * from './rooms'; +export * from './session'; +export * from './useLocalStorage'; export * from './UseMountEffect'; +export * from './useSharedVisibility'; +export * from './wired'; diff --git a/src/hooks/inventory/index.ts b/src/hooks/inventory/index.ts new file mode 100644 index 00000000..4e70819c --- /dev/null +++ b/src/hooks/inventory/index.ts @@ -0,0 +1,6 @@ +export * from './useInventoryBadges'; +export * from './useInventoryBots'; +export * from './useInventoryFurni'; +export * from './useInventoryPets'; +export * from './useInventoryTrade'; +export * from './useInventoryUnseenTracker'; diff --git a/src/hooks/inventory/useInventoryBadges.ts b/src/hooks/inventory/useInventoryBadges.ts new file mode 100644 index 00000000..e5d46620 --- /dev/null +++ b/src/hooks/inventory/useInventoryBadges.ts @@ -0,0 +1,138 @@ +import { BadgeReceivedEvent, BadgesEvent, RequestBadgesComposer, SetActivatedBadgesComposer } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { useBetween } from 'use-between'; +import { GetConfiguration, SendMessageComposer, UnseenItemCategory } from '../../api'; +import { useMessageEvent } from '../events'; +import { useSharedVisibility } from '../useSharedVisibility'; +import { useInventoryUnseenTracker } from './useInventoryUnseenTracker'; + +const useInventoryBadgesState = () => +{ + const [ needsUpdate, setNeedsUpdate ] = useState(true); + const [ badgeCodes, setBadgeCodes ] = useState([]); + const [ badgeIds, setBadgeIds ] = useState([]); + const [ activeBadgeCodes, setActiveBadgeCodes ] = useState([]); + const [ selectedBadgeCode, setSelectedBadgeCode ] = useState(null); + const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); + const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); + + const maxBadgeCount = GetConfiguration('user.badges.max.slots', 5); + const isWearingBadge = (badgeCode: string) => (activeBadgeCodes.indexOf(badgeCode) >= 0); + const canWearBadges = () => (activeBadgeCodes.length < maxBadgeCount); + + const toggleBadge = (badgeCode: string) => + { + setActiveBadgeCodes(prevValue => + { + const newValue = [ ...prevValue ]; + + const index = newValue.indexOf(badgeCode); + + if(index === -1) + { + if(!canWearBadges()) return prevValue; + + newValue.push(badgeCode); + } + else + { + newValue.splice(index, 1); + } + + const composer = new SetActivatedBadgesComposer(); + + for(let i = 0; i < maxBadgeCount; i++) composer.addActivatedBadge(newValue[i] || null); + + SendMessageComposer(composer); + + return newValue; + }); + } + + const getBadgeId = (badgeCode: string) => + { + const index = badgeCodes.indexOf(badgeCode); + + if(index === -1) return 0; + + return (badgeIds[index] || 0); + } + + useMessageEvent(BadgesEvent, event => + { + const parser = event.getParser(); + const newBadgeCodes = parser.getAllBadgeCodes(); + const newBadgeIds: number[] = []; + + for(const newBadgeCode of newBadgeCodes) newBadgeIds.push(parser.getBadgeId(newBadgeCode)); + + setBadgeCodes(newBadgeCodes); + setBadgeIds(newBadgeIds); + setActiveBadgeCodes(parser.getActiveBadgeCodes()); + }); + + useMessageEvent(BadgeReceivedEvent, event => + { + const parser = event.getParser(); + const unseen = isUnseen(UnseenItemCategory.BADGE, parser.badgeId); + + setBadgeCodes(prevValue => + { + const newValue = [ ...prevValue ]; + + if(unseen) newValue.unshift(parser.badgeCode) + else newValue.push(parser.badgeCode); + + return newValue; + }); + + setBadgeIds(prevValue => + { + const newValue = [ ...prevValue ]; + + if(unseen) newValue.unshift(parser.badgeId) + else newValue.push(parser.badgeId); + + return newValue; + }); + }); + + useEffect(() => + { + if(!badgeCodes || !badgeCodes.length) return; + + setSelectedBadgeCode(prevValue => + { + let newValue = prevValue; + + if(newValue && (badgeCodes.indexOf(newValue) === -1)) newValue = null; + + if(!newValue) newValue = badgeCodes[0]; + + return newValue; + }); + }, [ badgeCodes ]); + + useEffect(() => + { + if(!isVisible) return; + + return () => + { + resetCategory(UnseenItemCategory.BADGE); + } + }, [ isVisible, resetCategory ]); + + useEffect(() => + { + if(!isVisible || !needsUpdate) return; + + SendMessageComposer(new RequestBadgesComposer()); + + setNeedsUpdate(false); + }, [ isVisible, needsUpdate ]); + + return { badgeCodes, activeBadgeCodes, selectedBadgeCode, setSelectedBadgeCode, isWearingBadge, canWearBadges, toggleBadge, getBadgeId, activate, deactivate }; +} + +export const useInventoryBadges = () => useBetween(useInventoryBadgesState); diff --git a/src/hooks/inventory/useInventoryBots.ts b/src/hooks/inventory/useInventoryBots.ts new file mode 100644 index 00000000..aba5d396 --- /dev/null +++ b/src/hooks/inventory/useInventoryBots.ts @@ -0,0 +1,158 @@ +import { BotAddedToInventoryEvent, BotData, BotInventoryMessageEvent, BotRemovedFromInventoryEvent, GetBotInventoryComposer } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { useBetween } from 'use-between'; +import { cancelRoomObjectPlacement, CreateLinkEvent, getPlacingItemId, IBotItem, SendMessageComposer, UnseenItemCategory } from '../../api'; +import { useMessageEvent } from '../events'; +import { useSharedVisibility } from '../useSharedVisibility'; +import { useInventoryUnseenTracker } from './useInventoryUnseenTracker'; + +const useInventoryBotsState = () => +{ + const [ needsUpdate, setNeedsUpdate ] = useState(true); + const [ botItems, setBotItems ] = useState([]); + const [ selectedBot, setSelectedBot ] = useState(null); + const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); + const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); + + useMessageEvent(BotInventoryMessageEvent, event => + { + const parser = event.getParser(); + + setBotItems(prevValue => + { + const newValue = [ ...prevValue ]; + const existingIds = newValue.map(item => item.botData.id); + const addedDatas: BotData[] = []; + + for(const botData of parser.items.values()) ((existingIds.indexOf(botData.id) === -1) && addedDatas.push(botData)); + + for(const existingId of existingIds) + { + let remove = true; + + for(const botData of parser.items.values()) + { + if(botData.id === existingId) + { + remove = false; + + break; + } + } + + if(!remove) continue; + + const index = newValue.findIndex(item => (item.botData.id === existingId)); + const botItem = newValue[index]; + + if((index === -1) || !botItem) continue; + + if(getPlacingItemId() === botItem.botData.id) + { + cancelRoomObjectPlacement(); + + CreateLinkEvent('inventory/open'); + } + + newValue.splice(index, 1); + } + + for(const botData of addedDatas) + { + const botItem = { botData } as IBotItem; + const unseen = isUnseen(UnseenItemCategory.BOT, botData.id); + + if(unseen) newValue.unshift(botItem); + else newValue.push(botItem); + } + + return newValue; + }); + }); + + useMessageEvent(BotAddedToInventoryEvent, event => + { + const parser = event.getParser(); + + setBotItems(prevValue => + { + const newValue = [ ...prevValue ]; + + const index = newValue.findIndex(item => (item.botData.id === parser.item.id)); + + if(index >= 0) return prevValue; + + const botItem = { botData: parser.item } as IBotItem; + const unseen = isUnseen(UnseenItemCategory.BOT, botItem.botData.id); + + if(unseen) newValue.unshift(botItem); + else newValue.push(botItem); + + return newValue; + }); + }); + + useMessageEvent(BotRemovedFromInventoryEvent, event => + { + const parser = event.getParser(); + + setBotItems(prevValue => + { + const newValue = [ ...prevValue ]; + + const index = newValue.findIndex(item => (item.botData.id === parser.itemId)); + + if(index === -1) return prevValue; + + newValue.splice(index, 1); + + if(getPlacingItemId() === parser.itemId) + { + cancelRoomObjectPlacement(); + + CreateLinkEvent('inventory/show'); + } + + return newValue; + }); + }); + + useEffect(() => + { + if(!botItems || !botItems.length) return; + + setSelectedBot(prevValue => + { + let newValue = prevValue; + + if(newValue && (botItems.indexOf(newValue) === -1)) newValue = null; + + if(!newValue) newValue = botItems[0]; + + return newValue; + }); + }, [ botItems ]); + + useEffect(() => + { + if(!isVisible) return; + + return () => + { + resetCategory(UnseenItemCategory.BOT); + } + }, [ isVisible, resetCategory ]); + + useEffect(() => + { + if(!isVisible || !needsUpdate) return; + + SendMessageComposer(new GetBotInventoryComposer()); + + setNeedsUpdate(false); + }, [ isVisible, needsUpdate ]); + + return { botItems, selectedBot, setSelectedBot, activate, deactivate }; +} + +export const useInventoryBots = () => useBetween(useInventoryBotsState); diff --git a/src/hooks/inventory/useInventoryFurni.ts b/src/hooks/inventory/useInventoryFurni.ts new file mode 100644 index 00000000..47b1e989 --- /dev/null +++ b/src/hooks/inventory/useInventoryFurni.ts @@ -0,0 +1,291 @@ +import { FurnitureListAddOrUpdateEvent, FurnitureListComposer, FurnitureListEvent, FurnitureListInvalidateEvent, FurnitureListItemParser, FurnitureListRemovedEvent, FurniturePostItPlacedEvent } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { useBetween } from 'use-between'; +import { addFurnitureItem, attemptItemPlacement, cancelRoomObjectPlacement, CloneObject, CreateLinkEvent, DispatchUiEvent, FurnitureItem, getAllItemIds, getPlacingItemId, GroupItem, mergeFurniFragments, SendMessageComposer, UnseenItemCategory } from '../../api'; +import { InventoryFurniAddedEvent } from '../../events'; +import { useMessageEvent } from '../events'; +import { useSharedVisibility } from '../useSharedVisibility'; +import { useInventoryUnseenTracker } from './useInventoryUnseenTracker'; + +let furniMsgFragments: Map[] = null; + +const useInventoryFurniState = () => +{ + const [ needsUpdate, setNeedsUpdate ] = useState(true); + const [ groupItems, setGroupItems ] = useState([]); + const [ selectedItem, setSelectedItem ] = useState(null); + const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); + const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); + + const getWallItemById = (id: number) => + { + if(!groupItems || !groupItems.length) return; + + for(const groupItem of groupItems) + { + const item = groupItem.getItemById(id); + + if(item && item.isWallItem) return groupItem; + } + + return null; + } + + const getFloorItemById = (id: number) => + { + if(!groupItems || !groupItems.length) return; + + for(const groupItem of groupItems) + { + const item = groupItem.getItemById(id); + + if(item && !item.isWallItem) return groupItem; + } + + return null; + } + + useMessageEvent(FurnitureListAddOrUpdateEvent, event => + { + const parser = event.getParser(); + + setGroupItems(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const item of parser.items) + { + let i = 0; + let groupItem: GroupItem = null; + + while(i < newValue.length) + { + const group = newValue[i]; + + let j = 0; + + while(j < group.items.length) + { + const furniture = group.items[j]; + + if(furniture.id === item.itemId) + { + furniture.update(item); + + const newFurniture = [ ...group.items ]; + + newFurniture[j] = furniture; + + group.items = newFurniture; + + groupItem = group; + + break; + } + + j++ + } + + if(groupItem) break; + + i++; + } + + if(groupItem) + { + groupItem.hasUnseenItems = true; + + newValue[i] = CloneObject(groupItem); + } + else + { + const furniture = new FurnitureItem(item); + + addFurnitureItem(newValue, furniture, isUnseen(UnseenItemCategory.FURNI, item.itemId)); + + DispatchUiEvent(new InventoryFurniAddedEvent(furniture.id, furniture.type, furniture.category)); + } + } + + return newValue; + }); + }); + + useMessageEvent(FurnitureListEvent, event => + { + const parser = event.getParser(); + + if(!furniMsgFragments) furniMsgFragments = new Array(parser.totalFragments); + + const fragment = mergeFurniFragments(parser.fragment, parser.totalFragments, parser.fragmentNumber, furniMsgFragments); + + if(!fragment) return; + + setGroupItems(prevValue => + { + const newValue = [ ...prevValue ]; + const existingIds = getAllItemIds(newValue); + + for(const existingId of existingIds) + { + if(fragment.get(existingId)) continue; + + let index = 0; + + while(index < newValue.length) + { + const group = newValue[index]; + const item = group.remove(existingId); + + if(!item) + { + index++; + + continue; + } + + if(getPlacingItemId() === item.ref) + { + cancelRoomObjectPlacement(); + + if(!attemptItemPlacement(group)) + { + CreateLinkEvent('inventory/show'); + } + } + + if(group.getTotalCount() <= 0) + { + newValue.splice(index, 1); + + group.dispose(); + } + + break; + } + } + + for(const itemId of fragment.keys()) + { + if(existingIds.indexOf(itemId) >= 0) continue; + + const parser = fragment.get(itemId); + + if(!parser) continue; + + const item = new FurnitureItem(parser); + + addFurnitureItem(newValue, item, isUnseen(UnseenItemCategory.FURNI, itemId)); + + DispatchUiEvent(new InventoryFurniAddedEvent(item.id, item.type, item.category)); + + } + + return newValue; + }); + + furniMsgFragments = null; + }); + + useMessageEvent(FurnitureListInvalidateEvent, event => + { + setNeedsUpdate(true); + }); + + useMessageEvent(FurnitureListRemovedEvent, event => + { + const parser = event.getParser(); + + setGroupItems(prevValue => + { + const newValue = [ ...prevValue ]; + + let index = 0; + + while(index < newValue.length) + { + const group = newValue[index]; + const item = group.remove(parser.itemId); + + if(!item) + { + index++; + + continue; + } + + if(getPlacingItemId() === item.ref) + { + cancelRoomObjectPlacement(); + + if(!attemptItemPlacement(group)) CreateLinkEvent('inventory/show'); + } + + if(group.getTotalCount() <= 0) + { + newValue.splice(index, 1); + + group.dispose(); + } + + break; + } + + return newValue; + }); + }); + + useMessageEvent(FurniturePostItPlacedEvent, event => + { + + }); + + useEffect(() => + { + if(!groupItems || !groupItems.length) return; + + setSelectedItem(prevValue => + { + let newValue = prevValue; + + if(newValue && (groupItems.indexOf(newValue) === -1)) newValue = null; + + if(!newValue) newValue = groupItems[0]; + + return newValue; + }); + }, [ groupItems ]); + + useEffect(() => + { + if(!isVisible) return; + + return () => + { + if(resetCategory(UnseenItemCategory.FURNI)) + { + setGroupItems(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const newGroup of newValue) newGroup.hasUnseenItems = false; + + return newValue; + }); + } + } + }, [ isVisible, resetCategory ]); + + useEffect(() => + { + if(!isVisible || !needsUpdate) return; + + SendMessageComposer(new FurnitureListComposer()); + + setNeedsUpdate(false); + }, [ isVisible, needsUpdate ]); + + return { isVisible, groupItems, setGroupItems, selectedItem, setSelectedItem, activate, deactivate, getWallItemById, getFloorItemById }; +} + +export const useInventoryFurni = () => useBetween(useInventoryFurniState); diff --git a/src/hooks/inventory/useInventoryPets.ts b/src/hooks/inventory/useInventoryPets.ts new file mode 100644 index 00000000..d95e8bf1 --- /dev/null +++ b/src/hooks/inventory/useInventoryPets.ts @@ -0,0 +1,107 @@ +import { PetAddedToInventoryEvent, PetData, PetInventoryEvent, PetRemovedFromInventory, RequestPetsComposer } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { useBetween } from 'use-between'; +import { addSinglePetItem, IPetItem, mergePetFragments, processPetFragment, removePetItemById, SendMessageComposer, UnseenItemCategory } from '../../api'; +import { useMessageEvent } from '../events'; +import { useSharedVisibility } from '../useSharedVisibility'; +import { useInventoryUnseenTracker } from './useInventoryUnseenTracker'; + +let petMsgFragments: Map[] = null; + +const useInventoryPetsState = () => +{ + const [ needsUpdate, setNeedsUpdate ] = useState(true); + const [ petItems, setPetItems ] = useState([]); + const [ selectedPet, setSelectedPet ] = useState(null); + const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); + const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); + + useMessageEvent(PetInventoryEvent, event => + { + const parser = event.getParser(); + + if(!petMsgFragments) petMsgFragments = new Array(parser.totalFragments); + + const fragment = mergePetFragments(parser.fragment, parser.totalFragments, parser.fragmentNumber, petMsgFragments); + + if(!fragment) return; + + setPetItems(prevValue => + { + const newValue = [ ...prevValue ]; + + processPetFragment(newValue, fragment, isUnseen); + + return newValue; + }); + + petMsgFragments = null; + }); + + useMessageEvent(PetAddedToInventoryEvent, event => + { + const parser = event.getParser(); + + setPetItems(prevValue => + { + const newValue = [ ...prevValue ]; + + addSinglePetItem(parser.pet, newValue, isUnseen(UnseenItemCategory.PET, parser.pet.id)); + + return newValue; + }); + }); + + useMessageEvent(PetRemovedFromInventory, event => + { + const parser = event.getParser(); + + setPetItems(prevValue => + { + const newValue = [ ...prevValue ]; + + removePetItemById(parser.petId, newValue); + + return newValue; + }); + }); + + useEffect(() => + { + if(!petItems || !petItems.length) return; + + setSelectedPet(prevValue => + { + let newValue = prevValue; + + if(newValue && (petItems.indexOf(newValue) === -1)) newValue = null; + + if(!newValue) newValue = petItems[0]; + + return newValue; + }); + }, [ petItems ]); + + useEffect(() => + { + if(!isVisible) return; + + return () => + { + resetCategory(UnseenItemCategory.PET); + } + }, [ isVisible, resetCategory ]); + + useEffect(() => + { + if(!isVisible || !needsUpdate) return; + + SendMessageComposer(new RequestPetsComposer()); + + setNeedsUpdate(false); + }, [ isVisible, needsUpdate ]); + + return { petItems, selectedPet, setSelectedPet, activate, deactivate }; +} + +export const useInventoryPets = () => useBetween(useInventoryPetsState); diff --git a/src/hooks/inventory/useInventoryTrade.ts b/src/hooks/inventory/useInventoryTrade.ts new file mode 100644 index 00000000..7eb7481f --- /dev/null +++ b/src/hooks/inventory/useInventoryTrade.ts @@ -0,0 +1,288 @@ +import { AdvancedMap, TradingAcceptComposer, TradingAcceptEvent, TradingCancelComposer, TradingCloseComposer, TradingCloseEvent, TradingCloseParser, TradingCompletedEvent, TradingConfirmationComposer, TradingConfirmationEvent, TradingListItemEvent, TradingListItemRemoveComposer, TradingNotOpenEvent, TradingOpenEvent, TradingOpenFailedEvent, TradingOtherNotAllowedEvent, TradingUnacceptComposer, TradingYouAreNotAllowedEvent } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { useBetween } from 'use-between'; +import { CloneObject, GetRoomSession, GetSessionDataManager, GroupItem, LocalizeText, parseTradeItems, SendMessageComposer, TradeState, TradeUserData, TradingNotificationType } from '../../api'; +import { useMessageEvent } from '../events'; +import { useNotification } from '../notification'; +import { useInventoryFurni } from './useInventoryFurni'; + +const useInventoryTradeState = () => +{ + const [ ownUser, setOwnUser ] = useState(null); + const [ otherUser, setOtherUser ] = useState(null); + const [ tradeState, setTradeState ] = useState(TradeState.TRADING_STATE_READY); + const { groupItems = [], setGroupItems = null, activate = null, deactivate = null } = useInventoryFurni(); + const { simpleAlert = null, showTradeAlert = null } = useNotification(); + const isTrading = (tradeState >= TradeState.TRADING_STATE_RUNNING); + + const progressTrade = () => + { + switch(tradeState) + { + case TradeState.TRADING_STATE_RUNNING: + if(!otherUser.itemCount && !ownUser.accepts) + { + simpleAlert(LocalizeText('inventory.trading.warning.other_not_offering'), null, null, null); + } + + if(ownUser.accepts) + { + SendMessageComposer(new TradingUnacceptComposer()); + } + else + { + SendMessageComposer(new TradingAcceptComposer()); + } + return; + case TradeState.TRADING_STATE_CONFIRMING: + SendMessageComposer(new TradingConfirmationComposer()); + + setTradeState(TradeState.TRADING_STATE_CONFIRMED); + return; + } + } + + const removeItem = (group: GroupItem) => + { + const item = group.getLastItem(); + + if(!item) return; + + SendMessageComposer(new TradingListItemRemoveComposer(item.id)); + } + + const stopTrading = () => + { + if(!isTrading) return; + + switch(tradeState) + { + case TradeState.TRADING_STATE_RUNNING: + SendMessageComposer(new TradingCloseComposer()); + return; + default: + SendMessageComposer(new TradingCancelComposer()); + return; + } + } + + useMessageEvent(TradingAcceptEvent, event => + { + const parser = event.getParser(); + + if(!ownUser || !otherUser) return; + + if(ownUser.userId === parser.userID) + { + setOwnUser(prevValue => + { + const newValue = CloneObject(prevValue); + + newValue.accepts = parser.userAccepts; + + return newValue; + }); + } + + else if(otherUser.userId === parser.userID) + { + setOtherUser(prevValue => + { + const newValue = CloneObject(prevValue); + + newValue.accepts = parser.userAccepts; + + return newValue; + }); + } + }); + + useMessageEvent(TradingCloseEvent, event => + { + const parser = event.getParser(); + + if(parser.reason === TradingCloseParser.ERROR_WHILE_COMMIT) + { + showTradeAlert(TradingNotificationType.ERROR_WHILE_COMMIT); + } + else + { + if(ownUser && (parser.userID !== ownUser.userId)) + { + showTradeAlert(TradingNotificationType.THEY_CANCELLED); + } + } + + setOwnUser(null); + setOtherUser(null); + setTradeState(TradeState.TRADING_STATE_READY); + }); + + useMessageEvent(TradingCompletedEvent, event => + { + const parser = event.getParser(); + + setOwnUser(null); + setOtherUser(null); + setTradeState(TradeState.TRADING_STATE_READY); + }); + + useMessageEvent(TradingConfirmationEvent, event => + { + const parser = event.getParser(); + + setTradeState(TradeState.TRADING_STATE_COUNTDOWN); + }); + + useMessageEvent(TradingListItemEvent, event => + { + const parser = event.getParser(); + const firstUserItems = parseTradeItems(parser.firstUserItemArray); + const secondUserItems = parseTradeItems(parser.secondUserItemArray); + + setOwnUser(prevValue => + { + const newValue = CloneObject(prevValue); + + if(newValue.userId === parser.firstUserID) + { + newValue.creditsCount = parser.firstUserNumCredits; + newValue.itemCount = parser.firstUserNumItems; + newValue.userItems = firstUserItems; + } + else + { + newValue.creditsCount = parser.secondUserNumCredits; + newValue.itemCount = parser.secondUserNumItems; + newValue.userItems = secondUserItems; + } + + const tradeIds: number[] = []; + + for(const groupItem of newValue.userItems.getValues()) + { + let i = 0; + + while(i < groupItem.getTotalCount()) + { + const item = groupItem.getItemByIndex(i); + + if(item) tradeIds.push(item.ref); + + i++; + } + } + + setGroupItems(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const groupItem of newValue) groupItem.lockItemIds(tradeIds); + + return newValue; + }); + + return newValue; + }); + + setOtherUser(prevValue => + { + const newValue = CloneObject(prevValue); + + if(newValue.userId === parser.firstUserID) + { + newValue.creditsCount = parser.firstUserNumCredits; + newValue.itemCount = parser.firstUserNumItems; + newValue.userItems = firstUserItems; + } + else + { + newValue.creditsCount = parser.secondUserNumCredits; + newValue.itemCount = parser.secondUserNumItems; + newValue.userItems = secondUserItems; + } + + return newValue; + }); + }); + + useMessageEvent(TradingNotOpenEvent, event => + { + const parser = event.getParser(); + }); + + useMessageEvent(TradingOpenEvent, event => + { + const parser = event.getParser(); + + const firstUser = new TradeUserData(); + const firstUserData = GetRoomSession().userDataManager.getUserData(parser.userID); + + firstUser.userItems = new AdvancedMap(); + + const secondUser = new TradeUserData(); + const secondUserData = GetRoomSession().userDataManager.getUserData(parser.otherUserID); + + secondUser.userItems = new AdvancedMap(); + + if(firstUserData.webID === GetSessionDataManager().userId) + { + firstUser.userId = firstUserData.webID; + firstUser.userName = firstUserData.name; + firstUser.canTrade = parser.userCanTrade; + + secondUser.userId = secondUserData.webID; + secondUser.userName = secondUserData.name; + secondUser.canTrade = parser.otherUserCanTrade; + } + + else if(secondUserData.webID === GetSessionDataManager().userId) + { + firstUser.userId = secondUserData.webID; + firstUser.userName = secondUserData.name; + firstUser.canTrade = parser.otherUserCanTrade; + + secondUser.userId = firstUserData.webID; + secondUser.userName = firstUserData.name; + secondUser.canTrade = parser.userCanTrade; + } + + setOwnUser(firstUser); + setOtherUser(secondUser); + setTradeState(TradeState.TRADING_STATE_RUNNING); + }); + + useMessageEvent(TradingOpenFailedEvent, event => + { + const parser = event.getParser(); + + showTradeAlert(parser.reason, parser.otherUserName); + }); + + useMessageEvent(TradingOtherNotAllowedEvent, event => + { + const parser = event.getParser(); + + showTradeAlert(TradingNotificationType.THEY_NOT_ALLOWED); + }); + + useMessageEvent(TradingYouAreNotAllowedEvent, event => + { + const parser = event.getParser(); + + showTradeAlert(TradingNotificationType.YOU_NOT_ALLOWED); + }); + + useEffect(() => + { + if(tradeState === TradeState.TRADING_STATE_READY) return; + + const id = activate(); + + return () => deactivate(id); + }, [ tradeState, activate, deactivate ]); + + return { ownUser, otherUser, tradeState, setTradeState, isTrading, groupItems, progressTrade, removeItem, stopTrading }; +} + +export const useInventoryTrade = () => useBetween(useInventoryTradeState); diff --git a/src/hooks/inventory/useInventoryUnseenTracker.ts b/src/hooks/inventory/useInventoryUnseenTracker.ts new file mode 100644 index 00000000..90ba66e9 --- /dev/null +++ b/src/hooks/inventory/useInventoryUnseenTracker.ts @@ -0,0 +1,132 @@ +import { UnseenItemsEvent, UnseenResetCategoryComposer, UnseenResetItemsComposer } from '@nitrots/nitro-renderer'; +import { useCallback, useMemo, useState } from 'react'; +import { useBetween } from 'use-between'; +import { SendMessageComposer } from '../../api'; +import { useMessageEvent } from '../events'; + +const sendResetCategoryMessage = (category: number) => SendMessageComposer(new UnseenResetCategoryComposer(category)); +const sendResetItemsMessage = (category: number, itemIds: number[]) => SendMessageComposer(new UnseenResetItemsComposer(category, ...itemIds)); + +const useInventoryUnseenTrackerState = () => +{ + const [ unseenItems, setUnseenItems ] = useState>(new Map()); + + const getCount = useCallback((category: number) => (unseenItems.get(category)?.length || 0), [ unseenItems ]); + + const getFullCount = useMemo(() => + { + let count = 0; + + for(const key of unseenItems.keys()) count += getCount(key); + + return count; + }, [ unseenItems, getCount ]); + + const resetCategory = useCallback((category: number) => + { + let didReset = true; + + setUnseenItems(prevValue => + { + if(!prevValue.has(category)) + { + didReset = false; + + return prevValue; + } + + const newValue = new Map(prevValue); + + newValue.delete(category); + + sendResetCategoryMessage(category); + + return newValue; + }); + + return didReset; + }, []); + + const resetItems = useCallback((category: number, itemIds: number[]) => + { + let didReset = true; + + setUnseenItems(prevValue => + { + if(!prevValue.has(category)) + { + didReset = false; + + return prevValue; + } + + const newValue = new Map(prevValue); + const existing = newValue.get(category); + + if(existing) for(const itemId of itemIds) existing.splice(existing.indexOf(itemId), 1); + + sendResetItemsMessage(category, itemIds); + + return newValue; + }); + + return didReset; + }, []); + + const isUnseen = useCallback((category: number, itemId: number) => + { + if(!unseenItems.has(category)) return false; + + const items = unseenItems.get(category); + + return (items.indexOf(itemId) >= 0); + }, [ unseenItems ]); + + const removeUnseen = useCallback((category: number, itemId: number) => + { + setUnseenItems(prevValue => + { + if(!prevValue.has(category)) return prevValue; + + const newValue = new Map(prevValue); + const items = newValue.get(category); + const index = items.indexOf(itemId); + + if(index >= 0) items.splice(index, 1); + + return newValue; + }); + }, []); + + useMessageEvent(UnseenItemsEvent, event => + { + const parser = event.getParser(); + + setUnseenItems(prevValue => + { + const newValue = new Map(prevValue); + + for(const category of parser.categories) + { + let existing = newValue.get(category); + + if(!existing) + { + existing = []; + + newValue.set(category, existing); + } + + const itemIds = parser.getItemsByCategory(category); + + for(const itemId of itemIds) ((existing.indexOf(itemId) === -1) && existing.push(itemId)); + } + + return newValue; + }); + }); + + return { getCount, getFullCount, resetCategory, resetItems, isUnseen, removeUnseen }; +} + +export const useInventoryUnseenTracker = () => useBetween(useInventoryUnseenTrackerState); diff --git a/src/hooks/messages/index.ts b/src/hooks/messages/index.ts deleted file mode 100644 index 46b80a45..00000000 --- a/src/hooks/messages/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './UseMessageEventHook'; diff --git a/src/hooks/mod-tools/index.ts b/src/hooks/mod-tools/index.ts new file mode 100644 index 00000000..26546fd6 --- /dev/null +++ b/src/hooks/mod-tools/index.ts @@ -0,0 +1 @@ +export * from './useModTools'; diff --git a/src/hooks/mod-tools/useModTools.ts b/src/hooks/mod-tools/useModTools.ts new file mode 100644 index 00000000..93628f11 --- /dev/null +++ b/src/hooks/mod-tools/useModTools.ts @@ -0,0 +1,207 @@ +import { CallForHelpCategoryData, CfhSanctionMessageEvent, CfhTopicsInitEvent, IssueDeletedMessageEvent, IssueInfoMessageEvent, IssueMessageData, IssuePickFailedMessageEvent, ModeratorActionResultMessageEvent, ModeratorInitData, ModeratorInitMessageEvent, ModeratorToolPreferencesEvent } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { useBetween } from 'use-between'; +import { NotificationAlertType, PlaySound, SoundNames } from '../../api'; +import { useMessageEvent } from '../events'; +import { useNotification } from '../notification'; + +const useModToolsState = () => +{ + const [ settings, setSettings ] = useState(null); + const [ openRooms, setOpenRooms ] = useState([]); + const [ openRoomChatlogs, setOpenRoomChatlogs ] = useState([]); + const [ openUserInfos, setOpenUserInfos ] = useState([]); + const [ openUserChatlogs, setOpenUserChatlogs ] = useState([]); + const [ tickets, setTickets ] = useState([]); + const [ cfhCategories, setCfhCategories ] = useState([]); + const { simpleAlert = null } = useNotification(); + + const openRoomInfo = (roomId: number) => + { + if(openRooms.indexOf(roomId) >= 0) return; + + setOpenRooms(prevValue => [ ...prevValue, roomId ]); + } + + const closeRoomInfo = (roomId: number) => + { + setOpenRooms(prevValue => + { + const newValue = [ ...prevValue ]; + const existingIndex = newValue.indexOf(roomId); + + if(existingIndex >= 0) newValue.splice(existingIndex); + + return newValue; + }); + } + + const toggleRoomInfo = (roomId: number) => + { + if(openRooms.indexOf(roomId) >= 0) closeRoomInfo(roomId); + else openRoomInfo(roomId); + } + + const openRoomChatlog = (roomId: number) => + { + if(openRoomChatlogs.indexOf(roomId) >= 0) return; + + setOpenRoomChatlogs(prevValue => [ ...prevValue, roomId ]); + } + + const closeRoomChatlog = (roomId: number) => + { + setOpenRoomChatlogs(prevValue => + { + const newValue = [ ...prevValue ]; + const existingIndex = newValue.indexOf(roomId); + + if(existingIndex >= 0) newValue.splice(existingIndex); + + return newValue; + }); + } + + const toggleRoomChatlog = (roomId: number) => + { + if(openRoomChatlogs.indexOf(roomId) >= 0) closeRoomChatlog(roomId); + else openRoomChatlog(roomId); + } + + const openUserInfo = (userId: number) => + { + if(openUserInfos.indexOf(userId) >= 0) return; + + setOpenUserInfos(prevValue => [ ...prevValue, userId ]); + } + + const closeUserInfo = (userId: number) => + { + setOpenUserInfos(prevValue => + { + const newValue = [ ...prevValue ]; + const existingIndex = newValue.indexOf(userId); + + if(existingIndex >= 0) newValue.splice(existingIndex); + + return newValue; + }); + } + + const toggleUserInfo = (userId: number) => + { + if(openUserInfos.indexOf(userId) >= 0) closeUserInfo(userId); + else openUserInfo(userId); + } + + const openUserChatlog = (userId: number) => + { + if(openUserChatlogs.indexOf(userId) >= 0) return; + + setOpenUserChatlogs(prevValue => [ ...prevValue, userId ]); + } + + const closeUserChatlog = (userId: number) => + { + setOpenUserChatlogs(prevValue => + { + const newValue = [ ...prevValue ]; + const existingIndex = newValue.indexOf(userId); + + if(existingIndex >= 0) newValue.splice(existingIndex); + + return newValue; + }); + } + + const toggleUserChatlog = (userId: number) => + { + if(openRoomChatlogs.indexOf(userId) >= 0) closeUserChatlog(userId); + else openUserChatlog(userId); + } + + useMessageEvent(ModeratorInitMessageEvent, event => + { + const parser = event.getParser(); + const data = parser.data; + + setSettings(data); + setTickets(data.issues); + }); + + useMessageEvent(IssueInfoMessageEvent, event => + { + const parser = event.getParser(); + + setTickets(prevValue => + { + const newValue = [ ...prevValue ]; + const existingIndex = newValue.findIndex(ticket => (ticket.issueId === parser.issueData.issueId)); + + if(existingIndex >= 0) newValue[existingIndex] = parser.issueData; + else + { + newValue.push(parser.issueData); + + PlaySound(SoundNames.MODTOOLS_NEW_TICKET); + } + + return newValue; + }); + }); + + useMessageEvent(ModeratorToolPreferencesEvent, event => + { + const parser = event.getParser(); + }); + + useMessageEvent(IssuePickFailedMessageEvent, event => + { + const parser = event.getParser(); + + if(!parser) return; + + simpleAlert('Failed to pick issue', NotificationAlertType.DEFAULT, null, null, 'Error') + }); + + useMessageEvent(IssueDeletedMessageEvent, event => + { + const parser = event.getParser(); + + setTickets(prevValue => + { + const newValue = [ ...prevValue ]; + const existingIndex = newValue.findIndex(ticket => (ticket.issueId === parser.issueId)); + + if(existingIndex >= 0) newValue.splice(existingIndex, 1); + + return newValue; + }); + }); + + useMessageEvent(ModeratorActionResultMessageEvent, event => + { + const parser = event.getParser(); + + if(parser.success) simpleAlert('Moderation action was successfull', NotificationAlertType.MODERATION, null, null, 'Success'); + else simpleAlert('There was a problem applying tht moderation action', NotificationAlertType.MODERATION, null, null, 'Error'); + }); + + useMessageEvent(CfhTopicsInitEvent, event => + { + const parser = event.getParser(); + + setCfhCategories(parser.callForHelpCategories); + }); + + useMessageEvent(CfhSanctionMessageEvent, event => + { + const parser = event.getParser(); + + // todo: update sanction data + }); + + return { settings, openRooms, openRoomChatlogs, openUserChatlogs, openUserInfos, cfhCategories, tickets, openRoomInfo, closeRoomInfo, toggleRoomInfo, openRoomChatlog, closeRoomChatlog, toggleRoomChatlog, openUserInfo, closeUserInfo, toggleUserInfo, openUserChatlog, closeUserChatlog, toggleUserChatlog }; +} + +export const useModTools = () => useBetween(useModToolsState); diff --git a/src/hooks/navigator/index.ts b/src/hooks/navigator/index.ts new file mode 100644 index 00000000..1f6f0532 --- /dev/null +++ b/src/hooks/navigator/index.ts @@ -0,0 +1 @@ +export * from './useNavigator'; diff --git a/src/hooks/navigator/useNavigator.ts b/src/hooks/navigator/useNavigator.ts new file mode 100644 index 00000000..18d6ebdb --- /dev/null +++ b/src/hooks/navigator/useNavigator.ts @@ -0,0 +1,442 @@ +import { CanCreateRoomEventEvent, CantConnectMessageParser, DoorbellMessageEvent, FlatAccessDeniedMessageEvent, FlatCreatedEvent, FollowFriendMessageComposer, GenericErrorEvent, GetGuestRoomMessageComposer, GetGuestRoomResultEvent, GetUserEventCatsMessageComposer, GetUserFlatCatsMessageComposer, HabboWebTools, LegacyExternalInterface, NavigatorCategoryDataParser, NavigatorEventCategoryDataParser, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSearchEvent, NavigatorSearchResultSet, NavigatorTopLevelContext, RoomDataParser, RoomDoorbellAcceptedEvent, RoomEnterErrorEvent, RoomEntryInfoMessageEvent, RoomForwardEvent, RoomScoreEvent, RoomSettingsUpdatedEvent, SecurityLevel, UserEventCatsEvent, UserFlatCatsEvent, UserInfoEvent, UserPermissionsEvent } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { useBetween } from 'use-between'; +import { CreateLinkEvent, CreateRoomSession, DoorStateType, GetConfiguration, GetSessionDataManager, INavigatorData, LocalizeText, NotificationAlertType, SendMessageComposer, TryVisitRoom, VisitDesktop } from '../../api'; +import { useMessageEvent } from '../events'; +import { useNotification } from '../notification'; + +const useNavigatorState = () => +{ + const [ categories, setCategories ] = useState(null); + const [ eventCategories, setEventCategories ] = useState(null); + const [ topLevelContext, setTopLevelContext ] = useState(null); + const [ topLevelContexts, setTopLevelContexts ] = useState(null); + const [ doorData, setDoorData ] = useState<{ roomInfo: RoomDataParser, state: number }>({ roomInfo: null, state: DoorStateType.NONE }); + const [ searchResult, setSearchResult ] = useState(null); + const [ navigatorData, setNavigatorData ] = useState({ + settingsReceived: false, + homeRoomId: 0, + enteredGuestRoom: null, + currentRoomOwner: false, + currentRoomId: 0, + currentRoomIsStaffPick: false, + createdFlatId: 0, + avatarId: 0, + roomPicker: false, + eventMod: false, + currentRoomRating: 0, + canRate: true + }); + const { simpleAlert = null } = useNotification(); + + useMessageEvent(RoomSettingsUpdatedEvent, event => + { + const parser = event.getParser(); + + SendMessageComposer(new GetGuestRoomMessageComposer(parser.roomId, false, false)); + }); + + useMessageEvent(CanCreateRoomEventEvent, event => + { + const parser = event.getParser(); + + if(parser.canCreate) + { + // show room event cvreate + + return; + } + + simpleAlert(LocalizeText(`navigator.cannotcreateevent.error.${ parser.errorCode }`), null, null, null, LocalizeText('navigator.cannotcreateevent.title')); + }); + + useMessageEvent(UserInfoEvent, event => + { + SendMessageComposer(new GetUserFlatCatsMessageComposer()); + SendMessageComposer(new GetUserEventCatsMessageComposer()); + }); + + useMessageEvent(UserPermissionsEvent, event => + { + const parser = event.getParser(); + + setNavigatorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.eventMod = (parser.securityLevel >= SecurityLevel.MODERATOR); + newValue.roomPicker = (parser.securityLevel >= SecurityLevel.COMMUNITY); + + return newValue; + }); + }); + + useMessageEvent(RoomForwardEvent, event => + { + const parser = event.getParser(); + + TryVisitRoom(parser.roomId); + }); + + useMessageEvent(RoomEntryInfoMessageEvent, event => + { + const parser = event.getParser(); + + setNavigatorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.enteredGuestRoom = null; + newValue.currentRoomOwner = parser.isOwner; + newValue.currentRoomId = parser.roomId; + + return newValue; + }); + + // close room info + // close room settings + // close room filter + + SendMessageComposer(new GetGuestRoomMessageComposer(parser.roomId, true, false)); + + if(LegacyExternalInterface.available) LegacyExternalInterface.call('legacyTrack', 'navigator', 'private', [ parser.roomId ]); + }); + + useMessageEvent(GetGuestRoomResultEvent, event => + { + const parser = event.getParser(); + + if(parser.roomEnter) + { + setDoorData({ roomInfo: null, state: DoorStateType.NONE }); + + setNavigatorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.enteredGuestRoom = parser.data; + newValue.currentRoomIsStaffPick = parser.staffPick; + + const isCreated = (newValue.createdFlatId === parser.data.roomId); + + if(!isCreated && parser.data.displayRoomEntryAd) + { + if(GetConfiguration('roomenterad.habblet.enabled', false)) HabboWebTools.openRoomEnterAd(); + } + + newValue.createdFlatId = 0; + + if(newValue.enteredGuestRoom && (newValue.enteredGuestRoom.habboGroupId > 0)) + { + // close event info + } + + return newValue; + }); + } + else if(parser.roomForward) + { + if((parser.data.ownerName !== GetSessionDataManager().userName) && !parser.isGroupMember) + { + switch(parser.data.doorMode) + { + case RoomDataParser.DOORBELL_STATE: + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.roomInfo = parser.data; + newValue.state = DoorStateType.START_DOORBELL; + + return newValue; + }); + return; + case RoomDataParser.PASSWORD_STATE: + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.roomInfo = parser.data; + newValue.state = DoorStateType.START_PASSWORD; + + return newValue; + }); + return; + } + } + + if((parser.data.doorMode === RoomDataParser.NOOB_STATE) && !GetSessionDataManager().isAmbassador && !GetSessionDataManager().isRealNoob && !GetSessionDataManager().isModerator) return; + + CreateRoomSession(parser.data.roomId); + } + else + { + setNavigatorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.enteredGuestRoom = parser.data; + newValue.currentRoomIsStaffPick = parser.staffPick; + + return newValue; + }); + } + }); + + useMessageEvent(RoomScoreEvent, event => + { + const parser = event.getParser(); + + setNavigatorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.currentRoomRating = parser.totalLikes; + newValue.canRate = parser.canLike; + + return newValue; + }); + }); + + useMessageEvent(DoorbellMessageEvent, event => + { + const parser = event.getParser(); + + if(!parser.userName || (parser.userName.length === 0)) + { + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.state = DoorStateType.STATE_WAITING; + + return newValue; + }); + } + }); + + useMessageEvent(RoomDoorbellAcceptedEvent, event => + { + const parser = event.getParser(); + + if(!parser.userName || (parser.userName.length === 0)) + { + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.state = DoorStateType.STATE_ACCEPTED; + + return newValue; + }); + } + }); + + useMessageEvent(FlatAccessDeniedMessageEvent, event => + { + const parser = event.getParser(); + + if(!parser.userName || (parser.userName.length === 0)) + { + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.state = DoorStateType.STATE_NO_ANSWER; + + return newValue; + }); + } + }); + + useMessageEvent(GenericErrorEvent, event => + { + const parser = event.getParser(); + + switch(parser.errorCode) + { + case -100002: + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.state = DoorStateType.STATE_WRONG_PASSWORD; + + return newValue; + }); + return; + case 4009: + simpleAlert(LocalizeText('navigator.alert.need.to.be.vip'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); + + return; + case 4010: + simpleAlert(LocalizeText('navigator.alert.invalid_room_name'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); + + return; + case 4011: + simpleAlert(LocalizeText('navigator.alert.cannot_perm_ban'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); + + return; + case 4013: + simpleAlert(LocalizeText('navigator.alert.room_in_maintenance'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); + + return; + } + }); + + useMessageEvent(NavigatorMetadataEvent, event => + { + const parser = event.getParser(); + + setTopLevelContexts(parser.topLevelContexts); + setTopLevelContext(parser.topLevelContexts.length ? parser.topLevelContexts[0] : null); + }); + + useMessageEvent(NavigatorSearchEvent, event => + { + const parser = event.getParser(); + + setTopLevelContext(prevValue => + { + let newValue = prevValue; + + if(!newValue) newValue = ((topLevelContexts && topLevelContexts.length && topLevelContexts[0]) || null); + + if(!newValue) return null; + + if((parser.result.code !== newValue.code) && topLevelContexts && topLevelContexts.length) + { + for(const context of topLevelContexts) + { + if(context.code !== parser.result.code) continue; + + newValue = context; + } + } + + for(const context of topLevelContexts) + { + if(context.code !== parser.result.code) continue; + + newValue = context; + } + + return newValue; + }); + + setSearchResult(parser.result); + }); + + useMessageEvent(UserFlatCatsEvent, event => + { + const parser = event.getParser(); + + setCategories(parser.categories); + }); + + useMessageEvent(UserEventCatsEvent, event => + { + const parser = event.getParser(); + + setEventCategories(parser.categories); + }); + + useMessageEvent(FlatCreatedEvent, event => + { + const parser = event.getParser(); + + CreateRoomSession(parser.roomId); + }); + + useMessageEvent(NavigatorHomeRoomEvent, event => + { + const parser = event.getParser(); + + let prevSettingsReceived = false; + + setNavigatorData(prevValue => + { + prevSettingsReceived = prevValue.settingsReceived; + + const newValue = { ...prevValue }; + + newValue.homeRoomId = parser.homeRoomId; + newValue.settingsReceived = true; + + return newValue; + }); + + if(prevSettingsReceived) + { + // refresh room info window + return; + } + + let forwardType = -1; + let forwardId = -1; + + if((GetConfiguration('friend.id') !== undefined) && (parseInt(GetConfiguration('friend.id')) > 0)) + { + forwardType = 0; + SendMessageComposer(new FollowFriendMessageComposer(parseInt(GetConfiguration('friend.id')))); + } + + if((GetConfiguration('forward.type') !== undefined) && (GetConfiguration('forward.id') !== undefined)) + { + forwardType = parseInt(GetConfiguration('forward.type')); + forwardId = parseInt(GetConfiguration('forward.id')) + } + + if(forwardType === 2) + { + TryVisitRoom(forwardId); + } + + else if((forwardType === -1) && (parser.roomIdToEnter > 0)) + { + CreateLinkEvent('navigator/close'); + + if(parser.roomIdToEnter !== parser.homeRoomId) + { + CreateRoomSession(parser.roomIdToEnter); + } + else + { + CreateRoomSession(parser.homeRoomId); + } + } + }); + + useMessageEvent(RoomEnterErrorEvent, event => + { + const parser = event.getParser(); + + switch(parser.reason) + { + case CantConnectMessageParser.REASON_FULL: + simpleAlert(LocalizeText('navigator.guestroomfull.text'), NotificationAlertType.DEFAULT, null, null, LocalizeText('navigator.guestroomfull.title')); + + break; + case CantConnectMessageParser.REASON_QUEUE_ERROR: + simpleAlert(LocalizeText(`room.queue.error.${ parser.parameter }`), NotificationAlertType.DEFAULT, null, null, LocalizeText('room.queue.error.title')); + + break; + case CantConnectMessageParser.REASON_BANNED: + simpleAlert(LocalizeText('navigator.banned.text'), NotificationAlertType.DEFAULT, null, null, LocalizeText('navigator.banned.title')); + + break; + default: + simpleAlert(LocalizeText('room.queue.error.title'), NotificationAlertType.DEFAULT, null, null, LocalizeText('room.queue.error.title')); + + break; + } + + VisitDesktop(); + }); + + useMessageEvent(NavigatorOpenRoomCreatorEvent, event => CreateLinkEvent('navigator/show')); + + return { categories, doorData, setDoorData, topLevelContext, topLevelContexts, searchResult, navigatorData }; +} + +export const useNavigator = () => useBetween(useNavigatorState); diff --git a/src/hooks/notification/index.ts b/src/hooks/notification/index.ts new file mode 100644 index 00000000..b5a85616 --- /dev/null +++ b/src/hooks/notification/index.ts @@ -0,0 +1 @@ +export * from './useNotification'; diff --git a/src/hooks/notification/useNotification.ts b/src/hooks/notification/useNotification.ts new file mode 100644 index 00000000..828edf20 --- /dev/null +++ b/src/hooks/notification/useNotification.ts @@ -0,0 +1,386 @@ +import { AchievementNotificationMessageEvent, ActivityPointNotificationMessageEvent, ClubGiftNotificationEvent, ClubGiftSelectedEvent, HabboBroadcastMessageEvent, HotelClosedAndOpensEvent, HotelClosesAndWillOpenAtEvent, HotelWillCloseInMinutesEvent, InfoFeedEnableMessageEvent, MaintenanceStatusMessageEvent, ModeratorCautionEvent, ModeratorMessageEvent, MOTDNotificationEvent, NotificationDialogMessageEvent, PetLevelNotificationEvent, PetReceivedMessageEvent, RespectReceivedEvent, RoomEnterEffect, RoomEnterEvent, UserBannedMessageEvent, Vector3d } from '@nitrots/nitro-renderer'; +import { useCallback, useState } from 'react'; +import { useBetween } from 'use-between'; +import { GetConfiguration, GetNitroInstance, GetRoomEngine, GetSessionDataManager, LocalizeBadgeName, LocalizeText, NotificationAlertItem, NotificationAlertType, NotificationBubbleItem, NotificationBubbleType, NotificationConfirmItem, PlaySound, ProductImageUtility, TradingNotificationType } from '../../api'; +import { useMessageEvent } from '../events'; + +const cleanText = (text: string) => (text && text.length) ? text.replace(/\\r/g, '\r') : ''; + +const getTimeZeroPadded = (time: number) => +{ + const text = ('0' + time); + + return text.substr((text.length - 2), text.length); +} + +let modDisclaimerTimeout: ReturnType = null; + +const useNotificationState = () => +{ + const [ alerts, setAlerts ] = useState([]); + const [ bubbleAlerts, setBubbleAlerts ] = useState([]); + const [ confirms, setConfirms ] = useState([]); + const [ bubblesDisabled, setBubblesDisabled ] = useState(false); + const [ modDisclaimerShown, setModDisclaimerShown ] = useState(false); + + const getMainNotificationConfig = () => GetConfiguration<{ [key: string]: { delivery?: string, display?: string; title?: string; image?: string }}>('notification', {}); + + const getNotificationConfig = (key: string) => + { + const mainConfig = getMainNotificationConfig(); + + if(!mainConfig) return null; + + return mainConfig[key]; + } + + const getNotificationPart = (options: Map, type: string, key: string, localize: boolean) => + { + if(options.has(key)) return options.get(key); + + const localizeKey = [ 'notification', type, key ].join('.'); + + if(GetNitroInstance().localization.hasValue(localizeKey) || localize) return LocalizeText(localizeKey, Array.from(options.keys()), Array.from(options.values())); + + return null; + } + + const getNotificationImageUrl = (options: Map, type: string) => + { + let imageUrl = options.get('image'); + + if(!imageUrl) imageUrl = GetConfiguration('image.library.notifications.url', '').replace('%image%', type.replace(/\./g, '_')); + + return LocalizeText(imageUrl); + } + + const simpleAlert = useCallback((message: string, type: string = null, clickUrl: string = null, clickUrlText: string = null, title: string = null, imageUrl: string = null) => + { + if(!title || !title.length) title = LocalizeText('notifications.broadcast.title'); + + if(!type || !type.length) type = NotificationAlertType.DEFAULT; + + const alertItem = new NotificationAlertItem([ cleanText(message) ], type, clickUrl, clickUrlText, title, imageUrl); + + setAlerts(prevValue => [ alertItem, ...prevValue ]); + }, []); + + const showNitroAlert = useCallback(() => simpleAlert(null, NotificationAlertType.NITRO), [ simpleAlert ]); + + const showSingleBubble = useCallback((message: string, type: string, imageUrl: string = null, internalLink: string = null) => + { + if(bubblesDisabled) return; + + const notificationItem = new NotificationBubbleItem(message, type, imageUrl, internalLink); + + setBubbleAlerts(prevValue => [ notificationItem, ...prevValue ]); + }, [ bubblesDisabled ]); + + const showNotification = (type: string, options: Map = null) => + { + if(!options) options = new Map(); + + const configuration = getNotificationConfig(('notification.' + type)); + + if(configuration) for(const key in configuration) options.set(key, configuration[key]); + + const title = getNotificationPart(options, type, 'title', true); + const message = getNotificationPart(options, type, 'message', true).replace(/\\r/g, '\r'); + const linkTitle = getNotificationPart(options, type, 'linkTitle', false); + const linkUrl = getNotificationPart(options, type, 'linkUrl', false); + const image = getNotificationImageUrl(options, type); + + if(options.get('display') === 'BUBBLE') + { + showSingleBubble(LocalizeText(message), NotificationBubbleType.INFO, image, linkUrl); + } + else + { + simpleAlert(message, type, linkUrl, linkTitle, title, image); + } + + if(options.get('sound')) PlaySound(options.get('sound')); + } + + const showConfirm = useCallback((message: string, onConfirm: () => void, onCancel: () => void, confirmText: string = null, cancelText: string = null, title: string = null, type: string = null) => + { + if(!confirmText || !confirmText.length) confirmText = LocalizeText('generic.confirm'); + + if(!cancelText || !cancelText.length) cancelText = LocalizeText('generic.cancel'); + + if(!title || !title.length) title = LocalizeText('notifications.broadcast.title'); + + const confirmItem = new NotificationConfirmItem(type, message, onConfirm, onCancel, confirmText, cancelText, title); + + setConfirms(prevValue => [ confirmItem, ...prevValue ]); + }, []); + + const showModeratorMessage = (message: string, url: string = null, showHabboWay: boolean = true) => + { + simpleAlert(message, NotificationAlertType.DEFAULT, url, LocalizeText('mod.alert.link'), LocalizeText('mod.alert.title')); + } + + const showTradeAlert = useCallback((type: number, otherUsername: string = '') => + { + switch(type) + { + case TradingNotificationType.ALERT_SCAM: + simpleAlert(LocalizeText('inventory.trading.warning.other_not_offering'), null, null, null, LocalizeText('inventory.trading.notification.title')); + return; + case TradingNotificationType.HOTEL_TRADING_DISABLED: + case TradingNotificationType.YOU_NOT_ALLOWED: + case TradingNotificationType.THEY_NOT_ALLOWED: + case TradingNotificationType.ROOM_DISABLED: + case TradingNotificationType.YOU_OPEN: + case TradingNotificationType.THEY_OPEN: + simpleAlert(LocalizeText(`inventory.trading.openfail.${ type }`, [ 'otherusername' ], [ otherUsername ]), null, null, null, LocalizeText('inventory.trading.openfail.title')); + return; + case TradingNotificationType.ERROR_WHILE_COMMIT: + simpleAlert(`${ LocalizeText('inventory.trading.notification.caption') }, ${ LocalizeText('inventory.trading.notification.commiterror.info') }`, null, null, null, LocalizeText('inventory.trading.notification.title')); + return; + case TradingNotificationType.THEY_CANCELLED: + simpleAlert(LocalizeText('inventory.trading.info.closed'), null, null, null, LocalizeText('inventory.trading.notification.title')); + return; + } + }, [ simpleAlert ]); + + const closeAlert = useCallback((alert: NotificationAlertItem) => + { + setAlerts(prevValue => + { + const newAlerts = [ ...prevValue ]; + const index = newAlerts.findIndex(value => (alert === value)); + + if(index >= 0) newAlerts.splice(index, 1); + + return newAlerts; + }); + }, []); + + const closeBubbleAlert = useCallback((item: NotificationBubbleItem) => + { + setBubbleAlerts(prevValue => + { + const newAlerts = [ ...prevValue ]; + const index = newAlerts.findIndex(value => (item === value)); + + if(index >= 0) newAlerts.splice(index, 1); + + return newAlerts; + }) + }, []); + + const closeConfirm = useCallback((item: NotificationConfirmItem) => + { + setConfirms(prevValue => + { + const newConfirms = [ ...prevValue ]; + const index = newConfirms.findIndex(value => (item === value)); + + if(index >= 0) newConfirms.splice(index, 1); + + return newConfirms; + }) + }, []); + + useMessageEvent(RespectReceivedEvent, event => + { + const parser = event.getParser(); + + if(parser.userId !== GetSessionDataManager().userId) return; + + const text1 = LocalizeText('notifications.text.respect.1'); + const text2 = LocalizeText('notifications.text.respect.2', [ 'count' ], [ parser.respectsReceived.toString() ]); + + showSingleBubble(text1, NotificationBubbleType.RESPECT); + showSingleBubble(text2, NotificationBubbleType.RESPECT); + }); + + useMessageEvent(HabboBroadcastMessageEvent, event => + { + const parser = event.getParser(); + + simpleAlert(parser.message.replace(/\\r/g, '\r'), null, null, LocalizeText('notifications.broadcast.title')); + }); + + useMessageEvent(AchievementNotificationMessageEvent, event => + { + const parser = event.getParser(); + + const text1 = LocalizeText('achievements.levelup.desc'); + const badgeName = LocalizeBadgeName(parser.data.badgeCode); + const badgeImage = GetSessionDataManager().getBadgeUrl(parser.data.badgeCode); + const internalLink = 'questengine/achievements/' + parser.data.category; + + showSingleBubble((text1 + ' ' + badgeName), NotificationBubbleType.ACHIEVEMENT, badgeImage, internalLink); + }); + + useMessageEvent(ClubGiftNotificationEvent, event => + { + const parser = event.getParser(); + + if(parser.numGifts <= 0) return; + + showSingleBubble(parser.numGifts.toString(), NotificationBubbleType.CLUBGIFT, null, ('catalog/open/' + GetConfiguration('catalog.links')['hc.hc_gifts'])); + }); + + useMessageEvent(ModeratorMessageEvent, event => + { + const parser = event.getParser(); + + showModeratorMessage(parser.message, parser.url, false); + }); + + useMessageEvent(ActivityPointNotificationMessageEvent, event => + { + const parser = event.getParser(); + + if((parser.amountChanged <= 0) || (parser.type !== 5)) return; + + const imageUrl = GetConfiguration('currency.asset.icon.url', '').replace('%type%', parser.type.toString()); + + showSingleBubble(LocalizeText('notifications.text.loyalty.received', [ 'AMOUNT' ], [ parser.amountChanged.toString() ]), NotificationBubbleType.INFO, imageUrl); + }); + + useMessageEvent(UserBannedMessageEvent, event => + { + const parser = event.getParser(); + + showModeratorMessage(parser.message); + }); + + useMessageEvent(HotelClosesAndWillOpenAtEvent, event => + { + const parser = event.getParser(); + + simpleAlert( LocalizeText(('opening.hours.' + (parser.userThrowOutAtClose ? 'disconnected' : 'closed')), [ 'h', 'm' ], [ getTimeZeroPadded(parser.openHour), getTimeZeroPadded(parser.openMinute) ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); + }); + + useMessageEvent(PetReceivedMessageEvent, event => + { + const parser = event.getParser(); + + const text = LocalizeText('notifications.text.' + (parser.boughtAsGift ? 'petbought' : 'petreceived')); + + let imageUrl: string = null; + + const imageResult = GetRoomEngine().getRoomObjectPetImage(parser.pet.typeId, parser.pet.paletteId, parseInt(parser.pet.color, 16), new Vector3d(45 * 3), 64, null, true); + + if(imageResult) imageUrl = imageResult.getImage().src; + + showSingleBubble(text, NotificationBubbleType.PETLEVEL, imageUrl); + }); + + useMessageEvent(MOTDNotificationEvent, event => + { + const parser = event.getParser(); + + const messages = parser.messages.map(message => cleanText(message)); + + const alertItem = new NotificationAlertItem(messages, NotificationAlertType.MOTD, null, null, LocalizeText('notifications.motd.title')); + + setAlerts(prevValue => [ alertItem, ...prevValue ]); + }); + + useMessageEvent(PetLevelNotificationEvent, event => + { + const parser = event.getParser(); + + let imageUrl: string = null; + + const imageResult = GetRoomEngine().getRoomObjectPetImage(parser.figureData.typeId, parser.figureData.paletteId, parseInt(parser.figureData.color, 16), new Vector3d(45 * 3), 64, null, true); + + if(imageResult) imageUrl = imageResult.getImage().src; + + showSingleBubble(LocalizeText('notifications.text.petlevel', [ 'pet_name', 'level' ], [ parser.petName, parser.level.toString() ]), NotificationBubbleType.PETLEVEL, imageUrl); + }); + + useMessageEvent(InfoFeedEnableMessageEvent, event => + { + const parser = event.getParser(); + + setBubblesDisabled(!parser.enabled); + }); + + useMessageEvent(ClubGiftSelectedEvent, event => + { + const parser = event.getParser(); + + if(!parser.products || !parser.products.length) return; + + const productData = parser.products[0]; + + if(!productData) return; + + showSingleBubble(LocalizeText('notifications.text.club_gift.selected'), NotificationBubbleType.INFO, ProductImageUtility.getProductImageUrl(productData.productType, productData.furniClassId, productData.extraParam)); + }); + + useMessageEvent(MaintenanceStatusMessageEvent, event => + { + const parser = event.getParser(); + + simpleAlert(LocalizeText('maintenance.shutdown', [ 'm', 'd' ], [ parser.minutesUntilMaintenance.toString(), parser.duration.toString() ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); + }); + + useMessageEvent(ModeratorCautionEvent, event => + { + const parser = event.getParser(); + + showModeratorMessage(parser.message, parser.url); + }); + + useMessageEvent(NotificationDialogMessageEvent, event => + { + const parser = event.getParser(); + + showNotification(parser.type, parser.parameters); + }); + + useMessageEvent(HotelWillCloseInMinutesEvent, event => + { + const parser = event.getParser(); + + simpleAlert(LocalizeText('opening.hours.shutdown', [ 'm' ], [ parser.openMinute.toString() ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); + }); + + useMessageEvent(HotelClosedAndOpensEvent, event => + { + const parser = event.getParser(); + + simpleAlert(LocalizeText('opening.hours.disconnected', [ 'h', 'm' ], [ parser.openHour.toString(), parser.openMinute.toString() ]), NotificationAlertType.DEFAULT, null, null, LocalizeText('opening.hours.title')); + }); + + const onRoomEnterEvent = useCallback(() => + { + if(modDisclaimerShown) return; + + if(RoomEnterEffect.isRunning()) + { + if(modDisclaimerTimeout) return; + + modDisclaimerTimeout = setTimeout(() => + { + onRoomEnterEvent(); + }, (RoomEnterEffect.totalRunningTime + 5000)); + } + else + { + if(modDisclaimerTimeout) + { + clearTimeout(modDisclaimerTimeout); + + modDisclaimerTimeout = null; + } + + showSingleBubble(LocalizeText('mod.chatdisclaimer'), NotificationBubbleType.INFO); + + setModDisclaimerShown(true); + } + }, [ modDisclaimerShown, showSingleBubble ]); + + useMessageEvent(RoomEnterEvent, onRoomEnterEvent); + + return { alerts, bubbleAlerts, confirms, simpleAlert, showNitroAlert, showTradeAlert, showConfirm, closeAlert, closeBubbleAlert, closeConfirm }; +} + +export const useNotification = () => useBetween(useNotificationState); diff --git a/src/hooks/purse/index.ts b/src/hooks/purse/index.ts new file mode 100644 index 00000000..d9d1ff70 --- /dev/null +++ b/src/hooks/purse/index.ts @@ -0,0 +1 @@ +export * from './usePurse'; diff --git a/src/hooks/purse/usePurse.ts b/src/hooks/purse/usePurse.ts new file mode 100644 index 00000000..6bb5a54b --- /dev/null +++ b/src/hooks/purse/usePurse.ts @@ -0,0 +1,126 @@ +import { ActivityPointNotificationMessageEvent, UserCreditsEvent, UserCurrencyComposer, UserCurrencyEvent, UserSubscriptionComposer, UserSubscriptionEvent, UserSubscriptionParser } from '@nitrots/nitro-renderer'; +import { useEffect, useMemo, useState } from 'react'; +import { useBetween } from 'use-between'; +import { CloneObject, ClubStatus, GetConfiguration, IPurse, PlaySound, Purse, SendMessageComposer, SoundNames } from '../../api'; +import { useMessageEvent } from '../events'; + +const usePurseState = () => +{ + const [ purse, setPurse ] = useState(new Purse()); + const hcDisabled = useMemo(() => GetConfiguration('hc.disabled', false), []); + + const clubStatus = useMemo(() => + { + if(hcDisabled || (purse.clubDays > 0)) return ClubStatus.ACTIVE; + + if((purse.pastVipDays > 0) || (purse.pastVipDays > 0)) return ClubStatus.EXPIRED; + + return ClubStatus.NONE; + }, [ purse, hcDisabled ]); + + const getCurrencyAmount = (type: number) => + { + if(type === -1) return purse.credits; + + for(const [ key, value ] of purse.activityPoints.entries()) + { + if(key !== type) continue; + + return value; + } + + return 0; + } + + useMessageEvent(UserCreditsEvent, event => + { + const parser = event.getParser(); + + setPurse(prevValue => + { + const newValue = CloneObject(prevValue); + + newValue.credits = parseFloat(parser.credits); + + if(prevValue.credits !== newValue.credits) PlaySound(SoundNames.CREDITS); + + return newValue; + }); + }); + + useMessageEvent(UserCurrencyEvent, event => + { + const parser = event.getParser(); + + setPurse(prevValue => + { + const newValue = CloneObject(prevValue); + + newValue.activityPoints = parser.currencies; + + return newValue; + }); + }); + + useMessageEvent(ActivityPointNotificationMessageEvent, event => + { + const parser = event.getParser(); + + setPurse(prevValue => + { + const newValue = CloneObject(prevValue); + + newValue.activityPoints = new Map(newValue.activityPoints); + + newValue.activityPoints.set(parser.type, parser.amount); + + if(parser.type === 0) PlaySound(SoundNames.DUCKETS) + + return newValue; + }); + }); + + useMessageEvent(UserSubscriptionEvent, event => + { + const parser = event.getParser(); + const productName = parser.productName; + + if((productName !== 'club_habbo') && (productName !== 'habbo_club')) return; + + setPurse(prevValue => + { + const newValue = CloneObject(prevValue); + + newValue.clubDays = Math.max(0, parser.daysToPeriodEnd); + newValue.clubPeriods = Math.max(0, parser.periodsSubscribedAhead); + newValue.isVip = parser.isVip; + newValue.pastClubDays = parser.pastClubDays; + newValue.pastVipDays = parser.pastVipDays; + newValue.isExpiring = ((parser.responseType === UserSubscriptionParser.RESPONSE_TYPE_DISCOUNT_AVAILABLE) ? true : false); + newValue.minutesUntilExpiration = parser.minutesUntilExpiration; + newValue.minutesSinceLastModified = parser.minutesSinceLastModified; + + return newValue; + }); + }); + + useEffect(() => + { + if(hcDisabled) return; + + SendMessageComposer(new UserSubscriptionComposer('habbo_club')); + + const interval = setInterval(() => SendMessageComposer(new UserSubscriptionComposer('habbo_club')), 50000); + + return () => clearInterval(interval); + }, [ hcDisabled ]); + + useEffect(() => + { + SendMessageComposer(new UserCurrencyComposer()); + }, []); + + return { purse, hcDisabled, clubStatus, getCurrencyAmount }; +} + +export const usePurse = () => useBetween(usePurseState); diff --git a/src/hooks/rooms/engine/index.ts b/src/hooks/rooms/engine/index.ts new file mode 100644 index 00000000..b41264de --- /dev/null +++ b/src/hooks/rooms/engine/index.ts @@ -0,0 +1,8 @@ +export * from './useFurniAddedEvent'; +export * from './useFurniRemovedEvent'; +export * from './useObjectDeselectedEvent'; +export * from './useObjectRollOutEvent'; +export * from './useObjectRollOverEvent'; +export * from './useObjectSelectedEvent'; +export * from './useUserAddedEvent'; +export * from './useUserRemovedEvent'; diff --git a/src/hooks/rooms/engine/useFurniAddedEvent.ts b/src/hooks/rooms/engine/useFurniAddedEvent.ts new file mode 100644 index 00000000..f5422c64 --- /dev/null +++ b/src/hooks/rooms/engine/useFurniAddedEvent.ts @@ -0,0 +1,19 @@ +import { useEffect } from 'react'; +import { RoomWidgetUpdateRoomObjectEvent, UI_EVENT_DISPATCHER } from '../../../api'; + +export const useFurniAddedEvent = (isActive: boolean, handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => +{ + useEffect(() => + { + if(!isActive) return; + + const onRoomWidgetUpdateRoomObjectEvent = (event: RoomWidgetUpdateRoomObjectEvent) => handler(event); + + UI_EVENT_DISPATCHER.addEventListener(RoomWidgetUpdateRoomObjectEvent.FURNI_ADDED, onRoomWidgetUpdateRoomObjectEvent); + + return () => + { + UI_EVENT_DISPATCHER.removeEventListener(RoomWidgetUpdateRoomObjectEvent.FURNI_ADDED, onRoomWidgetUpdateRoomObjectEvent); + } + }, [ isActive, handler ]); +} diff --git a/src/hooks/rooms/engine/useFurniRemovedEvent.ts b/src/hooks/rooms/engine/useFurniRemovedEvent.ts new file mode 100644 index 00000000..ddd1be2e --- /dev/null +++ b/src/hooks/rooms/engine/useFurniRemovedEvent.ts @@ -0,0 +1,19 @@ +import { useEffect } from 'react'; +import { RoomWidgetUpdateRoomObjectEvent, UI_EVENT_DISPATCHER } from '../../../api'; + +export const useFurniRemovedEvent = (isActive: boolean, handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => +{ + useEffect(() => + { + if(!isActive) return; + + const onRoomWidgetUpdateRoomObjectEvent = (event: RoomWidgetUpdateRoomObjectEvent) => handler(event); + + UI_EVENT_DISPATCHER.addEventListener(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, onRoomWidgetUpdateRoomObjectEvent); + + return () => + { + UI_EVENT_DISPATCHER.removeEventListener(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, onRoomWidgetUpdateRoomObjectEvent); + } + }, [ isActive, handler ]); +} diff --git a/src/hooks/rooms/engine/useObjectDeselectedEvent.ts b/src/hooks/rooms/engine/useObjectDeselectedEvent.ts new file mode 100644 index 00000000..ba549814 --- /dev/null +++ b/src/hooks/rooms/engine/useObjectDeselectedEvent.ts @@ -0,0 +1,7 @@ +import { RoomWidgetUpdateRoomObjectEvent } from '../../../api'; +import { useUiEvent } from '../../events'; + +export const useObjectDeselectedEvent = (handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => +{ + useUiEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED, handler); +} diff --git a/src/hooks/rooms/engine/useObjectRollOutEvent.ts b/src/hooks/rooms/engine/useObjectRollOutEvent.ts new file mode 100644 index 00000000..433ca915 --- /dev/null +++ b/src/hooks/rooms/engine/useObjectRollOutEvent.ts @@ -0,0 +1,7 @@ +import { RoomWidgetUpdateRoomObjectEvent } from '../../../api'; +import { useUiEvent } from '../../events'; + +export const useObjectRollOutEvent = (handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => +{ + useUiEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_ROLL_OUT, handler); +} diff --git a/src/hooks/rooms/engine/useObjectRollOverEvent.ts b/src/hooks/rooms/engine/useObjectRollOverEvent.ts new file mode 100644 index 00000000..2774ef2e --- /dev/null +++ b/src/hooks/rooms/engine/useObjectRollOverEvent.ts @@ -0,0 +1,7 @@ +import { RoomWidgetUpdateRoomObjectEvent } from '../../../api'; +import { useUiEvent } from '../../events'; + +export const useObjectRollOverEvent = (handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => +{ + useUiEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_ROLL_OVER, handler); +} diff --git a/src/hooks/rooms/engine/useObjectSelectedEvent.ts b/src/hooks/rooms/engine/useObjectSelectedEvent.ts new file mode 100644 index 00000000..38db66fa --- /dev/null +++ b/src/hooks/rooms/engine/useObjectSelectedEvent.ts @@ -0,0 +1,7 @@ +import { RoomWidgetUpdateRoomObjectEvent } from '../../../api'; +import { useUiEvent } from '../../events'; + +export const useObjectSelectedEvent = (handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => +{ + useUiEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_SELECTED, handler); +} diff --git a/src/hooks/rooms/engine/useUserAddedEvent.ts b/src/hooks/rooms/engine/useUserAddedEvent.ts new file mode 100644 index 00000000..d3c761bd --- /dev/null +++ b/src/hooks/rooms/engine/useUserAddedEvent.ts @@ -0,0 +1,19 @@ +import { useEffect } from 'react'; +import { RoomWidgetUpdateRoomObjectEvent, UI_EVENT_DISPATCHER } from '../../../api'; + +export const useUserAddedEvent = (isActive: boolean, handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => +{ + useEffect(() => + { + if(!isActive) return; + + const onRoomWidgetUpdateRoomObjectEvent = (event: RoomWidgetUpdateRoomObjectEvent) => handler(event); + + UI_EVENT_DISPATCHER.addEventListener(RoomWidgetUpdateRoomObjectEvent.USER_ADDED, onRoomWidgetUpdateRoomObjectEvent); + + return () => + { + UI_EVENT_DISPATCHER.removeEventListener(RoomWidgetUpdateRoomObjectEvent.USER_ADDED, onRoomWidgetUpdateRoomObjectEvent); + } + }, [ isActive, handler ]); +} diff --git a/src/hooks/rooms/engine/useUserRemovedEvent.ts b/src/hooks/rooms/engine/useUserRemovedEvent.ts new file mode 100644 index 00000000..28202417 --- /dev/null +++ b/src/hooks/rooms/engine/useUserRemovedEvent.ts @@ -0,0 +1,19 @@ +import { useEffect } from 'react'; +import { RoomWidgetUpdateRoomObjectEvent, UI_EVENT_DISPATCHER } from '../../../api'; + +export const useUserRemovedEvent = (isActive: boolean, handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => +{ + useEffect(() => + { + if(!isActive) return; + + const onRoomWidgetUpdateRoomObjectEvent = (event: RoomWidgetUpdateRoomObjectEvent) => handler(event); + + UI_EVENT_DISPATCHER.addEventListener(RoomWidgetUpdateRoomObjectEvent.USER_REMOVED, onRoomWidgetUpdateRoomObjectEvent); + + return () => + { + UI_EVENT_DISPATCHER.removeEventListener(RoomWidgetUpdateRoomObjectEvent.USER_REMOVED, onRoomWidgetUpdateRoomObjectEvent); + } + }, [ isActive, handler ]); +} diff --git a/src/hooks/rooms/index.ts b/src/hooks/rooms/index.ts new file mode 100644 index 00000000..325d8804 --- /dev/null +++ b/src/hooks/rooms/index.ts @@ -0,0 +1,3 @@ +export * from './engine'; +export * from './useRoom'; +export * from './widgets'; diff --git a/src/hooks/rooms/useRoom.ts b/src/hooks/rooms/useRoom.ts new file mode 100644 index 00000000..7481bd2a --- /dev/null +++ b/src/hooks/rooms/useRoom.ts @@ -0,0 +1,294 @@ +import { ColorConverter, IRoomSession, NitroAdjustmentFilter, NitroContainer, NitroSprite, NitroTexture, RoomBackgroundColorEvent, RoomEngineEvent, RoomEngineObjectEvent, RoomGeometry, RoomId, RoomObjectCategory, RoomObjectHSLColorEnabledEvent, RoomObjectOperationType, RoomSessionEvent, RoomVariableEnum, Vector3d } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { useBetween } from 'use-between'; +import { CanManipulateFurniture, DispatchUiEvent, GetNitroInstance, GetRoomEngine, GetRoomSession, InitializeRoomInstanceRenderingCanvas, IsFurnitureSelectionDisabled, ProcessRoomObjectOperation, RoomWidgetUpdateBackgroundColorPreviewEvent, RoomWidgetUpdateRoomObjectEvent, SetActiveRoomId, StartRoomSession } from '../../api'; +import { useRoomEngineEvent, useRoomSessionManagerEvent, useUiEvent } from '../events'; + +const useRoomState = () => +{ + const [ roomSession, setRoomSession ] = useState(null); + const [ roomBackground, setRoomBackground ] = useState(null); + const [ roomFilter, setRoomFilter ] = useState(null); + const [ originalRoomBackgroundColor, setOriginalRoomBackgroundColor ] = useState(0); + + const updateRoomBackgroundColor = (hue: number, saturation: number, lightness: number, original: boolean = false) => + { + if(!roomBackground) return; + + const newColor = ColorConverter.hslToRGB(((((hue & 0xFF) << 16) + ((saturation & 0xFF) << 8)) + (lightness & 0xFF))); + + if(original) setOriginalRoomBackgroundColor(newColor); + + if(!hue && !saturation && !lightness) + { + roomBackground.tint = 0; + } + else + { + roomBackground.tint = newColor; + } + } + + const updateRoomFilter = (color: number) => + { + if(!roomFilter) return; + + const r = ((color >> 16) & 0xFF); + const g = ((color >> 8) & 0xFF); + const b = (color & 0xFF); + + roomFilter.red = (r / 255); + roomFilter.green = (g / 255); + roomFilter.blue = (b / 255); + } + + useUiEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.PREVIEW, event => updateRoomBackgroundColor(event.hue, event.saturation, event.lightness)); + + useUiEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.CLEAR_PREVIEW, event => + { + if(!roomBackground) return; + + roomBackground.tint = originalRoomBackgroundColor; + }); + + useRoomEngineEvent(RoomObjectHSLColorEnabledEvent.ROOM_BACKGROUND_COLOR, event => + { + if(RoomId.isRoomPreviewerId(event.roomId)) return; + + if(event.enable) updateRoomBackgroundColor(event.hue, event.saturation, event.lightness, true); + else updateRoomBackgroundColor(0, 0, 0, true); + }); + + useRoomEngineEvent(RoomBackgroundColorEvent.ROOM_COLOR, event => + { + if(RoomId.isRoomPreviewerId(event.roomId)) return; + + let color = 0x000000; + let brightness = 0xFF; + + if(!event.bgOnly) + { + color = event.color; + brightness = event.brightness; + } + + updateRoomFilter(ColorConverter.hslToRGB(((ColorConverter.rgbToHSL(color) & 0xFFFF00) + brightness))); + }); + + useRoomEngineEvent([ + RoomEngineEvent.INITIALIZED, + RoomEngineEvent.DISPOSED + ], event => + { + if(RoomId.isRoomPreviewerId(event.roomId)) return; + + const session = GetRoomSession(); + + if(!session) return; + + switch(event.type) + { + case RoomEngineEvent.INITIALIZED: + SetActiveRoomId(event.roomId); + setRoomSession(session); + return; + case RoomEngineEvent.DISPOSED: + setRoomSession(null); + return; + } + }); + + useRoomSessionManagerEvent([ + RoomSessionEvent.CREATED, + RoomSessionEvent.ENDED + ], event => + { + switch(event.type) + { + case RoomSessionEvent.CREATED: + StartRoomSession(event.session); + return; + case RoomSessionEvent.ENDED: + setRoomSession(null); + return; + } + }); + + useRoomEngineEvent([ + RoomEngineObjectEvent.SELECTED, + RoomEngineObjectEvent.DESELECTED, + RoomEngineObjectEvent.ADDED, + RoomEngineObjectEvent.REMOVED, + RoomEngineObjectEvent.PLACED, + RoomEngineObjectEvent.REQUEST_MOVE, + RoomEngineObjectEvent.REQUEST_ROTATE, + RoomEngineObjectEvent.MOUSE_ENTER, + RoomEngineObjectEvent.MOUSE_LEAVE + ], event => + { + if(RoomId.isRoomPreviewerId(event.roomId)) return; + + let updateEvent: RoomWidgetUpdateRoomObjectEvent = null; + + switch(event.type) + { + case RoomEngineObjectEvent.SELECTED: + if(!IsFurnitureSelectionDisabled(event)) updateEvent = new RoomWidgetUpdateRoomObjectEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_SELECTED, event.objectId, event.category, event.roomId); + break; + case RoomEngineObjectEvent.DESELECTED: + updateEvent = new RoomWidgetUpdateRoomObjectEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED, event.objectId, event.category, event.roomId); + break; + case RoomEngineObjectEvent.ADDED: { + let addedEventType: string = null; + + switch(event.category) + { + case RoomObjectCategory.FLOOR: + case RoomObjectCategory.WALL: + addedEventType = RoomWidgetUpdateRoomObjectEvent.FURNI_ADDED; + break; + case RoomObjectCategory.UNIT: + addedEventType = RoomWidgetUpdateRoomObjectEvent.USER_ADDED; + break; + } + + if(addedEventType) updateEvent = new RoomWidgetUpdateRoomObjectEvent(addedEventType, event.objectId, event.category, event.roomId); + break; + } + case RoomEngineObjectEvent.REMOVED: { + let removedEventType: string = null; + + switch(event.category) + { + case RoomObjectCategory.FLOOR: + case RoomObjectCategory.WALL: + removedEventType = RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED; + break; + case RoomObjectCategory.UNIT: + removedEventType = RoomWidgetUpdateRoomObjectEvent.USER_REMOVED; + break; + } + + if(removedEventType) updateEvent = new RoomWidgetUpdateRoomObjectEvent(removedEventType, event.objectId, event.category, event.roomId); + break; + } + case RoomEngineObjectEvent.REQUEST_MOVE: + if(CanManipulateFurniture(roomSession, event.objectId, event.category)) ProcessRoomObjectOperation(event.objectId, event.category, RoomObjectOperationType.OBJECT_MOVE); + break; + case RoomEngineObjectEvent.REQUEST_ROTATE: + if(CanManipulateFurniture(roomSession, event.objectId, event.category)) ProcessRoomObjectOperation(event.objectId, event.category, RoomObjectOperationType.OBJECT_ROTATE_POSITIVE); + break; + case RoomEngineObjectEvent.MOUSE_ENTER: + updateEvent = new RoomWidgetUpdateRoomObjectEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_ROLL_OVER, event.objectId, event.category, event.roomId); + break; + case RoomEngineObjectEvent.MOUSE_LEAVE: + updateEvent = new RoomWidgetUpdateRoomObjectEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_ROLL_OUT, event.objectId, event.category, event.roomId); + break; + } + + if(updateEvent) DispatchUiEvent(updateEvent); + }); + + useEffect(() => + { + if(!roomSession) return; + + const nitroInstance = GetNitroInstance(); + const roomEngine = GetRoomEngine(); + const roomId = roomSession.roomId; + const canvasId = 1; + const width = Math.floor(window.innerWidth); + const height = Math.floor(window.innerHeight); + const renderer = nitroInstance.renderer; + + if(renderer) + { + renderer.view.style.width = `${ width }px`; + renderer.view.style.height = `${ height }px`; + renderer.resolution = window.devicePixelRatio; + renderer.resize(width, height); + } + + const displayObject = roomEngine.getRoomInstanceDisplay(roomId, canvasId, width, height, RoomGeometry.SCALE_ZOOMED_IN); + const canvas = GetRoomEngine().getRoomInstanceRenderingCanvas(roomId, canvasId); + + if(!displayObject || !canvas) return; + + const background = new NitroSprite(NitroTexture.WHITE); + const filter = new NitroAdjustmentFilter(); + const master = (canvas.master as NitroContainer); + + background.tint = 0; + background.width = width; + background.height = height; + + master.addChildAt(background, 0); + master.filters = [ filter ]; + + setRoomBackground(background); + setRoomFilter(filter); + + const geometry = (roomEngine.getRoomInstanceGeometry(roomId, canvasId) as RoomGeometry); + + if(geometry) + { + const minX = (roomEngine.getRoomInstanceVariable(roomId, RoomVariableEnum.ROOM_MIN_X) || 0); + const maxX = (roomEngine.getRoomInstanceVariable(roomId, RoomVariableEnum.ROOM_MAX_X) || 0); + const minY = (roomEngine.getRoomInstanceVariable(roomId, RoomVariableEnum.ROOM_MIN_Y) || 0); + const maxY = (roomEngine.getRoomInstanceVariable(roomId, RoomVariableEnum.ROOM_MAX_Y) || 0); + + let x = ((minX + maxX) / 2); + let y = ((minY + maxY) / 2); + + const offset = 20; + + x = (x + (offset - 1)); + y = (y + (offset - 1)); + + const z = (Math.sqrt(((offset * offset) + (offset * offset))) * Math.tan(((30 / 180) * Math.PI))); + + geometry.location = new Vector3d(x, y, z); + } + + const stage = nitroInstance.stage; + + if(!stage) return; + + stage.addChild(displayObject); + + SetActiveRoomId(roomSession.roomId); + + const resize = (event: UIEvent) => + { + const width = Math.floor(window.innerWidth); + const height = Math.floor(window.innerHeight); + + renderer.view.style.width = `${ width }px`; + renderer.view.style.height = `${ height }px`; + renderer.resolution = window.devicePixelRatio; + renderer.resize(width, height); + + background.width = width; + background.height = height; + + InitializeRoomInstanceRenderingCanvas(width, height, 1); + + nitroInstance.render(); + } + + window.addEventListener('resize', resize); + + return () => + { + setRoomBackground(null); + setRoomFilter(null); + setOriginalRoomBackgroundColor(0); + + window.removeEventListener('resize', resize); + } + }, [ roomSession ]); + + return { roomSession }; +} + +export const useRoom = () => useBetween(useRoomState); diff --git a/src/hooks/rooms/widgets/furniture/index.ts b/src/hooks/rooms/widgets/furniture/index.ts new file mode 100644 index 00000000..58a31058 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/index.ts @@ -0,0 +1,17 @@ +export * from './useFurnitureBackgroundColorWidget'; +export * from './useFurnitureBadgeDisplayWidget'; +export * from './useFurnitureContextMenuWidget'; +export * from './useFurnitureDimmerWidget'; +export * from './useFurnitureExchangeWidget'; +export * from './useFurnitureExternalImageWidget'; +export * from './useFurnitureFriendFurniWidget'; +export * from './useFurnitureHighScoreWidget'; +export * from './useFurnitureInternalLinkWidget'; +export * from './useFurnitureMannequinWidget'; +export * from './useFurniturePresentWidget'; +export * from './useFurnitureRoomLinkWidget'; +export * from './useFurnitureSpamWallPostItWidget'; +export * from './useFurnitureStackHeightWidget'; +export * from './useFurnitureStickieWidget'; +export * from './useFurnitureTrophyWidget'; +export * from './useFurnitureYoutubeWidget'; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts new file mode 100644 index 00000000..1e882e2d --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts @@ -0,0 +1,62 @@ +import { ApplyTonerComposer, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { CanManipulateFurniture, DispatchUiEvent, GetRoomEngine, RoomWidgetUpdateBackgroundColorPreviewEvent, SendMessageComposer } from '../../../../api'; +import { useRoomEngineEvent } from '../../../events'; +import { useFurniRemovedEvent } from '../../engine'; +import { useRoom } from '../../useRoom'; + +const useFurnitureBackgroundColorWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ hue, setHue ] = useState(0); + const [ saturation, setSaturation ] = useState(0); + const [ lightness, setLightness ] = useState(0); + const { roomSession = null } = useRoom(); + + const applyToner = () => SendMessageComposer(new ApplyTonerComposer(objectId, hue, saturation, lightness)); + const toggleToner = () => roomSession.useMultistateItem(objectId); + + const onClose = () => + { + DispatchUiEvent(new RoomWidgetUpdateBackgroundColorPreviewEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.CLEAR_PREVIEW)); + + setObjectId(-1); + setCategory(-1); + setHue(0); + setSaturation(0); + setLightness(0); + } + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR, event => + { + if(!CanManipulateFurniture(roomSession, event.objectId, event.category)) return; + + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + const model = roomObject.model; + + setObjectId(event.objectId); + setCategory(event.category) + setHue(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_HUE))); + setSaturation(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION))); + setLightness(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS))); + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + onClose(); + }); + + useEffect(() => + { + if((objectId === -1) || (category === -1)) return; + + DispatchUiEvent(new RoomWidgetUpdateBackgroundColorPreviewEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.PREVIEW, hue, saturation, lightness)); + }, [ objectId, category, hue, saturation, lightness ]); + + return { objectId, hue, setHue, saturation, setSaturation, lightness, setLightness, applyToner, toggleToner, onClose }; +} + +export const useFurnitureBackgroundColorWidget = useFurnitureBackgroundColorWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts new file mode 100644 index 00000000..5ef2bfc4 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts @@ -0,0 +1,75 @@ +import { RoomEngineTriggerWidgetEvent, RoomObjectVariable, StringDataType } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine, GetSessionDataManager, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../../api'; +import { useRoomEngineEvent } from '../../../events'; +import { useNotification } from '../../../notification'; +import { useFurniRemovedEvent } from '../../engine'; + +const useFurnitureBadgeDisplayWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ color, setColor ] = useState('1'); + const [ badgeName, setBadgeName ] = useState(''); + const [ badgeDesc, setBadgeDesc ] = useState(''); + const [ date, setDate ] = useState(''); + const [ senderName, setSenderName ] = useState(''); + const { simpleAlert = null } = useNotification(); + + const onClose = () => + { + setObjectId(-1); + setCategory(-1); + setColor('1'); + setBadgeName(''); + setBadgeDesc(''); + setDate(''); + setSenderName(''); + } + + useRoomEngineEvent([ + RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING, + RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING + ], event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const stringStuff = new StringDataType(); + + stringStuff.initializeFromRoomObjectModel(roomObject.model); + + setObjectId(event.objectId); + setCategory(event.category); + setColor('1'); + setBadgeName(LocalizeBadgeName(stringStuff.getValue(1))); + setBadgeDesc(LocalizeBadgeDescription(stringStuff.getValue(1))); + setDate(stringStuff.getValue(2)); + setSenderName(stringStuff.getValue(3)); + }); + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_FAILED, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const ownerId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); + + if(ownerId !== GetSessionDataManager().userId) return; + + simpleAlert(`${ LocalizeText('resolution.failed.subtitle') } ${ LocalizeText('resolution.failed.text') }`, null, null, null, LocalizeText('resolution.failed.title')); + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + onClose(); + }); + + return { objectId, category, color, badgeName, badgeDesc, date, senderName, onClose }; +} + +export const useFurnitureBadgeDisplayWidget = useFurnitureBadgeDisplayWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts new file mode 100644 index 00000000..8cd0cb30 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts @@ -0,0 +1,149 @@ +import { ContextMenuEnum, GroupFurniContextMenuInfoMessageEvent, GroupFurniContextMenuInfoMessageParser, RoomEngineTriggerWidgetEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { useCallback, useState } from 'react'; +import { GetRoomEngine, IsOwnerOfFurniture, TryJoinGroup, TryVisitRoom } from '../../../../api'; +import { useMessageEvent, useRoomEngineEvent } from '../../../events'; +import { useRoom } from '../../useRoom'; + +const MONSTERPLANT_SEED_CONFIRMATION: string = 'MONSTERPLANT_SEED_CONFIRMATION'; +const PURCHASABLE_CLOTHING_CONFIRMATION: string = 'PURCHASABLE_CLOTHING_CONFIRMATION'; +const GROUP_FURNITURE: string = 'GROUP_FURNITURE'; +const EFFECTBOX_OPEN: string = 'EFFECTBOX_OPEN'; + +const useFurnitureContextMenuWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ mode, setMode ] = useState(null); + const [ confirmMode, setConfirmMode ] = useState(null); + const [ confirmingObjectId, setConfirmingObjectId ] = useState(-1); + const [ groupData, setGroupData ] = useState(null); + const [ isGroupMember, setIsGroupMember ] = useState(false); + const { roomSession = null } = useRoom(); + + const onClose = useCallback(() => + { + setObjectId(-1); + setGroupData(null); + setIsGroupMember(false); + setMode(null); + }, []); + + const closeConfirm = () => + { + setConfirmMode(null); + setConfirmingObjectId(-1); + } + + const processAction = (name: string) => + { + if(name) + { + switch(name) + { + case 'use_friend_furni': + roomSession.useMultistateItem(objectId); + break; + case 'use_monsterplant_seed': + setConfirmMode(MONSTERPLANT_SEED_CONFIRMATION); + setConfirmingObjectId(objectId); + break; + case 'use_random_teleport': + GetRoomEngine().useRoomObject(objectId, RoomObjectCategory.FLOOR); + break; + case 'use_purchaseable_clothing': + setConfirmMode(PURCHASABLE_CLOTHING_CONFIRMATION); + setConfirmingObjectId(objectId); + break; + case 'join_group': + TryJoinGroup(groupData.guildId); + setIsGroupMember(true); + return; + case 'go_to_group_homeroom': + if(groupData) TryVisitRoom(groupData.guildHomeRoomId); + break; + } + } + + onClose(); + } + + useRoomEngineEvent([ + RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU, + RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU, + RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG, + RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG, + RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG + ], event => + { + const object = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, event.category); + + if(!object) return; + + switch(event.type) + { + case RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG: + if(!IsOwnerOfFurniture(object)) return; + + setConfirmingObjectId(object.id); + setConfirmMode(MONSTERPLANT_SEED_CONFIRMATION); + + onClose(); + return; + case RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG: + if(!IsOwnerOfFurniture(object)) return; + + setConfirmingObjectId(object.id); + setConfirmMode(EFFECTBOX_OPEN); + + onClose(); + return; + case RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG: + if(!IsOwnerOfFurniture(object)) return; + + setConfirmingObjectId(object.id); + setConfirmMode(PURCHASABLE_CLOTHING_CONFIRMATION); + + onClose(); + return; + case RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU: + + setObjectId(object.id); + + switch(event.contextMenu) + { + case ContextMenuEnum.FRIEND_FURNITURE: + setMode(ContextMenuEnum.FRIEND_FURNITURE); + return; + case ContextMenuEnum.MONSTERPLANT_SEED: + if(IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.MONSTERPLANT_SEED); + return; + case ContextMenuEnum.MYSTERY_BOX: + return; + case ContextMenuEnum.RANDOM_TELEPORT: + setMode(ContextMenuEnum.RANDOM_TELEPORT); + return; + case ContextMenuEnum.PURCHASABLE_CLOTHING: + if(IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.PURCHASABLE_CLOTHING); + return; + } + + return; + case RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU: + if(object.id === objectId) onClose(); + return; + } + }); + + useMessageEvent(GroupFurniContextMenuInfoMessageEvent, event => + { + const parser = event.getParser(); + + setObjectId(parser.objectId); + setGroupData(parser); + setIsGroupMember(parser.userIsMember); + setMode(GROUP_FURNITURE); + }); + + return { objectId, mode, confirmMode, confirmingObjectId, groupData, isGroupMember, closeConfirm, processAction, onClose }; +} + +export const useFurnitureContextMenuWidget = useFurnitureContextMenuWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts new file mode 100644 index 00000000..6ac8f89f --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts @@ -0,0 +1,110 @@ +import { RoomControllerLevel, RoomEngineDimmerStateEvent, RoomEngineTriggerWidgetEvent, RoomId, RoomSessionDimmerPresetsEvent } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { DimmerFurnitureWidgetPresetItem, FurnitureDimmerUtilities, GetSessionDataManager } from '../../../../api'; +import { useRoomEngineEvent, useRoomSessionManagerEvent } from '../../../events'; +import { useRoom } from '../../useRoom'; + +const useFurnitureDimmerWidgetState = () => +{ + const [ presets, setPresets ] = useState([]); + const [ selectedPresetId, setSelectedPresetId ] = useState(0); + const [ dimmerState, setDimmerState ] = useState(0); + const [ lastDimmerState, setLastDimmerState ] = useState(0); + const [ effectId, setEffectId ] = useState(0); + const [ color, setColor ] = useState(0xFFFFFF); + const [ brightness, setBrightness ] = useState(0xFF); + const [ selectedEffectId, setSelectedEffectId ] = useState(0); + const [ selectedColor, setSelectedColor ] = useState(0); + const [ selectedBrightness, setSelectedBrightness ] = useState(0); + const { roomSession = null } = useRoom(); + + const canOpenWidget = () => (roomSession.isRoomOwner || (roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator); + + const selectPresetId = (id: number) => + { + const preset = presets[(id - 1)]; + + if(!preset) return; + + setSelectedPresetId(preset.id); + setSelectedEffectId(preset.type); + setSelectedColor(preset.color); + setSelectedBrightness(preset.light); + } + + const applyChanges = () => + { + if(dimmerState === 0) return; + + const selectedPresetIndex = (selectedPresetId - 1); + + if((selectedPresetId < 1) || (selectedPresetId > presets.length)) return; + + const preset = presets[selectedPresetIndex]; + + if(!preset || ((selectedEffectId === preset.type) && (selectedColor === preset.color) && (selectedBrightness === preset.light))) return; + + setPresets(prevValue => + { + const newValue = [ ...prevValue ]; + + newValue[selectedPresetIndex] = new DimmerFurnitureWidgetPresetItem(preset.id, selectedEffectId, selectedColor, selectedBrightness); + + return newValue; + }); + + FurnitureDimmerUtilities.savePreset(preset.id, selectedEffectId, selectedColor, selectedBrightness, true); + } + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_DIMMER, event => + { + if(!canOpenWidget()) return; + + roomSession.requestMoodlightSettings(); + }); + + useRoomSessionManagerEvent(RoomSessionDimmerPresetsEvent.ROOM_DIMMER_PRESETS, event => + { + const presets: DimmerFurnitureWidgetPresetItem[] = []; + + let i = 0; + + while(i < event.presetCount) + { + const preset = event.getPreset(i); + + if(preset) presets.push(new DimmerFurnitureWidgetPresetItem(preset.id, preset.type, preset.color, preset.brightness)); + + i++; + } + + setPresets(presets); + setSelectedPresetId(event.selectedPresetId); + }); + + useRoomEngineEvent(RoomEngineDimmerStateEvent.ROOM_COLOR, event => + { + if(RoomId.isRoomPreviewerId(event.roomId)) return; + + setLastDimmerState(dimmerState); + setDimmerState(event.state); + setSelectedPresetId(event.presetId); + setEffectId(event.effectId); + setSelectedEffectId(event.effectId); + setColor(event.color); + setSelectedColor(event.color); + setBrightness(event.brightness); + setSelectedBrightness(event.brightness); + }); + + useEffect(() => + { + if((dimmerState === 0) && (lastDimmerState === 0)) return; + + FurnitureDimmerUtilities.previewDimmer(selectedColor, selectedBrightness, (selectedEffectId === 2)); + }, [ dimmerState, lastDimmerState, selectedColor, selectedBrightness, selectedEffectId ]); + + return { presets, selectedPresetId, dimmerState, lastDimmerState, effectId, color, brightness, selectedEffectId, setSelectedEffectId, selectedColor, setSelectedColor, selectedBrightness, setSelectedBrightness, selectPresetId, applyChanges }; +} + +export const useFurnitureDimmerWidget = useFurnitureDimmerWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts new file mode 100644 index 00000000..5162607d --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts @@ -0,0 +1,48 @@ +import { FurnitureExchangeComposer, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useCallback, useState } from 'react'; +import { GetRoomEngine, GetRoomSession, IsOwnerOfFurniture } from '../../../../api'; +import { useRoomEngineEvent } from '../../../events'; +import { useFurniRemovedEvent } from '../../engine'; + +const useFurnitureExchangeWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ value, setValue ] = useState(0); + + const onClose = useCallback(() => + { + setObjectId(-1); + setCategory(-1); + setValue(0); + }, []); + + const redeem = () => + { + GetRoomSession().connection.send(new FurnitureExchangeComposer(objectId)); + + onClose(); + } + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_CREDITFURNI, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject || !IsOwnerOfFurniture(roomObject)) return; + + setObjectId(event.objectId); + setCategory(event.category); + setValue(roomObject.model.getValue(RoomObjectVariable.FURNITURE_CREDIT_VALUE) || 0); + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + onClose(); + }); + + return { objectId, value, redeem, onClose }; +} + +export const useFurnitureExchangeWidget = useFurnitureExchangeWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts new file mode 100644 index 00000000..5c6a6b17 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts @@ -0,0 +1,44 @@ +import { RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine, IPhotoData } from '../../../../api'; +import { useRoomEngineEvent } from '../../../events'; +import { useFurniRemovedEvent } from '../../engine'; + +const useFurnitureExternalImageWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ photoData, setPhotoData ] = useState(null); + + const onClose = () => + { + setObjectId(-1); + setCategory(-1); + setPhotoData(null); + } + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_EXTERNAL_IMAGE, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); + const photoData = (JSON.parse(data) as IPhotoData); + + setObjectId(event.objectId); + setCategory(event.category); + setPhotoData(photoData); + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + onClose(); + }); + + return { objectId, photoData, onClose }; +} + +export const useFurnitureExternalImageWidget = useFurnitureExternalImageWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts new file mode 100644 index 00000000..e658189d --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts @@ -0,0 +1,75 @@ +import { FriendFurniConfirmLockMessageComposer, LoveLockFurniFinishedEvent, LoveLockFurniFriendConfirmedEvent, LoveLockFurniStartEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine, GetRoomSession } from '../../../../api'; +import { useMessageEvent, useRoomEngineEvent } from '../../../events'; +import { useFurniRemovedEvent } from '../../engine'; + +const useFurnitureFriendFurniWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ type, setType ] = useState(0); + const [ usernames, setUsernames ] = useState([]); + const [ figures, setFigures ] = useState([]); + const [ date, setDate ] = useState(null); + const [ stage, setStage ] = useState(0); + + const onClose = () => + { + setObjectId(-1); + setCategory(-1); + setType(0); + setUsernames([]); + setFigures([]); + setDate(null); + } + + const respond = (flag: boolean) => + { + GetRoomSession().connection.send(new FriendFurniConfirmLockMessageComposer(objectId, flag)); + + onClose(); + } + + useMessageEvent(LoveLockFurniStartEvent, event => + { + const parser = event.getParser(); + + setObjectId(parser.furniId); + setStage(parser.start ? 1 : 2); + }); + + useMessageEvent(LoveLockFurniFinishedEvent, event => onClose()); + useMessageEvent(LoveLockFurniFriendConfirmedEvent, event => onClose()); + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); + const type = roomObject.model.getValue(RoomObjectVariable.FURNITURE_FRIENDFURNI_ENGRAVING); + + if((data[0] !== '1') || (data.length !== 6)) return; + + setObjectId(event.objectId); + setCategory(event.category); + setType(type); + setUsernames([ data[1], data[2] ]); + setFigures([ data[3], data[4] ]); + setDate(data[5]); + setStage(0); + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + onClose(); + }); + + return { objectId, type, usernames, figures, date, stage, onClose, respond }; +} + +export const useFurnitureFriendFurniWidget = useFurnitureFriendFurniWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts new file mode 100644 index 00000000..0d986d51 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts @@ -0,0 +1,56 @@ +import { HighScoreDataType, ObjectDataFactory, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine } from '../../../../api'; +import { useRoomEngineEvent } from '../../../events'; +import { useRoom } from '../../useRoom'; + +const SCORE_TYPES = [ 'perteam', 'mostwins', 'classic' ]; +const CLEAR_TYPES = [ 'alltime', 'daily', 'weekly', 'monthly' ]; + +const useFurnitureHighScoreWidgetState = () => +{ + const [ stuffDatas, setStuffDatas ] = useState>(new Map()); + const { roomSession = null } = useRoom(); + + const getScoreType = (type: number) => SCORE_TYPES[type]; + const getClearType = (type: number) => CLEAR_TYPES[type]; + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const formatKey = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT); + const stuffData = (ObjectDataFactory.getData(formatKey) as HighScoreDataType); + + stuffData.initializeFromRoomObjectModel(roomObject.model); + + setStuffDatas(prevValue => + { + const newValue = new Map(prevValue); + + newValue.set(roomObject.id, stuffData); + + return newValue; + }); + }); + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY, event => + { + if(event.roomId !== roomSession.roomId) return; + + setStuffDatas(prevValue => + { + const newValue = new Map(prevValue); + + newValue.delete(event.objectId); + + return newValue; + }); + }); + + return { stuffDatas, getScoreType, getClearType }; +} + +export const useFurnitureHighScoreWidget = useFurnitureHighScoreWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts new file mode 100644 index 00000000..c1b68801 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts @@ -0,0 +1,27 @@ +import { RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent, GetRoomEngine } from '../../../../api'; +import { useRoomEngineEvent } from '../../../events'; + +const INTERNALLINK = 'internalLink'; + +const useFurnitureInternalLinkWidgetState = () => +{ + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); + + let link = data[INTERNALLINK]; + + if(!link || !link.length) link = roomObject.model.getValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK); + + if(link && link.length) CreateLinkEvent(link); + }); + + return {}; +} + +export const useFurnitureInternalLinkWidget = useFurnitureInternalLinkWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts new file mode 100644 index 00000000..60429757 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts @@ -0,0 +1,80 @@ +import { FurnitureMannequinSaveLookComposer, FurnitureMannequinSaveNameComposer, FurnitureMultiStateComposer, HabboClubLevelEnum, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetAvatarRenderManager, GetRoomEngine, MannequinUtilities, SendMessageComposer } from '../../../../api'; +import { useRoomEngineEvent } from '../../../events'; +import { useFurniRemovedEvent } from '../../engine'; + +const useFurnitureMannequinWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ figure, setFigure ] = useState(null); + const [ gender, setGender ] = useState(null); + const [ clubLevel, setClubLevel ] = useState(HabboClubLevelEnum.NO_CLUB); + const [ name, setName ] = useState(null); + + const onClose = () => + { + setObjectId(-1); + setCategory(-1); + setFigure(null); + setGender(null); + setName(null); + } + + const saveFigure = () => + { + if(objectId === -1) return; + + SendMessageComposer(new FurnitureMannequinSaveLookComposer(objectId)); + + onClose(); + } + + const wearFigure = () => + { + if(objectId === -1) return; + + SendMessageComposer(new FurnitureMultiStateComposer(objectId)); + + onClose(); + } + + const saveName = () => + { + if(objectId === -1) return; + + SendMessageComposer(new FurnitureMannequinSaveNameComposer(objectId, name)); + } + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_MANNEQUIN, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const model = roomObject.model; + const figure = (model.getValue(RoomObjectVariable.FURNITURE_MANNEQUIN_FIGURE) || null); + const gender = (model.getValue(RoomObjectVariable.FURNITURE_MANNEQUIN_GENDER) || null); + const figureContainer = GetAvatarRenderManager().createFigureContainer(figure); + const figureClubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender, MannequinUtilities.MANNEQUIN_CLOTHING_PART_TYPES); + + setObjectId(event.objectId); + setCategory(event.category); + setFigure(figure); + setGender(gender); + setClubLevel(figureClubLevel); + setName(model.getValue(RoomObjectVariable.FURNITURE_MANNEQUIN_NAME) || null); + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + onClose(); + }); + + return { objectId, figure, gender, clubLevel, name, setName, saveFigure, wearFigure, saveName, onClose }; +} + +export const useFurnitureMannequinWidget = useFurnitureMannequinWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts b/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts new file mode 100644 index 00000000..8342b512 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts @@ -0,0 +1,225 @@ +import { IFurnitureData, IGetImageListener, PetFigureData, RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable, RoomSessionPresentEvent, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; +import { useMemo, useState } from 'react'; +import { useRoom } from '../../..'; +import { GetRoomEngine, GetSessionDataManager, IsOwnerOfFurniture, LocalizeText, ProductTypeEnum } from '../../../../api'; +import { useRoomEngineEvent, useRoomSessionManagerEvent } from '../../../events'; +import { useFurniRemovedEvent } from '../../engine'; + +const FLOOR: string = 'floor'; +const WALLPAPER: string = 'wallpaper'; +const LANDSCAPE: string = 'landscape'; +const POSTER: string = 'poster'; + +const useFurniturePresentWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ classId, setClassId ] = useState(-1); + const [ itemType, setItemType ] = useState(null); + const [ text, setText ] = useState(null); + const [ isOwnerOfFurniture, setIsOwnerOfFurniture ] = useState(false); + const [ senderName, setSenderName ] = useState(null); + const [ senderFigure, setSenderFigure ] = useState(null); + const [ placedItemId, setPlacedItemId ] = useState(-1); + const [ placedItemType, setPlacedItemType ] = useState(null); + const [ placedInRoom, setPlacedInRoom ] = useState(false); + const [ imageUrl, setImageUrl ] = useState(null); + const { roomSession = null } = useRoom(); + + const onClose = () => + { + setObjectId(-1); + setClassId(-1); + setItemType(null); + setText(null); + setIsOwnerOfFurniture(false); + setSenderName(null); + setSenderFigure(null); + setPlacedItemId(-1); + setPlacedItemType(null); + setPlacedInRoom(false); + setImageUrl(null); + } + + const openPresent = () => + { + if(objectId === -1) return; + + roomSession.openGift(objectId); + + GetRoomEngine().changeObjectModelData(GetRoomEngine().activeRoomId, objectId, RoomObjectCategory.FLOOR, RoomObjectVariable.FURNITURE_DISABLE_PICKING_ANIMATION, 1); + } + + const imageListener: IGetImageListener = useMemo(() => + { + return { + imageReady: (id, texture, image) => + { + if(!image && texture) + { + image = TextureUtils.generateImage(texture); + } + + setImageUrl(image.src); + }, + imageFailed: null + } + }, []); + + useRoomSessionManagerEvent(RoomSessionPresentEvent.RSPE_PRESENT_OPENED, event => + { + let furniData: IFurnitureData = null; + + if(event.itemType === ProductTypeEnum.FLOOR) + { + furniData = GetSessionDataManager().getFloorItemData(event.classId); + } + else if(event.itemType === ProductTypeEnum.WALL) + { + furniData = GetSessionDataManager().getWallItemData(event.classId); + } + + let isOwnerOfFurni = false; + + if(event.placedInRoom) + { + const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.placedItemId, RoomObjectCategory.FLOOR); + + if(roomObject) isOwnerOfFurni = IsOwnerOfFurniture(roomObject); + } + + let giftImage: string = null; + + switch(event.itemType) + { + case ProductTypeEnum.WALL: { + if(furniData) + { + switch(furniData.className) + { + case FLOOR: + case LANDSCAPE: + case WALLPAPER: + let imageType = null; + let message = null; + + if(furniData.className === FLOOR) + { + imageType = 'packagecard_icon_floor'; + message = LocalizeText('inventory.furni.item.floor.name'); + } + + else if(furniData.className === LANDSCAPE) + { + imageType = 'packagecard_icon_landscape'; + message = LocalizeText('inventory.furni.item.landscape.name'); + } + + else + { + imageType = 'packagecard_icon_wallpaper'; + message = LocalizeText('inventory.furni.item.wallpaper.name'); + } + + setText(message); + //setImageUrl(getGiftImageUrl(imageType)); + break; + case POSTER: { + const productCode = event.productCode; + + let extras: string = null; + + if(productCode.indexOf('poster') === 0) extras = productCode.replace('poster', ''); + + const productData = GetSessionDataManager().getProductData(productCode); + + let name: string = null; + + if(productData) name = productData.name; + else if(furniData) name = furniData.name; + + setText(name); + setImageUrl(GetRoomEngine().getFurnitureWallIconUrl(event.classId, extras)); + + break; + } + default: { + setText(furniData.name || null); + setImageUrl(GetRoomEngine().getFurnitureWallIconUrl(event.classId)); + break; + } + } + } + + break; + } + case ProductTypeEnum.HABBO_CLUB: + setText(LocalizeText('widget.furni.present.hc')); + //setImageUrl(getGiftImageUrl('packagecard_icon_hc')); + break; + default: { + if(event.placedItemType === ProductTypeEnum.PET) + { + const petfigureString = event.petFigureString; + + if(petfigureString && petfigureString.length) + { + const petFigureData = new PetFigureData(petfigureString); + + const petImage = GetRoomEngine().getRoomObjectPetImage(petFigureData.typeId, petFigureData.paletteId, petFigureData.color, new Vector3d(90), 64, imageListener, true, 0, petFigureData.customParts); + + if(petImage) setImageUrl(petImage.getImage().src); + } + } + else + { + const furniImage = GetRoomEngine().getFurnitureFloorImage(event.classId, new Vector3d(90), 64, imageListener); + + if(furniImage) setImageUrl(furniImage.getImage().src); + } + + const productData = GetSessionDataManager().getProductData(event.productCode); + + setText((productData && productData.name) || furniData.name); + break; + } + } + + setObjectId(0); + setClassId(event.classId); + setItemType(event.itemType); + setIsOwnerOfFurniture(isOwnerOfFurni); + setPlacedItemId(event.placedItemId); + setPlacedItemType(event.placedItemType); + setPlacedInRoom(event.placedInRoom); + }); + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_PRESENT, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return null; + + onClose(); + + setObjectId(event.objectId); + setClassId(-1); + setText((roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA) || '')); + setIsOwnerOfFurniture(IsOwnerOfFurniture(roomObject)); + setSenderName((roomObject.model.getValue(RoomObjectVariable.FURNITURE_PURCHASER_NAME) || null)); + setSenderFigure((roomObject.model.getValue(RoomObjectVariable.FURNITURE_PURCHASER_FIGURE) || null)); + }); + + useFurniRemovedEvent((objectId !== -1), event => + { + if(event.id === objectId) onClose(); + + if(event.id === placedItemId) + { + if(placedInRoom) setPlacedInRoom(false); + } + }); + + return { objectId, classId, itemType, text, isOwnerOfFurniture, senderName, senderFigure, placedItemId, placedItemType, placedInRoom, imageUrl, openPresent, onClose }; +} + +export const useFurniturePresentWidget = useFurniturePresentWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts new file mode 100644 index 00000000..95d193f4 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts @@ -0,0 +1,49 @@ +import { GetGuestRoomMessageComposer, GetGuestRoomResultEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine, SendMessageComposer } from '../../../../api'; +import { useMessageEvent, useRoomEngineEvent } from '../../../events'; + +const INTERNALLINK = 'internalLink'; + +const useFurnitureRoomLinkWidgetState = () => +{ + const [ roomIdToEnter, setRoomIdToEnter ] = useState(0); + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); + + let roomId = data[INTERNALLINK]; + + if(!roomId || !roomId.length) roomId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK); + + if(!roomId || !roomId.length) return; + + roomId = parseInt(roomId, 10); + + if(roomId === NaN) return; + + setRoomIdToEnter(roomId); + + SendMessageComposer(new GetGuestRoomMessageComposer(roomId, false, false)); + }); + + useMessageEvent(GetGuestRoomResultEvent, event => + { + if(!roomIdToEnter) return; + + const parser = event.getParser(); + + if(parser.data.roomId !== roomIdToEnter) return; + + setRoomIdToEnter(0); + }); + + return {}; +} + +export const useFurnitureRoomLinkWidget = useFurnitureRoomLinkWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts new file mode 100644 index 00000000..64f89b0b --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts @@ -0,0 +1,59 @@ +import { AddSpamWallPostItMessageComposer, RequestSpamWallPostItMessageEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine, SendMessageComposer } from '../../../../api'; +import { useMessageEvent } from '../../../events'; +import { useInventoryFurni } from '../../../inventory'; + +const useFurnitureSpamWallPostItWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ itemType, setItemType ] = useState(''); + const [ location, setLocation ] = useState(''); + const [ color, setColor ] = useState('0'); + const [ text, setText ] = useState(''); + const [ canModify, setCanModify ] = useState(false); + const { getWallItemById = null } = useInventoryFurni(); + + const onClose = () => + { + SendMessageComposer(new AddSpamWallPostItMessageComposer(objectId, location, color, text)); + + setObjectId(-1); + setCategory(-1); + setItemType(''); + setLocation(''); + setColor('0'); + setText(''); + setCanModify(false); + } + + useMessageEvent(RequestSpamWallPostItMessageEvent, event => + { + const parser = event.getParser(); + + setObjectId(parser.itemId); + setCategory(RoomObjectCategory.WALL); + + const inventoryItem = getWallItemById(parser.itemId); + + let itemType = 'post_it'; + + if(inventoryItem) + { + const wallItemType = GetRoomEngine().getFurnitureWallName(inventoryItem.type); + + if(wallItemType.match('post_it_')) itemType = wallItemType; + } + + setItemType(itemType); + setLocation(parser.location); + setColor('FFFF33'); + setText(''); + setCanModify(true); + }); + + return { objectId, color, setColor, text, setText, canModify, onClose }; +} + +export const useFurnitureSpamWallPostItWidget = useFurnitureSpamWallPostItWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts new file mode 100644 index 00000000..0ac47137 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts @@ -0,0 +1,79 @@ +import { FurnitureStackHeightComposer, FurnitureStackHeightEvent, RoomEngineTriggerWidgetEvent } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { CanManipulateFurniture, GetRoomEngine, GetRoomSession, SendMessageComposer } from '../../../../api'; +import { useMessageEvent, useRoomEngineEvent } from '../../../events'; +import { useFurniRemovedEvent } from '../../engine'; + +const MAX_HEIGHT: number = 40; + +const useFurnitureStackHeightWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ height, setHeight ] = useState(0); + const [ pendingHeight, setPendingHeight ] = useState(-1); + + const onClose = () => + { + setObjectId(-1); + setCategory(-1); + setHeight(0); + setPendingHeight(-1); + } + + const updateHeight = (height: number, server: boolean = false) => + { + if(!height) height = 0; + + height = Math.abs(height); + + if(!server) ((height > MAX_HEIGHT) && (height = MAX_HEIGHT)); + + setHeight(parseFloat(height.toFixed(2))); + + if(!server) setPendingHeight(height * 100); + } + + useMessageEvent(FurnitureStackHeightEvent, event => + { + const parser = event.getParser(); + + if(objectId !== parser.furniId) return; + + updateHeight(parser.height, true); + }); + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_STACK_HEIGHT, event => + { + if(!CanManipulateFurniture(GetRoomSession(), event.objectId, event.category)) return; + + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + setObjectId(event.objectId); + setCategory(event.category); + setHeight(roomObject.getLocation().z); + setPendingHeight(-1); + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + onClose(); + }); + + useEffect(() => + { + if((objectId === -1) || (pendingHeight === -1)) return; + + const timeout = setTimeout(() => SendMessageComposer(new FurnitureStackHeightComposer(objectId, ~~(pendingHeight))), 10); + + return () => clearTimeout(timeout); + }, [ objectId, pendingHeight ]); + + return { objectId, height, maxHeight: MAX_HEIGHT, onClose, updateHeight }; +} + +export const useFurnitureStackHeightWidget = useFurnitureStackHeightWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts new file mode 100644 index 00000000..f1e89134 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts @@ -0,0 +1,82 @@ +import { RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine, GetRoomSession, GetSessionDataManager, IsOwnerOfFurniture } from '../../../../api'; +import { useRoomEngineEvent } from '../../../events'; +import { useFurniRemovedEvent } from '../../engine'; + +const useFurnitureStickieWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ color, setColor ] = useState('0'); + const [ text, setText ] = useState(''); + const [ canModify, setCanModify ] = useState(false); + + const onClose = () => + { + setObjectId(-1); + setCategory(-1); + setColor('0'); + setText(''); + setCanModify(false); + } + + const updateColor = (newColor: string) => + { + if(newColor === color) return; + + setColor(newColor); + + GetRoomEngine().modifyRoomObjectData(objectId, category, newColor, text); + } + + const updateText = (newText: string) => + { + setText(newText); + + GetRoomEngine().modifyRoomObjectData(objectId, category, color, newText); + } + + const trash = () => GetRoomEngine().deleteRoomObject(objectId, category); + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_STICKIE, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_ITEMDATA); + + if(data.length < 6) return; + + let color: string = null; + let text: string = null; + + if(data.indexOf(' ') > 0) + { + color = data.slice(0, data.indexOf(' ')); + text = data.slice((data.indexOf(' ') + 1), data.length); + } + else + { + color = data; + } + + setObjectId(event.objectId); + setCategory(event.category); + setColor(color || '0'); + setText(text || ''); + setCanModify(GetRoomSession().isRoomOwner || GetSessionDataManager().isModerator || IsOwnerOfFurniture(roomObject)); + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + onClose(); + }); + + return { objectId, color, text, canModify, updateColor, updateText, trash, onClose }; +} + +export const useFurnitureStickieWidget = useFurnitureStickieWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts new file mode 100644 index 00000000..d5a1e331 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts @@ -0,0 +1,63 @@ +import { RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine } from '../../../../api'; +import { useRoomEngineEvent } from '../../../events'; +import { useFurniRemovedEvent } from '../../engine'; + +const useFurnitureTrophyWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ color, setColor ] = useState('1'); + const [ senderName, setSenderName ] = useState(''); + const [ date, setDate ] = useState(''); + const [ message, setMessage ] = useState(''); + + const onClose = () => + { + setObjectId(-1); + setCategory(-1); + setColor('1'); + setSenderName(''); + setDate(''); + setMessage(''); + } + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_TROPHY, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + let data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); + let extra = roomObject.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS); + + if(!extra) extra = '0'; + + setObjectId(event.objectId); + setCategory(event.category); + setColor(roomObject.model.getValue(RoomObjectVariable.FURNITURE_COLOR) || '1'); + + const senderName = data.substring(0, data.indexOf('\t')); + + data = data.substring((senderName.length + 1), data.length); + + const trophyDate = data.substring(0, data.indexOf('\t')); + const trophyText = data.substr((trophyDate.length + 1), data.length); + + setSenderName(senderName); + setDate(trophyDate); + setMessage(trophyText); + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + onClose(); + }); + + return { objectId, color, senderName, date, message, onClose }; +} + +export const useFurnitureTrophyWidget = useFurnitureTrophyWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts new file mode 100644 index 00000000..79548e78 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts @@ -0,0 +1,127 @@ +import { ControlYoutubeDisplayPlaybackMessageComposer, GetYoutubeDisplayStatusMessageComposer, RoomEngineTriggerWidgetEvent, RoomId, SecurityLevel, SetYoutubeDisplayPlaylistMessageComposer, YoutubeControlVideoMessageEvent, YoutubeDisplayPlaylist, YoutubeDisplayPlaylistsEvent, YoutubeDisplayVideoMessageEvent } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine, GetSessionDataManager, IsOwnerOfFurniture, SendMessageComposer, YoutubeVideoPlaybackStateEnum } from '../../../../api'; +import { useMessageEvent, useRoomEngineEvent } from '../../../events'; +import { useFurniRemovedEvent } from '../../engine'; + +const CONTROL_COMMAND_PREVIOUS_VIDEO = 0; +const CONTROL_COMMAND_NEXT_VIDEO = 1; +const CONTROL_COMMAND_PAUSE_VIDEO = 2; +const CONTROL_COMMAND_CONTINUE_VIDEO = 3; + +const useFurnitureYoutubeWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ videoId, setVideoId ] = useState(null); + const [ videoStart, setVideoStart ] = useState(null); + const [ videoEnd, setVideoEnd ] = useState(null); + const [ currentVideoState, setCurrentVideoState ] = useState(-1); + const [ selectedVideo, setSelectedVideo ] = useState(null); + const [ playlists, setPlaylists ] = useState(null); + const [ hasControl, setHasControl ] = useState(false); + + const onClose = () => + { + setObjectId(-1); + setCategory(-1); + setVideoId(null); + setVideoStart(null); + setVideoEnd(null); + setCurrentVideoState(-1); + setSelectedVideo(null); + setPlaylists(null); + setHasControl(false); + } + + const previous = () => SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_PREVIOUS_VIDEO)); + + const next = () => SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_NEXT_VIDEO)); + + const pause = () => (hasControl && videoId && videoId.length) && SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_PAUSE_VIDEO)); + + const play = () => (hasControl && videoId && videoId.length) && SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_CONTINUE_VIDEO)); + + const selectVideo = (video: string) => + { + if(selectedVideo === video) + { + setSelectedVideo(null); + SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, '')); + + return; + } + + setSelectedVideo(video); + SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, video)); + } + + useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_YOUTUBE, event => + { + if(RoomId.isRoomPreviewerId(event.roomId)) return; + + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + setObjectId(event.objectId); + setCategory(event.category); + setHasControl(GetSessionDataManager().hasSecurity(SecurityLevel.EMPLOYEE) || IsOwnerOfFurniture(roomObject)); + + SendMessageComposer(new GetYoutubeDisplayStatusMessageComposer(event.objectId)); + }); + + useMessageEvent(YoutubeDisplayVideoMessageEvent, event => + { + const parser = event.getParser(); + + if((objectId === -1) || (objectId !== parser.furniId)) return; + + setVideoId(parser.videoId); + setVideoStart(parser.startAtSeconds); + setVideoEnd(parser.endAtSeconds); + setCurrentVideoState(parser.state); + }); + + useMessageEvent(YoutubeDisplayPlaylistsEvent, event => + { + const parser = event.getParser(); + + if((objectId === -1) || (objectId !== parser.furniId)) return; + + setPlaylists(parser.playlists); + setSelectedVideo(parser.selectedPlaylistId); + setVideoId(null); + setCurrentVideoState(-1); + setVideoEnd(null); + setVideoStart(null); + }); + + useMessageEvent(YoutubeControlVideoMessageEvent, event => + { + const parser = event.getParser(); + + if((objectId === -1) || (objectId !== parser.furniId)) return; + + switch(parser.commandId) + { + case 1: + setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PLAYING); + break; + case 2: + setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PAUSED); + break; + } + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + onClose(); + }); + + return { objectId, videoId, videoStart, videoEnd, currentVideoState, selectedVideo, playlists, onClose, previous, next, pause, play, selectVideo }; +} + +export const useFurnitureYoutubeWidget = useFurnitureYoutubeWidgetState; diff --git a/src/hooks/rooms/widgets/index.ts b/src/hooks/rooms/widgets/index.ts new file mode 100644 index 00000000..53b15d41 --- /dev/null +++ b/src/hooks/rooms/widgets/index.ts @@ -0,0 +1,10 @@ +export * from './furniture'; +export * from './useAvatarInfoWidget'; +export * from './useChatInputWidget'; +export * from './useChatWidget'; +export * from './useDoorbellWidget'; +export * from './useFriendRequestWidget'; +export * from './useFurniChooserWidget'; +export * from './usePollWidget'; +export * from './useUserChooserWidget'; +export * from './useWordQuizWidget'; diff --git a/src/hooks/rooms/widgets/useAvatarInfoWidget.ts b/src/hooks/rooms/widgets/useAvatarInfoWidget.ts new file mode 100644 index 00000000..0b8ebd1d --- /dev/null +++ b/src/hooks/rooms/widgets/useAvatarInfoWidget.ts @@ -0,0 +1,355 @@ +import { RoomEngineObjectEvent, RoomEngineUseProductEvent, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionPetInfoUpdateEvent, RoomSessionPetStatusUpdateEvent, RoomSessionUserDataUpdateEvent } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { AvatarInfoFurni, AvatarInfoName, AvatarInfoPet, AvatarInfoRentableBot, AvatarInfoUser, AvatarInfoUtilities, CanManipulateFurniture, FurniCategory, GetRoomEngine, GetSessionDataManager, IAvatarInfo, IsOwnerOfFurniture, RoomWidgetUpdateRoomObjectEvent, UseProductItem } from '../../../api'; +import { useRoomEngineEvent, useRoomSessionManagerEvent, useUiEvent } from '../../events'; +import { useFriends } from '../../friends'; +import { useWired } from '../../wired'; +import { useObjectDeselectedEvent, useObjectRollOutEvent, useObjectRollOverEvent, useObjectSelectedEvent } from '../engine'; +import { useRoom } from '../useRoom'; + +const useAvatarInfoWidgetState = () => +{ + const [ avatarInfo, setAvatarInfo ] = useState(null); + const [ activeNameBubble, setActiveNameBubble ] = useState(null); + const [ nameBubbles, setNameBubbles ] = useState([]); + const [ productBubbles, setProductBubbles ] = useState([]); + const [ confirmingProduct, setConfirmingProduct ] = useState(null); + const [ pendingPetId, setPendingPetId ] = useState(-1); + const [ isDecorating, setIsDecorating ] = useState(false); + const { friends = [] } = useFriends(); + const { selectObjectForWired = null } = useWired(); + const { roomSession = null } = useRoom(); + + const removeNameBubble = (index: number) => + { + setNameBubbles(prevValue => + { + const newValue = [ ...prevValue ]; + + newValue.splice(index, 1); + + return newValue; + }); + } + + const removeProductBubble = (index: number) => + { + setProductBubbles(prevValue => + { + const newValue = [ ...prevValue ]; + const item = newValue.splice(index, 1)[0]; + + if(confirmingProduct === item) setConfirmingProduct(null); + + return newValue; + }); + } + + const updateConfirmingProduct = (product: UseProductItem) => + { + setConfirmingProduct(product); + setProductBubbles([]); + } + + const getObjectName = (objectId: number, category: number) => + { + const name = AvatarInfoUtilities.getObjectName(objectId, category); + + if(!name) return; + + setActiveNameBubble(name); + + if(category !== RoomObjectCategory.UNIT) setProductBubbles([]); + } + + const getObjectInfo = (objectId: number, category: number) => + { + let info: IAvatarInfo = null; + + switch(category) + { + case RoomObjectCategory.FLOOR: + case RoomObjectCategory.WALL: + info = AvatarInfoUtilities.getFurniInfo(objectId, category); + + if(info) selectObjectForWired(objectId, category); + break; + case RoomObjectCategory.UNIT: { + const userData = roomSession.userDataManager.getUserDataByIndex(objectId); + + if(!userData) break; + + switch(userData.type) + { + case RoomObjectType.PET: + roomSession.userDataManager.requestPetInfo(userData.webID); + setPendingPetId(userData.webID); + break; + case RoomObjectType.USER: + info = AvatarInfoUtilities.getUserInfo(category, userData); + break; + case RoomObjectType.BOT: + info = AvatarInfoUtilities.getBotInfo(category, userData); + break; + case RoomObjectType.RENTABLE_BOT: + info = AvatarInfoUtilities.getRentableBotInfo(category, userData); + break; + } + } + + } + + if(!info) return; + + setAvatarInfo(info); + } + + const processUsableRoomObject = (objectId: number) => + { + } + + const refreshPetInfo = () => + { + // roomSession.userDataManager.requestPetInfo(petData.id); + } + + useRoomSessionManagerEvent(RoomSessionUserDataUpdateEvent.USER_DATA_UPDATED, event => + { + if(!event.addedUsers.length) return; + + let addedNameBubbles: AvatarInfoName[] = []; + + event.addedUsers.forEach(user => + { + if(user.webID === GetSessionDataManager().userId) return; + + if(friends.find(friend => (friend.id === user.webID))) + { + addedNameBubbles.push(new AvatarInfoName(user.roomIndex, RoomObjectCategory.UNIT, user.webID, user.name, user.type, true)); + } + }); + + if(!addedNameBubbles.length) return; + + setNameBubbles(prevValue => + { + const newValue = [ ...prevValue ]; + + addedNameBubbles.forEach(bubble => + { + const oldIndex = newValue.findIndex(oldBubble => (oldBubble.id === bubble.id)); + + if(oldIndex > -1) newValue.splice(oldIndex, 1); + + newValue.push(bubble); + }); + + return newValue; + }); + }); + + useRoomSessionManagerEvent(RoomSessionPetInfoUpdateEvent.PET_INFO, event => + { + const petData = event.petInfo; + + if(!petData) return; + + if(petData.id !== pendingPetId) return; + + const petInfo = AvatarInfoUtilities.getPetInfo(petData); + + if(!petInfo) return; + + setAvatarInfo(petInfo); + setPendingPetId(-1); + }); + + useRoomSessionManagerEvent(RoomSessionPetStatusUpdateEvent.PET_STATUS_UPDATE, event => + { + /* var _local_2:Boolean; + var _local_3:Boolean; + var _local_4:Boolean; + var _local_5:Boolean; + var _local_6:RoomUserData; + var _local_7:_Str_4828; + if (((!(this._container == null)) && (!(this._container.events == null)))) + { + _local_2 = k.canBreed; + _local_3 = k.canHarvest; + _local_4 = k.canRevive; + _local_5 = k.hasBreedingPermission; + _local_6 = this._Str_19958(k.petId); + if (_local_6 == null) + { + Logger.log((("Could not find pet with the id: " + k.petId) + " given by petStatusUpdate")); + return; + } + _local_7 = new _Str_4828(_local_6.roomObjectId, _local_2, _local_3, _local_4, _local_5); + this._container.events.dispatchEvent(_local_7); */ + }); + + useRoomEngineEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_INVENTORY, event => + { + // this._Str_23199((k as RoomEngineUseProductEvent).inventoryStripId, (k as RoomEngineUseProductEvent).furnitureTypeId); + }); + + useRoomEngineEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM, event => + { + const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, RoomObjectCategory.FLOOR); + + if(!roomObject || !IsOwnerOfFurniture(roomObject)) return; + + const ownerId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); + const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); + const furniData = GetSessionDataManager().getFloorItemData(typeId); + const parts = furniData.customParams.split(' '); + const part = (parts.length ? parseInt(parts[0]) : -1); + + if(part === -1) return; + + const useProductBubbles: UseProductItem[] = []; + const roomObjects = GetRoomEngine().getRoomObjects(roomSession.roomId, RoomObjectCategory.UNIT); + + for(const roomObject of roomObjects) + { + const userData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); + + let replace = false; + + if(!userData || (userData.type !== RoomObjectType.PET)) + { + + } + else + { + if(userData.ownerId === ownerId) + { + if(userData.hasSaddle && (furniData.specialType === FurniCategory.PET_SADDLE)) replace = true; + + const figureParts = userData.figure.split(' '); + const figurePart = (figureParts.length ? parseInt(figureParts[0]) : -1); + + if(figurePart === part) + { + if(furniData.specialType === FurniCategory.MONSTERPLANT_REVIVAL) + { + if(!userData.canRevive) continue; + } + + if(furniData.specialType === FurniCategory.MONSTERPLANT_REBREED) + { + if((userData.petLevel < 7) || userData.canRevive || userData.canBreed) continue; + } + + if(furniData.specialType === FurniCategory.MONSTERPLANT_FERTILIZE) + { + if((userData.petLevel >= 7) || userData.canRevive) continue; + } + + useProductBubbles.push(new UseProductItem(userData.roomIndex, RoomObjectCategory.UNIT, userData.name, event.objectId, roomObject.id, -1, replace)); + } + } + } + } + + setConfirmingProduct(null); + + if(useProductBubbles.length) setProductBubbles(useProductBubbles); + }); + + useRoomEngineEvent(RoomEngineObjectEvent.REQUEST_MANIPULATION, event => + { + if(!CanManipulateFurniture(roomSession, event.objectId, event.category)) return; + + setIsDecorating(true); + }); + + useObjectSelectedEvent(event => + { + getObjectInfo(event.id, event.category); + }); + + useObjectDeselectedEvent(event => + { + setAvatarInfo(null); + setProductBubbles([]); + }); + + useObjectRollOverEvent(event => + { + if(avatarInfo || (event.category !== RoomObjectCategory.UNIT)) return; + + getObjectName(event.id, event.category); + }); + + useObjectRollOutEvent(event => + { + if(!activeNameBubble || (event.category !== RoomObjectCategory.UNIT) || (activeNameBubble.roomIndex !== event.id)) return; + + setActiveNameBubble(null); + }); + + useUiEvent([ + RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, + RoomWidgetUpdateRoomObjectEvent.USER_REMOVED + ], event => + { + if(activeNameBubble && (activeNameBubble.category === event.category) && (activeNameBubble.roomIndex === event.id)) setActiveNameBubble(null); + + if(event.category === RoomObjectCategory.UNIT) + { + let index = nameBubbles.findIndex(bubble => (bubble.roomIndex === event.id)); + + if(index > -1) setNameBubbles(prevValue => prevValue.filter(bubble => (bubble.roomIndex === event.id))); + + index = productBubbles.findIndex(bubble => (bubble.id === event.id)); + + if(index > -1) setProductBubbles(prevValue => prevValue.filter(bubble => (bubble.id !== event.id))); + } + + else if(event.category === RoomObjectCategory.FLOOR) + { + const index = productBubbles.findIndex(bubble => (bubble.id === event.id)); + + if(index > -1) setProductBubbles(prevValue => prevValue.filter(bubble => (bubble.requestRoomObjectId !== event.id))); + } + + if(avatarInfo) + { + if(avatarInfo instanceof AvatarInfoFurni) + { + if(avatarInfo.id === event.id) setAvatarInfo(null); + } + + else if((avatarInfo instanceof AvatarInfoUser) || (avatarInfo instanceof AvatarInfoRentableBot) || (avatarInfo instanceof AvatarInfoPet)) + { + if(avatarInfo.roomIndex === event.id) setAvatarInfo(null); + } + } + }); + + useEffect(() => + { + if(!avatarInfo) return; + + setActiveNameBubble(null); + setNameBubbles([]); + setProductBubbles([]); + }, [ avatarInfo ]); + + useEffect(() => + { + if(!activeNameBubble) return; + + setNameBubbles([]); + }, [ activeNameBubble ]); + + useEffect(() => + { + roomSession.isDecorating = isDecorating; + }, [ roomSession, isDecorating ]); + + return { avatarInfo, setAvatarInfo, activeNameBubble, setActiveNameBubble, nameBubbles, productBubbles, confirmingProduct, isDecorating, setIsDecorating, removeNameBubble, removeProductBubble, updateConfirmingProduct, getObjectName }; +} + +export const useAvatarInfoWidget = useAvatarInfoWidgetState; diff --git a/src/hooks/rooms/widgets/useChatInputWidget.ts b/src/hooks/rooms/widgets/useChatInputWidget.ts new file mode 100644 index 00000000..e79af288 --- /dev/null +++ b/src/hooks/rooms/widgets/useChatInputWidget.ts @@ -0,0 +1,269 @@ +import { AvatarExpressionEnum, HabboClubLevelEnum, RoomControllerLevel, RoomEngineObjectEvent, RoomObjectCategory, RoomRotatingEffect, RoomSessionChatEvent, RoomSettingsComposer, RoomShakingEffect, RoomZoomEvent, TextureUtils } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { ChatMessageTypeEnum, CreateLinkEvent, GetClubMemberLevel, GetConfiguration, GetNitroInstance, GetRoomEngine, GetSessionDataManager, LocalizeText, SendMessageComposer } from '../../../api'; +import { useRoomEngineEvent, useRoomSessionManagerEvent } from '../../events'; +import { useNotification } from '../../notification'; +import { useObjectSelectedEvent } from '../engine'; +import { useRoom } from '../useRoom'; + +const useChatInputWidgetState = () => +{ + const [ selectedUsername, setSelectedUsername ] = useState(''); + const [ isTyping, setIsTyping ] = useState(false); + const [ typingStartedSent, setTypingStartedSent ] = useState(false); + const [ isIdle, setIsIdle ] = useState(false); + const [ floodBlocked, setFloodBlocked ] = useState(false); + const [ floodBlockedSeconds, setFloodBlockedSeconds ] = useState(0); + const { showNitroAlert = null, showConfirm = null } = useNotification(); + const { roomSession = null } = useRoom(); + + const sendChat = (text: string, chatType: number, recipientName: string = '', styleId: number = 0) => + { + if(text === '') return null; + + const parts = text.split(' '); + + if(parts.length > 0) + { + const firstPart = parts[0]; + let secondPart = ''; + + if(parts.length > 1) secondPart = parts[1]; + + if((firstPart.charAt(0) === ':') && (secondPart === 'x')) + { + const selectedAvatarId = GetRoomEngine().selectedAvatarId; + + if(selectedAvatarId > -1) + { + const userData = roomSession.userDataManager.getUserDataByIndex(selectedAvatarId); + + if(userData) + { + secondPart = userData.name; + text = text.replace(' x', (' ' + userData.name)); + } + } + } + + switch(firstPart.toLowerCase()) + { + case ':shake': + RoomShakingEffect.init(2500, 5000); + RoomShakingEffect.turnVisualizationOn(); + + return null; + + case ':rotate': + RoomRotatingEffect.init(2500, 5000); + RoomRotatingEffect.turnVisualizationOn(); + + return null; + case ':d': + case ';d': + if(GetClubMemberLevel() === HabboClubLevelEnum.VIP) + { + roomSession.sendExpressionMessage(AvatarExpressionEnum.LAUGH.ordinal); + } + + break; + case 'o/': + case '_o/': + roomSession.sendExpressionMessage(AvatarExpressionEnum.WAVE.ordinal); + + return null; + case ':kiss': + if(GetClubMemberLevel() === HabboClubLevelEnum.VIP) + { + roomSession.sendExpressionMessage(AvatarExpressionEnum.BLOW.ordinal); + + return null; + } + + break; + case ':jump': + if(GetClubMemberLevel() === HabboClubLevelEnum.VIP) + { + roomSession.sendExpressionMessage(AvatarExpressionEnum.JUMP.ordinal); + + return null; + } + + break; + case ':idle': + roomSession.sendExpressionMessage(AvatarExpressionEnum.IDLE.ordinal); + + return null; + case '_b': + roomSession.sendExpressionMessage(AvatarExpressionEnum.RESPECT.ordinal); + + return null; + case ':sign': + roomSession.sendSignMessage(parseInt(secondPart)); + + return null; + case ':iddqd': + case ':flip': + GetRoomEngine().events.dispatchEvent(new RoomZoomEvent(roomSession.roomId, -1, true)); + + return null; + case ':zoom': + GetRoomEngine().events.dispatchEvent(new RoomZoomEvent(roomSession.roomId, parseFloat(secondPart), false)); + + return null; + case ':screenshot': + const texture = GetRoomEngine().createTextureFromRoom(roomSession.roomId, 1); + + const image = new Image(); + + image.src = TextureUtils.generateImageUrl(texture); + + const newWindow = window.open(''); + newWindow.document.write(image.outerHTML); + return null; + case ':pickall': + if(roomSession.isRoomOwner || GetSessionDataManager().isModerator) + { + showConfirm(LocalizeText('room.confirm.pick_all'), () => + { + GetSessionDataManager().sendSpecialCommandMessage(':pickall'); + }, + null, null, null, LocalizeText('generic.alert.title')); + } + + return null; + case ':furni': + CreateLinkEvent('furni-chooser/'); + return null; + case ':chooser': + CreateLinkEvent('user-chooser/'); + return null; + case ':floor': + case ':bcfloor': + if(roomSession.controllerLevel >= RoomControllerLevel.ROOM_OWNER) CreateLinkEvent('floor-editor/show'); + + return null; + case ':togglefps': { + if(GetNitroInstance().ticker.maxFPS > 0) GetNitroInstance().ticker.maxFPS = 0; + else GetNitroInstance().ticker.maxFPS = GetConfiguration('system.animation.fps'); + + return null; + } + case ':client': + case ':nitro': + case ':billsonnn': + showNitroAlert(); + return null; + case ':settings': + if(roomSession.isRoomOwner || GetSessionDataManager().isModerator) + { + SendMessageComposer(new RoomSettingsComposer(roomSession.roomId)); + } + + return null; + } + } + + switch(chatType) + { + case ChatMessageTypeEnum.CHAT_DEFAULT: + roomSession.sendChatMessage(text, styleId); + break; + case ChatMessageTypeEnum.CHAT_SHOUT: + roomSession.sendShoutMessage(text, styleId); + break; + case ChatMessageTypeEnum.CHAT_WHISPER: + roomSession.sendWhisperMessage(recipientName, text, styleId); + break; + } + } + + useRoomSessionManagerEvent(RoomSessionChatEvent.FLOOD_EVENT, event => + { + setFloodBlocked(true); + setFloodBlockedSeconds(parseFloat(event.message)); + }); + + useObjectSelectedEvent(event => + { + if(event.category !== RoomObjectCategory.UNIT) return; + + const userData = roomSession.userDataManager.getUserDataByIndex(event.id); + + if(!userData) return; + + setSelectedUsername(userData.name); + }); + + useRoomEngineEvent(RoomEngineObjectEvent.DESELECTED, event => setSelectedUsername('')); + + useEffect(() => + { + if(!floodBlocked) return; + + let seconds = 0; + + const interval = setInterval(() => + { + setFloodBlockedSeconds(prevValue => + { + seconds = ((prevValue || 0) - 1); + + return seconds; + }); + + if(seconds < 0) + { + clearInterval(interval); + + setFloodBlocked(false); + } + }, 1000); + + return () => clearInterval(interval); + }, [ floodBlocked ]); + + useEffect(() => + { + if(!isIdle) return; + + let timeout: ReturnType = null; + + if(isIdle) + { + timeout = setTimeout(() => + { + setIsIdle(false); + setIsTyping(false) + }, 10000); + } + + return () => clearTimeout(timeout); + }, [ isIdle ]); + + useEffect(() => + { + if(isTyping) + { + if(!typingStartedSent) + { + setTypingStartedSent(true); + + roomSession.sendChatTypingMessage(isTyping); + } + } + else + { + if(typingStartedSent) + { + setTypingStartedSent(false); + + roomSession.sendChatTypingMessage(isTyping); + } + } + }, [ roomSession, isTyping, typingStartedSent ]); + + return { selectedUsername, floodBlocked, floodBlockedSeconds, setIsTyping, setIsIdle, sendChat }; +} + +export const useChatInputWidget = useChatInputWidgetState; diff --git a/src/hooks/rooms/widgets/useChatWidget.ts b/src/hooks/rooms/widgets/useChatWidget.ts new file mode 100644 index 00000000..3cda8753 --- /dev/null +++ b/src/hooks/rooms/widgets/useChatWidget.ts @@ -0,0 +1,286 @@ +import { AvatarFigurePartType, AvatarScaleType, AvatarSetType, GetGuestRoomResultEvent, NitroPoint, PetFigureData, RoomChatSettings, RoomChatSettingsEvent, RoomDragEvent, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionChatEvent, RoomUserData, SystemChatStyleEnum, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; +import { useEffect, useMemo, useRef, useState } from 'react'; +import { ChatBubbleMessage, GetAvatarRenderManager, GetConfigurationManager, GetRoomEngine, GetRoomObjectScreenLocation, IRoomChatSettings, LocalizeText, PlaySound, RoomChatFormatter } from '../../../api'; +import { useMessageEvent, useRoomEngineEvent, useRoomSessionManagerEvent } from '../../events'; +import { useRoom } from '../useRoom'; + +const avatarColorCache: Map = new Map(); +const avatarImageCache: Map = new Map(); +const petImageCache: Map = new Map(); + +const useChatWidgetState = () => +{ + const [ chatMessages, setChatMessages ] = useState([]); + const [ chatSettings, setChatSettings ] = useState({ + mode: RoomChatSettings.CHAT_MODE_FREE_FLOW, + weight: RoomChatSettings.CHAT_BUBBLE_WIDTH_NORMAL, + speed: RoomChatSettings.CHAT_SCROLL_SPEED_NORMAL, + distance: 50, + protection: RoomChatSettings.FLOOD_FILTER_NORMAL + }); + const { roomSession = null } = useRoom(); + const isDisposed = useRef(false); + + const getScrollSpeed = useMemo(() => + { + if(!chatSettings) return 6000; + + switch(chatSettings.speed) + { + case RoomChatSettings.CHAT_SCROLL_SPEED_FAST: + return 3000; + case RoomChatSettings.CHAT_SCROLL_SPEED_NORMAL: + return 6000; + case RoomChatSettings.CHAT_SCROLL_SPEED_SLOW: + return 12000; + } + }, [ chatSettings ]); + + const setFigureImage = (figure: string) => + { + const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, null, { + resetFigure: figure => + { + if(isDisposed.current) return; + + setFigureImage(figure); + }, + dispose: () => + {}, + disposed: false + }); + + if(!avatarImage) return; + + const image = avatarImage.getCroppedImage(AvatarSetType.HEAD); + const color = avatarImage.getPartColor(AvatarFigurePartType.CHEST); + + avatarColorCache.set(figure, ((color && color.rgb) || 16777215)); + + avatarImage.dispose(); + + avatarImageCache.set(figure, image.src); + + return image.src; + } + + const getUserImage = (figure: string) => + { + let existing = avatarImageCache.get(figure); + + if(!existing) existing = setFigureImage(figure); + + return existing; + } + + const getPetImage = (figure: string, direction: number, _arg_3: boolean, scale: number = 64, posture: string = null) => + { + let existing = petImageCache.get((figure + posture)); + + if(existing) return existing; + + const figureData = new PetFigureData(figure); + const typeId = figureData.typeId; + const image = GetRoomEngine().getRoomObjectPetImage(typeId, figureData.paletteId, figureData.color, new Vector3d((direction * 45)), scale, null, false, 0, figureData.customParts, posture); + + if(image) + { + existing = TextureUtils.generateImageUrl(image.data); + + petImageCache.set((figure + posture), existing); + } + + return existing; + } + + const removeHiddenChats = () => + { + setChatMessages(prevValue => + { + if(prevValue) + { + const newMessages = prevValue.filter(chat => ((chat.top > (-(chat.height) * 2)))); + + if(newMessages.length !== prevValue.length) return newMessages; + } + + return prevValue; + }) + } + + const moveAllChatsUp = (amount: number) => + { + setChatMessages(prevValue => + { + if(prevValue) + { + prevValue.forEach(chat => + { + if(chat.skipMovement) + { + chat.skipMovement = false; + + return; + } + + chat.top -= amount; + }); + } + + return prevValue; + }); + + removeHiddenChats(); + } + + useRoomSessionManagerEvent(RoomSessionChatEvent.CHAT_EVENT, event => + { + const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, RoomObjectCategory.UNIT); + const bubbleLocation = roomObject ? GetRoomObjectScreenLocation(roomSession.roomId, roomObject?.id, RoomObjectCategory.UNIT) : new NitroPoint(); + const userData = roomObject ? roomSession.userDataManager.getUserDataByIndex(event.objectId) : new RoomUserData(-1); + + let username = ''; + let avatarColor = 0; + let imageUrl: string = null; + let chatType = event.chatType; + let styleId = event.style; + let userType = 0; + let petType = -1; + let text = event.message; + + if(userData) + { + userType = userData.type; + + const figure = userData.figure; + + switch(userType) + { + case RoomObjectType.PET: + imageUrl = getPetImage(figure, 2, true, 64, roomObject.model.getValue(RoomObjectVariable.FIGURE_POSTURE)); + petType = new PetFigureData(figure).typeId; + break; + case RoomObjectType.USER: + imageUrl = getUserImage(figure); + break; + case RoomObjectType.RENTABLE_BOT: + case RoomObjectType.BOT: + styleId = SystemChatStyleEnum.BOT; + break; + } + + avatarColor = avatarColorCache.get(figure); + username = userData.name; + } + + switch(chatType) + { + case RoomSessionChatEvent.CHAT_TYPE_RESPECT: + text = LocalizeText('widgets.chatbubble.respect', [ 'username' ], [ username ]); + + if(GetConfigurationManager().getValue('respect.options')['enabled']) PlaySound(GetConfigurationManager().getValue('respect.options')['sound']); + + break; + case RoomSessionChatEvent.CHAT_TYPE_PETREVIVE: + case RoomSessionChatEvent.CHAT_TYPE_PET_REBREED_FERTILIZE: + case RoomSessionChatEvent.CHAT_TYPE_PET_SPEED_FERTILIZE: { + let textKey = 'widget.chatbubble.petrevived'; + + if(chatType === RoomSessionChatEvent.CHAT_TYPE_PET_REBREED_FERTILIZE) + { + textKey = 'widget.chatbubble.petrefertilized;'; + } + + else if(chatType === RoomSessionChatEvent.CHAT_TYPE_PET_SPEED_FERTILIZE) + { + textKey = 'widget.chatbubble.petspeedfertilized'; + } + + let targetUserName: string = null; + + const newRoomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.extraParam, RoomObjectCategory.UNIT); + + if(newRoomObject) + { + const newUserData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); + + if(newUserData) targetUserName = newUserData.name; + } + + text = LocalizeText(textKey, [ 'petName', 'userName' ], [ username, targetUserName ]); + break; + } + case RoomSessionChatEvent.CHAT_TYPE_PETRESPECT: + text = LocalizeText('widget.chatbubble.petrespect', [ 'petname' ], [ username ]); + break; + case RoomSessionChatEvent.CHAT_TYPE_PETTREAT: + text = LocalizeText('widget.chatbubble.pettreat', [ 'petname' ], [ username ]); + break; + case RoomSessionChatEvent.CHAT_TYPE_HAND_ITEM_RECEIVED: + text = LocalizeText('widget.chatbubble.handitem', [ 'username', 'handitem' ], [ username, LocalizeText(('handitem' + event.extraParam)) ]); + break; + case RoomSessionChatEvent.CHAT_TYPE_MUTE_REMAINING: { + const hours = ((event.extraParam > 0) ? Math.floor((event.extraParam / 3600)) : 0).toString(); + const minutes = ((event.extraParam > 0) ? Math.floor((event.extraParam % 3600) / 60) : 0).toString(); + const seconds = (event.extraParam % 60).toString(); + + text = LocalizeText('widget.chatbubble.mutetime', [ 'hours', 'minutes', 'seconds' ], [ hours, minutes, seconds ]); + break; + } + } + + const chatMessage = new ChatBubbleMessage( + userData.roomIndex, + RoomObjectCategory.UNIT, + roomSession.roomId, + text, + RoomChatFormatter(text), + username, + new NitroPoint(bubbleLocation.x, bubbleLocation.y), + chatType, + styleId, + imageUrl, + (avatarColor && (('#' + (avatarColor.toString(16).padStart(6, '0'))) || null))); + + setChatMessages(prevValue => [ ...prevValue, chatMessage ]); + }); + + useRoomEngineEvent(RoomDragEvent.ROOM_DRAG, event => + { + if(!chatMessages.length || (event.roomId !== roomSession.roomId)) return; + + const offsetX = event.offsetX; + + chatMessages.forEach(chat => (chat.elementRef && (chat.left += offsetX))); + }); + + useMessageEvent(GetGuestRoomResultEvent, event => + { + const parser = event.getParser(); + + if(!parser.roomEnter) return; + + setChatSettings(parser.chat); + }); + + useMessageEvent(RoomChatSettingsEvent, event => + { + const parser = event.getParser(); + + setChatSettings(parser.chat); + }); + + useEffect(() => + { + isDisposed.current = false; + + return () => + { + isDisposed.current = true; + } + }, []); + + return { chatMessages, setChatMessages, chatSettings, getScrollSpeed, removeHiddenChats, moveAllChatsUp }; +} + +export const useChatWidget = useChatWidgetState; diff --git a/src/hooks/rooms/widgets/useDoorbellWidget.ts b/src/hooks/rooms/widgets/useDoorbellWidget.ts new file mode 100644 index 00000000..4ae5142d --- /dev/null +++ b/src/hooks/rooms/widgets/useDoorbellWidget.ts @@ -0,0 +1,44 @@ +import { RoomSessionDoorbellEvent } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomSession } from '../../../api'; +import { useRoomSessionManagerEvent } from '../../events'; + +const useDoorbellWidgetState = () => +{ + const [ users, setUsers ] = useState([]); + + const addUser = (userName: string) => + { + if(users.indexOf(userName) >= 0) return; + + setUsers([ ...users, userName ]); + } + + const removeUser = (userName: string) => + { + const index = users.indexOf(userName); + + if(index === -1) return; + + const newUsers = [ ...users ]; + + newUsers.splice(index, 1); + + setUsers(newUsers); + } + + const answer = (userName: string, flag: boolean) => + { + GetRoomSession().sendDoorbellApprovalMessage(userName, flag); + + removeUser(userName); + } + + useRoomSessionManagerEvent(RoomSessionDoorbellEvent.DOORBELL, event => addUser(event.userName)); + useRoomSessionManagerEvent(RoomSessionDoorbellEvent.RSDE_REJECTED, event => removeUser(event.userName)); + useRoomSessionManagerEvent(RoomSessionDoorbellEvent.RSDE_ACCEPTED, event => removeUser(event.userName)); + + return { users, addUser, removeUser, answer }; +} + +export const useDoorbellWidget = useDoorbellWidgetState; diff --git a/src/hooks/rooms/widgets/useFriendRequestWidget.ts b/src/hooks/rooms/widgets/useFriendRequestWidget.ts new file mode 100644 index 00000000..82bf6a25 --- /dev/null +++ b/src/hooks/rooms/widgets/useFriendRequestWidget.ts @@ -0,0 +1,81 @@ +import { RoomObjectCategory, RoomObjectUserType } from '@nitrots/nitro-renderer'; +import { useEffect, useMemo, useState } from 'react'; +import { GetRoomSession, MessengerRequest } from '../../../api'; +import { useFriends } from '../../friends'; +import { useUserAddedEvent, useUserRemovedEvent } from '../engine'; + +const useFriendRequestWidgetState = () => +{ + const [ activeRequests, setActiveRequests ] = useState<{ roomIndex: number, request: MessengerRequest }[]>([]); + const { requests = [], dismissedRequestIds = [], setDismissedRequestIds = null } = useFriends(); + + const displayedRequests = useMemo(() => activeRequests.filter(request => (dismissedRequestIds.indexOf(request.request.requesterUserId) === -1)), [ activeRequests, dismissedRequestIds ]); + + const hideFriendRequest = (userId: number) => + { + setDismissedRequestIds(prevValue => + { + if(prevValue.indexOf(userId) >= 0) return prevValue; + + const newValue = [ ...prevValue ]; + + newValue.push(userId); + + return newValue; + }); + } + + useUserAddedEvent(true, event => + { + if(event.category !== RoomObjectCategory.UNIT) return; + + const userData = GetRoomSession().userDataManager.getUserDataByIndex(event.id); + + if(!userData || (userData.type !== RoomObjectUserType.getTypeNumber(RoomObjectUserType.USER))) return; + + const request = requests.find(request => (request.requesterUserId === userData.webID)); + + if(!request || activeRequests.find(request => (request.request.requesterUserId === userData.webID))) return; + + const newValue = [ ...activeRequests ]; + + newValue.push({ roomIndex: userData.roomIndex, request }); + + setActiveRequests(newValue); + }); + + useUserRemovedEvent(true, event => + { + if(event.category !== RoomObjectCategory.UNIT) return; + + const index = activeRequests.findIndex(request => (request.roomIndex === event.id)); + + if(index === -1) return; + + const newValue = [ ...activeRequests ]; + + newValue.splice(index, 1); + + setActiveRequests(newValue); + }); + + useEffect(() => + { + const newDisplayedRequests: { roomIndex: number, request: MessengerRequest }[] = []; + + for(const request of requests) + { + const userData = GetRoomSession().userDataManager.getUserData(request.requesterUserId); + + if(!userData) continue; + + newDisplayedRequests.push({ roomIndex: userData.roomIndex, request }); + } + + setActiveRequests(newDisplayedRequests); + }, [ requests ]); + + return { displayedRequests, hideFriendRequest }; +} + +export const useFriendRequestWidget = useFriendRequestWidgetState; diff --git a/src/hooks/rooms/widgets/useFurniChooserWidget.ts b/src/hooks/rooms/widgets/useFurniChooserWidget.ts new file mode 100644 index 00000000..4542dbac --- /dev/null +++ b/src/hooks/rooms/widgets/useFurniChooserWidget.ts @@ -0,0 +1,132 @@ +import { RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine, GetRoomSession, GetSessionDataManager, LocalizeText, RoomObjectItem } from '../../../api'; +import { useFurniAddedEvent, useFurniRemovedEvent } from '../engine'; +import { useRoom } from '../useRoom'; + +const useFurniChooserWidgetState = () => +{ + const [ items, setItems ] = useState(null); + const { roomSession = null } = useRoom(); + + const onClose = () => setItems(null); + + const selectItem = (item: RoomObjectItem) => item && GetRoomEngine().selectRoomObject(GetRoomSession().roomId, item.id, item.category); + + const populateChooser = () => + { + const sessionDataManager = GetSessionDataManager(); + const wallObjects = GetRoomEngine().getRoomObjects(roomSession.roomId, RoomObjectCategory.WALL); + const floorObjects = GetRoomEngine().getRoomObjects(roomSession.roomId, RoomObjectCategory.FLOOR); + + const wallItems = wallObjects.map(roomObject => + { + if(roomObject.id < 0) return null; + + let name = roomObject.type; + + if(name.startsWith('poster')) + { + name = LocalizeText(`poster_${ name.replace('poster', '') }_name`); + } + else + { + const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); + const furniData = sessionDataManager.getWallItemData(typeId); + + if(furniData && furniData.name.length) name = furniData.name; + } + + return new RoomObjectItem(roomObject.id, RoomObjectCategory.WALL, name); + }); + + const floorItems = floorObjects.map(roomObject => + { + if(roomObject.id < 0) return null; + + let name = roomObject.type; + + const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); + const furniData = sessionDataManager.getFloorItemData(typeId); + + if(furniData && furniData.name.length) name = furniData.name; + + return new RoomObjectItem(roomObject.id, RoomObjectCategory.FLOOR, name); + }); + + setItems([ ...wallItems, ...floorItems ].sort((a, b) => ((a.name < b.name) ? -1 : 1))); + } + + useFurniAddedEvent(!!items, event => + { + if(event.id < 0) return; + + const roomObject = GetRoomEngine().getRoomObject(GetRoomSession().roomId, event.id, event.category); + + if(!roomObject) return; + + let item: RoomObjectItem = null; + + switch(event.category) + { + case RoomObjectCategory.WALL: { + let name = roomObject.type; + + if(name.startsWith('poster')) + { + name = LocalizeText(`poster_${ name.replace('poster', '') }_name`); + } + else + { + const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); + const furniData = GetSessionDataManager().getWallItemData(typeId); + + if(furniData && furniData.name.length) name = furniData.name; + } + + item = new RoomObjectItem(roomObject.id, RoomObjectCategory.WALL, name); + + break; + } + case RoomObjectCategory.FLOOR: { + let name = roomObject.type; + + const typeId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_TYPE_ID); + const furniData = GetSessionDataManager().getFloorItemData(typeId); + + if(furniData && furniData.name.length) name = furniData.name; + + item = new RoomObjectItem(roomObject.id, RoomObjectCategory.FLOOR, name); + } + } + + setItems(prevValue => [ ...prevValue, item ].sort((a, b) => ((a.name < b.name) ? -1 : 1))); + }); + + useFurniRemovedEvent(!!items, event => + { + if(event.id < 0) return; + + setItems(prevValue => + { + const newValue = [ ...prevValue ]; + + for(let i = 0; i < newValue.length; i++) + { + const existingValue = newValue[i]; + + if((existingValue.id !== event.id) || (existingValue.category !== event.category)) continue; + + newValue.splice(i, 1); + + break; + } + + return newValue; + }); + }); + + return { items, onClose, selectItem, populateChooser }; +} + +export const useFurniChooserWidget = useFurniChooserWidgetState; diff --git a/src/hooks/rooms/widgets/usePollWidget.ts b/src/hooks/rooms/widgets/usePollWidget.ts new file mode 100644 index 00000000..138a56e8 --- /dev/null +++ b/src/hooks/rooms/widgets/usePollWidget.ts @@ -0,0 +1,52 @@ +import { RoomSessionPollEvent } from '@nitrots/nitro-renderer'; +import { DispatchUiEvent, RoomWidgetPollUpdateEvent } from '../../../api'; +import { useRoomSessionManagerEvent } from '../../events'; +import { useRoom } from '../useRoom'; + +const usePollWidgetState = () => +{ + const { roomSession = null } = useRoom(); + + const startPoll = (pollId: number) => roomSession.sendPollStartMessage(pollId); + + const rejectPoll = (pollId: number) => roomSession.sendPollRejectMessage(pollId); + + const answerPoll = (pollId: number, questionId: number, answers: string[]) => roomSession.sendPollAnswerMessage(pollId, questionId, answers); + + useRoomSessionManagerEvent(RoomSessionPollEvent.OFFER, event => + { + const pollEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.OFFER, event.id); + + pollEvent.summary = event.summary; + pollEvent.headline = event.headline; + + DispatchUiEvent(pollEvent); + }); + + useRoomSessionManagerEvent(RoomSessionPollEvent.ERROR, event => + { + const pollEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.ERROR, event.id); + + pollEvent.summary = event.summary; + pollEvent.headline = event.headline; + + DispatchUiEvent(pollEvent); + }); + + useRoomSessionManagerEvent(RoomSessionPollEvent.CONTENT, event => + { + const pollEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.CONTENT, event.id); + + pollEvent.startMessage = event.startMessage; + pollEvent.endMessage = event.endMessage; + pollEvent.numQuestions = event.numQuestions; + pollEvent.questionArray = event.questionArray; + pollEvent.npsPoll = event.npsPoll; + + DispatchUiEvent(pollEvent); + }); + + return { startPoll, rejectPoll, answerPoll }; +} + +export const usePollWidget = usePollWidgetState; diff --git a/src/hooks/rooms/widgets/useUserChooserWidget.ts b/src/hooks/rooms/widgets/useUserChooserWidget.ts new file mode 100644 index 00000000..857922a2 --- /dev/null +++ b/src/hooks/rooms/widgets/useUserChooserWidget.ts @@ -0,0 +1,80 @@ +import { RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine, GetRoomSession, RoomObjectItem } from '../../../api'; +import { useUserAddedEvent, useUserRemovedEvent } from '../engine'; +import { useRoom } from '../useRoom'; + +const useUserChooserWidgetState = () => +{ + const [ items, setItems ] = useState(null); + const { roomSession = null } = useRoom(); + + const onClose = () => setItems(null); + + const selectItem = (item: RoomObjectItem) => item && GetRoomEngine().selectRoomObject(GetRoomSession().roomId, item.id, item.category); + + const populateChooser = () => + { + const roomSession = GetRoomSession(); + const roomObjects = GetRoomEngine().getRoomObjects(roomSession.roomId, RoomObjectCategory.UNIT); + + setItems(roomObjects + .map(roomObject => + { + if(roomObject.id < 0) return null; + + const userData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); + + if(!userData) return null; + + return new RoomObjectItem(userData.roomIndex, RoomObjectCategory.UNIT, userData.name); + }) + .sort((a, b) => ((a.name < b.name) ? -1 : 1))); + } + + useUserAddedEvent(!!items, event => + { + if(event.id < 0) return; + + const userData = GetRoomSession().userDataManager.getUserDataByIndex(event.id); + + if(!userData) return; + + setItems(prevValue => + { + const newValue = [ ...prevValue ]; + + newValue.push(new RoomObjectItem(userData.roomIndex, RoomObjectCategory.UNIT, userData.name)); + newValue.sort((a, b) => ((a.name < b.name) ? -1 : 1)); + + return newValue; + }); + }); + + useUserRemovedEvent(!!items, event => + { + if(event.id < 0) return; + + setItems(prevValue => + { + const newValue = [ ...prevValue ]; + + for(let i = 0; i < newValue.length; i++) + { + const existingValue = newValue[i]; + + if((existingValue.id !== event.id) || (existingValue.category !== event.category)) continue; + + newValue.splice(i, 1); + + break; + } + + return newValue; + }); + }); + + return { items, onClose, selectItem, populateChooser }; +} + +export const useUserChooserWidget = useUserChooserWidgetState; diff --git a/src/hooks/rooms/widgets/useWordQuizWidget.ts b/src/hooks/rooms/widgets/useWordQuizWidget.ts new file mode 100644 index 00000000..be18edf9 --- /dev/null +++ b/src/hooks/rooms/widgets/useWordQuizWidget.ts @@ -0,0 +1,156 @@ +import { AvatarAction, IQuestion, RoomSessionWordQuizEvent } from '@nitrots/nitro-renderer'; +import { useCallback, useEffect, useState } from 'react'; +import { GetRoomEngine, VoteValue } from '../../../api'; +import { useRoomSessionManagerEvent } from '../../events'; +import { useRoom } from '../useRoom'; +import { usePollWidget } from './usePollWidget'; + +const DEFAULT_DISPLAY_DELAY = 4000; +const SIGN_FADE_DELAY = 3; + +const useWordQuizWidgetState = () => +{ + const [ pollId, setPollId ] = useState(-1); + const [ question, setQuestion ] = useState(null); + const [ answerSent, setAnswerSent ] = useState(false); + const [ questionClearTimeout, setQuestionClearTimeout ] = useState>(null); + const [ answerCounts, setAnswerCounts ] = useState>(new Map()); + const [ userAnswers, setUserAnswers ] = useState>(new Map()); + const { answerPoll = null } = usePollWidget(); + const { roomSession = null } = useRoom(); + + const clearQuestion = () => + { + setPollId(-1); + setQuestion(null); + } + + const vote = (vote: string) => + { + if(answerSent || !question) return; + + answerPoll(pollId, question.id, [ vote ]); + + setAnswerSent(true); + } + + const checkSignFade = useCallback(() => + { + setUserAnswers(prevValue => + { + const keysToRemove: number[] = []; + + prevValue.forEach((value, key) => + { + value.secondsLeft--; + + if(value.secondsLeft <= 0) keysToRemove.push(key); + }); + + if(keysToRemove.length === 0) return prevValue; + + const copy = new Map(prevValue); + + keysToRemove.forEach(key => copy.delete(key)); + + return copy; + }); + }, []); + + useRoomSessionManagerEvent(RoomSessionWordQuizEvent.ANSWERED, event => + { + const userData = roomSession.userDataManager.getUserData(event.userId); + + if(!userData) return; + + setAnswerCounts(event.answerCounts); + + setUserAnswers(prevValue => + { + if(!prevValue.has(userData.roomIndex)) + { + const newValue = new Map(userAnswers); + + newValue.set(userData.roomIndex, { value: event.value, secondsLeft: SIGN_FADE_DELAY }); + + return newValue; + } + + return prevValue; + }); + + if(event.value === '0') + { + GetRoomEngine().updateRoomObjectUserGesture(roomSession.roomId, userData.roomIndex, AvatarAction.getGestureId(AvatarAction.GESTURE_SAD)); + } + else + { + GetRoomEngine().updateRoomObjectUserGesture(roomSession.roomId, userData.roomIndex, AvatarAction.getGestureId(AvatarAction.GESTURE_SMILE)); + } + }); + + useRoomSessionManagerEvent(RoomSessionWordQuizEvent.FINISHED, event => + { + if(question && (question.id === event.questionId)) + { + setAnswerCounts(event.answerCounts); + setAnswerSent(true); + + setQuestionClearTimeout(prevValue => + { + if(prevValue) clearTimeout(prevValue); + + return setTimeout(() => clearQuestion(), DEFAULT_DISPLAY_DELAY); + }); + } + + setUserAnswers(new Map()); + }); + + useRoomSessionManagerEvent(RoomSessionWordQuizEvent.QUESTION, event => + { + setPollId(event.id); + setQuestion(event.question); + setAnswerSent(false); + setAnswerCounts(new Map()); + setUserAnswers(new Map()); + + setQuestionClearTimeout(prevValue => + { + if(prevValue) clearTimeout(prevValue); + + if(event.duration > 0) + { + const delay = event.duration < 1000 ? DEFAULT_DISPLAY_DELAY : event.duration; + + return setTimeout(() => clearQuestion(), delay); + } + + return null; + }); + }); + + useEffect(() => + { + const interval = setInterval(() => checkSignFade(), 1000); + + return () => clearInterval(interval); + }, [ checkSignFade ]); + + useEffect(() => + { + return () => + { + setQuestionClearTimeout(prevValue => + { + if(prevValue) clearTimeout(prevValue); + + return null; + }); + } + }, []); + + return { question, answerSent, answerCounts, userAnswers, vote }; +} + +export const useWordQuizWidget = useWordQuizWidgetState; diff --git a/src/hooks/session/index.ts b/src/hooks/session/index.ts new file mode 100644 index 00000000..e61c7f33 --- /dev/null +++ b/src/hooks/session/index.ts @@ -0,0 +1 @@ +export * from './useSessionInfo'; diff --git a/src/hooks/session/useSessionInfo.ts b/src/hooks/session/useSessionInfo.ts new file mode 100644 index 00000000..faff5dca --- /dev/null +++ b/src/hooks/session/useSessionInfo.ts @@ -0,0 +1,45 @@ +import { FigureUpdateEvent, RoomUnitChatStyleComposer, UserInfoDataParser, UserInfoEvent, UserSettingsEvent } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { useBetween } from 'use-between'; +import { SendMessageComposer } from '../../api'; +import { useMessageEvent } from '../events'; + +const useSessionInfoState = () => +{ + const [ userInfo, setUserInfo ] = useState(null); + const [ userFigure, setUserFigure ] = useState(null); + const [ chatStyleId, setChatStyleId ] = useState(0); + + const updateChatStyleId = (styleId: number) => + { + setChatStyleId(styleId); + + SendMessageComposer(new RoomUnitChatStyleComposer(styleId)); + } + + useMessageEvent(UserInfoEvent, event => + { + const parser = event.getParser(); + + setUserInfo(parser.userInfo); + setUserFigure(parser.userInfo.figure); + }); + + useMessageEvent(FigureUpdateEvent, event => + { + const parser = event.getParser(); + + setUserFigure(parser.figure); + }); + + useMessageEvent(UserSettingsEvent, event => + { + const parser = event.getParser(); + + setChatStyleId(parser.chatType); + }); + + return { userInfo, userFigure, chatStyleId, updateChatStyleId }; +} + +export const useSessionInfo = () => useBetween(useSessionInfoState); diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts new file mode 100644 index 00000000..f0cc26cb --- /dev/null +++ b/src/hooks/useLocalStorage.ts @@ -0,0 +1,43 @@ +import { NitroLogger } from '@nitrots/nitro-renderer'; +import { Dispatch, SetStateAction, useState } from 'react'; + +const useLocalStorageState = (key: string, initialValue: T): [ T, Dispatch>] => +{ + const [ storedValue, setStoredValue ] = useState(() => + { + if(typeof window === 'undefined') return initialValue; + + try + { + const item = window.localStorage.getItem(key); + + return item ? JSON.parse(item) : initialValue; + } + + catch(error) + { + return initialValue; + } + }); + + const setValue = (value: T) => + { + try + { + const valueToStore = value instanceof Function ? value(storedValue) : value; + + setStoredValue(valueToStore); + + if(typeof window !== 'undefined') window.localStorage.setItem(key, JSON.stringify(valueToStore)); + } + + catch(error) + { + NitroLogger.error(error); + } + } + + return [ storedValue, setValue ]; +} + +export const useLocalStorage = useLocalStorageState; diff --git a/src/hooks/useSharedVisibility.ts b/src/hooks/useSharedVisibility.ts new file mode 100644 index 00000000..b55855b5 --- /dev/null +++ b/src/hooks/useSharedVisibility.ts @@ -0,0 +1,44 @@ +import { useCallback, useMemo, useState } from 'react'; + +export const useSharedVisibility = () => +{ + const [ activeIds, setActiveIds ] = useState([]); + + const isVisible = useMemo(() => !!activeIds.length, [ activeIds ]); + + const activate = useCallback(() => + { + let id = -1; + + setActiveIds(prevValue => + { + const newValue = [ ...prevValue ]; + + id = newValue.length ? (newValue[(newValue.length - 1)] + 1) : 0; + + newValue.push(id); + + return newValue; + }); + + return id; + }, []); + + const deactivate = useCallback((id: number) => + { + setActiveIds(prevValue => + { + const newValue = [ ...prevValue ]; + + const index = newValue.indexOf(id); + + if(index === -1) return prevValue; + + newValue.splice(index, 1); + + return newValue; + }); + }, []); + + return { isVisible, activate, deactivate }; +} diff --git a/src/hooks/wired/index.ts b/src/hooks/wired/index.ts new file mode 100644 index 00000000..dc790208 --- /dev/null +++ b/src/hooks/wired/index.ts @@ -0,0 +1 @@ +export * from './useWired'; diff --git a/src/hooks/wired/useWired.ts b/src/hooks/wired/useWired.ts new file mode 100644 index 00000000..43f91f11 --- /dev/null +++ b/src/hooks/wired/useWired.ts @@ -0,0 +1,131 @@ +import { ConditionDefinition, Triggerable, TriggerDefinition, UpdateActionMessageComposer, UpdateConditionMessageComposer, UpdateTriggerMessageComposer, WiredActionDefinition, WiredFurniActionEvent, WiredFurniConditionEvent, WiredFurniTriggerEvent, WiredSaveSuccessEvent } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { useBetween } from 'use-between'; +import { IsOwnerOfFloorFurniture, LocalizeText, SendMessageComposer, WiredSelectionVisualizer } from '../../api'; +import { useMessageEvent } from '../events'; +import { useNotification } from '../notification'; + +const useWiredState = () => +{ + const [ trigger, setTrigger ] = useState(null); + const [ intParams, setIntParams ] = useState([]); + const [ stringParam, setStringParam ] = useState(''); + const [ furniIds, setFurniIds ] = useState([]); + const [ actionDelay, setActionDelay ] = useState(0); + const { showConfirm = null } = useNotification(); + + const saveWired = () => + { + const save = (trigger: Triggerable) => + { + if(!trigger) return; + + if(trigger instanceof WiredActionDefinition) + { + SendMessageComposer(new UpdateActionMessageComposer(trigger.id, intParams, stringParam, furniIds, actionDelay, trigger.stuffTypeSelectionCode)); + } + + else if(trigger instanceof TriggerDefinition) + { + SendMessageComposer(new UpdateTriggerMessageComposer(trigger.id, intParams, stringParam, furniIds, trigger.stuffTypeSelectionCode)); + } + + else if(trigger instanceof ConditionDefinition) + { + SendMessageComposer(new UpdateConditionMessageComposer(trigger.id, intParams, stringParam, furniIds, trigger.stuffTypeSelectionCode)); + } + } + + if(!IsOwnerOfFloorFurniture(trigger.id)) + { + showConfirm(LocalizeText('wiredfurni.nonowner.change.confirm.body'), () => + { + save(trigger) + }, null, null, null, LocalizeText('wiredfurni.nonowner.change.confirm.title')); + } + else + { + save(trigger); + } + } + + const selectObjectForWired = (objectId: number, category: number) => + { + if(!trigger) return; + + if(objectId <= 0) return; + + setFurniIds(prevValue => + { + const newFurniIds = [ ...prevValue ]; + + const index = prevValue.indexOf(objectId); + + if(index >= 0) + { + newFurniIds.splice(index, 1); + + WiredSelectionVisualizer.hide(objectId); + } + + else if(newFurniIds.length < trigger.maximumItemSelectionCount) + { + newFurniIds.push(objectId); + + WiredSelectionVisualizer.show(objectId); + } + + return newFurniIds; + }); + } + + useMessageEvent(WiredSaveSuccessEvent, event => + { + const parser = event.getParser(); + + setTrigger(null); + }); + + useMessageEvent(WiredFurniActionEvent, event => + { + const parser = event.getParser(); + + setTrigger(parser.definition); + }); + + useMessageEvent(WiredFurniConditionEvent, event => + { + const parser = event.getParser(); + + setTrigger(parser.definition); + }); + + useMessageEvent(WiredFurniTriggerEvent, event => + { + const parser = event.getParser(); + + setTrigger(parser.definition); + }); + + useEffect(() => + { + if(!trigger) return; + + return () => + { + setIntParams([]); + setStringParam(''); + setActionDelay(0); + setFurniIds(prevValue => + { + if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); + + return []; + }); + } + }, [ trigger ]); + + return { trigger, setTrigger, intParams, setIntParams, stringParam, setStringParam, furniIds, setFurniIds, actionDelay, setActionDelay, saveWired, selectObjectForWired }; +} + +export const useWired = () => useBetween(useWiredState); diff --git a/src/index.scss b/src/index.scss index 9cce75fa..3eeafcc7 100644 --- a/src/index.scss +++ b/src/index.scss @@ -1,5 +1,4 @@ - -@import './assets/styles'; +@import "./assets/styles"; html, body { @@ -8,13 +7,20 @@ body { height: 100%; overflow: hidden; user-select: none; - image-rendering: pixelated; - image-rendering: -moz-crisp-edges; scrollbar-width: thin; + + .image-rendering-pixelated { + image-rendering: pixelated; + image-rendering: -moz-crisp-edges; + } + + * { + -webkit-font-smoothing: antialiased; + } } img { object-fit: none; } -@import './App'; +@import "./App"; diff --git a/src/index.tsx b/src/index.tsx index fb56db9f..b0fc34bc 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,14 +1,11 @@ import { library } from '@fortawesome/fontawesome-svg-core'; import { fas } from '@fortawesome/free-solid-svg-icons'; import React from 'react'; -import ReactDOM from 'react-dom'; +import { createRoot } from 'react-dom/client'; import { App } from './App'; import './index.scss'; //@ts-ignore library.add(fas); -ReactDOM.render( - , - document.getElementById('root') -); +createRoot(document.getElementById('root')).render(); diff --git a/src/workers/IntervalWebWorker.ts b/src/workers/IntervalWebWorker.ts new file mode 100644 index 00000000..b2c145fe --- /dev/null +++ b/src/workers/IntervalWebWorker.ts @@ -0,0 +1,48 @@ +export default () => +{ + const intervals: { + id: number, + interval: ReturnType + }[] = []; + + // eslint-disable-next-line no-restricted-globals + self.onmessage = (message: MessageEvent) => + { + if(!message) return; + + const data: { [index: string]: any } = message.data; + + switch(data.type) + { + case 'CREATE_INTERVAL': { + const id = (data.timerId as number); + const time = (data.time as number); + const response = (data.response as string); + + const interval = setInterval(() => postMessage(response), time); + + intervals.push({ id, interval }); + return; + } + case 'REMOVE_INTERVAL': { + const id = (data.timerId as number); + + const i = 0; + + while(i < intervals.length) + { + const interval = intervals[i]; + + if(interval.id === id) + { + clearInterval(interval.interval); + + intervals.splice(i, 1); + + return; + } + } + } + } + } +} diff --git a/src/workers/WorkerBuilder.ts b/src/workers/WorkerBuilder.ts new file mode 100644 index 00000000..b848893e --- /dev/null +++ b/src/workers/WorkerBuilder.ts @@ -0,0 +1,10 @@ +export class WorkerBuilder extends Worker +{ + constructor(worker) + { + const code = worker.toString(); + const blob = new Blob([ `(${ code })()` ]); + + super(URL.createObjectURL(blob)); + } +} diff --git a/tsconfig.json b/tsconfig.json index ac2a9fd7..5fede090 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "strict": false, "downlevelIteration": true, "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, + "noFallthroughCasesInSwitch": false, "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, diff --git a/yarn.lock b/yarn.lock index 309add21..6b568a4f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,11 +3,12 @@ "@ampproject/remapping@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" - integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: - "@jridgewell/trace-mapping" "^0.3.0" + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" "@babel/code-frame@7.10.4": version "7.10.4" @@ -23,17 +24,17 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.5.5": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.5.5": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: - "@babel/highlight" "^7.16.7" + "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" - integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" + integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== "@babel/core@7.12.3": version "7.12.3" @@ -58,410 +59,400 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.7.tgz#f7c28228c83cdf2dbd1b9baa06eaf9df07f0c2f9" - integrity sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" + integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== dependencies: "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.7" - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helpers" "^7.17.7" - "@babel/parser" "^7.17.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.1.2" + json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.17.3", "@babel/generator@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" - integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== +"@babel/generator@^7.12.1", "@babel/generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" + integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== dependencies: - "@babel/types" "^7.17.0" + "@babel/types" "^7.18.9" + "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" - source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" - integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.20.2" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.1", "@babel/helper-create-class-features-plugin@^7.17.6": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9" - integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" + integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" -"@babel/helper-create-regexp-features-plugin@^7.16.7": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" - integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== +"@babel/helper-create-regexp-features-plugin@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c" + integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^5.0.1" + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.1.0" -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== +"@babel/helper-define-polyfill-provider@^0.3.1", "@babel/helper-define-polyfill-provider@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073" + integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg== dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== +"@babel/helper-environment-visitor@^7.18.6", "@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== dependencies: - "@babel/types" "^7.16.7" + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.9" -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.9" -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.16.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" - integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== dependencies: - "@babel/types" "^7.17.0" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" - integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== + +"@babel/helper-remap-async-to-generator@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" + integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== dependencies: - "@babel/types" "^7.16.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" + "@babel/types" "^7.18.6" -"@babel/helper-replace-supers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" - integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" + integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.9" -"@babel/helper-simple-access@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" - integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: - "@babel/types" "^7.17.0" + "@babel/types" "^7.18.6" -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-wrap-function@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz#ae1feddc6ebbaa2fd79346b77821c3bd73a39646" + integrity sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ== dependencies: - "@babel/types" "^7.16.0" + "@babel/helper-function-name" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== +"@babel/helpers@^7.12.1", "@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== dependencies: - "@babel/types" "^7.16.7" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helpers@^7.12.1", "@babel/helpers@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.7.tgz#6fc0a24280fd00026e85424bbfed4650e76d7127" - integrity sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.7", "@babel/parser@^7.7.0": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.7.tgz#fc19b645a5456c8d6fdb6cecd3c66c0173902800" - integrity sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.18.6", "@babel/parser@^7.18.9", "@babel/parser@^7.7.0": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" + integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" - integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" - integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" + integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" -"@babel/plugin-proposal-async-generator-functions@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" - integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== +"@babel/plugin-proposal-async-generator-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz#aedac81e6fc12bb643374656dd5f2605bf743d17" + integrity sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" - integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== +"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" - integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" + integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.6" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz#c36372ddfe0360cac1ee331a238310bddca11493" - integrity sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.9.tgz#d09d41ffc74af8499d2ac706ed0dbd5474711665" + integrity sha512-KD7zDNaD14CRpjQjVbV4EnH9lsKYlcpUrhZH37ei2IY+AlXrfAPy5pTmRUE4X6X1k8EsKXPraykxeaogqQvSGA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.1" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/plugin-syntax-decorators" "^7.17.0" - charcodes "^0.2.0" + "@babel/helper-create-class-features-plugin" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/plugin-syntax-decorators" "^7.18.6" -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" - integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" - integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" - integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" + integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" - integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== +"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.16.7": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" - integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== +"@babel/plugin-proposal-object-rest-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" + integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== dependencies: - "@babel/compat-data" "^7.17.0" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.18.8" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" - integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== +"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.16.11": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" - integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== +"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.10" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" - integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" + integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" - integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -491,12 +482,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz#a2be3b2c9fe7d78bd4994e790896bc411e2f166d" - integrity sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A== +"@babel/plugin-syntax-decorators@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.18.6.tgz#2e45af22835d0b0f8665da2bfd4463649ce5dbc1" + integrity sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -512,12 +503,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" - integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== +"@babel/plugin-syntax-flow@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-import-assertions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" + integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -533,12 +531,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" - integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -596,363 +594,366 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" - integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== +"@babel/plugin-syntax-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" + integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" - integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" + integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" - integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" + integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" - integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== +"@babel/plugin-transform-block-scoping@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" + integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-classes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" - integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== +"@babel/plugin-transform-classes@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da" + integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" - integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" + integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-destructuring@^7.16.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" - integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== +"@babel/plugin-transform-destructuring@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292" + integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-duplicate-keys@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" - integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-flow-strip-types@^7.16.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" - integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.9.tgz#5b4cc521426263b5ce08893a2db41097ceba35bf" + integrity sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-flow" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-flow" "^7.18.6" -"@babel/plugin-transform-for-of@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" - integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" - integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" - integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== +"@babel/plugin-transform-modules-amd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21" + integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.16.8": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz#d86b217c8e45bb5f2dbc11eefc8eab62cf980d19" - integrity sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA== +"@babel/plugin-transform-modules-commonjs@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" + integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== dependencies: - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" - integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== +"@babel/plugin-transform-modules-systemjs@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06" + integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A== dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-validator-identifier" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" - integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" - integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d" + integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-new-target@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" - integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" - integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== +"@babel/plugin-transform-parameters@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" + integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz#6cc273c2f612a6a50cb657e63ee1303e5e68d10a" - integrity sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.9.tgz#ff6aeedd38f57ba6b41dcf824fcc8bcedb3e783f" + integrity sha512-IrTYh1I3YCEL1trjknnlLKTp5JggjzhKl/d3ibzPc97JhpFcDTr38Jdek/oX4cFbS6By0bXJcOkpRvJ5ZHK2wQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" - integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.18.6" -"@babel/plugin-transform-react-jsx@^7.16.7": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" - integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz#2721e96d31df96e3b7ad48ff446995d26bc028ff" + integrity sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.17.0" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.18.6" -"@babel/plugin-transform-react-pure-annotations@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" - integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" - integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" + integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== dependencies: - regenerator-transform "^0.14.2" + "@babel/helper-plugin-utils" "^7.18.6" + regenerator-transform "^0.15.0" -"@babel/plugin-transform-reserved-words@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" - integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@^7.16.4": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz#0a2e08b5e2b2d95c4b1d3b3371a2180617455b70" - integrity sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.9.tgz#d9e4b1b25719307bfafbf43065ed7fb3a83adb8f" + integrity sha512-wS8uJwBt7/b/mzE13ktsJdmS4JP/j7PQSaADtnb4I2wL0zK51MQ0pmF8/Jy0wUIS96fr+fXT6S/ifiPXnvrlSg== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.1" + babel-plugin-polyfill-corejs3 "^0.5.2" + babel-plugin-polyfill-regenerator "^0.3.1" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" - integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== +"@babel/plugin-transform-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664" + integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-template-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" - integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typeof-symbol@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" - integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@^7.16.7": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" - integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== +"@babel/plugin-transform-typescript@^7.18.6": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.8.tgz#303feb7a920e650f2213ef37b36bbf327e6fa5a0" + integrity sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-typescript" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-typescript" "^7.18.6" -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== +"@babel/plugin-transform-unicode-escapes@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz#0d01fb7fb2243ae1c033f65f6e3b4be78db75f27" + integrity sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.8.4": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.9.tgz#9b3425140d724fbe590322017466580844c7eaff" + integrity sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg== dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.8" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.11" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.18.6" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.18.9" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -962,44 +963,44 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.18.9" + "@babel/plugin-transform-classes" "^7.18.9" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.18.9" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.18.6" + "@babel/plugin-transform-modules-commonjs" "^7.18.6" + "@babel/plugin-transform-modules-systemjs" "^7.18.9" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.18.9" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.6" + "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" + "@babel/types" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.1" + babel-plugin-polyfill-corejs3 "^0.5.2" + babel-plugin-polyfill-regenerator "^0.3.1" + core-js-compat "^3.22.1" semver "^6.3.0" "@babel/preset-modules@^0.1.5": @@ -1014,72 +1015,72 @@ esutils "^2.0.2" "@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" - integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-react-display-name" "^7.16.7" - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" "@babel/preset-typescript@^7.16.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" - integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-typescript" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" "@babel/runtime-corejs3@^7.10.2": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.7.tgz#cf914f474c490ef1aa8661d47adaa0a993636e7e" - integrity sha512-TvliGJjhxis5m7xIMvlXH/xG8Oa/LK0SCUCyfKD6nLi42n5fB4WibDJ0g9trmmBB6hwpMNx+Lzbxy9/4gpMaVw== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz#7bacecd1cb2dd694eacd32a91fcf7021c20770ae" + integrity sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A== dependencies: core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.16", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.7.tgz#a5f3328dc41ff39d803f311cfe17703418cf9825" - integrity sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA== +"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4", "@babel/template@^7.16.7", "@babel/template@^7.3.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== +"@babel/template@^7.10.4", "@babel/template@^7.18.6", "@babel/template@^7.3.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" + integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.6" + "@babel/types" "^7.18.6" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.7.0": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" - integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.18.9", "@babel/traverse@^7.7.0": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" + integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.3" - "@babel/types" "^7.17.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.9" + "@babel/types" "^7.18.9" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f" + integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1095,10 +1096,10 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@craco/craco@^6.3.0": - version "6.4.3" - resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-6.4.3.tgz#784395b6ebab764056550a2860494d24c3abd44e" - integrity sha512-RzkXYmNzRCGUyG7mM+IUMM+nvrpSfA34352sPSGQN76UivAmCAht3sI4v5JKgzO05oUK9Zwi6abCKD7iKXI8hQ== +"@craco/craco@^6.4.5": + version "6.4.5" + resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-6.4.5.tgz#471e67082a2ffd3edf73759b215bdc16250d27b3" + integrity sha512-8F2rIAao8sEh0FPP52ViEvDM9GjJ7acq0knu1c8UgI+EuZMD5/ZB270ol6jV4iNY7it9Umg/RoGBvNRUNr8U8w== dependencies: cosmiconfig "^7.0.1" cosmiconfig-typescript-loader "^1.0.0" @@ -1107,17 +1108,12 @@ semver "^7.3.2" webpack-merge "^4.2.2" -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" - integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: - "@cspotcode/source-map-consumer" "0.8.0" + "@jridgewell/trace-mapping" "0.3.9" "@csstools/convert-colors@^1.4.0": version "1.4.0" @@ -1144,29 +1140,44 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@fortawesome/fontawesome-common-types@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.1.0.tgz#5a9468da0e5c2a3ccc161882ef5ffafbd3d4882f" - integrity sha512-lFIJ5opxOKG9q88xOsuJJAdRZ+2WRldsZwUR/7MJoOMUMhF/LkHUjwWACIEPTa5Wo6uTDHvGRIX+XutdN7zYxA== - -"@fortawesome/fontawesome-svg-core@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.1.0.tgz#b78a43df315a6b1568d803ee48a9f1edea0714aa" - integrity sha512-racj+/EDnMZN0jcuHePOa+9kdHHOCpCAbBvVRnEi4G4DA5SWQiT/uXJ8WcfVEbLN51vPJjhukP4o+zH0cfYplg== +"@eslint/eslintrc@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== dependencies: - "@fortawesome/fontawesome-common-types" "6.1.0" + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" -"@fortawesome/free-solid-svg-icons@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.1.0.tgz#1bdc3ce6ddd2336348ba324ac4a72161725b0d95" - integrity sha512-OOr0jRHl5d41RzBS3sZh5Z3HmdPjMr43PxxKlYeLtQxFSixPf4sJFVM12/rTepB2m0rVShI0vtjHQmzOTlBaXg== +"@fortawesome/fontawesome-common-types@6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.1.1.tgz#7dc996042d21fc1ae850e3173b5c67b0549f9105" + integrity sha512-wVn5WJPirFTnzN6tR95abCx+ocH+3IFLXAgyavnf9hUmN0CfWoDjPT/BAWsUVwSlYYVBeCLJxaqi7ZGe4uSjBA== + +"@fortawesome/fontawesome-svg-core@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.1.1.tgz#3424ec6182515951816be9b11665d67efdce5b5f" + integrity sha512-NCg0w2YIp81f4V6cMGD9iomfsIj7GWrqmsa0ZsPh59G7PKiGN1KymZNxmF00ssuAlo/VZmpK6xazsGOwzKYUMg== dependencies: - "@fortawesome/fontawesome-common-types" "6.1.0" + "@fortawesome/fontawesome-common-types" "6.1.1" -"@fortawesome/react-fontawesome@^0.1.17": - version "0.1.17" - resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.17.tgz#06fc06cb1a721e38e5b50b4a1cb851e9b9c77d7a" - integrity sha512-dX43Z5IvMaW7fwzU8farosYjKNGfRb2HB/DgjVBHeJZ/NSnuuaujPPx0YOdcAq+n3mqn70tyCde2HM1mqbhiuw== +"@fortawesome/free-solid-svg-icons@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.1.1.tgz#3369e673f8fe8be2fba30b1ec274d47490a830a6" + integrity sha512-0/5exxavOhI/D4Ovm2r3vxNojGZioPwmFrKg0ZUH69Q68uFhFPs6+dhAToh6VEQBntxPRYPuT5Cg1tpNa9JUPg== + dependencies: + "@fortawesome/fontawesome-common-types" "6.1.1" + +"@fortawesome/react-fontawesome@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz#d90dd8a9211830b4e3c08e94b63a0ba7291ddcf4" + integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== dependencies: prop-types "^15.8.1" @@ -1216,7 +1227,16 @@ debug "^4.1.1" minimatch "^3.0.4" -"@humanwhocodes/object-schema@^1.2.0": +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0", "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== @@ -1408,35 +1428,101 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/resolve-uri@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" - integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.11" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" - integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.0": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" - integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@nitrots/nitro-renderer@^1.1.13": - version "1.1.13" - resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.13.tgz#0173ebda69c41031903461a21a4b3dfa0bd6fcaa" - integrity sha512-LGk8514m+/+Y50kOdkP7dVG9DXTNPM3kD/U+wDJBw6MPkxe0R2blhwPoELK02jO6Ehfoz5v+nlhNeUTHzRZzeg== +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== dependencies: - "@pixi/canvas-renderer" "^6.2.2" - "@pixi/extract" "^6.2.2" + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@nitrots/nitro-renderer@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.3.4.tgz#1cde08c7988795a5e016930bd47bdb93279d6560" + integrity sha512-HmgRZkoM5BQQz27BWKujyioTTMokzVIPzxL9juiGagt+qFupM5Hj8Nm7Udx0XeuEGH1E7gghv+ggCCl1FKweoA== + dependencies: + "@pixi/app" "~6.4.2" + "@pixi/basis" "~6.4.2" + "@pixi/canvas-display" "~6.4.2" + "@pixi/canvas-extract" "~6.4.2" + "@pixi/canvas-renderer" "~6.4.2" + "@pixi/constants" "~6.4.2" + "@pixi/core" "~6.4.2" + "@pixi/display" "~6.4.2" + "@pixi/events" "~6.4.2" + "@pixi/extract" "~6.4.2" "@pixi/filter-adjustment" "^4.1.3" + "@pixi/filter-alpha" "~6.4.2" + "@pixi/filter-color-matrix" "~6.4.2" + "@pixi/graphics" "~6.4.2" + "@pixi/graphics-extras" "~6.4.2" + "@pixi/interaction" "~6.4.2" + "@pixi/loaders" "~6.4.2" + "@pixi/math" "~6.4.2" + "@pixi/math-extras" "~6.4.2" + "@pixi/mixin-cache-as-bitmap" "~6.4.2" + "@pixi/mixin-get-child-by-name" "~6.4.2" + "@pixi/mixin-get-global-position" "~6.4.2" + "@pixi/polyfill" "~6.4.2" + "@pixi/runner" "~6.4.2" + "@pixi/settings" "~6.4.2" + "@pixi/sprite" "~6.4.2" + "@pixi/sprite-tiling" "~6.4.2" + "@pixi/spritesheet" "~6.4.2" + "@pixi/text" "~6.4.2" + "@pixi/ticker" "~6.4.2" "@pixi/tilemap" "^3.2.2" + "@pixi/utils" "~6.4.2" + gifuct-js "^2.1.2" pako "^2.0.4" - pixi.js "^6.2.2" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1475,200 +1561,172 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@pixi/accessibility@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/accessibility/-/accessibility-6.2.2.tgz#0c46b59d11c3e4b841bff5153116e2d17d028a24" - integrity sha512-/mXRXCw67bmPY/OZ1Y1p747h3SSg7eqacIChAUJohjbcJK0R2EJRD2uVTspVIUpHPJA0ECNGBpKqk0C1Yzkj2w== +"@pixi/app@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/app/-/app-6.4.2.tgz#d24e1fe4cb415e8dd7f2fd26a8e59969debee3ca" + integrity sha512-r0cTQan9ST0N+QmaaZQso7q0Q/lk9pUXB7dez+2vrLEbP8TAnLym2V2H+ChN6TwD+EoX6qXD7oFohNbwPedNyA== -"@pixi/app@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/app/-/app-6.2.2.tgz#45c3dba327a6500d6b9322048950499a5588ec22" - integrity sha512-YBzVaSZGA842w2gsgqzxYwQMXeu2JZmSyiybi4raFsA35iOeMurXy7sEs5NP9JO+cjobJyx6echuHzZpKUjWsQ== +"@pixi/basis@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/basis/-/basis-6.4.2.tgz#27631986560c2dc7c07a0059be4c122c3dbe1753" + integrity sha512-R17XUYnni8Nkg4Z9b2h/GYSQsY/iUQEZWJK3QHhdCbTOVb+NyKpEO7Jt5aOIqdpmC7jEySIN3x64xa+Wq+Ezbg== -"@pixi/canvas-renderer@^6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/canvas-renderer/-/canvas-renderer-6.2.2.tgz#01b7be3f91c66d527713feb3dd52f128d61dd908" - integrity sha512-GIGUhA9bzodom8oslIYEq9KWB+ko6IJCY+WmzBxvaH2TBKQQ85k6vipTCp+w/ZgNnezhcA/eFRQoqFFM4ob7+A== +"@pixi/canvas-display@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/canvas-display/-/canvas-display-6.4.2.tgz#3641eb07db542c0e3fc80fb9110b245dbe712887" + integrity sha512-RoHJLcLkl4w3a3HrWhkvB8Tu9V0GWIxOcdM81o58rBFhi+BWC4MEuiqkQ/6AUXaaCSYV4dIbyiEbrxb7fJM57g== -"@pixi/compressed-textures@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/compressed-textures/-/compressed-textures-6.2.2.tgz#8860283058ab931c26dde27daa328e0a7de11a65" - integrity sha512-ZjiqYCE6nGtsKTRa6w4W6Krh3vo4M3WT6lrP+VW6BfgUx3quEURt5GVFsFZrJpWF4yI1fShFmjBUOerrTLJGRQ== +"@pixi/canvas-extract@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/canvas-extract/-/canvas-extract-6.4.2.tgz#224ca7399fb0f7e0f551b5c437357b4078a68cdd" + integrity sha512-BNddDRWD0Eejn7pozqTJkmfQNVcwx9r++aAFZ4DOqXJji84G57M4eXkdM22+N4j5hgxxxiCTZCkYUmCIk9Y/RQ== -"@pixi/constants@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/constants/-/constants-6.2.2.tgz#53a2d0e7f3d16d0400985d81005a076c25b0b32a" - integrity sha512-BKSoj/5SI+pQEatuCG5kXXWtCZmZZNMhfhXeqvYO/WNZ+LDxm6F4pllf0t7KjGs1ZBpNxVf6fyngF9Q5r3MgJQ== +"@pixi/canvas-renderer@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/canvas-renderer/-/canvas-renderer-6.4.2.tgz#cd73279918f3c61a09645d5e2bdae3585ffd7c44" + integrity sha512-NnVT61LlzCk80FGl/imp8zVg6cxinyFk7uljTYJBPJTM6PBFdn/LD+H3wcdbggjNWVSfqwYXVM6gN5Ce22tONg== -"@pixi/core@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/core/-/core-6.2.2.tgz#badf9c03e3a07835b92d1a3868363d8e5083cf13" - integrity sha512-XAqgdJ1w9k1ZUBXECm19rcnN2ngm+tOP74HkGw4qQay0biM3JS+wtX4fWQmZNGr8krf6lJrNbsghbtUy70uUaw== +"@pixi/constants@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/constants/-/constants-6.4.2.tgz#1835fe2cbae9ce7865f9a67bd2d4aef800be6a11" + integrity sha512-qj+eviYmJqeGkMbIKSkp1FVMLglQPVyzzyo/2/0VYmSuY4m4WItC4w3wtyjDd4vBK9YxZIUBZz+LKJvKkRplLQ== -"@pixi/display@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/display/-/display-6.2.2.tgz#6e8ef26f2ed686c03d71d8bb5b92e6222cb23563" - integrity sha512-8a0R+9rjlUUjb13nBA6ZNj9gygJqt38B63uIZ2inkhxpIQf0CLo2hNxkqCqXiMeRuGmOw1n6neEDMnHO1Ks+xA== +"@pixi/core@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/core/-/core-6.4.2.tgz#b62fa4dc59280313a33922eac69db63f0336db42" + integrity sha512-W5RWg0537uz2ni0BW9pA0gRmYGBE628e5XR4iDXO5VLSIZmc4jcaBLsPC7o1amcg1xo5Ty44yMpVpodv+GGRCw== + dependencies: + "@types/offscreencanvas" "^2019.6.4" -"@pixi/extract@6.2.2", "@pixi/extract@^6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/extract/-/extract-6.2.2.tgz#f8d682dbf4c29ad2bbbed0bf710c63fcfdcadc7c" - integrity sha512-w3gW1/VoHNqFEUNGRQBKm8dCdg816etbpbLExWctmPpNdyxos5N7DF44UMRFg40GPVBBNzYissrH/ojca4PFIA== +"@pixi/display@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/display/-/display-6.4.2.tgz#04ad9c5b41e039fe9a778c5346d28a810d82a2fe" + integrity sha512-mE35oRa4Ex5NOVXsuk7JldmmjBfO0gtOO7FPU3VpheOB13HLoacJ4XAa1HfAGapFiFZe+K19gOXEiOj1RyJfGA== + +"@pixi/events@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/events/-/events-6.4.2.tgz#b65d2b6e64631571179079819972b515d6336ec5" + integrity sha512-peLSZrNzU4jRlKkYc80FpyW4ziep1rDnHxto/kKNkEJbn2dALZjMdzIV7ALB17pV7GH5ZH2cqwiKw26rhLFwmQ== + +"@pixi/extract@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/extract/-/extract-6.4.2.tgz#9423483ecc58d6feb441d8eb8d5bc2cdacc37c9c" + integrity sha512-4eMqkns+NL2/DmdezjbVG4TW+eII3hvgDM3koDQNoO4yjMgU+55TTptPU9jJL/JJwntRiUECLSIHg8eZxmA5mA== "@pixi/filter-adjustment@^4.1.3": version "4.1.3" resolved "https://registry.yarnpkg.com/@pixi/filter-adjustment/-/filter-adjustment-4.1.3.tgz#61e34b4dd9766ccf40463f0538201bf68f78df66" integrity sha512-W+NhPiZRYKoRToa5+tkU95eOw8gnS5dfIp3ZP+pLv2mdER9RI+4xHxp1uLHMqUYZViTaMdZIIoVOuCgHFPYCbQ== -"@pixi/filter-alpha@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/filter-alpha/-/filter-alpha-6.2.2.tgz#4c39d67deaf99d979019252ea6dab69d853bae84" - integrity sha512-CijLcgFdmivmSyZuM5Yyeo6R+PwalZp9OSoard1Oh5DBVvcRDn4m3cBM+nimR4YJbr0kiMbK4Ja8r+e2vwFVjA== +"@pixi/filter-alpha@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/filter-alpha/-/filter-alpha-6.4.2.tgz#592f3285a86293d372c241c01530966f463d15d9" + integrity sha512-If6a/tCPnFo0FQI/v6uy0OSqrNI8YMZMdcY7CfgklqDHx50CvhKp0d2tPYE4ETNgSpO883LARz6pi6yLAH83AA== -"@pixi/filter-blur@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/filter-blur/-/filter-blur-6.2.2.tgz#bc0f0d0fe2d7095d3fd8924dd013f154a7436e68" - integrity sha512-ApFqn2fMIipr3mRp/8dZ74qraGGzzPO/EzvltDqJLru9vGlbX6dKLXZ6w5H8D/uN6aQW1e4N1Nrtzk5mvJVQ3g== +"@pixi/filter-color-matrix@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/filter-color-matrix/-/filter-color-matrix-6.4.2.tgz#313aa6df18dfe8d91049ee8aff4eafd22ef54e63" + integrity sha512-IsR2piAxGmyesqZ4OlIyv5OvUkHx3K5iL+js6vricbcbBZA9fQUjTXdZmb7RloO6Po3Amze3f9ZkuLe4CNpUDQ== -"@pixi/filter-color-matrix@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/filter-color-matrix/-/filter-color-matrix-6.2.2.tgz#9eb4c55ae37b2d6e221ef7bb1781c58fb33890ad" - integrity sha512-fQWbtKFWV29jKkq4d6TknEfQ5sF5OxcbJeZo0HJmgoV3FLZ0t21XE991CFI/TqDBo8U3wzUPZVbXxiFoDKmJ8w== +"@pixi/graphics-extras@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/graphics-extras/-/graphics-extras-6.4.2.tgz#caf4277b6852b93b2f58cbb4c400e8fd194b04b7" + integrity sha512-SOYBCs2bs5wZYnMPLr3lTb/CZ5yP8cX/GUa+Nu4ohtpesrXlvkAWdAG+qeujnsUNp/9RLXQZhjw5vFC6TzqbRA== -"@pixi/filter-displacement@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/filter-displacement/-/filter-displacement-6.2.2.tgz#6eaa737b1c055c5daff77e384f6d2f728f2a93f3" - integrity sha512-cd9um4kNNIeqKA/wVZw+iha+XVbBOYBC8En5hk3ZXAIXxCHxOCz3KS+aOVejXH5EB/gMDPvNNwygn0SCpSGdKA== +"@pixi/graphics@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/graphics/-/graphics-6.4.2.tgz#a3dadc078432b67d4606b1f05c5ab3fce80db40b" + integrity sha512-bMIuOee3ONsibRzq9/YUOPfrJ9rD5UK4ifhHRcB5sXwyRXhVK2HNkT2H4+0JQ8o7TxqjJE8neb5en9hn3ZR3SQ== -"@pixi/filter-fxaa@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/filter-fxaa/-/filter-fxaa-6.2.2.tgz#fea85d68414f9ee7f417d7e54791ccbaccd861c4" - integrity sha512-e4qekMlsiEcjV0JRoqH3b34sk8yzT4jsROYPHzk0IiafE+nNNcF3vQmcmnfC0aGIyODzmNdzFLjlFkRRSviydA== +"@pixi/interaction@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/interaction/-/interaction-6.4.2.tgz#5745498057c174fb5c7538619644c7b104a58cf5" + integrity sha512-CJ4BAZUM+9ykRE9NIOyTiv7oR+PoiDqn+GcI8boE9mRyJ0WZosznCYdcAwEk5k/F5+Az0z8hK3PjzTuNvrPAcw== -"@pixi/filter-noise@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/filter-noise/-/filter-noise-6.2.2.tgz#a4617a279e968628d7e088b36bf28c8c7cf85fb9" - integrity sha512-Jp4L6winS6ZGKpp76x3JyfEWnUMY44fQ90Ts3R3vKkZZFNDd3T4uisZ7YwvDKOhmSo5hY3lQkXaCg/YO5feXbw== +"@pixi/loaders@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/loaders/-/loaders-6.4.2.tgz#74558719d9febfc34de863a2df791502cefdc600" + integrity sha512-2y4JbGhhYYYdKIZfy9Evc7rcctqcXiP6xuAuIfqVgRD9SjQkxImelgCpyYT/BpjXP5jetyim8Usv07Ynx+4B0w== -"@pixi/graphics@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/graphics/-/graphics-6.2.2.tgz#bffa1b6ab75a2c5ca54a83444e5cafe6e68dd7c7" - integrity sha512-mQyd6ef6/EF5nt7M1OObBEb9FCXxIP6AT30H01Z2wnnCgu4qj8MHrJxTkQxSHynQ+eVVPswzpVizUQZHlIYZNw== +"@pixi/math-extras@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/math-extras/-/math-extras-6.4.2.tgz#3210e6ca2f7b0c8d2e5d8cc1142a8e3e349fef2e" + integrity sha512-Dc1GszTU5pW4cSG6VV2UYMkcDASC5KW0N7wPGEh3UCB8p79JwmN+xJ/mCC6m9lkgAdAc6b3KQTUPdWFycnpdJA== -"@pixi/interaction@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/interaction/-/interaction-6.2.2.tgz#31abd2ed0b810570ff487dd7595b755b76f5a3ba" - integrity sha512-gpNLCPc+j+RZSZqbKbzVRf4fSlOlYm0xqUVn6JtNH1kc+d9AV7Nmw9but4osP/eodDWsWPQ+7sPKClHY36bKRA== +"@pixi/math@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/math/-/math-6.4.2.tgz#32c39453877e6faa0c8891b8fbeec02a4f8bfecf" + integrity sha512-/byuwLhzln7Gahl3pT/Ckfwe4nvAQ3tAYu+38B+b18HkQWi3Ykci/QwVq/nICb5sa5tJzW3icno2qcv7zBd2xQ== -"@pixi/loaders@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/loaders/-/loaders-6.2.2.tgz#b4fdf00f193733c14d499d4ae74fedc9063a6270" - integrity sha512-jwFM59GeMQpzuniw5PlC7kCoXZEaKrw31/ecR1sXKWDtHRyMtvXTuf+R+tSol/1ISQ55c0JBTuUbLPwp7hPvFQ== +"@pixi/mixin-cache-as-bitmap@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-6.4.2.tgz#10f37259ddc65aafb0a492adb17135d040db7874" + integrity sha512-TyMoSDoxd8o1J6/S/8xjJlCO4ThVOC2aJdHMP3hNX8GqjszOWZ2JONwVrPauToCPLyM76JXoDylwINB0bMh3YQ== -"@pixi/math@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/math/-/math-6.2.2.tgz#dfbeeb03de765fa6e1fcfbd2058ed0037d945a86" - integrity sha512-TtsaooRRMc/WAZ4LKUDhP/d14BZElLjRNa2gopwTKUtrDa1KvzAMr8WJ8P+gaXl4DJ8B/MlgESdPhRUqVSUw0A== +"@pixi/mixin-get-child-by-name@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-6.4.2.tgz#1e8ad6736eaeb4f62d8eb6536bc501d069399d70" + integrity sha512-VP8RihmDiah3x/7jHoJe1f9PCWadWOC5m5pHE886e4KafZq6vRJAoD9SMBm2VxcVJMZAvwIXnnTd6M2paC6ijg== -"@pixi/mesh-extras@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/mesh-extras/-/mesh-extras-6.2.2.tgz#127280bcb686896b62a9b26f69681a60ecc9f3c2" - integrity sha512-HFYWhWcV6gY7VYnMhz9OSEN14PPfVqLzWnglbegGEMqCbY/ZGsD8X99x/HLGQGd6L4FFto382q0Fj1xu+y/brg== +"@pixi/mixin-get-global-position@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/mixin-get-global-position/-/mixin-get-global-position-6.4.2.tgz#8f4566210839fe59c1dc36d74879e24d367d596e" + integrity sha512-sb+uzQ1OjXeGZaehuhmYoLtmrpt18gj4OQXa/ACebIEYZNB0fy57k1MMEhQlQvv4cOML0nglf64nzhkdNxk85A== -"@pixi/mesh@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/mesh/-/mesh-6.2.2.tgz#f301bbf888ca36994b8edb30a590fbe4a035dd6f" - integrity sha512-CsKFgTu2MP756sHeoCr9s4tHy2VmnDZPnvZ0ThV8QMnb5w3Z2qRDKlXSSIdNaQOxoAPKkqxIu0JbLK8kyX0oqw== - -"@pixi/mixin-cache-as-bitmap@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-6.2.2.tgz#4c0cdddeba91578f6e58a48df7c27743bcfc8f84" - integrity sha512-t3jZKGa/qoRMetMWmGkXz8Kp1Uzmb+2y4/adqu+RdIeG3D1oItuGux+R36ZQO6dVRv3R8s2/Dex0aACek171zw== - -"@pixi/mixin-get-child-by-name@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-6.2.2.tgz#154d8f0d8324d0cbd84a695babd960a0c35b6c10" - integrity sha512-BBrniLAkzDex4HyvVdE/DjphzQu4pZ8Nc5aDRIbiS1s283/IXr2oTcoaW23kCjhX0xgu++XcJQQMMyv3mlblZQ== - -"@pixi/mixin-get-global-position@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/mixin-get-global-position/-/mixin-get-global-position-6.2.2.tgz#361c4d9889a0b9a724e0cc92fb01d7705b1edb3e" - integrity sha512-Rz7DHn6koYFEeVG36rKiMwoTD+elJKqwQ24HHw0BAKz1VwGagBi0ZTcJ+nWplBOrw6ZPKfdOBwGQLXD7ODg8lQ== - -"@pixi/particle-container@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/particle-container/-/particle-container-6.2.2.tgz#ff6b4c5da58b052b177a8504ab2a3a53851c460c" - integrity sha512-DYbSCcUiVLeM4sKZkzAp3F6dz3idyP1jecxbFqNmRjWRyMv7uXIO42rxGJMrd6BzA5j7DkywI3X0SqhhSZP7Ag== - -"@pixi/polyfill@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/polyfill/-/polyfill-6.2.2.tgz#18c0a2e7273fcd505f78aa08ee4c10010dca3314" - integrity sha512-Fd5KnjrqG9Vwgl9sDfPvNeqW3/d+hG9Du7H3y5PmItBnu9wXldTtA+I5D0BLsL/wjjjCQLbPVFKwCJj511XfBw== +"@pixi/polyfill@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/polyfill/-/polyfill-6.4.2.tgz#c1a0b44ae60bff6749e00df069803546afe86a9b" + integrity sha512-526FVALec5Hf6KVuguRLmLjnAAodpcBeZdQvMVEyMqgxZLch3f6QSwq+SITqR2lr7toqRYEWMyH7ISXdqbcRAg== dependencies: object-assign "^4.1.1" promise-polyfill "^8.2.0" -"@pixi/prepare@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/prepare/-/prepare-6.2.2.tgz#7dd53bc2415d371113806700c103e074615f14a8" - integrity sha512-kJojn/6zEcao+XQyU+zWkBmQr0Tgeju3F9JYBpPQ8MKIUJYvDQDtRxYo9A6Xzxk8FJ373s2Ext/OelX2FcR3HQ== +"@pixi/runner@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/runner/-/runner-6.4.2.tgz#006ab5e49e281717868d46d6b020d26675b1f334" + integrity sha512-mH1//C931Rd+RB/c66t8VMNmLUGBCnefRftgijV5mBFXNgyP8Dnbig1790Qw4IDKPgiiR1mRmGDGAJAr0Xa/3A== -"@pixi/runner@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/runner/-/runner-6.2.2.tgz#ac253ee250198437b7a7182078a90e1e752f8ada" - integrity sha512-q7bc6Eu2XplGzCQBOhbv32P0z48ixW/Su6epT9IOfDi2iTiPjB5Sxp9e+DZDFIzvkfLzgr67Ddy51YMvOp5sQg== - -"@pixi/settings@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/settings/-/settings-6.2.2.tgz#1984a9a233b5e78c3cf564fed5a2cde3012b754c" - integrity sha512-eQv0ykSwnJUd/LF4MuaFoL+eBNG+EUPAVfsnlsez/Y09aqwIzJyAjRx+uGp9adQ3XHXwYt2l2wINn+foF1y/8A== +"@pixi/settings@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/settings/-/settings-6.4.2.tgz#1d912cd0c82d669c03666e4e8bd11b79aaf9fac7" + integrity sha512-wA2PEVoHYaRiQ0/zvq8nqJZkzDT3qLRl8S7yVfL1yhsbCsh6KI0hjCwqy8b8xCAVAMwkInzWx64lvQbfActnAg== dependencies: ismobilejs "^1.1.0" -"@pixi/sprite-animated@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/sprite-animated/-/sprite-animated-6.2.2.tgz#8006a943834fbb5059800e0b57b08c890524a264" - integrity sha512-MNkVIuC06aXn8bgfWyqQE8vmclCVLgmHB//hssr/1IFCVmnEEYZLyeWErkIA87grY3iV7tGOILEYSa3pod4XEg== +"@pixi/sprite-tiling@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/sprite-tiling/-/sprite-tiling-6.4.2.tgz#ed7459224ced02824d2161e31b2dc8f9e5d1c060" + integrity sha512-2kTVlgOMDi8MmvrZJBe4pt96hIcFS89kJrZYG+aEg7DoS1oQJ1X/T68feqz0PfMHgTJtQiDqn2NbR+/S1E/HpQ== -"@pixi/sprite-tiling@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/sprite-tiling/-/sprite-tiling-6.2.2.tgz#2447fd92af3e9ddf2bdaa143018eb4f721fc0714" - integrity sha512-HQ9RVObmwyPq+PM2wm2UEIMdsvWg96ymSz0NOh9bOfMSme18vSWv0Rbidv/FziQT8x6MpoLpYke0DYMGtbu0tA== +"@pixi/sprite@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/sprite/-/sprite-6.4.2.tgz#018f63dace945bf3bcb26d06e8160118bb9db128" + integrity sha512-UW3587gBSdY8iCh/t7+7j1CV9iouAQrLvRNw42gJm5iQm+GaLWpQEI3GSaQX9u47fi1C2nokeGa6uB2Hwz/48Q== -"@pixi/sprite@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/sprite/-/sprite-6.2.2.tgz#a699e95f3da0f290e798a076ff30c4ec0cc6f263" - integrity sha512-Imr+sJWFh5GtarW3FBBUzedSexfijg7OL0A6qwMDHA011gjyVeRZ15uXP8fgIwUoHoMLsU6xk85jcucM9RfWuw== +"@pixi/spritesheet@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/spritesheet/-/spritesheet-6.4.2.tgz#e17118c476ebf2f3371022b5df8f254ed7989208" + integrity sha512-iSKVXcH4oPNZ+XdirqMTdgo3MbbXRsoAeuXsoWum2aP4Zm94cSQ0kRGAMXg5SVhQTWF5w+tQ+JKfE/kGZqd5Vg== -"@pixi/spritesheet@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/spritesheet/-/spritesheet-6.2.2.tgz#84013fff2f7a6b50f1403484d7cb445a4510198c" - integrity sha512-TZodC/pf+CW/8kZN+RPzObXWSPgYv1pp+foUnOHb7w8AyFnMljeqBPiUfLQaMzw91TI9AHLihoeeofqZ4wMpww== +"@pixi/text@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/text/-/text-6.4.2.tgz#340aa90a241deecff499b540b9e1ec34cadff27c" + integrity sha512-jX2LBjgEwKqm5lTUKh3gusSKsSPQpibdcxYMQKxMDNVqvNyGG9UqEO/FogMnGg6c5EHBKyMas26c8oXrf1oagg== -"@pixi/text-bitmap@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/text-bitmap/-/text-bitmap-6.2.2.tgz#26f2838a06edc2e17659d6e02d4244b714e4b61d" - integrity sha512-pJZM0o68n6cUFUdolvpuuloMccdQqvTc3CLzhLu9xW9HLx7NeFjZEQWTGQea8GXsGa1RhvlMd9x3AiVSNMI2FA== - -"@pixi/text@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/text/-/text-6.2.2.tgz#bf4bd0e9fdf9041e3516bbaae2094f6ab8b4ee26" - integrity sha512-Hi6MO/QhllZ4IWkr7MBzImzHB88XXKlF5E9xt1vUBhdZb3KsQD+cPx+bNCFWn6ZMWDmOloJekzRkkSl3KrfBSw== - -"@pixi/ticker@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/ticker/-/ticker-6.2.2.tgz#3170ce5f44c56ac1bdb1a66a1f393d023c9cbb4e" - integrity sha512-tF3cRtcYnj3U3HFQ0IJKvAxFU1YUM96T0p8Qh478xZhvGxYGnjrQDPmjXePb4NocAdG5adb6//2uvQOd7o4rHg== +"@pixi/ticker@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/ticker/-/ticker-6.4.2.tgz#5e84fcd9c76240e9c141f268b780de19b63cf231" + integrity sha512-OM2U0qLiU2Z+qami7DRNkBJnx20ElQO/5mJNsoHQRH6k/po0nXlux8jcCXhh5DE9lds4RdUFAwTL4RmLT1clDw== "@pixi/tilemap@^3.2.2": version "3.2.2" resolved "https://registry.yarnpkg.com/@pixi/tilemap/-/tilemap-3.2.2.tgz#8327e5d7007a90be640a0b1eb9943a1e405b57e4" integrity sha512-svdmMyJP63vdae3t66tCmE8IWeO/6lD1xXU+5gzfxqxJS5seTp2bm8mQok2c8PF0O6l/NYlLz6BRklOuEuHboQ== -"@pixi/utils@6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@pixi/utils/-/utils-6.2.2.tgz#cf292ceb494992e7974982043b214617615ce335" - integrity sha512-rpS6QolFuRmm/QcKm5PYHOCkX6okl9a00u2osaMbmPP+l7XLATTxSsFhw64UbSNR+zmzsrhreRFBVFn3tf8K6w== +"@pixi/utils@~6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@pixi/utils/-/utils-6.4.2.tgz#77c5bac2ba26094ac0308327a5b6685d3287f649" + integrity sha512-FORUzSikNUNceS6sf2NlRcGukmJrnWCQToA6Nqk+tQ7Lvb42vDTVI66ya44O6HYM2J0nL684YeYesWbAZ+UeKg== dependencies: "@types/earcut" "^2.1.0" earcut "^2.2.2" @@ -1687,38 +1745,37 @@ schema-utils "^2.6.5" source-map "^0.7.3" -"@popperjs/core@^2.10.1": - version "2.11.4" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.4.tgz#d8c7b8db9226d2d7664553a0741ad7d0397ee503" - integrity sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg== +"@popperjs/core@^2.11.5": + version "2.11.5" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" + integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw== -"@react-aria/ssr@^3.0.1": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.1.2.tgz#665a6fd56385068c7417922af2d0d71b0618e52d" - integrity sha512-amXY11ImpokvkTMeKRHjsSsG7v1yzzs6yeqArCyBIk60J3Yhgxwx9Cah+Uu/804ATFwqzN22AXIo7SdtIaMP+g== +"@react-aria/ssr@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.2.0.tgz#88460384b43204f91c972d5b0de24ee44d6a2984" + integrity sha512-wwJFdkl+Q8NU5yJ4NvdAOqx5LM3QtUVoSjuK7Ey8jZ4WS4bB0EqT3Kr3IInBs257HzZ5nXCiKXKE4NGXXuIRWA== dependencies: "@babel/runtime" "^7.6.2" -"@restart/hooks@^0.4.0", "@restart/hooks@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.5.tgz#e7acbea237bfc9e479970500cf87538b41a1ed02" - integrity sha512-tLGtY0aHeIfT7aPwUkvQuhIy3+q3w4iqmUzFLPlOAf/vNUacLaBt1j/S//jv/dQhenRh8jvswyMojCwmLvJw8A== +"@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7": + version "0.4.7" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.7.tgz#d79ca6472c01ce04389fc73d4a79af1b5e33cd39" + integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A== dependencies: dequal "^2.0.2" -"@restart/ui@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.0.2.tgz#009a06ae698d624672c5e6a776efd0e8a6017842" - integrity sha512-vKGe0UBJLnbvNAjr8ljlDvphf2HkpjBjXsblmgKPvKdZBDn/mtAz89wmznaomIaEJ9VNoSEY0vA5T5MDi2jIcQ== +"@restart/ui@^1.2.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.3.1.tgz#ae16be26128cc205efb7e0bf93d1f34deb1fe116" + integrity sha512-MYvMs2eeZTHu2dBJHOXKx72vxzEZeWbZx2z1QjeXq62iYjpjIyukBC2ZEy8x+sb9Gl0AiOiHkPXrl1wn95aOGQ== dependencies: - "@babel/runtime" "^7.13.16" - "@popperjs/core" "^2.10.1" - "@react-aria/ssr" "^3.0.1" - "@restart/hooks" "^0.4.0" + "@babel/runtime" "^7.18.3" + "@popperjs/core" "^2.11.5" + "@react-aria/ssr" "^3.2.0" + "@restart/hooks" "^0.4.7" "@types/warning" "^3.0.0" dequal "^2.0.2" dom-helpers "^5.2.0" - prop-types "^15.7.2" uncontrollable "^7.2.1" warning "^4.0.3" @@ -1881,29 +1938,29 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@tsconfig/node10@^1.0.7": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" - integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" - integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" - integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" - integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.18" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" - integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== + version "7.1.19" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1927,9 +1984,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + version "7.17.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" + integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== dependencies: "@babel/types" "^7.3.0" @@ -1938,7 +1995,7 @@ resolved "https://registry.yarnpkg.com/@types/earcut/-/earcut-2.1.1.tgz#573a0af609f17005c751f6f4ffec49cfe358ea51" integrity sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ== -"@types/eslint@^7.28.2": +"@types/eslint@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng== @@ -1947,9 +2004,9 @@ "@types/json-schema" "*" "@types/estree@*": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== "@types/estree@0.0.39": version "0.0.39" @@ -1976,11 +2033,6 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== -"@types/invariant@^2.2.35": - version "2.2.35" - resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be" - integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg== - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -2000,65 +2052,60 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/minimatch@*": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== -"@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - -"@types/node@*": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" - integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== - -"@types/node@^12.20.19": - version "12.20.47" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.47.tgz#ca9237d51f2a2557419688511dab1c8daf475188" - integrity sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg== +"@types/node@*", "@types/node@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.6.1.tgz#828e4785ccca13f44e2fb6852ae0ef11e3e20ba5" + integrity sha512-z+2vB6yDt1fNwKOeGbckpmirO+VBDuQqecXkgeIqDlaOtmKn6hPR/viQ8cxCfqLU4fTlvM3+YjM367TukWdxpg== "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/offscreencanvas@^2019.6.4": + version "2019.7.0" + resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz#e4a932069db47bb3eabeb0b305502d01586fa90d" + integrity sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.0.0": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" - integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== + version "2.6.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" + integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== -"@types/prop-types@*", "@types/prop-types@^15.7.4": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/q@^1.5.1": version "1.5.5" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== -"@types/react-dom@^17.0.9": - version "17.0.13" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.13.tgz#a3323b974ee4280070982b3112351bb1952a7809" - integrity sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ== +"@types/react-dom@^18.0.6": + version "18.0.6" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.6.tgz#36652900024842b74607a17786b6662dd1e103a1" + integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== dependencies: "@types/react" "*" @@ -2069,25 +2116,25 @@ dependencies: "@types/react" "*" -"@types/react-transition-group@^4.4.2", "@types/react-transition-group@^4.4.4": - version "4.4.4" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" - integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== +"@types/react-transition-group@^4.4.4", "@types/react-transition-group@^4.4.5": + version "4.4.5" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" + integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== dependencies: "@types/react" "*" -"@types/react-virtualized@^9.21.13": - version "9.21.20" - resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.21.20.tgz#756c78b5512a2a1804fdaf749a5f5cff3d805e5b" - integrity sha512-i8nZf1LpuX5rG4DZLaPGayIQwjxsZwmst5VdNhEznDTENel9p3A735AdRRp2iueFOyOuWBmaEaDxg8AD3GHilA== +"@types/react-virtualized@^9.21.21": + version "9.21.21" + resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.21.21.tgz#65c96f25314f0fb3d40536929dc78112753b49e1" + integrity sha512-Exx6I7p4Qn+BBA1SRyj/UwQlZ0I0Pq7g7uhAp0QQ4JWzZunqEqNBGTmCmMmS/3N9wFgAGWuBD16ap7k8Y14VPA== dependencies: "@types/prop-types" "*" - "@types/react" "*" + "@types/react" "^17" -"@types/react@*", "@types/react@>=16.14.8", "@types/react@>=16.9.11", "@types/react@^17.0.15": - version "17.0.40" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.40.tgz#dc010cee6254d5239a138083f3799a16638e6bad" - integrity sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ== +"@types/react@*", "@types/react@>=16.9.11", "@types/react@^17", "@types/react@^18.0.15": + version "18.0.15" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.15.tgz#d355644c26832dc27f3e6cbf0c4f4603fc4ab7fe" + integrity sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2121,16 +2168,16 @@ integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== "@types/uglify-js@*": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" - integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== + version "3.16.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.16.0.tgz#2cf74a0e6ebb6cd54c0d48e509d5bd91160a9602" + integrity sha512-0yeUr92L3r0GLRnBOvtYK1v2SjqMIqQDHMl7GLb+l2L8+6LSFWEEWEIgVsPdMn5ImLM8qzWT8xFPtQYpp8co0g== dependencies: source-map "^0.6.1" "@types/warning@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" - integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI= + integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA== "@types/webpack-sources@*": version "3.2.0" @@ -2165,7 +2212,7 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.29.1", "@typescript-eslint/eslint-plugin@^4.5.0": +"@typescript-eslint/eslint-plugin@^4.5.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== @@ -2179,6 +2226,21 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/eslint-plugin@^5.30.7": + version "5.30.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.7.tgz#1621dabc1ae4084310e19e9efc80dfdbb97e7493" + integrity sha512-l4L6Do+tfeM2OK0GJsU7TUcM/1oN/N25xHm3Jb4z3OiDU4Lj8dIuxX9LpVMS9riSXQs42D1ieX7b85/r16H9Fw== + dependencies: + "@typescript-eslint/scope-manager" "5.30.7" + "@typescript-eslint/type-utils" "5.30.7" + "@typescript-eslint/utils" "5.30.7" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + "@typescript-eslint/experimental-utils@4.33.0", "@typescript-eslint/experimental-utils@^4.0.1": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" @@ -2212,6 +2274,16 @@ "@typescript-eslint/typescript-estree" "4.33.0" debug "^4.3.1" +"@typescript-eslint/parser@^5.30.7": + version "5.30.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.7.tgz#99d09729392aec9e64b1de45cd63cb81a4ddd980" + integrity sha512-Rg5xwznHWWSy7v2o0cdho6n+xLhK2gntImp0rJroVVFkcYFYQ8C8UJTSuTw/3CnExBmPjycjmUJkxVmjXsld6A== + dependencies: + "@typescript-eslint/scope-manager" "5.30.7" + "@typescript-eslint/types" "5.30.7" + "@typescript-eslint/typescript-estree" "5.30.7" + debug "^4.3.4" + "@typescript-eslint/scope-manager@4.33.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" @@ -2220,6 +2292,23 @@ "@typescript-eslint/types" "4.33.0" "@typescript-eslint/visitor-keys" "4.33.0" +"@typescript-eslint/scope-manager@5.30.7": + version "5.30.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz#8269a931ef1e5ae68b5eb80743cc515c4ffe3dd7" + integrity sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw== + dependencies: + "@typescript-eslint/types" "5.30.7" + "@typescript-eslint/visitor-keys" "5.30.7" + +"@typescript-eslint/type-utils@5.30.7": + version "5.30.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.30.7.tgz#5693dc3db6f313f302764282d614cfdbc8a9fcfd" + integrity sha512-nD5qAE2aJX/YLyKMvOU5jvJyku4QN5XBVsoTynFrjQZaDgDV6i7QHFiYCx10wvn7hFvfuqIRNBtsgaLe0DbWhw== + dependencies: + "@typescript-eslint/utils" "5.30.7" + debug "^4.3.4" + tsutils "^3.21.0" + "@typescript-eslint/types@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" @@ -2230,6 +2319,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== +"@typescript-eslint/types@5.30.7": + version "5.30.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.7.tgz#18331487cc92d0f1fb1a6f580c8ec832528079d0" + integrity sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg== + "@typescript-eslint/typescript-estree@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" @@ -2257,6 +2351,31 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.30.7": + version "5.30.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz#05da9f1b281985bfedcf62349847f8d168eecc07" + integrity sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA== + dependencies: + "@typescript-eslint/types" "5.30.7" + "@typescript-eslint/visitor-keys" "5.30.7" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.30.7": + version "5.30.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.7.tgz#7135be070349e9f7caa262b0ca59dc96123351bb" + integrity sha512-Z3pHdbFw+ftZiGUnm1GZhkJgVqsDL5CYW2yj+TB2mfXDFOMqtbzQi2dNJIyPqPbx9mv2kUxS1gU+r2gKlKi1rQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.30.7" + "@typescript-eslint/types" "5.30.7" + "@typescript-eslint/typescript-estree" "5.30.7" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + "@typescript-eslint/visitor-keys@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" @@ -2272,6 +2391,14 @@ "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" +"@typescript-eslint/visitor-keys@5.30.7": + version "5.30.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz#c093abae75b4fd822bfbad9fc337f38a7a14909a" + integrity sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw== + dependencies: + "@typescript-eslint/types" "5.30.7" + eslint-visitor-keys "^3.3.0" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -2428,14 +2555,9 @@ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" @@ -2453,7 +2575,7 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.3.1: +acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -2478,16 +2600,21 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== +acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== -address@1.1.2, address@^1.0.1: +address@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== +address@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" + integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== + adjust-sourcemap-loader@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" @@ -2521,7 +2648,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2532,9 +2659,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.1: - version "8.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d" - integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw== + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2544,12 +2671,7 @@ ajv@^8.0.1: alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + integrity sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ== animate.css@^4.1.1: version "4.1.1" @@ -2562,9 +2684,9 @@ ansi-colors@^3.0.0: integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: version "4.3.2" @@ -2576,12 +2698,12 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: ansi-html@0.0.7, ansi-html@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + integrity sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA== ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^4.1.0: version "4.1.1" @@ -2593,11 +2715,6 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2628,19 +2745,11 @@ anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3, aproba@^1.1.1: +aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -2653,6 +2762,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + aria-query@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" @@ -2664,12 +2778,12 @@ aria-query@^4.2.2: arity-n@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" - integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + integrity sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ== arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== arr-flatten@^1.1.0: version "1.1.0" @@ -2679,33 +2793,33 @@ arr-flatten@^1.1.0: arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-flatten@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.3, array-includes@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" - integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== +array-includes@^3.1.4, array-includes@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.19.5" get-intrinsic "^1.1.1" is-string "^1.0.7" array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== dependencies: array-uniq "^1.0.1" @@ -2717,35 +2831,43 @@ array-union@^2.1.0: array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== array.prototype.flat@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" - integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.19.0" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" - integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== +array.prototype.flatmap@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.19.0" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +array.prototype.reduce@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" + integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" arrify@^2.0.1: version "2.0.1" @@ -2755,7 +2877,7 @@ arrify@^2.0.1: asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== asn1.js@^5.2.0: version "5.4.1" @@ -2767,18 +2889,6 @@ asn1.js@^5.2.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - assert@^1.1.1: version "1.5.0" resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" @@ -2790,12 +2900,12 @@ assert@^1.1.1: assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== astral-regex@^2.0.0: version "2.0.0" @@ -2807,27 +2917,22 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= - async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" @@ -2852,20 +2957,10 @@ autoprefixer@^9.6.1: postcss "^7.0.32" postcss-value-parser "^4.1.0" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -axe-core@^4.3.5: - version "4.4.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.1.tgz#7dbdc25989298f9ad006645cd396782443757413" - integrity sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw== +axe-core@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" + integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== axobject-query@^2.2.0: version "2.2.0" @@ -2958,24 +3053,24 @@ babel-plugin-named-asset-import@^0.3.7: resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== +babel-plugin-polyfill-corejs2@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d" + integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q== dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.2" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" - integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== +babel-plugin-polyfill-corejs3@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" + integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/helper-define-polyfill-provider" "^0.3.2" core-js-compat "^3.21.0" -babel-plugin-polyfill-regenerator@^0.3.0: +babel-plugin-polyfill-regenerator@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== @@ -2985,12 +3080,12 @@ babel-plugin-polyfill-regenerator@^0.3.0: babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + integrity sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w== babel-plugin-transform-object-rest-spread@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + integrity sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA== dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" babel-runtime "^6.26.0" @@ -3051,7 +3146,7 @@ babel-preset-react-app@^10.0.0: babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -3087,14 +3182,7 @@ base@^0.11.1: batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== bfj@^7.0.2: version "7.0.2" @@ -3139,30 +3227,32 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== dependencies: bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" type-is "~1.6.18" + unpipe "1.0.0" bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg== dependencies: array-flatten "^2.1.0" deep-equal "^1.0.1" @@ -3174,7 +3264,7 @@ bonjour@^3.5.0: boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== brace-expansion@^1.1.7: version "1.1.11" @@ -3200,7 +3290,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -3210,7 +3300,7 @@ braces@^3.0.1, braces@~3.0.2: brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-process-hrtime@^1.0.0: version "1.0.0" @@ -3288,16 +3378,15 @@ browserslist@4.14.2: escalade "^3.0.2" node-releases "^1.1.61" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.5, browserslist@^4.19.1, browserslist@^4.6.2, browserslist@^4.6.4: - version "4.20.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" - integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.20.2, browserslist@^4.21.2, browserslist@^4.6.2, browserslist@^4.6.4: + version "4.21.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.2.tgz#59a400757465535954946a400b841ed37e2b4ecf" + integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA== dependencies: - caniuse-lite "^1.0.30001317" - electron-to-chromium "^1.4.84" - escalade "^3.1.1" - node-releases "^2.0.2" - picocolors "^1.0.0" + caniuse-lite "^1.0.30001366" + electron-to-chromium "^1.4.188" + node-releases "^2.0.6" + update-browserslist-db "^1.0.4" bser@2.1.1: version "2.1.1" @@ -3319,7 +3408,7 @@ buffer-indexof@^1.0.0: buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== buffer@^4.3.0: version "4.9.2" @@ -3331,19 +3420,19 @@ buffer@^4.3.0: isarray "^1.0.0" builtin-modules@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" - integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== bytes@3.1.2: version "3.1.2" @@ -3421,21 +3510,21 @@ call-bind@^1.0.0, call-bind@^1.0.2: caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== dependencies: callsites "^2.0.0" caller-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== dependencies: caller-callsite "^2.0.0" callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== callsites@^3.0.0: version "3.1.0" @@ -3450,15 +3539,6 @@ camel-case@^4.1.1: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -3479,10 +3559,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001317: - version "1.0.30001317" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz#0548fb28fd5bc259a70b8c1ffdbe598037666a1b" - integrity sha512-xIZLh8gBm4dqNX0gkzrBeyI86J2eCjWzYAs40q88smG844YIrN4tVQl/RhquHvKEKImWWFIVh1Lxe5n1G/N+GQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001366: + version "1.0.30001370" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz#0a30d4f20d38b9e108cc5ae7cc62df9fe66cd5ba" + integrity sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g== capture-exit@^2.0.0: version "2.0.0" @@ -3496,11 +3576,6 @@ case-sensitive-paths-webpack-plugin@2.3.0: resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3510,17 +3585,6 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -3534,16 +3598,26 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -charcodes@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/charcodes/-/charcodes-0.2.0.tgz#5208d327e6cc05f99eb80ffc814707572d1f14e4" - integrity sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ== - check-types@^11.1.1: version "11.1.2" resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -3563,21 +3637,6 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.4.1: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -3657,14 +3716,14 @@ cliui@^6.0.0: wrap-ansi "^6.2.0" clsx@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== coa@^2.0.2: version "2.0.2" @@ -3675,11 +3734,6 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" @@ -3688,7 +3742,7 @@ collect-v8-coverage@^1.0.0: collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -3710,7 +3764,7 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" @@ -3718,9 +3772,9 @@ color-name@^1.0.0, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" - integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -3733,7 +3787,7 @@ color@^3.0.0: color-convert "^1.9.3" color-string "^1.6.0" -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -3758,7 +3812,7 @@ common-tags@^1.8.0: commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== component-emitter@^1.2.1: version "1.3.0" @@ -3768,7 +3822,7 @@ component-emitter@^1.2.1: compose-function@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" - integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + integrity sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg== dependencies: arity-n "^1.0.4" @@ -3795,7 +3849,7 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.5.0: version "1.6.2" @@ -3822,15 +3876,10 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== content-disposition@0.5.4: version "0.5.4" @@ -3854,7 +3903,7 @@ convert-source-map@1.7.0: convert-source-map@^0.3.3: version "0.3.5" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" - integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + integrity sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg== convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" @@ -3866,12 +3915,12 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== copy-concurrently@^1.0.0: version "1.0.5" @@ -3888,20 +3937,20 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== -core-js-compat@^3.20.2, core-js-compat@^3.21.0: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" - integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== +core-js-compat@^3.21.0, core-js-compat@^3.22.1: + version "3.23.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.5.tgz#11edce2f1c4f69a96d30ce77c805ce118909cd5b" + integrity sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg== dependencies: - browserslist "^4.19.1" + browserslist "^4.21.2" semver "7.0.0" core-js-pure@^3.20.2: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" - integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== + version "3.23.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.23.5.tgz#23daaa9af9230e50f10b0fa4b8e6b87402be4c33" + integrity sha512-8t78LdpKSuCq4pJYCYk8hl7XEkAX+BP16yRIwL3AanTksxuEf7CM83vRyctmiEL8NDZ3jpUcv56fk9/zG3aIuw== core-js@^2.4.0: version "2.6.12" @@ -3909,14 +3958,9 @@ core-js@^2.4.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.6.5: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" - integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + version "3.23.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.23.5.tgz#1f82b0de5eece800827a2f59d597509c67650475" + integrity sha512-7Vh11tujtAZy82da4duVreQysIoO2EvVrur7y6IzZkH1IHPSekuDi8Vuw1+YKjkbfWLRD7Nc9ICQ/sIUDutcyg== core-util-is@~1.0.0: version "1.0.3" @@ -3924,12 +3968,12 @@ core-util-is@~1.0.0: integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig-typescript-loader@^1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.6.tgz#6d879cece8063b15ec8a3258f55a8e94893c7cca" - integrity sha512-2nEotziYJWtNtoTjKbchj9QrdTT6DBxCvqjNKoDKARw+e2yZmTQCa07uRrykLIZuvSgp69YXLH89UHc0WhdMfQ== + version "1.0.9" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz#69c523f7e8c3d9f27f563d02bbeadaf2f27212d3" + integrity sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g== dependencies: cosmiconfig "^7" - ts-node "^10.6.0" + ts-node "^10.7.0" cosmiconfig@^5.0.0: version "5.2.1" @@ -3995,7 +4039,7 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" -cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4035,7 +4079,7 @@ crypto-browserify@^3.11.0: crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + integrity sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg== css-blank-pseudo@^0.1.4: version "0.1.4" @@ -4047,7 +4091,7 @@ css-blank-pseudo@^0.1.4: css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q== css-declaration-sorter@^4.0.1: version "4.0.1" @@ -4106,13 +4150,13 @@ css-select@^2.0.0: nth-check "^1.0.2" css-select@^4.1.3: - version "4.2.1" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" - integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" - css-what "^5.1.0" - domhandler "^4.3.0" + css-what "^6.0.1" + domhandler "^4.3.1" domutils "^2.8.0" nth-check "^2.0.1" @@ -4137,10 +4181,10 @@ css-what@^3.2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== -css-what@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" - integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== css@^2.0.0: version "2.2.4" @@ -4206,12 +4250,12 @@ cssnano-preset-default@^4.0.8: cssnano-util-get-arguments@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + integrity sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw== cssnano-util-get-match@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + integrity sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw== cssnano-util-raw-cache@^4.0.1: version "4.0.1" @@ -4260,14 +4304,14 @@ cssstyle@^2.3.0: cssom "~0.3.6" csstype@^3.0.2: - version "3.0.11" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" - integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" + integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== d@1, d@^1.0.1: version "1.0.1" @@ -4277,18 +4321,11 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" -damerau-levenshtein@^1.0.7: +damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -4305,10 +4342,10 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6. dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" @@ -4319,18 +4356,10 @@ debug@^3.1.1, debug@^3.2.7: dependencies: ms "^2.1.1" -decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: +decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.2.1: version "10.3.1" @@ -4340,12 +4369,12 @@ decimal.js@^10.2.1: decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deep-equal@^1.0.1: version "1.1.1" @@ -4377,24 +4406,25 @@ default-gateway@^4.2.0: execa "^1.0.0" ip-regex "^2.1.0" -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - object-keys "^1.0.12" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== dependencies: is-descriptor "^1.0.0" @@ -4422,22 +4452,22 @@ del@^4.1.1: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== dequal@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" - integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== des.js@^1.0.0: version "1.0.1" @@ -4447,10 +4477,10 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-newline@^3.0.0: version "3.1.0" @@ -4499,7 +4529,7 @@ dir-glob@^3.0.1: dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^1.3.1: version "1.3.4" @@ -4512,7 +4542,7 @@ dns-packet@^1.3.1: dns-txt@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ== dependencies: buffer-indexof "^1.0.0" @@ -4554,9 +4584,9 @@ dom-serializer@0: entities "^2.0.0" dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" domhandler "^4.2.0" @@ -4573,9 +4603,9 @@ domelementtype@1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domexception@^2.0.1: version "2.0.1" @@ -4584,10 +4614,10 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" - integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" @@ -4649,32 +4679,24 @@ duplexify@^3.4.2, duplexify@^3.6.0: stream-shift "^1.0.0" earcut@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.3.tgz#d44ced2ff5a18859568e327dd9c7d46b16f55cf4" - integrity sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug== - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" + version "2.2.4" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" + integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== ejs@^2.6.1: version "2.7.4" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.84: - version "1.4.85" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.85.tgz#a3666ba42147026b9f34d4d8d4caf0740e80f751" - integrity sha512-K9AsQ41WS2bjZUFpRWfvaS4RjEcRCamEkBJN1Z1TQILBfP1H8QnJ9ti0wiLiMv0sRjX3EHKzgs9jDnmGFx2jXg== +electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.188: + version "1.4.199" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.199.tgz#e0384fde79fdda89880e8be58196a9153e04db3b" + integrity sha512-WIGME0Cs7oob3mxsJwHbeWkH0tYkIE/sjkJ8ML2BYmuRcjhRl/q5kVDXG7W9LOOKwzPU5M0LBlXRq9rlSgnNlg== elliptic@^6.5.3: version "6.5.4" @@ -4717,7 +4739,7 @@ emoji-toolkit@^6.6.0: emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== emojis-list@^3.0.0: version "3.0.0" @@ -4727,7 +4749,7 @@ emojis-list@^3.0.0: encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" @@ -4757,11 +4779,6 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - errno@^0.1.3, errno@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -4777,37 +4794,52 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" error-stack-parser@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.7.tgz#b0c6e2ce27d0495cf78ad98715e0cad1219abb57" - integrity sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA== + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== dependencies: - stackframe "^1.1.1" + stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + function.prototype.name "^1.1.5" get-intrinsic "^1.1.1" get-symbol-description "^1.0.0" has "^1.0.3" - has-symbols "^1.0.2" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" internal-slot "^1.0.3" is-callable "^1.2.4" - is-negative-zero "^2.0.1" + is-negative-zero "^2.0.2" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" + is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" + is-weakref "^1.0.2" + object-inspect "^1.12.0" object-keys "^1.1.1" object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" @@ -4819,9 +4851,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.58" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.58.tgz#5b97d94236285fb87c8ffc782cf42eb0a25d2ae0" - integrity sha512-LHO+KBBaHGwjy32ibSaMY+ZzjpC4K4I5bPoijICMBL7gXEXfrEUrzssmNP+KigbQEp1dRUnGkry/vUnxOqptLQ== + version "0.10.61" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.61.tgz#311de37949ef86b6b0dcea894d1ffedb909d3269" + integrity sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" @@ -4830,7 +4862,7 @@ es5-ext@^0.10.35, es5-ext@^0.10.50: es6-iterator@2.0.3, es6-iterator@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== dependencies: d "1" es5-ext "^0.10.35" @@ -4852,17 +4884,17 @@ escalade@^3.0.2, escalade@^3.1.1: escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" @@ -4896,7 +4928,7 @@ eslint-import-resolver-node@^0.3.6: debug "^3.2.7" resolve "^1.20.0" -eslint-module-utils@^2.7.2: +eslint-module-utils@^2.7.3: version "2.7.3" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== @@ -4912,24 +4944,24 @@ eslint-plugin-flowtype@^5.2.0: lodash "^4.17.15" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.22.1: - version "2.25.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1" - integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA== +eslint-plugin-import@^2.22.1, eslint-plugin-import@^2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== dependencies: array-includes "^3.1.4" array.prototype.flat "^1.2.5" debug "^2.6.9" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.2" + eslint-module-utils "^2.7.3" has "^1.0.3" - is-core-module "^2.8.0" + is-core-module "^2.8.1" is-glob "^4.0.3" - minimatch "^3.0.4" + minimatch "^3.1.2" object.values "^1.1.5" - resolve "^1.20.0" - tsconfig-paths "^3.12.0" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" eslint-plugin-jest@^24.1.0: version "24.7.0" @@ -4938,48 +4970,49 @@ eslint-plugin-jest@^24.1.0: dependencies: "@typescript-eslint/experimental-utils" "^4.0.1" -eslint-plugin-jsx-a11y@^6.3.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" - integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== +eslint-plugin-jsx-a11y@^6.3.1, eslint-plugin-jsx-a11y@^6.6.0: + version "6.6.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" + integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== dependencies: - "@babel/runtime" "^7.16.3" + "@babel/runtime" "^7.18.9" aria-query "^4.2.2" - array-includes "^3.1.4" + array-includes "^3.1.5" ast-types-flow "^0.0.7" - axe-core "^4.3.5" + axe-core "^4.4.3" axobject-query "^2.2.0" - damerau-levenshtein "^1.0.7" + damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" has "^1.0.3" - jsx-ast-utils "^3.2.1" + jsx-ast-utils "^3.3.2" language-tags "^1.0.5" - minimatch "^3.0.4" + minimatch "^3.1.2" + semver "^6.3.0" -eslint-plugin-react-hooks@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" - integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== +eslint-plugin-react-hooks@^4.2.0, eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== -eslint-plugin-react@^7.21.5: - version "7.29.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz#4717de5227f55f3801a5fd51a16a4fa22b5914d2" - integrity sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ== +eslint-plugin-react@^7.21.5, eslint-plugin-react@^7.30.1: + version "7.30.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz#2be4ab23ce09b5949c6631413ba64b2810fd3e22" + integrity sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg== dependencies: - array-includes "^3.1.4" - array.prototype.flatmap "^1.2.5" + array-includes "^3.1.5" + array.prototype.flatmap "^1.3.0" doctrine "^2.1.0" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" object.entries "^1.1.5" object.fromentries "^2.0.5" - object.hasown "^1.1.0" + object.hasown "^1.1.1" object.values "^1.1.5" prop-types "^15.8.1" resolve "^2.0.0-next.3" semver "^6.3.0" - string.prototype.matchall "^4.0.6" + string.prototype.matchall "^4.0.7" eslint-plugin-testing-library@^3.9.2: version "3.10.2" @@ -5004,6 +5037,14 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -5028,15 +5069,20 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + eslint-webpack-plugin@^2.5.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.6.0.tgz#3bd4ada4e539cb1f6687d2f619073dbb509361cd" - integrity sha512-V+LPY/T3kur5QO3u+1s34VDTcRxjXWPUGM4hlmTb5DwVD0OQz631yGTxJZf4SpAqAjdbBVe978S8BJeHpAdOhQ== + version "2.7.0" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.7.0.tgz#0525793a4f8c652c1c6d863995ce1e0f2dcbd143" + integrity sha512-bNaVVUvU4srexGhVcayn/F4pJAz19CWBkKoMx7aSQ4wtTbZQCnG5O9LHCE42mM+JSKOUp7n6vd5CIwzj7lOVGA== dependencies: - "@types/eslint" "^7.28.2" + "@types/eslint" "^7.29.0" arrify "^2.0.1" - jest-worker "^27.3.1" - micromatch "^4.0.4" + jest-worker "^27.5.1" + micromatch "^4.0.5" normalize-path "^3.0.0" schema-utils "^3.1.1" @@ -5086,6 +5132,47 @@ eslint@^7.11.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +eslint@^8.20.0: + version "8.20.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.20.0.tgz#048ac56aa18529967da8354a478be4ec0a2bc81b" + integrity sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA== + dependencies: + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.2" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + espree@^7.3.0, espree@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" @@ -5095,6 +5182,15 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== + dependencies: + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -5142,7 +5238,7 @@ esutils@^2.0.2: etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eventemitter3@^3.1.0: version "3.1.2" @@ -5159,12 +5255,10 @@ events@^3.0.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -eventsource@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" - integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== - dependencies: - original "^1.0.0" +eventsource@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" + integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -5210,12 +5304,12 @@ execa@^4.0.0: exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -5238,37 +5332,38 @@ expect@^26.6.0, expect@^26.6.2: jest-regex-util "^26.0.0" express@^4.17.1: - version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" - integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.2" + body-parser "1.20.0" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.2" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.7" + qs "6.10.3" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" - statuses "~1.5.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -5283,23 +5378,18 @@ ext@^1.1.2: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -5314,16 +5404,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - fast-deep-equal@3.1.3, fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -5348,7 +5428,7 @@ fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.13.0" @@ -5404,7 +5484,7 @@ filesize@6.1.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -5418,17 +5498,17 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-cache-dir@^2.1.0: @@ -5460,7 +5540,7 @@ find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" @@ -5480,9 +5560,9 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" + integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== flatten@^1.0.2: version "1.0.3" @@ -5498,19 +5578,14 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== fork-ts-checker-webpack-plugin@4.1.6: version "4.1.6" @@ -5534,15 +5609,6 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -5551,19 +5617,19 @@ forwarded@0.2.0: fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== dependencies: inherits "^2.0.1" readable-stream "^2.0.0" @@ -5606,7 +5672,7 @@ fs-minipass@^2.0.0: fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== dependencies: graceful-fs "^4.1.2" iferr "^0.1.5" @@ -5616,7 +5682,7 @@ fs-write-stream-atomic@^1.0.8: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^1.2.7: version "1.2.13" @@ -5636,31 +5702,25 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -5673,13 +5733,13 @@ get-caller-file@^2.0.1: integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" + has-symbols "^1.0.3" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" @@ -5691,11 +5751,6 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -5721,19 +5776,19 @@ get-symbol-description@^1.0.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= +gifuct-js@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/gifuct-js/-/gifuct-js-2.1.2.tgz#06152437ba30ec914db8398bd838bd0fbc8a6ecd" + integrity sha512-rI2asw77u0mGgwhV3qA+OEgYqaDn5UNqgs+Bx0FGwSpuqfYn+Ir6RQY5ENNQ8SbIiG/m5gVa7CD5RriO4f4Lsg== dependencies: - assert-plus "^1.0.0" + js-binary-schema-parser "^2.0.3" glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" @@ -5745,27 +5800,22 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" + is-glob "^4.0.3" -glob@~7.1.1: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" @@ -5790,10 +5840,10 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.6.0, globals@^13.9.0: - version "13.13.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b" - integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== +globals@^13.15.0, globals@^13.6.0, globals@^13.9.0: + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: type-fest "^0.20.2" @@ -5809,7 +5859,7 @@ globby@11.0.1: merge2 "^1.3.0" slash "^3.0.0" -globby@^11.0.3: +globby@^11.0.3, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -5824,7 +5874,7 @@ globby@^11.0.3: globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -5832,24 +5882,15 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globule@^1.0.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.3.tgz#811919eeac1ab7344e905f2e3be80a13447973c2" - integrity sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg== - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== gzip-size@5.1.1: version "5.1.1" @@ -5864,52 +5905,34 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - harmony-reflect@^1.4.6: version "1.6.2" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.1, has-symbols@^1.0.2: +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -5921,15 +5944,10 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -5938,7 +5956,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -5947,12 +5965,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -5994,7 +6012,7 @@ hex-color-regex@^1.1.0: hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -6010,17 +6028,10 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" obuf "^1.0.0" @@ -6030,12 +6041,12 @@ hpack.js@^2.1.6: hsl-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + integrity sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A== hsla-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + integrity sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA== html-encoding-sniffer@^2.0.1: version "2.0.1" @@ -6095,23 +6106,23 @@ htmlparser2@^6.1.0: http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" + depd "2.0.0" inherits "2.0.4" setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" + statuses "2.0.1" toidentifier "1.0.1" http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== dependencies: depd "~1.1.2" inherits "2.0.3" @@ -6119,9 +6130,9 @@ http-errors@~1.6.2: statuses ">= 1.4.0 < 2" http-parser-js@>=0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.6.tgz#2e02406ab2df8af8a7abfba62e0da01c62b95afd" - integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-agent@^4.0.1: version "4.0.1" @@ -6151,24 +6162,15 @@ http-proxy@^1.17.0: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" debug "4" @@ -6195,7 +6197,7 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: identity-obj-proxy@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" - integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== dependencies: harmony-reflect "^1.4.6" @@ -6207,7 +6209,7 @@ ieee754@^1.1.4: iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== ignore@^4.0.6: version "4.0.6" @@ -6224,17 +6226,22 @@ immer@8.0.1: resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== +immutable@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + integrity sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg== dependencies: import-from "^2.1.0" import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== dependencies: caller-path "^2.0.0" resolve-from "^3.0.0" @@ -6250,7 +6257,7 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + integrity sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w== dependencies: resolve-from "^3.0.0" @@ -6273,7 +6280,7 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" @@ -6283,7 +6290,7 @@ indent-string@^4.0.0: indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA== infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" @@ -6293,7 +6300,7 @@ infer-owner@^1.0.3, infer-owner@^1.0.4: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -6306,12 +6313,12 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== ini@^1.3.5: version "1.3.8" @@ -6345,12 +6352,12 @@ invariant@^2.2.4: ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + version "1.1.8" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== ipaddr.js@1.9.1, ipaddr.js@^1.9.0: version "1.9.1" @@ -6360,7 +6367,7 @@ ipaddr.js@1.9.1, ipaddr.js@^1.9.0: is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + integrity sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg== is-absolute-url@^3.0.3: version "3.0.3" @@ -6370,7 +6377,7 @@ is-absolute-url@^3.0.3: is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== dependencies: kind-of "^3.0.2" @@ -6392,7 +6399,7 @@ is-arguments@^1.0.4: is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-arrayish@^0.3.1: version "0.3.2" @@ -6409,7 +6416,7 @@ is-bigint@^1.0.1: is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== dependencies: binary-extensions "^1.0.0" @@ -6448,7 +6455,7 @@ is-ci@^2.0.0: is-color-stop@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + integrity sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA== dependencies: css-color-names "^0.0.4" hex-color-regex "^1.1.0" @@ -6457,17 +6464,17 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.0.0, is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.0, is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== +is-core-module@^2.0.0, is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: has "^1.0.3" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== dependencies: kind-of "^3.0.2" @@ -6506,7 +6513,7 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== is-docker@^2.0.0: version "2.2.1" @@ -6516,7 +6523,7 @@ is-docker@^2.0.0: is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" @@ -6528,19 +6535,12 @@ is-extendable@^1.0.1: is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -6555,7 +6555,7 @@ is-generator-fn@^2.0.0: is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== dependencies: is-extglob "^2.1.0" @@ -6569,24 +6569,24 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== -is-negative-zero@^2.0.1: +is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== dependencies: kind-of "^3.0.2" @@ -6598,7 +6598,7 @@ is-number@^7.0.0: is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-obj@^2.0.0: version "2.0.0" @@ -6624,10 +6624,10 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: +is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -6652,7 +6652,7 @@ is-regex@^1.0.4, is-regex@^1.1.4: is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-resolvable@^1.0.0: version "1.1.0" @@ -6664,15 +6664,17 @@ is-root@2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: version "2.0.1" @@ -6693,12 +6695,12 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-weakref@^1.0.1: +is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== @@ -6713,7 +6715,7 @@ is-windows@^1.0.2: is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" @@ -6725,12 +6727,12 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== ismobilejs@^1.1.0: version "1.1.1" @@ -6740,19 +6742,14 @@ ismobilejs@^1.1.0: isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" @@ -6770,9 +6767,9 @@ istanbul-lib-instrument@^4.0.3: semver "^6.3.0" istanbul-lib-instrument@^5.0.4: - version "5.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" - integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + version "5.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" @@ -6799,9 +6796,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -7232,7 +7229,7 @@ jest-worker@^26.5.0, jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^27.3.1: +jest-worker@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -7250,10 +7247,10 @@ jest@26.6.0: import-local "^3.0.2" jest-cli "^26.6.0" -js-base64@^2.1.8: - version "2.6.4" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" - integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== +js-binary-schema-parser@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz#3d7848748e8586e63b34e8911b643f59cfb6396e" + integrity sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -7268,10 +7265,12 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" jsdom@^16.4.0: version "16.7.0" @@ -7314,7 +7313,7 @@ jsesc@^2.5.1: jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" @@ -7336,20 +7335,10 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^1.0.1: version "1.0.1" @@ -7358,17 +7347,15 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" +json5@^2.1.2, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" @@ -7381,22 +7368,12 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz#afe5efe4332cd3515c065072bd4d6b0aa22152bd" + integrity sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q== dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" - integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== - dependencies: - array-includes "^3.1.3" + array-includes "^3.1.5" object.assign "^4.1.2" killable@^1.0.1: @@ -7407,14 +7384,14 @@ killable@^1.0.1: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== dependencies: is-buffer "^1.1.5" @@ -7423,7 +7400,7 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -7439,14 +7416,14 @@ klona@^2.0.4: integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== language-subtag-registry@~0.3.2: - version "0.3.21" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" - integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== language-tags@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== dependencies: language-subtag-registry "~0.3.2" @@ -7474,7 +7451,7 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -7487,7 +7464,7 @@ lines-and-columns@^1.1.6: load-script@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4" - integrity sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ= + integrity sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA== loader-runner@^2.4.0: version "2.4.0" @@ -7533,7 +7510,7 @@ loader-utils@^2.0.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -7556,17 +7533,17 @@ locate-path@^5.0.0: lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.merge@^4.6.2: version "4.6.2" @@ -7591,14 +7568,14 @@ lodash.templatesettings@^4.0.0: lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.10: +"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7673,22 +7650,12 @@ makeerror@1.0.12: map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== dependencies: object-visit "^1.0.0" @@ -7714,12 +7681,12 @@ mdn-data@2.0.4: media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -7732,28 +7699,10 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" - integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-stream@^2.0.0: version "2.0.0" @@ -7768,7 +7717,7 @@ merge2@^1.3.0, merge2@^1.4.1: methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== microevent.ts@~0.1.1: version "0.1.1" @@ -7794,13 +7743,13 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.1" - picomatch "^2.2.3" + braces "^3.0.2" + picomatch "^2.3.1" miller-rabin@^4.0.0: version "4.0.1" @@ -7815,7 +7764,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -7837,11 +7786,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - mini-css-extract-plugin@0.11.3: version "0.11.3" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6" @@ -7860,7 +7804,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== minimatch@3.0.4: version "3.0.4" @@ -7869,33 +7813,17 @@ minimatch@3.0.4: dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.4, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@~3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" - integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== - dependencies: - brace-expansion "^1.1.7" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== minipass-collect@^1.0.2: version "1.0.2" @@ -7919,9 +7847,9 @@ minipass-pipeline@^1.2.2: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.1.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== + version "3.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" + integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== dependencies: yallist "^4.0.0" @@ -7958,11 +7886,11 @@ mixin-deep@^1.2.0: is-extendable "^1.0.1" mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - minimist "^1.2.5" + minimist "^1.2.6" mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" @@ -7972,7 +7900,7 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== dependencies: aproba "^1.1.1" copy-concurrently "^1.0.0" @@ -7984,7 +7912,7 @@ move-concurrently@^1.0.1: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" @@ -7999,7 +7927,7 @@ ms@2.1.3, ms@^2.1.1: multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ== multicast-dns@^6.0.1: version "6.2.3" @@ -8009,15 +7937,15 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -nan@^2.12.1, nan@^2.13.2: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== +nan@^2.12.1: + version "2.16.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" + integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== -nanoid@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== nanomatch@^1.2.9: version "1.2.13" @@ -8046,7 +7974,7 @@ native-url@^0.2.6: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.3: version "0.6.3" @@ -8081,26 +8009,10 @@ node-forge@^0.10.0: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== -node-gyp@^7.1.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" - integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.3" - nopt "^5.0.0" - npmlog "^4.1.2" - request "^2.88.2" - rimraf "^3.0.2" - semver "^7.3.2" - tar "^6.0.2" - which "^2.0.2" - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-libs-browser@^2.2.1: version "2.2.1" @@ -8148,38 +8060,10 @@ node-releases@^1.1.61: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== -node-releases@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== - -node-sass@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-6.0.1.tgz#cad1ccd0ce63e35c7181f545d8b986f3a9a887fe" - integrity sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^7.0.3" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - lodash "^4.17.15" - meow "^9.0.0" - nan "^2.13.2" - node-gyp "^7.1.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "2.2.5" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== normalize-package-data@^2.5.0: version "2.5.0" @@ -8191,20 +8075,10 @@ normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== dependencies: remove-trailing-separator "^1.0.1" @@ -8216,12 +8090,12 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== normalize-url@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + integrity sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ== dependencies: object-assign "^4.0.1" prepend-http "^1.0.0" @@ -8236,7 +8110,7 @@ normalize-url@^3.0.0: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" @@ -8247,16 +8121,6 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" -npmlog@^4.0.0, npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -8265,50 +8129,40 @@ nth-check@^1.0.2: boolbase "~1.0.0" nth-check@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" - integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" + integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== object-is@^1.0.1: version "1.1.5" @@ -8318,7 +8172,7 @@ object-is@^1.0.1: call-bind "^1.0.2" define-properties "^1.1.3" -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -8326,7 +8180,7 @@ object-keys@^1.0.12, object-keys@^1.1.1: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== dependencies: isobject "^3.0.0" @@ -8359,26 +8213,27 @@ object.fromentries@^2.0.5: es-abstract "^1.19.1" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" - integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== + version "2.1.4" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" + integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== dependencies: + array.prototype.reduce "^1.0.4" call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.1" -object.hasown@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" - integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== +object.hasown@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" + integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== dependencies: - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.19.5" object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" @@ -8396,10 +8251,10 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -8411,7 +8266,7 @@ on-headers@~1.0.2: once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" @@ -8469,17 +8324,10 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== - dependencies: - url-parse "^1.4.3" - os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== p-each-series@^2.1.0: version "2.2.0" @@ -8489,7 +8337,7 @@ p-each-series@^2.1.0: p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^1.1.0: version "1.3.0" @@ -8515,7 +8363,7 @@ p-limit@^3.0.2: p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" @@ -8555,7 +8403,7 @@ p-retry@^3.0.1: p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" @@ -8610,7 +8458,7 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" @@ -8646,7 +8494,7 @@ pascal-case@^3.1.2: pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== path-browserify@0.0.1: version "0.0.1" @@ -8656,12 +8504,12 @@ path-browserify@0.0.1: path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -8671,17 +8519,17 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" @@ -8696,7 +8544,7 @@ path-parse@^1.0.6, path-parse@^1.0.7: path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-type@^4.0.0: version "4.0.0" @@ -8717,7 +8565,7 @@ pbkdf2@^3.0.3: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picocolors@^0.2.1: version "0.2.1" @@ -8729,7 +8577,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -8737,7 +8585,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^4.0.1: version "4.0.1" @@ -8747,61 +8595,20 @@ pify@^4.0.1: pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== pirates@^4.0.1: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== -pixi.js@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/pixi.js/-/pixi.js-6.2.2.tgz#bc8319f007e48c0d5190b32b3e4f1d5bee0677e4" - integrity sha512-/xCnJUsWTZuacR6JYTnRbUb+5grzlqpp2O1Ub7bCZCE3FApTCs7nMNYeLfdeP+np/MlGaM+SsPh2cXcafR3OZw== - dependencies: - "@pixi/accessibility" "6.2.2" - "@pixi/app" "6.2.2" - "@pixi/compressed-textures" "6.2.2" - "@pixi/constants" "6.2.2" - "@pixi/core" "6.2.2" - "@pixi/display" "6.2.2" - "@pixi/extract" "6.2.2" - "@pixi/filter-alpha" "6.2.2" - "@pixi/filter-blur" "6.2.2" - "@pixi/filter-color-matrix" "6.2.2" - "@pixi/filter-displacement" "6.2.2" - "@pixi/filter-fxaa" "6.2.2" - "@pixi/filter-noise" "6.2.2" - "@pixi/graphics" "6.2.2" - "@pixi/interaction" "6.2.2" - "@pixi/loaders" "6.2.2" - "@pixi/math" "6.2.2" - "@pixi/mesh" "6.2.2" - "@pixi/mesh-extras" "6.2.2" - "@pixi/mixin-cache-as-bitmap" "6.2.2" - "@pixi/mixin-get-child-by-name" "6.2.2" - "@pixi/mixin-get-global-position" "6.2.2" - "@pixi/particle-container" "6.2.2" - "@pixi/polyfill" "6.2.2" - "@pixi/prepare" "6.2.2" - "@pixi/runner" "6.2.2" - "@pixi/settings" "6.2.2" - "@pixi/sprite" "6.2.2" - "@pixi/sprite-animated" "6.2.2" - "@pixi/sprite-tiling" "6.2.2" - "@pixi/spritesheet" "6.2.2" - "@pixi/text" "6.2.2" - "@pixi/text-bitmap" "6.2.2" - "@pixi/ticker" "6.2.2" - "@pixi/utils" "6.2.2" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -8842,7 +8649,7 @@ portfinder@^1.0.26: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== postcss-attribute-case-insensitive@^4.0.1: version "4.0.2" @@ -9440,9 +9247,9 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.9" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" - integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -9502,11 +9309,11 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po source-map "^0.6.1" postcss@^8.1.0: - version "8.4.11" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.11.tgz#a06229f23820b4ddd46500a3e38dbca1598a8e8d" - integrity sha512-D+jFLnT0ilGfy4CVBGbC+XE68HkVpT8+CUkDrcSpgxmo4RKco2uaZ4kIoyVGEm+m8KN/+Vwgs8MtpNbQ3/ma9w== + version "8.4.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== dependencies: - nanoid "^3.3.1" + nanoid "^3.3.4" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -9518,12 +9325,12 @@ prelude-ls@^1.2.1: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== pretty-bytes@^5.3.0: version "5.6.0" @@ -9556,7 +9363,7 @@ process-nextick-args@~2.0.0: process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== progress@^2.0.0: version "2.0.3" @@ -9566,7 +9373,7 @@ progress@^2.0.0: promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-polyfill@^8.2.0: version "8.2.3" @@ -9633,12 +9440,12 @@ proxy-addr@~2.0.7: prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== -psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== public-encrypt@^4.0.0: version "4.0.3" @@ -9680,12 +9487,12 @@ pumpify@^1.3.3: punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" @@ -9695,22 +9502,19 @@ punycode@^2.1.0, punycode@^2.1.1: q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q== dependencies: object-assign "^4.1.0" strict-uri-encode "^1.0.0" @@ -9718,12 +9522,12 @@ query-string@^4.1.0: querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== querystring@^0.2.0: version "0.2.1" @@ -9740,11 +9544,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -9772,13 +9571,13 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" - http-errors "1.8.1" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" @@ -9794,19 +9593,15 @@ react-app-polyfill@^2.0.0: regenerator-runtime "^0.13.7" whatwg-fetch "^3.4.1" -react-bootstrap@^2.0.0-alpha.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.2.1.tgz#2a6ad0931e9367882ec3fc88a70ed0b8ace90b26" - integrity sha512-x8lpVQflsbevphuWbTnTNCatcbKyPJNrP2WyQ1MJYmFEcVjbTbai1yZhdlXr0QUxLQLxA8g5hQWb5TwJtaZoCA== +react-bootstrap@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.4.0.tgz#99bf9656e2e7a23ae1ae135d18fd5ad7c344b416" + integrity sha512-dn599jNK1Fg5GGjJH+lQQDwELVzigh/MdusKpB/0el+sCjsO5MZDH5gRMmBjRhC+vb7VlCDr6OXffPIDSkNMLw== dependencies: "@babel/runtime" "^7.17.2" - "@restart/hooks" "^0.4.5" - "@restart/ui" "^1.0.2" - "@types/invariant" "^2.2.35" - "@types/prop-types" "^15.7.4" - "@types/react" ">=16.14.8" + "@restart/hooks" "^0.4.6" + "@restart/ui" "^1.2.0" "@types/react-transition-group" "^4.4.4" - "@types/warning" "^3.0.0" classnames "^2.3.1" dom-helpers "^5.2.1" invariant "^2.2.4" @@ -9846,14 +9641,13 @@ react-dev-utils@^11.0.3: strip-ansi "6.0.0" text-table "0.2.0" -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" + scheduler "^0.23.0" react-error-overlay@6.0.9, react-error-overlay@^6.0.9: version "6.0.9" @@ -9946,10 +9740,12 @@ react-scripts@4.0.3: optionalDependencies: fsevents "^2.1.3" -react-slider@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/react-slider/-/react-slider-1.3.1.tgz#41dd88f7c67520811a4114d6f8f49d186268d9da" - integrity sha512-bD8hHJJUgAHI8g1F6PY6432l+Dmcs2fqzUwDhd+0HWDdvfjwNoXRNC2cL9OWyGTjYlJM92A8nF/w1X4pyHfytQ== +react-slider@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/react-slider/-/react-slider-2.0.1.tgz#51fb80aaebb98a07d6563b757a49c437a5142fed" + integrity sha512-EnPLeyPGQcgpU9i+OvdD6W1Fk+rHg7LOVGvREXqLnbSngYvnE+d++nus0iHho1kcDw6NzF1OXzqWXAEs2Nbl4Q== + dependencies: + prop-types "^15.8.1" react-transition-group@^4.4.2: version "4.4.2" @@ -9982,13 +9778,12 @@ react-youtube@^7.13.1: prop-types "15.7.2" youtube-player "5.5.2" -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" read-pkg-up@^7.0.1: version "7.0.1" @@ -10009,7 +9804,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -10054,14 +9849,6 @@ recursive-readdir@2.2.2: dependencies: minimatch "3.0.4" -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - regenerate-unicode-properties@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" @@ -10084,10 +9871,10 @@ regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== dependencies: "@babel/runtime" "^7.8.4" @@ -10104,23 +9891,24 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" - integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" + functions-have-names "^1.2.2" -regexpp@^3.1.0: +regexpp@^3.1.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" - integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== +regexpu-core@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" + integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.0.1" @@ -10144,12 +9932,12 @@ regjsparser@^0.8.2: relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== renderkid@^2.0.4: version "2.0.7" @@ -10170,38 +9958,12 @@ repeat-element@^1.1.2: repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request@^2.88.0, request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" @@ -10216,12 +9978,12 @@ require-main-filename@^2.0.0: requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + integrity sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg== dependencies: resolve-from "^3.0.0" @@ -10235,7 +9997,7 @@ resolve-cwd@^3.0.0: resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== resolve-from@^4.0.0: version "4.0.0" @@ -10266,7 +10028,7 @@ resolve-url-loader@^3.1.2: resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== resolve@1.18.1: version "1.18.1" @@ -10276,22 +10038,23 @@ resolve@1.18.1: is-core-module "^2.0.0" path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.2: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" ret@~0.1.10: version "0.1.15" @@ -10301,7 +10064,7 @@ ret@~0.1.10: retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: version "1.0.4" @@ -10311,12 +10074,12 @@ reusify@^1.0.4: rework-visit@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" - integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + integrity sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ== rework@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" - integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + integrity sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw== dependencies: convert-source-map "^0.3.3" css "^2.0.0" @@ -10324,12 +10087,12 @@ rework@1.0.1: rgb-regex@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + integrity sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w== rgba-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + integrity sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg== rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" @@ -10403,7 +10166,7 @@ run-parallel@^1.1.9: run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== dependencies: aproba "^1.1.1" @@ -10420,11 +10183,11 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -10449,20 +10212,10 @@ sanitize.css@^10.0.0: resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== -sass-graph@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" - integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^13.3.2" - sass-loader@^10.0.5: - version "10.2.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.2.1.tgz#17e51df313f1a7a203889ce8ff91be362651276e" - integrity sha512-RRvWl+3K2LSMezIsd008ErK4rk6CulIMSwrcc2aZvjymUgKo/vjXGp1rSWmfTUX7bblEOz8tst4wBwWtCGBqKA== + version "10.3.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.3.1.tgz#a45f0d1dd7ea90de7eb099239a18c83dea6e6341" + integrity sha512-y2aBdtYkbqorVavkC3fcJIUDGIegzDWPn3/LAFhsf3G+MzPKTJx37sROf5pXtUeggSVbNbmfj8TgRaSLMelXRA== dependencies: klona "^2.0.4" loader-utils "^2.0.0" @@ -10470,6 +10223,15 @@ sass-loader@^10.0.5: schema-utils "^3.0.0" semver "^7.3.2" +sass@^1.53.0: + version "1.54.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.0.tgz#24873673265e2a4fe3d3a997f714971db2fba1f4" + integrity sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -10482,13 +10244,12 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" schema-utils@^1.0.0: version "1.0.0" @@ -10517,18 +10278,10 @@ schema-utils@^3.0.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^1.10.8: version "1.10.14" @@ -10557,31 +10310,31 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "1.8.1" + http-errors "2.0.0" mime "1.6.0" ms "2.1.3" - on-finished "~2.3.0" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" serialize-javascript@^4.0.0: version "4.0.0" @@ -10600,7 +10353,7 @@ serialize-javascript@^5.0.1: serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" batch "0.6.1" @@ -10610,20 +10363,20 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.2" + send "0.18.0" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" @@ -10638,7 +10391,7 @@ set-value@^2.0.0, set-value@^2.0.1: setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.1.0: version "1.1.0" @@ -10661,7 +10414,7 @@ sha.js@^2.4.0, sha.js@^2.4.8: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -10675,7 +10428,7 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" @@ -10709,7 +10462,7 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" @@ -10768,12 +10521,12 @@ snapdragon@^0.8.1: use "^3.1.0" sockjs-client@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.6.0.tgz#e0277b8974558edcb557eafc7d3027ef6128d865" - integrity sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ== + version "1.6.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.6.1.tgz#350b8eda42d6d52ddc030c39943364c11dcad806" + integrity sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw== dependencies: debug "^3.2.7" - eventsource "^1.1.0" + eventsource "^2.0.2" faye-websocket "^0.11.4" inherits "^2.0.4" url-parse "^1.5.10" @@ -10790,7 +10543,7 @@ sockjs@^0.3.21: sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== dependencies: is-plain-obj "^1.0.0" @@ -10799,7 +10552,7 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.2: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -10833,22 +10586,15 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.7.3, source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== sourcemap-codec@^1.4.8: version "1.4.8" @@ -10914,22 +10660,7 @@ split-string@^3.0.1, split-string@^3.0.2: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== ssri@^6.0.1: version "6.0.2" @@ -10957,30 +10688,28 @@ stack-utils@^2.0.2: dependencies: escape-string-regexp "^2.0.0" -stackframe@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.1.tgz#1033a3473ee67f08e2f2fc8eba6aef4f845124e1" - integrity sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg== +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== - dependencies: - readable-stream "^2.0.1" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== stream-browserify@^2.0.1: version "2.0.2" @@ -11017,7 +10746,7 @@ stream-shift@^1.0.0: strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== string-length@^4.0.1: version "4.0.2" @@ -11032,24 +10761,6 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -11059,35 +10770,46 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.matchall@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" - integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" es-abstract "^1.19.1" get-intrinsic "^1.1.1" - has-symbols "^1.0.2" + has-symbols "^1.0.3" internal-slot "^1.0.3" - regexp.prototype.flags "^1.3.1" + regexp.prototype.flags "^1.4.1" side-channel "^1.0.4" -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.19.5" -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.19.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -11119,10 +10841,10 @@ strip-ansi@6.0.0: dependencies: ansi-regex "^5.0.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: +strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" @@ -11143,7 +10865,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" @@ -11161,20 +10883,13 @@ strip-comments@^1.0.2: strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -11197,11 +10912,6 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -11303,7 +11013,7 @@ tar@^6.0.2: temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== tempy@^0.3.0: version "0.3.0" @@ -11353,22 +11063,22 @@ terser-webpack-plugin@^1.4.3: worker-farm "^1.7.0" terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: - version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + version "4.8.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" + integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== dependencies: commander "^2.20.0" source-map "~0.6.1" source-map-support "~0.5.12" terser@^5.3.4: - version "5.12.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.1.tgz#4cf2ebed1f5bceef5c83b9f60104ac4a78b49e9c" - integrity sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ== + version "5.14.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" + integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== dependencies: + "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" commander "^2.20.0" - source-map "~0.7.2" source-map-support "~0.5.20" test-exclude@^6.0.0: @@ -11383,7 +11093,7 @@ test-exclude@^6.0.0: text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== throat@^5.0.0: version "5.0.0" @@ -11413,7 +11123,7 @@ timers-browserify@^2.0.4: timsort@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + integrity sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A== tmpl@1.0.5: version "1.0.5" @@ -11423,24 +11133,24 @@ tmpl@1.0.5: to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -11476,14 +11186,6 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" @@ -11491,29 +11193,17 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== - dependencies: - glob "^7.1.2" - tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-node@^10.6.0: - version "10.7.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" - integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== +ts-node@^10.7.0: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: - "@cspotcode/source-map-support" "0.7.0" + "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -11524,7 +11214,7 @@ ts-node@^10.6.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - v8-compile-cache-lib "^3.0.0" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" ts-pnp@1.2.0, ts-pnp@^1.1.6: @@ -11532,14 +11222,14 @@ ts-pnp@1.2.0, ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== -tsconfig-paths@^3.12.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.0.tgz#4fcc48f9ccea8826c41b9ca093479de7f5018976" - integrity sha512-cg/1jAZoL57R39+wiw4u/SCC6Ic9Q5NqjBOb+9xISedOYurfog9ZNmKJSxAnb2m/5Bq4lE9lhUcau33Ml8DM0g== +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" - minimist "^1.2.0" + minimist "^1.2.6" strip-bom "^3.0.0" tslib@^1.8.1: @@ -11548,9 +11238,9 @@ tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" @@ -11562,19 +11252,7 @@ tsutils@^3.17.1, tsutils@^3.21.0: tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -11586,7 +11264,7 @@ type-check@^0.4.0, type-check@~0.4.0: type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -11595,11 +11273,6 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -11653,21 +11326,21 @@ typedarray-to-buffer@^3.1.5: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript@^4.3.5: - version "4.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" - integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== + version "4.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" uncontrollable@^7.2.1: @@ -11716,12 +11389,12 @@ union-value@^1.0.0: uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + integrity sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ== unique-filename@^1.1.1: version "1.1.1" @@ -11740,7 +11413,7 @@ unique-slug@^2.0.0: unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + integrity sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg== dependencies: crypto-random-string "^1.0.0" @@ -11757,17 +11430,17 @@ universalify@^2.0.0: unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unquote@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -11777,6 +11450,14 @@ upath@^1.1.1, upath@^1.1.2, upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-browserslist-db@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" + integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -11787,7 +11468,7 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== url-loader@4.1.1: version "4.1.1" @@ -11798,7 +11479,7 @@ url-loader@4.1.1: mime-types "^2.1.27" schema-utils "^3.0.0" -url-parse@^1.4.3, url-parse@^1.5.10: +url-parse@^1.5.10: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -11809,11 +11490,16 @@ url-parse@^1.4.3, url-parse@^1.5.10: url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== dependencies: punycode "1.3.2" querystring "0.2.0" +use-between@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/use-between/-/use-between-1.3.4.tgz#e1a4487458689d95f0921fab431f3acb989c39f2" + integrity sha512-jtLCBVeytJUjAc9+/r/0SREuNLyn3KO9VjvSi7eozeThPfnbOedKuH9qep/C+jgfJ9Ohx4bf714ri78Hev9BGA== + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -11822,7 +11508,7 @@ use@^3.1.0: util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util.promisify@1.0.0: version "1.0.0" @@ -11845,7 +11531,7 @@ util.promisify@~1.0.0: util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== dependencies: inherits "2.0.1" @@ -11859,12 +11545,12 @@ util@^0.11.0: utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^3.3.2: version "3.4.0" @@ -11876,10 +11562,10 @@ uuid@^8.3.0, uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache-lib@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" - integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-compile-cache@^2.0.3: version "2.3.0" @@ -11906,22 +11592,13 @@ validate-npm-package-license@^3.0.1: vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vendors@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -12156,7 +11833,7 @@ which-boxed-primitive@^1.0.2: which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which@^1.2.9, which@^1.3.1: version "1.3.1" @@ -12172,13 +11849,6 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -12372,7 +12042,7 @@ wrap-ansi@^6.2.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.0: version "3.0.3" @@ -12392,9 +12062,9 @@ ws@^6.2.1: async-limiter "~1.0.0" ws@^7.4.6: - version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" - integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== xml-name-validator@^3.0.0: version "3.0.0" @@ -12447,11 +12117,6 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"