diff --git a/submodules/renderer/.editorconfig b/.editorconfig similarity index 100% rename from submodules/renderer/.editorconfig rename to .editorconfig diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 695c05d..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module", - "ecmaFeatures": { - "jsx": 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" - ], - "plugins": [ - "@typescript-eslint", - "react" - ], - "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" - ], - "@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" - ], - "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 - } - ] - } -} diff --git a/.gitignore b/.gitignore index ae96caa..154341f 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ Thumbs.db /build *.zip .env +public/renderer-config* +public/ui-config* diff --git a/.gitlab-ci.yml-disabled b/.gitlab-ci.yml-disabled deleted file mode 100644 index 0a291a9..0000000 --- a/.gitlab-ci.yml-disabled +++ /dev/null @@ -1,29 +0,0 @@ -image: node:16.13 - -stages: - - install-dependencies - - build - -Install Dependencies: - stage: install-dependencies - script: - - yarn install - cache: - key: ${CI_COMMIT_BRANCH} - paths: - - node_modules - -Build Nitro: - stage: build - script: - - cp public/renderer-config.json.example public/renderer-config.json - - cp public/ui-config.json.example public/ui-config.json - - yarn build:prod - cache: - key: ${CI_COMMIT_BRANCH} - paths: - - node_modules - artifacts: - expire_in: 2 weeks - paths: - - build/* diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 3fdf856..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "typescript.tsdk": "node_modules\\typescript\\lib", - "typescript.preferences.importModuleSpecifier": "relative", - "typescript.preferences.quoteStyle": "single", - "typescript.format.placeOpenBraceOnNewLineForControlBlocks": true, - "typescript.format.placeOpenBraceOnNewLineForFunctions": true, - "editor.wordWrap": "on", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": true, - "source.fixAll.sortJSON": false, - "source.organizeImports": true - }, - "editor.formatOnSave": false, - "git.ignoreLimitWarning": true, - "files.eol": "\n", - "files.insertFinalNewline": true, - "files.trimFinalNewlines": true, - "emmet.showExpandedAbbreviation": "never", - "eslint.format.enable": true, - "eslint.validate": [ - "javascript", - "typescript" - ], - "eslint.workingDirectories": [ - { - "pattern": "./src" - } - ], - "javascript.format.enable": false, - "thunder-client.saveToWorkspace": false, - "thunder-client.workspaceRelativePath": "." -} diff --git a/README.md b/README.md index c1adcc8..ebdb05c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -# Nitro React v2.1 - -Credits: Thanks to Genaro on discord for this release! +# v2.2.0 - Cool UI Beta !! Use at Own Risk as it is still in Beta !! ## Prerequisites @@ -11,12 +9,16 @@ Credits: Thanks to Genaro on discord for this release! ## Installation -- First you should open terminal and navigate to the folder where you want to clone Nitro -- Clone Nitro - - `git clone https://github.com/duckietm/Nitro-Cool-UI.git` -- Install the dependencies - - `yarn install` - - This may take some time, please be patient +- First you should open terminal and navigate to the folder where you want to clone Nitro and Nitro-Renderer +- Clone Nitro (Expl. C:\Github\) + - `git clone https://github.com/duckietm/Nitro-Cool-UI.git` <== For now switch to Dev-RendererV2 + - `git clone https://github.com/duckietm/Nitro-Cool-UI-Renderer.git` + - Install the dependencies for the renderer : cd C:\Github\Nitro-Cool-UI-Renderer + - `yarn install` + - Now we will create a Link for the CoolUI : `yarn link` This will give you a link address `yarn link "@nitrots/nitro-renderer"` + - Install the dependencies for Cool UI : cd C:\Github\Nitro-Cool-UI + - `yarn install` + - `yarn link "@nitrots/nitro-renderer` <== This will link the renderer in the project - Rename a few files - Rename `public/renderer-config.json.example` to `public/renderer-config.json` - Rename `public/ui-config.json.example` to `public/ui-config.json` @@ -25,16 +27,13 @@ Credits: Thanks to Genaro on discord for this release! - Update `socket.url, asset.url, image.library.url, & hof.furni.url` - Open `public/ui-config.json` - Update `camera.url, thumbnails.url, url.prefix, habbopages.url` + - `yarn build` <== the final step to build the DIST folder this is where your browser needs to point / or upload this to your /client if you do the compile on a other machine (preferd) - You can override any variable by passing it to `NitroConfig` in the index.html - -- Make the following changes - - ExternalTesxts.json - `"room.mute.button.text": "Hide chat",` - `"room.unmute.button.text": "Unhide chat",` ## Usage - To use Nitro you need `.nitro` assets generated, see [nitro-converter](https://git.krews.org/nitro/nitro-converter) for instructions +- See [Morningstar Websockets](https://git.krews.org/nitro/ms-websockets) for instructions on configuring websockets on your server ### Development @@ -49,13 +48,8 @@ yarn start To build a production version of Nitro just run the following command ``` -yarn build +yarn build:prod ``` - A `dist` folder will be generated, these are the files that must be uploaded to your webserver - Consult your CMS documentation for compatibility with Nitro and how to add the production files - -# Want to help ! -Discord: https://discord.gg/txfNucJv - -Please beware all is Free so don't get scammed !! diff --git a/css-utils/CSSColorUtils.js b/css-utils/CSSColorUtils.js new file mode 100644 index 0000000..77077fc --- /dev/null +++ b/css-utils/CSSColorUtils.js @@ -0,0 +1,73 @@ +const lightenHexColor = (hex, percent) => +{ +// Remove the hash symbol if present + hex = hex.replace(/^#/, ''); + + // Convert hex to RGB + let r = parseInt(hex.substring(0, 2), 16); + let g = parseInt(hex.substring(2, 4), 16); + let b = parseInt(hex.substring(4, 6), 16); + + // Adjust RGB values + r = Math.round(Math.min(255, r + 255 * percent)); + g = Math.round(Math.min(255, g + 255 * percent)); + b = Math.round(Math.min(255, b + 255 * percent)); + + // Convert RGB back to hex + const result = ((r << 16) | (g << 8) | b).toString(16); + + // Make sure result has 6 digits + return '#' + result.padStart(6, '0'); +} + +const darkenHexColor = (hex, percent) => +{ + // Remove the hash symbol if present + hex = hex.replace(/^#/, ''); + + // Convert hex to RGB + let r = parseInt(hex.substring(0, 2), 16); + let g = parseInt(hex.substring(2, 4), 16); + let b = parseInt(hex.substring(4, 6), 16); + + // Calculate the darkened RGB values + r = Math.round(Math.max(0, r - 255 * percent)); + g = Math.round(Math.max(0, g - 255 * percent)); + b = Math.round(Math.max(0, b - 255 * percent)); + + // Convert RGB back to hex + const result = ((r << 16) | (g << 8) | b).toString(16); + + // Make sure result has 6 digits + return '#' + result.padStart(6, '0'); +}; + + +const generateShades = (colors) => +{ + for (let color in colors) + { + let hex = colors[color] + let extended = {} + const shades = [ 50, 100, 200, 300, 400, 500, 600, 700, 900, 950 ]; + + for (let i = 0; i < shades.length; i++) + { + let shade = shades[i]; + extended[shade] = lightenHexColor(hex, shades[(shades.length - 1 - i) ] / 950); + extended[-shade] = darkenHexColor(hex, shades[(shades.length - 1 - i) ] / 950) + } + + colors[color] = { + DEFAULT: hex, + ...extended + } + } + + return colors; +} + +module.exports = { + generateShades, + lightenHexColor +} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..108a976 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,138 @@ +import typescriptEslintPlugin from "@typescript-eslint/eslint-plugin"; +import typescriptEslintParser from "@typescript-eslint/parser"; +import reactPlugin from "eslint-plugin-react"; +import reactHooksPlugin from "eslint-plugin-react-hooks"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +export default [ + { + files: ["**/*.jsx", "**/*.js", "**/*.tsx", "**/*.ts"], + plugins: { + react: reactPlugin, + "react-hooks": reactHooksPlugin, + "@typescript-eslint": typescriptEslintPlugin, + }, + languageOptions: { + parser: typescriptEslintParser, + ecmaVersion: "latest", + parserOptions: { + sourceType: "module", + project: "./tsconfig.json", + tsconfigRootDir: __dirname, + ecmaFeatures: { + jsx: true, + }, + }, + }, + rules: { + ...reactPlugin.configs.recommended.rules, + ...reactHooksPlugin.configs.recommended.rules, + ...typescriptEslintPlugin.configs.recommended.rules, + ...typescriptEslintPlugin.configs[ + "recommended-requiring-type-checking" + ].rules, + 'indent': [ + 'error', + 4, + { + 'SwitchCase': 1 + } + ], + 'no-multi-spaces': [ + 'error' + ], + 'no-trailing-spaces': [ + 'error', + { + 'skipBlankLines': false, + 'ignoreComments': true + } + ], + 'linebreak-style': [ + 'off' + ], + 'quotes': [ + 'error', + 'single' + ], + 'semi': [ + 'error', + 'always' + ], + 'brace-style': [ + 'error', + 'allman' + ], + 'object-curly-spacing': [ + 'error', + 'always' + ], + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-floating-promises': 'off', + '@typescript-eslint/require-await': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-misused-promises': 'off', + '@typescript-eslint/explicit-module-boundary-types': [ + 'off', + { + 'allowedNames': [ + 'getMessageArray' + ] + } + ], + '@typescript-eslint/unbound-method': [ + '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 + } + ], + 'react/react-in-jsx-scope': 'off' + }, + settings: { + react: { + version: "18.3.1", + }, + }, + }, +]; diff --git a/index.html b/index.html index dd4538b..e3f0ecf 100644 --- a/index.html +++ b/index.html @@ -1,35 +1,69 @@ - + - - - - - - - - - - - - - - - - - Nitro - - - -
- - - + + + + + + + + + + + + + + + + + Nitro + + + +
+ + + diff --git a/package.json b/package.json index c17108a..01d4590 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,49 @@ { - "name": "nitro-react", - "version": "2.1.1", - "homepage": ".", - "private": true, - "scripts": { - "start": "vite --base=/client/ --host", - "build": "vite build --base=/client/", - "preview": "vite preview --base=/client/ --host", - "build:prod": "npx browserslist@latest --update-db && yarn build", - "eslint": "eslint src --ext .ts,.tsx" - }, - "dependencies": { - "@emoji-mart/data": "^1.1.2", - "@emoji-mart/react": "^1.1.1", - "@nitrots/nitro-renderer": "file:submodules/renderer", - "@tanstack/react-virtual": "^3.0.0-beta.60", - "dompurify": "^3.0.11", - "emoji-mart": "^5.5.2", - "emoji-toolkit": "8.0.0", - "react": "^18.2.0", - "react-bootstrap": "^2.7.2", - "react-dom": "^18.2.0", - "react-icons": "^5.0.1", - "react-slider": "^2.0.0", - "react-youtube": "^7.13.1", - "typescript": "^4.3.5", - "use-between": "^1.3.4", - "yarn": "^1.22.19" - }, - "devDependencies": { - "@types/node": "^18.15.3", - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", - "@types/react-slider": "^1.3.1", - "@typescript-eslint/eslint-plugin": "^5.55.0", - "@typescript-eslint/parser": "^5.55.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.36.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "sass": "1.64.2", - "vite": "^5.0.11" - } + "name": "nitro-react", + "version": "2.2", + "homepage": ".", + "private": true, + "scripts": { + "start": "vite --host", + "build": "vite build", + "build:prod": "npx browserslist@latest --update-db && yarn build", + "eslint": "eslint ./src" + }, + "dependencies": { + "@babel/runtime": "^7.26.9", + "@tanstack/react-virtual": "3.2.0", + "@types/react-transition-group": "^4.4.10", + "dompurify": "^3.1.5", + "framer-motion": "^11.2.12", + "react": "^18.3.1", + "react-bootstrap": "^2.10.9", + "react-dom": "^18.3.1", + "react-icons": "^5.2.1", + "react-slider": "^2.0.6", + "react-tiny-popover": "^8.0.4", + "react-youtube": "^7.13.1", + "use-between": "^1.3.5" + }, + "devDependencies": { + "@tailwindcss/forms": "^0.5.7", + "@types/node": "^20.11.30", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@types/react-slider": "^1.3.6", + "@typescript-eslint/eslint-plugin": "^7.13.1", + "@typescript-eslint/parser": "^7.13.1", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.19", + "eslint": "^9.5.0", + "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react-hooks": "^5.1.0-rc-1434af3d22-20240618", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "sass": "^1.77.4", + "tailwindcss": "^3.4.4", + "typescript": "^5.4.5", + "typescript-eslint": "^7.13.1", + "vite": "^5.2.13", + "vite-tsconfig-paths": "^4.3.2" + } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..9855208 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,8 @@ +/** @type {import("postcss-load-config").Config} */ + +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +} diff --git a/public/renderer-config.json.example b/public/renderer-config.json.example deleted file mode 100644 index 854a4dd..0000000 --- a/public/renderer-config.json.example +++ /dev/null @@ -1,110 +0,0 @@ -{ - "socket.url": "wss://ws.website.com:2096", - "asset.url": "https://website.com", - "image.library.url": "https://website.com/c_images/", - "hof.furni.url": "https://website.com/dcr/hof_furni", - "images.url": "${asset.url}/images", - "gamedata.url": "${asset.url}/gamedata", - "sounds.url": "${asset.url}/sounds/%sample%.mp3", - "external.texts.url": [ "${gamedata.url}/ExternalTexts.json", "${gamedata.url}/UITexts.json" ], - "external.samples.url": "${hof.furni.url}/mp3/sound_machine_sample_%sample%.mp3", - "furnidata.url": "${gamedata.url}/FurnitureData.json", - "productdata.url": "${gamedata.url}/ProductData.json", - "avatar.actions.url": "${gamedata.url}/HabboAvatarActions.json", - "avatar.figuredata.url": "${gamedata.url}/FigureData.json", - "avatar.figuremap.url": "${gamedata.url}/FigureMap.json", - "avatar.effectmap.url": "${gamedata.url}/EffectMap.json", - "avatar.asset.url": "${asset.url}/bundled/figure/%libname%.nitro", - "avatar.asset.effect.url": "${asset.url}/bundled/effect/%libname%.nitro", - "furni.asset.url": "${asset.url}/bundled/furniture/%libname%.nitro", - "furni.asset.icon.url": "${hof.furni.url}/icons/%libname%%param%_icon.png", - "pet.asset.url": "${asset.url}/bundled/pet/%libname%.nitro", - "generic.asset.url": "${asset.url}/bundled/generic/%libname%.nitro", - "badge.asset.url": "${image.library.url}album1584/%badgename%.gif", - "furni.rotation.bounce.steps": 20, - "furni.rotation.bounce.height": 0.0625, - "enable.avatar.arrow": false, - "system.log.debug": false, - "system.log.warn": false, - "system.log.error": false, - "system.log.events": false, - "system.log.packets": false, - "system.fps.animation": 24, - "system.fps.max": 60, - "system.pong.manually": true, - "system.pong.interval.ms": 20000, - "room.color.skip.transition": true, - "room.landscapes.enabled": true, - "avatar.mandatory.libraries": [ - "bd:1", - "li:0" - ], - "avatar.mandatory.effect.libraries": [ - "dance.1", - "dance.2", - "dance.3", - "dance.4" - ], - "avatar.default.figuredata": {"palettes":[{"id":1,"colors":[{"id":99999,"index":1001,"club":0,"selectable":false,"hexCode":"DDDDDD"},{"id":99998,"index":1001,"club":0,"selectable":false,"hexCode":"FAFAFA"}]},{"id":3,"colors":[{"id":10001,"index":1001,"club":0,"selectable":false,"hexCode":"EEEEEE"},{"id":10002,"index":1002,"club":0,"selectable":false,"hexCode":"FA3831"},{"id":10003,"index":1003,"club":0,"selectable":false,"hexCode":"FD92A0"},{"id":10004,"index":1004,"club":0,"selectable":false,"hexCode":"2AC7D2"},{"id":10005,"index":1005,"club":0,"selectable":false,"hexCode":"35332C"},{"id":10006,"index":1006,"club":0,"selectable":false,"hexCode":"EFFF92"},{"id":10007,"index":1007,"club":0,"selectable":false,"hexCode":"C6FF98"},{"id":10008,"index":1008,"club":0,"selectable":false,"hexCode":"FF925A"},{"id":10009,"index":1009,"club":0,"selectable":false,"hexCode":"9D597E"},{"id":10010,"index":1010,"club":0,"selectable":false,"hexCode":"B6F3FF"},{"id":10011,"index":1011,"club":0,"selectable":false,"hexCode":"6DFF33"},{"id":10012,"index":1012,"club":0,"selectable":false,"hexCode":"3378C9"},{"id":10013,"index":1013,"club":0,"selectable":false,"hexCode":"FFB631"},{"id":10014,"index":1014,"club":0,"selectable":false,"hexCode":"DFA1E9"},{"id":10015,"index":1015,"club":0,"selectable":false,"hexCode":"F9FB32"},{"id":10016,"index":1016,"club":0,"selectable":false,"hexCode":"CAAF8F"},{"id":10017,"index":1017,"club":0,"selectable":false,"hexCode":"C5C6C5"},{"id":10018,"index":1018,"club":0,"selectable":false,"hexCode":"47623D"},{"id":10019,"index":1019,"club":0,"selectable":false,"hexCode":"8A8361"},{"id":10020,"index":1020,"club":0,"selectable":false,"hexCode":"FF8C33"},{"id":10021,"index":1021,"club":0,"selectable":false,"hexCode":"54C627"},{"id":10022,"index":1022,"club":0,"selectable":false,"hexCode":"1E6C99"},{"id":10023,"index":1023,"club":0,"selectable":false,"hexCode":"984F88"},{"id":10024,"index":1024,"club":0,"selectable":false,"hexCode":"77C8FF"},{"id":10025,"index":1025,"club":0,"selectable":false,"hexCode":"FFC08E"},{"id":10026,"index":1026,"club":0,"selectable":false,"hexCode":"3C4B87"},{"id":10027,"index":1027,"club":0,"selectable":false,"hexCode":"7C2C47"},{"id":10028,"index":1028,"club":0,"selectable":false,"hexCode":"D7FFE3"},{"id":10029,"index":1029,"club":0,"selectable":false,"hexCode":"8F3F1C"},{"id":10030,"index":1030,"club":0,"selectable":false,"hexCode":"FF6393"},{"id":10031,"index":1031,"club":0,"selectable":false,"hexCode":"1F9B79"},{"id":10032,"index":1032,"club":0,"selectable":false,"hexCode":"FDFF33"}]}],"setTypes":[{"type":"hd","paletteId":1,"mandatory_f_0":true,"mandatory_f_1":true,"mandatory_m_0":true,"mandatory_m_1":true,"sets":[{"id":99999,"gender":"U","club":0,"colorable":true,"selectable":false,"preselectable":false,"sellable":false,"parts":[{"id":1,"type":"bd","colorable":true,"index":0,"colorindex":1},{"id":1,"type":"hd","colorable":true,"index":0,"colorindex":1},{"id":1,"type":"lh","colorable":true,"index":0,"colorindex":1},{"id":1,"type":"rh","colorable":true,"index":0,"colorindex":1}]}]},{"type":"bds","paletteId":1,"mandatory_f_0":false,"mandatory_f_1":false,"mandatory_m_0":false,"mandatory_m_1":false,"sets":[{"id":10001,"gender":"U","club":0,"colorable":true,"selectable":false,"preselectable":false,"sellable":false,"parts":[{"id":10001,"type":"bds","colorable":true,"index":0,"colorindex":1},{"id":10001,"type":"lhs","colorable":true,"index":0,"colorindex":1},{"id":10001,"type":"rhs","colorable":true,"index":0,"colorindex":1}],"hiddenLayers":[{"partType":"bd"},{"partType":"rh"},{"partType":"lh"}]}]},{"type":"ss","paletteId":3,"mandatory_f_0":false,"mandatory_f_1":false,"mandatory_m_0":false,"mandatory_m_1":false,"sets":[{"id":10010,"gender":"F","club":0,"colorable":true,"selectable":false,"preselectable":false,"sellable":false,"parts":[{"id":10001,"type":"ss","colorable":true,"index":0,"colorindex":1}],"hiddenLayers":[{"partType":"ch"},{"partType":"lg"},{"partType":"ca"},{"partType":"wa"},{"partType":"sh"},{"partType":"ls"},{"partType":"rs"},{"partType":"lc"},{"partType":"rc"},{"partType":"cc"},{"partType":"cp"}]},{"id":10011,"gender":"M","club":0,"colorable":true,"selectable":false,"preselectable":false,"sellable":false,"parts":[{"id":10002,"type":"ss","colorable":true,"index":0,"colorindex":1}],"hiddenLayers":[{"partType":"ch"},{"partType":"lg"},{"partType":"ca"},{"partType":"wa"},{"partType":"sh"},{"partType":"ls"},{"partType":"rs"},{"partType":"lc"},{"partType":"rc"},{"partType":"cc"},{"partType":"cp"}]}]}]}, - "avatar.default.actions": { - "actions": [ - { - "id": "Default", - "state": "std", - "precedence": 1000, - "main": true, - "isDefault": true, - "geometryType": "vertical", - "activePartSet": "figure", - "assetPartDefinition": "std" - } - ] - }, - "pet.types": [ - "dog", - "cat", - "croco", - "terrier", - "bear", - "pig", - "lion", - "rhino", - "spider", - "turtle", - "chicken", - "frog", - "dragon", - "monster", - "monkey", - "horse", - "monsterplant", - "bunnyeaster", - "bunnyevil", - "bunnydepressed", - "bunnylove", - "pigeongood", - "pigeonevil", - "demonmonkey", - "bearbaby", - "terrierbaby", - "gnome", - "leprechaun", - "kittenbaby", - "puppybaby", - "pigletbaby", - "haloompa", - "fools", - "pterosaur", - "velociraptor", - "cow", - "dragondog" - ], - "preload.assets.urls": [ - "${asset.url}/bundled/generic/avatar_additions.nitro", - "${asset.url}/bundled/generic/group_badge.nitro", - "${asset.url}/bundled/generic/floor_editor.nitro", - "${images.url}/loading_icon.png", - "${images.url}/clear_icon.png", - "${images.url}/big_arrow.png" - ] -} diff --git a/public/ui-config.json.example b/public/ui-config.json.example deleted file mode 100644 index 210f5de..0000000 --- a/public/ui-config.json.example +++ /dev/null @@ -1,1204 +0,0 @@ -{ - "image.library.notifications.url": "${image.library.url}notifications/%image%.png", - "achievements.images.url": "${image.library.url}Quests/%image%.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", - "guide.help.alpha.groupid": 0, - "chat.viewer.height.percentage": 0.40, - "widget.dimmer.colorwheel": false, - "avatar.wardrobe.max.slots": 10, - "user.badges.max.slots": 5, - "user.tags.enabled": false, - "camera.publish.disabled": false, - "hc.disabled": false, - "badge.descriptions.enabled": true, - "motto.max.length": 38, - "bot.name.max.length": 15, - "pet.package.name.max.length": 15, - "wired.action.bot.talk.to.avatar.max.length": 64, - "wired.action.bot.talk.max.length": 64, - "wired.action.chat.max.length": 100, - "wired.action.kick.from.room.max.length": 100, - "wired.action.mute.user.max.length": 100, - "game.center.enabled": false, - "guides.enabled": true, - "toolbar.hide.quests": true, - "api.sound.upload": "/chatvoice/upload.php", - "youtube.publish.disabled": false, - "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": { - "room.pool": "", - "room.picnic": "", - "room.rooftop": "", - "room.rooftop.pool": "", - "room.peaceful": "", - "room.infobus": "", - "room.lobby": "", - "show.avatar": false, - "widgets": { - "slot.1.widget": "", - "slot.1.conf": {}, - "slot.2.widget": "", - "slot.2.conf": {}, - "slot.3.widget": "", - "slot.3.conf": {}, - "slot.4.widget": "", - "slot.4.conf": {}, - "slot.5.widget": "", - "slot.5.conf": {}, - "slot.6.widget": "", - "slot.6.conf": {}, - "slot.7.widget": "", - "slot.7.conf": {} - }, - "images": { - "background": "${asset.url}/images/reception/stretch_blue.png", - "background.colour": "#8ee0ff", - "sun": "${asset.url}/images/reception/sun.png", - "drape": "${asset.url}/images/reception/drape.png", - "left": "", - "right": "", - "right.repeat": "" - } - }, - "achievements.unseen.ignored": [ - "ACH_AllTimeHotelPresence" - ], - "avatareditor.show.clubitems.dimmed": true, - "avatareditor.show.clubitems.first": true, - "chat.history.max.items": 100, - "currency.display.number.short": false, - "currency.asset.icon.url": "${images.url}/wallet/%type%.png", - "currency.seasonal.color": "blue", - "system.currency.types": [ -1, 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" - }, - "respect.options": { - "enabled": false, - "sound": "sound_respect_received" - }, - "catalog.asset.url": "${image.library.url}catalogue", - "catalog.asset.image.url": "${catalog.asset.url}/%name%.gif", - "catalog.asset.icon.url": "${catalog.asset.url}/icon_%name%.png", - "catalog.tab.icons": false, - "catalog.headers": false, - "catalog.gifts.show.my.face": true, - "chat.input.maxlength": 100, - "chat.styles.disabled": [], - "chat.styles": [ - { - "styleId": 0, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 1, - "minRank": 5, - "isSystemStyle": true, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 2, - "minRank": 5, - "isSystemStyle": true, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 3, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 4, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 5, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 6, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 7, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 8, - "minRank": 5, - "isSystemStyle": true, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 9, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 10, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 11, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 12, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 13, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 14, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 15, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 16, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 17, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 18, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 19, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 20, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 21, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 22, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 23, - "minRank": 5, - "isSystemStyle": false, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 24, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 25, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 26, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 27, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 28, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 29, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 30, - "minRank": 5, - "isSystemStyle": true, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 31, - "minRank": 5, - "isSystemStyle": true, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 32, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 33, - "minRank": 5, - "isSystemStyle": true, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 34, - "minRank": 5, - "isSystemStyle": true, - "isHcOnly": false, - "isAmbassadorOnly": false - }, - { - "styleId": 35, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 36, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - }, - { - "styleId": 37, - "minRank": 5, - "isSystemStyle": false, - "isHcOnly": false, - "isAmbassadorOnly": true - }, - { - "styleId": 38, - "minRank": 0, - "isSystemStyle": false, - "isHcOnly": true, - "isAmbassadorOnly": false - } - ], - "camera.available.effects": [ - { - "name": "dark_sepia", - "colorMatrix": [ - 0.4, - 0.4, - 0.1, - 0, - 110, - 0.3, - 0.4, - 0.1, - 0, - 30, - 0.3, - 0.2, - 0.1, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 0, - "enabled": true - }, - { - "name": "increase_saturation", - "colorMatrix": [ - 2, - -0.5, - -0.5, - 0, - 0, - -0.5, - 2, - -0.5, - 0, - 0, - -0.5, - -0.5, - 2, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 0, - "enabled": true - }, - { - "name": "increase_contrast", - "colorMatrix": [ - 1.5, - 0, - 0, - 0, - -50, - 0, - 1.5, - 0, - 0, - -50, - 0, - 0, - 1.5, - 0, - -50, - 0, - 0, - 0, - 1.5, - 0 - ], - "minLevel": 0, - "enabled": true - }, - { - "name": "shadow_multiply_02", - "colorMatrix": [], - "minLevel": 0, - "blendMode": 2, - "enabled": true - }, - { - "name": "color_1", - "colorMatrix": [ - 0.393, - 0.769, - 0.189, - 0, - 0, - 0.349, - 0.686, - 0.168, - 0, - 0, - 0.272, - 0.534, - 0.131, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 1, - "enabled": true - }, - { - "name": "hue_bright_sat", - "colorMatrix": [ - 1, - 0.6, - 0.2, - 0, - -50, - 0.2, - 1, - 0.6, - 0, - -50, - 0.6, - 0.2, - 1, - 0, - -50, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 1, - "enabled": true - }, - { - "name": "hearts_hardlight_02", - "colorMatrix": [], - "minLevel": 1, - "blendMode": 9, - "enabled": true - }, - { - "name": "texture_overlay", - "colorMatrix": [], - "minLevel": 1, - "blendMode": 4, - "enabled": true - }, - { - "name": "pinky_nrm", - "colorMatrix": [], - "minLevel": 1, - "blendMode": 0, - "enabled": true - }, - { - "name": "color_2", - "colorMatrix": [ - 0.333, - 0.333, - 0.333, - 0, - 0, - 0.333, - 0.333, - 0.333, - 0, - 0, - 0.333, - 0.333, - 0.333, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 2, - "enabled": true - }, - { - "name": "night_vision", - "colorMatrix": [ - 0, - 0, - 0, - 0, - 0, - 0, - 1.1, - 0, - 0, - -50, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 2, - "enabled": true - }, - { - "name": "stars_hardlight_02", - "colorMatrix": [], - "minLevel": 2, - "blendMode": 9, - "enabled": true - }, - { - "name": "coffee_mpl", - "colorMatrix": [], - "minLevel": 2, - "blendMode": 2, - "enabled": true - }, - { - "name": "security_hardlight", - "colorMatrix": [], - "minLevel": 3, - "blendMode": 9, - "enabled": true - }, - { - "name": "bluemood_mpl", - "colorMatrix": [], - "minLevel": 3, - "blendMode": 2, - "enabled": true - }, - { - "name": "rusty_mpl", - "colorMatrix": [], - "minLevel": 3, - "blendMode": 2, - "enabled": true - }, - { - "name": "decr_conrast", - "colorMatrix": [ - 0.5, - 0, - 0, - 0, - 50, - 0, - 0.5, - 0, - 0, - 50, - 0, - 0, - 0.5, - 0, - 50, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 4, - "enabled": true - }, - { - "name": "green_2", - "colorMatrix": [ - 0.5, - 0.5, - 0.5, - 0, - 0, - 0.5, - 0.5, - 0.5, - 0, - 90, - 0.5, - 0.5, - 0.5, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 4, - "enabled": true - }, - { - "name": "alien_hrd", - "colorMatrix": [], - "minLevel": 4, - "blendMode": 9, - "enabled": true - }, - { - "name": "color_3", - "colorMatrix": [ - 0.609, - 0.609, - 0.082, - 0, - 0, - 0.309, - 0.609, - 0.082, - 0, - 0, - 0.309, - 0.609, - 0.082, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 5, - "enabled": true - }, - { - "name": "color_4", - "colorMatrix": [ - 0.8, - -0.8, - 1, - 0, - 70, - 0.8, - -0.8, - 1, - 0, - 70, - 0.8, - -0.8, - 1, - 0, - 70, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 5, - "enabled": true - }, - { - "name": "toxic_hrd", - "colorMatrix": [], - "minLevel": 5, - "blendMode": 9, - "enabled": true - }, - { - "name": "hypersaturated", - "colorMatrix": [ - 2, - -1, - 0, - 0, - 0, - -1, - 2, - 0, - 0, - 0, - 0, - -1, - 2, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 6, - "enabled": true - }, - { - "name": "Yellow", - "colorMatrix": [ - 1, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 6, - "enabled": true - }, - { - "name": "misty_hrd", - "colorMatrix": [], - "minLevel": 6, - "blendMode": 9, - "enabled": true - }, - { - "name": "x_ray", - "colorMatrix": [ - 0, - 1.2, - 0, - 0, - -100, - 0, - 2, - 0, - 0, - -120, - 0, - 2, - 0, - 0, - -120, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 7, - "enabled": true - }, - { - "name": "decrease_saturation", - "colorMatrix": [ - 0.7, - 0.2, - 0.2, - 0, - 0, - 0.2, - 0.7, - 0.2, - 0, - 0, - 0.2, - 0.2, - 0.7, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 7, - "enabled": true - }, - { - "name": "drops_mpl", - "colorMatrix": [], - "minLevel": 8, - "blendMode": 2, - "enabled": true - }, - { - "name": "shiny_hrd", - "colorMatrix": [], - "minLevel": 9, - "blendMode": 9, - "enabled": true - }, - { - "name": "glitter_hrd", - "colorMatrix": [], - "minLevel": 10, - "blendMode": 9, - "enabled": true - }, - { - "name": "frame_gold", - "colorMatrix": [], - "minLevel": 10, - "blendMode": 0, - "enabled": true - }, - { - "name": "frame_gray_4", - "colorMatrix": [], - "minLevel": 10, - "blendMode": 0, - "enabled": true - }, - { - "name": "frame_black_2", - "colorMatrix": [], - "minLevel": 10, - "blendMode": 0, - "enabled": true - }, - { - "name": "frame_wood_2", - "colorMatrix": [], - "minLevel": 10, - "blendMode": 0, - "enabled": true - }, - { - "name": "finger_nrm", - "colorMatrix": [], - "minLevel": 10, - "blendMode": 0, - "enabled": true - }, - { - "name": "color_5", - "colorMatrix": [ - 3.309, - 0.609, - 1.082, - 0.2, - 0, - 0.309, - 0.609, - 0.082, - 0, - 0, - 1.309, - 0.609, - 0.082, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 10, - "enabled": true - }, - { - "name": "black_white_negative", - "colorMatrix": [ - -0.5, - -0.5, - -0.5, - 0, - 0, - -0.5, - -0.5, - -0.5, - 0, - 0, - -0.5, - -0.5, - -0.5, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 10, - "enabled": true - }, - { - "name": "blue", - "colorMatrix": [ - 0.5, - 0.5, - 0.5, - 0, - -255, - 0.5, - 0.5, - 0.5, - 0, - -170, - 0.5, - 0.5, - 0.5, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 10, - "enabled": true - }, - { - "name": "red", - "colorMatrix": [ - 0.5, - 0.5, - 0.5, - 0, - 0, - 0.5, - 0.5, - 0.5, - 0, - -170, - 0.5, - 0.5, - 0.5, - 0, - -170, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 10, - "enabled": true - }, - { - "name": "green", - "colorMatrix": [ - 0.5, - 0.5, - 0.5, - 0, - -170, - 0.5, - 0.5, - 0.5, - 0, - 0, - 0.5, - 0.5, - 0.5, - 0, - -170, - 0, - 0, - 0, - 1, - 0 - ], - "minLevel": 10, - "enabled": true - } - ], - "notification": { - "notification.admin.transient": { - "display": "POP_UP", - "image": "${image.library.url}/album1358/frank_wave_001.gif" - }, - "notification.builders_club.membership_expired": { - "display": "POP_UP" - }, - "notification.builders_club.membership_expires": { - "display": "POP_UP", - "image": "${image.library.url}/notifications/builders_club_room_locked_small.png" - }, - "notification.builders_club.membership_extended": { - "delivery": "PERSISTENT", - "display": "POP_UP" - }, - "notification.builders_club.membership_made": { - "delivery": "PERSISTENT", - "display": "POP_UP", - "image": "${image.library.url}/notifications/builders_club_membership_extended.png" - }, - "notification.builders_club.membership_renewed": { - "delivery": "PERSISTENT", - "display": "POP_UP", - "image": "${image.library.url}/notifications/builders_club_membership_extended.png" - }, - "notification.builders_club.room_locked": { - "display": "BUBBLE", - "image": "${image.library.url}/notifications/builders_club_room_locked_small.png" - }, - "notification.builders_club.room_unlocked": { - "display": "BUBBLE" - }, - "notification.builders_club.visit_denied_for_owner": { - "display": "BUBBLE", - "image": "${image.library.url}/notifications/builders_club_room_locked_small.png" - }, - "notification.builders_club.visit_denied_for_visitor": { - "display": "POP_UP", - "image": "${image.library.url}/notifications/builders_club_room_locked.png" - }, - "notification.campaign.credit.donation": { - "display": "BUBBLE" - }, - "notification.campaign.product.donation": { - "display": "BUBBLE" - }, - "notification.casino.too_many_dice.placement": { - "display": "POP_UP" - }, - "notification.casino.too_many_dice": { - "display": "POP_UP" - }, - "notification.cfh.created": { - "display": "POP_UP", - "title": "" - }, - "notification.feed.enabled": false, - "notification.floorplan_editor.error": { - "display": "POP_UP" - }, - "notification.forums.delivered": { - "delivery": "PERSISTENT", - "display": "POP_UP" - }, - "notification.forums.forum_settings_updated": { - "display": "BUBBLE" - }, - "notification.forums.message.hidden": { - "display": "BUBBLE" - }, - "notification.forums.message.restored": { - "display": "BUBBLE" - }, - "notification.forums.thread.hidden": { - "display": "BUBBLE" - }, - "notification.forums.thread.locked": { - "display": "BUBBLE" - }, - "notification.forums.thread.pinned": { - "display": "BUBBLE" - }, - "notification.forums.thread.restored": { - "display": "BUBBLE" - }, - "notification.forums.thread.unlocked": { - "display": "BUBBLE" - }, - "notification.forums.thread.unpinned": { - "display": "BUBBLE" - }, - "notification.furni_placement_error": { - "display": "BUBBLE" - }, - "notification.gifting.valentine": { - "delivery": "PERSISTENT", - "display": "BUBBLE", - "image": "${image.library.url}/notifications/polaroid_photo.png" - }, - "notification.items.enabled": true, - "notification.mute.forbidden.time": { - "display": "BUBBLE" - }, - "notification.npc.gift.received": { - "display": "BUBBLE", - "image": "${image.library.url}/album1584/X1517.gif" - } - } -} diff --git a/src/App.scss b/src/App.scss index bd107ef..2000ade 100644 --- a/src/App.scss +++ b/src/App.scss @@ -21,26 +21,21 @@ $toolbar-height: 55px; $achievement-width: 375px; $achievement-height: 405px; -$avatar-editor-width: 520px; -$avatar-editor-height: 553px; +$avatar-editor-width: 620px; +$avatar-editor-height: 374px; -$catalog-width: 650px; -$catalog-height: 480px; +$catalog-width: 630px; +$catalog-height: 400px; $inventory-width: 528px; -$inventory-height: 370px; +$inventory-height: 320px; -$navigator-width: 425px; -$navigator-height: 560px; -$navigator-min-height: 205px; - -$nitro-room-creator-width: 585px; -$nitro-room-creator-height: 365px; +$navigator-width: 420px; +$navigator-height: 440px; $chat-input-style-selector-widget-width: 210px; $chat-input-style-selector-widget-height: 200px; - $user-profile-width: 470px; $user-profile-height: 460px; @@ -65,17 +60,14 @@ $help-height: 290px; $nitropedia-width: 400px; $nitropedia-height: 400px; -$nitrobubblehidden-width: 400px; -$nitrobubblehidden-height: 400px; - -$messenger-width: 580px; -$messenger-height: 455px; +$messenger-width: 500px; +$messenger-height: 370px; $marketplace-post-offer-width: 430px; $marketplace-post-offer-height: 250px; $camera-editor-width: 600px; -$camera-editor-height: 540px; +$camera-editor-height: 500px; $camera-checkout-width: 350px; diff --git a/src/App.tsx b/src/App.tsx index 072b05d..ec9b037 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,141 +1,104 @@ -import { ConfigurationEvent, GetAssetManager, HabboWebTools, LegacyExternalInterface, Nitro, NitroCommunicationDemoEvent, NitroConfiguration, NitroEvent, NitroLocalizationEvent, NitroVersion, RoomEngineEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { GetCommunication, GetConfiguration, GetNitroInstance, GetUIVersion } from './api'; -import { Base, TransitionAnimation, TransitionAnimationTypes } from './common'; +import { GetAssetManager, GetAvatarRenderManager, GetCommunication, GetConfiguration, GetLocalizationManager, GetRoomEngine, GetRoomSessionManager, GetSessionDataManager, GetSoundManager, GetStage, GetTexturePool, GetTicker, HabboWebTools, LegacyExternalInterface, LoadGameUrlEvent, NitroLogger, NitroVersion, PrepareRenderer } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; +import { GetUIVersion } from './api'; +import { MainView } from './components/MainView'; import { LoadingView } from './components/loading/LoadingView'; -import { MainView } from './components/main/MainView'; -import { useConfigurationEvent, useLocalizationEvent, useMainEvent, useRoomEngineEvent } from './hooks'; +import { useMessageEvent } from './hooks'; +import { classNames } from './layout'; NitroVersion.UI_VERSION = GetUIVersion(); -export const App: FC<{}> = props => +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); - const [ imageRendering, setImageRendering ] = useState(true); + const [isReady, setIsReady] = useState(false); - if(!GetNitroInstance()) + useMessageEvent(LoadGameUrlEvent, (event) => { - //@ts-ignore - if(!NitroConfig) throw new Error('NitroConfig is not defined!'); + const parser = event.getParser(); - Nitro.bootstrap(); - } + if(!parser) return; - const handler = useCallback(async (event: NitroEvent) => - { - switch(event.type) - { - case ConfigurationEvent.LOADED: - GetNitroInstance().localization.init(); - setPercent(prevValue => (prevValue + 20)); - return; - case ConfigurationEvent.FAILED: - setIsError(true); - setMessage('Configuration Failed'); - return; - case Nitro.WEBGL_UNAVAILABLE: - setIsError(true); - setMessage('WebGL Required'); - return; - case Nitro.WEBGL_CONTEXT_LOST: - setIsError(true); - setMessage('WebGL Context Lost - Reloading'); - - setTimeout(() => window.location.reload(), 1500); - return; - case NitroCommunicationDemoEvent.CONNECTION_HANDSHAKING: - setPercent(prevValue => (prevValue + 20)); - return; - case NitroCommunicationDemoEvent.CONNECTION_HANDSHAKE_FAILED: - setIsError(true); - setMessage('Handshake Failed'); - return; - case NitroCommunicationDemoEvent.CONNECTION_AUTHENTICATED: - setPercent(prevValue => (prevValue + 20)); - - GetNitroInstance().init(); - - if(LegacyExternalInterface.available) LegacyExternalInterface.call('legacyTrack', 'authentication', 'authok', []); - return; - case NitroCommunicationDemoEvent.CONNECTION_ERROR: - setIsError(true); - setMessage('Connection Error'); - 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: - setPercent(prevValue => (prevValue + 20)); - - setTimeout(() => setIsReady(true), 300); - return; - case NitroLocalizationEvent.LOADED: { - const assetUrls = GetConfiguration('preload.assets.urls'); - const urls: string[] = []; - - if(assetUrls && assetUrls.length) for(const url of assetUrls) urls.push(NitroConfiguration.interpolate(url)); - - const status = await GetAssetManager().downloadAssets(urls); - - if(status) - { - GetCommunication().init(); - - setPercent(prevValue => (prevValue + 20)) - } - else - { - setIsError(true); - setMessage('Assets Failed'); - } - return; - } - } - }, []); - - 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); + LegacyExternalInterface.callGame('showGame', parser.url); + }); useEffect(() => { - GetNitroInstance().core.configuration.init(); - - const resize = (event: UIEvent) => setImageRendering(!(window.devicePixelRatio % 1)); - - window.addEventListener('resize', resize); - - resize(null); - - return () => + const prepare = async (width: number, height: number) => { - window.removeEventListener('resize', resize); - } + try + { + if(!window.NitroConfig) + throw new Error('NitroConfig is not defined!'); + + const renderer = await PrepareRenderer({ + width: Math.floor(width), + height: Math.floor(height), + resolution: window.devicePixelRatio, + autoDensity: true, + backgroundAlpha: 0, + preference: 'webgl', + eventMode: 'none', + failIfMajorPerformanceCaveat: false, + roundPixels: true + }); + + await GetConfiguration().init(); + + GetTicker().maxFPS = GetConfiguration().getValue('system.fps.max', 24); + NitroLogger.LOG_DEBUG = GetConfiguration().getValue('system.log.debug', true); + NitroLogger.LOG_WARN = GetConfiguration().getValue('system.log.warn', false); + NitroLogger.LOG_ERROR = GetConfiguration().getValue('system.log.error', false); + NitroLogger.LOG_EVENTS = GetConfiguration().getValue('system.log.events', false); + NitroLogger.LOG_PACKETS = GetConfiguration().getValue('system.log.packets', false); + + const assetUrls = GetConfiguration().getValue('preload.assets.urls').map(url => GetConfiguration().interpolate(url)) ?? []; + + await Promise.all( + [ + GetAssetManager().downloadAssets(assetUrls), + GetLocalizationManager().init(), + GetAvatarRenderManager().init(), + GetSoundManager().init(), + GetSessionDataManager().init(), + GetRoomSessionManager().init() + ] + ); + + await GetRoomEngine().init(); + await GetCommunication().init(); + + // new GameMessageHandler(); + + if(LegacyExternalInterface.available) LegacyExternalInterface.call('legacyTrack', 'authentication', 'authok', []); + + HabboWebTools.sendHeartBeat(); + + setInterval(() => HabboWebTools.sendHeartBeat(), 10000); + + GetTicker().add((ticker) => GetRoomEngine().update(ticker)); + GetTicker().add((ticker) => renderer.render(GetStage())); + GetTicker().add((ticker) => GetTexturePool().run()); + + setIsReady(true); + + // handle socket close + //canvas.addEventListener('webglcontextlost', () => instance.events.dispatchEvent(new NitroEvent(Nitro.WEBGL_CONTEXT_LOST))); + } + catch (err) + { + NitroLogger.error(err); + } + }; + + prepare(window.innerWidth, window.innerHeight); }, []); - + return ( - - { (!isReady || isError) && - } - - - - - +
+ {!isReady && } + {isReady && } +
+
); -} +}; diff --git a/src/api/GetUIVersion.ts b/src/api/GetUIVersion.ts index cf8d5a5..bdbe922 100644 --- a/src/api/GetUIVersion.ts +++ b/src/api/GetUIVersion.ts @@ -1 +1 @@ -export const GetUIVersion = () => '2.1.1'; +export const GetUIVersion = () => '2.2.0'; diff --git a/src/api/achievements/AchievementUtilities.ts b/src/api/achievements/AchievementUtilities.ts index b581f97..30f1403 100644 --- a/src/api/achievements/AchievementUtilities.ts +++ b/src/api/achievements/AchievementUtilities.ts @@ -1,5 +1,5 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; -import { GetConfiguration, GetLocalization } from '../nitro'; +import { AchievementData, GetLocalizationManager } from '@nitrots/nitro-renderer'; +import { GetConfigurationValue } from '../nitro'; import { IAchievementCategory } from './IAchievementCategory'; export class AchievementUtilities @@ -7,91 +7,91 @@ export class AchievementUtilities public static getAchievementBadgeCode(achievement: AchievementData): string { if(!achievement) return null; - + let badgeId = achievement.badgeId; - - if(!achievement.finalLevel) badgeId = GetLocalization().getPreviousLevelBadgeId(badgeId); - + + if(!achievement.finalLevel) badgeId = GetLocalizationManager().getPreviousLevelBadgeId(badgeId); + return badgeId; } public static getAchievementCategoryImageUrl(category: IAchievementCategory, progress: number = null, icon: boolean = false): string { - const imageUrl = GetConfiguration('achievements.images.url'); - + const imageUrl = GetConfigurationValue('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 ignored = GetConfigurationValue('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/avatar/AvatarEditorColorSorter.ts b/src/api/avatar/AvatarEditorColorSorter.ts new file mode 100644 index 0000000..7ae5960 --- /dev/null +++ b/src/api/avatar/AvatarEditorColorSorter.ts @@ -0,0 +1,17 @@ +import { IPartColor } from '@nitrots/nitro-renderer'; + +export const AvatarEditorColorSorter = (a: IPartColor, b: IPartColor) => +{ + const clubLevelA = (!a ? -1 : a.clubLevel); + const clubLevelB = (!b ? -1 : b.clubLevel); + + if(clubLevelA < clubLevelB) return -1; + + if(clubLevelA > clubLevelB) return 1; + + if(a.index < b.index) return -1; + + if(a.index > b.index) return 1; + + return 0; +}; diff --git a/src/api/avatar/AvatarEditorGridColorItem.ts b/src/api/avatar/AvatarEditorGridColorItem.ts deleted file mode 100644 index dee3dae..0000000 --- a/src/api/avatar/AvatarEditorGridColorItem.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { ColorConverter, IPartColor } from '@nitrots/nitro-renderer'; - -export class AvatarEditorGridColorItem -{ - private _partColor: IPartColor; - private _isDisabled: boolean; - private _isHC: boolean; - private _isSelected: boolean; - private _notifier: () => void; - - constructor(partColor: IPartColor, isDisabled: boolean = false) - { - this._partColor = partColor; - this._isDisabled = isDisabled; - this._isHC = (this._partColor.clubLevel > 0); - this._isSelected = false; - } - - public dispose(): void - { - this._partColor = null; - } - - public get partColor(): IPartColor - { - return this._partColor; - } - - public get color(): string - { - return ColorConverter.int2rgb(this._partColor.rgb); - } - - public get isDisabled(): boolean - { - return this._isDisabled; - } - - public get isHC(): boolean - { - return this._isHC; - } - - public get isSelected(): boolean - { - return this._isSelected; - } - - public set isSelected(flag: boolean) - { - this._isSelected = flag; - - if(this.notify) this.notify(); - } - - public get notify(): () => void - { - return this._notifier; - } - - public set notify(notifier: () => void) - { - this._notifier = notifier; - } -} diff --git a/src/api/avatar/AvatarEditorGridPartItem.ts b/src/api/avatar/AvatarEditorGridPartItem.ts deleted file mode 100644 index a3b1661..0000000 --- a/src/api/avatar/AvatarEditorGridPartItem.ts +++ /dev/null @@ -1,337 +0,0 @@ -import { AvatarFigurePartType, IAvatarImageListener, IAvatarRenderManager, IFigurePart, IFigurePartSet, IGraphicAsset, IPartColor, NitroAlphaFilter, NitroContainer, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; -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[] = [ - AvatarFigurePartType.LEFT_HAND_ITEM, - AvatarFigurePartType.LEFT_HAND, - AvatarFigurePartType.LEFT_SLEEVE, - AvatarFigurePartType.LEFT_COAT_SLEEVE, - AvatarFigurePartType.BODY, - AvatarFigurePartType.SHOES, - AvatarFigurePartType.LEGS, - AvatarFigurePartType.CHEST, - AvatarFigurePartType.CHEST_ACCESSORY, - AvatarFigurePartType.COAT_CHEST, - AvatarFigurePartType.CHEST_PRINT, - AvatarFigurePartType.WAIST_ACCESSORY, - AvatarFigurePartType.RIGHT_HAND, - AvatarFigurePartType.RIGHT_SLEEVE, - AvatarFigurePartType.RIGHT_COAT_SLEEVE, - AvatarFigurePartType.HEAD, - AvatarFigurePartType.FACE, - AvatarFigurePartType.EYES, - AvatarFigurePartType.HAIR, - AvatarFigurePartType.HAIR_BIG, - AvatarFigurePartType.FACE_ACCESSORY, - AvatarFigurePartType.EYE_ACCESSORY, - AvatarFigurePartType.HEAD_ACCESSORY, - AvatarFigurePartType.HEAD_ACCESSORY_EXTRA, - AvatarFigurePartType.RIGHT_HAND_ITEM, - ]; - - private _renderManager: IAvatarRenderManager; - private _partSet: IFigurePartSet; - private _partColors: IPartColor[]; - private _useColors: boolean; - private _isDisabled: boolean; - private _thumbContainer: NitroContainer; - private _imageUrl: string; - private _maxColorIndex: number; - private _isValidFigure: boolean; - private _isHC: boolean; - private _isSellable: boolean; - private _isClear: boolean; - private _isSelected: boolean; - private _disposed: boolean; - private _isInitalized: boolean; - private _notifier: () => void; - - constructor(partSet: IFigurePartSet, partColors: IPartColor[], useColors: boolean = true, isDisabled: boolean = false) - { - this._renderManager = GetAvatarRenderManager(); - this._partSet = partSet; - this._partColors = partColors; - this._useColors = useColors; - this._isDisabled = isDisabled; - this._thumbContainer = null; - this._imageUrl = null; - this._maxColorIndex = 0; - this._isValidFigure = false; - this._isHC = false; - this._isSellable = false; - this._isClear = false; - this._isSelected = false; - this._disposed = false; - this._isInitalized = false; - - if(partSet) - { - const colors = partSet.parts; - - for(const color of colors) this._maxColorIndex = Math.max(this._maxColorIndex, color.colorLayerIndex); - } - } - - public init(): void - { - if(this._isInitalized) return; - - this._isInitalized = true; - - this.update(); - } - - public dispose(): void - { - if(this._disposed) return; - - this._renderManager = null; - this._partSet = null; - this._partColors = null; - this._imageUrl = null; - this._disposed = true; - this._isInitalized = false; - - if(this._thumbContainer) - { - this._thumbContainer.destroy(); - - this._thumbContainer = null; - } - } - - public update(): void - { - this.updateThumbVisualization(); - } - - private analyzeFigure(): boolean - { - if(!this._renderManager || !this._partSet || !this._partSet.parts || !this._partSet.parts.length) return false; - - const figureContainer = this._renderManager.createFigureContainer(((this.partSet.type + '-') + this.partSet.id)); - - if(!this._renderManager.isFigureContainerReady(figureContainer)) - { - this._renderManager.downloadAvatarFigure(figureContainer, this); - - return false; - } - - this._isValidFigure = true; - - return true; - } - - private renderThumb(): NitroContainer - { - if(!this._renderManager || !this._partSet) return null; - - if(!this._isValidFigure) - { - if(!this.analyzeFigure()) return null; - } - - const parts = this._partSet.parts.concat().sort(this.sortByDrawOrder); - const container = new NitroContainer(); - - for(const part of parts) - { - if(!part) continue; - - let asset: IGraphicAsset = null; - let direction = 0; - let hasAsset = false; - - while(!hasAsset && (direction < AvatarEditorGridPartItem.THUMB_DIRECTIONS.length)) - { - const assetName = ((((((((((FigureData.SCALE + '_') + FigureData.STD) + '_') + part.type) + '_') + part.id) + '_') + AvatarEditorGridPartItem.THUMB_DIRECTIONS[direction]) + '_') + FigureData.DEFAULT_FRAME); - - asset = this._renderManager.getAssetByName(assetName); - - if(asset && asset.texture) - { - hasAsset = true; - } - else - { - direction++; - } - } - - if(!hasAsset) continue; - - const x = asset.offsetX; - const y = asset.offsetY; - let partColor: IPartColor = null; - - if(this._useColors && (part.colorLayerIndex > 0)) - { - const color = this._partColors[(part.colorLayerIndex - 1)]; - - if(color) partColor = color; - } - - const sprite = new NitroSprite(asset.texture); - - sprite.position.set(x, y); - - if(partColor) sprite.tint = partColor.rgb; - - container.addChild(sprite); - } - - return container; - } - - private updateThumbVisualization(): void - { - if(!this._isInitalized) return; - - let container = this._thumbContainer; - - if(!container) container = this.renderThumb(); - - if(!container) return; - - if(this._partSet) - { - this._isHC = (this._partSet.clubLevel > 0); - this._isSellable = this._partSet.isSellable; - } - else - { - this._isHC = false; - this._isSellable = false; - } - - if(this._isDisabled) this.setAlpha(container, 0.2); - - this._imageUrl = TextureUtils.generateImageUrl(container); - - if(this.notify) this.notify(); - } - - private setAlpha(container: NitroContainer, alpha: number): NitroContainer - { - container.filters = [ AvatarEditorGridPartItem.ALPHA_FILTER ]; - - return container; - } - - private sortByDrawOrder(a: IFigurePart, b: IFigurePart): number - { - const indexA = AvatarEditorGridPartItem.DRAW_ORDER.indexOf(a.type); - const indexB = AvatarEditorGridPartItem.DRAW_ORDER.indexOf(b.type); - - if(indexA < indexB) return -1; - - if(indexA > indexB) return 1; - - if(a.index < b.index) return -1; - - if(a.index > b.index) return 1; - - return 0; - } - - public resetFigure(figure: string): void - { - if(!this.analyzeFigure()) return; - - this.update(); - } - - public get disposed(): boolean - { - return this._disposed; - } - - public get id(): number - { - if(!this._partSet) return -1; - - return this._partSet.id; - } - - public get partSet(): IFigurePartSet - { - return this._partSet; - } - - public set partColors(partColors: IPartColor[]) - { - this._partColors = partColors; - - this.update(); - } - - public get isDisabled(): boolean - { - return this._isDisabled; - } - - public set thumbContainer(container: NitroContainer) - { - this._thumbContainer = container; - - this.update(); - } - - public get imageUrl(): string - { - return this._imageUrl; - } - - public get maxColorIndex(): number - { - return this._maxColorIndex; - } - - public get isHC(): boolean - { - return this._isHC; - } - - public get isSellable(): boolean - { - return this._isSellable; - } - - public get isClear(): boolean - { - return this._isClear; - } - - public set isClear(flag: boolean) - { - this._isClear = flag; - } - - public get isSelected(): boolean - { - return this._isSelected; - } - - public set isSelected(flag: boolean) - { - this._isSelected = flag; - - if(this.notify) this.notify(); - } - - public get notify(): () => void - { - return this._notifier; - } - - public set notify(notifier: () => void) - { - this._notifier = notifier; - } -} diff --git a/src/api/avatar/AvatarEditorPartSorter.ts b/src/api/avatar/AvatarEditorPartSorter.ts new file mode 100644 index 0000000..41e98d8 --- /dev/null +++ b/src/api/avatar/AvatarEditorPartSorter.ts @@ -0,0 +1,35 @@ +import { IFigurePartSet } from '@nitrots/nitro-renderer'; + +export const AvatarEditorPartSorter = (hcFirst: boolean) => +{ + return (a: { partSet: IFigurePartSet, usesColor: boolean, isClear?: boolean }, b: { partSet: IFigurePartSet, usesColor: boolean, isClear?: boolean }) => + { + const clubLevelA = (!a.partSet ? -1 : a.partSet.clubLevel); + const clubLevelB = (!b.partSet ? -1 : b.partSet.clubLevel); + const isSellableA = (!a.partSet ? false : a.partSet.isSellable); + const isSellableB = (!b.partSet ? false : b.partSet.isSellable); + + if(isSellableA && !isSellableB) return 1; + + if(isSellableB && !isSellableA) return -1; + + if(hcFirst) + { + if(clubLevelA > clubLevelB) return -1; + + if(clubLevelA < clubLevelB) return 1; + } + else + { + if(clubLevelA < clubLevelB) return -1; + + if(clubLevelA > clubLevelB) return 1; + } + + if(a.partSet.id < b.partSet.id) return -1; + + if(a.partSet.id > b.partSet.id) return 1; + + return 0; + }; +}; diff --git a/src/api/avatar/AvatarEditorThumbnailsHelper.ts b/src/api/avatar/AvatarEditorThumbnailsHelper.ts new file mode 100644 index 0000000..88a7906 --- /dev/null +++ b/src/api/avatar/AvatarEditorThumbnailsHelper.ts @@ -0,0 +1,196 @@ +import { AvatarFigurePartType, AvatarScaleType, AvatarSetType, GetAssetManager, GetAvatarRenderManager, IFigurePart, IGraphicAsset, IPartColor, NitroAlphaFilter, NitroContainer, NitroRectangle, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; +import { IAvatarEditorCategoryPartItem } from './IAvatarEditorCategoryPartItem'; + +export class AvatarEditorThumbnailsHelper +{ + private static THUMBNAIL_CACHE: Map = new Map(); + private static THUMB_DIRECTIONS: number[] = [ 2, 6, 0, 4, 3, 1 ]; + private static ALPHA_FILTER: NitroAlphaFilter = new NitroAlphaFilter({ alpha: 0.2 }); + private static DRAW_ORDER: string[] = [ + AvatarFigurePartType.LEFT_HAND_ITEM, + AvatarFigurePartType.LEFT_HAND, + AvatarFigurePartType.LEFT_SLEEVE, + AvatarFigurePartType.LEFT_COAT_SLEEVE, + AvatarFigurePartType.BODY, + AvatarFigurePartType.SHOES, + AvatarFigurePartType.LEGS, + AvatarFigurePartType.CHEST, + AvatarFigurePartType.CHEST_ACCESSORY, + AvatarFigurePartType.COAT_CHEST, + AvatarFigurePartType.CHEST_PRINT, + AvatarFigurePartType.WAIST_ACCESSORY, + AvatarFigurePartType.RIGHT_HAND, + AvatarFigurePartType.RIGHT_SLEEVE, + AvatarFigurePartType.RIGHT_COAT_SLEEVE, + AvatarFigurePartType.HEAD, + AvatarFigurePartType.FACE, + AvatarFigurePartType.EYES, + AvatarFigurePartType.HAIR, + AvatarFigurePartType.HAIR_BIG, + AvatarFigurePartType.FACE_ACCESSORY, + AvatarFigurePartType.EYE_ACCESSORY, + AvatarFigurePartType.HEAD_ACCESSORY, + AvatarFigurePartType.HEAD_ACCESSORY_EXTRA, + AvatarFigurePartType.RIGHT_HAND_ITEM, + ]; + + private static getThumbnailKey(setType: string, part: IAvatarEditorCategoryPartItem): string + { + return `${ setType }-${ part.partSet.id }`; + } + + public static clearCache(): void + { + this.THUMBNAIL_CACHE.clear(); + } + + public static async build(setType: string, part: IAvatarEditorCategoryPartItem, useColors: boolean, partColors: IPartColor[], isDisabled: boolean = false): Promise + { + if(!setType || !setType.length || !part || !part.partSet || !part.partSet.parts || !part.partSet.parts.length) return null; + + const thumbnailKey = this.getThumbnailKey(setType, part); + const cached = this.THUMBNAIL_CACHE.get(thumbnailKey); + + if(cached) return cached; + + const buildContainer = (part: IAvatarEditorCategoryPartItem, useColors: boolean, partColors: IPartColor[], isDisabled: boolean = false) => + { + const container = new NitroContainer(); + const parts = part.partSet.parts.concat().sort(this.sortByDrawOrder); + + for(const part of parts) + { + if(!part) continue; + + let asset: IGraphicAsset = null; + let direction = 0; + let hasAsset = false; + + while(!hasAsset && (direction < AvatarEditorThumbnailsHelper.THUMB_DIRECTIONS.length)) + { + const assetName = `${ AvatarFigurePartType.SCALE }_${ AvatarFigurePartType.STD }_${ part.type }_${ part.id }_${ AvatarEditorThumbnailsHelper.THUMB_DIRECTIONS[direction] }_${ AvatarFigurePartType.DEFAULT_FRAME }`; + + asset = GetAssetManager().getAsset(assetName); + + if(asset && asset.texture) + { + hasAsset = true; + } + else + { + direction++; + } + } + + if(!hasAsset) + { + console.log(`${ AvatarFigurePartType.SCALE }_${ AvatarFigurePartType.STD }_${ part.type }_${ part.id }`); + continue; + } + + const x = asset.offsetX; + const y = asset.offsetY; + + const sprite = new NitroSprite(asset.texture); + + sprite.position.set(x, y); + + if(useColors && (part.colorLayerIndex > 0) && partColors && partColors.length) + { + const color = partColors[(part.colorLayerIndex - 1)]; + + if(color) sprite.tint = color.rgb; + } + + if(isDisabled) container.filters = [ AvatarEditorThumbnailsHelper.ALPHA_FILTER ]; + + container.addChild(sprite); + } + + return container; + }; + + return new Promise(async (resolve, reject) => + { + const resetFigure = async (figure: string) => + { + const container = buildContainer(part, useColors, partColors, isDisabled); + const imageUrl = await TextureUtils.generateImageUrl(container); + + AvatarEditorThumbnailsHelper.THUMBNAIL_CACHE.set(thumbnailKey, imageUrl); + + resolve(imageUrl); + }; + + const figureContainer = GetAvatarRenderManager().createFigureContainer(`${ setType }-${ part.partSet.id }`); + + if(!GetAvatarRenderManager().isFigureContainerReady(figureContainer)) + { + GetAvatarRenderManager().downloadAvatarFigure(figureContainer, { + resetFigure, + dispose: null, + disposed: false + }); + } + else + { + resetFigure(null); + } + }); + } + + public static async buildForFace(figureString: string, isDisabled: boolean = false): Promise + { + if(!figureString || !figureString.length) return null; + + const thumbnailKey = figureString; + const cached = this.THUMBNAIL_CACHE.get(thumbnailKey); + + if(cached) return cached; + + return new Promise(async (resolve, reject) => + { + const resetFigure = async (figure: string) => + { + const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, null, { resetFigure, dispose: null, disposed: false }); + + if(avatarImage.isPlaceholder()) return; + + const texture = avatarImage.processAsTexture(AvatarSetType.HEAD, false); + const sprite = new NitroSprite(texture); + + if(isDisabled) sprite.filters = [ AvatarEditorThumbnailsHelper.ALPHA_FILTER ]; + + const imageUrl = await TextureUtils.generateImageUrl({ + target: sprite, + frame: new NitroRectangle(0, 0, texture.width, texture.height) + }); + + sprite.destroy(); + avatarImage.dispose(); + + AvatarEditorThumbnailsHelper.THUMBNAIL_CACHE.set(thumbnailKey, imageUrl); + + resolve(imageUrl); + }; + + resetFigure(figureString); + }); + } + + private static sortByDrawOrder(a: IFigurePart, b: IFigurePart): number + { + const indexA = AvatarEditorThumbnailsHelper.DRAW_ORDER.indexOf(a.type); + const indexB = AvatarEditorThumbnailsHelper.DRAW_ORDER.indexOf(b.type); + + if(indexA < indexB) return -1; + + if(indexA > indexB) return 1; + + if(a.index < b.index) return -1; + + if(a.index > b.index) return 1; + + return 0; + } +} diff --git a/src/api/avatar/AvatarEditorUtilities.ts b/src/api/avatar/AvatarEditorUtilities.ts deleted file mode 100644 index 3626ab8..0000000 --- a/src/api/avatar/AvatarEditorUtilities.ts +++ /dev/null @@ -1,277 +0,0 @@ -import { IPartColor } from '@nitrots/nitro-renderer'; -import { GetAvatarPalette, GetAvatarRenderManager, GetAvatarSetType, GetClubMemberLevel, GetConfiguration } from '../nitro'; -import { AvatarEditorGridColorItem } from './AvatarEditorGridColorItem'; -import { AvatarEditorGridPartItem } from './AvatarEditorGridPartItem'; -import { CategoryBaseModel } from './CategoryBaseModel'; -import { CategoryData } from './CategoryData'; -import { FigureData } from './FigureData'; - -export class AvatarEditorUtilities -{ - private static MAX_PALETTES: number = 2; - - public static CURRENT_FIGURE: FigureData = null; - public static FIGURE_SET_IDS: number[] = []; - public static BOUND_FURNITURE_NAMES: string[] = []; - - public static getGender(gender: string): string - { - switch(gender) - { - case FigureData.MALE: - case 'm': - case 'M': - gender = FigureData.MALE; - break; - case FigureData.FEMALE: - case 'f': - case 'F': - gender = FigureData.FEMALE; - break; - default: - gender = FigureData.MALE; - } - - return gender; - } - - public static hasFigureSetId(setId: number): boolean - { - return (this.FIGURE_SET_IDS.indexOf(setId) >= 0); - } - - public static createCategory(model: CategoryBaseModel, name: string): CategoryData - { - if(!model || !name || !this.CURRENT_FIGURE) return null; - - const partItems: AvatarEditorGridPartItem[] = []; - const colorItems: AvatarEditorGridColorItem[][] = []; - - let i = 0; - - while(i < this.MAX_PALETTES) - { - colorItems.push([]); - - i++; - } - - const setType = GetAvatarSetType(name); - - if(!setType) return null; - - const palette = GetAvatarPalette(setType.paletteID); - - if(!palette) return null; - - let colorIds = this.CURRENT_FIGURE.getColorIds(name); - - if(!colorIds) colorIds = []; - - const partColors: IPartColor[] = new Array(colorIds.length); - const clubItemsDimmed = this.clubItemsDimmed; - const clubMemberLevel = GetClubMemberLevel(); - - for(const partColor of palette.colors.getValues()) - { - if(partColor.isSelectable && (clubItemsDimmed || (clubMemberLevel >= partColor.clubLevel))) - { - let i = 0; - - while(i < this.MAX_PALETTES) - { - const isDisabled = (clubMemberLevel < partColor.clubLevel); - const colorItem = new AvatarEditorGridColorItem(partColor, isDisabled); - - colorItems[i].push(colorItem); - - i++; - } - - if(name !== FigureData.FACE) - { - let i = 0; - - while(i < colorIds.length) - { - if(partColor.id === colorIds[i]) partColors[i] = partColor; - - i++; - } - } - } - } - - let mandatorySetIds: string[] = []; - - if(clubItemsDimmed) - { - mandatorySetIds = GetAvatarRenderManager().getMandatoryAvatarPartSetIds(this.CURRENT_FIGURE.gender, 2); - } - else - { - mandatorySetIds = GetAvatarRenderManager().getMandatoryAvatarPartSetIds(this.CURRENT_FIGURE.gender, clubMemberLevel); - } - - const isntMandatorySet = (mandatorySetIds.indexOf(name) === -1); - - if(isntMandatorySet) - { - const partItem = new AvatarEditorGridPartItem(null, null, false); - - partItem.isClear = true; - - partItems.push(partItem); - } - - const usesColors = (name !== FigureData.FACE); - const partSets = setType.partSets; - const totalPartSets = partSets.length; - - i = (totalPartSets - 1); - - while(i >= 0) - { - const partSet = partSets.getWithIndex(i); - - let isValidGender = false; - - if(partSet.gender === FigureData.UNISEX) - { - isValidGender = true; - } - - else if(partSet.gender === this.CURRENT_FIGURE.gender) - { - isValidGender = true; - } - - if(partSet.isSelectable && isValidGender && (clubItemsDimmed || (clubMemberLevel >= partSet.clubLevel))) - { - const isDisabled = (clubMemberLevel < partSet.clubLevel); - - let isValid = true; - - if(partSet.isSellable) isValid = this.hasFigureSetId(partSet.id); - - if(isValid) partItems.push(new AvatarEditorGridPartItem(partSet, partColors, usesColors, isDisabled)); - } - - i--; - } - - partItems.sort(this.clubItemsFirst ? this.clubSorter : this.noobSorter); - - // if(this._forceSellableClothingVisibility || GetNitroInstance().getConfiguration("avatareditor.support.sellablefurni", false)) - // { - // _local_31 = (this._manager.windowManager.assets.getAssetByName("camera_zoom_in") as BitmapDataAsset); - // _local_32 = (_local_31.content as BitmapData).clone(); - // _local_33 = (AvatarEditorView._Str_6802.clone() as IWindowContainer); - // _local_33.name = AvatarEditorGridView.GET_MORE; - // _local_7 = new AvatarEditorGridPartItem(_local_33, k, null, null, false); - // _local_7._Str_3093 = _local_32; - // _local_3.push(_local_7); - // } - - i = 0; - - while(i < this.MAX_PALETTES) - { - colorItems[i].sort(this.colorSorter); - - i++; - } - - return new CategoryData(name, partItems, colorItems); - } - - public static clubSorter(a: AvatarEditorGridPartItem, b: AvatarEditorGridPartItem): number - { - const clubLevelA = (!a.partSet ? 9999999999 : a.partSet.clubLevel); - const clubLevelB = (!b.partSet ? 9999999999 : b.partSet.clubLevel); - const isSellableA = (!a.partSet ? false : a.partSet.isSellable); - const isSellableB = (!b.partSet ? false : b.partSet.isSellable); - - if(isSellableA && !isSellableB) return 1; - - if(isSellableB && !isSellableA) return -1; - - if(clubLevelA > clubLevelB) return -1; - - if(clubLevelA < clubLevelB) return 1; - - if(a.partSet.id > b.partSet.id) return -1; - - if(a.partSet.id < b.partSet.id) return 1; - - return 0; - } - - public static colorSorter(a: AvatarEditorGridColorItem, b: AvatarEditorGridColorItem): number - { - const clubLevelA = (!a.partColor ? -1 : a.partColor.clubLevel); - const clubLevelB = (!b.partColor ? -1 : b.partColor.clubLevel); - - if(clubLevelA < clubLevelB) return -1; - - if(clubLevelA > clubLevelB) return 1; - - if(a.partColor.index < b.partColor.index) return -1; - - if(a.partColor.index > b.partColor.index) return 1; - - return 0; - } - - public static noobSorter(a: AvatarEditorGridPartItem, b: AvatarEditorGridPartItem): number - { - const clubLevelA = (!a.partSet ? -1 : a.partSet.clubLevel); - const clubLevelB = (!b.partSet ? -1 : b.partSet.clubLevel); - const isSellableA = (!a.partSet ? false : a.partSet.isSellable); - const isSellableB = (!b.partSet ? false : b.partSet.isSellable); - - if(isSellableA && !isSellableB) return 1; - - if(isSellableB && !isSellableA) return -1; - - if(clubLevelA < clubLevelB) return -1; - - if(clubLevelA > clubLevelB) return 1; - - if(a.partSet.id < b.partSet.id) return -1; - - if(a.partSet.id > b.partSet.id) return 1; - - return 0; - } - - public static avatarSetFirstSelectableColor(name: string): number - { - const setType = GetAvatarSetType(name); - - if(!setType) return -1; - - const palette = GetAvatarPalette(setType.paletteID); - - if(!palette) return -1; - - for(const color of palette.colors.getValues()) - { - if(!color.isSelectable || (GetClubMemberLevel() < color.clubLevel)) continue; - - return color.id; - } - - return -1; - } - - public static get clubItemsFirst(): boolean - { - return GetConfiguration('avatareditor.show.clubitems.first', true); - } - - public static get clubItemsDimmed(): boolean - { - return GetConfiguration('avatareditor.show.clubitems.dimmed', true); - } -} diff --git a/src/api/avatar/BodyModel.ts b/src/api/avatar/BodyModel.ts deleted file mode 100644 index 7cdb34c..0000000 --- a/src/api/avatar/BodyModel.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { AvatarEditorFigureCategory, AvatarScaleType, AvatarSetType } from '@nitrots/nitro-renderer'; -import { GetAvatarRenderManager } from '../nitro'; -import { AvatarEditorUtilities } from './AvatarEditorUtilities'; -import { CategoryBaseModel } from './CategoryBaseModel'; -import { FigureData } from './FigureData'; - -export class BodyModel extends CategoryBaseModel -{ - private _imageCallBackHandled: boolean = false; - - public init(): void - { - super.init(); - - this.addCategory(FigureData.FACE); - - this._isInitalized = true; - } - - public selectColor(category: string, colorIndex: number, paletteId: number): void - { - super.selectColor(category, colorIndex, paletteId); - - this.updateSelectionsFromFigure(FigureData.FACE); - } - - protected updateSelectionsFromFigure(name: string): void - { - if(!this._categories || !AvatarEditorUtilities.CURRENT_FIGURE) return; - - const category = this._categories.get(name); - - if(!category) return; - - const setId = AvatarEditorUtilities.CURRENT_FIGURE.getPartSetId(name); - - let colorIds = AvatarEditorUtilities.CURRENT_FIGURE.getColorIds(name); - - if(!colorIds) colorIds = []; - - category.selectPartId(setId); - category.selectColorIds(colorIds); - - for(const part of category.parts) - { - const resetFigure = (figure: string) => - { - const figureString = AvatarEditorUtilities.CURRENT_FIGURE.getFigureStringWithFace(part.id); - const avatarImage = GetAvatarRenderManager().createAvatarImage(figureString, AvatarScaleType.LARGE, null, { resetFigure, dispose: null, disposed: false }); - - const sprite = avatarImage.getImageAsSprite(AvatarSetType.HEAD); - - if(sprite) - { - sprite.y = 10; - - part.thumbContainer = sprite; - - setTimeout(() => avatarImage.dispose(), 0); - } - } - - resetFigure(null); - } - } - - public get canSetGender(): boolean - { - return true; - } - - public get name(): string - { - return AvatarEditorFigureCategory.GENERIC; - } -} diff --git a/src/api/avatar/CategoryBaseModel.ts b/src/api/avatar/CategoryBaseModel.ts deleted file mode 100644 index 34dd933..0000000 --- a/src/api/avatar/CategoryBaseModel.ts +++ /dev/null @@ -1,246 +0,0 @@ -import { AvatarEditorUtilities } from './AvatarEditorUtilities'; -import { CategoryData } from './CategoryData'; -import { IAvatarEditorCategoryModel } from './IAvatarEditorCategoryModel'; - -export class CategoryBaseModel implements IAvatarEditorCategoryModel -{ - protected _categories: Map; - protected _isInitalized: boolean; - protected _maxPaletteCount: number; - private _disposed: boolean; - - constructor() - { - this._isInitalized = false; - this._maxPaletteCount = 0; - } - - public dispose(): void - { - this._categories = null; - this._disposed = true; - } - - public get disposed(): boolean - { - return this._disposed; - } - - public init(): void - { - if(!this._categories) this._categories = new Map(); - } - - public reset(): void - { - this._isInitalized = false; - - if(this._categories) - { - for(const category of this._categories.values()) (category && category.dispose()); - } - - this._categories = new Map(); - } - - protected addCategory(name: string): void - { - let existing = this._categories.get(name); - - if(existing) return; - - existing = AvatarEditorUtilities.createCategory(this, name); - - if(!existing) return; - - this._categories.set(name, existing); - - this.updateSelectionsFromFigure(name); - } - - protected updateSelectionsFromFigure(figure: string): void - { - const category = this._categories.get(figure); - - if(!category) return; - - const setId = AvatarEditorUtilities.CURRENT_FIGURE.getPartSetId(figure); - - let colorIds = AvatarEditorUtilities.CURRENT_FIGURE.getColorIds(figure); - - if(!colorIds) colorIds = []; - - category.selectPartId(setId); - category.selectColorIds(colorIds); - } - - public hasClubSelectionsOverLevel(level: number): boolean - { - if(!this._categories) return false; - - for(const category of this._categories.values()) - { - if(!category) continue; - - if(category.hasClubSelectionsOverLevel(level)) return true; - } - - return false; - } - - public hasInvalidSelectedItems(ownedItems: number[]): boolean - { - if(!this._categories) return false; - - for(const category of this._categories.values()) - { - if(category.hasInvalidSelectedItems(ownedItems)) return true; - } - - return false; - } - - public stripClubItemsOverLevel(level: number): boolean - { - if(!this._categories) return false; - - let didStrip = false; - - for(const [ name, category ] of this._categories.entries()) - { - let isValid = false; - - if(category.stripClubItemsOverLevel(level)) isValid = true; - - if(category.stripClubColorsOverLevel(level)) isValid = true; - - if(isValid) - { - const partItem = category.getCurrentPart(); - - if(partItem && AvatarEditorUtilities.CURRENT_FIGURE) - { - AvatarEditorUtilities.CURRENT_FIGURE.savePartData(name, partItem.id, category.getSelectedColorIds(), true); - } - - didStrip = true; - } - } - - return didStrip; - } - - public stripInvalidSellableItems(): boolean - { - if(!this._categories) return false; - - let didStrip = false; - - for(const [ name, category ] of this._categories.entries()) - { - const isValid = false; - - // if(category._Str_8360(this._Str_2278.manager.inventory)) _local_6 = true; - - if(isValid) - { - const partItem = category.getCurrentPart(); - - if(partItem && AvatarEditorUtilities.CURRENT_FIGURE) - { - AvatarEditorUtilities.CURRENT_FIGURE.savePartData(name, partItem.id, category.getSelectedColorIds(), true); - } - - didStrip = true; - } - } - - return didStrip; - } - - public selectPart(category: string, partIndex: number): void - { - const categoryData = this._categories.get(category); - - if(!categoryData) return; - - const selectedPartIndex = categoryData.selectedPartIndex; - - categoryData.selectPartIndex(partIndex); - - const partItem = categoryData.getCurrentPart(); - - if(!partItem) return; - - if(partItem.isDisabled) - { - categoryData.selectPartIndex(selectedPartIndex); - - // open hc window - - return; - } - - this._maxPaletteCount = partItem.maxColorIndex; - - AvatarEditorUtilities.CURRENT_FIGURE.savePartData(category, partItem.id, categoryData.getSelectedColorIds(), true); - } - - public selectColor(category: string, colorIndex: number, paletteId: number): void - { - const categoryData = this._categories.get(category); - - if(!categoryData) return; - - const paletteIndex = categoryData.getCurrentColorIndex(paletteId); - - categoryData.selectColorIndex(colorIndex, paletteId); - - const colorItem = categoryData.getSelectedColor(paletteId); - - if(colorItem.isDisabled) - { - categoryData.selectColorIndex(paletteIndex, paletteId); - - // open hc window - - return; - } - - AvatarEditorUtilities.CURRENT_FIGURE.savePartSetColourId(category, categoryData.getSelectedColorIds(), true); - } - - public getCategoryData(category: string): CategoryData - { - if(!this._isInitalized) this.init(); - - if(!this._categories) return null; - - return this._categories.get(category); - } - - public get categories(): Map - { - return this._categories; - } - - public get canSetGender(): boolean - { - return false; - } - - public get maxPaletteCount(): number - { - return (this._maxPaletteCount || 1); - } - - public set maxPaletteCount(count: number) - { - this._maxPaletteCount = count; - } - - public get name(): string - { - return null; - } -} diff --git a/src/api/avatar/CategoryData.ts b/src/api/avatar/CategoryData.ts deleted file mode 100644 index db82f01..0000000 --- a/src/api/avatar/CategoryData.ts +++ /dev/null @@ -1,487 +0,0 @@ -import { IPartColor } from '@nitrots/nitro-renderer'; -import { AvatarEditorGridColorItem } from './AvatarEditorGridColorItem'; -import { AvatarEditorGridPartItem } from './AvatarEditorGridPartItem'; - -export class CategoryData -{ - private _name: string; - private _parts: AvatarEditorGridPartItem[]; - private _palettes: AvatarEditorGridColorItem[][]; - private _selectedPartIndex: number = -1; - private _paletteIndexes: number[]; - - constructor(name: string, partItems: AvatarEditorGridPartItem[], colorItems: AvatarEditorGridColorItem[][]) - { - this._name = name; - this._parts = partItems; - this._palettes = colorItems; - this._selectedPartIndex = -1; - } - - private static defaultColorId(palettes: AvatarEditorGridColorItem[], clubLevel: number): number - { - if(!palettes || !palettes.length) return -1; - - let i = 0; - - while(i < palettes.length) - { - const colorItem = palettes[i]; - - if(colorItem.partColor && (colorItem.partColor.clubLevel <= clubLevel)) - { - return colorItem.partColor.id; - } - - i++; - } - - return -1; - } - - public init(): void - { - for(const part of this._parts) - { - if(!part) continue; - - part.init(); - } - } - - public dispose(): void - { - if(this._parts) - { - for(const part of this._parts) part.dispose(); - - this._parts = null; - } - - if(this._palettes) - { - for(const palette of this._palettes) for(const colorItem of palette) colorItem.dispose(); - - this._palettes = null; - } - - this._selectedPartIndex = -1; - this._paletteIndexes = null; - } - - public selectPartId(partId: number): void - { - if(!this._parts) return; - - let i = 0; - - while(i < this._parts.length) - { - const partItem = this._parts[i]; - - if(partItem.id === partId) - { - this.selectPartIndex(i); - - return; - } - - i++; - } - } - - public selectColorIds(colorIds: number[]): void - { - if(!colorIds || !this._palettes) return; - - this._paletteIndexes = new Array(colorIds.length); - - let i = 0; - - while(i < this._palettes.length) - { - const palette = this.getPalette(i); - - if(palette) - { - let colorId = 0; - - if(colorIds.length > i) - { - colorId = colorIds[i]; - } - else - { - const colorItem = palette[0]; - - if(colorItem && colorItem.partColor) colorId = colorItem.partColor.id; - } - - let j = 0; - - while(j < palette.length) - { - const colorItem = palette[j]; - - if(colorItem.partColor.id === colorId) - { - this._paletteIndexes[i] = j; - - colorItem.isSelected = true; - } - else - { - colorItem.isSelected = false; - } - - j++; - } - } - - i++; - } - - this.updatePartColors(); - } - - public selectPartIndex(partIndex: number): AvatarEditorGridPartItem - { - if(!this._parts) return null; - - if((this._selectedPartIndex >= 0) && (this._parts.length > this._selectedPartIndex)) - { - const partItem = this._parts[this._selectedPartIndex]; - - if(partItem) partItem.isSelected = false; - } - - if(this._parts.length > partIndex) - { - const partItem = this._parts[partIndex]; - - if(partItem) - { - partItem.isSelected = true; - - this._selectedPartIndex = partIndex; - - return partItem; - } - } - - return null; - } - - public selectColorIndex(colorIndex: number, paletteId: number): AvatarEditorGridColorItem - { - const palette = this.getPalette(paletteId); - - if(!palette) return null; - - if(palette.length <= colorIndex) return null; - - this.deselectColorIndex(this._paletteIndexes[paletteId], paletteId); - - this._paletteIndexes[paletteId] = colorIndex; - - const colorItem = palette[colorIndex]; - - if(!colorItem) return null; - - colorItem.isSelected = true; - - this.updatePartColors(); - - return colorItem; - } - - public getCurrentColorIndex(k: number): number - { - return this._paletteIndexes[k]; - } - - private deselectColorIndex(colorIndex: number, paletteIndex: number): void - { - const palette = this.getPalette(paletteIndex); - - if(!palette) return; - - if(palette.length <= colorIndex) return; - - const colorItem = palette[colorIndex]; - - if(!colorItem) return; - - colorItem.isSelected = false; - } - - public getSelectedColorIds(): number[] - { - if(!this._paletteIndexes || !this._paletteIndexes.length) return null; - - if(!this._palettes || !this._palettes.length) return null; - - const palette = this._palettes[0]; - - if(!palette || (!palette.length)) return null; - - const colorItem = palette[0]; - - if(!colorItem || !colorItem.partColor) return null; - - const colorId = colorItem.partColor.id; - const colorIds: number[] = []; - - let i = 0; - - while(i < this._paletteIndexes.length) - { - const paletteSet = this._palettes[i]; - - if(!((!(paletteSet)) || (paletteSet.length <= i))) - { - if(paletteSet.length > this._paletteIndexes[i]) - { - const color = paletteSet[this._paletteIndexes[i]]; - - if(color && color.partColor) - { - colorIds.push(color.partColor.id); - } - else - { - colorIds.push(colorId); - } - } - else - { - colorIds.push(colorId); - } - } - - i++; - } - - const partItem = this.getCurrentPart(); - - if(!partItem) return null; - - return colorIds.slice(0, Math.max(partItem.maxColorIndex, 1)); - } - - private getSelectedColors(): IPartColor[] - { - const partColors: IPartColor[] = []; - - let i = 0; - - while(i < this._paletteIndexes.length) - { - const colorItem = this.getSelectedColor(i); - - if(colorItem) - { - partColors.push(colorItem.partColor); - } - else - { - partColors.push(null); - } - - i++; - } - - return partColors; - } - - public getSelectedColor(paletteId: number): AvatarEditorGridColorItem - { - const palette = this.getPalette(paletteId); - - if(!palette || (palette.length <= this._paletteIndexes[paletteId])) return null; - - return palette[this._paletteIndexes[paletteId]]; - } - - public getSelectedColorId(paletteId: number): number - { - const colorItem = this.getSelectedColor(paletteId); - - if(colorItem && (colorItem.partColor)) return colorItem.partColor.id; - - return 0; - } - - public getPalette(paletteId: number): AvatarEditorGridColorItem[] - { - if(!this._paletteIndexes || !this._palettes || (this._palettes.length <= paletteId)) - { - return null; - } - - return this._palettes[paletteId]; - } - - public getCurrentPart(): AvatarEditorGridPartItem - { - return this._parts[this._selectedPartIndex] as AvatarEditorGridPartItem; - } - - private updatePartColors(): void - { - const partColors = this.getSelectedColors(); - - for(const partItem of this._parts) - { - if(partItem) partItem.partColors = partColors; - } - } - - public hasClubSelectionsOverLevel(level: number): boolean - { - let hasInvalidSelections = false; - - const partColors = this.getSelectedColors(); - - if(partColors) - { - let i = 0; - - while(i < partColors.length) - { - const partColor = partColors[i]; - - if(partColor && (partColor.clubLevel > level)) hasInvalidSelections = true; - - i++; - } - } - - const partItem = this.getCurrentPart(); - - if(partItem && partItem.partSet) - { - const partSet = partItem.partSet; - - if(partSet && (partSet.clubLevel > level)) hasInvalidSelections = true; - } - - return hasInvalidSelections; - } - - public hasInvalidSelectedItems(ownedItems: number[]): boolean - { - const part = this.getCurrentPart(); - - if(!part) return false; - - const partSet = part.partSet; - - if(!partSet || !partSet.isSellable) return; - - return (ownedItems.indexOf(partSet.id) > -1); - } - - public stripClubItemsOverLevel(level: number): boolean - { - const partItem = this.getCurrentPart(); - - if(partItem && partItem.partSet) - { - const partSet = partItem.partSet; - - if(partSet.clubLevel > level) - { - const newPartItem = this.selectPartIndex(0); - - if(newPartItem && !newPartItem.partSet) this.selectPartIndex(1); - - return true; - } - } - - return false; - } - - public stripClubColorsOverLevel(level: number): boolean - { - const colorIds: number[] = []; - const partColors = this.getSelectedColors(); - const colorItems = this.getPalette(0); - - let didStrip = false; - - const colorId = CategoryData.defaultColorId(colorItems, level); - - if(colorId === -1) return false; - - let i = 0; - - while(i < partColors.length) - { - const partColor = partColors[i]; - - if(!partColor) - { - colorIds.push(colorId); - - didStrip = true; - } - else - { - if(partColor.clubLevel > level) - { - colorIds.push(colorId); - - didStrip = true; - } - else - { - colorIds.push(partColor.id); - } - } - - i++; - } - - if(didStrip) this.selectColorIds(colorIds); - - return didStrip; - } - - // public stripInvalidSellableItems(k:IHabboInventory): boolean - // { - // var _local_3:IFigurePartSet; - // var _local_4:AvatarEditorGridPartItem; - // var _local_2:AvatarEditorGridPartItem = this._Str_6315(); - // if (((_local_2) && (_local_2.partSet))) - // { - // _local_3 = _local_2.partSet; - // if (((_local_3.isSellable) && (!(k._Str_14439(_local_3.id))))) - // { - // _local_4 = this._Str_8066(0); - // if (((!(_local_4 == null)) && (_local_4.partSet == null))) - // { - // this._Str_8066(1); - // } - // return true; - // } - // } - // return false; - // } - - public get name(): string - { - return this._name; - } - - public get parts(): AvatarEditorGridPartItem[] - { - return this._parts; - } - - public get selectedPartIndex(): number - { - return this._selectedPartIndex; - } -} diff --git a/src/api/avatar/FigureData.ts b/src/api/avatar/FigureData.ts deleted file mode 100644 index 78014d1..0000000 --- a/src/api/avatar/FigureData.ts +++ /dev/null @@ -1,287 +0,0 @@ -import { AvatarEditorUtilities } from './AvatarEditorUtilities'; - -export class FigureData -{ - private static DEFAULT_DIRECTION: number = 4; - - public static MALE: string = 'M'; - public static FEMALE: string = 'F'; - public static UNISEX: string = 'U'; - public static SCALE: string = 'h'; - public static STD: string = 'std'; - public static DEFAULT_FRAME: string = '0'; - public static FACE: string = 'hd'; - public static HAIR: string = 'hr'; - public static HAT: string = 'ha'; - public static HEAD_ACCESSORIES: string = 'he'; - public static EYE_ACCESSORIES: string = 'ea'; - public static FACE_ACCESSORIES: string = 'fa'; - public static JACKET: string = 'cc'; - public static SHIRT: string = 'ch'; - public static CHEST_ACCESSORIES: string = 'ca'; - public static CHEST_PRINTS: string = 'cp'; - public static TROUSERS: string = 'lg'; - public static SHOES: string = 'sh'; - public static TROUSER_ACCESSORIES: string = 'wa'; - public static SET_TYPES = [ FigureData.FACE, FigureData.HAIR, FigureData.HAT, FigureData.HEAD_ACCESSORIES, FigureData.EYE_ACCESSORIES, FigureData.FACE_ACCESSORIES, FigureData.JACKET, FigureData.SHIRT, FigureData.CHEST_ACCESSORIES, FigureData.CHEST_PRINTS, FigureData.TROUSERS, FigureData.SHOES, FigureData.TROUSERS ]; - - private _data: Map; - private _colors: Map; - private _gender: string = 'M'; - private _direction: number = FigureData.DEFAULT_DIRECTION; - private _avatarEffectType: number = -1; - private _notifier: () => void = null; - - public loadAvatarData(figureString: string, gender: string): void - { - this._data = new Map(); - this._colors = new Map(); - this._gender = gender; - - this.parseFigureString(figureString); - this.updateView(); - } - - private parseFigureString(figure: string): void - { - if(!figure) return; - - const sets = figure.split('.'); - - if(!sets || !sets.length) return; - - for(const set of sets) - { - const parts = set.split('-'); - - if(!parts.length) continue; - - const setType = parts[0]; - const setId = parseInt(parts[1]); - const colorIds: number[] = []; - - let offset = 2; - - while(offset < parts.length) - { - colorIds.push(parseInt(parts[offset])); - - offset++; - } - - if(!colorIds.length) colorIds.push(0); - - this.savePartSetId(setType, setId, false); - this.savePartSetColourId(setType, colorIds, false); - } - } - - public getPartSetId(setType: string): number - { - const existing = this._data.get(setType); - - if(existing !== undefined) return existing; - - return -1; - } - - public getColorIds(setType: string): number[] - { - const existing = this._colors.get(setType); - - if(existing !== undefined) return existing; - - return [ AvatarEditorUtilities.avatarSetFirstSelectableColor(setType) ]; - } - - public getFigureString(): string - { - let figureString = ''; - const setParts: string[] = []; - - for(const [ setType, setId ] of this._data.entries()) - { - const colorIds = this._colors.get(setType); - - let setPart = ((setType + '-') + setId); - - if(colorIds && colorIds.length) - { - let i = 0; - - while(i < colorIds.length) - { - setPart = (setPart + ('-' + colorIds[i])); - - i++; - } - } - - setParts.push(setPart); - } - - let i = 0; - - while(i < setParts.length) - { - figureString = (figureString + setParts[i]); - - if(i < (setParts.length - 1)) figureString = (figureString + '.'); - - i++; - } - - return figureString; - } - - public savePartData(setType: string, partId: number, colorIds: number[], update: boolean = false): void - { - this.savePartSetId(setType, partId, update); - this.savePartSetColourId(setType, colorIds, update); - } - - private savePartSetId(setType: string, partId: number, update: boolean = true): void - { - switch(setType) - { - case FigureData.FACE: - case FigureData.HAIR: - case FigureData.HAT: - case FigureData.HEAD_ACCESSORIES: - case FigureData.EYE_ACCESSORIES: - case FigureData.FACE_ACCESSORIES: - case FigureData.SHIRT: - case FigureData.JACKET: - case FigureData.CHEST_ACCESSORIES: - case FigureData.CHEST_PRINTS: - case FigureData.TROUSERS: - case FigureData.SHOES: - case FigureData.TROUSER_ACCESSORIES: - if(partId >= 0) - { - this._data.set(setType, partId); - } - else - { - this._data.delete(setType); - } - break; - } - - if(update) this.updateView(); - } - - public savePartSetColourId(setType: string, colorIds: number[], update: boolean = true): void - { - switch(setType) - { - case FigureData.FACE: - case FigureData.HAIR: - case FigureData.HAT: - case FigureData.HEAD_ACCESSORIES: - case FigureData.EYE_ACCESSORIES: - case FigureData.FACE_ACCESSORIES: - case FigureData.SHIRT: - case FigureData.JACKET: - case FigureData.CHEST_ACCESSORIES: - case FigureData.CHEST_PRINTS: - case FigureData.TROUSERS: - case FigureData.SHOES: - case FigureData.TROUSER_ACCESSORIES: - this._colors.set(setType, colorIds); - break; - } - - if(update) this.updateView(); - } - - public getFigureStringWithFace(k: number, override = true): string - { - let figureString = ''; - - const setTypes: string[] = [ FigureData.FACE ]; - const figureSets: string[] = []; - - for(const setType of setTypes) - { - const colors = this._colors.get(setType); - - if(!colors) continue; - - let setId = this._data.get(setType); - - if((setType === FigureData.FACE) && override) setId = k; - - let figureSet = ((setType + '-') + setId); - - if(setId >= 0) - { - let i = 0; - - while(i < colors.length) - { - figureSet = (figureSet + ('-' + colors[i])); - - i++; - } - } - - figureSets.push(figureSet); - } - - let i = 0; - - while(i < figureSets.length) - { - figureString = (figureString + figureSets[i]); - - if(i < (figureSets.length - 1)) figureString = (figureString + '.'); - - i++; - } - - return figureString; - } - - public updateView(): void - { - if(this.notify) this.notify(); - } - - public get gender(): string - { - return this._gender; - } - - public get direction(): number - { - return this._direction; - } - - public set direction(direction: number) - { - this._direction = direction; - - this.updateView(); - } - - public set avatarEffectType(k: number) - { - this._avatarEffectType = k; - } - - public get avatarEffectType(): number - { - return this._avatarEffectType; - } - - public get notify(): () => void - { - return this._notifier; - } - - public set notify(notifier: () => void) - { - this._notifier = notifier; - } -} diff --git a/src/api/avatar/FigureGenerator.ts b/src/api/avatar/FigureGenerator.ts deleted file mode 100644 index b83a661..0000000 --- a/src/api/avatar/FigureGenerator.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { AvatarFigureContainer, IFigurePartSet, IPalette, IPartColor, SetType } from '@nitrots/nitro-renderer'; -import { GetAvatarRenderManager } from '../nitro'; -import { Randomizer } from '../utils'; -import { FigureData } from './FigureData'; - -function getTotalColors(partSet: IFigurePartSet): number -{ - const parts = partSet.parts; - - let totalColors = 0; - - for(const part of parts) totalColors = Math.max(totalColors, part.colorLayerIndex); - - return totalColors; -} - -function getRandomSetTypes(requiredSets: string[], options: string[]): string[] -{ - options = options.filter(option => (requiredSets.indexOf(option) === -1)); - - return [ ...requiredSets, ...Randomizer.getRandomElements(options, (Randomizer.getRandomNumber(options.length) + 1)) ]; -} - -function getRandomPartSet(setType: SetType, gender: string, clubLevel: number = 0, figureSetIds: number[] = []): IFigurePartSet -{ - 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; - - return option; - }); - - if(!options || !options.length) return null; - - return Randomizer.getRandomElement(options); -} - -function getRandomColors(palette: IPalette, partSet: IFigurePartSet, clubLevel: number = 0): IPartColor[] -{ - if(!palette) return []; - - const options = palette.colors.getValues().filter(option => - { - if(!option.isSelectable || (option.clubLevel > clubLevel)) return null; - - return option; - }); - - if(!options || !options.length) return null; - - return Randomizer.getRandomElements(options, getTotalColors(partSet)); -} - -export function generateRandomFigure(figureData: FigureData, gender: string, clubLevel: number = 0, figureSetIds: number[] = [], ignoredSets: string[] = []): string -{ - const structure = GetAvatarRenderManager().structure; - const figureContainer = new AvatarFigureContainer(''); - const requiredSets = getRandomSetTypes(structure.getMandatorySetTypeIds(gender, clubLevel), FigureData.SET_TYPES); - - for(const setType of ignoredSets) - { - const partSetId = figureData.getPartSetId(setType); - const colors = figureData.getColorIds(setType); - - figureContainer.updatePart(setType, partSetId, colors); - } - - for(const type of requiredSets) - { - if(figureContainer.hasPartType(type)) continue; - - const setType = (structure.figureData.getSetType(type) as SetType); - const selectedSet = getRandomPartSet(setType, gender, clubLevel, figureSetIds); - - if(!selectedSet) continue; - - let selectedColors: number[] = []; - - if(selectedSet.isColorable) - { - selectedColors = getRandomColors(structure.figureData.getPalette(setType.paletteID), selectedSet, clubLevel).map(color => color.id); - } - - figureContainer.updatePart(setType.type, selectedSet.id, selectedColors); - } - - return figureContainer.getFigureString(); -} diff --git a/src/api/avatar/HeadModel.ts b/src/api/avatar/HeadModel.ts deleted file mode 100644 index 5dc30cd..0000000 --- a/src/api/avatar/HeadModel.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AvatarEditorFigureCategory } from '@nitrots/nitro-renderer'; -import { CategoryBaseModel } from './CategoryBaseModel'; -import { FigureData } from './FigureData'; - -export class HeadModel extends CategoryBaseModel -{ - public init(): void - { - super.init(); - - this.addCategory(FigureData.HAIR); - this.addCategory(FigureData.HAT); - this.addCategory(FigureData.HEAD_ACCESSORIES); - this.addCategory(FigureData.EYE_ACCESSORIES); - this.addCategory(FigureData.FACE_ACCESSORIES); - - this._isInitalized = true; - } - - public get name(): string - { - return AvatarEditorFigureCategory.HEAD; - } -} diff --git a/src/api/avatar/IAvatarEditorCategory.ts b/src/api/avatar/IAvatarEditorCategory.ts new file mode 100644 index 0000000..a7cfd51 --- /dev/null +++ b/src/api/avatar/IAvatarEditorCategory.ts @@ -0,0 +1,9 @@ +import { IPartColor } from '@nitrots/nitro-renderer'; +import { IAvatarEditorCategoryPartItem } from './IAvatarEditorCategoryPartItem'; + +export interface IAvatarEditorCategory +{ + setType: string; + partItems: IAvatarEditorCategoryPartItem[]; + colorItems: IPartColor[][]; +} diff --git a/src/api/avatar/IAvatarEditorCategoryModel.ts b/src/api/avatar/IAvatarEditorCategoryModel.ts deleted file mode 100644 index dc9affa..0000000 --- a/src/api/avatar/IAvatarEditorCategoryModel.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { CategoryData } from './CategoryData'; - -export interface IAvatarEditorCategoryModel -{ - init(): void; - dispose(): void; - reset(): void; - getCategoryData(category: string): CategoryData; - selectPart(category: string, partIndex: number): void; - selectColor(category: string, colorIndex: number, paletteId: number): void; - hasClubSelectionsOverLevel(level: number): boolean; - hasInvalidSelectedItems(ownedItems: number[]): boolean; - stripClubItemsOverLevel(level: number): boolean; - stripInvalidSellableItems(): boolean; - categories: Map; - canSetGender: boolean; - maxPaletteCount: number; - name: string; -} diff --git a/src/api/avatar/IAvatarEditorCategoryPartItem.ts b/src/api/avatar/IAvatarEditorCategoryPartItem.ts new file mode 100644 index 0000000..d1cbc0d --- /dev/null +++ b/src/api/avatar/IAvatarEditorCategoryPartItem.ts @@ -0,0 +1,10 @@ +import { IFigurePartSet } from '@nitrots/nitro-renderer'; + +export interface IAvatarEditorCategoryPartItem +{ + id?: number; + partSet?: IFigurePartSet; + usesColor?: boolean; + maxPaletteCount?: number; + isClear?: boolean; +} diff --git a/src/api/avatar/LegModel.ts b/src/api/avatar/LegModel.ts deleted file mode 100644 index 5633930..0000000 --- a/src/api/avatar/LegModel.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AvatarEditorFigureCategory } from '@nitrots/nitro-renderer'; -import { CategoryBaseModel } from './CategoryBaseModel'; -import { FigureData } from './FigureData'; - -export class LegModel extends CategoryBaseModel -{ - public init(): void - { - super.init(); - - this.addCategory(FigureData.TROUSERS); - this.addCategory(FigureData.SHOES); - this.addCategory(FigureData.TROUSER_ACCESSORIES); - - this._isInitalized = true; - } - - public get name(): string - { - return AvatarEditorFigureCategory.LEGS; - } -} diff --git a/src/api/avatar/TorsoModel.ts b/src/api/avatar/TorsoModel.ts deleted file mode 100644 index 43e48cf..0000000 --- a/src/api/avatar/TorsoModel.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { AvatarEditorFigureCategory } from '@nitrots/nitro-renderer'; -import { CategoryBaseModel } from './CategoryBaseModel'; -import { FigureData } from './FigureData'; - -export class TorsoModel extends CategoryBaseModel -{ - public init(): void - { - super.init(); - - this.addCategory(FigureData.SHIRT); - this.addCategory(FigureData.CHEST_PRINTS); - this.addCategory(FigureData.JACKET); - this.addCategory(FigureData.CHEST_ACCESSORIES); - - this._isInitalized = true; - } - - public get name(): string - { - return AvatarEditorFigureCategory.TORSO; - } -} diff --git a/src/api/avatar/index.ts b/src/api/avatar/index.ts index 37b3072..415185e 100644 --- a/src/api/avatar/index.ts +++ b/src/api/avatar/index.ts @@ -1,13 +1,6 @@ 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'; +export * from './AvatarEditorColorSorter'; +export * from './AvatarEditorPartSorter'; +export * from './AvatarEditorThumbnailsHelper'; +export * from './IAvatarEditorCategory'; +export * from './IAvatarEditorCategoryPartItem'; diff --git a/src/api/camera/CameraPicture.ts b/src/api/camera/CameraPicture.ts index fe8c221..020e1ec 100644 --- a/src/api/camera/CameraPicture.ts +++ b/src/api/camera/CameraPicture.ts @@ -4,6 +4,6 @@ export class CameraPicture { constructor( public texture: NitroTexture, - public imageUrl: string) + public imageUrl: string) {} } diff --git a/src/api/camera/CameraPictureThumbnail.ts b/src/api/camera/CameraPictureThumbnail.ts index cd12660..3e3f782 100644 --- a/src/api/camera/CameraPictureThumbnail.ts +++ b/src/api/camera/CameraPictureThumbnail.ts @@ -2,6 +2,6 @@ export class CameraPictureThumbnail { constructor( public effectName: string, - public thumbnailUrl: string) + public thumbnailUrl: string) {} } diff --git a/src/api/catalog/CatalogNode.ts b/src/api/catalog/CatalogNode.ts index 893aa32..5e7c2fc 100644 --- a/src/api/catalog/CatalogNode.ts +++ b/src/api/catalog/CatalogNode.ts @@ -1,7 +1,7 @@ import { NodeData } from '@nitrots/nitro-renderer'; import { ICatalogNode } from './ICatalogNode'; -export class CatalogNode implements ICatalogNode +export class CatalogNode implements ICatalogNode { private _depth: number = 0; private _localization: string = ''; diff --git a/src/api/catalog/CatalogPageName.ts b/src/api/catalog/CatalogPageName.ts index 8e4c7b6..ed217d8 100644 --- a/src/api/catalog/CatalogPageName.ts +++ b/src/api/catalog/CatalogPageName.ts @@ -1,4 +1,4 @@ -export class CatalogPageName +export class CatalogPageName { public static DUCKET_INFO: string = 'ducket_info'; public static CREDITS: string = 'credits'; diff --git a/src/api/catalog/CatalogPetPalette.ts b/src/api/catalog/CatalogPetPalette.ts index d92c40d..3b3c134 100644 --- a/src/api/catalog/CatalogPetPalette.ts +++ b/src/api/catalog/CatalogPetPalette.ts @@ -5,6 +5,6 @@ export class CatalogPetPalette constructor( public readonly breed: string, public readonly palettes: SellablePetPaletteData[] - ) + ) {} } diff --git a/src/api/catalog/CatalogUtilities.ts b/src/api/catalog/CatalogUtilities.ts index 5ca8fed..c2e1d5e 100644 --- a/src/api/catalog/CatalogUtilities.ts +++ b/src/api/catalog/CatalogUtilities.ts @@ -1,16 +1,15 @@ -import { SellablePetPaletteData } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../nitro'; +import { GetRoomEngine, SellablePetPaletteData } from '@nitrots/nitro-renderer'; import { ICatalogNode } from './ICatalogNode'; export const GetPixelEffectIcon = (id: number) => { return ''; -} +}; export const GetSubscriptionProductIcon = (id: number) => { return ''; -} +}; export const GetOfferNodes = (offerNodes: Map, offerId: number) => { @@ -22,20 +21,20 @@ export const GetOfferNodes = (offerNodes: Map, offerId: for(const node of nodes) { if(!node.isVisible) continue; - + allowedNodes.push(node); } } return allowedNodes; -} +}; export const FilterCatalogNode = (search: string, furniLines: string[], node: ICatalogNode, nodes: ICatalogNode[]) => { if(node.isVisible && (node.pageId > 0)) { let nodeAdded = false; - + const hayStack = [ node.pageName, node.localization ].join(' ').toLowerCase().replace(/ /gi, ''); if(hayStack.indexOf(search) > -1) @@ -60,7 +59,7 @@ export const FilterCatalogNode = (search: string, furniLines: string[], node: IC } for(const child of node.children) FilterCatalogNode(search, furniLines, child, nodes); -} +}; export function GetPetIndexFromLocalization(localization: string) { diff --git a/src/api/catalog/FurnitureOffer.ts b/src/api/catalog/FurnitureOffer.ts index 4c9c9f9..367f247 100644 --- a/src/api/catalog/FurnitureOffer.ts +++ b/src/api/catalog/FurnitureOffer.ts @@ -1,5 +1,5 @@ import { GetProductOfferComposer, IFurnitureData } from '@nitrots/nitro-renderer'; -import { GetProductDataForLocalization, SendMessageComposer } from '..'; +import { GetProductDataForLocalization, SendMessageComposer } from '../nitro'; 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 index 1e8d8c0..f0d195d 100644 --- a/src/api/catalog/GetImageIconUrlForProduct.ts +++ b/src/api/catalog/GetImageIconUrlForProduct.ts @@ -1,4 +1,4 @@ -import { GetRoomEngine } from '../nitro'; +import { GetRoomEngine } from '@nitrots/nitro-renderer'; import { ProductTypeEnum } from './ProductTypeEnum'; export const GetImageIconUrlForProduct = (productType: string, productClassId: number, extraData: string = null) => @@ -16,4 +16,4 @@ export const GetImageIconUrlForProduct = (productType: string, productClassId: n } return imageUrl; -} +}; diff --git a/src/api/catalog/ICatalogNode.ts b/src/api/catalog/ICatalogNode.ts index c69f5a6..6253a75 100644 --- a/src/api/catalog/ICatalogNode.ts +++ b/src/api/catalog/ICatalogNode.ts @@ -1,4 +1,4 @@ -export interface ICatalogNode +export interface ICatalogNode { activate(): void; deactivate(): void; diff --git a/src/api/catalog/MarketplaceOfferState.ts b/src/api/catalog/MarketplaceOfferState.ts index 20c0e45..6267a5f 100644 --- a/src/api/catalog/MarketplaceOfferState.ts +++ b/src/api/catalog/MarketplaceOfferState.ts @@ -1,4 +1,4 @@ -export class MarketPlaceOfferState +export class MarketPlaceOfferState { public static readonly ONGOING = 1; public static readonly ONGOING_OWN = 1; diff --git a/src/api/catalog/Offer.ts b/src/api/catalog/Offer.ts index c14d6ac..9182c03 100644 --- a/src/api/catalog/Offer.ts +++ b/src/api/catalog/Offer.ts @@ -60,7 +60,7 @@ export class Offer implements IPurchasableOffer public activate(): void { - + } public get clubLevel(): number @@ -228,7 +228,7 @@ export class Offer implements IPurchasableOffer { const products: IProduct[] = []; const productData = GetProductDataForLocalization(this.localizationId); - + for(const product of this._products) { const furnitureData = GetFurnitureData(product.productClassId, product.productType); diff --git a/src/api/catalog/PageLocalization.ts b/src/api/catalog/PageLocalization.ts index 91e3ce6..f24ae87 100644 --- a/src/api/catalog/PageLocalization.ts +++ b/src/api/catalog/PageLocalization.ts @@ -1,10 +1,10 @@ -import { GetConfiguration } from '../nitro'; +import { GetConfigurationValue } from '../nitro'; import { IPageLocalization } from './IPageLocalization'; export class PageLocalization implements IPageLocalization { private _images: string[]; - private _texts: string[] + private _texts: string[]; constructor(images: string[], texts: string[]) { @@ -27,7 +27,7 @@ export class PageLocalization implements IPageLocalization if(!imageName || !imageName.length) return null; - let assetUrl = GetConfiguration('catalog.asset.image.url'); + let assetUrl = GetConfigurationValue('catalog.asset.image.url'); assetUrl = assetUrl.replace('%name%', imageName); diff --git a/src/api/catalog/PlacedObjectPurchaseData.ts b/src/api/catalog/PlacedObjectPurchaseData.ts index 84bad8c..43d23e3 100644 --- a/src/api/catalog/PlacedObjectPurchaseData.ts +++ b/src/api/catalog/PlacedObjectPurchaseData.ts @@ -11,7 +11,7 @@ export class PlacedObjectPurchaseData public readonly x: number, public readonly y: number, public readonly direction: number, - public readonly offer: IPurchasableOffer) + public readonly offer: IPurchasableOffer) {} public get offerId(): number diff --git a/src/api/catalog/Product.ts b/src/api/catalog/Product.ts index bfb760f..17d9340 100644 --- a/src/api/catalog/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 '../nitro'; +import { GetRoomEngine, GetSessionDataManager, IFurnitureData, IObjectData, IProductData } from '@nitrots/nitro-renderer'; +import { GetConfigurationValue } from '../nitro'; import { GetPixelEffectIcon, GetSubscriptionProductIcon } from './CatalogUtilities'; import { IProduct } from './IProduct'; import { IPurchasableOffer } from './IPurchasableOffer'; @@ -65,7 +65,7 @@ export class Product implements IProduct if(iconName !== '') { - const assetUrl = GetConfiguration('catalog.asset.url'); + const assetUrl = GetConfigurationValue('catalog.asset.url'); return `${ assetUrl }/${ iconName }.png`; } diff --git a/src/api/catalog/RequestedPage.ts b/src/api/catalog/RequestedPage.ts index 8c22730..205cc3e 100644 --- a/src/api/catalog/RequestedPage.ts +++ b/src/api/catalog/RequestedPage.ts @@ -1,4 +1,4 @@ -export class RequestedPage +export class RequestedPage { public static REQUEST_TYPE_NONE: number = 0; public static REQUEST_TYPE_ID: number = 1; diff --git a/src/api/catalog/SearchResult.ts b/src/api/catalog/SearchResult.ts index 419f3cf..120aed4 100644 --- a/src/api/catalog/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/chat-history/ChatHistoryCurrentDate.ts b/src/api/chat-history/ChatHistoryCurrentDate.ts index 6947bca..35d6143 100644 --- a/src/api/chat-history/ChatHistoryCurrentDate.ts +++ b/src/api/chat-history/ChatHistoryCurrentDate.ts @@ -3,4 +3,4 @@ export const ChatHistoryCurrentDate = () => const currentTime = new Date(); return `${ currentTime.getHours().toString().padStart(2, '0') }:${ currentTime.getMinutes().toString().padStart(2, '0') }`; -} +}; diff --git a/src/api/chat-history/MessengerHistoryCurrentDate.ts b/src/api/chat-history/MessengerHistoryCurrentDate.ts index 3aeebc5..b5f7972 100644 --- a/src/api/chat-history/MessengerHistoryCurrentDate.ts +++ b/src/api/chat-history/MessengerHistoryCurrentDate.ts @@ -1,6 +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/events/DispatchMainEvent.ts b/src/api/events/DispatchMainEvent.ts index 385a888..e316b30 100644 --- a/src/api/events/DispatchMainEvent.ts +++ b/src/api/events/DispatchMainEvent.ts @@ -1,5 +1,4 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../nitro'; +import { GetEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer'; import { DispatchEvent } from './DispatchEvent'; -export const DispatchMainEvent = (event: NitroEvent) => DispatchEvent(GetNitroInstance().events, event); +export const DispatchMainEvent = (event: NitroEvent) => DispatchEvent(GetEventDispatcher(), event); diff --git a/src/api/friends/GetGroupChatData.ts b/src/api/friends/GetGroupChatData.ts index 75df962..d1a2c7b 100644 --- a/src/api/friends/GetGroupChatData.ts +++ b/src/api/friends/GetGroupChatData.ts @@ -3,11 +3,11 @@ 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/MessengerSettings.ts b/src/api/friends/MessengerSettings.ts index e0fc8c2..e890fcc 100644 --- a/src/api/friends/MessengerSettings.ts +++ b/src/api/friends/MessengerSettings.ts @@ -6,6 +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/api/friends/MessengerThread.ts b/src/api/friends/MessengerThread.ts index 405ea33..30e931c 100644 --- a/src/api/friends/MessengerThread.ts +++ b/src/api/friends/MessengerThread.ts @@ -40,7 +40,7 @@ export class MessengerThread group.addChat(chat); this._lastUpdated = new Date(); - + this._unreadCount++; return chat; diff --git a/src/api/friends/OpenMessengerChat.ts b/src/api/friends/OpenMessengerChat.ts index 9270981..6050f2f 100644 --- a/src/api/friends/OpenMessengerChat.ts +++ b/src/api/friends/OpenMessengerChat.ts @@ -1,4 +1,4 @@ -import { CreateLinkEvent } from '..'; +import { CreateLinkEvent } from '@nitrots/nitro-renderer'; export function OpenMessengerChat(friendId: number = 0): void { diff --git a/src/api/groups/GetGroupInformation.ts b/src/api/groups/GetGroupInformation.ts index 6b4a48c..14fe326 100644 --- a/src/api/groups/GetGroupInformation.ts +++ b/src/api/groups/GetGroupInformation.ts @@ -1,5 +1,5 @@ import { GroupInformationComposer } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '..'; +import { SendMessageComposer } from '../nitro'; export function GetGroupInformation(groupId: number): void { diff --git a/src/api/groups/GetGroupManager.ts b/src/api/groups/GetGroupManager.ts index d372ace..2044a45 100644 --- a/src/api/groups/GetGroupManager.ts +++ b/src/api/groups/GetGroupManager.ts @@ -1,4 +1,4 @@ -import { CreateLinkEvent } from '..'; +import { CreateLinkEvent } from '@nitrots/nitro-renderer'; export function GetGroupManager(groupId: number): void { diff --git a/src/api/groups/GetGroupMembers.ts b/src/api/groups/GetGroupMembers.ts index 27fb6d5..9e10b01 100644 --- a/src/api/groups/GetGroupMembers.ts +++ b/src/api/groups/GetGroupMembers.ts @@ -1,4 +1,4 @@ -import { CreateLinkEvent } from '..'; +import { CreateLinkEvent } from '@nitrots/nitro-renderer'; export function GetGroupMembers(groupId: number, levelId?: number): void { diff --git a/src/api/groups/GroupBadgePart.ts b/src/api/groups/GroupBadgePart.ts index 3b74875..bb6f5e7 100644 --- a/src/api/groups/GroupBadgePart.ts +++ b/src/api/groups/GroupBadgePart.ts @@ -1,4 +1,3 @@ - export class GroupBadgePart { public static BASE: string = 'b'; @@ -20,7 +19,7 @@ export class GroupBadgePart public get code(): string { 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/api/groups/GroupType.ts b/src/api/groups/GroupType.ts index 58ae72c..744c6c6 100644 --- a/src/api/groups/GroupType.ts +++ b/src/api/groups/GroupType.ts @@ -1,4 +1,4 @@ -export class GroupType +export class GroupType { public static REGULAR: number = 0; public static EXCLUSIVE: number = 1; diff --git a/src/api/groups/ToggleFavoriteGroup.ts b/src/api/groups/ToggleFavoriteGroup.ts index a4b929c..82385d4 100644 --- a/src/api/groups/ToggleFavoriteGroup.ts +++ b/src/api/groups/ToggleFavoriteGroup.ts @@ -1,7 +1,7 @@ import { GroupFavoriteComposer, GroupUnfavoriteComposer, HabboGroupEntryData } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '..'; +import { SendMessageComposer } from '../nitro'; export const ToggleFavoriteGroup = (group: HabboGroupEntryData) => { SendMessageComposer(group.favourite ? new GroupUnfavoriteComposer(group.groupId) : new GroupFavoriteComposer(group.groupId)); -} +}; diff --git a/src/api/groups/TryJoinGroup.ts b/src/api/groups/TryJoinGroup.ts index 4fbbcde..63959bf 100644 --- a/src/api/groups/TryJoinGroup.ts +++ b/src/api/groups/TryJoinGroup.ts @@ -1,4 +1,4 @@ import { GroupJoinComposer } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '..'; +import { SendMessageComposer } from '../nitro'; export const TryJoinGroup = (groupId: number) => SendMessageComposer(new GroupJoinComposer(groupId)); diff --git a/src/api/guide-tool/GuideToolMessage.ts b/src/api/guide-tool/GuideToolMessage.ts index 3810726..3ed87be 100644 --- a/src/api/guide-tool/GuideToolMessage.ts +++ b/src/api/guide-tool/GuideToolMessage.ts @@ -2,7 +2,7 @@ export class GuideToolMessage { private _message: string; private _roomId: number; - + constructor(message: string, roomId?: number) { this._message = message; diff --git a/src/api/hc-center/ClubStatus.ts b/src/api/hc-center/ClubStatus.ts index 8200b14..e3cba00 100644 --- a/src/api/hc-center/ClubStatus.ts +++ b/src/api/hc-center/ClubStatus.ts @@ -1,4 +1,4 @@ -export class ClubStatus +export class ClubStatus { public static ACTIVE: string = 'active'; public static NONE: string = 'none'; diff --git a/src/api/hc-center/GetClubBadge.ts b/src/api/hc-center/GetClubBadge.ts index 6b779e0..79cf979 100644 --- a/src/api/hc-center/GetClubBadge.ts +++ b/src/api/hc-center/GetClubBadge.ts @@ -8,4 +8,4 @@ export const GetClubBadge = (badgeCodes: string[]) => BADGES.forEach(badge => ((badgeCodes.indexOf(badge) > -1) && (badgeCode = badge))); return (badgeCode || DEFAULT_BADGE); -} +}; diff --git a/src/api/help/GetCloseReasonKey.ts b/src/api/help/GetCloseReasonKey.ts index 520d14f..8658492 100644 --- a/src/api/help/GetCloseReasonKey.ts +++ b/src/api/help/GetCloseReasonKey.ts @@ -5,4 +5,4 @@ export const GetCloseReasonKey = (code: number) => if(code === 2) return 'abusive'; return 'resolved'; -} +}; diff --git a/src/api/index.ts b/src/api/index.ts index af96444..7089277 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,3 +1,5 @@ +export * from './GetRendererVersion'; +export * from './GetUIVersion'; export * from './achievements'; export * from './avatar'; export * from './camera'; @@ -6,8 +8,6 @@ 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'; @@ -16,14 +16,13 @@ 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/session'; export * from './notification'; export * from './purse'; export * from './room'; +export * from './room/events'; +export * from './room/widgets'; export * from './user'; export * from './utils'; export * from './wired'; diff --git a/src/api/inventory/FurnitureItem.ts b/src/api/inventory/FurnitureItem.ts index f5f2f0f..655d1d3 100644 --- a/src/api/inventory/FurnitureItem.ts +++ b/src/api/inventory/FurnitureItem.ts @@ -29,7 +29,7 @@ export class FurnitureItem implements IFurnitureItem constructor(parser: IFurnitureItemData) { if(!parser) return; - + this._locked = false; this._id = parser.itemId; this._type = parser.spriteId; diff --git a/src/api/inventory/FurnitureUtilities.ts b/src/api/inventory/FurnitureUtilities.ts index 741f1ea..93b9765 100644 --- a/src/api/inventory/FurnitureUtilities.ts +++ b/src/api/inventory/FurnitureUtilities.ts @@ -1,5 +1,4 @@ -import { FurnitureListItemParser, IObjectData } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../nitro'; +import { FurnitureListItemParser, GetRoomEngine, IObjectData } from '@nitrots/nitro-renderer'; import { FurniCategory } from './FurniCategory'; import { FurnitureItem } from './FurnitureItem'; import { GroupItem } from './GroupItem'; @@ -36,7 +35,7 @@ const addSingleFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: b } return groupItem; -} +}; const addGroupableFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: boolean) => { @@ -86,7 +85,7 @@ const addGroupableFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen const index = set.indexOf(existingGroup); if(index >= 0) set.splice(index, 1); - + set.unshift(existingGroup); } @@ -109,7 +108,7 @@ const addGroupableFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen } return existingGroup; -} +}; export const addFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: boolean) => { @@ -121,7 +120,7 @@ export const addFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: { addGroupableFurnitureItem(set, item, unseen); } -} +}; export const mergeFurniFragments = (fragment: Map, totalFragments: number, fragmentNumber: number, fragments: Map[]) => { @@ -146,7 +145,7 @@ export const mergeFurniFragments = (fragment: Map { @@ -169,4 +168,4 @@ export const getAllItemIds = (groupItems: GroupItem[]) => } return itemIds; -} +}; diff --git a/src/api/inventory/InventoryUtilities.ts b/src/api/inventory/InventoryUtilities.ts index e263b8c..ac28cbd 100644 --- a/src/api/inventory/InventoryUtilities.ts +++ b/src/api/inventory/InventoryUtilities.ts @@ -1,5 +1,5 @@ -import { FurniturePlacePaintComposer, RoomObjectCategory, RoomObjectPlacementSource, RoomObjectType } from '@nitrots/nitro-renderer'; -import { CreateLinkEvent, GetRoomEngine, GetRoomSessionManager, SendMessageComposer } from '../nitro'; +import { CreateLinkEvent, FurniturePlacePaintComposer, GetRoomEngine, GetRoomSessionManager, RoomObjectCategory, RoomObjectPlacementSource, RoomObjectType } from '@nitrots/nitro-renderer'; +import { SendMessageComposer } from '../nitro'; import { FurniCategory } from './FurniCategory'; import { GroupItem } from './GroupItem'; import { IBotItem } from './IBotItem'; @@ -19,12 +19,12 @@ 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) => { @@ -47,7 +47,7 @@ export const attemptPetPlacement = (petItem: IPetItem, flag: boolean = false) => } return true; -} +}; export const attemptItemPlacement = (groupItem: GroupItem, flag: boolean = false) => { @@ -92,7 +92,7 @@ export const attemptItemPlacement = (groupItem: GroupItem, flag: boolean = false } return true; -} +}; export const attemptBotPlacement = (botItem: IBotItem, flag: boolean = false) => @@ -114,4 +114,4 @@ export const attemptBotPlacement = (botItem: IBotItem, flag: boolean = false) => } return true; -} +}; diff --git a/src/api/inventory/PetUtilities.ts b/src/api/inventory/PetUtilities.ts index 881a09e..c53ada2 100644 --- a/src/api/inventory/PetUtilities.ts +++ b/src/api/inventory/PetUtilities.ts @@ -1,7 +1,6 @@ -import { PetData } from '@nitrots/nitro-renderer'; -import { CreateLinkEvent } from '../nitro'; -import { cancelRoomObjectPlacement, getPlacingItemId } from './InventoryUtilities'; +import { CreateLinkEvent, PetData } from '@nitrots/nitro-renderer'; import { IPetItem } from './IPetItem'; +import { cancelRoomObjectPlacement, getPlacingItemId } from './InventoryUtilities'; import { UnseenItemCategory } from './UnseenItemCategory'; export const getAllPetIds = (petItems: IPetItem[]) => petItems.map(item => item.petData.id); @@ -13,7 +12,7 @@ export const addSinglePetItem = (petData: PetData, set: IPetItem[], unseen: bool if(unseen) { //petItem.isUnseen = true; - + set.unshift(petItem); } else @@ -22,7 +21,7 @@ export const addSinglePetItem = (petData: PetData, set: IPetItem[], unseen: bool } return petItem; -} +}; export const removePetItemById = (id: number, set: IPetItem[]) => { @@ -40,7 +39,7 @@ export const removePetItemById = (id: number, set: IPetItem[]) => CreateLinkEvent('inventory/open'); } - + set.splice(index, 1); return petItem; @@ -50,7 +49,7 @@ export const removePetItemById = (id: number, set: IPetItem[]) => } return null; -} +}; export const processPetFragment = (set: IPetItem[], fragment: Map, isUnseen: (category: number, itemId: number) => boolean) => { @@ -76,7 +75,7 @@ export const processPetFragment = (set: IPetItem[], fragment: Map, totalFragments: number, fragmentNumber: number, fragments: Map[]) => { @@ -101,4 +100,4 @@ export const mergePetFragments = (fragment: Map, totalFragments fragments = null; return merged; -} +}; diff --git a/src/api/inventory/TradeUserData.ts b/src/api/inventory/TradeUserData.ts index 452c7ee..ba3d66b 100644 --- a/src/api/inventory/TradeUserData.ts +++ b/src/api/inventory/TradeUserData.ts @@ -10,6 +10,6 @@ export class TradeUserData public itemCount: number = 0, public creditsCount: number = 0, public accepts: boolean = false, - public canTrade: boolean = false) + public canTrade: boolean = false) {} } diff --git a/src/api/inventory/TradingUtilities.ts b/src/api/inventory/TradingUtilities.ts index 28ca8c8..8cdfb96 100644 --- a/src/api/inventory/TradingUtilities.ts +++ b/src/api/inventory/TradingUtilities.ts @@ -1,5 +1,4 @@ -import { AdvancedMap, IObjectData, ItemDataStructure, StringDataType } from '@nitrots/nitro-renderer'; -import { GetSessionDataManager } from '../nitro'; +import { AdvancedMap, GetSessionDataManager, IObjectData, ItemDataStructure, StringDataType } from '@nitrots/nitro-renderer'; import { FurniCategory } from './FurniCategory'; import { FurnitureItem } from './FurnitureItem'; import { createGroupItem } from './FurnitureUtilities'; @@ -18,39 +17,39 @@ export const parseTradeItems = (items: ItemDataStructure[]) => { 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) => { @@ -68,4 +67,4 @@ export const getGuildFurniType = (spriteId: number, stuffData: IObjectData) => } return type; -} +}; diff --git a/src/api/inventory/index.ts b/src/api/inventory/index.ts index 76962cf..6a245d7 100644 --- a/src/api/inventory/index.ts +++ b/src/api/inventory/index.ts @@ -4,9 +4,9 @@ export * from './FurnitureUtilities'; export * from './GroupItem'; export * from './IBotItem'; export * from './IFurnitureItem'; -export * from './InventoryUtilities'; export * from './IPetItem'; export * from './IUnseenItemTracker'; +export * from './InventoryUtilities'; export * from './PetUtilities'; export * from './TradeState'; export * from './TradeUserData'; diff --git a/src/api/mod-tools/GetIssueCategoryName.ts b/src/api/mod-tools/GetIssueCategoryName.ts index 81a3f86..ce2b902 100644 --- a/src/api/mod-tools/GetIssueCategoryName.ts +++ b/src/api/mod-tools/GetIssueCategoryName.ts @@ -32,4 +32,4 @@ export const GetIssueCategoryName = (categoryId: number) => } return 'Unknown'; -} +}; diff --git a/src/api/navigator/RoomSettingsUtils.ts b/src/api/navigator/RoomSettingsUtils.ts index bc611da..36f636f 100644 --- a/src/api/navigator/RoomSettingsUtils.ts +++ b/src/api/navigator/RoomSettingsUtils.ts @@ -5,6 +5,6 @@ const BuildMaxVisitorsList = () => for(let i = 10; i <= 100; i = i + 10) list.push(i); return list; -} +}; export const GetMaxVisitorsList = BuildMaxVisitorsList(); diff --git a/src/api/nitro/AddLinkEventTracker.ts b/src/api/nitro/AddLinkEventTracker.ts deleted file mode 100644 index 8b9f00f..0000000 --- a/src/api/nitro/AddLinkEventTracker.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ILinkEventTracker } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from './GetNitroInstance'; - -export function AddEventLinkTracker(tracker: ILinkEventTracker): void -{ - GetNitroInstance().addLinkEventTracker(tracker); -} diff --git a/src/api/nitro/CreateLinkEvent.ts b/src/api/nitro/CreateLinkEvent.ts deleted file mode 100644 index 2acfa86..0000000 --- a/src/api/nitro/CreateLinkEvent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { GetNitroInstance } from './GetNitroInstance'; - -export function CreateLinkEvent(link: string): void -{ - link = (link.startsWith('event:') ? link.substring(6) : link); - - GetNitroInstance().createLinkEvent(link); -} diff --git a/src/api/nitro/GetCommunication.ts b/src/api/nitro/GetCommunication.ts deleted file mode 100644 index 5dc5761..0000000 --- a/src/api/nitro/GetCommunication.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { INitroCommunicationManager } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from './GetNitroInstance'; - -export function GetCommunication(): INitroCommunicationManager -{ - return GetNitroInstance()?.communication; -} diff --git a/src/api/nitro/GetConfiguration.ts b/src/api/nitro/GetConfiguration.ts deleted file mode 100644 index 800d1f1..0000000 --- a/src/api/nitro/GetConfiguration.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { NitroConfiguration } from '@nitrots/nitro-renderer'; - -export function GetConfiguration(key: string, value: T = null): T -{ - return NitroConfiguration.getValue(key, value); -} diff --git a/src/api/nitro/GetConfigurationValue.ts b/src/api/nitro/GetConfigurationValue.ts new file mode 100644 index 0000000..755ca1d --- /dev/null +++ b/src/api/nitro/GetConfigurationValue.ts @@ -0,0 +1,6 @@ +import { GetConfiguration } from '@nitrots/nitro-renderer'; + +export function GetConfigurationValue(key: string, value: T = null): T +{ + return GetConfiguration().getValue(key, value); +} diff --git a/src/api/nitro/GetConnection.ts b/src/api/nitro/GetConnection.ts deleted file mode 100644 index ec39d8d..0000000 --- a/src/api/nitro/GetConnection.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IConnection } from '@nitrots/nitro-renderer'; -import { GetCommunication } from './GetCommunication'; - -export function GetConnection(): IConnection -{ - return GetCommunication()?.connection; -} diff --git a/src/api/nitro/GetLocalization.ts b/src/api/nitro/GetLocalization.ts deleted file mode 100644 index 7f105e6..0000000 --- a/src/api/nitro/GetLocalization.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { INitroLocalizationManager } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from './GetNitroInstance'; - -export function GetLocalization(): INitroLocalizationManager -{ - return GetNitroInstance().localization; -} diff --git a/src/api/nitro/GetNitroInstance.ts b/src/api/nitro/GetNitroInstance.ts deleted file mode 100644 index 5e64a65..0000000 --- a/src/api/nitro/GetNitroInstance.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { INitro, Nitro } from '@nitrots/nitro-renderer'; - -export function GetNitroInstance(): INitro -{ - return Nitro.instance; -} diff --git a/src/api/nitro/OpenUrl.ts b/src/api/nitro/OpenUrl.ts index 096776d..44992e8 100644 --- a/src/api/nitro/OpenUrl.ts +++ b/src/api/nitro/OpenUrl.ts @@ -1,10 +1,9 @@ -import { HabboWebTools } from '@nitrots/nitro-renderer'; -import { CreateLinkEvent } from './CreateLinkEvent'; +import { CreateLinkEvent, HabboWebTools } from '@nitrots/nitro-renderer'; export const OpenUrl = (url: string) => { if(!url || !url.length) return; - + if(url.startsWith('http')) { HabboWebTools.openWebPage(url); @@ -13,4 +12,4 @@ export const OpenUrl = (url: string) => { CreateLinkEvent(url); } -} +}; diff --git a/src/api/nitro/RemoveLinkEventTracker.ts b/src/api/nitro/RemoveLinkEventTracker.ts deleted file mode 100644 index d551c69..0000000 --- a/src/api/nitro/RemoveLinkEventTracker.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ILinkEventTracker } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from './GetNitroInstance'; - -export function RemoveLinkEventTracker(tracker: ILinkEventTracker): void -{ - GetNitroInstance().removeLinkEventTracker(tracker); -} diff --git a/src/api/nitro/SendMessageComposer.ts b/src/api/nitro/SendMessageComposer.ts index dd54c02..4229c28 100644 --- a/src/api/nitro/SendMessageComposer.ts +++ b/src/api/nitro/SendMessageComposer.ts @@ -1,4 +1,3 @@ -import { IMessageComposer } from '@nitrots/nitro-renderer'; -import { GetConnection } from './GetConnection'; +import { GetCommunication, IMessageComposer } from '@nitrots/nitro-renderer'; -export const SendMessageComposer = (event: IMessageComposer) => GetConnection().send(event); +export const SendMessageComposer = (event: IMessageComposer) => GetCommunication().connection.send(event); diff --git a/src/api/nitro/avatar/GetAvatarPalette.ts b/src/api/nitro/avatar/GetAvatarPalette.ts deleted file mode 100644 index a46acb2..0000000 --- a/src/api/nitro/avatar/GetAvatarPalette.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IPalette } from '@nitrots/nitro-renderer'; -import { GetAvatarRenderManager } from './GetAvatarRenderManager'; - -export function GetAvatarPalette(paletteId: number): IPalette -{ - return GetAvatarRenderManager().structureData.getPalette(paletteId); -} diff --git a/src/api/nitro/avatar/GetAvatarRenderManager.ts b/src/api/nitro/avatar/GetAvatarRenderManager.ts deleted file mode 100644 index 460f010..0000000 --- a/src/api/nitro/avatar/GetAvatarRenderManager.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IAvatarRenderManager } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../GetNitroInstance'; - -export function GetAvatarRenderManager(): IAvatarRenderManager -{ - return GetNitroInstance().avatar; -} diff --git a/src/api/nitro/avatar/GetAvatarSetType.ts b/src/api/nitro/avatar/GetAvatarSetType.ts deleted file mode 100644 index ad95f44..0000000 --- a/src/api/nitro/avatar/GetAvatarSetType.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ISetType } from '@nitrots/nitro-renderer'; -import { GetAvatarRenderManager } from './GetAvatarRenderManager'; - -export function GetAvatarSetType(setType: string): ISetType -{ - return GetAvatarRenderManager().structureData.getSetType(setType); -} diff --git a/src/api/nitro/avatar/index.ts b/src/api/nitro/avatar/index.ts deleted file mode 100644 index 258a1ce..0000000 --- a/src/api/nitro/avatar/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './GetAvatarPalette'; -export * from './GetAvatarRenderManager'; -export * from './GetAvatarSetType'; diff --git a/src/api/nitro/camera/GetRoomCameraWidgetManager.ts b/src/api/nitro/camera/GetRoomCameraWidgetManager.ts deleted file mode 100644 index 392495d..0000000 --- a/src/api/nitro/camera/GetRoomCameraWidgetManager.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IRoomCameraWidgetManager } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../GetNitroInstance'; - -export function GetRoomCameraWidgetManager(): IRoomCameraWidgetManager -{ - return GetNitroInstance().cameraManager; -} diff --git a/src/api/nitro/camera/index.ts b/src/api/nitro/camera/index.ts deleted file mode 100644 index 3c2707c..0000000 --- a/src/api/nitro/camera/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './GetRoomCameraWidgetManager'; diff --git a/src/api/nitro/core/GetConfigurationManager.ts b/src/api/nitro/core/GetConfigurationManager.ts deleted file mode 100644 index 66ce153..0000000 --- a/src/api/nitro/core/GetConfigurationManager.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IConfigurationManager } from '@nitrots/nitro-renderer'; -import { GetNitroCore } from './GetNitroCore'; - -export function GetConfigurationManager(): IConfigurationManager -{ - return GetNitroCore().configuration; -} diff --git a/src/api/nitro/core/GetNitroCore.ts b/src/api/nitro/core/GetNitroCore.ts deleted file mode 100644 index ef34b66..0000000 --- a/src/api/nitro/core/GetNitroCore.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { INitroCore } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '..'; - -export function GetNitroCore(): INitroCore -{ - return GetNitroInstance().core; -} diff --git a/src/api/nitro/core/index.ts b/src/api/nitro/core/index.ts deleted file mode 100644 index 3322c9c..0000000 --- a/src/api/nitro/core/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './GetConfigurationManager'; -export * from './GetNitroCore'; diff --git a/src/api/nitro/index.ts b/src/api/nitro/index.ts index c43e958..11b9d02 100644 --- a/src/api/nitro/index.ts +++ b/src/api/nitro/index.ts @@ -1,15 +1,5 @@ -export * from './AddLinkEventTracker'; -export * from './avatar'; -export * from './camera'; -export * from './core'; -export * from './CreateLinkEvent'; -export * from './GetCommunication'; -export * from './GetConfiguration'; -export * from './GetConnection'; -export * from './GetLocalization'; -export * from './GetNitroInstance'; +export * from './GetConfigurationValue'; export * from './OpenUrl'; -export * from './RemoveLinkEventTracker'; -export * from './room'; export * from './SendMessageComposer'; +export * from './room'; export * from './session'; diff --git a/src/api/nitro/room/DispatchMouseEvent.ts b/src/api/nitro/room/DispatchMouseEvent.ts index 51111ac..ccbe0bc 100644 --- a/src/api/nitro/room/DispatchMouseEvent.ts +++ b/src/api/nitro/room/DispatchMouseEvent.ts @@ -1,5 +1,4 @@ -import { MouseEventType } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from './GetRoomEngine'; +import { GetRoomEngine, MouseEventType } from '@nitrots/nitro-renderer'; let didMouseMove = false; let lastClick = 0; @@ -50,6 +49,6 @@ export const DispatchMouseEvent = (event: MouseEvent, canvasId: number = 1) => break; default: return; } - + 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 5017544..7a90997 100644 --- a/src/api/nitro/room/DispatchTouchEvent.ts +++ b/src/api/nitro/room/DispatchTouchEvent.ts @@ -1,5 +1,4 @@ -import { MouseEventType, TouchEventType } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from './GetRoomEngine'; +import { GetRoomEngine, MouseEventType, TouchEventType } from '@nitrots/nitro-renderer'; let didMouseMove = false; let lastClick = 0; @@ -21,7 +20,7 @@ export const DispatchTouchEvent = (event: TouchEvent, canvasId: number = 1, long x = event.changedTouches[0].clientX; y = event.changedTouches[0].clientY; } - + let eventType = event.type; if(longTouch) eventType = TouchEventType.TOUCH_LONG; @@ -54,7 +53,7 @@ export const DispatchTouchEvent = (event: TouchEvent, canvasId: number = 1, long break; case MouseEventType.DOUBLE_CLICK: break; - case TouchEventType.TOUCH_START: + case TouchEventType.TOUCH_START: eventType = MouseEventType.MOUSE_DOWN; didMouseMove = false; @@ -73,10 +72,10 @@ export const DispatchTouchEvent = (event: TouchEvent, canvasId: number = 1, long default: return; } - if (eventType === TouchEventType.TOUCH_START) + 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/GetOwnRoomObject.ts b/src/api/nitro/room/GetOwnRoomObject.ts index b8d0364..aae0b77 100644 --- a/src/api/nitro/room/GetOwnRoomObject.ts +++ b/src/api/nitro/room/GetOwnRoomObject.ts @@ -1,6 +1,5 @@ -import { IRoomObjectController, RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { GetRoomSession, GetSessionDataManager } from '../session'; -import { GetRoomEngine } from './GetRoomEngine'; +import { GetRoomEngine, GetSessionDataManager, IRoomObjectController, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { GetRoomSession } from '../session'; export function GetOwnRoomObject(): IRoomObjectController { diff --git a/src/api/nitro/room/GetRoomEngine.ts b/src/api/nitro/room/GetRoomEngine.ts deleted file mode 100644 index 4d18ea7..0000000 --- a/src/api/nitro/room/GetRoomEngine.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IRoomEngine } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../GetNitroInstance'; - -export function GetRoomEngine(): IRoomEngine -{ - return GetNitroInstance().roomEngine; -} diff --git a/src/api/nitro/room/GetRoomObjectBounds.ts b/src/api/nitro/room/GetRoomObjectBounds.ts index 0a42ad6..dca0338 100644 --- a/src/api/nitro/room/GetRoomObjectBounds.ts +++ b/src/api/nitro/room/GetRoomObjectBounds.ts @@ -1,4 +1,4 @@ -import { GetRoomEngine } from './GetRoomEngine'; +import { GetRoomEngine } from '@nitrots/nitro-renderer'; export const GetRoomObjectBounds = (roomId: number, objectId: number, category: number, canvasId = 1) => { @@ -10,4 +10,4 @@ export const GetRoomObjectBounds = (roomId: number, objectId: number, category: rectangle.y = Math.round(rectangle.y); return rectangle; -} +}; diff --git a/src/api/nitro/room/GetRoomObjectScreenLocation.ts b/src/api/nitro/room/GetRoomObjectScreenLocation.ts index 1a8d973..4152609 100644 --- a/src/api/nitro/room/GetRoomObjectScreenLocation.ts +++ b/src/api/nitro/room/GetRoomObjectScreenLocation.ts @@ -1,4 +1,4 @@ -import { GetRoomEngine } from './GetRoomEngine'; +import { GetRoomEngine } from '@nitrots/nitro-renderer'; export const GetRoomObjectScreenLocation = (roomId: number, objectId: number, category: number, canvasId = 1) => { @@ -10,4 +10,4 @@ export const GetRoomObjectScreenLocation = (roomId: number, objectId: number, ca 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 d85d739..1289b5e 100644 --- a/src/api/nitro/room/InitializeRoomInstanceRenderingCanvas.ts +++ b/src/api/nitro/room/InitializeRoomInstanceRenderingCanvas.ts @@ -1,4 +1,4 @@ -import { GetRoomEngine } from './GetRoomEngine'; +import { GetRoomEngine } from '@nitrots/nitro-renderer'; export const InitializeRoomInstanceRenderingCanvas = (width: number, height: number, canvasId: number = 1) => { @@ -6,4 +6,4 @@ export const InitializeRoomInstanceRenderingCanvas = (width: number, height: num const roomId = roomEngine.activeRoomId; roomEngine.initializeRoomInstanceRenderingCanvas(roomId, canvasId, width, height); -} +}; diff --git a/src/api/nitro/room/IsFurnitureSelectionDisabled.ts b/src/api/nitro/room/IsFurnitureSelectionDisabled.ts index 367f389..e86f9a3 100644 --- a/src/api/nitro/room/IsFurnitureSelectionDisabled.ts +++ b/src/api/nitro/room/IsFurnitureSelectionDisabled.ts @@ -1,6 +1,4 @@ -import { RoomEngineObjectEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { GetSessionDataManager } from '../..'; -import { GetRoomEngine } from './GetRoomEngine'; +import { GetRoomEngine, GetSessionDataManager, RoomEngineObjectEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; export function IsFurnitureSelectionDisabled(event: RoomEngineObjectEvent): boolean { diff --git a/src/api/nitro/room/ProcessRoomObjectOperation.ts b/src/api/nitro/room/ProcessRoomObjectOperation.ts index b9187fa..5a1c997 100644 --- a/src/api/nitro/room/ProcessRoomObjectOperation.ts +++ b/src/api/nitro/room/ProcessRoomObjectOperation.ts @@ -1,4 +1,4 @@ -import { GetRoomEngine } from './GetRoomEngine'; +import { GetRoomEngine } from '@nitrots/nitro-renderer'; export function ProcessRoomObjectOperation(objectId: number, category: number, operation: string): void { diff --git a/src/api/nitro/room/SetActiveRoomId.ts b/src/api/nitro/room/SetActiveRoomId.ts index 2cccd84..9446537 100644 --- a/src/api/nitro/room/SetActiveRoomId.ts +++ b/src/api/nitro/room/SetActiveRoomId.ts @@ -1,4 +1,4 @@ -import { GetRoomEngine } from './GetRoomEngine'; +import { GetRoomEngine } from '@nitrots/nitro-renderer'; export function SetActiveRoomId(roomId: number): void { diff --git a/src/api/nitro/room/index.ts b/src/api/nitro/room/index.ts index 764b72e..2af9c28 100644 --- a/src/api/nitro/room/index.ts +++ b/src/api/nitro/room/index.ts @@ -1,7 +1,6 @@ export * from './DispatchMouseEvent'; export * from './DispatchTouchEvent'; export * from './GetOwnRoomObject'; -export * from './GetRoomEngine'; export * from './GetRoomObjectBounds'; export * from './GetRoomObjectScreenLocation'; export * from './InitializeRoomInstanceRenderingCanvas'; diff --git a/src/api/nitro/session/CanManipulateFurniture.ts b/src/api/nitro/session/CanManipulateFurniture.ts index 8655292..ba89efd 100644 --- a/src/api/nitro/session/CanManipulateFurniture.ts +++ b/src/api/nitro/session/CanManipulateFurniture.ts @@ -1,6 +1,4 @@ -import { IRoomSession, RoomControllerLevel } from '@nitrots/nitro-renderer'; -import { GetSessionDataManager } from '../..'; -import { GetRoomEngine } from '../room/GetRoomEngine'; +import { GetRoomEngine, GetSessionDataManager, IRoomSession, RoomControllerLevel } from '@nitrots/nitro-renderer'; import { IsOwnerOfFurniture } from './IsOwnerOfFurniture'; export function CanManipulateFurniture(roomSession: IRoomSession, objectId: number, category: number): boolean diff --git a/src/api/nitro/session/CreateRoomSession.ts b/src/api/nitro/session/CreateRoomSession.ts index 3be6a8a..3f12bb4 100644 --- a/src/api/nitro/session/CreateRoomSession.ts +++ b/src/api/nitro/session/CreateRoomSession.ts @@ -1,4 +1,4 @@ -import { GetRoomSessionManager } from './GetRoomSessionManager'; +import { GetRoomSessionManager } from '@nitrots/nitro-renderer'; export function CreateRoomSession(roomId: number, password: string = null): void { diff --git a/src/api/nitro/session/GetCanStandUp.ts b/src/api/nitro/session/GetCanStandUp.ts index 4915d18..841ada9 100644 --- a/src/api/nitro/session/GetCanStandUp.ts +++ b/src/api/nitro/session/GetCanStandUp.ts @@ -6,8 +6,8 @@ export function GetCanStandUp(): string const roomObject = GetOwnRoomObject(); if(!roomObject) return AvatarAction.POSTURE_STAND; - + const model = roomObject.model; - + return model.getValue(RoomObjectVariable.FIGURE_CAN_STAND_UP); } diff --git a/src/api/nitro/session/GetCanUseExpression.ts b/src/api/nitro/session/GetCanUseExpression.ts index c7c7367..da27f6a 100644 --- a/src/api/nitro/session/GetCanUseExpression.ts +++ b/src/api/nitro/session/GetCanUseExpression.ts @@ -6,7 +6,7 @@ export function GetCanUseExpression(): boolean const roomObject = GetOwnRoomObject(); if(!roomObject) return false; - + const model = roomObject.model; const effectId = model.getValue(RoomObjectVariable.FIGURE_EFFECT); diff --git a/src/api/nitro/session/GetClubMemberLevel.ts b/src/api/nitro/session/GetClubMemberLevel.ts index fea75b7..d3cdc37 100644 --- a/src/api/nitro/session/GetClubMemberLevel.ts +++ b/src/api/nitro/session/GetClubMemberLevel.ts @@ -1,10 +1,9 @@ -import { HabboClubLevelEnum } from '@nitrots/nitro-renderer'; -import { GetConfiguration } from '..'; -import { GetSessionDataManager } from './GetSessionDataManager'; +import { GetSessionDataManager, HabboClubLevelEnum } from '@nitrots/nitro-renderer'; +import { GetConfigurationValue } from '../GetConfigurationValue'; export function GetClubMemberLevel(): number { - if(GetConfiguration('hc.disabled', false)) return HabboClubLevelEnum.VIP; - + if(GetConfigurationValue('hc.disabled', false)) return HabboClubLevelEnum.VIP; + return GetSessionDataManager().clubLevel; } diff --git a/src/api/nitro/session/GetFurnitureData.ts b/src/api/nitro/session/GetFurnitureData.ts index 71afef8..b7646df 100644 --- a/src/api/nitro/session/GetFurnitureData.ts +++ b/src/api/nitro/session/GetFurnitureData.ts @@ -1,5 +1,4 @@ -import { IFurnitureData } from '@nitrots/nitro-renderer'; -import { GetSessionDataManager } from '.'; +import { GetSessionDataManager, IFurnitureData } from '@nitrots/nitro-renderer'; import { ProductTypeEnum } from '../../catalog'; export function GetFurnitureData(furniClassId: number, productType: string): IFurnitureData diff --git a/src/api/nitro/session/GetFurnitureDataForProductOffer.ts b/src/api/nitro/session/GetFurnitureDataForProductOffer.ts index 0588835..9bfd214 100644 --- a/src/api/nitro/session/GetFurnitureDataForProductOffer.ts +++ b/src/api/nitro/session/GetFurnitureDataForProductOffer.ts @@ -1,13 +1,12 @@ -import { CatalogPageMessageProductData, FurnitureType, IFurnitureData } from '@nitrots/nitro-renderer'; -import { GetSessionDataManager } from './GetSessionDataManager'; +import { CatalogPageMessageProductData, FurnitureType, GetSessionDataManager, IFurnitureData } from '@nitrots/nitro-renderer'; export function GetFurnitureDataForProductOffer(offer: CatalogPageMessageProductData): IFurnitureData { - if(!offer) return null; + if (!offer) return null; let furniData: IFurnitureData = null; - switch((offer.productType.toUpperCase())) + switch ((offer.productType.toUpperCase()) as FurnitureType) { case FurnitureType.FLOOR: furniData = GetSessionDataManager().getFloorItemData(offer.furniClassId); diff --git a/src/api/nitro/session/GetFurnitureDataForRoomObject.ts b/src/api/nitro/session/GetFurnitureDataForRoomObject.ts index 360f18d..fb76b9e 100644 --- a/src/api/nitro/session/GetFurnitureDataForRoomObject.ts +++ b/src/api/nitro/session/GetFurnitureDataForRoomObject.ts @@ -1,6 +1,4 @@ -import { IFurnitureData, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../room'; -import { GetSessionDataManager } from './GetSessionDataManager'; +import { GetRoomEngine, GetSessionDataManager, IFurnitureData, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; export function GetFurnitureDataForRoomObject(roomId: number, objectId: number, category: number): IFurnitureData { diff --git a/src/api/nitro/session/GetOwnPosture.ts b/src/api/nitro/session/GetOwnPosture.ts index fe0c5f3..ed2a698 100644 --- a/src/api/nitro/session/GetOwnPosture.ts +++ b/src/api/nitro/session/GetOwnPosture.ts @@ -6,8 +6,8 @@ export function GetOwnPosture(): string const roomObject = GetOwnRoomObject(); if(!roomObject) return AvatarAction.POSTURE_STAND; - + const model = roomObject.model; - + return model.getValue(RoomObjectVariable.FIGURE_POSTURE); } diff --git a/src/api/nitro/session/GetProductDataForLocalization.ts b/src/api/nitro/session/GetProductDataForLocalization.ts index 692e0ec..ac89803 100644 --- a/src/api/nitro/session/GetProductDataForLocalization.ts +++ b/src/api/nitro/session/GetProductDataForLocalization.ts @@ -1,5 +1,4 @@ -import { IProductData } from '@nitrots/nitro-renderer'; -import { GetSessionDataManager } from './GetSessionDataManager'; +import { GetSessionDataManager, IProductData } from '@nitrots/nitro-renderer'; export function GetProductDataForLocalization(localizationId: string): IProductData { diff --git a/src/api/nitro/session/GetRoomSession.ts b/src/api/nitro/session/GetRoomSession.ts index 37a8b9f..da2af41 100644 --- a/src/api/nitro/session/GetRoomSession.ts +++ b/src/api/nitro/session/GetRoomSession.ts @@ -1,7 +1,3 @@ -import { IRoomSession } from '@nitrots/nitro-renderer'; -import { GetRoomSessionManager } from './GetRoomSessionManager'; +import { GetRoomSessionManager } from '@nitrots/nitro-renderer'; -export function GetRoomSession(): IRoomSession -{ - return GetRoomSessionManager().getSession(-1); -} +export const GetRoomSession = () => GetRoomSessionManager().getSession(-1); diff --git a/src/api/nitro/session/GetRoomSessionManager.ts b/src/api/nitro/session/GetRoomSessionManager.ts deleted file mode 100644 index 579342d..0000000 --- a/src/api/nitro/session/GetRoomSessionManager.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IRoomSessionManager } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../GetNitroInstance'; - -export function GetRoomSessionManager(): IRoomSessionManager -{ - return GetNitroInstance().roomSessionManager; -} diff --git a/src/api/nitro/session/GetSessionDataManager.ts b/src/api/nitro/session/GetSessionDataManager.ts deleted file mode 100644 index 1f3674e..0000000 --- a/src/api/nitro/session/GetSessionDataManager.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ISessionDataManager } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../GetNitroInstance'; - -export function GetSessionDataManager(): ISessionDataManager -{ - return GetNitroInstance().sessionDataManager; -} diff --git a/src/api/nitro/session/GoToDesktop.ts b/src/api/nitro/session/GoToDesktop.ts index 1bbe016..34f2031 100644 --- a/src/api/nitro/session/GoToDesktop.ts +++ b/src/api/nitro/session/GoToDesktop.ts @@ -1,5 +1,5 @@ import { DesktopViewComposer } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '..'; +import { SendMessageComposer } from '../SendMessageComposer'; export function GoToDesktop(): void { diff --git a/src/api/nitro/session/HasHabboClub.ts b/src/api/nitro/session/HasHabboClub.ts index 4077a0f..9cee03f 100644 --- a/src/api/nitro/session/HasHabboClub.ts +++ b/src/api/nitro/session/HasHabboClub.ts @@ -1,5 +1,4 @@ -import { HabboClubLevelEnum } from '@nitrots/nitro-renderer'; -import { GetSessionDataManager } from './GetSessionDataManager'; +import { GetSessionDataManager, HabboClubLevelEnum } from '@nitrots/nitro-renderer'; export function HasHabboClub(): boolean { diff --git a/src/api/nitro/session/HasHabboVip.ts b/src/api/nitro/session/HasHabboVip.ts index 87f1156..f5a3e21 100644 --- a/src/api/nitro/session/HasHabboVip.ts +++ b/src/api/nitro/session/HasHabboVip.ts @@ -1,5 +1,4 @@ -import { HabboClubLevelEnum } from '@nitrots/nitro-renderer'; -import { GetSessionDataManager } from './GetSessionDataManager'; +import { GetSessionDataManager, HabboClubLevelEnum } from '@nitrots/nitro-renderer'; export function HasHabboVip(): boolean { diff --git a/src/api/nitro/session/IsOwnerOfFloorFurniture.ts b/src/api/nitro/session/IsOwnerOfFloorFurniture.ts index 65ef7fb..5675db9 100644 --- a/src/api/nitro/session/IsOwnerOfFloorFurniture.ts +++ b/src/api/nitro/session/IsOwnerOfFloorFurniture.ts @@ -1,7 +1,5 @@ -import { RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { GetRoomSession } from '.'; -import { GetRoomEngine } from '..'; -import { GetSessionDataManager } from '../../../api'; +import { GetRoomEngine, GetSessionDataManager, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { GetRoomSession } from './GetRoomSession'; export function IsOwnerOfFloorFurniture(id: number): boolean { diff --git a/src/api/nitro/session/IsOwnerOfFurniture.ts b/src/api/nitro/session/IsOwnerOfFurniture.ts index 56b7fc3..49ce166 100644 --- a/src/api/nitro/session/IsOwnerOfFurniture.ts +++ b/src/api/nitro/session/IsOwnerOfFurniture.ts @@ -1,5 +1,4 @@ -import { IRoomObject, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { GetSessionDataManager } from '../../../api'; +import { GetSessionDataManager, IRoomObject, RoomObjectVariable } from '@nitrots/nitro-renderer'; export function IsOwnerOfFurniture(roomObject: IRoomObject): boolean { diff --git a/src/api/nitro/session/IsRidingHorse.ts b/src/api/nitro/session/IsRidingHorse.ts index f946b69..9c70b5d 100644 --- a/src/api/nitro/session/IsRidingHorse.ts +++ b/src/api/nitro/session/IsRidingHorse.ts @@ -6,9 +6,9 @@ export function IsRidingHorse(): boolean const roomObject = GetOwnRoomObject(); if(!roomObject) return false; - + const model = roomObject.model; const effectId = model.getValue(RoomObjectVariable.FIGURE_EFFECT); - + return (effectId === 77); } diff --git a/src/api/nitro/session/StartRoomSession.ts b/src/api/nitro/session/StartRoomSession.ts index 99d9d0b..c203a77 100644 --- a/src/api/nitro/session/StartRoomSession.ts +++ b/src/api/nitro/session/StartRoomSession.ts @@ -1,5 +1,4 @@ -import { IRoomSession } from '@nitrots/nitro-renderer'; -import { GetRoomSessionManager } from './GetRoomSessionManager'; +import { GetRoomSessionManager, IRoomSession } from '@nitrots/nitro-renderer'; export function StartRoomSession(session: IRoomSession): void { diff --git a/src/api/nitro/session/VisitDesktop.ts b/src/api/nitro/session/VisitDesktop.ts index e7416a3..2309f01 100644 --- a/src/api/nitro/session/VisitDesktop.ts +++ b/src/api/nitro/session/VisitDesktop.ts @@ -1,4 +1,6 @@ -import { GetRoomSession, GetRoomSessionManager, GoToDesktop } from '.'; +import { GetRoomSessionManager } from '@nitrots/nitro-renderer'; +import { GetRoomSession } from './GetRoomSession'; +import { GoToDesktop } from './GoToDesktop'; export const VisitDesktop = () => { @@ -6,4 +8,4 @@ export const VisitDesktop = () => GoToDesktop(); GetRoomSessionManager().removeSession(-1); -} +}; diff --git a/src/api/nitro/session/index.ts b/src/api/nitro/session/index.ts index a860d7a..4c0491d 100644 --- a/src/api/nitro/session/index.ts +++ b/src/api/nitro/session/index.ts @@ -9,8 +9,6 @@ export * from './GetFurnitureDataForRoomObject'; export * from './GetOwnPosture'; export * from './GetProductDataForLocalization'; export * from './GetRoomSession'; -export * from './GetRoomSessionManager'; -export * from './GetSessionDataManager'; export * from './GoToDesktop'; export * from './HasHabboClub'; export * from './HasHabboVip'; diff --git a/src/api/notification/NotificationBubbleType.ts b/src/api/notification/NotificationBubbleType.ts index cce38f5..858573b 100644 --- a/src/api/notification/NotificationBubbleType.ts +++ b/src/api/notification/NotificationBubbleType.ts @@ -1,4 +1,4 @@ -export class NotificationBubbleType +export class NotificationBubbleType { public static FRIENDOFFLINE: string = 'friendoffline'; public static FRIENDONLINE: string = 'friendonline'; diff --git a/src/api/room/widgets/AvatarInfoFurni.ts b/src/api/room/widgets/AvatarInfoFurni.ts index 3380282..47743e9 100644 --- a/src/api/room/widgets/AvatarInfoFurni.ts +++ b/src/api/room/widgets/AvatarInfoFurni.ts @@ -9,7 +9,6 @@ export class AvatarInfoFurni implements IAvatarInfo public category: number = 0; public name: string = ''; public description: string = ''; - public image: HTMLImageElement = null; public isWallItem: boolean = false; public isStickie: boolean = false; public isRoomOwner: boolean = false; diff --git a/src/api/room/widgets/AvatarInfoUser.ts b/src/api/room/widgets/AvatarInfoUser.ts index 270bfbd..5ea0dd0 100644 --- a/src/api/room/widgets/AvatarInfoUser.ts +++ b/src/api/room/widgets/AvatarInfoUser.ts @@ -39,7 +39,7 @@ export class AvatarInfoUser implements IAvatarInfo public targetRoomControllerLevel: number = 0; public isAmbassador: boolean = false; - constructor(public readonly type: string) + constructor(public readonly type: string) {} public get isOwnUser(): boolean diff --git a/src/api/room/widgets/AvatarInfoUtilities.ts b/src/api/room/widgets/AvatarInfoUtilities.ts index 7c48944..94e7d32 100644 --- a/src/api/room/widgets/AvatarInfoUtilities.ts +++ b/src/api/room/widgets/AvatarInfoUtilities.ts @@ -1,5 +1,5 @@ -import { GetTickerTime, IFurnitureData, IRoomModerationSettings, IRoomPetData, IRoomUserData, ObjectDataFactory, PetFigureData, PetType, RoomControllerLevel, RoomModerationSettings, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomTradingLevelEnum, RoomWidgetEnumItemExtradataParameter, Vector3d } from '@nitrots/nitro-renderer'; -import { GetRoomEngine, GetRoomSession, GetSessionDataManager, IsOwnerOfFurniture } from '../../nitro'; +import { GetRoomEngine, GetSessionDataManager, GetTickerTime, IFurnitureData, IRoomModerationSettings, IRoomPetData, IRoomUserData, ObjectDataFactory, PetFigureData, PetType, RoomControllerLevel, RoomModerationSettings, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomTradingLevelEnum, RoomWidgetEnumItemExtradataParameter } from '@nitrots/nitro-renderer'; +import { GetRoomSession, IsOwnerOfFurniture } from '../../nitro'; import { LocalizeText } from '../../utils'; import { AvatarInfoFurni } from './AvatarInfoFurni'; import { AvatarInfoName } from './AvatarInfoName'; @@ -72,24 +72,20 @@ export class AvatarInfoUtilities public static getFurniInfo(objectId: number, category: number): AvatarInfoFurni { const roomSession = GetRoomSession(); + const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, objectId, category); + + if(!roomObject) return null; + 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); - } + 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); + const objectData = ObjectDataFactory.getData(model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT)); objectData.initializeFromRoomObjectModel(model); @@ -141,14 +137,14 @@ export class AvatarInfoUtilities furniInfo.expiration = ((expiryTime < 0) ? expiryTime : Math.max(0, (expiryTime - ((GetTickerTime() - expiryTimestamp) / 1000)))); - let roomObjectImage = GetRoomEngine().getRoomObjectImage(roomSession.roomId, objectId, category, new Vector3d(180), 64, null); + /* 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.image = roomObjectImage.getImage(); */ furniInfo.isWallItem = (category === RoomObjectCategory.WALL); furniInfo.isRoomOwner = roomSession.isRoomOwner; furniInfo.roomControllerLevel = roomSession.controllerLevel; @@ -159,11 +155,7 @@ export class AvatarInfoUtilities const guildId = model.getValue(RoomObjectVariable.FURNITURE_GUILD_CUSTOMIZED_GUILD_ID); - if(guildId !== 0) - { - furniInfo.groupId = guildId; - //this.container.connection.send(new GroupInformationComposer(guildId, false)); - } + if(guildId !== 0) furniInfo.groupId = guildId; if(IsOwnerOfFurniture(roomObject)) furniInfo.isOwner = true; @@ -174,11 +166,7 @@ export class AvatarInfoUtilities { const roomSession = GetRoomSession(); - let userInfoType = AvatarInfoUser.OWN_USER; - - if(userData.webID !== GetSessionDataManager().userId) userInfoType = AvatarInfoUser.PEER; - - const userInfo = new AvatarInfoUser(userInfoType); + const userInfo = new AvatarInfoUser((userData.webID === GetSessionDataManager().userId) ? AvatarInfoUser.OWN_USER : AvatarInfoUser.PEER); userInfo.isSpectatorMode = roomSession.isSpectator; userInfo.name = userData.name; @@ -192,7 +180,7 @@ export class AvatarInfoUtilities if(roomObject) userInfo.carryItem = (roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT) || 0); - if(userInfoType === AvatarInfoUser.OWN_USER) userInfo.allowNameChange = GetSessionDataManager().canChangeName; + if(userInfo.type === AvatarInfoUser.OWN_USER) userInfo.allowNameChange = GetSessionDataManager().canChangeName; userInfo.amIOwner = roomSession.isRoomOwner; userInfo.isGuildRoom = roomSession.isGuildRoom; @@ -200,14 +188,11 @@ export class AvatarInfoUtilities userInfo.amIAnyRoomController = GetSessionDataManager().isModerator; userInfo.isAmbassador = GetSessionDataManager().isAmbassador; - if(userInfoType === AvatarInfoUser.PEER) + if(userInfo.type === AvatarInfoUser.PEER) { if(roomObject) { - const flatControl = roomObject.model.getValue(RoomObjectVariable.FIGURE_FLAT_CONTROL); - - if(flatControl !== null) userInfo.targetRoomControllerLevel = flatControl; - + userInfo.targetRoomControllerLevel = roomObject.model.getValue(RoomObjectVariable.FIGURE_FLAT_CONTROL); userInfo.canBeMuted = this.canBeMuted(userInfo); userInfo.canBeKicked = this.canBeKicked(userInfo); userInfo.canBeBanned = this.canBeBanned(userInfo); @@ -234,7 +219,7 @@ export class AvatarInfoUtilities userInfo.canTrade = (roomController || targetController); break; } - case RoomTradingLevelEnum.NO_TRADING: + case RoomTradingLevelEnum.FREE_TRADING: userInfo.canTrade = true; break; default: @@ -413,7 +398,7 @@ export class AvatarInfoUtilities default: return (userInfo.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); } - } + }; return this.isValidSetting(userInfo, checkSetting); } @@ -431,7 +416,7 @@ export class AvatarInfoUtilities default: return (userInfo.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); } - } + }; return this.isValidSetting(userInfo, checkSetting); } @@ -447,7 +432,7 @@ export class AvatarInfoUtilities default: return (userInfo.roomControllerLevel >= RoomControllerLevel.ROOM_OWNER); } - } + }; return this.isValidSetting(userInfo, checkSetting); } diff --git a/src/api/room/widgets/ChatBubbleMessage.ts b/src/api/room/widgets/ChatBubbleMessage.ts index 10ad546..3e31e38 100644 --- a/src/api/room/widgets/ChatBubbleMessage.ts +++ b/src/api/room/widgets/ChatBubbleMessage.ts @@ -1,5 +1,3 @@ -import { INitroPoint } from '@nitrots/nitro-renderer'; - export class ChatBubbleMessage { public static BUBBLE_COUNTER: number = 0; @@ -12,7 +10,7 @@ export class ChatBubbleMessage private _top: number = 0; private _left: number = 0; - + constructor( public senderId: number = -1, public senderCategory: number = -1, @@ -20,17 +18,14 @@ export class ChatBubbleMessage public text: string = '', public formattedText: string = '', public username: string = '', - public location: INitroPoint = null, + public location: { x: number, y: number } = null, public type: number = 0, public styleId: number = 0, public imageUrl: string = null, - public color: string = null, - public chatColours: string = "" - ) + public color: string = null + ) { this.id = ++ChatBubbleMessage.BUBBLE_COUNTER; - this.color = color; - this.chatColours = chatColours; } public get top(): number diff --git a/src/api/room/widgets/ChatBubbleUtilities.ts b/src/api/room/widgets/ChatBubbleUtilities.ts new file mode 100644 index 0000000..fff0a14 --- /dev/null +++ b/src/api/room/widgets/ChatBubbleUtilities.ts @@ -0,0 +1,69 @@ +import { AvatarFigurePartType, AvatarScaleType, AvatarSetType, GetAvatarRenderManager, GetRoomEngine, PetFigureData, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; + +export class ChatBubbleUtilities +{ + public static AVATAR_COLOR_CACHE: Map = new Map(); + public static AVATAR_IMAGE_CACHE: Map = new Map(); + public static PET_IMAGE_CACHE: Map = new Map(); + + private static placeHolderImageUrl: string = ''; + + public static async setFigureImage(figure: string): Promise + { + const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, null, { + resetFigure: figure => this.setFigureImage(figure), + dispose: () => + {}, + disposed: false + }); + + if(!avatarImage) return null; + + const isPlaceholder = avatarImage.isPlaceholder(); + + if(isPlaceholder && this.placeHolderImageUrl?.length) return this.placeHolderImageUrl; + + figure = avatarImage.getFigure().getFigureString(); + + const imageUrl = avatarImage.processAsImageUrl(AvatarSetType.HEAD); + const color = avatarImage.getPartColor(AvatarFigurePartType.CHEST); + + if(isPlaceholder) this.placeHolderImageUrl = imageUrl; + + this.AVATAR_COLOR_CACHE.set(figure, ((color && color.rgb) || 16777215)); + this.AVATAR_IMAGE_CACHE.set(figure, imageUrl); + + avatarImage.dispose(); + + return imageUrl; + } + + public static async getUserImage(figure: string): Promise + { + let existing = this.AVATAR_IMAGE_CACHE.get(figure); + + if(!existing) existing = await this.setFigureImage(figure); + + return existing; + } + + public static async getPetImage(figure: string, direction: number, _arg_3: boolean, scale: number = 64, posture: string = null) + { + let existing = this.PET_IMAGE_CACHE.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 = await TextureUtils.generateImageUrl(image.data); + + this.PET_IMAGE_CACHE.set((figure + posture), existing); + } + + return existing; + } +} diff --git a/src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts b/src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts index 1a2759f..009e530 100644 --- a/src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts +++ b/src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts @@ -4,6 +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 index 092ce5d..74f0d7f 100644 --- a/src/api/room/widgets/DoChatsOverlap.ts +++ b/src/api/room/widgets/DoChatsOverlap.ts @@ -3,5 +3,4 @@ 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 index 9d252d1..f55fc87 100644 --- a/src/api/room/widgets/FurnitureDimmerUtilities.ts +++ b/src/api/room/widgets/FurnitureDimmerUtilities.ts @@ -1,4 +1,5 @@ -import { GetRoomEngine, GetRoomSession } from '../../nitro'; +import { GetRoomEngine } from '@nitrots/nitro-renderer'; +import { GetRoomSession } from '../../nitro'; export class FurnitureDimmerUtilities { diff --git a/src/api/room/widgets/GetDiskColor.ts b/src/api/room/widgets/GetDiskColor.ts index 989f294..97cd24d 100644 --- a/src/api/room/widgets/GetDiskColor.ts +++ b/src/api/room/widgets/GetDiskColor.ts @@ -12,9 +12,9 @@ export const GetDiskColor = (name: string) => let b: number = 0; let index: number = 0; - while (index < name.length) + while(index < name.length) { - switch ((index % 3)) + switch((index % 3)) { case 0: r = (r + ( name.charCodeAt(index) * 37) ); @@ -34,4 +34,4 @@ export const GetDiskColor = (name: string) => b = ((b % DISK_COLOR_BLUE_RANGE) + DISK_COLOR_BLUE_MIN); return `rgb(${ r },${ g },${ b })`; -} +}; diff --git a/src/api/room/widgets/MannequinUtilities.ts b/src/api/room/widgets/MannequinUtilities.ts index 5e82b9a..74d45f9 100644 --- a/src/api/room/widgets/MannequinUtilities.ts +++ b/src/api/room/widgets/MannequinUtilities.ts @@ -1,5 +1,4 @@ -import { AvatarFigurePartType, IAvatarFigureContainer } from '@nitrots/nitro-renderer'; -import { GetAvatarRenderManager } from '../../nitro'; +import { AvatarFigurePartType, GetAvatarRenderManager, IAvatarFigureContainer } from '@nitrots/nitro-renderer'; export class MannequinUtilities { @@ -30,10 +29,10 @@ export class MannequinUtilities 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/api/room/widgets/YoutubeVideoPlaybackStateEnum.ts b/src/api/room/widgets/YoutubeVideoPlaybackStateEnum.ts index 3a885d1..2d17841 100644 --- a/src/api/room/widgets/YoutubeVideoPlaybackStateEnum.ts +++ b/src/api/room/widgets/YoutubeVideoPlaybackStateEnum.ts @@ -1,4 +1,4 @@ -export class YoutubeVideoPlaybackStateEnum +export class YoutubeVideoPlaybackStateEnum { public static readonly UNSTARTED = -1; public static readonly ENDED = 0; diff --git a/src/api/room/widgets/index.ts b/src/api/room/widgets/index.ts index c43d6aa..6c50c83 100644 --- a/src/api/room/widgets/index.ts +++ b/src/api/room/widgets/index.ts @@ -6,6 +6,7 @@ export * from './AvatarInfoUser'; export * from './AvatarInfoUtilities'; export * from './BotSkillsEnum'; export * from './ChatBubbleMessage'; +export * from './ChatBubbleUtilities'; export * from './ChatMessageTypeEnum'; export * from './DimmerFurnitureWidgetPresetItem'; export * from './DoChatsOverlap'; diff --git a/src/api/user/GetUserProfile.ts b/src/api/user/GetUserProfile.ts index 0f2be77..13c67aa 100644 --- a/src/api/user/GetUserProfile.ts +++ b/src/api/user/GetUserProfile.ts @@ -1,5 +1,5 @@ import { UserProfileComposer } from '@nitrots/nitro-renderer'; -import { SendMessageComposer } from '..'; +import { SendMessageComposer } from '../nitro'; export function GetUserProfile(userId: number): void { diff --git a/src/api/utils/CloneObject.ts b/src/api/utils/CloneObject.ts index 6cd8d3e..b306fac 100644 --- a/src/api/utils/CloneObject.ts +++ b/src/api/utils/CloneObject.ts @@ -11,4 +11,4 @@ export const CloneObject = (object: T): T => } return copy; -} +}; diff --git a/src/api/utils/ColorUtils.ts b/src/api/utils/ColorUtils.ts index c32f8fb..ff3a0bf 100644 --- a/src/api/utils/ColorUtils.ts +++ b/src/api/utils/ColorUtils.ts @@ -30,7 +30,7 @@ export class ColorUtils */ public static int_to_8BitVals(value: number): [number, number, number, number] { - const val1 = ((value >> 24) & 0xFF) + const val1 = ((value >> 24) & 0xFF); const val2 = ((value >> 16) & 0xFF); const val3 = ((value >> 8) & 0xFF); const val4 = (value & 0xFF); diff --git a/src/api/utils/ConvertSeconds.ts b/src/api/utils/ConvertSeconds.ts index f559dea..351dda8 100644 --- a/src/api/utils/ConvertSeconds.ts +++ b/src/api/utils/ConvertSeconds.ts @@ -6,4 +6,4 @@ export const ConvertSeconds = (seconds: number) => let numSeconds = ((seconds % 86400) % 3600) % 60; return numDays.toString().padStart(2, '0') + ':' + numHours.toString().padStart(2, '0') + ':' + numMinutes.toString().padStart(2, '0') + ':' + numSeconds.toString().padStart(2, '0'); -} +}; diff --git a/submodules/renderer/src/nitro/utils/FixedSizeStack.ts b/src/api/utils/FixedSizeStack.ts similarity index 100% rename from submodules/renderer/src/nitro/utils/FixedSizeStack.ts rename to src/api/utils/FixedSizeStack.ts diff --git a/submodules/renderer/src/nitro/utils/FriendlyTime.ts b/src/api/utils/FriendlyTime.ts similarity index 95% rename from submodules/renderer/src/nitro/utils/FriendlyTime.ts rename to src/api/utils/FriendlyTime.ts index f6e0840..7acb39c 100644 --- a/submodules/renderer/src/nitro/utils/FriendlyTime.ts +++ b/src/api/utils/FriendlyTime.ts @@ -1,4 +1,4 @@ -import { Nitro } from '../Nitro'; +import { LocalizeText } from './LocalizeText'; export class FriendlyTime { @@ -42,6 +42,6 @@ export class FriendlyTime public static getLocalization(key: string, amount: number): string { - return Nitro.instance.getLocalizationWithParameter(key, 'amount', amount.toString()); + return LocalizeText(key, [ 'amount' ], [ amount.toString() ]); } } diff --git a/src/api/utils/GetLocalStorage.ts b/src/api/utils/GetLocalStorage.ts index 769df6d..a4270cf 100644 --- a/src/api/utils/GetLocalStorage.ts +++ b/src/api/utils/GetLocalStorage.ts @@ -2,10 +2,10 @@ export const GetLocalStorage = (key: string) => { try { - JSON.parse(window.localStorage.getItem(key)) as T ?? null + JSON.parse(window.localStorage.getItem(key)) as T ?? null; } - catch(e) + catch (e) { return null; } -} +}; diff --git a/src/api/utils/LocalizeBadgeDescription.ts b/src/api/utils/LocalizeBadgeDescription.ts index 04fd7df..11f178e 100644 --- a/src/api/utils/LocalizeBadgeDescription.ts +++ b/src/api/utils/LocalizeBadgeDescription.ts @@ -1,10 +1,10 @@ -import { GetNitroInstance } from '..'; +import { GetLocalizationManager } from '@nitrots/nitro-renderer'; export const LocalizeBadgeDescription = (key: string) => { - let badgeDesc = GetNitroInstance().localization.getBadgeDesc(key); + let badgeDesc = GetLocalizationManager().getBadgeDesc(key); if(!badgeDesc || !badgeDesc.length) badgeDesc = `badge_desc_${ key }`; return badgeDesc; -} +}; diff --git a/src/api/utils/LocalizeBageName.ts b/src/api/utils/LocalizeBageName.ts index d722ab0..47645cb 100644 --- a/src/api/utils/LocalizeBageName.ts +++ b/src/api/utils/LocalizeBageName.ts @@ -1,10 +1,10 @@ -import { GetNitroInstance } from '..'; +import { GetLocalizationManager } from '@nitrots/nitro-renderer'; export const LocalizeBadgeName = (key: string) => { - let badgeName = GetNitroInstance().localization.getBadgeName(key); + let badgeName = GetLocalizationManager().getBadgeName(key); if(!badgeName || !badgeName.length) badgeName = `badge_name_${ key }`; return badgeName; -} +}; diff --git a/src/api/utils/LocalizeText.ts b/src/api/utils/LocalizeText.ts index cf34a1f..68d0273 100644 --- a/src/api/utils/LocalizeText.ts +++ b/src/api/utils/LocalizeText.ts @@ -1,6 +1,6 @@ -import { GetNitroInstance } from '..'; +import { GetLocalizationManager } from '@nitrots/nitro-renderer'; export function LocalizeText(key: string, parameters: string[] = null, replacements: string[] = null): string { - return GetNitroInstance().getLocalizationWithParameters(key, parameters, replacements); + return GetLocalizationManager().getValueWithParameters(key, parameters, replacements); } diff --git a/src/api/utils/PlaySound.ts b/src/api/utils/PlaySound.ts index 0f9a39d..b0f903c 100644 --- a/src/api/utils/PlaySound.ts +++ b/src/api/utils/PlaySound.ts @@ -8,7 +8,7 @@ export const PlaySound = (sampleCode: string) => if(!canPlaySound) return; DispatchMainEvent(new NitroSoundEvent(NitroSoundEvent.PLAY_SOUND, sampleCode)); -} +}; const eventTypes = [ MouseEventType.MOUSE_CLICK ]; @@ -19,6 +19,6 @@ const startListening = () => const onEvent = (event: Event) => ((canPlaySound = true) && stopListening()); eventTypes.forEach(type => window.addEventListener(type, onEvent)); -} +}; startListening(); diff --git a/src/api/utils/ProductImageUtility.ts b/src/api/utils/ProductImageUtility.ts index 59c8c4f..b12c43d 100644 --- a/src/api/utils/ProductImageUtility.ts +++ b/src/api/utils/ProductImageUtility.ts @@ -1,6 +1,5 @@ -import { CatalogPageMessageProductData } from '@nitrots/nitro-renderer'; +import { CatalogPageMessageProductData, GetRoomEngine } from '@nitrots/nitro-renderer'; import { FurniCategory } from '../inventory'; -import { GetRoomEngine } from '../nitro'; export class ProductImageUtility { diff --git a/src/api/utils/RoomChatFormatter.ts b/src/api/utils/RoomChatFormatter.ts index 8c46740..f87840b 100644 --- a/src/api/utils/RoomChatFormatter.ts +++ b/src/api/utils/RoomChatFormatter.ts @@ -1,5 +1,4 @@ -import { GetConfiguration } from '../../api'; -export const allowedColours: Map = new Map(); +const allowedColours: Map = new Map(); allowedColours.set('r', 'red'); allowedColours.set('b', 'blue'); @@ -12,109 +11,16 @@ allowedColours.set('br', 'brown'); allowedColours.set('pr', 'purple'); allowedColours.set('pk', 'pink'); -allowedColours.set('black', 'black'); allowedColours.set('red', 'red'); -allowedColours.set('orangered', 'orangered'); -allowedColours.set('orange', 'orange'); -allowedColours.set('yellow', 'yellow'); -allowedColours.set('yellowgreen', 'yellowgreen'); -allowedColours.set('green', 'green'); -allowedColours.set('seagreen', 'seagreen'); -allowedColours.set('teal', 'teal'); allowedColours.set('blue', 'blue'); -allowedColours.set('darkblue', 'darkblue'); -allowedColours.set('indigo', 'indigo'); -allowedColours.set('purple', 'purple'); -allowedColours.set('violet', 'violet'); -allowedColours.set('brown', 'brown'); -allowedColours.set('burlywood', 'burlywood'); -allowedColours.set('rosybrown', 'rosybrown'); -allowedColours.set('saddlebrown', 'saddlebrown'); -allowedColours.set('maroon', 'maroon'); -allowedColours.set('firebrick', 'firebrick'); -allowedColours.set('darkred', 'darkred'); -allowedColours.set('chocolate', 'chocolate'); -allowedColours.set('sienna', 'sienna'); -allowedColours.set('peru', 'peru'); -allowedColours.set('darkorange', 'darkorange'); -allowedColours.set('orange', 'orange'); -allowedColours.set('orangered', 'orangered'); -allowedColours.set('tomato', 'tomato'); -allowedColours.set('coral', 'coral'); -allowedColours.set('darkolivegreen', 'darkolivegreen'); -allowedColours.set('olive', 'olive'); -allowedColours.set('olivedrab', 'olivedrab'); -allowedColours.set('greenyellow', 'greenyellow'); -allowedColours.set('yellowgreen', 'yellowgreen'); -allowedColours.set('darkgreen', 'darkgreen'); -allowedColours.set('limegreen', 'limegreen'); -allowedColours.set('lime', 'lime'); -allowedColours.set('lawngreen', 'lawngreen'); -allowedColours.set('palegreen', 'palegreen'); -allowedColours.set('springgreen', 'springgreen'); -allowedColours.set('mediumseagreen', 'mediumseagreen'); -allowedColours.set('mediumaquamarine', 'mediumaquamarine'); -allowedColours.set('aquamarine', 'aquamarine'); -allowedColours.set('turquoise', 'turquoise'); -allowedColours.set('mediumturquoise', 'mediumturquoise'); -allowedColours.set('darkturquoise', 'darkturquoise'); -allowedColours.set('aqua', 'aqua'); -allowedColours.set('cyan', 'cyan'); -allowedColours.set('lightcyan', 'lightcyan'); -allowedColours.set('paleturquoise', 'paleturquoise'); -allowedColours.set('azure', 'azure'); -allowedColours.set('lightblue', 'lightblue'); -allowedColours.set('powderblue', 'powderblue'); -allowedColours.set('deepskyblue', 'deepskyblue'); -allowedColours.set('skyblue', 'skyblue'); -allowedColours.set('lightskyblue', 'lightskyblue'); -allowedColours.set('steelblue', 'steelblue'); -allowedColours.set('royalblue', 'royalblue'); -allowedColours.set('mediumslateblue', 'mediumslateblue'); -allowedColours.set('slateblue', 'slateblue'); -allowedColours.set('darkslateblue', 'darkslateblue'); -allowedColours.set('mediumpurple', 'mediumpurple'); -allowedColours.set('blueviolet', 'blueviolet'); -allowedColours.set('darkviolet', 'darkviolet'); -allowedColours.set('darkmagenta', 'darkmagenta'); -allowedColours.set('mediumvioletred', 'mediumvioletred'); -allowedColours.set('violetred', 'violetred'); -allowedColours.set('orchid', 'orchid'); -allowedColours.set('darkorchid', 'darkorchid'); -allowedColours.set('mediumorchid', 'mediumorchid'); -allowedColours.set('thistle', 'thistle'); -allowedColours.set('plum', 'plum'); -allowedColours.set('purple', 'purple'); -allowedColours.set('darkgrey', 'darkgrey'); -allowedColours.set('dimgray', 'dimgray'); -allowedColours.set('lightgrey', 'lightgrey'); -allowedColours.set('grey', 'grey'); -allowedColours.set('slategrey', 'slategrey'); -allowedColours.set('lightslategrey', 'lightslategrey'); -allowedColours.set('whitesmoke', 'whitesmoke'); +allowedColours.set('green', 'green'); +allowedColours.set('yellow', 'yellow'); allowedColours.set('white', 'white'); -allowedColours.set('snow', 'snow'); -allowedColours.set('mistyrose', 'mistyrose'); -allowedColours.set('seashell', 'seashell'); -allowedColours.set('antiquewhite', 'antiquewhite'); -allowedColours.set('linen', 'linen'); -allowedColours.set('oldlace', 'oldlace'); -allowedColours.set('papayawhip', 'papayawhip'); -allowedColours.set('blanchedalmond', 'blanchedalmond'); -allowedColours.set('moccasin', 'moccasin'); -allowedColours.set('wheat', 'wheat'); -allowedColours.set('navajowhite', 'navajowhite'); -allowedColours.set('burlywood', 'burlywood'); -allowedColours.set('tan', 'tan'); -allowedColours.set('rosybrown', 'rosybrown'); -allowedColours.set('sandybrown', 'sandybrown'); -allowedColours.set('goldenrod', 'goldenrod'); -allowedColours.set('darkgoldenrod', 'darkgoldenrod'); -allowedColours.set('peru', 'peru'); -allowedColours.set('chocolate', 'chocolate'); -allowedColours.set('saddlebrown', 'saddlebrown'); -allowedColours.set('sienna', 'sienna'); +allowedColours.set('orange', 'orange'); +allowedColours.set('cyan', 'cyan'); allowedColours.set('brown', 'brown'); +allowedColours.set('purple', 'purple'); +allowedColours.set('pink', 'pink'); const encodeHTML = (str: string) => { @@ -129,42 +35,41 @@ const encodeHTML = (str: string) => return full; }); -} +}; -export const RoomChatFormatter = (content: string) => { +export const RoomChatFormatter = (content: string) => +{ let result = ''; content = encodeHTML(content); - content = content.replace(/\[tag\](.*?)\[\/tag\]/g, '$1'); + //content = (joypixels.shortnameToUnicode(content) as string) - // Youtube link - if (!GetConfiguration('youtube.publish.disabled', false)) { - content = content.replace( - /(?:http:\/\/|https:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?.*v=|shorts\/)?([a-zA-Z0-9_-]{11})/g, - ` -
- YouTube IconClick on open video to see the YouTube video -
Open Video
- ` - ); - } + if(content.startsWith('@') && content.indexOf('@', 1) > -1) + { + let match = null; - const match = content.match(/@[a-zA-Z]+@/); - if (match) { - const colorTag = match[0].toString(); - const colorName = colorTag.substr(1, colorTag.length - 2); - const text = content.replace(colorTag, ''); + while((match = /@[a-zA-Z]+@/g.exec(content)) !== null) + { + const colorTag = match[0].toString(); + const colorName = colorTag.substr(1, colorTag.length - 2); + const text = content.replace(colorTag, ''); - if (!allowedColours.has(colorName)) { - result = text; - } else { - const color = allowedColours.get(colorName); - result = `${text}`; + if(!allowedColours.has(colorName)) + { + result = text; + } + else + { + const color = allowedColours.get(colorName); + result = '' + text + ''; + } + break; } - } else { + } + else + { result = content; } return result; -} +}; diff --git a/src/api/utils/index.ts b/src/api/utils/index.ts index 0c51fc4..1824add 100644 --- a/src/api/utils/index.ts +++ b/src/api/utils/index.ts @@ -1,13 +1,15 @@ export * from './CloneObject'; export * from './ColorUtils'; export * from './ConvertSeconds'; +export * from './FixedSizeStack'; +export * from './FriendlyTime'; export * from './GetLocalStorage'; +export * from './LocalStorageKeys'; 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'; diff --git a/src/api/wired/GetWiredTimeLocale.ts b/src/api/wired/GetWiredTimeLocale.ts index 49025fe..39f3516 100644 --- a/src/api/wired/GetWiredTimeLocale.ts +++ b/src/api/wired/GetWiredTimeLocale.ts @@ -5,4 +5,4 @@ export const GetWiredTimeLocale = (value: number) => if(!(value % 2)) return time.toString(); return (time + 0.5).toString(); -} +}; diff --git a/src/api/wired/WiredSelectionFilter.ts b/src/api/wired/WiredSelectionFilter.ts deleted file mode 100644 index d661bcf..0000000 --- a/src/api/wired/WiredSelectionFilter.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { ColorConverter, NitroFilter } from '@nitrots/nitro-renderer'; - -const vertex = ` -attribute vec2 aVertexPosition; -attribute vec2 aTextureCoord; -uniform mat3 projectionMatrix; -varying vec2 vTextureCoord; -void main(void) -{ - gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); - vTextureCoord = aTextureCoord; -}`; - -const fragment = ` -varying vec2 vTextureCoord; -uniform sampler2D uSampler; -uniform vec3 lineColor; -uniform vec3 color; -void main(void) { - vec4 currentColor = texture2D(uSampler, vTextureCoord); - vec3 colorLine = lineColor * currentColor.a; - vec3 colorOverlay = color * currentColor.a; - - if(currentColor.r == 0.0 && currentColor.g == 0.0 && currentColor.b == 0.0 && currentColor.a > 0.0) { - gl_FragColor = vec4(colorLine.r, colorLine.g, colorLine.b, currentColor.a); - } else if(currentColor.a > 0.0) { - gl_FragColor = vec4(colorOverlay.r, colorOverlay.g, colorOverlay.b, currentColor.a); - } -}`; - -export class WiredSelectionFilter extends NitroFilter -{ - private _lineColor: number; - private _color: number; - - constructor(lineColor: number | number[], color: number | number[]) - { - super(vertex, fragment); - - this.uniforms.lineColor = new Float32Array(3); - this.uniforms.color = new Float32Array(3); - this.lineColor = lineColor; - this.color = color; - } - - public get lineColor(): number | number[] - { - return this._lineColor; - } - - public set lineColor(value: number | number[]) - { - const arr = this.uniforms.lineColor; - - if(typeof value === 'number') - { - ColorConverter.hex2rgb(value, arr); - - this._lineColor = value; - } - else - { - arr[0] = value[0]; - arr[1] = value[1]; - arr[2] = value[2]; - - this._lineColor = ColorConverter.rgb2hex(arr); - } - } - - public get color(): number | number[] - { - return this._color; - } - - public set color(value: number | number[]) - { - const arr = this.uniforms.color; - - if(typeof value === 'number') - { - ColorConverter.hex2rgb(value, arr); - - this._color = value; - } - else - { - arr[0] = value[0]; - arr[1] = value[1]; - arr[2] = value[2]; - - this._color = ColorConverter.rgb2hex(arr); - } - } -} diff --git a/src/api/wired/WiredSelectionVisualizer.ts b/src/api/wired/WiredSelectionVisualizer.ts index f5ed561..18edbf7 100644 --- a/src/api/wired/WiredSelectionVisualizer.ts +++ b/src/api/wired/WiredSelectionVisualizer.ts @@ -1,16 +1,11 @@ -import { IRoomObject, IRoomObjectSpriteVisualization, NitroFilter, RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { WiredSelectionFilter } from '.'; -import { GetRoomEngine } from '..'; +import { GetRoomEngine, IRoomObject, IRoomObjectSpriteVisualization, RoomObjectCategory, WiredFilter } from '@nitrots/nitro-renderer'; export class WiredSelectionVisualizer { - private static _selectionShader: NitroFilter = new WiredSelectionFilter([ 1, 1, 1 ], [ 0.6, 0.6, 0.6 ]); - private static _maxItemSelectionCount: number = 0; - - public static setMaxItemSelectionCount(count: number): void - { - WiredSelectionVisualizer._maxItemSelectionCount = count; - } + private static _selectionShader: WiredFilter = new WiredFilter({ + lineColor: [ 1, 1, 1 ], + color: [ 0.6, 0.6, 0.6 ] + }); public static show(furniId: number): void { @@ -55,9 +50,13 @@ export class WiredSelectionVisualizer for(const sprite of visualization.sprites) { - if(sprite.blendMode === 1) continue; // BLEND_MODE: ADD + if(sprite.blendMode === 'add') continue; - sprite.filters = [ WiredSelectionVisualizer._selectionShader ]; + if(!sprite.filters) sprite.filters = []; + + sprite.filters.push(WiredSelectionVisualizer._selectionShader); + + sprite.increaseUpdateCounter(); } } @@ -69,6 +68,18 @@ export class WiredSelectionVisualizer if(!visualization) return; - for(const sprite of visualization.sprites) sprite.filters = []; + for(const sprite of visualization.sprites) + { + if(!sprite.filters) continue; + + const index = sprite.filters.indexOf(WiredSelectionVisualizer._selectionShader); + + if(index >= 0) + { + sprite.filters.splice(index, 1); + + sprite.increaseUpdateCounter(); + } + } } } diff --git a/src/api/wired/index.ts b/src/api/wired/index.ts index e855881..6590adf 100644 --- a/src/api/wired/index.ts +++ b/src/api/wired/index.ts @@ -3,7 +3,6 @@ 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/avatareditor/avatar_shadow.png b/src/assets/images/avatareditor/avatar_shadow.png deleted file mode 100644 index 33397f1..0000000 Binary files a/src/assets/images/avatareditor/avatar_shadow.png and /dev/null differ diff --git a/src/assets/images/avatareditor/body.png b/src/assets/images/avatareditor/body.png deleted file mode 100644 index 6f81867..0000000 Binary files a/src/assets/images/avatareditor/body.png and /dev/null differ diff --git a/src/assets/images/avatareditor/choice_bg.png b/src/assets/images/avatareditor/choice_bg.png deleted file mode 100644 index 13a3164..0000000 Binary files a/src/assets/images/avatareditor/choice_bg.png and /dev/null differ diff --git a/src/assets/images/avatareditor/color_frame.png b/src/assets/images/avatareditor/color_frame.png deleted file mode 100644 index ed546d7..0000000 Binary files a/src/assets/images/avatareditor/color_frame.png and /dev/null differ diff --git a/src/assets/images/avatareditor/color_frame_active.png b/src/assets/images/avatareditor/color_frame_active.png deleted file mode 100644 index 4139152..0000000 Binary files a/src/assets/images/avatareditor/color_frame_active.png and /dev/null differ diff --git a/src/assets/images/avatareditor/hc_icon.png b/src/assets/images/avatareditor/hc_icon.png deleted file mode 100644 index df4c23d..0000000 Binary files a/src/assets/images/avatareditor/hc_icon.png and /dev/null differ diff --git a/src/assets/images/avatareditor/head.png b/src/assets/images/avatareditor/head.png deleted file mode 100644 index 76baf40..0000000 Binary files a/src/assets/images/avatareditor/head.png and /dev/null differ diff --git a/src/assets/images/avatareditor/legs.png b/src/assets/images/avatareditor/legs.png deleted file mode 100644 index 59076fd..0000000 Binary files a/src/assets/images/avatareditor/legs.png and /dev/null differ diff --git a/src/assets/images/avatareditor/randomize.png b/src/assets/images/avatareditor/randomize.png deleted file mode 100644 index 048f94e..0000000 Binary files a/src/assets/images/avatareditor/randomize.png and /dev/null differ diff --git a/src/assets/images/avatareditor/randomize_transparent.png b/src/assets/images/avatareditor/randomize_transparent.png deleted file mode 100644 index 382b9e0..0000000 Binary files a/src/assets/images/avatareditor/randomize_transparent.png and /dev/null differ diff --git a/src/assets/images/avatareditor/rotation_arrow.png b/src/assets/images/avatareditor/rotation_arrow.png deleted file mode 100644 index fba2b87..0000000 Binary files a/src/assets/images/avatareditor/rotation_arrow.png and /dev/null differ diff --git a/src/assets/images/avatareditor/shirts.png b/src/assets/images/avatareditor/shirts.png deleted file mode 100644 index ff77247..0000000 Binary files a/src/assets/images/avatareditor/shirts.png and /dev/null differ diff --git a/src/assets/images/avatareditor/wardrobe_bg.png b/src/assets/images/avatareditor/wardrobe_bg.png deleted file mode 100644 index 83fb613..0000000 Binary files a/src/assets/images/avatareditor/wardrobe_bg.png and /dev/null differ diff --git a/src/assets/images/avatareditor/wardrobe_left.png b/src/assets/images/avatareditor/wardrobe_left.png deleted file mode 100644 index c809048..0000000 Binary files a/src/assets/images/avatareditor/wardrobe_left.png and /dev/null differ diff --git a/src/assets/images/avatareditor/wardrobe_right.png b/src/assets/images/avatareditor/wardrobe_right.png deleted file mode 100644 index 9ddd734..0000000 Binary files a/src/assets/images/avatareditor/wardrobe_right.png and /dev/null differ diff --git a/src/assets/images/avatareditor/wardrobe_user_bg.png b/src/assets/images/avatareditor/wardrobe_user_bg.png deleted file mode 100644 index 239658c..0000000 Binary files a/src/assets/images/avatareditor/wardrobe_user_bg.png and /dev/null differ diff --git a/src/assets/images/boxes/ICONS.png b/src/assets/images/boxes/ICONS.png deleted file mode 100644 index a8df5c4..0000000 Binary files a/src/assets/images/boxes/ICONS.png and /dev/null differ diff --git a/src/assets/images/boxes/Image 1356 at frame 1.png b/src/assets/images/boxes/Image 1356 at frame 1.png deleted file mode 100644 index 535c6ce..0000000 Binary files a/src/assets/images/boxes/Image 1356 at frame 1.png and /dev/null differ diff --git a/src/assets/images/boxes/Image 1358 at frame 1.png b/src/assets/images/boxes/Image 1358 at frame 1.png deleted file mode 100644 index f6b7c75..0000000 Binary files a/src/assets/images/boxes/Image 1358 at frame 1.png and /dev/null differ diff --git a/src/assets/images/boxes/Image 1384 at frame 1.png b/src/assets/images/boxes/Image 1384 at frame 1.png deleted file mode 100644 index ec5466e..0000000 Binary files a/src/assets/images/boxes/Image 1384 at frame 1.png and /dev/null differ diff --git a/src/assets/images/boxes/Image 1386 at frame 1.png b/src/assets/images/boxes/Image 1386 at frame 1.png deleted file mode 100644 index f13d2b3..0000000 Binary files a/src/assets/images/boxes/Image 1386 at frame 1.png and /dev/null differ diff --git a/src/assets/images/boxes/Image 1404 at frame 1.png b/src/assets/images/boxes/Image 1404 at frame 1.png deleted file mode 100644 index f63184b..0000000 Binary files a/src/assets/images/boxes/Image 1404 at frame 1.png and /dev/null differ diff --git a/src/assets/images/boxes/Image 1443 at frame 1.png b/src/assets/images/boxes/Image 1443 at frame 1.png deleted file mode 100644 index 4133a4a..0000000 Binary files a/src/assets/images/boxes/Image 1443 at frame 1.png and /dev/null differ diff --git a/src/assets/images/boxes/Image 1444 at frame 1.png b/src/assets/images/boxes/Image 1444 at frame 1.png deleted file mode 100644 index cda7bd0..0000000 Binary files a/src/assets/images/boxes/Image 1444 at frame 1.png and /dev/null differ diff --git a/src/assets/images/boxes/Mouse.png b/src/assets/images/boxes/Mouse.png deleted file mode 100644 index 42fa703..0000000 Binary files a/src/assets/images/boxes/Mouse.png and /dev/null differ diff --git a/src/assets/images/boxes/UI-KIT.png b/src/assets/images/boxes/UI-KIT.png deleted file mode 100644 index ebb285b..0000000 Binary files a/src/assets/images/boxes/UI-KIT.png and /dev/null differ diff --git a/src/assets/images/boxes/UI-KIT2.png b/src/assets/images/boxes/UI-KIT2.png deleted file mode 100644 index fae4a46..0000000 Binary files a/src/assets/images/boxes/UI-KIT2.png and /dev/null differ diff --git a/src/assets/images/boxes/boxfill.png b/src/assets/images/boxes/boxfill.png deleted file mode 100644 index 9c937b3..0000000 Binary files a/src/assets/images/boxes/boxfill.png and /dev/null differ diff --git a/src/assets/images/boxes/card/body.png b/src/assets/images/boxes/card/body.png deleted file mode 100644 index db975ab..0000000 Binary files a/src/assets/images/boxes/card/body.png and /dev/null differ diff --git a/src/assets/images/boxes/card/close.png b/src/assets/images/boxes/card/close.png deleted file mode 100644 index b5347e3..0000000 Binary files a/src/assets/images/boxes/card/close.png and /dev/null differ diff --git a/src/assets/images/boxes/card/close_click.png b/src/assets/images/boxes/card/close_click.png deleted file mode 100644 index 27c5476..0000000 Binary files a/src/assets/images/boxes/card/close_click.png and /dev/null differ diff --git a/src/assets/images/boxes/card/close_hover.png b/src/assets/images/boxes/card/close_hover.png deleted file mode 100644 index 04d8668..0000000 Binary files a/src/assets/images/boxes/card/close_hover.png and /dev/null differ diff --git a/src/assets/images/boxes/card/dropdown.png b/src/assets/images/boxes/card/dropdown.png deleted file mode 100644 index acae3a6..0000000 Binary files a/src/assets/images/boxes/card/dropdown.png and /dev/null differ diff --git a/src/assets/images/boxes/card/dropdown_button.png b/src/assets/images/boxes/card/dropdown_button.png deleted file mode 100644 index 876f9ee..0000000 Binary files a/src/assets/images/boxes/card/dropdown_button.png and /dev/null differ diff --git a/src/assets/images/boxes/card/friend_req_bg.png b/src/assets/images/boxes/card/friend_req_bg.png deleted file mode 100644 index 8ba78fc..0000000 Binary files a/src/assets/images/boxes/card/friend_req_bg.png and /dev/null differ diff --git a/src/assets/images/boxes/card/friend_req_pointer.png b/src/assets/images/boxes/card/friend_req_pointer.png deleted file mode 100644 index 27c5770..0000000 Binary files a/src/assets/images/boxes/card/friend_req_pointer.png and /dev/null differ diff --git a/src/assets/images/boxes/card/grey_card.png b/src/assets/images/boxes/card/grey_card.png deleted file mode 100644 index 39ca205..0000000 Binary files a/src/assets/images/boxes/card/grey_card.png and /dev/null differ diff --git a/src/assets/images/boxes/card/input.png b/src/assets/images/boxes/card/input.png deleted file mode 100644 index f254308..0000000 Binary files a/src/assets/images/boxes/card/input.png and /dev/null differ diff --git a/src/assets/images/boxes/card/mod_close.png b/src/assets/images/boxes/card/mod_close.png deleted file mode 100644 index cfbd441..0000000 Binary files a/src/assets/images/boxes/card/mod_close.png and /dev/null differ diff --git a/src/assets/images/boxes/card/mod_window.png b/src/assets/images/boxes/card/mod_window.png deleted file mode 100644 index 8cf4df2..0000000 Binary files a/src/assets/images/boxes/card/mod_window.png and /dev/null differ diff --git a/src/assets/images/boxes/card/pen.png b/src/assets/images/boxes/card/pen.png deleted file mode 100644 index 3ca1c35..0000000 Binary files a/src/assets/images/boxes/card/pen.png and /dev/null differ diff --git a/src/assets/images/boxes/card/questionmark.png b/src/assets/images/boxes/card/questionmark.png deleted file mode 100644 index 1c9204d..0000000 Binary files a/src/assets/images/boxes/card/questionmark.png and /dev/null differ diff --git a/src/assets/images/boxes/card/questionmark_click.png b/src/assets/images/boxes/card/questionmark_click.png deleted file mode 100644 index 226b1db..0000000 Binary files a/src/assets/images/boxes/card/questionmark_click.png and /dev/null differ diff --git a/src/assets/images/boxes/card/questionmark_hover.png b/src/assets/images/boxes/card/questionmark_hover.png deleted file mode 100644 index c0689d1..0000000 Binary files a/src/assets/images/boxes/card/questionmark_hover.png and /dev/null differ diff --git a/src/assets/images/boxes/card/room_info_bg.png b/src/assets/images/boxes/card/room_info_bg.png deleted file mode 100644 index 7831f6e..0000000 Binary files a/src/assets/images/boxes/card/room_info_bg.png and /dev/null differ diff --git a/src/assets/images/boxes/card/tabs.png b/src/assets/images/boxes/card/tabs.png deleted file mode 100644 index 9a58542..0000000 Binary files a/src/assets/images/boxes/card/tabs.png and /dev/null differ diff --git a/src/assets/images/boxes/card/tabs_active.png b/src/assets/images/boxes/card/tabs_active.png deleted file mode 100644 index 9f7b400..0000000 Binary files a/src/assets/images/boxes/card/tabs_active.png and /dev/null differ diff --git a/src/assets/images/boxes/card/tabs_avatareditor.png b/src/assets/images/boxes/card/tabs_avatareditor.png deleted file mode 100644 index ded2f55..0000000 Binary files a/src/assets/images/boxes/card/tabs_avatareditor.png and /dev/null differ diff --git a/src/assets/images/boxes/card/tabs_hover.png b/src/assets/images/boxes/card/tabs_hover.png deleted file mode 100644 index 1c910a2..0000000 Binary files a/src/assets/images/boxes/card/tabs_hover.png and /dev/null differ diff --git a/src/assets/images/boxes/card/top.png b/src/assets/images/boxes/card/top.png deleted file mode 100644 index 42955b7..0000000 Binary files a/src/assets/images/boxes/card/top.png and /dev/null differ diff --git a/src/assets/images/buttons/accept.png b/src/assets/images/buttons/accept.png deleted file mode 100644 index 3e14c05..0000000 Binary files a/src/assets/images/buttons/accept.png and /dev/null differ diff --git a/src/assets/images/buttons/button.png b/src/assets/images/buttons/button.png deleted file mode 100644 index 6b778ab..0000000 Binary files a/src/assets/images/buttons/button.png and /dev/null differ diff --git a/src/assets/images/buttons/button_active.png b/src/assets/images/buttons/button_active.png deleted file mode 100644 index 449b5ea..0000000 Binary files a/src/assets/images/buttons/button_active.png and /dev/null differ diff --git a/src/assets/images/buttons/button_gray.png b/src/assets/images/buttons/button_gray.png deleted file mode 100644 index b2ca49c..0000000 Binary files a/src/assets/images/buttons/button_gray.png and /dev/null differ diff --git a/src/assets/images/buttons/button_gray_active.png b/src/assets/images/buttons/button_gray_active.png deleted file mode 100644 index 0b60ede..0000000 Binary files a/src/assets/images/buttons/button_gray_active.png and /dev/null differ diff --git a/src/assets/images/buttons/button_gray_hover.png b/src/assets/images/buttons/button_gray_hover.png deleted file mode 100644 index c6170ec..0000000 Binary files a/src/assets/images/buttons/button_gray_hover.png and /dev/null differ diff --git a/src/assets/images/buttons/button_hover.png b/src/assets/images/buttons/button_hover.png deleted file mode 100644 index e708bbd..0000000 Binary files a/src/assets/images/buttons/button_hover.png and /dev/null differ diff --git a/src/assets/images/buttons/button_inactive.png b/src/assets/images/buttons/button_inactive.png deleted file mode 100644 index 23f877e..0000000 Binary files a/src/assets/images/buttons/button_inactive.png and /dev/null differ diff --git a/src/assets/images/buttons/button_success.png b/src/assets/images/buttons/button_success.png deleted file mode 100644 index b788d0a..0000000 Binary files a/src/assets/images/buttons/button_success.png and /dev/null differ diff --git a/src/assets/images/buttons/button_success_active.png b/src/assets/images/buttons/button_success_active.png deleted file mode 100644 index adb2d1b..0000000 Binary files a/src/assets/images/buttons/button_success_active.png and /dev/null differ diff --git a/src/assets/images/buttons/button_success_hover.png b/src/assets/images/buttons/button_success_hover.png deleted file mode 100644 index e41d115..0000000 Binary files a/src/assets/images/buttons/button_success_hover.png and /dev/null differ diff --git a/src/assets/images/buttons/checkbox.png b/src/assets/images/buttons/checkbox.png deleted file mode 100644 index 657dea8..0000000 Binary files a/src/assets/images/buttons/checkbox.png and /dev/null differ diff --git a/src/assets/images/buttons/checkbox_checked.png b/src/assets/images/buttons/checkbox_checked.png deleted file mode 100644 index 606ea5b..0000000 Binary files a/src/assets/images/buttons/checkbox_checked.png and /dev/null differ diff --git a/src/assets/images/buttons/decline.png b/src/assets/images/buttons/decline.png deleted file mode 100644 index 5887342..0000000 Binary files a/src/assets/images/buttons/decline.png and /dev/null differ diff --git a/src/assets/images/buttons/toggle_bg.png b/src/assets/images/buttons/toggle_bg.png deleted file mode 100644 index ffb1ca4..0000000 Binary files a/src/assets/images/buttons/toggle_bg.png and /dev/null differ diff --git a/src/assets/images/buttons/toggle_left.png b/src/assets/images/buttons/toggle_left.png deleted file mode 100644 index 52c4e58..0000000 Binary files a/src/assets/images/buttons/toggle_left.png and /dev/null differ diff --git a/src/assets/images/buttons/toggle_right.png b/src/assets/images/buttons/toggle_right.png deleted file mode 100644 index 0b28e70..0000000 Binary files a/src/assets/images/buttons/toggle_right.png and /dev/null differ diff --git a/src/assets/images/buttons/volter_bold_btn.png b/src/assets/images/buttons/volter_bold_btn.png deleted file mode 100644 index 4a690a5..0000000 Binary files a/src/assets/images/buttons/volter_bold_btn.png and /dev/null differ diff --git a/src/assets/images/buttons/volter_bold_btn_active.png b/src/assets/images/buttons/volter_bold_btn_active.png deleted file mode 100644 index 43b2ab1..0000000 Binary files a/src/assets/images/buttons/volter_bold_btn_active.png and /dev/null differ diff --git a/src/assets/images/buttons/volter_bold_btn_hover.png b/src/assets/images/buttons/volter_bold_btn_hover.png deleted file mode 100644 index 355bcce..0000000 Binary files a/src/assets/images/buttons/volter_bold_btn_hover.png and /dev/null differ diff --git a/src/assets/images/buttons/volter_normal_btn.png b/src/assets/images/buttons/volter_normal_btn.png deleted file mode 100644 index 68d7468..0000000 Binary files a/src/assets/images/buttons/volter_normal_btn.png and /dev/null differ diff --git a/src/assets/images/buttons/volter_normal_btn_active.png b/src/assets/images/buttons/volter_normal_btn_active.png deleted file mode 100644 index f7f81be..0000000 Binary files a/src/assets/images/buttons/volter_normal_btn_active.png and /dev/null differ diff --git a/src/assets/images/buttons/volter_normal_btn_hover.png b/src/assets/images/buttons/volter_normal_btn_hover.png deleted file mode 100644 index fbaf75c..0000000 Binary files a/src/assets/images/buttons/volter_normal_btn_hover.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_39.png b/src/assets/images/chat/chatbubbles/bubble_39.png deleted file mode 100644 index 4dddcba..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_39.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_39_pointer.png b/src/assets/images/chat/chatbubbles/bubble_39_pointer.png deleted file mode 100644 index b73b25b..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_39_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_40.png b/src/assets/images/chat/chatbubbles/bubble_40.png deleted file mode 100644 index 0c14786..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_40.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_40_pointer.png b/src/assets/images/chat/chatbubbles/bubble_40_pointer.png deleted file mode 100644 index b73b25b..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_40_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_41.png b/src/assets/images/chat/chatbubbles/bubble_41.png deleted file mode 100644 index e5d1049..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_41.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_41_pointer.png b/src/assets/images/chat/chatbubbles/bubble_41_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_41_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_42.png b/src/assets/images/chat/chatbubbles/bubble_42.png deleted file mode 100644 index 0d0b56f..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_42.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_42_pointer.png b/src/assets/images/chat/chatbubbles/bubble_42_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_42_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_43.png b/src/assets/images/chat/chatbubbles/bubble_43.png deleted file mode 100644 index d328a02..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_43.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_43_pointer.png b/src/assets/images/chat/chatbubbles/bubble_43_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_43_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_44.png b/src/assets/images/chat/chatbubbles/bubble_44.png deleted file mode 100644 index 9f092f7..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_44.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_44_pointer.png b/src/assets/images/chat/chatbubbles/bubble_44_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_44_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_45.png b/src/assets/images/chat/chatbubbles/bubble_45.png deleted file mode 100644 index 79c77e4..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_45.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_45_pointer.png b/src/assets/images/chat/chatbubbles/bubble_45_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_45_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_46.png b/src/assets/images/chat/chatbubbles/bubble_46.png deleted file mode 100644 index 0db754d..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_46.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_46_pointer.png b/src/assets/images/chat/chatbubbles/bubble_46_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_46_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_47.png b/src/assets/images/chat/chatbubbles/bubble_47.png deleted file mode 100644 index 7e566f4..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_47.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_47_pointer.png b/src/assets/images/chat/chatbubbles/bubble_47_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_47_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_48.png b/src/assets/images/chat/chatbubbles/bubble_48.png deleted file mode 100644 index 74a5751..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_48.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_48_pointer.png b/src/assets/images/chat/chatbubbles/bubble_48_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_48_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_49.png b/src/assets/images/chat/chatbubbles/bubble_49.png deleted file mode 100644 index 0dc74ec..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_49.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_49_pointer.png b/src/assets/images/chat/chatbubbles/bubble_49_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_49_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_50.png b/src/assets/images/chat/chatbubbles/bubble_50.png deleted file mode 100644 index efe1680..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_50.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_50_pointer.png b/src/assets/images/chat/chatbubbles/bubble_50_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_50_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_51.png b/src/assets/images/chat/chatbubbles/bubble_51.png deleted file mode 100644 index 9bdddcb..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_51.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_51_pointer.png b/src/assets/images/chat/chatbubbles/bubble_51_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_51_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_52.png b/src/assets/images/chat/chatbubbles/bubble_52.png deleted file mode 100644 index baeed11..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_52.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_52_pointer.png b/src/assets/images/chat/chatbubbles/bubble_52_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_52_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_53.png b/src/assets/images/chat/chatbubbles/bubble_53.png deleted file mode 100644 index 32eb3e4..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_53.png and /dev/null differ diff --git a/src/assets/images/chat/chatbubbles/bubble_53_pointer.png b/src/assets/images/chat/chatbubbles/bubble_53_pointer.png deleted file mode 100644 index fc2bead..0000000 Binary files a/src/assets/images/chat/chatbubbles/bubble_53_pointer.png and /dev/null differ diff --git a/src/assets/images/chat/deleteaudio.png b/src/assets/images/chat/deleteaudio.png deleted file mode 100644 index ba4c3a6..0000000 Binary files a/src/assets/images/chat/deleteaudio.png and /dev/null differ diff --git a/src/assets/images/chat/equis.png b/src/assets/images/chat/equis.png deleted file mode 100644 index 8cbad96..0000000 Binary files a/src/assets/images/chat/equis.png and /dev/null differ diff --git a/src/assets/images/chat/mas.png b/src/assets/images/chat/mas.png deleted file mode 100644 index 987fcf9..0000000 Binary files a/src/assets/images/chat/mas.png and /dev/null differ diff --git a/src/assets/images/chat/microphone-off.png b/src/assets/images/chat/microphone-off.png deleted file mode 100644 index 839e894..0000000 Binary files a/src/assets/images/chat/microphone-off.png and /dev/null differ diff --git a/src/assets/images/chat/microphone-on.png b/src/assets/images/chat/microphone-on.png deleted file mode 100644 index 9690cea..0000000 Binary files a/src/assets/images/chat/microphone-on.png and /dev/null differ diff --git a/src/assets/images/chat/sticker.png b/src/assets/images/chat/sticker.png deleted file mode 100644 index e6f21ba..0000000 Binary files a/src/assets/images/chat/sticker.png and /dev/null differ diff --git a/src/assets/images/chat/stickers-icon.png b/src/assets/images/chat/stickers-icon.png deleted file mode 100644 index 28f813d..0000000 Binary files a/src/assets/images/chat/stickers-icon.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/icon-active-squaresselect.png b/src/assets/images/floorplaneditor/icon-active-squaresselect.png deleted file mode 100644 index ea9d9f7..0000000 Binary files a/src/assets/images/floorplaneditor/icon-active-squaresselect.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/icon-deselect.png b/src/assets/images/floorplaneditor/icon-deselect.png deleted file mode 100644 index 6fa4f74..0000000 Binary files a/src/assets/images/floorplaneditor/icon-deselect.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/icon-select.png b/src/assets/images/floorplaneditor/icon-select.png deleted file mode 100644 index dc81c0e..0000000 Binary files a/src/assets/images/floorplaneditor/icon-select.png and /dev/null differ diff --git a/src/assets/images/floorplaneditor/icon-squaresselect.png b/src/assets/images/floorplaneditor/icon-squaresselect.png deleted file mode 100644 index 351098a..0000000 Binary files a/src/assets/images/floorplaneditor/icon-squaresselect.png and /dev/null differ diff --git a/src/assets/images/hotelview/arrow_down.png b/src/assets/images/hotelview/arrow_down.png deleted file mode 100644 index 70d0b9c..0000000 Binary files a/src/assets/images/hotelview/arrow_down.png and /dev/null differ diff --git a/src/assets/images/hotelview/common/infobus.gif b/src/assets/images/hotelview/common/infobus.gif deleted file mode 100644 index f15e9a4..0000000 Binary files a/src/assets/images/hotelview/common/infobus.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/lobby.png b/src/assets/images/hotelview/common/lobby.png deleted file mode 100644 index f5f3e86..0000000 Binary files a/src/assets/images/hotelview/common/lobby.png and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/hotelview-night.png b/src/assets/images/hotelview/common/night/hotelview-night.png deleted file mode 100644 index a524251..0000000 Binary files a/src/assets/images/hotelview/common/night/hotelview-night.png and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/hotelview4.psd b/src/assets/images/hotelview/common/night/hotelview4.psd deleted file mode 100644 index 5bcc659..0000000 Binary files a/src/assets/images/hotelview/common/night/hotelview4.psd and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/night-door-1.gif b/src/assets/images/hotelview/common/night/night-door-1.gif deleted file mode 100644 index f9646bb..0000000 Binary files a/src/assets/images/hotelview/common/night/night-door-1.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/night-door-2.gif b/src/assets/images/hotelview/common/night/night-door-2.gif deleted file mode 100644 index 2f5e352..0000000 Binary files a/src/assets/images/hotelview/common/night/night-door-2.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/night-door.gif b/src/assets/images/hotelview/common/night/night-door.gif deleted file mode 100644 index 364c0da..0000000 Binary files a/src/assets/images/hotelview/common/night/night-door.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/night-hotelview.png b/src/assets/images/hotelview/common/night/night-hotelview.png deleted file mode 100644 index e870008..0000000 Binary files a/src/assets/images/hotelview/common/night/night-hotelview.png and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/night-infobus.gif b/src/assets/images/hotelview/common/night/night-infobus.gif deleted file mode 100644 index df2b710..0000000 Binary files a/src/assets/images/hotelview/common/night/night-infobus.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/night-lobby.png b/src/assets/images/hotelview/common/night/night-lobby.png deleted file mode 100644 index 5a4ac08..0000000 Binary files a/src/assets/images/hotelview/common/night/night-lobby.png and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/night-park.png b/src/assets/images/hotelview/common/night/night-park.png deleted file mode 100644 index 06f7b63..0000000 Binary files a/src/assets/images/hotelview/common/night/night-park.png and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/night-picnic.gif b/src/assets/images/hotelview/common/night/night-picnic.gif deleted file mode 100644 index 39cb34b..0000000 Binary files a/src/assets/images/hotelview/common/night/night-picnic.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/night-pool.gif b/src/assets/images/hotelview/common/night/night-pool.gif deleted file mode 100644 index e5b8493..0000000 Binary files a/src/assets/images/hotelview/common/night/night-pool.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/night-rooftop.png b/src/assets/images/hotelview/common/night/night-rooftop.png deleted file mode 100644 index 04414d3..0000000 Binary files a/src/assets/images/hotelview/common/night/night-rooftop.png and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/night-rooftop_pool.gif b/src/assets/images/hotelview/common/night/night-rooftop_pool.gif deleted file mode 100644 index c24818e..0000000 Binary files a/src/assets/images/hotelview/common/night/night-rooftop_pool.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/night/wat--dooor.gif b/src/assets/images/hotelview/common/night/wat--dooor.gif deleted file mode 100644 index 544ee06..0000000 Binary files a/src/assets/images/hotelview/common/night/wat--dooor.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/orange/arrow_down.png b/src/assets/images/hotelview/common/orange/arrow_down.png deleted file mode 100644 index 70d0b9c..0000000 Binary files a/src/assets/images/hotelview/common/orange/arrow_down.png and /dev/null differ diff --git a/src/assets/images/hotelview/common/orange/hotelview2.png b/src/assets/images/hotelview/common/orange/hotelview2.png deleted file mode 100644 index c761745..0000000 Binary files a/src/assets/images/hotelview/common/orange/hotelview2.png and /dev/null differ diff --git a/src/assets/images/hotelview/common/orange/infobus.gif b/src/assets/images/hotelview/common/orange/infobus.gif deleted file mode 100644 index f15e9a4..0000000 Binary files a/src/assets/images/hotelview/common/orange/infobus.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/orange/peacefulpark.gif b/src/assets/images/hotelview/common/orange/peacefulpark.gif deleted file mode 100644 index 9bde74a..0000000 Binary files a/src/assets/images/hotelview/common/orange/peacefulpark.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/orange/picnic.gif b/src/assets/images/hotelview/common/orange/picnic.gif deleted file mode 100644 index 974be1e..0000000 Binary files a/src/assets/images/hotelview/common/orange/picnic.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/orange/pool.gif b/src/assets/images/hotelview/common/orange/pool.gif deleted file mode 100644 index b623709..0000000 Binary files a/src/assets/images/hotelview/common/orange/pool.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/orange/rooftop.gif b/src/assets/images/hotelview/common/orange/rooftop.gif deleted file mode 100644 index 9bb7a5e..0000000 Binary files a/src/assets/images/hotelview/common/orange/rooftop.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/orange/rooftop_pool.gif b/src/assets/images/hotelview/common/orange/rooftop_pool.gif deleted file mode 100644 index b5183c8..0000000 Binary files a/src/assets/images/hotelview/common/orange/rooftop_pool.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/peacefulpark.gif b/src/assets/images/hotelview/common/peacefulpark.gif deleted file mode 100644 index 9bde74a..0000000 Binary files a/src/assets/images/hotelview/common/peacefulpark.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/picnic.gif b/src/assets/images/hotelview/common/picnic.gif deleted file mode 100644 index 18ed53b..0000000 Binary files a/src/assets/images/hotelview/common/picnic.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/pool.gif b/src/assets/images/hotelview/common/pool.gif deleted file mode 100644 index 18aea23..0000000 Binary files a/src/assets/images/hotelview/common/pool.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/rooftop.gif b/src/assets/images/hotelview/common/rooftop.gif deleted file mode 100644 index 5d53599..0000000 Binary files a/src/assets/images/hotelview/common/rooftop.gif and /dev/null differ diff --git a/src/assets/images/hotelview/common/rooftop_pool.gif b/src/assets/images/hotelview/common/rooftop_pool.gif deleted file mode 100644 index d74569c..0000000 Binary files a/src/assets/images/hotelview/common/rooftop_pool.gif and /dev/null differ diff --git a/src/assets/images/hotelview/drape.png b/src/assets/images/hotelview/drape.png deleted file mode 100644 index 0003da2..0000000 Binary files a/src/assets/images/hotelview/drape.png and /dev/null differ diff --git a/src/assets/images/hotelview/halloffame/sheet.png b/src/assets/images/hotelview/halloffame/sheet.png deleted file mode 100644 index 51c8874..0000000 Binary files a/src/assets/images/hotelview/halloffame/sheet.png and /dev/null differ diff --git a/src/assets/images/hotelview/hotelview-night-orange.png b/src/assets/images/hotelview/hotelview-night-orange.png deleted file mode 100644 index 10122df..0000000 Binary files a/src/assets/images/hotelview/hotelview-night-orange.png and /dev/null differ diff --git a/src/assets/images/hotelview/hotelview-night.png b/src/assets/images/hotelview/hotelview-night.png deleted file mode 100644 index 32de48b..0000000 Binary files a/src/assets/images/hotelview/hotelview-night.png and /dev/null differ diff --git a/src/assets/images/hotelview/hotelview-orange.png b/src/assets/images/hotelview/hotelview-orange.png deleted file mode 100644 index 62609c2..0000000 Binary files a/src/assets/images/hotelview/hotelview-orange.png and /dev/null differ diff --git a/src/assets/images/hotelview/hotelview.png b/src/assets/images/hotelview/hotelview.png deleted file mode 100644 index d63257e..0000000 Binary files a/src/assets/images/hotelview/hotelview.png and /dev/null differ diff --git a/src/assets/images/hotelview/hotelview2.png b/src/assets/images/hotelview/hotelview2.png deleted file mode 100644 index fe50b2e..0000000 Binary files a/src/assets/images/hotelview/hotelview2.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/a.png b/src/assets/images/hotelview/hours/back/a.png deleted file mode 100644 index 14eb6ae..0000000 Binary files a/src/assets/images/hotelview/hours/back/a.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/b.png b/src/assets/images/hotelview/hours/back/b.png deleted file mode 100644 index d6daaa7..0000000 Binary files a/src/assets/images/hotelview/hours/back/b.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/c.png b/src/assets/images/hotelview/hours/back/c.png deleted file mode 100644 index df5c3b7..0000000 Binary files a/src/assets/images/hotelview/hours/back/c.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/d.png b/src/assets/images/hotelview/hours/back/d.png deleted file mode 100644 index a7dabcc..0000000 Binary files a/src/assets/images/hotelview/hours/back/d.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/e.png b/src/assets/images/hotelview/hours/back/e.png deleted file mode 100644 index 6b7aac8..0000000 Binary files a/src/assets/images/hotelview/hours/back/e.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/ee.png b/src/assets/images/hotelview/hours/back/ee.png deleted file mode 100644 index 505158e..0000000 Binary files a/src/assets/images/hotelview/hours/back/ee.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/f.png b/src/assets/images/hotelview/hours/back/f.png deleted file mode 100644 index 06428f9..0000000 Binary files a/src/assets/images/hotelview/hours/back/f.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/g.png b/src/assets/images/hotelview/hours/back/g.png deleted file mode 100644 index 49fb649..0000000 Binary files a/src/assets/images/hotelview/hours/back/g.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/general.png b/src/assets/images/hotelview/hours/back/general.png deleted file mode 100644 index 1b626c1..0000000 Binary files a/src/assets/images/hotelview/hours/back/general.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/h.png b/src/assets/images/hotelview/hours/back/h.png deleted file mode 100644 index 67d14f5..0000000 Binary files a/src/assets/images/hotelview/hours/back/h.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/i.png b/src/assets/images/hotelview/hours/back/i.png deleted file mode 100644 index 25b128d..0000000 Binary files a/src/assets/images/hotelview/hours/back/i.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/j.png b/src/assets/images/hotelview/hours/back/j.png deleted file mode 100644 index cd86163..0000000 Binary files a/src/assets/images/hotelview/hours/back/j.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/kk.png b/src/assets/images/hotelview/hours/back/kk.png deleted file mode 100644 index 8ebbd9c..0000000 Binary files a/src/assets/images/hotelview/hours/back/kk.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/kkkk.png b/src/assets/images/hotelview/hours/back/kkkk.png deleted file mode 100644 index 0fe3e95..0000000 Binary files a/src/assets/images/hotelview/hours/back/kkkk.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/l.png b/src/assets/images/hotelview/hours/back/l.png deleted file mode 100644 index 13406ea..0000000 Binary files a/src/assets/images/hotelview/hours/back/l.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/m.png b/src/assets/images/hotelview/hours/back/m.png deleted file mode 100644 index af0fbba..0000000 Binary files a/src/assets/images/hotelview/hours/back/m.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/na.png b/src/assets/images/hotelview/hours/back/na.png deleted file mode 100644 index c8f00dc..0000000 Binary files a/src/assets/images/hotelview/hours/back/na.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old-2/j.png b/src/assets/images/hotelview/hours/back/old-2/j.png deleted file mode 100644 index cd86163..0000000 Binary files a/src/assets/images/hotelview/hours/back/old-2/j.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old-2/kk.png b/src/assets/images/hotelview/hours/back/old-2/kk.png deleted file mode 100644 index 8ebbd9c..0000000 Binary files a/src/assets/images/hotelview/hours/back/old-2/kk.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old-2/kkk.png b/src/assets/images/hotelview/hours/back/old-2/kkk.png deleted file mode 100644 index fe156c5..0000000 Binary files a/src/assets/images/hotelview/hours/back/old-2/kkk.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old-2/l.png b/src/assets/images/hotelview/hours/back/old-2/l.png deleted file mode 100644 index 13406ea..0000000 Binary files a/src/assets/images/hotelview/hours/back/old-2/l.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old-2/m.png b/src/assets/images/hotelview/hours/back/old-2/m.png deleted file mode 100644 index af0fbba..0000000 Binary files a/src/assets/images/hotelview/hours/back/old-2/m.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old-2/nn.png b/src/assets/images/hotelview/hours/back/old-2/nn.png deleted file mode 100644 index 3db4d4b..0000000 Binary files a/src/assets/images/hotelview/hours/back/old-2/nn.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old/a.png b/src/assets/images/hotelview/hours/back/old/a.png deleted file mode 100644 index 259cd12..0000000 Binary files a/src/assets/images/hotelview/hours/back/old/a.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old/cc.png b/src/assets/images/hotelview/hours/back/old/cc.png deleted file mode 100644 index df5c3b7..0000000 Binary files a/src/assets/images/hotelview/hours/back/old/cc.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old/d.png b/src/assets/images/hotelview/hours/back/old/d.png deleted file mode 100644 index 66d1793..0000000 Binary files a/src/assets/images/hotelview/hours/back/old/d.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old/ee.png b/src/assets/images/hotelview/hours/back/old/ee.png deleted file mode 100644 index 505158e..0000000 Binary files a/src/assets/images/hotelview/hours/back/old/ee.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old/f.png b/src/assets/images/hotelview/hours/back/old/f.png deleted file mode 100644 index 54b0a09..0000000 Binary files a/src/assets/images/hotelview/hours/back/old/f.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old/g.png b/src/assets/images/hotelview/hours/back/old/g.png deleted file mode 100644 index 3f9c536..0000000 Binary files a/src/assets/images/hotelview/hours/back/old/g.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old/h.png b/src/assets/images/hotelview/hours/back/old/h.png deleted file mode 100644 index 1e2d5c1..0000000 Binary files a/src/assets/images/hotelview/hours/back/old/h.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old/i.png b/src/assets/images/hotelview/hours/back/old/i.png deleted file mode 100644 index 0d3d7fd..0000000 Binary files a/src/assets/images/hotelview/hours/back/old/i.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old/j.png b/src/assets/images/hotelview/hours/back/old/j.png deleted file mode 100644 index 37d041c..0000000 Binary files a/src/assets/images/hotelview/hours/back/old/j.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/old/l.png b/src/assets/images/hotelview/hours/back/old/l.png deleted file mode 100644 index 7942895..0000000 Binary files a/src/assets/images/hotelview/hours/back/old/l.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/orig_kkk.png b/src/assets/images/hotelview/hours/back/orig_kkk.png deleted file mode 100644 index 150c05c..0000000 Binary files a/src/assets/images/hotelview/hours/back/orig_kkk.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/back/orig_nn.png b/src/assets/images/hotelview/hours/back/orig_nn.png deleted file mode 100644 index 5ce53b0..0000000 Binary files a/src/assets/images/hotelview/hours/back/orig_nn.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/a.png b/src/assets/images/hotelview/hours/front/a.png deleted file mode 100644 index 2cf7117..0000000 Binary files a/src/assets/images/hotelview/hours/front/a.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/b.png b/src/assets/images/hotelview/hours/front/b.png deleted file mode 100644 index ed45189..0000000 Binary files a/src/assets/images/hotelview/hours/front/b.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/c.png b/src/assets/images/hotelview/hours/front/c.png deleted file mode 100644 index decd7bb..0000000 Binary files a/src/assets/images/hotelview/hours/front/c.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/d.png b/src/assets/images/hotelview/hours/front/d.png deleted file mode 100644 index 6eea83f..0000000 Binary files a/src/assets/images/hotelview/hours/front/d.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/e.png b/src/assets/images/hotelview/hours/front/e.png deleted file mode 100644 index 1afb16a..0000000 Binary files a/src/assets/images/hotelview/hours/front/e.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/f.png b/src/assets/images/hotelview/hours/front/f.png deleted file mode 100644 index c70de47..0000000 Binary files a/src/assets/images/hotelview/hours/front/f.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/g.png b/src/assets/images/hotelview/hours/front/g.png deleted file mode 100644 index a8b835d..0000000 Binary files a/src/assets/images/hotelview/hours/front/g.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/h.png b/src/assets/images/hotelview/hours/front/h.png deleted file mode 100644 index bf61032..0000000 Binary files a/src/assets/images/hotelview/hours/front/h.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/i.png b/src/assets/images/hotelview/hours/front/i.png deleted file mode 100644 index 6118f06..0000000 Binary files a/src/assets/images/hotelview/hours/front/i.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/j.png b/src/assets/images/hotelview/hours/front/j.png deleted file mode 100644 index 1114764..0000000 Binary files a/src/assets/images/hotelview/hours/front/j.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/k.png b/src/assets/images/hotelview/hours/front/k.png deleted file mode 100644 index 27a37fe..0000000 Binary files a/src/assets/images/hotelview/hours/front/k.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/l.png b/src/assets/images/hotelview/hours/front/l.png deleted file mode 100644 index 1a9483c..0000000 Binary files a/src/assets/images/hotelview/hours/front/l.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/m.png b/src/assets/images/hotelview/hours/front/m.png deleted file mode 100644 index b30fd8f..0000000 Binary files a/src/assets/images/hotelview/hours/front/m.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/old-2/l.png b/src/assets/images/hotelview/hours/front/old-2/l.png deleted file mode 100644 index 9424de0..0000000 Binary files a/src/assets/images/hotelview/hours/front/old-2/l.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/front/old-2/m.png b/src/assets/images/hotelview/hours/front/old-2/m.png deleted file mode 100644 index 0663c1d..0000000 Binary files a/src/assets/images/hotelview/hours/front/old-2/m.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/a.png b/src/assets/images/hotelview/hours/light/a.png deleted file mode 100644 index 0b2a971..0000000 Binary files a/src/assets/images/hotelview/hours/light/a.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/b.png b/src/assets/images/hotelview/hours/light/b.png deleted file mode 100644 index 355cfbc..0000000 Binary files a/src/assets/images/hotelview/hours/light/b.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/c.png b/src/assets/images/hotelview/hours/light/c.png deleted file mode 100644 index 7155be1..0000000 Binary files a/src/assets/images/hotelview/hours/light/c.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/d.png b/src/assets/images/hotelview/hours/light/d.png deleted file mode 100644 index 47c0d0d..0000000 Binary files a/src/assets/images/hotelview/hours/light/d.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/e.png b/src/assets/images/hotelview/hours/light/e.png deleted file mode 100644 index 2e21765..0000000 Binary files a/src/assets/images/hotelview/hours/light/e.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/f.png b/src/assets/images/hotelview/hours/light/f.png deleted file mode 100644 index 24624e3..0000000 Binary files a/src/assets/images/hotelview/hours/light/f.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/g.png b/src/assets/images/hotelview/hours/light/g.png deleted file mode 100644 index 132cd7a..0000000 Binary files a/src/assets/images/hotelview/hours/light/g.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/h.png b/src/assets/images/hotelview/hours/light/h.png deleted file mode 100644 index 8b98b22..0000000 Binary files a/src/assets/images/hotelview/hours/light/h.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/i.png b/src/assets/images/hotelview/hours/light/i.png deleted file mode 100644 index 1cdb4bc..0000000 Binary files a/src/assets/images/hotelview/hours/light/i.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/j.png b/src/assets/images/hotelview/hours/light/j.png deleted file mode 100644 index a877d1e..0000000 Binary files a/src/assets/images/hotelview/hours/light/j.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/l.png b/src/assets/images/hotelview/hours/light/l.png deleted file mode 100644 index 6c7969e..0000000 Binary files a/src/assets/images/hotelview/hours/light/l.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/m.png b/src/assets/images/hotelview/hours/light/m.png deleted file mode 100644 index ff7b5af..0000000 Binary files a/src/assets/images/hotelview/hours/light/m.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/n.png b/src/assets/images/hotelview/hours/light/n.png deleted file mode 100644 index fc58f35..0000000 Binary files a/src/assets/images/hotelview/hours/light/n.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/o.png b/src/assets/images/hotelview/hours/light/o.png deleted file mode 100644 index 635c09c..0000000 Binary files a/src/assets/images/hotelview/hours/light/o.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/old/n.png b/src/assets/images/hotelview/hours/light/old/n.png deleted file mode 100644 index 4632d03..0000000 Binary files a/src/assets/images/hotelview/hours/light/old/n.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/old/o.png b/src/assets/images/hotelview/hours/light/old/o.png deleted file mode 100644 index 787c86b..0000000 Binary files a/src/assets/images/hotelview/hours/light/old/o.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/old/p.png b/src/assets/images/hotelview/hours/light/old/p.png deleted file mode 100644 index 86c1922..0000000 Binary files a/src/assets/images/hotelview/hours/light/old/p.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/old/qq.png b/src/assets/images/hotelview/hours/light/old/qq.png deleted file mode 100644 index 17e8e41..0000000 Binary files a/src/assets/images/hotelview/hours/light/old/qq.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/p.png b/src/assets/images/hotelview/hours/light/p.png deleted file mode 100644 index 5623244..0000000 Binary files a/src/assets/images/hotelview/hours/light/p.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/pp.png b/src/assets/images/hotelview/hours/light/pp.png deleted file mode 100644 index 060d86c..0000000 Binary files a/src/assets/images/hotelview/hours/light/pp.png and /dev/null differ diff --git a/src/assets/images/hotelview/hours/light/q.png b/src/assets/images/hotelview/hours/light/q.png deleted file mode 100644 index ab8b13e..0000000 Binary files a/src/assets/images/hotelview/hours/light/q.png and /dev/null differ diff --git a/src/assets/images/hotelview/infobus.gif b/src/assets/images/hotelview/infobus.gif deleted file mode 100644 index f15e9a4..0000000 Binary files a/src/assets/images/hotelview/infobus.gif and /dev/null differ diff --git a/src/assets/images/hotelview/infobus.png b/src/assets/images/hotelview/infobus.png deleted file mode 100644 index 3c21c42..0000000 Binary files a/src/assets/images/hotelview/infobus.png and /dev/null differ diff --git a/src/assets/images/hotelview/lobby.png b/src/assets/images/hotelview/lobby.png deleted file mode 100644 index f5f3e86..0000000 Binary files a/src/assets/images/hotelview/lobby.png and /dev/null differ diff --git a/src/assets/images/hotelview/peacefulpark.png b/src/assets/images/hotelview/peacefulpark.png deleted file mode 100644 index dacda0d..0000000 Binary files a/src/assets/images/hotelview/peacefulpark.png and /dev/null differ diff --git a/src/assets/images/hotelview/picnic.gif b/src/assets/images/hotelview/picnic.gif deleted file mode 100644 index a46fe65..0000000 Binary files a/src/assets/images/hotelview/picnic.gif and /dev/null differ diff --git a/src/assets/images/hotelview/picnic.png b/src/assets/images/hotelview/picnic.png deleted file mode 100644 index 95115c4..0000000 Binary files a/src/assets/images/hotelview/picnic.png and /dev/null differ diff --git a/src/assets/images/hotelview/picnic2.png b/src/assets/images/hotelview/picnic2.png deleted file mode 100644 index c5c9add..0000000 Binary files a/src/assets/images/hotelview/picnic2.png and /dev/null differ diff --git a/src/assets/images/hotelview/pool.gif b/src/assets/images/hotelview/pool.gif deleted file mode 100644 index b865eaf..0000000 Binary files a/src/assets/images/hotelview/pool.gif and /dev/null differ diff --git a/src/assets/images/hotelview/pool.png b/src/assets/images/hotelview/pool.png deleted file mode 100644 index 54c2c32..0000000 Binary files a/src/assets/images/hotelview/pool.png and /dev/null differ diff --git a/src/assets/images/hotelview/rooftop.png b/src/assets/images/hotelview/rooftop.png deleted file mode 100644 index 907f311..0000000 Binary files a/src/assets/images/hotelview/rooftop.png and /dev/null differ diff --git a/src/assets/images/hotelview/rooftop_pool.gif b/src/assets/images/hotelview/rooftop_pool.gif deleted file mode 100644 index b77ada6..0000000 Binary files a/src/assets/images/hotelview/rooftop_pool.gif and /dev/null differ diff --git a/src/assets/images/hotelview/rooftop_pool.png b/src/assets/images/hotelview/rooftop_pool.png deleted file mode 100644 index e832b7c..0000000 Binary files a/src/assets/images/hotelview/rooftop_pool.png and /dev/null differ diff --git a/src/assets/images/hotelview/sprite.gif b/src/assets/images/hotelview/sprite.gif deleted file mode 100644 index d5dad00..0000000 Binary files a/src/assets/images/hotelview/sprite.gif and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/old/stretch_blue_af_5.png b/src/assets/images/hotelview/stretch/old/stretch_blue_af_5.png deleted file mode 100644 index 459f235..0000000 Binary files a/src/assets/images/hotelview/stretch/old/stretch_blue_af_5.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/orig_stretch_blue.png b/src/assets/images/hotelview/stretch/orig_stretch_blue.png deleted file mode 100644 index b21d4f4..0000000 Binary files a/src/assets/images/hotelview/stretch/orig_stretch_blue.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_1.png b/src/assets/images/hotelview/stretch/orig_stretch_blue_af_1.png deleted file mode 100644 index 7ed2108..0000000 Binary files a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_1.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_2.png b/src/assets/images/hotelview/stretch/orig_stretch_blue_af_2.png deleted file mode 100644 index 33e8577..0000000 Binary files a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_2.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_3.png b/src/assets/images/hotelview/stretch/orig_stretch_blue_af_3.png deleted file mode 100644 index a57a158..0000000 Binary files a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_3.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_4.png b/src/assets/images/hotelview/stretch/orig_stretch_blue_af_4.png deleted file mode 100644 index fdf1083..0000000 Binary files a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_4.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_5.png b/src/assets/images/hotelview/stretch/orig_stretch_blue_af_5.png deleted file mode 100644 index 459f235..0000000 Binary files a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_5.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_6.png b/src/assets/images/hotelview/stretch/orig_stretch_blue_af_6.png deleted file mode 100644 index 5282585..0000000 Binary files a/src/assets/images/hotelview/stretch/orig_stretch_blue_af_6.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/orig_stretch_night.png b/src/assets/images/hotelview/stretch/orig_stretch_night.png deleted file mode 100644 index b5aac85..0000000 Binary files a/src/assets/images/hotelview/stretch/orig_stretch_night.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/stretch_blue.png b/src/assets/images/hotelview/stretch/stretch_blue.png deleted file mode 100644 index 4cb2742..0000000 Binary files a/src/assets/images/hotelview/stretch/stretch_blue.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/stretch_blue_af_1.png b/src/assets/images/hotelview/stretch/stretch_blue_af_1.png deleted file mode 100644 index 7622a11..0000000 Binary files a/src/assets/images/hotelview/stretch/stretch_blue_af_1.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/stretch_blue_af_2.png b/src/assets/images/hotelview/stretch/stretch_blue_af_2.png deleted file mode 100644 index e338e50..0000000 Binary files a/src/assets/images/hotelview/stretch/stretch_blue_af_2.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/stretch_blue_af_3.png b/src/assets/images/hotelview/stretch/stretch_blue_af_3.png deleted file mode 100644 index b693511..0000000 Binary files a/src/assets/images/hotelview/stretch/stretch_blue_af_3.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/stretch_blue_af_4.png b/src/assets/images/hotelview/stretch/stretch_blue_af_4.png deleted file mode 100644 index cc2a8b7..0000000 Binary files a/src/assets/images/hotelview/stretch/stretch_blue_af_4.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/stretch_blue_af_5.png b/src/assets/images/hotelview/stretch/stretch_blue_af_5.png deleted file mode 100644 index efa167e..0000000 Binary files a/src/assets/images/hotelview/stretch/stretch_blue_af_5.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/stretch_blue_af_6.png b/src/assets/images/hotelview/stretch/stretch_blue_af_6.png deleted file mode 100644 index 76b4599..0000000 Binary files a/src/assets/images/hotelview/stretch/stretch_blue_af_6.png and /dev/null differ diff --git a/src/assets/images/hotelview/stretch/stretch_night.png b/src/assets/images/hotelview/stretch/stretch_night.png deleted file mode 100644 index fb66737..0000000 Binary files a/src/assets/images/hotelview/stretch/stretch_night.png and /dev/null differ diff --git a/src/assets/images/icons/builderstool.png b/src/assets/images/icons/builderstool.png deleted file mode 100644 index 5458f2f..0000000 Binary files a/src/assets/images/icons/builderstool.png and /dev/null differ diff --git a/src/assets/images/icons/disablebubble.png b/src/assets/images/icons/disablebubble.png deleted file mode 100644 index bbf1390..0000000 Binary files a/src/assets/images/icons/disablebubble.png and /dev/null differ diff --git a/src/assets/images/icons/enablebubble.png b/src/assets/images/icons/enablebubble.png deleted file mode 100644 index 217109c..0000000 Binary files a/src/assets/images/icons/enablebubble.png and /dev/null differ diff --git a/src/assets/images/icons/room-history-back-disabled.png b/src/assets/images/icons/room-history-back-disabled.png deleted file mode 100644 index 78a4475..0000000 Binary files a/src/assets/images/icons/room-history-back-disabled.png and /dev/null differ diff --git a/src/assets/images/icons/room-history-back-enabled.png b/src/assets/images/icons/room-history-back-enabled.png deleted file mode 100644 index bed6a42..0000000 Binary files a/src/assets/images/icons/room-history-back-enabled.png and /dev/null differ diff --git a/src/assets/images/icons/room-history-disabled.png b/src/assets/images/icons/room-history-disabled.png deleted file mode 100644 index fcd8119..0000000 Binary files a/src/assets/images/icons/room-history-disabled.png and /dev/null differ diff --git a/src/assets/images/icons/room-history-enabled.png b/src/assets/images/icons/room-history-enabled.png deleted file mode 100644 index 287227b..0000000 Binary files a/src/assets/images/icons/room-history-enabled.png and /dev/null differ diff --git a/src/assets/images/icons/room-history-next-disabled.png b/src/assets/images/icons/room-history-next-disabled.png deleted file mode 100644 index 3f82d0e..0000000 Binary files a/src/assets/images/icons/room-history-next-disabled.png and /dev/null differ diff --git a/src/assets/images/icons/room-history-next-enabled.png b/src/assets/images/icons/room-history-next-enabled.png deleted file mode 100644 index 3de01c0..0000000 Binary files a/src/assets/images/icons/room-history-next-enabled.png and /dev/null differ diff --git a/src/assets/images/inventory/ach.png b/src/assets/images/inventory/ach.png deleted file mode 100644 index 3969d06..0000000 Binary files a/src/assets/images/inventory/ach.png and /dev/null differ diff --git a/src/assets/images/inventory/allow_recycle.png b/src/assets/images/inventory/allow_recycle.png deleted file mode 100644 index 550ca11..0000000 Binary files a/src/assets/images/inventory/allow_recycle.png and /dev/null differ diff --git a/src/assets/images/inventory/allow_trade.png b/src/assets/images/inventory/allow_trade.png deleted file mode 100644 index b47fb88..0000000 Binary files a/src/assets/images/inventory/allow_trade.png and /dev/null differ diff --git a/src/assets/images/inventory/bots.png b/src/assets/images/inventory/bots.png deleted file mode 100644 index 15e1128..0000000 Binary files a/src/assets/images/inventory/bots.png and /dev/null differ diff --git a/src/assets/images/inventory/confirmed.png b/src/assets/images/inventory/confirmed.png deleted file mode 100644 index 89dfb81..0000000 Binary files a/src/assets/images/inventory/confirmed.png and /dev/null differ diff --git a/src/assets/images/inventory/empty.png b/src/assets/images/inventory/empty.png index 352aa84..d975b41 100644 Binary files a/src/assets/images/inventory/empty.png and b/src/assets/images/inventory/empty.png differ diff --git a/src/assets/images/inventory/furni.png b/src/assets/images/inventory/furni.png deleted file mode 100644 index 54772b1..0000000 Binary files a/src/assets/images/inventory/furni.png and /dev/null differ diff --git a/src/assets/images/inventory/item.png b/src/assets/images/inventory/item.png deleted file mode 100644 index 01a3d2d..0000000 Binary files a/src/assets/images/inventory/item.png and /dev/null differ diff --git a/src/assets/images/inventory/lock_locked.png b/src/assets/images/inventory/lock_locked.png deleted file mode 100644 index 7d9a3cb..0000000 Binary files a/src/assets/images/inventory/lock_locked.png and /dev/null differ diff --git a/src/assets/images/inventory/lock_open.png b/src/assets/images/inventory/lock_open.png deleted file mode 100644 index 39bd355..0000000 Binary files a/src/assets/images/inventory/lock_open.png and /dev/null differ diff --git a/src/assets/images/inventory/not_allow_recycle.png b/src/assets/images/inventory/not_allow_recycle.png deleted file mode 100644 index febfdc8..0000000 Binary files a/src/assets/images/inventory/not_allow_recycle.png and /dev/null differ diff --git a/src/assets/images/inventory/not_allow_trade.png b/src/assets/images/inventory/not_allow_trade.png deleted file mode 100644 index dc07c79..0000000 Binary files a/src/assets/images/inventory/not_allow_trade.png and /dev/null differ diff --git a/src/assets/images/inventory/pets.png b/src/assets/images/inventory/pets.png deleted file mode 100644 index 6d056f3..0000000 Binary files a/src/assets/images/inventory/pets.png and /dev/null differ diff --git a/src/assets/images/inventory/selected_item.png b/src/assets/images/inventory/selected_item.png deleted file mode 100644 index 838b3b4..0000000 Binary files a/src/assets/images/inventory/selected_item.png and /dev/null differ diff --git a/src/assets/images/inventory/trading/lock_locked.png b/src/assets/images/inventory/trading/lock_locked.png deleted file mode 100644 index 7d9a3cb..0000000 Binary files a/src/assets/images/inventory/trading/lock_locked.png and /dev/null differ diff --git a/src/assets/images/inventory/trading/lock_open.png b/src/assets/images/inventory/trading/lock_open.png deleted file mode 100644 index 39bd355..0000000 Binary files a/src/assets/images/inventory/trading/lock_open.png and /dev/null differ diff --git a/src/assets/images/inventory/trading/locked-icon.png b/src/assets/images/inventory/trading/locked-icon.png index 7d9a3cb..4f54e2d 100644 Binary files a/src/assets/images/inventory/trading/locked-icon.png and b/src/assets/images/inventory/trading/locked-icon.png differ diff --git a/src/assets/images/inventory/trading/unlocked-icon.png b/src/assets/images/inventory/trading/unlocked-icon.png index 39bd355..d6362c4 100644 Binary files a/src/assets/images/inventory/trading/unlocked-icon.png and b/src/assets/images/inventory/trading/unlocked-icon.png differ diff --git a/src/assets/images/inventory/trading_bg.png b/src/assets/images/inventory/trading_bg.png deleted file mode 100644 index c678de6..0000000 Binary files a/src/assets/images/inventory/trading_bg.png and /dev/null differ diff --git a/src/assets/images/loading/connecting-duck-spritesheet.png b/src/assets/images/loading/connecting-duck-spritesheet.png deleted file mode 100644 index 36c5dae..0000000 Binary files a/src/assets/images/loading/connecting-duck-spritesheet.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_01.png b/src/assets/images/loading/connecting_duck_01.png deleted file mode 100644 index e3772c8..0000000 Binary files a/src/assets/images/loading/connecting_duck_01.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_02.png b/src/assets/images/loading/connecting_duck_02.png deleted file mode 100644 index 86499a3..0000000 Binary files a/src/assets/images/loading/connecting_duck_02.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_03.png b/src/assets/images/loading/connecting_duck_03.png deleted file mode 100644 index 15a2bb9..0000000 Binary files a/src/assets/images/loading/connecting_duck_03.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_04.png b/src/assets/images/loading/connecting_duck_04.png deleted file mode 100644 index 90860f2..0000000 Binary files a/src/assets/images/loading/connecting_duck_04.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_05.png b/src/assets/images/loading/connecting_duck_05.png deleted file mode 100644 index a72154a..0000000 Binary files a/src/assets/images/loading/connecting_duck_05.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_06.png b/src/assets/images/loading/connecting_duck_06.png deleted file mode 100644 index 0e51a51..0000000 Binary files a/src/assets/images/loading/connecting_duck_06.png and /dev/null differ diff --git a/src/assets/images/loading/connecting_duck_07.png b/src/assets/images/loading/connecting_duck_07.png deleted file mode 100644 index 76c9e34..0000000 Binary files a/src/assets/images/loading/connecting_duck_07.png and /dev/null differ diff --git a/src/assets/images/loading/caja.gif b/src/assets/images/loading/loading.gif similarity index 100% rename from src/assets/images/loading/caja.gif rename to src/assets/images/loading/loading.gif diff --git a/src/assets/images/navigator/avatar_icon.png b/src/assets/images/navigator/avatar_icon.png deleted file mode 100644 index 2644636..0000000 Binary files a/src/assets/images/navigator/avatar_icon.png and /dev/null differ diff --git a/src/assets/images/navigator/badge_danger.png b/src/assets/images/navigator/badge_danger.png deleted file mode 100644 index b52d55e..0000000 Binary files a/src/assets/images/navigator/badge_danger.png and /dev/null differ diff --git a/src/assets/images/navigator/badge_empty.png b/src/assets/images/navigator/badge_empty.png deleted file mode 100644 index 7b105e6..0000000 Binary files a/src/assets/images/navigator/badge_empty.png and /dev/null differ diff --git a/src/assets/images/navigator/badge_success.png b/src/assets/images/navigator/badge_success.png deleted file mode 100644 index d597896..0000000 Binary files a/src/assets/images/navigator/badge_success.png and /dev/null differ diff --git a/src/assets/images/navigator/badge_warning.png b/src/assets/images/navigator/badge_warning.png deleted file mode 100644 index e9335d6..0000000 Binary files a/src/assets/images/navigator/badge_warning.png and /dev/null differ diff --git a/src/assets/images/navigator/create_room.png b/src/assets/images/navigator/create_room.png deleted file mode 100644 index d6a476a..0000000 Binary files a/src/assets/images/navigator/create_room.png and /dev/null differ diff --git a/src/assets/images/navigator/info_bg.png b/src/assets/images/navigator/info_bg.png deleted file mode 100644 index 60dc3aa..0000000 Binary files a/src/assets/images/navigator/info_bg.png and /dev/null differ diff --git a/src/assets/images/navigator/info_pointer.png b/src/assets/images/navigator/info_pointer.png deleted file mode 100644 index 42fa3d4..0000000 Binary files a/src/assets/images/navigator/info_pointer.png and /dev/null differ diff --git a/src/assets/images/navigator/inline_view.png b/src/assets/images/navigator/inline_view.png deleted file mode 100644 index acaf8eb..0000000 Binary files a/src/assets/images/navigator/inline_view.png and /dev/null differ diff --git a/src/assets/images/navigator/minus.png b/src/assets/images/navigator/minus.png deleted file mode 100644 index bc5b95f..0000000 Binary files a/src/assets/images/navigator/minus.png and /dev/null differ diff --git a/src/assets/images/navigator/pen.png b/src/assets/images/navigator/pen.png deleted file mode 100644 index 3ca1c35..0000000 Binary files a/src/assets/images/navigator/pen.png and /dev/null differ diff --git a/src/assets/images/navigator/plus.png b/src/assets/images/navigator/plus.png deleted file mode 100644 index e0b1c7e..0000000 Binary files a/src/assets/images/navigator/plus.png and /dev/null differ diff --git a/src/assets/images/navigator/promote_room.png b/src/assets/images/navigator/promote_room.png deleted file mode 100644 index 3f912af..0000000 Binary files a/src/assets/images/navigator/promote_room.png and /dev/null differ diff --git a/src/assets/images/navigator/random_room.png b/src/assets/images/navigator/random_room.png deleted file mode 100644 index 549a9b5..0000000 Binary files a/src/assets/images/navigator/random_room.png and /dev/null differ diff --git a/src/assets/images/navigator/room-creator/arrow.png b/src/assets/images/navigator/room-creator/arrow.png deleted file mode 100644 index 058039c..0000000 Binary files a/src/assets/images/navigator/room-creator/arrow.png and /dev/null differ diff --git a/src/assets/images/navigator/room-creator/hc-badge.png b/src/assets/images/navigator/room-creator/hc-badge.png deleted file mode 100644 index 186a836..0000000 Binary files a/src/assets/images/navigator/room-creator/hc-badge.png and /dev/null differ diff --git a/src/assets/images/navigator/room-creator/room-bg-active.png b/src/assets/images/navigator/room-creator/room-bg-active.png deleted file mode 100644 index f3d3264..0000000 Binary files a/src/assets/images/navigator/room-creator/room-bg-active.png and /dev/null differ diff --git a/src/assets/images/navigator/room-creator/room-bg.png b/src/assets/images/navigator/room-creator/room-bg.png deleted file mode 100644 index d1204ed..0000000 Binary files a/src/assets/images/navigator/room-creator/room-bg.png and /dev/null differ diff --git a/src/assets/images/navigator/room-creator/tiles.png b/src/assets/images/navigator/room-creator/tiles.png deleted file mode 100644 index ecb7015..0000000 Binary files a/src/assets/images/navigator/room-creator/tiles.png and /dev/null differ diff --git a/src/assets/images/navigator/room-creator/tiles_room_selected.png b/src/assets/images/navigator/room-creator/tiles_room_selected.png deleted file mode 100644 index 81c92cf..0000000 Binary files a/src/assets/images/navigator/room-creator/tiles_room_selected.png and /dev/null differ diff --git a/src/assets/images/navigator/room_thumbnail.png b/src/assets/images/navigator/room_thumbnail.png deleted file mode 100644 index b25d01d..0000000 Binary files a/src/assets/images/navigator/room_thumbnail.png and /dev/null differ diff --git a/src/assets/images/navigator/saves-search/delete_search.png b/src/assets/images/navigator/saves-search/delete_search.png deleted file mode 100644 index 4c35559..0000000 Binary files a/src/assets/images/navigator/saves-search/delete_search.png and /dev/null differ diff --git a/src/assets/images/navigator/saves-search/delete_search_click.png b/src/assets/images/navigator/saves-search/delete_search_click.png deleted file mode 100644 index 657ceb3..0000000 Binary files a/src/assets/images/navigator/saves-search/delete_search_click.png and /dev/null differ diff --git a/src/assets/images/navigator/saves-search/delete_search_hover.png b/src/assets/images/navigator/saves-search/delete_search_hover.png deleted file mode 100644 index ad6ccf9..0000000 Binary files a/src/assets/images/navigator/saves-search/delete_search_hover.png and /dev/null differ diff --git a/src/assets/images/navigator/saves-search/search_save.png b/src/assets/images/navigator/saves-search/search_save.png deleted file mode 100644 index 975fb78..0000000 Binary files a/src/assets/images/navigator/saves-search/search_save.png and /dev/null differ diff --git a/src/assets/images/navigator/thumbnail_bg.png b/src/assets/images/navigator/thumbnail_bg.png deleted file mode 100644 index 4e60c55..0000000 Binary files a/src/assets/images/navigator/thumbnail_bg.png and /dev/null differ diff --git a/src/assets/images/navigator/thumbnail_view.png b/src/assets/images/navigator/thumbnail_view.png deleted file mode 100644 index b4a6116..0000000 Binary files a/src/assets/images/navigator/thumbnail_view.png and /dev/null differ diff --git a/src/assets/images/navigator/white_bg.png b/src/assets/images/navigator/white_bg.png deleted file mode 100644 index fceab0e..0000000 Binary files a/src/assets/images/navigator/white_bg.png and /dev/null differ diff --git a/src/assets/images/purse/disconnect_button.png b/src/assets/images/purse/disconnect_button.png deleted file mode 100644 index 8e8c444..0000000 Binary files a/src/assets/images/purse/disconnect_button.png and /dev/null differ diff --git a/src/assets/images/purse/disconnect_icon.png b/src/assets/images/purse/disconnect_icon.png deleted file mode 100644 index aa223d6..0000000 Binary files a/src/assets/images/purse/disconnect_icon.png and /dev/null differ diff --git a/src/assets/images/purse/hc_bg.png b/src/assets/images/purse/hc_bg.png deleted file mode 100644 index 17a577e..0000000 Binary files a/src/assets/images/purse/hc_bg.png and /dev/null differ diff --git a/src/assets/images/purse/help_button.png b/src/assets/images/purse/help_button.png deleted file mode 100644 index e5f9bb2..0000000 Binary files a/src/assets/images/purse/help_button.png and /dev/null differ diff --git a/src/assets/images/purse/purse-bg.png b/src/assets/images/purse/purse-bg.png deleted file mode 100644 index db262dd..0000000 Binary files a/src/assets/images/purse/purse-bg.png and /dev/null differ diff --git a/src/assets/images/purse/seasonal_bg_blue.png b/src/assets/images/purse/seasonal_bg_blue.png deleted file mode 100644 index 609542c..0000000 Binary files a/src/assets/images/purse/seasonal_bg_blue.png and /dev/null differ diff --git a/src/assets/images/purse/seasonal_bg_bronze.png b/src/assets/images/purse/seasonal_bg_bronze.png deleted file mode 100644 index 53445a1..0000000 Binary files a/src/assets/images/purse/seasonal_bg_bronze.png and /dev/null differ diff --git a/src/assets/images/purse/seasonal_bg_pink.png b/src/assets/images/purse/seasonal_bg_pink.png deleted file mode 100644 index eec7f73..0000000 Binary files a/src/assets/images/purse/seasonal_bg_pink.png and /dev/null differ diff --git a/src/assets/images/purse/seasonal_bg_purple.png b/src/assets/images/purse/seasonal_bg_purple.png deleted file mode 100644 index fc1f1fc..0000000 Binary files a/src/assets/images/purse/seasonal_bg_purple.png and /dev/null differ diff --git a/src/assets/images/purse/seasonal_bg_red.png b/src/assets/images/purse/seasonal_bg_red.png deleted file mode 100644 index d4176a1..0000000 Binary files a/src/assets/images/purse/seasonal_bg_red.png and /dev/null differ diff --git a/src/assets/images/purse/settings_button.png b/src/assets/images/purse/settings_button.png deleted file mode 100644 index ccb8a13..0000000 Binary files a/src/assets/images/purse/settings_button.png and /dev/null differ diff --git a/src/assets/images/purse/settings_icon.png b/src/assets/images/purse/settings_icon.png deleted file mode 100644 index f96a32c..0000000 Binary files a/src/assets/images/purse/settings_icon.png and /dev/null differ diff --git a/src/assets/images/room/arrow-left.png b/src/assets/images/room/arrow-left.png deleted file mode 100644 index 1ca51d2..0000000 Binary files a/src/assets/images/room/arrow-left.png and /dev/null differ diff --git a/src/assets/images/room/arrow-right.png b/src/assets/images/room/arrow-right.png deleted file mode 100644 index f7610ed..0000000 Binary files a/src/assets/images/room/arrow-right.png and /dev/null differ diff --git a/src/assets/images/room/chatinput.png b/src/assets/images/room/chatinput.png deleted file mode 100644 index 235c3ce..0000000 Binary files a/src/assets/images/room/chatinput.png and /dev/null differ diff --git a/src/assets/images/room/chatstyles_selector.png b/src/assets/images/room/chatstyles_selector.png deleted file mode 100644 index 35c2f9a..0000000 Binary files a/src/assets/images/room/chatstyles_selector.png and /dev/null differ diff --git a/src/assets/images/room/chatstyles_selector_window.png b/src/assets/images/room/chatstyles_selector_window.png deleted file mode 100644 index f6357db..0000000 Binary files a/src/assets/images/room/chatstyles_selector_window.png and /dev/null differ diff --git a/src/assets/images/room/context_menu_arrow.png b/src/assets/images/room/context_menu_arrow.png deleted file mode 100644 index f7e6a5f..0000000 Binary files a/src/assets/images/room/context_menu_arrow.png and /dev/null differ diff --git a/src/assets/images/room/context_menu_arrow_hover.png b/src/assets/images/room/context_menu_arrow_hover.png deleted file mode 100644 index fe46347..0000000 Binary files a/src/assets/images/room/context_menu_arrow_hover.png and /dev/null differ diff --git a/src/assets/images/room/context_menu_arrow_up.png b/src/assets/images/room/context_menu_arrow_up.png deleted file mode 100644 index 82001bc..0000000 Binary files a/src/assets/images/room/context_menu_arrow_up.png and /dev/null differ diff --git a/src/assets/images/room/context_menu_arrow_up_hover.png b/src/assets/images/room/context_menu_arrow_up_hover.png deleted file mode 100644 index 738fd81..0000000 Binary files a/src/assets/images/room/context_menu_arrow_up_hover.png and /dev/null differ diff --git a/src/assets/images/room/context_menu_bg.png b/src/assets/images/room/context_menu_bg.png deleted file mode 100644 index ef15843..0000000 Binary files a/src/assets/images/room/context_menu_bg.png and /dev/null differ diff --git a/src/assets/images/room/context_menu_btn_bg.png b/src/assets/images/room/context_menu_btn_bg.png deleted file mode 100644 index 6df4fd5..0000000 Binary files a/src/assets/images/room/context_menu_btn_bg.png and /dev/null differ diff --git a/src/assets/images/room/context_pointer_after.png b/src/assets/images/room/context_pointer_after.png deleted file mode 100644 index 46c7fba..0000000 Binary files a/src/assets/images/room/context_pointer_after.png and /dev/null differ diff --git a/src/assets/images/room/infostand_buttons.png b/src/assets/images/room/infostand_buttons.png deleted file mode 100644 index 278e065..0000000 Binary files a/src/assets/images/room/infostand_buttons.png and /dev/null differ diff --git a/src/assets/images/room/infostand_buttons_active.png b/src/assets/images/room/infostand_buttons_active.png deleted file mode 100644 index 4809781..0000000 Binary files a/src/assets/images/room/infostand_buttons_active.png and /dev/null differ diff --git a/src/assets/images/room/infostand_buttons_hover.png b/src/assets/images/room/infostand_buttons_hover.png deleted file mode 100644 index 307cbbe..0000000 Binary files a/src/assets/images/room/infostand_buttons_hover.png and /dev/null differ diff --git a/src/assets/images/room/name_bg.png b/src/assets/images/room/name_bg.png deleted file mode 100644 index d12d8fc..0000000 Binary files a/src/assets/images/room/name_bg.png and /dev/null differ diff --git a/src/assets/images/room/pointer_after.png b/src/assets/images/room/pointer_after.png deleted file mode 100644 index a2c6d51..0000000 Binary files a/src/assets/images/room/pointer_after.png and /dev/null differ diff --git a/src/assets/images/room/report-room.png b/src/assets/images/room/report-room.png deleted file mode 100644 index 37672aa..0000000 Binary files a/src/assets/images/room/report-room.png and /dev/null differ diff --git a/src/assets/images/toolbar/icons/catalog.png b/src/assets/images/toolbar/icons/catalog.png index 1e6ee8c..f680921 100644 Binary files a/src/assets/images/toolbar/icons/catalog.png and b/src/assets/images/toolbar/icons/catalog.png differ diff --git a/src/assets/images/toolbar/icons/friend_all.png b/src/assets/images/toolbar/icons/friend_all.png index eb4e140..b2ca0d7 100644 Binary files a/src/assets/images/toolbar/icons/friend_all.png and b/src/assets/images/toolbar/icons/friend_all.png differ diff --git a/src/assets/images/toolbar/icons/inventory.png b/src/assets/images/toolbar/icons/inventory.png index fd719b1..d848586 100644 Binary files a/src/assets/images/toolbar/icons/inventory.png and b/src/assets/images/toolbar/icons/inventory.png differ diff --git a/src/assets/images/toolbar/icons/rooms.png b/src/assets/images/toolbar/icons/rooms.png index 512f370..00261ce 100644 Binary files a/src/assets/images/toolbar/icons/rooms.png and b/src/assets/images/toolbar/icons/rooms.png differ diff --git a/src/assets/images/ui/loading_icon.png b/src/assets/images/ui/loading_icon.png new file mode 100644 index 0000000..15f66be Binary files /dev/null and b/src/assets/images/ui/loading_icon.png differ diff --git a/src/assets/images/boxes/close.png b/src/assets/images/ui/ubuntu-close-buttons.png similarity index 95% rename from src/assets/images/boxes/close.png rename to src/assets/images/ui/ubuntu-close-buttons.png index 21bfe4c..d6a79a6 100644 Binary files a/src/assets/images/boxes/close.png and b/src/assets/images/ui/ubuntu-close-buttons.png differ diff --git a/src/assets/images/wardrobe/hd.png b/src/assets/images/wardrobe/hd.png deleted file mode 100644 index 307d6f7..0000000 Binary files a/src/assets/images/wardrobe/hd.png and /dev/null differ diff --git a/src/assets/images/wardrobe/head.png b/src/assets/images/wardrobe/head.png deleted file mode 100644 index 977012d..0000000 Binary files a/src/assets/images/wardrobe/head.png and /dev/null differ diff --git a/src/assets/images/wardrobe/legs.png b/src/assets/images/wardrobe/legs.png deleted file mode 100644 index 5978a3a..0000000 Binary files a/src/assets/images/wardrobe/legs.png and /dev/null differ diff --git a/src/assets/images/wardrobe/torso.png b/src/assets/images/wardrobe/torso.png deleted file mode 100644 index a58918b..0000000 Binary files a/src/assets/images/wardrobe/torso.png and /dev/null differ diff --git a/src/assets/images/wardrobe/wardrobe.png b/src/assets/images/wardrobe/wardrobe.png deleted file mode 100644 index 6913da7..0000000 Binary files a/src/assets/images/wardrobe/wardrobe.png and /dev/null differ diff --git a/src/assets/styles/bootstrap/_accordion.scss b/src/assets/styles/bootstrap/_accordion.scss deleted file mode 100644 index 2d6ab38..0000000 --- a/src/assets/styles/bootstrap/_accordion.scss +++ /dev/null @@ -1,121 +0,0 @@ -// -// Base styles -// - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: $accordion-button-padding-y $accordion-button-padding-x; - @include font-size($font-size-base); - color: $accordion-button-color; - text-align: left; // Reset button style - background-color: $accordion-button-bg; - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition($accordion-transition); - - &:not(.collapsed) { - color: $accordion-button-active-color; - background-color: $accordion-button-active-bg; - box-shadow: inset 0 ($accordion-border-width * -1) 0 $accordion-border-color; - - &::after { - background-image: escape-svg($accordion-button-active-icon); - transform: $accordion-icon-transform; - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: $accordion-icon-width; - height: $accordion-icon-width; - margin-left: auto; - content: ""; - background-image: escape-svg($accordion-button-icon); - background-repeat: no-repeat; - background-size: $accordion-icon-width; - @include transition($accordion-icon-transition); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - border-color: $accordion-button-focus-border-color; - outline: 0; - box-shadow: $accordion-button-focus-box-shadow; - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - background-color: $accordion-bg; - border: $accordion-border-width solid $accordion-border-color; - - &:first-of-type { - @include border-top-radius($accordion-border-radius); - - .accordion-button { - @include border-top-radius($accordion-inner-border-radius); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius($accordion-border-radius); - - .accordion-button { - &.collapsed { - @include border-bottom-radius($accordion-inner-border-radius); - } - } - - .accordion-collapse { - @include border-bottom-radius($accordion-border-radius); - } - } -} - -.accordion-body { - padding: $accordion-body-padding-y $accordion-body-padding-x; -} - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - .accordion-collapse { - border-width: 0; - } - - .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { - border-top: 0; - } - &:last-child { - border-bottom: 0; - } - - .accordion-button { - @include border-radius(0); - } - } -} diff --git a/src/assets/styles/bootstrap/_alert.scss b/src/assets/styles/bootstrap/_alert.scss deleted file mode 100644 index 670a7bf..0000000 --- a/src/assets/styles/bootstrap/_alert.scss +++ /dev/null @@ -1,56 +0,0 @@ -@use 'sass:math'; -// -// Base styles -// - -.alert { - position: relative; - padding: $alert-padding-y $alert-padding-x; - margin-bottom: $alert-margin-bottom; - border: $alert-border-width solid transparent; - @include border-radius($alert-border-radius); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; -} - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert. - -@each $state, $value in $theme-colors { - $alert-background: shift-color($value, $alert-bg-scale); - $alert-border: shift-color($value, $alert-border-scale); - $alert-color: shift-color($value, $alert-color-scale); - @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) { - $alert-color: mix($value, color-contrast($alert-background), math.abs($alert-color-scale)); - } - .alert-#{$state} { - @include alert-variant($alert-background, $alert-border, $alert-color); - } -} -// scss-docs-end alert-modifiers diff --git a/src/assets/styles/bootstrap/_badge.scss b/src/assets/styles/bootstrap/_badge.scss deleted file mode 100644 index 08df1b8..0000000 --- a/src/assets/styles/bootstrap/_badge.scss +++ /dev/null @@ -1,29 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - display: inline-block; - padding: $badge-padding-y $badge-padding-x; - @include font-size($badge-font-size); - font-weight: $badge-font-weight; - line-height: 1; - color: $badge-color; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius($badge-border-radius); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/src/assets/styles/bootstrap/_breadcrumb.scss b/src/assets/styles/bootstrap/_breadcrumb.scss deleted file mode 100644 index bbd5552..0000000 --- a/src/assets/styles/bootstrap/_breadcrumb.scss +++ /dev/null @@ -1,35 +0,0 @@ -.breadcrumb { - display: flex; - flex-wrap: wrap; - padding: $breadcrumb-padding-y $breadcrumb-padding-x; - margin-bottom: $breadcrumb-margin-bottom; - @include font-size($breadcrumb-font-size); - list-style: none; - background-color: $breadcrumb-bg; - @include border-radius($breadcrumb-border-radius); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: $breadcrumb-item-padding-x; - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: $breadcrumb-item-padding-x; - color: $breadcrumb-divider-color; - content: var( - --#{$variable-prefix}breadcrumb-divider, - escape-svg($breadcrumb-divider) - ) - #{"/* rtl:"} var( - --#{$variable-prefix}breadcrumb-divider, - escape-svg($breadcrumb-divider-flipped) - ) #{"*/"}; - } - } - - &.active { - color: $breadcrumb-active-color; - } -} diff --git a/src/assets/styles/bootstrap/_button-group.scss b/src/assets/styles/bootstrap/_button-group.scss deleted file mode 100644 index e7b961c..0000000 --- a/src/assets/styles/bootstrap/_button-group.scss +++ /dev/null @@ -1,140 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - // Prevent double borders when buttons are next to each other - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-left: -$btn-border-width; - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { - @extend .btn-sm; -} -.btn-group-lg > .btn { - @extend .btn-lg; -} - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * 0.75; - padding-left: $btn-padding-x * 0.75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * 0.75; - padding-left: $btn-padding-x-sm * 0.75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * 0.75; - padding-left: $btn-padding-x-lg * 0.75; -} - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: -$btn-border-width; - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - > .btn ~ .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/src/assets/styles/bootstrap/_buttons.scss b/src/assets/styles/bootstrap/_buttons.scss deleted file mode 100644 index 672fd60..0000000 --- a/src/assets/styles/bootstrap/_buttons.scss +++ /dev/null @@ -1,235 +0,0 @@ -// -// Base styles -// - -.btn { - display: inline-block; - font-family: $btn-font-family; - font-weight: $btn-font-weight; - line-height: $btn-line-height; - color: $body-color; - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - background-color: transparent; - border: $btn-border-width solid transparent; - @include button-size( - $btn-padding-y, - $btn-padding-x, - $btn-font-size, - $btn-border-radius - ); - @include transition($btn-transition); - - &:hover { - color: $body-color; - text-decoration: if($link-hover-decoration == underline, none, null); - } - - .btn-check:focus + &, - &:focus { - outline: 0; - box-shadow: $btn-focus-box-shadow; - } - - .btn-check:checked + &, - .btn-check:active + &, - &:active, - &.active { - @include box-shadow($btn-active-box-shadow); - - &:focus { - @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - pointer-events: none; - opacity: $btn-disabled-opacity; - @include box-shadow(none); - } -} - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @include button-variant($value, $value); - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - font-weight: $font-weight-normal; - color: $btn-link-color; - text-decoration: $link-decoration; - box-shadow: none !important; - - &:active { - color: $btn-link-color !important; - } - - &:hover { - color: $btn-link-hover-color; - text-decoration: $link-hover-decoration; - } - - &:focus { - text-decoration: $link-hover-decoration; - } - - &:disabled, - &.disabled { - color: $btn-link-disabled-color; - } - - // No need for an active state here -} - -// -// Button Sizes -// - -.btn-toggle { - border-image-source: url("@/assets/images/buttons/toggle_bg.png"); - border-image-slice: 6 6 6 6 fill; - border-image-width: 6px 6px 6px 6px; - cursor: pointer; - - .toggle-icon { - background-repeat: no-repeat; - width: 6px; - height: 8px; - - &.left { - background-image: url("@/assets/images/buttons/toggle_left.png"); - } - - &.right { - background-image: url("@/assets/images/buttons/toggle_right.png"); - } - } -} - -.infostand-buttons { - border-image-source: url(@/assets/images/room/infostand_buttons.png); - border-image-slice: 3 3 3 3 fill; - border-image-width: 3px 3px 3px 3px; - font-size: 9px; - color: #ffffff; - height: 25px; - margin-top: 5px; - - &:hover { - border-image-source: url(@/assets/images/room/infostand_buttons_hover.png); - } - - &:active { - border-image-source: url(@/assets/images/room/infostand_buttons_active.png); - } -} - -.volter-bold-button { - border-image-source: url(@/assets/images/buttons/volter_bold_btn.png); - border-image-slice: 6 6 6 6 fill; - border-image-width: 6px 6px 6px 6px; - font-size: 9px; - height: 20px; - margin-top: 5px; - - &:hover { - border-image-source: url(@/assets/images/buttons/volter_bold_btn_hover.png); - } - - &:active { - border-image-source: url(@/assets/images/buttons/volter_bold_btn_active.png); - } -} - -.volter-button { - border-image-source: url(@/assets/images/buttons/volter_normal_btn.png); - border-image-slice: 4 4 4 4 fill; - border-image-width: 4px 4px 4px 4px; - font-size: 9px; - height: 20px; - margin-top: 5px; - - &:hover { - border-image-source: url(@/assets/images/buttons/volter_normal_btn_hover.png); - } - - &:active { - border-image-source: url(@/assets/images/buttons/volter_normal_btn_active.png); - } - &.active { - border-image-source: url(@/assets/images/buttons/volter_normal_btn_active.png); - } -} - -.notification-buttons { - border-image-source: url(@/assets/images/room/infostand_buttons.png); - border-image-slice: 3 3 3 3 fill; - border-image-width: 3px 3px 3px 3px; - color: #ffffff; - height: 25px; - font-size: 13px; - padding: 0; - border-radius: 13px; - - &:hover { - border-image-source: url(@/assets/images/room/infostand_buttons_hover.png); - } - - &:active { - border-image-source: url(@/assets/images/room/infostand_buttons_active.png); - } -} - -.notification-text-link { - font-size: 13px; -} - -.gift-color-btn { - outline: 1px solid #000; - border: 3px solid #fff; - min-height: 22px; - min-width: 23px; - -} - -.btn-lg { - @include button-size( - $btn-padding-y-lg, - $btn-padding-x-lg, - $btn-font-size-lg, - $btn-border-radius-lg - ); -} - -.btn-sm { - @include button-size( - $btn-padding-y-sm, - $btn-padding-x-sm, - $btn-font-size-sm, - $btn-border-radius-sm - ); -} diff --git a/src/assets/styles/bootstrap/_card.scss b/src/assets/styles/bootstrap/_card.scss deleted file mode 100644 index 94f1b4c..0000000 --- a/src/assets/styles/bootstrap/_card.scss +++ /dev/null @@ -1,218 +0,0 @@ -// -// Base styles -// - -.card { - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: $card-height; - word-wrap: break-word; - background-color: $card-bg; - background-clip: border-box; - border: $card-border-width solid $card-border-color; - @include border-radius($card-border-radius); - @include box-shadow($card-box-shadow); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius($card-inner-border-radius); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius($card-inner-border-radius); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: $card-spacer-y $card-spacer-x; - color: $card-color; -} - -.card-title { - margin-bottom: $card-title-spacer-y; -} - -.card-subtitle { - margin-top: -$card-title-spacer-y * 0.5; - margin-bottom: 0; -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: $card-spacer-x; - } -} - -// -// Optional textual caps -// - -.card-header { - padding: $card-cap-padding-y $card-cap-padding-x; - margin-bottom: 0; // Removes the default margin-bottom of - color: $card-cap-color; - background-color: $card-cap-bg; - border-bottom: $card-border-width solid $card-border-color; - - &:first-child { - @include border-radius( - $card-inner-border-radius $card-inner-border-radius 0 0 - ); - } -} - -.card-footer { - padding: $card-cap-padding-y $card-cap-padding-x; - color: $card-cap-color; - background-color: $card-cap-bg; - border-top: $card-border-width solid $card-border-color; - - &:last-child { - @include border-radius( - 0 0 $card-inner-border-radius $card-inner-border-radius - ); - } -} - -// -// Header navs -// - -.card-header-tabs { - margin-right: -$card-cap-padding-x * 0.5; - margin-bottom: -$card-cap-padding-y; - margin-left: -$card-cap-padding-x * 0.5; - border-bottom: 0; - - @if $nav-tabs-link-active-bg != $card-bg { - .nav-link.active { - background-color: $card-bg; - border-bottom-color: $card-bg; - } - } -} - -.card-header-pills { - margin-right: -$card-cap-padding-x * 0.5; - margin-left: -$card-cap-padding-x * 0.5; -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: $card-img-overlay-padding; - @include border-radius($card-inner-border-radius); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius($card-inner-border-radius); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius($card-inner-border-radius); -} - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: $card-group-margin; - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4 - flex: 1 0 0%; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - .card-img-top, - .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - .card-img-bottom, - .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - .card-img-top, - .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - .card-img-bottom, - .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/src/assets/styles/bootstrap/_carousel.scss b/src/assets/styles/bootstrap/_carousel.scss deleted file mode 100644 index 6ea3d65..0000000 --- a/src/assets/styles/bootstrap/_carousel.scss +++ /dev/null @@ -1,234 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -/* rtl:begin:ignore */ -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - -/* rtl:end:ignore */ - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if( - $enable-gradients, - linear-gradient(90deg, rgba($black, 0.25), rgba($black, 0.001)), - null - ); -} -.carousel-control-next { - right: 0; - background-image: if( - $enable-gradients, - linear-gradient(270deg, rgba($black, 0.25), rgba($black, 0.001)), - null - ); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -/* rtl:options: { - "autoRename": true, - "stringMap":[ { - "name" : "prev-next", - "search" : "prev", - "replace" : "next" - } ] -} */ -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg); -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg); -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - list-style: none; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: $carousel-indicator-active-bg; - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * 0.5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * 0.5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: $carousel-caption-color; - text-align: center; -} - -// Dark mode carousel - -.carousel-dark { - .carousel-control-prev-icon, - .carousel-control-next-icon { - filter: $carousel-dark-control-icon-filter; - } - - .carousel-indicators [data-bs-target] { - background-color: $carousel-dark-indicator-active-bg; - } - - .carousel-caption { - color: $carousel-dark-caption-color; - } -} diff --git a/src/assets/styles/bootstrap/_close.scss b/src/assets/styles/bootstrap/_close.scss deleted file mode 100644 index 27fc146..0000000 --- a/src/assets/styles/bootstrap/_close.scss +++ /dev/null @@ -1,41 +0,0 @@ -// transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: $btn-close-color; - background: transparent escape-svg($btn-close-bg) center / $btn-close-width - auto no-repeat; // include transparent for button elements - border: 0; // for button elements - @include border-radius(); - opacity: $btn-close-opacity; - - // Override 's hover style - &:hover { - color: $btn-close-color; - text-decoration: none; - opacity: $btn-close-hover-opacity; - } - - &:focus { - outline: 0; - box-shadow: $btn-close-focus-shadow; - opacity: $btn-close-focus-opacity; - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: $btn-close-disabled-opacity; - } -} - -.btn-close-white { - filter: $btn-close-white-filter; -} diff --git a/src/assets/styles/bootstrap/_containers.scss b/src/assets/styles/bootstrap/_containers.scss deleted file mode 100644 index f88f1e5..0000000 --- a/src/assets/styles/bootstrap/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-grid-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/src/assets/styles/bootstrap/_dropdown.scss b/src/assets/styles/bootstrap/_dropdown.scss deleted file mode 100644 index d3fbf68..0000000 --- a/src/assets/styles/bootstrap/_dropdown.scss +++ /dev/null @@ -1,239 +0,0 @@ -// The dropdown wrapper (`
`) -.dropup, -.dropend, -.dropdown, -.dropstart { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - position: absolute; - z-index: $zindex-dropdown; - display: none; // none by default, but block on "open" of the menu - min-width: $dropdown-min-width; - padding: $dropdown-padding-y $dropdown-padding-x; - margin: 0; // Override default margin of ul - @include font-size($dropdown-font-size); - color: $dropdown-color; - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: $dropdown-bg; - background-clip: padding-box; - border: $dropdown-border-width solid $dropdown-border-color; - @include border-radius($dropdown-border-radius); - @include box-shadow($dropdown-box-shadow); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: $dropdown-spacer; - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: $dropdown-spacer; - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: $dropdown-spacer; - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: $dropdown-spacer; - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - -// Dividers (basically an `
`) within the dropdown -.dropdown-divider { - height: 0; - margin: $dropdown-divider-margin-y 0; - overflow: hidden; - border-top: 1px solid $dropdown-divider-bg; -} - -// Links, buttons, and more within the dropdown menu -// -// `
} - - { !disabledButton && } - ; -} diff --git a/src/common/Text.tsx b/src/common/Text.tsx index 62cd91c..040e453 100644 --- a/src/common/Text.tsx +++ b/src/common/Text.tsx @@ -2,11 +2,11 @@ import { FC, useMemo } from 'react'; import { Base, BaseProps } from './Base'; import { ColorVariantType, FontSizeType, FontWeightType, TextAlignType } from './types'; -export interface TextProps extends BaseProps -{ +export interface TextProps extends BaseProps { variant?: ColorVariantType; fontWeight?: FontWeightType; fontSize?: FontSizeType; + fontSizeCustom?: number; align?: TextAlignType; bold?: boolean; underline?: boolean; @@ -20,44 +20,49 @@ export interface TextProps extends BaseProps textBreak?: boolean; } -export const Text: FC = props => -{ - const { variant = 'black', fontWeight = null, fontSize = 0, align = null, bold = false, underline = false, italics = false, truncate = false, center = false, textEnd = false, small = false, wrap = false, noWrap = false, textBreak = false, ...rest } = props; +export const Text: FC = props => { + const { + variant = 'black', + fontWeight = null, + fontSize = 0, + fontSizeCustom, + align = null, + bold = false, + underline = false, + italics = false, + truncate = false, + center = false, + textEnd = false, + small = false, + wrap = false, + noWrap = false, + textBreak = false, + ...rest + } = props; - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'd-inline' ]; + const getClassNames = useMemo(() => { + const newClassNames: string[] = ['inline']; - if(variant) newClassNames.push('text-' + variant); - - if(bold) newClassNames.push('fw-bold'); - - if(fontWeight) newClassNames.push('fw-' + fontWeight); - - if(fontSize) newClassNames.push('fs-' + fontSize); - - if(align) newClassNames.push('text-' + align); - - if(underline) newClassNames.push('text-decoration-underline'); - - if(italics) newClassNames.push('fst-italic'); - - if(truncate) newClassNames.push('text-truncate'); - - if(center) newClassNames.push('text-center'); - - if(textEnd) newClassNames.push('text-end'); - - if(small) newClassNames.push('small'); - - if(wrap) newClassNames.push('text-wrap'); - - if(noWrap) newClassNames.push('text-nowrap'); - - if(textBreak) newClassNames.push('text-break'); + if (variant) newClassNames.push('text-' + variant); + if (bold) newClassNames.push('font-bold'); + if (fontWeight) newClassNames.push('font-' + fontWeight); + if (fontSize) newClassNames.push('fs-' + fontSize); + if (fontSizeCustom) newClassNames.push('fs-custom'); + if (align) newClassNames.push('text-' + align); + if (underline) newClassNames.push('underline'); + if (italics) newClassNames.push('italic'); + if (truncate) newClassNames.push('text-truncate'); + if (center) newClassNames.push('text-center'); + if (textEnd) newClassNames.push('text-end'); + if (small) newClassNames.push('text-sm'); + if (wrap) newClassNames.push('text-wrap'); + if (noWrap) newClassNames.push('text-nowrap'); + if (textBreak) newClassNames.push('text-break'); return newClassNames; - }, [ variant, fontWeight, fontSize, align, bold, underline, italics, truncate, center, textEnd, small, wrap, noWrap, textBreak ]); + }, [variant, fontWeight, fontSize, fontSizeCustom, align, bold, underline, italics, truncate, center, textEnd, small, wrap, noWrap, textBreak]); - return ; -} + const style = fontSizeCustom ? { '--font-size': `${fontSizeCustom}px` } as React.CSSProperties : undefined; + + return ; +}; \ No newline at end of file diff --git a/src/common/card/NitroCardContentView.tsx b/src/common/card/NitroCardContentView.tsx index 903b4c5..a93703b 100644 --- a/src/common/card/NitroCardContentView.tsx +++ b/src/common/card/NitroCardContentView.tsx @@ -7,7 +7,8 @@ export const NitroCardContentView: FC = props => const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'container-fluid', 'content-area' ]; + // Theme Changer + const newClassNames: string[] = [ 'container-fluid', 'h-full p-[8px] overflow-auto', 'bg-light' ]; if(classNames.length) newClassNames.push(...classNames); @@ -15,4 +16,4 @@ export const NitroCardContentView: FC = props => }, [ classNames ]); return ; -} +}; diff --git a/src/common/card/NitroCardContext.tsx b/src/common/card/NitroCardContext.tsx index 517b435..c296b2a 100644 --- a/src/common/card/NitroCardContext.tsx +++ b/src/common/card/NitroCardContext.tsx @@ -11,7 +11,7 @@ const NitroCardContext = createContext({ export const NitroCardContextProvider: FC> = props => { - return { props.children } -} + return { props.children }; +}; export const useNitroCardContext = () => useContext(NitroCardContext); diff --git a/src/common/card/NitroCardHeaderView.tsx b/src/common/card/NitroCardHeaderView.tsx index 06e0cee..2cfd638 100644 --- a/src/common/card/NitroCardHeaderView.tsx +++ b/src/common/card/NitroCardHeaderView.tsx @@ -1,5 +1,5 @@ -import { FC, MouseEvent, useMemo } from 'react'; -import { FaFlag, FaTimes } from 'react-icons/fa'; +import { FC, MouseEvent } from 'react'; +import { FaFlag } from 'react-icons/fa'; import { Base, Column, ColumnProps, Flex } from '..'; interface NitroCardHeaderViewProps extends ColumnProps @@ -7,48 +7,35 @@ interface NitroCardHeaderViewProps extends ColumnProps headerText: string; isGalleryPhoto?: boolean; noCloseButton?: boolean; - isInfoToHabboPages?: boolean; - hideButtonClose?: boolean; onReportPhoto?: (event: MouseEvent) => void; - onClickInfoHabboPages?: (event: MouseEvent) => void; onCloseClick: (event: MouseEvent) => void; } export const NitroCardHeaderView: FC = props => { - const { headerText = null, isGalleryPhoto = false, noCloseButton = false, isInfoToHabboPages = false, hideButtonClose = false, onReportPhoto = null, onClickInfoHabboPages = null, onCloseClick = null, justifyContent = 'center', alignItems = 'center', classNames = [], children = null, ...rest } = props; + const { headerText = null, isGalleryPhoto = false, noCloseButton = false, onReportPhoto = null, onCloseClick = null, justifyContent = 'center', alignItems = 'center', classNames = [], children = null, ...rest } = props; - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'drag-handler', 'container-fluid', 'nitro-card-header' ]; - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ classNames ]); const onMouseDown = (event: MouseEvent) => { event.stopPropagation(); event.nativeEvent.stopImmediatePropagation(); - } + }; return ( - - - { headerText } + + + { headerText } { isGalleryPhoto && - + } - { isInfoToHabboPages && - - } - - { (!hideButtonClose) && } - +
+
+
); -} +}; diff --git a/src/common/card/NitroCardSubHeaderView.tsx b/src/common/card/NitroCardSubHeaderView.tsx deleted file mode 100644 index a37d0bd..0000000 --- a/src/common/card/NitroCardSubHeaderView.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { FC, useMemo } from 'react'; -import { Flex, FlexProps } from '..'; - -interface NitroCardSubHeaderProps extends FlexProps { - variant?: string; -} -export const NitroCardSubHeaderView: FC = props => -{ - const { justifyContent = 'center', classNames = [], variant = 'muted', ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'container-fluid', 'p-1' ]; - - if(classNames.length) newClassNames.push(...classNames); - - newClassNames.push('bg-' + variant); - - return newClassNames; - }, [ classNames, variant ]); - - return ; -} diff --git a/src/common/card/NitroCardView.scss b/src/common/card/NitroCardView.scss index 00f73fb..a552182 100644 --- a/src/common/card/NitroCardView.scss +++ b/src/common/card/NitroCardView.scss @@ -1,12 +1,8 @@ $nitro-card-header-height: 33px; -$nitro-card-tabs-height: 42px; +$nitro-card-tabs-height: 33px; .nitro-card { resize: both; - background: #ededed; - border-radius: 0.75rem!important; - border: 2px solid #454566!important; - box-shadow: 0 0 0 1pt #fff!important; @include media-breakpoint-down(lg) { max-width: 100vw !important; @@ -17,15 +13,9 @@ $nitro-card-tabs-height: 42px; border: $border-width solid $border-color; .nitro-card-header { - border-image-slice: 7 fill; - border-image-width: 7px; - border-image-repeat: repeat repeat; - color: #fff; - background: #454566; - height: 34px; - min-height: 34px; - line-height: 34px; - justify-content: center; + min-height: 33px; + max-height: 33px; + background: $primary; .nitro-card-header-text { color: $white; @@ -35,17 +25,24 @@ $nitro-card-tabs-height: 42px; .nitro-card-header-close { cursor: pointer; - background-image: url("@/assets/images/boxes/card/close.png"); - width: 19px; - height: 20px; + padding: 2px 2px; + line-height: 1; + border-radius: $border-radius; + box-shadow: 0 0 0 1.6px $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% + ); &:hover { - background-image: url("@/assets/images/boxes/card/close_hover.png"); - - &:active { - background-image: url("@/assets/images/boxes/card/close_click.png"); - } + filter: brightness(1.2); + } + &:active { + filter: brightness(0.8); } } @@ -74,42 +71,43 @@ $nitro-card-tabs-height: 42px; } .nitro-card-tabs { - background-color: #ededed; + background-color: $secondary; .nav-item { - padding: $nav-link-padding-y $nav-link-padding-x; - background-color: $muted; - color: $black; - z-index: 1; - margin-bottom: -1px; + padding: $nav-link-padding-y $nav-link-padding-x; + background-color: $muted; + color: $black; + z-index: 1; + margin-bottom: -1px; - &.active { - background-color: $light; - border-color: $border-color $border-color $light !important; - border-bottom: 1px solid black; + &.active { + background-color: $light; + border-color: $border-color $border-color $light !important; + border-bottom: 1px solid black; - &:before { - background: $white; - } - } - &:before { - content: ""; - position: absolute; - width: 93%; - height: 3px; - border-radius: 0.25rem; - top: 1.5px; - left: 0; - right: 0; - margin: auto; - background: #c2c9d1; - z-index: 1; - } - } + &:before { + background: $white; + } + } + + &:before { + content: ''; + position: absolute; + width: 93%; + height: 3px; + border-radius: 0.25rem; + top: 1.5px; + left: 0; + right: 0; + margin: auto; + background: #c2c9d1; + z-index: 1; + } + } } .content-area { - background-color: #ededed; + background-color: $light; } } @@ -120,11 +118,22 @@ $nitro-card-tabs-height: 42px; position: relative; min-height: 28px; max-height: 28px; - background: #454566; - box-shadow: 0 2px #366b8c; + background: repeating-linear-gradient($tertiary, $tertiary 50%, $quaternary 50%, $quaternary 100%); + border-bottom: 2px solid darken($quaternary, 5); + box-shadow: 0 2px white; width: 100%; margin: 0; - font-size: 20px; + padding-top:2px; + + &:before { + position: absolute; + content: ' '; + top: 0; + left: 0; + width: 100%; + height: 2px; + background-color: rgba($white, 0.3); + } .nitro-card-header-text { color: $white; @@ -135,24 +144,32 @@ $nitro-card-tabs-height: 42px; .nitro-card-header-close { cursor: pointer; - background-image: url("@/assets/images/boxes/card/close.png"); - width: 19px; - height: 20px; + padding: 0px 2px; + line-height: 1; + @include font-size($h7-font-size); + border-radius: $border-radius; + box-shadow: 0 0 0 1.6px $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% + ); &:hover { - background-image: url("@/assets/images/boxes/card/close_hover.png"); - - &:active { - background-image: url("@/assets/images/boxes/card/close_click.png"); - } + filter: brightness(1.2); + } + &:active { + filter: brightness(0.8); } } .nitro-card-header-report-camera { cursor: pointer; - padding: 1px 2px; - margin-right: 10px; + padding: 0px 2px; + margin-right: 4px; line-height: 1; @include font-size($h7-font-size); border-radius: $border-radius; @@ -180,7 +197,7 @@ $nitro-card-tabs-height: 42px; } .content-area { - background-color: #ededed; + background-color: $light; } } } @@ -213,6 +230,7 @@ $nitro-card-tabs-height: 42px; 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; } .nitro-card-accordion-set { diff --git a/src/common/card/NitroCardView.tsx b/src/common/card/NitroCardView.tsx index 46c4126..45d8144 100644 --- a/src/common/card/NitroCardView.tsx +++ b/src/common/card/NitroCardView.tsx @@ -15,50 +15,23 @@ export const NitroCardView: FC = props => const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'nitro-card', 'rounded', 'shadow', ]; + const newClassNames: string[] = [ 'resize', 'rounded', 'shadow', ]; + + // Card Theme Changer + newClassNames.push('border-[1px] border-[#283F5D]'); + - newClassNames.push(`theme-${ theme || 'primary' }`); if(classNames.length) newClassNames.push(...classNames); return newClassNames; - }, [ theme, classNames ]); - - /* useEffect(() => - { - if(!uniqueKey || !elementRef || !elementRef.current) return; - - const localStorage = GetLocalStorage(`nitro.windows.${ uniqueKey }`); - const element = elementRef.current; - - if(localStorage && localStorage.size) - { - //element.style.width = `${ localStorage.size.width }px`; - //element.style.height = `${ localStorage.size.height }px`; - } - - const observer = new ResizeObserver(event => - { - const newStorage = { ...GetLocalStorage>(`nitro.windows.${ uniqueKey }`) } as WindowSaveOptions; - - newStorage.size = { width: element.offsetWidth, height: element.offsetHeight }; - - SetLocalStorage(`nitro.windows.${ uniqueKey }`, newStorage); - }); - - observer.observe(element); - - return () => - { - observer.disconnect(); - } - }, [ uniqueKey ]); */ + }, [ classNames ]); return ( - - + + ); -} +}; diff --git a/src/common/card/accordion/NitroCardAccordionContext.tsx b/src/common/card/accordion/NitroCardAccordionContext.tsx index 61377d5..5e65c30 100644 --- a/src/common/card/accordion/NitroCardAccordionContext.tsx +++ b/src/common/card/accordion/NitroCardAccordionContext.tsx @@ -16,6 +16,6 @@ const NitroCardAccordionContext = createContext({ export const NitroCardAccordionContextProvider: FC> = props => { return ; -} +}; export const useNitroCardAccordionContext = () => useContext(NitroCardAccordionContext); diff --git a/src/common/card/accordion/NitroCardAccordionItemView.tsx b/src/common/card/accordion/NitroCardAccordionItemView.tsx index dbd89cc..238aab4 100644 --- a/src/common/card/accordion/NitroCardAccordionItemView.tsx +++ b/src/common/card/accordion/NitroCardAccordionItemView.tsx @@ -15,4 +15,4 @@ export const NitroCardAccordionItemView: FC = p { children } ); -} +}; diff --git a/src/common/card/accordion/NitroCardAccordionSetView.tsx b/src/common/card/accordion/NitroCardAccordionSetView.tsx index d9e0656..1a059d4 100644 --- a/src/common/card/accordion/NitroCardAccordionSetView.tsx +++ b/src/common/card/accordion/NitroCardAccordionSetView.tsx @@ -18,9 +18,9 @@ export const NitroCardAccordionSetView: FC = pro const onClick = () => { closeAll(); - + setIsOpen(prevValue => !prevValue); - } + }; const onClose = useCallback(() => setIsOpen(false), []); @@ -62,23 +62,23 @@ export const NitroCardAccordionSetView: FC = pro const index = newClosers.indexOf(closeFunction); if(index >= 0) newClosers.splice(index, 1); - + return newClosers; }); - } + }; }, [ onClose, setClosers ]); return ( - + { headerText } { isOpen && } { !isOpen && } { isOpen && - + { children } } ); -} +}; diff --git a/src/common/card/accordion/NitroCardAccordionView.tsx b/src/common/card/accordion/NitroCardAccordionView.tsx index 648a2e7..0874450 100644 --- a/src/common/card/accordion/NitroCardAccordionView.tsx +++ b/src/common/card/accordion/NitroCardAccordionView.tsx @@ -4,7 +4,7 @@ import { NitroCardAccordionContextProvider } from './NitroCardAccordionContext'; interface NitroCardAccordionViewProps extends ColumnProps { - + } export const NitroCardAccordionView: FC = props => @@ -22,4 +22,4 @@ export const NitroCardAccordionView: FC = props => ); -} +}; diff --git a/src/common/card/index.ts b/src/common/card/index.ts index 3619d43..3ce0d60 100644 --- a/src/common/card/index.ts +++ b/src/common/card/index.ts @@ -1,7 +1,6 @@ -export * from './accordion'; export * from './NitroCardContentView'; export * from './NitroCardContext'; export * from './NitroCardHeaderView'; -export * from './NitroCardSubHeaderView'; export * from './NitroCardView'; +export * from './accordion'; export * from './tabs'; diff --git a/src/common/card/tabs/NitroCardTabsItemView.tsx b/src/common/card/tabs/NitroCardTabsItemView.tsx index 1c74f8b..2f0b014 100644 --- a/src/common/card/tabs/NitroCardTabsItemView.tsx +++ b/src/common/card/tabs/NitroCardTabsItemView.tsx @@ -14,9 +14,10 @@ export const NitroCardTabsItemView: FC = props => const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'nav-item', 'rounded-top', 'border' ]; + const newClassNames: string[] = [ 'overflow-hidden relative cursor-pointer rounded-t-md flex bg-card-tab-item px-3 py-1 z-[1] border-card-border border-t border-l border-r before:absolute before:w-[93%] before:h-[3px] before:rounded-md before:top-[1.5px] before:left-0 before:right-0 before:m-auto before:z-[1] before:bg-[#C2C9D1]', + isActive && 'bg-card-tab-item-active -mb-[1px] before:bg-white' ]; - if(isActive) newClassNames.push('active'); + //if (isActive) newClassNames.push('bg-[#dfdfdf] border-b-[1px_solid_black]'); if(classNames.length) newClassNames.push(...classNames); @@ -24,12 +25,12 @@ export const NitroCardTabsItemView: FC = props => }, [ isActive, classNames ]); return ( - - + + { children } { (count > 0) && } ); -} +}; diff --git a/src/common/card/tabs/NitroCardTabsView.tsx b/src/common/card/tabs/NitroCardTabsView.tsx index ddc89a6..63ba2da 100644 --- a/src/common/card/tabs/NitroCardTabsView.tsx +++ b/src/common/card/tabs/NitroCardTabsView.tsx @@ -3,11 +3,11 @@ import { Flex, FlexProps } from '../..'; export const NitroCardTabsView: FC = props => { - const { justifyContent = 'start', gap = 1, classNames = [], children = null, ...rest } = props; + const { justifyContent = 'center', gap = 1, classNames = [], children = null, ...rest } = props; const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'container-fluid', 'nitro-card-tabs', 'pt-1', 'position-relative' ]; + const newClassNames: string[] = [ 'justify-center gap-0.5 flex bg-card-tabs min-h-card-tabs max-h-card-tabs pt-1 border-b border-card-border px-2' ]; if(classNames.length) newClassNames.push(...classNames); @@ -15,8 +15,8 @@ export const NitroCardTabsView: FC = props => }, [ classNames ]); return ( - + { children } ); -} \ No newline at end of file +}; diff --git a/src/common/draggable-window/DraggableWindow.tsx b/src/common/draggable-window/DraggableWindow.tsx index e069bb0..fa9763d 100644 --- a/src/common/draggable-window/DraggableWindow.tsx +++ b/src/common/draggable-window/DraggableWindow.tsx @@ -1,16 +1,15 @@ import { MouseEventType, TouchEventType } from '@nitrots/nitro-renderer'; 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 { GetLocalStorage, WindowSaveOptions } from '../../api'; +import { GetLocalStorage, SetLocalStorage, WindowSaveOptions } from '../../api'; import { DraggableWindowPosition } from './DraggableWindowPosition'; const CURRENT_WINDOWS: HTMLElement[] = []; -const POS_MEMORY: Map = new Map(); const BOUNDS_THRESHOLD_TOP: number = 0; const BOUNDS_THRESHOLD_LEFT: number = 0; -export interface DraggableWindowProps { +export interface DraggableWindowProps +{ uniqueKey?: Key; handleSelector?: string; windowPosition?: string; @@ -21,7 +20,8 @@ export interface DraggableWindowProps { children?: ReactNode; } -export const DraggableWindow: FC = props => { +export const DraggableWindow: FC = props => +{ const { uniqueKey = null, handleSelector = '.drag-handler', windowPosition = DraggableWindowPosition.CENTER, disableDrag = false, dragStyle = {}, children = null, offsetLeft = 0, offsetTop = 0 } = props; const [ delta, setDelta ] = useState<{ x: number, y: number }>(null); const [ offset, setOffset ] = useState<{ x: number, y: number }>(null); @@ -30,73 +30,106 @@ export const DraggableWindow: FC = props => { const [ dragHandler, setDragHandler ] = useState(null); const elementRef = useRef(); - const bringToTop = useCallback(() => { + const bringToTop = useCallback(() => + { let zIndex = 400; - for (const existingWindow of CURRENT_WINDOWS) { + + for(const existingWindow of CURRENT_WINDOWS) + { zIndex += 1; + existingWindow.style.zIndex = zIndex.toString(); } }, []); - const moveCurrentWindow = useCallback(() => { + const moveCurrentWindow = useCallback(() => + { const index = CURRENT_WINDOWS.indexOf(elementRef.current); - if (index === -1) { - CURRENT_WINDOWS.push(elementRef.current); - } else if (index === (CURRENT_WINDOWS.length - 1)) return; - else if (index >= 0) { - CURRENT_WINDOWS.splice(index, 1); + + if(index === -1) + { CURRENT_WINDOWS.push(elementRef.current); } + + else if(index === (CURRENT_WINDOWS.length - 1)) return; + + else if(index >= 0) + { + CURRENT_WINDOWS.splice(index, 1); + + CURRENT_WINDOWS.push(elementRef.current); + } + bringToTop(); }, [ bringToTop ]); - const onMouseDown = useCallback((event: ReactMouseEvent) => { + const onMouseDown = useCallback((event: ReactMouseEvent) => + { moveCurrentWindow(); }, [ moveCurrentWindow ]); - const onTouchDownHandler = useCallback((event: TouchEvent) => { + const onTouchStart = useCallback((event: ReactTouchEvent) => + { moveCurrentWindow(); }, [ moveCurrentWindow ]); - const startDragging = useCallback((startX: number, startY: number) => { + const startDragging = useCallback((startX: number, startY: number) => + { setStart({ x: startX, y: startY }); setIsDragging(true); }, []); - const onDragMouseDown = useCallback((event: MouseEvent) => { + const onDragMouseDown = useCallback((event: MouseEvent) => + { startDragging(event.clientX, event.clientY); }, [ startDragging ]); - const onTouchDown = useCallback((event: TouchEvent) => { + const onTouchDown = useCallback((event: TouchEvent) => + { const touch = event.touches[0]; + startDragging(touch.clientX, touch.clientY); }, [ startDragging ]); - const onDragMouseMove = useCallback((event: MouseEvent) => { + const onDragMouseMove = useCallback((event: MouseEvent) => + { setDelta({ x: (event.clientX - start.x), y: (event.clientY - start.y) }); }, [ start ]); - const onDragTouchMove = useCallback((event: TouchEvent) => { + const onDragTouchMove = useCallback((event: TouchEvent) => + { const touch = event.touches[0]; + setDelta({ x: (touch.clientX - start.x), y: (touch.clientY - start.y) }); }, [ start ]); - const completeDrag = useCallback(() => { - if (!elementRef.current || !dragHandler) return; + const completeDrag = useCallback(() => + { + if(!elementRef.current || !dragHandler) return; + let offsetX = (offset.x + delta.x); let offsetY = (offset.y + delta.y); + const left = elementRef.current.offsetLeft + offsetX; const top = elementRef.current.offsetTop + offsetY; - if (top < BOUNDS_THRESHOLD_TOP) { + if(top < BOUNDS_THRESHOLD_TOP) + { offsetY = -elementRef.current.offsetTop; - } else if ((top + dragHandler.offsetHeight) >= (document.body.offsetHeight - BOUNDS_THRESHOLD_TOP)) { + } + + else if((top + dragHandler.offsetHeight) >= (document.body.offsetHeight - BOUNDS_THRESHOLD_TOP)) + { offsetY = (document.body.offsetHeight - elementRef.current.offsetHeight) - elementRef.current.offsetTop; } - if ((left + elementRef.current.offsetWidth) < BOUNDS_THRESHOLD_LEFT) { + if((left + elementRef.current.offsetWidth) < BOUNDS_THRESHOLD_LEFT) + { offsetX = -elementRef.current.offsetLeft; - } else if (left >= (document.body.offsetWidth - BOUNDS_THRESHOLD_LEFT)) { + } + + else if(left >= (document.body.offsetWidth - BOUNDS_THRESHOLD_LEFT)) + { offsetX = (document.body.offsetWidth - elementRef.current.offsetWidth) - elementRef.current.offsetLeft; } @@ -104,33 +137,48 @@ export const DraggableWindow: FC = props => { setOffset({ x: offsetX, y: offsetY }); setIsDragging(false); - if (uniqueKey !== null) POS_MEMORY.set(uniqueKey, { x: offsetX, y: offsetY }); + if(uniqueKey !== null) + { + const newStorage = { ...GetLocalStorage(`nitro.windows.${ uniqueKey }`) } as WindowSaveOptions; + + newStorage.offset = { x: offsetX, y: offsetY }; + + SetLocalStorage(`nitro.windows.${ uniqueKey }`, newStorage); + } }, [ dragHandler, delta, offset, uniqueKey ]); - const onDragMouseUp = useCallback((event: MouseEvent) => { + const onDragMouseUp = useCallback((event: MouseEvent) => + { completeDrag(); }, [ completeDrag ]); - const onDragTouchUp = useCallback((event: TouchEvent) => { + const onDragTouchUp = useCallback((event: TouchEvent) => + { completeDrag(); }, [ completeDrag ]); - useEffect(() => { - const element = elementRef.current; - if (!element) return; + useEffect(() => + { + const element = (elementRef.current as HTMLElement); + + if(!element) return; CURRENT_WINDOWS.push(element); + bringToTop(); - if (!disableDrag) { - const handle = element.querySelector(handleSelector) as HTMLElement; - if (handle) setDragHandler(handle); + if(!disableDrag) + { + const handle = (element.querySelector(handleSelector)); + + if(handle) setDragHandler(handle); } let offsetX = 0; let offsetY = 0; - switch (windowPosition) { + switch(windowPosition) + { case DraggableWindowPosition.TOP_CENTER: element.style.top = 50 + offsetTop + 'px'; element.style.left = `calc(50vw - ${ (element.offsetWidth / 2 + offsetLeft) }px)`; @@ -145,50 +193,54 @@ export const DraggableWindow: FC = props => { break; } - if (uniqueKey !== null) { - const memory = POS_MEMORY.get(uniqueKey); - if (memory) { - offsetX = memory.x; - offsetY = memory.y; - } - } - setDelta({ x: 0, y: 0 }); setOffset({ x: offsetX, y: offsetY }); - return () => { + return () => + { const index = CURRENT_WINDOWS.indexOf(element); - if (index >= 0) CURRENT_WINDOWS.splice(index, 1); + + if(index >= 0) CURRENT_WINDOWS.splice(index, 1); }; }, [ handleSelector, windowPosition, uniqueKey, disableDrag, offsetLeft, offsetTop, bringToTop ]); - useEffect(() => { - if (!offset && !delta) return; - const element = elementRef.current; - if (!element) return; + useEffect(() => + { + if(!offset && !delta) return; + + const element = (elementRef.current as HTMLElement); + + if(!element) return; + element.style.transform = `translate(${ offset.x + delta.x }px, ${ offset.y + delta.y }px)`; element.style.visibility = 'visible'; }, [ offset, delta ]); - useEffect(() => { - if (!dragHandler) return; - dragHandler.addEventListener(MouseEventType.MOUSE_DOWN, onDragMouseDown); - dragHandler.addEventListener(TouchEventType.TOUCH_START, onTouchDown, { passive: true }); + useEffect(() => + { + if(!dragHandler) return; - return () => { + dragHandler.addEventListener(MouseEventType.MOUSE_DOWN, onDragMouseDown); + dragHandler.addEventListener(TouchEventType.TOUCH_START, onTouchDown); + + return () => + { dragHandler.removeEventListener(MouseEventType.MOUSE_DOWN, onDragMouseDown); dragHandler.removeEventListener(TouchEventType.TOUCH_START, onTouchDown); }; }, [ dragHandler, onDragMouseDown, onTouchDown ]); - useEffect(() => { - if (!isDragging) return; + useEffect(() => + { + if(!isDragging) return; + document.addEventListener(MouseEventType.MOUSE_UP, onDragMouseUp); document.addEventListener(TouchEventType.TOUCH_END, onDragTouchUp); document.addEventListener(MouseEventType.MOUSE_MOVE, onDragMouseMove); document.addEventListener(TouchEventType.TOUCH_MOVE, onDragTouchMove); - return () => { + return () => + { document.removeEventListener(MouseEventType.MOUSE_UP, onDragMouseUp); document.removeEventListener(TouchEventType.TOUCH_END, onDragTouchUp); document.removeEventListener(MouseEventType.MOUSE_MOVE, onDragMouseMove); @@ -196,37 +248,22 @@ export const DraggableWindow: FC = props => { }; }, [ isDragging, onDragMouseUp, onDragMouseMove, onDragTouchUp, onDragTouchMove ]); - useEffect(() => { - const element = elementRef.current; - if (!element) return; + useEffect(() => + { + if(!uniqueKey) return; - element.addEventListener('touchstart', onTouchDownHandler, { passive: true }); - - return () => { - element.removeEventListener('touchstart', onTouchDownHandler); - }; - }, [ onTouchDownHandler ]); - - useEffect(() => { - if (!uniqueKey) return; const localStorage = GetLocalStorage(`nitro.windows.${ uniqueKey }`); - if (!localStorage || !localStorage.offset) return; + + if(!localStorage || !localStorage.offset) return; + setDelta({ x: 0, y: 0 }); - if (localStorage.offset) setOffset(localStorage.offset); + if(localStorage.offset) setOffset(localStorage.offset); }, [ uniqueKey ]); return ( createPortal( - - {children} - , - document.getElementById('draggable-windows-container') - ) +
+ { children } +
, document.getElementById('draggable-windows-container')) ); -}; \ No newline at end of file +}; diff --git a/src/common/index.scss b/src/common/index.scss index 393e17b..f1efe5c 100644 --- a/src/common/index.scss +++ b/src/common/index.scss @@ -202,71 +202,6 @@ background-color: rgba($black, 0.125); } -.room-creator-grid-item { - height: var(--nitro-grid-column-min-height, unset); - background-position: center; - background-repeat: no-repeat; - border-image-source: url(@/assets/images/navigator/room-creator/room-bg.png); - border-image-slice:6 6 6 6 fill; - border-image-width:6px 6px 6px 6px; - overflow: hidden; - - &.active { - border-image-source: url(@/assets/images/navigator/room-creator/room-bg-active.png) !important; - color: #fff !important; - - .active-arrow { - background-image: url(@/assets/images/navigator/room-creator/arrow.png); - width: 18px; - height: 20px; - position: absolute; - top: 1px; - animation: MoveUpDown 1.7s linear infinite; - - @keyframes MoveUpDown { - 0%, 100% { - top: 1px; - } - 50% { - top: 10px; - } - } - - } - } - - &.disabled { - cursor: not-allowed; - - img { - opacity: 0.5; - filter: grayscale(1); - } - } - - &.unseen { - background-color: rgba($success, 0.4); - } - - .avatar-image { - background-position-y: -35px; - } - - &.has-highlight { - &:after { - content: ""; - z-index: 2; - position: absolute; - top: 2px; - left: 2px; - height: 1px; - width: 9px; - background-color: #fff; - opacity: 0.1; - } - } -} - #draggable-windows-container { position: absolute; top: 0; @@ -304,7 +239,7 @@ z-index: 1; } -.badge-image { +.relative { position: relative; width: 40px; height: 40px; @@ -345,7 +280,8 @@ } } -.furni-image { +.furni-image, +.room-object-image { position: relative; width: 100%; height: 100%; @@ -406,8 +342,10 @@ left: 0; height: 100%; width: 100%; - background-color: $white; + border-radius: $border-radius; + background-color: $light; background-repeat: no-repeat; + background-position: center; overflow: hidden; &.border-0 { @@ -593,12 +531,12 @@ } .nitro-progress-bar { - border: 1px solid #fff; + border: 1px solid $white; padding: 2px; - height: 25px; - border-radius: 1em; + height: 20px; + border-radius: $border-radius; overflow: hidden; - background: #212529; + background: $primary; &.large { height: 30px; @@ -608,8 +546,11 @@ height: 100%; z-index: 1; transition: all 1s; - border-radius: 1em; - background: repeating-linear-gradient(#d6baa1,#d6baa1 50%,#b69b83 0,#b69b83); + border-radius: calc(#{$border-radius} / 2); + background: repeating-linear-gradient($tertiary, + $tertiary 50%, + $quaternary 50%, + $quaternary 100%); } .nitro-progress-bar-text { diff --git a/src/common/index.ts b/src/common/index.ts index bc70d55..10f2bf3 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -1,23 +1,21 @@ + export * from './AutoGrid'; export * from './Base'; export * from './Button'; export * from './ButtonGroup'; -export * from './card'; -export * from './card/accordion'; -export * from './card/tabs'; -export * from './classNames'; export * from './Column'; -export * from './draggable-window'; export * from './Flex'; export * from './FormGroup'; export * from './Grid'; export * from './GridContext'; export * from './HorizontalRule'; export * from './InfiniteScroll'; +export * from './Text'; +export * from './card'; +export * from './card/accordion'; +export * from './card/tabs'; +export * from './draggable-window'; export * from './layout'; export * from './layout/limited-edition'; -export * from "./Slider"; -export * from './Text'; -export * from './transitions'; export * from './types'; export * from './utils'; diff --git a/src/common/layout/LayoutAvatarImageView.tsx b/src/common/layout/LayoutAvatarImageView.tsx index d127bd9..316b1fd 100644 --- a/src/common/layout/LayoutAvatarImageView.tsx +++ b/src/common/layout/LayoutAvatarImageView.tsx @@ -1,8 +1,9 @@ -import { AvatarScaleType, AvatarSetType } from '@nitrots/nitro-renderer'; +import { AvatarScaleType, AvatarSetType, GetAvatarRenderManager } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, useEffect, useMemo, useRef, useState } from 'react'; -import { GetAvatarRenderManager } from '../../api'; import { Base, BaseProps } from '../Base'; +const AVATAR_IMAGE_CACHE: Map = new Map(); + export interface LayoutAvatarImageViewProps extends BaseProps { figure: string; @@ -16,12 +17,12 @@ export const LayoutAvatarImageView: FC = props => { const { figure = '', gender = 'M', headOnly = false, direction = 0, scale = 1, classNames = [], style = {}, ...rest } = props; const [ avatarUrl, setAvatarUrl ] = useState(null); - const [ randomValue, setRandomValue ] = useState(-1); + const [ isReady, setIsReady ] = useState(false); const isDisposed = useRef(false); const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'avatar-image' ]; + const newClassNames: string[] = [ 'avatar-image relative w-[90px] h-[130px] bg-no-repeat bg-[center_-8px] pointer-events-none' ]; if(classNames.length) newClassNames.push(...classNames); @@ -48,42 +49,55 @@ export const LayoutAvatarImageView: FC = props => useEffect(() => { - const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, gender, { - resetFigure: figure => + if(!isReady) return; + + const figureKey = [ figure, gender, direction, headOnly ].join('-'); + + if(AVATAR_IMAGE_CACHE.has(figureKey)) + { + setAvatarUrl(AVATAR_IMAGE_CACHE.get(figureKey)); + } + else + { + const resetFigure = (_figure: string) => { if(isDisposed.current) return; - setRandomValue(Math.random()); - }, - dispose: () => - {}, - disposed: false - }, null); + const avatarImage = GetAvatarRenderManager().createAvatarImage(_figure, AvatarScaleType.LARGE, gender, { resetFigure: (figure: string) => resetFigure(figure), dispose: null, disposed: false }); - if(!avatarImage) return; - - let setType = AvatarSetType.FULL; + let setType = AvatarSetType.FULL; - if(headOnly) setType = AvatarSetType.HEAD; + if(headOnly) setType = AvatarSetType.HEAD; - avatarImage.setDirection(setType, direction); + avatarImage.setDirection(setType, direction); - const image = avatarImage.getCroppedImage(setType); + const imageUrl = avatarImage.processAsImageUrl(setType); - if(image) setAvatarUrl(image.src); + if(imageUrl && !isDisposed.current) + { + if(!avatarImage.isPlaceholder()) AVATAR_IMAGE_CACHE.set(figureKey, imageUrl); - avatarImage.dispose(); - }, [ figure, gender, direction, headOnly, randomValue ]); + setAvatarUrl(imageUrl); + } + + avatarImage.dispose(true); + }; + + resetFigure(figure); + } + }, [ figure, gender, direction, headOnly, isReady ]); useEffect(() => { isDisposed.current = false; + setIsReady(true); + return () => { isDisposed.current = true; - } + }; }, []); - + return ; -} +}; diff --git a/src/common/layout/LayoutBackgroundImage.tsx b/src/common/layout/LayoutBackgroundImage.tsx index 0900a26..622d959 100644 --- a/src/common/layout/LayoutBackgroundImage.tsx +++ b/src/common/layout/LayoutBackgroundImage.tsx @@ -20,4 +20,4 @@ export const LayoutBackgroundImage: FC = props => }, [ style, imageUrl ]); return ; -} +}; diff --git a/src/common/layout/LayoutBadgeImageView.tsx b/src/common/layout/LayoutBadgeImageView.tsx index 3c0979d..7cfb838 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 { BadgeImageReadyEvent, GetEventDispatcher, GetSessionDataManager, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, useEffect, useMemo, useState } from 'react'; -import { GetConfiguration, GetSessionDataManager, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../api'; +import { GetConfigurationValue, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../api'; import { Base, BaseProps } from '../Base'; export interface LayoutBadgeImageViewProps extends BaseProps @@ -20,7 +20,7 @@ export const LayoutBadgeImageView: FC = props => const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'badge-image' ]; + const newClassNames: string[] = [ 'relative w-[40px] h-[40px] bg-no-repeat bg-center' ]; if(isGroup) newClassNames.push('group-badge'); @@ -37,7 +37,7 @@ export const LayoutBadgeImageView: FC = props => if(imageElement) { - newStyle.backgroundImage = `url(${ (isGroup) ? imageElement.src : GetConfiguration('badge.asset.url').replace('%badgename%', badgeCode.toString())})`; + newStyle.backgroundImage = `url(${ (isGroup) ? imageElement.src : GetConfigurationValue('badge.asset.url').replace('%badgename%', badgeCode.toString()) })`; newStyle.width = imageElement.width; newStyle.height = imageElement.height; @@ -55,7 +55,7 @@ export const LayoutBadgeImageView: FC = props => if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; return newStyle; - }, [ imageElement, scale, style ]); + }, [ badgeCode, isGroup, imageElement, scale, style ]); useEffect(() => { @@ -63,41 +63,44 @@ export const LayoutBadgeImageView: FC = props => let didSetBadge = false; - const onBadgeImageReadyEvent = (event: BadgeImageReadyEvent) => + const onBadgeImageReadyEvent = async (event: BadgeImageReadyEvent) => { if(event.badgeId !== badgeCode) return; - const element = TextureUtils.generateImage(new NitroSprite(event.image)); + const element = await TextureUtils.generateImage(new NitroSprite(event.image)); element.onload = () => setImageElement(element); didSetBadge = true; - GetSessionDataManager().events.removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); - } + GetEventDispatcher().removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); + }; - GetSessionDataManager().events.addEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); + GetEventDispatcher().addEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); const texture = isGroup ? GetSessionDataManager().getGroupBadgeImage(badgeCode) : GetSessionDataManager().getBadgeImage(badgeCode); if(texture && !didSetBadge) { - const element = TextureUtils.generateImage(new NitroSprite(texture)); + (async () => + { + const element = await TextureUtils.generateImage(new NitroSprite(texture)); - element.onload = () => setImageElement(element); + element.onload = () => setImageElement(element); + })(); } - return () => GetSessionDataManager().events.removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); + return () => GetEventDispatcher().removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); }, [ badgeCode, isGroup ]); return ( - - { (showInfo && GetConfiguration('badge.descriptions.enabled', true)) && - -
{ isGroup ? customTitle : LocalizeBadgeName(badgeCode) }
+ + { (showInfo && GetConfigurationValue('badge.descriptions.enabled', true)) && + +
{ isGroup ? customTitle : LocalizeBadgeName(badgeCode) }
{ isGroup ? LocalizeText('group.badgepopup.body') : LocalizeBadgeDescription(badgeCode) }
} { children } ); -} \ No newline at end of file +}; diff --git a/src/common/layout/LayoutCounterTimeView.tsx b/src/common/layout/LayoutCounterTimeView.tsx index 7460b05..9b37095 100644 --- a/src/common/layout/LayoutCounterTimeView.tsx +++ b/src/common/layout/LayoutCounterTimeView.tsx @@ -1,7 +1,6 @@ import { FC, useMemo } from 'react'; import { LocalizeText } from '../../api'; import { Base, BaseProps } from '../Base'; -import { Flex } from '../Flex'; interface LayoutCounterTimeViewProps extends BaseProps { @@ -25,19 +24,19 @@ export const LayoutCounterTimeView: FC = props => }, [ classNames ]); return ( - +
{ day != '00' ? day : hour }{ day != '00' ? LocalizeText('countdown_clock_unit_days') : LocalizeText('countdown_clock_unit_hours') }
- : - +
:
+
{ minutes }{ LocalizeText('countdown_clock_unit_minutes') }
: - +
{ seconds }{ LocalizeText('countdown_clock_unit_seconds') }
{ children } - +
); -} +}; diff --git a/src/common/layout/LayoutCurrencyIcon.tsx b/src/common/layout/LayoutCurrencyIcon.tsx index bf63ac3..f311c22 100644 --- a/src/common/layout/LayoutCurrencyIcon.tsx +++ b/src/common/layout/LayoutCurrencyIcon.tsx @@ -1,5 +1,5 @@ import { CSSProperties, FC, useMemo } from 'react'; -import { GetConfiguration } from '../../api'; +import { GetConfigurationValue } from '../../api'; import { Base, BaseProps } from '../Base'; export interface CurrencyIconProps extends BaseProps @@ -13,7 +13,7 @@ export const LayoutCurrencyIcon: FC = props => const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'nitro-currency-icon topcurrencygen' ]; + const newClassNames: string[] = [ 'nitro-currency-icon', 'bg-center bg-no-repeat w-[15px] h-[15px]' ]; if(classNames.length) newClassNames.push(...classNames); @@ -22,8 +22,8 @@ export const LayoutCurrencyIcon: FC = props => const urlString = useMemo(() => { - let url = GetConfiguration('currency.asset.icon.url', ''); - + let url = GetConfigurationValue('currency.asset.icon.url', ''); + url = url.replace('%type%', type.toString()); return `url(${ url })`; @@ -40,5 +40,5 @@ export const LayoutCurrencyIcon: FC = props => return newStyle; }, [ style, urlString ]); - return -} + return ; +}; diff --git a/src/common/layout/LayoutFurniIconImageView.tsx b/src/common/layout/LayoutFurniIconImageView.tsx index b1191db..b7eaeff 100644 --- a/src/common/layout/LayoutFurniIconImageView.tsx +++ b/src/common/layout/LayoutFurniIconImageView.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; -import { LayoutImage, LayoutImageProps } from '.'; import { GetImageIconUrlForProduct } from '../../api'; +import { LayoutImage, LayoutImageProps } from './LayoutImage'; interface LayoutFurniIconImageViewProps extends LayoutImageProps { @@ -13,5 +13,5 @@ export const LayoutFurniIconImageView: FC = props { const { productType = 's', productClassId = -1, extraData = '', ...rest } = props; - return ; -} + return ; +}; diff --git a/src/common/layout/LayoutFurniImageView.tsx b/src/common/layout/LayoutFurniImageView.tsx index ef8696c..b83d811 100644 --- a/src/common/layout/LayoutFurniImageView.tsx +++ b/src/common/layout/LayoutFurniImageView.tsx @@ -1,8 +1,7 @@ -import { IGetImageListener, ImageResult, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, IGetImageListener, ImageResult, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, useEffect, useMemo, useState } from 'react'; -import { BaseProps } from '..'; -import { GetRoomEngine, ProductTypeEnum } from '../../api'; -import { Base } from '../Base'; +import { ProductTypeEnum } from '../../api'; +import { Base, BaseProps } from '../Base'; interface LayoutFurniImageViewProps extends BaseProps { @@ -46,15 +45,7 @@ export const LayoutFurniImageView: FC = props => let imageResult: ImageResult = null; const listener: IGetImageListener = { - imageReady: (id, texture, image) => - { - if(!image && texture) - { - image = TextureUtils.generateImage(texture); - } - - image.onload = () => setImageElement(image); - }, + imageReady: async (id, texture, image) => setImageElement(await TextureUtils.generateImage(texture)), imageFailed: null }; @@ -68,15 +59,12 @@ export const LayoutFurniImageView: FC = props => break; } - if(imageResult) - { - const image = imageResult.getImage(); + if(!imageResult) return; - image.onload = () => setImageElement(image); - } + (async () => setImageElement(await TextureUtils.generateImage(imageResult.data)))(); }, [ productType, productClassId, direction, extraData ]); if(!imageElement) return null; return ; -} +}; diff --git a/src/common/layout/LayoutGiftTagView.tsx b/src/common/layout/LayoutGiftTagView.tsx index 8fcc405..75004ec 100644 --- a/src/common/layout/LayoutGiftTagView.tsx +++ b/src/common/layout/LayoutGiftTagView.tsx @@ -1,6 +1,8 @@ import { FC } from 'react'; -import { Column, Flex, Text } from '..'; import { LocalizeText } from '../../api'; +import { Column } from '../Column'; +import { Flex } from '../Flex'; +import { Text } from '../Text'; import { LayoutAvatarImageView } from './LayoutAvatarImageView'; interface LayoutGiftTagViewProps @@ -15,21 +17,21 @@ interface LayoutGiftTagViewProps export const LayoutGiftTagView: FC = props => { const { figure = null, userName = null, message = null, editable = false, onChange = null } = props; - + return ( - -
+ +
{ !userName &&
} { figure &&
- +
}
- - + + { !editable && { message } } { editable && (onChange !== null) && - } + } { userName && { LocalizeText('catalog.gift_wrapping_new.message_from', [ 'name' ], [ userName ]) } } diff --git a/src/common/layout/LayoutGridColorPickerItem.tsx b/src/common/layout/LayoutGridColorPickerItem.tsx deleted file mode 100644 index cfd7f68..0000000 --- a/src/common/layout/LayoutGridColorPickerItem.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { FC, useMemo } from 'react'; -import { Base } from '../Base'; -import { Column, ColumnProps } from '../Column'; -import { LayoutItemCountView } from './LayoutItemCountView'; -import { LayoutLimitedEditionStyledNumberView } from './limited-edition'; - -export interface LayoutGridColorPickerItemProps extends ColumnProps -{ - itemImage?: string; - itemColor?: string; - itemActive?: boolean; - itemCount?: number; - itemCountMinimum?: number; - itemUniqueSoldout?: boolean; - itemUniqueNumber?: number; - itemUnseen?: boolean; - itemHighlight?: boolean; - disabled?: boolean; -} - -export const LayoutGridColorPickerItem: FC = props => -{ - const { itemImage = undefined, itemColor = undefined, itemActive = false, itemCount = 1, itemCountMinimum = 1, itemUniqueSoldout = false, itemUniqueNumber = -2, itemUnseen = false, itemHighlight = false, disabled = false, center = true, column = true, style = {}, classNames = [], position = 'relative', overflow = 'hidden', children = null, ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'layout-grid-item', 'color-picker-frame' ]; - - if(itemActive) newClassNames.push('active'); - - if(itemUniqueSoldout || (itemUniqueNumber > 0)) newClassNames.push('unique-item'); - - if(itemUniqueSoldout) newClassNames.push('sold-out'); - - if(itemUnseen) newClassNames.push('unseen'); - - if(itemHighlight) newClassNames.push('has-highlight'); - - if(disabled) newClassNames.push('disabled') - - if(itemImage === null) newClassNames.push('icon', 'loading-icon'); - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ itemActive, itemUniqueSoldout, itemUniqueNumber, itemUnseen, itemHighlight, disabled, itemImage, classNames ]); - - const getStyle = useMemo(() => - { - let newStyle = { ...style }; - - if(itemImage) newStyle.backgroundImage = `url(${ itemImage })`; - - if(itemColor) newStyle.backgroundColor = itemColor; - - if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; - - return newStyle; - }, [ style, itemImage, itemColor ]); - - return ( - - { (itemCount > itemCountMinimum) && - } - { (itemUniqueNumber > 0) && - <> - -
- -
- } - { children } -
- ); -} diff --git a/src/common/layout/LayoutGridItem.tsx b/src/common/layout/LayoutGridItem.tsx index e1a32e5..5bf73ea 100644 --- a/src/common/layout/LayoutGridItem.tsx +++ b/src/common/layout/LayoutGridItem.tsx @@ -26,7 +26,8 @@ export const LayoutGridItem: FC = props => { const newClassNames: string[] = [ 'layout-grid-item', 'border', 'border-2', 'border-muted', 'rounded' ]; - if(itemActive) newClassNames.push('active'); + + if(itemActive) newClassNames.push('!bg-[#ececec] !border-[#fff]'); if(itemUniqueSoldout || (itemUniqueNumber > 0)) newClassNames.push('unique-item'); @@ -36,7 +37,7 @@ export const LayoutGridItem: FC = props => if(itemHighlight) newClassNames.push('has-highlight'); - if(disabled) newClassNames.push('disabled') + if(disabled) newClassNames.push('disabled'); if(itemImage === null) newClassNames.push('icon', 'loading-icon'); @@ -59,17 +60,17 @@ export const LayoutGridItem: FC = props => }, [ style, itemImage, itemColor, itemUniqueSoldout, itemUniqueNumber ]); return ( - + { (itemCount > itemCountMinimum) && } - { (itemUniqueNumber > 0) && + { (itemUniqueNumber > 0) && <> -
+
} { children } ); -} +}; diff --git a/src/common/layout/LayoutImage.tsx b/src/common/layout/LayoutImage.tsx index e6c6228..f3db3bd 100644 --- a/src/common/layout/LayoutImage.tsx +++ b/src/common/layout/LayoutImage.tsx @@ -9,5 +9,5 @@ export const LayoutImage: FC = props => { const { imageUrl = null, className = '', ...rest } = props; - return ; -} + return ; +}; diff --git a/src/common/layout/LayoutInputErrorView.tsx b/src/common/layout/LayoutInputErrorView.tsx deleted file mode 100644 index e7aa128..0000000 --- a/src/common/layout/LayoutInputErrorView.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { FC } from 'react'; -import { Flex, Text } from '..'; - -interface LayoutInputErrorViewProps -{ - text: string; -} - -export const LayoutInputErrorView: FC = props => -{ - const { text = null } = props; - - return ( - - { text } - - ); -}; diff --git a/src/common/layout/LayoutItemCountView.tsx b/src/common/layout/LayoutItemCountView.tsx index 66bc9a2..5b14ed5 100644 --- a/src/common/layout/LayoutItemCountView.tsx +++ b/src/common/layout/LayoutItemCountView.tsx @@ -1,5 +1,5 @@ import { FC, useMemo } from 'react'; -import { Base, BaseProps } from '..'; +import { Base, BaseProps } from '../Base'; interface LayoutItemCountViewProps extends BaseProps { @@ -12,7 +12,7 @@ export const LayoutItemCountView: FC = props => const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'badge', 'border', 'border-black', 'bg-danger', 'px-1', 'nitro-item-count' ]; + const newClassNames: string[] = [ 'inline-block px-[.65em] py-[.35em] text-[.75em] font-bold leading-none text-[#fff] text-center whitespace-nowrap align-baseline rounded-[.25rem]', '!border-[1px] !border-[solid] !border-[#283F5D]', 'border-black', 'bg-danger', 'px-1', 'top-[2px] right-[2px] text-[9.5px] px-[3px] py-[2px] ' ]; if(classNames.length) newClassNames.push(...classNames); @@ -20,9 +20,9 @@ export const LayoutItemCountView: FC = props => }, [ classNames ]); return ( - + { count } { children } ); -} +}; diff --git a/src/common/layout/LayoutLoadingSpinnerView.tsx b/src/common/layout/LayoutLoadingSpinnerView.tsx index 308e0ca..1d2641f 100644 --- a/src/common/layout/LayoutLoadingSpinnerView.tsx +++ b/src/common/layout/LayoutLoadingSpinnerView.tsx @@ -4,7 +4,7 @@ import { Base, BaseProps } from '../Base'; export const LayoutLoadingSpinnerView: FC> = props => { const { ...rest } = props; - + return ( @@ -12,4 +12,4 @@ export const LayoutLoadingSpinnerView: FC> = props => ); -} +}; diff --git a/src/common/layout/LayoutMiniCameraView.tsx b/src/common/layout/LayoutMiniCameraView.tsx index 31b361c..f66786d 100644 --- a/src/common/layout/LayoutMiniCameraView.tsx +++ b/src/common/layout/LayoutMiniCameraView.tsx @@ -1,12 +1,12 @@ -import { NitroRectangle, NitroRenderTexture } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, NitroRectangle, NitroTexture } from '@nitrots/nitro-renderer'; import { FC, useRef } from 'react'; -import { GetRoomEngine, LocalizeText, PlaySound, SoundNames } from '../../api'; +import { LocalizeText, PlaySound, SoundNames } from '../../api'; import { DraggableWindow } from '../draggable-window'; interface LayoutMiniCameraViewProps { roomId: number; - textureReceiver: (texture: NitroRenderTexture) => void; + textureReceiver: (texture: NitroTexture) => Promise; onClose: () => void; } @@ -20,23 +20,23 @@ export const LayoutMiniCameraView: FC = props => if(!elementRef || !elementRef.current) return null; const frameBounds = elementRef.current.getBoundingClientRect(); - + return new NitroRectangle(Math.floor(frameBounds.x), Math.floor(frameBounds.y), Math.floor(frameBounds.width), Math.floor(frameBounds.height)); - } + }; const takePicture = () => { PlaySound(SoundNames.CAMERA_SHUTTER); textureReceiver(GetRoomEngine().createTextureFromRoom(roomId, 1, getCameraBounds())); - } - + }; + return (
-
- - +
+ +
diff --git a/src/common/layout/LayoutNotificationAlertView.tsx b/src/common/layout/LayoutNotificationAlertView.tsx index 1671b00..b1cdf53 100644 --- a/src/common/layout/LayoutNotificationAlertView.tsx +++ b/src/common/layout/LayoutNotificationAlertView.tsx @@ -1,4 +1,4 @@ -import { FC, ReactNode, useMemo } from 'react'; +import { FC, useMemo } from 'react'; import { NotificationAlertType } from '../../api'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView, NitroCardViewProps } from '../card'; @@ -11,12 +11,12 @@ export interface LayoutNotificationAlertViewProps extends NitroCardViewProps export const LayoutNotificationAlertView: FC = props => { - const { title = '', onClose = null, classNames = [], children = null,type = NotificationAlertType.DEFAULT, options = 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); @@ -27,10 +27,9 @@ export const LayoutNotificationAlertView: FC = return ( - + { children } - { options } ); -} +}; diff --git a/src/common/layout/LayoutNotificationBubbleView.tsx b/src/common/layout/LayoutNotificationBubbleView.tsx index a482166..bda4d47 100644 --- a/src/common/layout/LayoutNotificationBubbleView.tsx +++ b/src/common/layout/LayoutNotificationBubbleView.tsx @@ -1,6 +1,6 @@ +import { AnimatePresence, motion } from 'framer-motion'; import { FC, useEffect, useMemo, useState } from 'react'; -import { Flex, FlexProps } from '..'; -import { TransitionAnimation, TransitionAnimationTypes } from '../transitions'; +import { Flex, FlexProps } from '../Flex'; export interface LayoutNotificationBubbleViewProps extends FlexProps { @@ -45,8 +45,14 @@ export const LayoutNotificationBubbleView: FC }, [ fadesOut, timeoutMs, onClose ]); return ( - - - + + { isVisible && + + + } + ); -} +}; \ No newline at end of file diff --git a/src/common/layout/LayoutNotificationCredits.tsx b/src/common/layout/LayoutNotificationCredits.tsx deleted file mode 100644 index 6cd7ef8..0000000 --- a/src/common/layout/LayoutNotificationCredits.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FC, useMemo } from 'react'; -import { NotificationAlertType } from '../../api'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView, NitroCardViewProps } from '../card'; - -export interface LayoutNotificationCreditsProps extends NitroCardViewProps -{ - title?: string; - type?: string; - onClose: () => void; -} - -export const LayoutNotificationCredits: FC = props => -{ - const { title = '', onClose = null, classNames = [], children = null,type = NotificationAlertType.DEFAULT, ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = ['nitro-alert', 'nitro-alert-credits']; - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ classNames, type ]); - - return ( - - - - { children } - - - ); -} diff --git a/src/common/layout/LayoutPetImageView.tsx b/src/common/layout/LayoutPetImageView.tsx index 27d43de..acf1a79 100644 --- a/src/common/layout/LayoutPetImageView.tsx +++ b/src/common/layout/LayoutPetImageView.tsx @@ -1,6 +1,5 @@ -import { IPetCustomPart, PetFigureData, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, IPetCustomPart, PetFigureData, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, useEffect, useMemo, useRef, useState } from 'react'; -import { GetRoomEngine } from '../../api'; import { Base, BaseProps } from '../Base'; interface LayoutPetImageViewProps extends BaseProps @@ -68,7 +67,7 @@ export const LayoutPetImageView: FC = props => if(petTypeId === 16) petHeadOnly = false; const imageResult = GetRoomEngine().getRoomObjectPetImage(petTypeId, petPaletteId, petColor1, new Vector3d((direction * 45)), 64, { - imageReady: (id, texture, image) => + imageReady: async (id, texture, image) => { if(isDisposed.current) return; @@ -81,7 +80,7 @@ export const LayoutPetImageView: FC = props => else if(texture) { - setPetUrl(TextureUtils.generateImageUrl(texture)); + setPetUrl(await TextureUtils.generateImageUrl(texture)); setWidth(texture.width); setHeight(texture.height); } @@ -94,14 +93,17 @@ export const LayoutPetImageView: FC = props => if(imageResult) { - const image = imageResult.getImage(); - - if(image) + (async () => { - setPetUrl(image.src); - setWidth(image.width); - setHeight(image.height); - } + const image = await imageResult.getImage(); + + if(image) + { + setPetUrl(image.src); + setWidth(image.width); + setHeight(image.height); + } + })(); } }, [ figure, typeId, paletteId, petColor, customParts, posture, headOnly, direction ]); @@ -112,10 +114,10 @@ export const LayoutPetImageView: FC = props => return () => { isDisposed.current = true; - } + }; }, []); const url = `url('${ petUrl }')`; return ; -} +}; diff --git a/src/common/layout/LayoutPrizeProductImageView.tsx b/src/common/layout/LayoutPrizeProductImageView.tsx index 206c7a8..a83861e 100644 --- a/src/common/layout/LayoutPrizeProductImageView.tsx +++ b/src/common/layout/LayoutPrizeProductImageView.tsx @@ -19,12 +19,12 @@ export const LayoutPrizeProductImageView: FC = { case ProductTypeEnum.WALL: case ProductTypeEnum.FLOOR: - return + return ; case ProductTypeEnum.BADGE: - return + return ; case ProductTypeEnum.HABBO_CLUB: - return + return ; } return null; -} +}; diff --git a/src/common/layout/LayoutProgressBar.tsx b/src/common/layout/LayoutProgressBar.tsx index 8f82171..dbbd8f9 100644 --- a/src/common/layout/LayoutProgressBar.tsx +++ b/src/common/layout/LayoutProgressBar.tsx @@ -14,7 +14,7 @@ export const LayoutProgressBar: FC = props => const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'nitro-progress-bar', 'text-white' ]; + const newClassNames: string[] = [ 'border-[1px] border-[solid] border-[#fff] p-[2px] h-[20px] rounded-[.25rem] overflow-hidden bg-[#1E7295] ', 'text-white' ]; if(classNames.length) newClassNames.push(...classNames); @@ -22,11 +22,11 @@ export const LayoutProgressBar: FC = props => }, [ classNames ]); return ( - + { text && (text.length > 0) && - { text } } - + { text } } + { children } ); -} +}; diff --git a/src/common/layout/LayoutRarityLevelView.tsx b/src/common/layout/LayoutRarityLevelView.tsx index 2831374..f6711aa 100644 --- a/src/common/layout/LayoutRarityLevelView.tsx +++ b/src/common/layout/LayoutRarityLevelView.tsx @@ -1,5 +1,5 @@ import { FC, useMemo } from 'react'; -import { Base, BaseProps } from '..'; +import { Base, BaseProps } from '../Base'; interface LayoutRarityLevelViewProps extends BaseProps { @@ -25,4 +25,4 @@ export const LayoutRarityLevelView: FC = props => { children } ); -} +}; diff --git a/src/common/layout/LayoutRoomObjectImageView.tsx b/src/common/layout/LayoutRoomObjectImageView.tsx new file mode 100644 index 0000000..01328af --- /dev/null +++ b/src/common/layout/LayoutRoomObjectImageView.tsx @@ -0,0 +1,59 @@ +import { GetRoomEngine, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; +import { CSSProperties, FC, useEffect, useMemo, useState } from 'react'; +import { Base, BaseProps } from '../Base'; + +interface LayoutRoomObjectImageViewProps extends BaseProps +{ + roomId: number; + objectId: number; + category: number; + direction?: number; + scale?: number; +} + +export const LayoutRoomObjectImageView: FC = props => +{ + const { roomId = -1, objectId = 1, category = -1, direction = 2, 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 ]); + + useEffect(() => + { + const imageResult = GetRoomEngine().getRoomObjectImage(roomId, objectId, category, new Vector3d(direction * 45), 64, { + imageReady: async (id, texture, image) => setImageElement(await TextureUtils.generateImage(texture)), + imageFailed: null + }); + + // needs (roomObjectImage.data.width > 140) || (roomObjectImage.data.height > 200) scale 1 + + if(!imageResult) return; + + (async () => setImageElement(await TextureUtils.generateImage(imageResult.data)))(); + }, [ roomId, objectId, category, direction, scale ]); + + if(!imageElement) return null; + + return ; +}; diff --git a/src/common/layout/LayoutRoomPreviewerView.tsx b/src/common/layout/LayoutRoomPreviewerView.tsx index 69fbea8..c4c12e5 100644 --- a/src/common/layout/LayoutRoomPreviewerView.tsx +++ b/src/common/layout/LayoutRoomPreviewerView.tsx @@ -1,5 +1,5 @@ -import { ColorConverter, GetTicker, IRoomRenderingCanvas, RoomPreviewer, TextureUtils } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, ReactNode, useEffect, useRef, useState } from 'react'; +import { GetRenderer, GetTicker, NitroTicker, RoomPreviewer, TextureUtils } from '@nitrots/nitro-renderer'; +import { FC, MouseEvent, ReactNode, useEffect, useRef } from 'react'; export interface LayoutRoomPreviewerViewProps { @@ -11,7 +11,6 @@ export interface LayoutRoomPreviewerViewProps export const LayoutRoomPreviewerView: FC = props => { const { roomPreviewer = null, height = 0, children = null } = props; - const [ renderingCanvas, setRenderingCanvas ] = useState(null); const elementRef = useRef(); const onClick = (event: MouseEvent) => @@ -20,49 +19,38 @@ export const LayoutRoomPreviewerView: FC = props = if(event.shiftKey) roomPreviewer.changeRoomObjectDirection(); else roomPreviewer.changeRoomObjectState(); - } + }; useEffect(() => { - if(!roomPreviewer) return; + if(!elementRef) return; - const update = (time: number) => + const width = elementRef.current.parentElement.clientWidth; + const texture = TextureUtils.createRenderTexture(width, height); + + const update = async (ticker: NitroTicker) => { - if(!roomPreviewer || !renderingCanvas || !elementRef.current) return; - - roomPreviewer.updatePreviewRoomView(); + if(!roomPreviewer || !elementRef.current) return; + + const canvas = roomPreviewer.getRoomCanvas(width, height); + const renderingCanvas = roomPreviewer.getRenderingCanvas(); if(!renderingCanvas.canvasUpdated) return; - elementRef.current.style.backgroundImage = `url(${ TextureUtils.generateImageUrl(renderingCanvas.master) })`; - } + roomPreviewer.updatePreviewRoomView(); - if(!renderingCanvas) - { - if(elementRef.current && roomPreviewer) - { - const computed = document.defaultView.getComputedStyle(elementRef.current, null); + GetRenderer().render({ + target: texture, + container: canvas, + clear: true + }); - let backgroundColor = computed.backgroundColor; + const url = await TextureUtils.generateImageUrl(texture); - backgroundColor = ColorConverter.rgbStringToHex(backgroundColor); - backgroundColor = backgroundColor.replace('#', '0x'); + if(!elementRef || !elementRef.current) return; - roomPreviewer.backgroundColor = parseInt(backgroundColor, 16); - - const width = elementRef.current.parentElement.clientWidth; - - roomPreviewer.getRoomCanvas(width, height); - - const canvas = roomPreviewer.getRenderingCanvas(); - - setRenderingCanvas(canvas); - - canvas.canvasUpdated = true; - - update(-1); - } - } + elementRef.current.style.backgroundImage = `url(${ url })`; + }; GetTicker().add(update); @@ -74,19 +62,20 @@ export const LayoutRoomPreviewerView: FC = props = roomPreviewer.modifyRoomCanvas(width, height); - update(-1); + update(GetTicker()); }); - + resizeObserver.observe(elementRef.current); return () => { + GetTicker().remove(update); + resizeObserver.disconnect(); - GetTicker().remove(update); - } - - }, [ renderingCanvas, roomPreviewer, elementRef, height ]); + texture.destroy(true); + }; + }, [ roomPreviewer, elementRef, height ]); return (
@@ -94,4 +83,4 @@ export const LayoutRoomPreviewerView: FC = props = { children }
); -} +}; \ No newline at end of file diff --git a/src/common/layout/LayoutRoomThumbnailView.tsx b/src/common/layout/LayoutRoomThumbnailView.tsx index 46d884f..d6626ff 100644 --- a/src/common/layout/LayoutRoomThumbnailView.tsx +++ b/src/common/layout/LayoutRoomThumbnailView.tsx @@ -1,5 +1,5 @@ import { FC, useMemo } from 'react'; -import { GetConfiguration } from '../../api'; +import { GetConfigurationValue } from '../../api'; import { Base, BaseProps } from '../Base'; export interface LayoutRoomThumbnailViewProps extends BaseProps @@ -14,7 +14,7 @@ export const LayoutRoomThumbnailView: FC = props = const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'room-thumbnail', 'rounded', 'border' ]; + const newClassNames: string[] = [ 'relative w-[110px] h-[110px] bg-[url("@/assets/images/navigator/thumbnail_placeholder.png")] bg-no-repeat bg-center', 'rounded', '!border-[1px] !border-[solid] !border-[#283F5D]' ]; if(classNames.length) newClassNames.push(...classNames); @@ -23,15 +23,15 @@ export const LayoutRoomThumbnailView: FC = props = const getImageUrl = useMemo(() => { - if(customUrl && customUrl.length) return (GetConfiguration('image.library.url') + customUrl); + if(customUrl && customUrl.length) return (GetConfigurationValue('image.library.url') + customUrl); - return (GetConfiguration('thumbnails.url').replace('%thumbnail%', roomId.toString())); + return (GetConfigurationValue('thumbnails.url').replace('%thumbnail%', roomId.toString())); }, [ customUrl, roomId ]); return ( - + { getImageUrl && } { children } ); -} +}; diff --git a/src/common/layout/LayoutSearchSavesView.tsx b/src/common/layout/LayoutSearchSavesView.tsx deleted file mode 100644 index f2c1475..0000000 --- a/src/common/layout/LayoutSearchSavesView.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FC } from "react"; -import { FaBolt } from "react-icons/fa"; - -import { Base } from "../Base"; - -export interface LayoutSearchSavesViewProps { - title: string; - onSaveSearch?: () => void; - onClick?: () => void; -} - -export const LayoutSearchSavesView: FC = ( - props -) => { - const { title = null, onSaveSearch = null, onClick = null } = props; - - return ( - - - - ); -}; diff --git a/src/common/layout/LayoutTrophyView.tsx b/src/common/layout/LayoutTrophyView.tsx index 1320625..dd2c284 100644 --- a/src/common/layout/LayoutTrophyView.tsx +++ b/src/common/layout/LayoutTrophyView.tsx @@ -1,6 +1,9 @@ import { FC } from 'react'; -import { Base, Column, Flex, Text } from '..'; import { LocalizeText } from '../../api'; +import { Base } from '../Base'; +import { Column } from '../Column'; +import { Flex } from '../Flex'; +import { Text } from '../Text'; import { DraggableWindow } from '../draggable-window'; interface LayoutTrophyViewProps @@ -19,9 +22,9 @@ export const LayoutTrophyView: FC = props => return ( - - - + + + { LocalizeText('widget.furni.trophy.title') } @@ -29,11 +32,11 @@ export const LayoutTrophyView: FC = props => { customTitle } } { message } - + { date } { senderName } ); -} +}; diff --git a/src/common/layout/RoomCreatorGridItem.tsx b/src/common/layout/RoomCreatorGridItem.tsx deleted file mode 100644 index ffd6cf3..0000000 --- a/src/common/layout/RoomCreatorGridItem.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import { FC, useMemo } from "react"; -import { Base } from "../Base"; -import { Column, ColumnProps } from "../Column"; -import { LayoutItemCountView } from "./LayoutItemCountView"; -import { LayoutLimitedEditionStyledNumberView } from "./limited-edition"; - -export interface RoomCreatorGridItemProps extends ColumnProps { - itemImage?: string; - itemColor?: string; - itemActive?: boolean; - itemCount?: number; - itemCountMinimum?: number; - itemUniqueSoldout?: boolean; - itemUniqueNumber?: number; - itemUnseen?: boolean; - itemHighlight?: boolean; - disabled?: boolean; -} - -export const RoomCreatorGridItem: FC = (props) => { - const { - itemImage = undefined, - itemColor = undefined, - itemActive = false, - itemCount = 1, - itemCountMinimum = 1, - itemUniqueSoldout = false, - itemUniqueNumber = -2, - itemUnseen = false, - itemHighlight = false, - disabled = false, - center = true, - column = true, - style = {}, - classNames = [], - position = "relative", - overflow = "hidden", - children = null, - ...rest - } = props; - - const getClassNames = useMemo(() => { - const newClassNames: string[] = ["room-creator-grid-item"]; - - if (itemActive) newClassNames.push("active"); - - if (itemUniqueSoldout || itemUniqueNumber > 0) - newClassNames.push("unique-item"); - - if (itemUniqueSoldout) newClassNames.push("sold-out"); - - if (itemUnseen) newClassNames.push("unseen"); - - if (itemHighlight) newClassNames.push("has-highlight"); - - if (disabled) newClassNames.push("disabled"); - - if (itemImage === null) newClassNames.push("icon", "loading-icon"); - - if (classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ - itemActive, - itemUniqueSoldout, - itemUniqueNumber, - itemUnseen, - itemHighlight, - disabled, - itemImage, - classNames, - ]); - - const getStyle = useMemo(() => { - let newStyle = { ...style }; - - if (itemImage) newStyle.backgroundImage = `url(${itemImage})`; - - if (itemColor) newStyle.backgroundColor = itemColor; - - if (Object.keys(style).length) newStyle = { ...newStyle, ...style }; - - return newStyle; - }, [style, itemImage, itemColor]); - - return ( - - {itemCount > itemCountMinimum && ( - - )} - {itemUniqueNumber > 0 && ( - <> - -
- -
- - )} - {children} -
- ); -}; diff --git a/src/common/layout/UserProfileIconView.tsx b/src/common/layout/UserProfileIconView.tsx index 2a7dc2e..8898c70 100644 --- a/src/common/layout/UserProfileIconView.tsx +++ b/src/common/layout/UserProfileIconView.tsx @@ -5,15 +5,16 @@ import { Base, BaseProps } from '../Base'; export interface UserProfileIconViewProps extends BaseProps { userId?: number; + userName?: string; } export const UserProfileIconView: FC = props => { - const { userId = 0, classNames = [], pointer = true, children = null, ...rest } = props; + const { userId = 0, userName = null, classNames = [], pointer = true, children = null, ...rest } = props; const getClassNames = useMemo(() => { - const newClassNames: string[] = [ 'nitro-friends-spritesheet', 'icon-profile-sm' ]; + const newClassNames: string[] = [ 'bg-[url("@/assets/images/friends/friends-spritesheet.png")]', 'w-[13px] h-[11px] bg-[-51px_-91px]' ]; if(classNames.length) newClassNames.push(...classNames); @@ -21,8 +22,8 @@ export const UserProfileIconView: FC = props => }, [ classNames ]); return ( - GetUserProfile(userId) } { ... rest }> + GetUserProfile(userId) } { ...rest }> { children } ); -} +}; diff --git a/src/common/layout/index.ts b/src/common/layout/index.ts index d17d547..cbb0568 100644 --- a/src/common/layout/index.ts +++ b/src/common/layout/index.ts @@ -8,20 +8,17 @@ export * from './LayoutFurniImageView'; export * from './LayoutGiftTagView'; export * from './LayoutGridItem'; export * from './LayoutImage'; -export * from "./LayoutInputErrorView"; export * from './LayoutItemCountView'; export * from './LayoutLoadingSpinnerView'; export * from './LayoutMiniCameraView'; export * from './LayoutNotificationAlertView'; -export * from './LayoutNotificationCredits'; export * from './LayoutNotificationBubbleView'; export * from './LayoutPetImageView'; export * from './LayoutProgressBar'; export * from './LayoutRarityLevelView'; +export * from './LayoutRoomObjectImageView'; export * from './LayoutRoomPreviewerView'; export * from './LayoutRoomThumbnailView'; export * from './LayoutTrophyView'; -export * from "./LayoutSearchSavesView"; -export * from './limited-edition'; -export * from './RoomCreatorGridItem'; export * from './UserProfileIconView'; +export * from './limited-edition'; diff --git a/src/common/layout/limited-edition/LayoutLimitedEditionCompactPlateView.tsx b/src/common/layout/limited-edition/LayoutLimitedEditionCompactPlateView.tsx index ee41c6c..86fc977 100644 --- a/src/common/layout/limited-edition/LayoutLimitedEditionCompactPlateView.tsx +++ b/src/common/layout/limited-edition/LayoutLimitedEditionCompactPlateView.tsx @@ -32,4 +32,4 @@ export const LayoutLimitedEditionCompactPlateView: FC ); -} +}; diff --git a/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx b/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx index c83e230..5bcf776 100644 --- a/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx +++ b/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx @@ -2,7 +2,6 @@ import { FC, useMemo } from 'react'; import { LocalizeText } from '../../../api'; import { Base, BaseProps } from '../../Base'; import { Column } from '../../Column'; -import { Flex } from '../../Flex'; import { LayoutLimitedEditionStyledNumberView } from './LayoutLimitedEditionStyledNumberView'; interface LayoutLimitedEditionCompletePlateViewProps extends BaseProps @@ -27,15 +26,15 @@ 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 fe34ba4..992ad09 100644 --- a/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx +++ b/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx @@ -9,10 +9,10 @@ export const LayoutLimitedEditionStyledNumberView: FC { numbers.map((number, index) => ) } ); -} +}; diff --git a/src/common/transitions/TransitionAnimation.tsx b/src/common/transitions/TransitionAnimation.tsx index 6eefd2d..8e34849 100644 --- a/src/common/transitions/TransitionAnimation.tsx +++ b/src/common/transitions/TransitionAnimation.tsx @@ -37,7 +37,7 @@ export const TransitionAnimation: FC = props => return () => { if(timeoutData) clearTimeout(timeoutData); - } + }; }, [ inProp, timeout ]); return ( @@ -49,4 +49,4 @@ export const TransitionAnimation: FC = props => ) } ); -} +}; diff --git a/src/common/transitions/TransitionAnimationStyles.ts b/src/common/transitions/TransitionAnimationStyles.ts index 0d512d0..feebdcc 100644 --- a/src/common/transitions/TransitionAnimationStyles.ts +++ b/src/common/transitions/TransitionAnimationStyles.ts @@ -11,124 +11,124 @@ export function getTransitionAnimationStyle(type: string, transition: Transition switch(transition) { default: - return {} + return {}; case ENTERING: return { animationName: 'bounceIn', animationDuration: `${ timeout }ms` - } + }; case EXITING: return { animationName: 'bounceOut', animationDuration: `${ timeout }ms` - } + }; } case TransitionAnimationTypes.SLIDE_LEFT: switch(transition) { default: - return {} + return {}; case ENTERING: return { animationName: 'slideInLeft', animationDuration: `${ timeout }ms` - } + }; case EXITING: return { animationName: 'slideOutLeft', animationDuration: `${ timeout }ms` - } + }; } case TransitionAnimationTypes.SLIDE_RIGHT: switch(transition) { default: - return {} + return {}; case ENTERING: return { animationName: 'slideInRight', animationDuration: `${ timeout }ms` - } + }; case EXITING: return { animationName: 'slideOutRight', animationDuration: `${ timeout }ms` - } + }; } case TransitionAnimationTypes.FLIP_X: switch(transition) { default: - return {} + return {}; case ENTERING: return { animationName: 'flipInX', animationDuration: `${ timeout }ms` - } + }; case EXITING: return { animationName: 'flipOutX', animationDuration: `${ timeout }ms` - } + }; } case TransitionAnimationTypes.FADE_UP: switch(transition) { default: - return {} + return {}; case ENTERING: return { animationName: 'fadeInUp', animationDuration: `${ timeout }ms` - } + }; case EXITING: return { animationName: 'fadeOutDown', animationDuration: `${ timeout }ms` - } + }; } case TransitionAnimationTypes.FADE_IN: switch(transition) { default: - return {} + return {}; case ENTERING: return { animationName: 'fadeIn', animationDuration: `${ timeout }ms` - } + }; case EXITING: return { animationName: 'fadeOut', animationDuration: `${ timeout }ms` - } + }; } case TransitionAnimationTypes.FADE_DOWN: switch(transition) { default: - return {} + return {}; case ENTERING: return { animationName: 'fadeInDown', animationDuration: `${ timeout }ms` - } + }; case EXITING: return { animationName: 'fadeOutUp', animationDuration: `${ timeout }ms` - } + }; } case TransitionAnimationTypes.HEAD_SHAKE: switch(transition) { default: - return {} + return {}; case ENTERING: return { animationName: 'headShake', animationDuration: `${ timeout }ms` - } + }; } } diff --git a/src/common/types/ButtonSizeType.ts b/src/common/types/ButtonSizeType.ts index 0f9dd4a..a520c88 100644 --- a/src/common/types/ButtonSizeType.ts +++ b/src/common/types/ButtonSizeType.ts @@ -1 +1 @@ -export type ButtonSizeType = 'lg' | 'sm'; +export type ButtonSizeType = 'lg' | 'sm' | 'md'; diff --git a/src/common/utils/CreateTransitionToIcon.ts b/src/common/utils/CreateTransitionToIcon.ts index dbc5902..20e9885 100644 --- a/src/common/utils/CreateTransitionToIcon.ts +++ b/src/common/utils/CreateTransitionToIcon.ts @@ -1,5 +1,4 @@ -import { NitroToolbarAnimateIconEvent } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../../api'; +import { GetEventDispatcher, NitroToolbarAnimateIconEvent } from '@nitrots/nitro-renderer'; export const CreateTransitionToIcon = (image: HTMLImageElement, fromElement: HTMLElement, icon: string) => { @@ -10,5 +9,5 @@ export const CreateTransitionToIcon = (image: HTMLImageElement, fromElement: HTM event.iconName = icon; - GetRoomEngine().events.dispatchEvent(event); -} + GetEventDispatcher().dispatchEvent(event); +}; diff --git a/src/common/utils/FriendlyTimeView.tsx b/src/common/utils/FriendlyTimeView.tsx index 95af3a3..4a85c4a 100644 --- a/src/common/utils/FriendlyTimeView.tsx +++ b/src/common/utils/FriendlyTimeView.tsx @@ -1,6 +1,6 @@ -import { FriendlyTime } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useState } from 'react'; -import { Base, BaseProps } from '..'; +import { FriendlyTime } from '../../api'; +import { Base, BaseProps } from '../Base'; interface FriendlyTimeViewProps extends BaseProps { @@ -25,4 +25,4 @@ export const FriendlyTimeView: FC = props => const value = (Math.round(new Date().getSeconds()) - getStartSeconds); return { isShort ? FriendlyTime.shortFormat(value) : FriendlyTime.format(value) }; -} +}; diff --git a/src/components/MainView.tsx b/src/components/MainView.tsx new file mode 100644 index 0000000..99b728d --- /dev/null +++ b/src/components/MainView.tsx @@ -0,0 +1,117 @@ +import { AddLinkEventTracker, GetCommunication, HabboWebTools, ILinkEventTracker, RemoveLinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; +import { AnimatePresence, motion } from 'framer-motion'; +import { useNitroEvent } from '../hooks'; +import { AchievementsView } from './achievements/AchievementsView'; +import { AvatarEditorView } from './avatar-editor'; +import { CameraWidgetView } from './camera/CameraWidgetView'; +import { CampaignView } from './campaign/CampaignView'; +import { CatalogView } from './catalog/CatalogView'; +import { ChatHistoryView } from './chat-history/ChatHistoryView'; +import { FloorplanEditorView } from './floorplan-editor/FloorplanEditorView'; +import { FriendsView } from './friends/FriendsView'; +import { GameCenterView } from './game-center/GameCenterView'; +import { GroupsView } from './groups/GroupsView'; +import { GuideToolView } from './guide-tool/GuideToolView'; +import { HcCenterView } from './hc-center/HcCenterView'; +import { HelpView } from './help/HelpView'; +import { HotelView } from './hotel-view/HotelView'; +import { InventoryView } from './inventory/InventoryView'; +import { ModToolsView } from './mod-tools/ModToolsView'; +import { NavigatorView } from './navigator/NavigatorView'; +import { NitropediaView } from './nitropedia/NitropediaView'; +import { RightSideView } from './right-side/RightSideView'; +import { RoomView } from './room/RoomView'; +import { ToolbarView } from './toolbar/ToolbarView'; +import { UserProfileView } from './user-profile/UserProfileView'; +import { UserSettingsView } from './user-settings/UserSettingsView'; +import { WiredView } from './wired/WiredView'; + +export const MainView: FC<{}> = props => +{ + const [ isReady, setIsReady ] = useState(false); + const [ landingViewVisible, setLandingViewVisible ] = useState(true); + + useNitroEvent(RoomSessionEvent.CREATED, event => setLandingViewVisible(false)); + useNitroEvent(RoomSessionEvent.ENDED, event => setLandingViewVisible(event.openLandingView)); + + useEffect(() => + { + setIsReady(true); + + GetCommunication().connection.ready(); + }, []); + + useEffect(() => + { + const linkTracker: ILinkEventTracker = { + 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 'credits': + //HabboWebTools.openWebPageAndMinimizeClient(this._windowManager.getProperty(ExternalVariables.WEB_SHOP_RELATIVE_URL)); + break; + default: { + const name = parts[2]; + HabboWebTools.openHabblet(name); + } + } + } + return; + } + }, + eventUrlPrefix: 'habblet/' + }; + + AddLinkEventTracker(linkTracker); + + return () => RemoveLinkEventTracker(linkTracker); + }, []); + + return ( + <> + + { landingViewVisible && + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/src/components/achievements/views/AchievementBadgeView.tsx b/src/components/achievements/AchievementBadgeView.tsx similarity index 83% rename from src/components/achievements/views/AchievementBadgeView.tsx rename to src/components/achievements/AchievementBadgeView.tsx index 5b0d4f9..5365265 100644 --- a/src/components/achievements/views/AchievementBadgeView.tsx +++ b/src/components/achievements/AchievementBadgeView.tsx @@ -1,7 +1,7 @@ import { AchievementData } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { AchievementUtilities } from '../../../api'; -import { BaseProps, LayoutBadgeImageView } from '../../../common'; +import { AchievementUtilities } from '../../api'; +import { BaseProps, LayoutBadgeImageView } from '../../common'; interface AchievementBadgeViewProps extends BaseProps { @@ -16,4 +16,4 @@ export const AchievementBadgeView: FC = props => if(!achievement) return null; return ; -} +}; diff --git a/src/components/achievements/AchievementCategoryView.tsx b/src/components/achievements/AchievementCategoryView.tsx new file mode 100644 index 0000000..3a6f99f --- /dev/null +++ b/src/components/achievements/AchievementCategoryView.tsx @@ -0,0 +1,42 @@ +import { FC, useEffect } from 'react'; +import { AchievementCategory } from '../../api'; +import { Column } from '../../common'; +import { useAchievements } from '../../hooks'; +import { AchievementDetailsView } from './AchievementDetailsView'; +import { AchievementListView } from './achievement-list'; + +interface AchievementCategoryViewProps { + category: AchievementCategory; +} + +export const AchievementCategoryView: FC = ( + props, +) => +{ + const { category = null } = props; + const { selectedAchievement = null, setSelectedAchievementId = null } = + useAchievements(); + + useEffect(() => + { + if(!category) return; + + if(!selectedAchievement) + { + setSelectedAchievementId( + category?.achievements?.[0]?.achievementId, + ); + } + }, [category, selectedAchievement, setSelectedAchievementId]); + + if(!category) return null; + + return ( + + + {!!selectedAchievement && ( + + )} + + ); +}; diff --git a/src/components/achievements/views/AchievementDetailsView.tsx b/src/components/achievements/AchievementDetailsView.tsx similarity index 64% rename from src/components/achievements/views/AchievementDetailsView.tsx rename to src/components/achievements/AchievementDetailsView.tsx index b04fa18..a413883 100644 --- a/src/components/achievements/views/AchievementDetailsView.tsx +++ b/src/components/achievements/AchievementDetailsView.tsx @@ -1,7 +1,7 @@ import { AchievementData } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { AchievementUtilities, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../api'; -import { Column, Flex, LayoutCurrencyIcon, LayoutProgressBar, Text } from '../../../common'; +import { AchievementUtilities, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../api'; +import { Column, Flex, LayoutCurrencyIcon, LayoutProgressBar, Text } from '../../common'; import { AchievementBadgeView } from './AchievementBadgeView'; interface AchievementDetailsViewProps @@ -18,36 +18,36 @@ export const AchievementDetailsView: FC = props => return ( - + { LocalizeText('achievements.details.level', [ 'level', 'limit' ], [ AchievementUtilities.getAchievementLevel(achievement).toString(), achievement.levelCount.toString() ]) } - - +
+ { LocalizeBadgeName(AchievementUtilities.getAchievementBadgeCode(achievement)) } { LocalizeBadgeDescription(AchievementUtilities.getAchievementBadgeCode(achievement)) } - +
{ ((achievement.levelRewardPoints > 0) || (achievement.scoreLimit > 0)) && - +
{ (achievement.levelRewardPoints > 0) && - +
{ LocalizeText('achievements.details.reward') } - + { achievement.levelRewardPoints } - } +
} { (achievement.scoreLimit > 0) && - } - } + } +
}
- ) -} + ); +}; diff --git a/src/components/achievements/AchievementsView.scss b/src/components/achievements/AchievementsView.scss deleted file mode 100644 index 3fa61ac..0000000 --- a/src/components/achievements/AchievementsView.scss +++ /dev/null @@ -1,15 +0,0 @@ -.nitro-achievements { - width: $achievement-width; - height: $achievement-height; -} - -.nitro-achievements-back-arrow { - background: url('@/assets/images/achievements/back-arrow.png') no-repeat center; - width: 33px; - height: 34px; -} - -.nitro-achievements-badge-image { - width: 80px !important; - height: 80px !important; -} diff --git a/src/components/achievements/AchievementsView.tsx b/src/components/achievements/AchievementsView.tsx index 6c7940a..bdb80ae 100644 --- a/src/components/achievements/AchievementsView.tsx +++ b/src/components/achievements/AchievementsView.tsx @@ -1,15 +1,29 @@ -import { ILinkEventTracker } from '@nitrots/nitro-renderer'; -import { FC, useEffect, 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'; - -export const AchievementsView: FC<{}> = props => +import { - const [ isVisible, setIsVisible ] = useState(false); - const { achievementCategories = [], selectedCategoryCode = null, setSelectedCategoryCode = null, achievementScore = 0, getProgress = 0, getMaxProgress = 0, selectedCategory = null } = useAchievements(); + AddLinkEventTracker, + ILinkEventTracker, + RemoveLinkEventTracker, +} from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; +import { AchievementUtilities, LocalizeText } from '../../api'; +import { Column, LayoutImage, LayoutProgressBar, Text } from '../../common'; +import { useAchievements } from '../../hooks'; +import { NitroCard } from '../../layout'; +import { AchievementCategoryView } from './AchievementCategoryView'; +import { AchievementsCategoryListView } from './category-list'; + +export const AchievementsView: FC<{}> = (props) => +{ + const [isVisible, setIsVisible] = useState(false); + const { + achievementCategories = [], + selectedCategoryCode = null, + setSelectedCategoryCode = null, + achievementScore = 0, + getProgress = 0, + getMaxProgress = 0, + selectedCategory = null, + } = useAchievements(); useEffect(() => { @@ -17,9 +31,9 @@ export const AchievementsView: FC<{}> = props => linkReceived: (url: string) => { const parts = url.split('/'); - + if(parts.length < 2) return; - + switch(parts[1]) { case 'show': @@ -29,14 +43,14 @@ export const AchievementsView: FC<{}> = props => setIsVisible(false); return; case 'toggle': - setIsVisible(prevValue => !prevValue); + setIsVisible((prevValue) => !prevValue); return; } }, - eventUrlPrefix: 'achievements/' + eventUrlPrefix: 'achievements/', }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); @@ -44,29 +58,86 @@ export const AchievementsView: FC<{}> = props => if(!isVisible) return null; return ( - - setIsVisible(false) } /> - { selectedCategory && - - setSelectedCategoryCode(null) } className="nitro-achievements-back-arrow" /> - - { LocalizeText(`quests.${ selectedCategory.code }.name`) } - { LocalizeText('achievements.details.categoryprogress', [ 'progress', 'limit' ], [ selectedCategory.getProgress().toString(), selectedCategory.getMaxProgress().toString() ]) } + + setIsVisible(false)} + /> + {selectedCategory && ( +
+
setSelectedCategoryCode(null)} + /> + + + {LocalizeText( + `quests.${selectedCategory.code}.name` + )} + + + {LocalizeText( + 'achievements.details.categoryprogress', + ['progress', 'limit'], + [ + selectedCategory.getProgress().toString(), + selectedCategory + .getMaxProgress() + .toString(), + ] + )} + - - } - - { !selectedCategory && + +
+ )} + + {!selectedCategory && ( <> - - - { LocalizeText('achievements.categories.score', [ 'score' ], [ achievementScore.toString() ]) } - - - } - { selectedCategory && - } - - + +
+ + {LocalizeText( + 'achievements.categories.score', + ['score'], + [achievementScore.toString()] + )} + + +
+ + )} + {selectedCategory && ( + + )} +
+ ); }; diff --git a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx b/src/components/achievements/achievement-list/AchievementListItemView.tsx similarity index 87% rename from src/components/achievements/views/achievement-list/AchievementListItemView.tsx rename to src/components/achievements/achievement-list/AchievementListItemView.tsx index 9da632b..88386f3 100644 --- a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx +++ b/src/components/achievements/achievement-list/AchievementListItemView.tsx @@ -1,7 +1,7 @@ import { AchievementData } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { LayoutGridItem } from '../../../../common'; -import { useAchievements } from '../../../../hooks'; +import { LayoutGridItem } from '../../../common'; +import { useAchievements } from '../../../hooks'; import { AchievementBadgeView } from '../AchievementBadgeView'; interface AchievementListItemViewProps @@ -21,4 +21,4 @@ export const AchievementListItemView: FC = props = ); -} +}; diff --git a/src/components/achievements/views/achievement-list/AchievementListView.tsx b/src/components/achievements/achievement-list/AchievementListView.tsx similarity index 81% rename from src/components/achievements/views/achievement-list/AchievementListView.tsx rename to src/components/achievements/achievement-list/AchievementListView.tsx index f009581..0d46472 100644 --- a/src/components/achievements/views/achievement-list/AchievementListView.tsx +++ b/src/components/achievements/achievement-list/AchievementListView.tsx @@ -1,6 +1,6 @@ import { AchievementData } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { AutoGrid } from '../../../../common'; +import { AutoGrid } from '../../../common'; import { AchievementListItemView } from './AchievementListItemView'; interface AchievementListViewProps @@ -13,8 +13,8 @@ export const AchievementListView: FC = props => const { achievements = null } = props; return ( - + { achievements && (achievements.length > 0) && achievements.map((achievement, index) => ) } ); -} +}; diff --git a/src/components/achievements/views/achievement-list/index.ts b/src/components/achievements/achievement-list/index.ts similarity index 100% rename from src/components/achievements/views/achievement-list/index.ts rename to src/components/achievements/achievement-list/index.ts diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx b/src/components/achievements/category-list/AchievementsCategoryListItemView.tsx similarity index 68% rename from src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx rename to src/components/achievements/category-list/AchievementsCategoryListItemView.tsx index 91b96c6..f73c096 100644 --- a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx +++ b/src/components/achievements/category-list/AchievementsCategoryListItemView.tsx @@ -1,6 +1,6 @@ import { Dispatch, FC, SetStateAction } from 'react'; -import { AchievementUtilities, IAchievementCategory, LocalizeText } from '../../../../api'; -import { LayoutBackgroundImage, LayoutGridItem, Text } from '../../../../common'; +import { AchievementUtilities, IAchievementCategory, LocalizeText } from '../../../api'; +import { LayoutBackgroundImage, LayoutGridItem, Text } from '../../../common'; interface AchievementCategoryListItemViewProps { @@ -21,11 +21,11 @@ export const AchievementsCategoryListItemView: FC setSelectedCategoryCode(category.code) }> - { LocalizeText(`quests.${ category.code }.name`) } - - { progress } / { maxProgress } + setSelectedCategoryCode(category.code) }> + { LocalizeText(`quests.${ category.code }.name`) } + + { progress } / { maxProgress } ); -} +}; diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx b/src/components/achievements/category-list/AchievementsCategoryListView.tsx similarity index 80% rename from src/components/achievements/views/category-list/AchievementsCategoryListView.tsx rename to src/components/achievements/category-list/AchievementsCategoryListView.tsx index ca36296..c641f62 100644 --- a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx +++ b/src/components/achievements/category-list/AchievementsCategoryListView.tsx @@ -1,6 +1,6 @@ import { Dispatch, FC, SetStateAction } from 'react'; -import { IAchievementCategory } from '../../../../api'; -import { AutoGrid } from '../../../../common'; +import { IAchievementCategory } from '../../../api'; +import { AutoGrid } from '../../../common'; import { AchievementsCategoryListItemView } from './AchievementsCategoryListItemView'; interface AchievementsCategoryListViewProps @@ -13,10 +13,10 @@ interface AchievementsCategoryListViewProps export const AchievementsCategoryListView: FC = props => { const { categories = null, selectedCategoryCode = null, setSelectedCategoryCode = null } = props; - + return ( - - { categories && (categories.length > 0) && categories.map((category, index) => ) } + + { categories && (categories.length > 0) && categories.map((category, index) => ) } ); }; diff --git a/src/components/achievements/views/category-list/index.ts b/src/components/achievements/category-list/index.ts similarity index 100% rename from src/components/achievements/views/category-list/index.ts rename to src/components/achievements/category-list/index.ts diff --git a/src/components/achievements/views/index.ts b/src/components/achievements/index.ts similarity index 84% rename from src/components/achievements/views/index.ts rename to src/components/achievements/index.ts index 576c635..89f6737 100644 --- a/src/components/achievements/views/index.ts +++ b/src/components/achievements/index.ts @@ -1,5 +1,6 @@ -export * from './achievement-list'; export * from './AchievementBadgeView'; export * from './AchievementCategoryView'; export * from './AchievementDetailsView'; +export * from './AchievementsView'; +export * from './achievement-list'; export * from './category-list'; diff --git a/src/components/achievements/views/AchievementCategoryView.tsx b/src/components/achievements/views/AchievementCategoryView.tsx deleted file mode 100644 index 8774d20..0000000 --- a/src/components/achievements/views/AchievementCategoryView.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FC, useEffect } from 'react'; -import { AchievementCategory } from '../../../api'; -import { Column } from '../../../common'; -import { useAchievements } from '../../../hooks'; -import { AchievementListView } from './achievement-list'; -import { AchievementDetailsView } from './AchievementDetailsView'; - -interface AchievementCategoryViewProps -{ - category: AchievementCategory; -} - -export const AchievementCategoryView: FC = props => -{ - const { category = null } = props; - const { selectedAchievement = null, setSelectedAchievementId = null } = useAchievements(); - - useEffect(() => - { - if(!category) return; - - if(!selectedAchievement) - { - setSelectedAchievementId(category?.achievements?.[0]?.achievementId); - } - }, [ category, selectedAchievement, setSelectedAchievementId ]); - - if(!category) return null; - - return ( - - - { !!selectedAchievement && - } - - ); -} diff --git a/src/components/avatar-editor/AvatarEditorFigurePreviewView.tsx b/src/components/avatar-editor/AvatarEditorFigurePreviewView.tsx new file mode 100644 index 0000000..25bb609 --- /dev/null +++ b/src/components/avatar-editor/AvatarEditorFigurePreviewView.tsx @@ -0,0 +1,40 @@ +import { AvatarDirectionAngle } from '@nitrots/nitro-renderer'; +import { FC, useState } from 'react'; +import { LayoutAvatarImageView } from '../../common'; +import { useAvatarEditor } from '../../hooks'; +import { AvatarEditorIcon } from './AvatarEditorIcon'; + +const DEFAULT_DIRECTION: number = 4; + +export const AvatarEditorFigurePreviewView: FC<{}> = props => +{ + const [ direction, setDirection ] = useState(DEFAULT_DIRECTION); + const { getFigureString = null } = useAvatarEditor(); + + const rotateFigure = (newDirection: number) => + { + if(direction < AvatarDirectionAngle.MIN_DIRECTION) + { + newDirection = (AvatarDirectionAngle.MAX_DIRECTION + (direction + 1)); + } + + if(direction > AvatarDirectionAngle.MAX_DIRECTION) + { + newDirection = (direction - (AvatarDirectionAngle.MAX_DIRECTION + 1)); + } + + setDirection(newDirection); + }; + + return ( +
+ + +
+
+ rotateFigure(direction + 1) } /> + rotateFigure(direction - 1) } /> +
+
+ ); +}; diff --git a/src/components/avatar-editor/AvatarEditorIcon.tsx b/src/components/avatar-editor/AvatarEditorIcon.tsx new file mode 100644 index 0000000..f5623ed --- /dev/null +++ b/src/components/avatar-editor/AvatarEditorIcon.tsx @@ -0,0 +1,46 @@ +import { DetailedHTMLProps, HTMLAttributes, PropsWithChildren, forwardRef } from 'react'; +import { classNames } from '../../layout'; + +type AvatarIconType = 'male' | 'female' | 'clear' | 'sellable'; + +export const AvatarEditorIcon = forwardRef & DetailedHTMLProps, HTMLDivElement>>((props, ref) => +{ + const { icon = null, selected = false, className = null, ...rest } = props; + + /* + switch (icon) + { + case 'male': + + + break; + + case 'arrow-left': + + break; + + default: + //statements; + break; + + } +*/ + return ( +
+ ); +}); + +AvatarEditorIcon.displayName = 'AvatarEditorIcon'; diff --git a/src/components/avatar-editor/AvatarEditorModelView.tsx b/src/components/avatar-editor/AvatarEditorModelView.tsx new file mode 100644 index 0000000..53a49ab --- /dev/null +++ b/src/components/avatar-editor/AvatarEditorModelView.tsx @@ -0,0 +1,80 @@ +import { AvatarEditorFigureCategory, AvatarFigurePartType, FigureDataContainer } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; +import { IAvatarEditorCategory } from '../../api'; +import { useAvatarEditor } from '../../hooks'; +import { AvatarEditorIcon } from './AvatarEditorIcon'; +import { AvatarEditorFigureSetView } from './figure-set'; +import { AvatarEditorPaletteSetView } from './palette-set'; + +export const AvatarEditorModelView: FC<{ + name: string, + categories: IAvatarEditorCategory[] +}> = props => +{ + const { name = '', categories = [] } = props; + const [ didChange, setDidChange ] = useState(false); + const [ activeSetType, setActiveSetType ] = useState(''); + const { maxPaletteCount = 1, gender = null, setGender = null, selectedColorParts = null, getFirstSelectableColor = null, selectEditorColor = null } = useAvatarEditor(); + + const activeCategory = useMemo(() => + { + return categories.find(category => category.setType === activeSetType) ?? null; + }, [ categories, activeSetType ]); + + const selectSet = useCallback((setType: string) => + { + const selectedPalettes = selectedColorParts[setType]; + + if(!selectedPalettes || !selectedPalettes.length) selectEditorColor(setType, 0, getFirstSelectableColor(setType)); + + setActiveSetType(setType); + }, [ getFirstSelectableColor, selectEditorColor, selectedColorParts ]); + + useEffect(() => + { + if(!categories || !categories.length || !didChange) return; + + selectSet(categories[0]?.setType); + setDidChange(false); + }, [ categories, didChange, selectSet ]); + + useEffect(() => + { + setDidChange(true); + }, [ categories ]); + + if(!activeCategory) return null; + + return ( +
+
+ { (name === AvatarEditorFigureCategory.GENERIC) && + <> +
setGender(AvatarFigurePartType.MALE) }> + +
+
setGender(AvatarFigurePartType.FEMALE) }> + +
+ } + { (name !== AvatarEditorFigureCategory.GENERIC) && (categories.length > 0) && categories.map(category => + { + return ( +
selectSet(category.setType) }> + +
+ ); + }) } +
+
+ +
+
+ { (maxPaletteCount >= 1) && + } + { (maxPaletteCount === 2) && + } +
+
+ ); +}; diff --git a/src/components/avatar-editor/AvatarEditorView.scss b/src/components/avatar-editor/AvatarEditorView.scss deleted file mode 100644 index 160bd17..0000000 --- a/src/components/avatar-editor/AvatarEditorView.scss +++ /dev/null @@ -1,527 +0,0 @@ -.nitro-avatar-editor-spritesheet { - background: url('@/assets/images/avatareditor/avatar-editor-spritesheet.png') transparent no-repeat; - - &.arrow-left-icon { - width: 28px; - height: 21px; - background-position: -226px -131px; - } - - &.arrow-right-icon { - width: 28px; - height: 21px; - background-position: -226px -162px; - } - - &.ca-icon { - width: 25px; - height: 25px; - background-position: -226px -61px; - - &.selected, &:hover { - width: 25px; - height: 25px; - background-position: -226px -96px; - } - } - - &.cc-icon { - width: 31px; - height: 29px; - background-position: -145px -5px; - - &.selected, &:hover { - width: 31px; - height: 29px; - background-position: -145px -44px; - } - } - - &.ch-icon { - width: 29px; - height: 24px; - background-position: -186px -39px; - - &.selected, &:hover { - width: 29px; - height: 24px; - background-position: -186px -73px; - } - } - - &.clear-icon { - width: 27px; - height: 27px; - background-position: -145px -157px; - } - - &.cp-icon { - width: 30px; - height: 24px; - background-position: -145px -264px; - - &.selected, &:hover { - width: 30px; - height: 24px; - background-position: -186px -5px; - } - } - - - &.ea-icon { - width: 35px; - height: 16px; - background-position: -226px -193px; - - &.selected, &:hover { - width: 35px; - height: 16px; - background-position: -226px -219px; - } - } - - &.fa-icon { - width: 27px; - height: 20px; - background-position: -186px -137px; - - &.selected, &:hover { - width: 27px; - height: 20px; - background-position: -186px -107px; - } - } - - &.female-icon { - width: 18px; - height: 27px; - background-position: -186px -202px; - - &.selected, &:hover { - width: 18px; - height: 27px; - background-position: -186px -239px; - } - } - - &.ha-icon { - width: 25px; - height: 22px; - background-position: -226px -245px; - - &.selected, &:hover { - width: 25px; - height: 22px; - background-position: -226px -277px; - } - } - - &.he-icon { - width: 31px; - height: 27px; - background-position: -145px -83px; - - &.selected, &:hover { - width: 31px; - height: 27px; - background-position: -145px -120px; - } - } - - &.hr-icon { - width: 29px; - height: 25px; - background-position: -145px -194px; - - &.selected, &:hover { - width: 29px; - height: 25px; - background-position: -145px -229px; - } - } - - &.lg-icon { - width: 19px; - height: 20px; - background-position: -303px -45px; - - &.selected, &:hover { - width: 19px; - height: 20px; - background-position: -303px -75px; - } - } - - &.loading-icon { - width: 21px; - height: 25px; - background-position: -186px -167px; - } - - - &.male-icon { - width: 21px; - height: 21px; - background-position: -186px -276px; - - &.selected, &:hover { - width: 21px; - height: 21px; - background-position: -272px -5px; - } - } - - - &.sellable-icon { - width: 17px; - height: 15px; - background-position: -303px -105px; - } - - - &.sh-icon { - width: 37px; - height: 10px; - background-position: -303px -5px; - - &.selected, &:hover { - width: 37px; - height: 10px; - background-position: -303px -25px; - } - } - - - &.spotlight-icon { - width: 130px; - height: 305px; - background-position: -5px -5px; - } - - - &.wa-icon { - width: 36px; - height: 18px; - background-position: -226px -5px; - - &.selected, &:hover { - width: 36px; - height: 18px; - background-position: -226px -33px; - } - } -} - -.saved-outfits-title { - color: #a7a6a2; - font-weight: bold; -} - -.saved-outfit-container { - display: flex; - width: 100% !important; - height: 91.5%; - - .avatar-image { - width: 40px !important; - z-index: 4; - transform: scale(0.5); - } - - .avatar-figure { - margin-top: -46px; - margin-left: -9px; - image-rendering: auto !important; - } - - .nitro-avatar-editor-wardrobe-container { - background-color: #cacaca; - border-radius: 0.3rem; - border: solid 1px #000; - height: 386px; - width: 100%; - display: grid; - grid-template-columns: repeat(2, 1fr); - grid-gap: 10px; - padding: 10px 12px 10px 0; - overflow-y: auto; - } - - .avatar-container { - height: 50px; - border-radius: 0.3rem; - background-color: #a7a6a2; - width: 30px; - } - - .saved-outfit-button { - margin-top: -3px; - background-color: transparent; - border: none; - } -} - - -.nitro-avatar-editor-wardrobe-figure-preview { - border-image-source: url(@/assets/images/avatareditor/wardrobe_user_bg.png); - border-image-slice: 4 4 4 4 fill; - border-image-width: 4px 4px 4px 4px; - background-color: transparent; - overflow: hidden; - z-index: 1; - - .avatar-shadow { - position: absolute; - left: 0; - right: 0; - bottom: 25px; - width: 40px; - height: 20px; - margin: 0 auto; - border-radius: 100%; - background-color: rgba(0, 0, 0, 0.20); - z-index: 2; - } - - .button-container { - position: absolute; - bottom: 0; - z-index: 5; - } -} - -.nitro-avatar-editor { - height: $avatar-editor-height; - min-width: $avatar-editor-width; - min-height: $avatar-editor-height; - max-width: $avatar-editor-width; - max-height: $avatar-editor-height; - - .category-item { - height: 40px; - } - - .figure-preview-container { - position: relative; - height: 100%; - overflow: hidden; - z-index: 1; - - .arrow-container { - position: absolute; - width: 100%; - margin: 0 auto; - padding: 0 10px; - display: flex; - justify-content: space-between; - bottom: 50px; - z-index: 5; - - .arrow-left { - background-image: url(@/assets/images/avatareditor/rotation_arrow.png); - width: 44px; - height: 29px; - margin-left: auto; - margin-right: auto; - } - - .icon { - cursor: pointer; - } - } - - .avatar-image { - position: absolute; - left: 0; - right: 0; - bottom: 125px; - margin: 0 auto; - z-index: 4; - } - - .avatar-shadow { - position: absolute; - left: 0; - right: 0; - bottom: 88px; - width: 68px; - height: 34px; - margin: 0 auto; - background: url(@/assets/images/avatareditor/avatar_shadow.png); - z-index: 2; - } - } -} - -.nitro-avatar-editor.expanded { - max-width: $avatar-editor-width + 264px; - min-width: $avatar-editor-width + 164px; -} - - .choose-clothing { - width: 320px; - } - - .color-picker-frame { - border-image-source: url(@/assets/images/avatareditor/color_frame.png); - border-image-slice: 6 6 6 6 fill; - border-image-width: 6px 6px 6px 6px; - width: 14px; - height: 21px; - border-radius: 4px; - - &.active { - border-image-source: url(@/assets/images/avatareditor/color_frame_active.png); - height: 21px; - margin-top: -2px; - } - - &:hover { - border-image-source: url(@/assets/images/avatareditor/color_frame_active.png); - height: 21px; - margin-top: -2px; - } - } - - .hc-icon { - background-image: url(@/assets/images/avatareditor/hc_icon.png); - height: 9px; - width: 10px; - bottom: 2px; - left: 2px; - } - - .avatar-editor-tabs { - position: relative; - - .tab { - background-position-x: 0; - background-position-y: 0; - width: 34px; - height: 22px; - } - - .hd { - background: url(@/assets/images/wardrobe/hd.png) no-repeat center; - } - - .head { - background: url(@/assets/images/wardrobe/head.png) no-repeat center; - } - - .torso { - background: url(@/assets/images/wardrobe/torso.png) no-repeat center; - } - - .legs { - background: url(@/assets/images/wardrobe/legs.png) no-repeat center; - } - - .tab-wardrobe { - width: 40px; - height: 28px; - background-size: 38px 28px; - background-image: url(@/assets/images/wardrobe/wardrobe.png); - background-repeat: no-repeat; - background-position: center; - filter: contrast(1.2) brightness(1.05); - } - - - .nav-tabs .nav-link { - position: relative; - border-image-source: url(@/assets/images/boxes/card/tabs_avatareditor.png); - border-image-slice: 7 7 7 7 fill; - border-image-width: 7px 7px 7px 7px; - border-image-outset: 0px 0px 0px 0px; - border-image-repeat: repeat repeat; - margin-bottom: -2px; - margin-left: -2px; - - &:hover { - border-image-source: url(@/assets/images/boxes/card/tabs_active.png); - } - } - - - .nav-tabs .nav-link.active { - border-image-source: url(@/assets/images/boxes/card/tabs_active.png); - } - } - - .randomize-container { - bottom: 95px; - left: 330px; - z-index: 2; - } - - .randomize-icon { - background-image: url(@/assets/images/avatareditor/randomize_transparent.png); - height: 33px; - width: 39px; - - &:hover { - background-image: url(@/assets/images/avatareditor/randomize.png); - } - } - - .avatar-wardrobe { - border-image-source: url(@/assets/images/avatareditor/wardrobe_bg.png); - border-image-slice: 6 6 6 6 fill; - border-image-width: 6px 6px 6px 6px; - } - - .avatar-container { - padding: 3px; - } - - .avatar-parts { - border: none !important; - height: 42px; - width: 42px; - background-position: center; - background-repeat: no-repeat; - border-radius: 2rem !important; - overflow: visible !important; - background-color: transparent; - - &:hover { - box-shadow: 0 0 0 3px #dbdad5 !important; - background-color: #cecdc8 !important; - } - - &:active, - &.part-selected { - box-shadow: 0 0 0 3px #c5c3c0 !important; - background-color: #b1b1b1 !important; - } - } - -.avatar-parts-container { - height: 70%; - padding-left: 10px; -} - -.avatar-color-palette-container { - height: 30%; - width: 100%!important; - padding-left: 10px; -} - -.dual-palette { - display: flex !important; - flex-direction: row !important; -} - -.avatar-editor-palette-set-view { - padding-right: 15px !important; - flex-grow: 1; -} - -.clothing-container { - padding-right: 15px !important; -} - -.action-buttons { - gap: 5px; -} diff --git a/src/components/avatar-editor/AvatarEditorView.tsx b/src/components/avatar-editor/AvatarEditorView.tsx index fac7986..5dea113 100644 --- a/src/components/avatar-editor/AvatarEditorView.tsx +++ b/src/components/avatar-editor/AvatarEditorView.tsx @@ -1,12 +1,12 @@ -import { AvatarEditorFigureCategory, FigureSetIdsMessageEvent, GetWardrobeMessageComposer, IAvatarFigureContainer, ILinkEventTracker, SetClothingChangeDataMessageComposer, UserFigureComposer, UserWardrobePageEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { FaDice, FaTrash, FaUndo } from 'react-icons/fa'; -import { AddEventLinkTracker, AvatarEditorAction, AvatarEditorUtilities, BodyModel, FigureData, GetAvatarRenderManager, GetClubMemberLevel, GetConfiguration, GetSessionDataManager, HeadModel, IAvatarEditorCategoryModel, LegModel, LocalizeText, RemoveLinkEventTracker, SendMessageComposer, SetLocalStorage, TorsoModel, generateRandomFigure } from '../../api'; -import { Button, ButtonGroup, Column, Flex, 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'; +import { AddLinkEventTracker, AvatarEditorFigureCategory, GetSessionDataManager, ILinkEventTracker, RemoveLinkEventTracker, UserFigureComposer } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; +import { FaDice, FaRedo, FaTrash } from 'react-icons/fa'; +import { AvatarEditorAction, LocalizeText, SendMessageComposer } from '../../api'; +import { Button, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; +import { useAvatarEditor } from '../../hooks'; +import { AvatarEditorFigurePreviewView } from './AvatarEditorFigurePreviewView'; +import { AvatarEditorModelView } from './AvatarEditorModelView'; +import { AvatarEditorWardrobeView } from './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'; @@ -14,159 +14,27 @@ const DEFAULT_FEMALE_FIGURE: string = 'hr-515-33.hd-600-1.ch-635-70.lg-716-66-62 export const AvatarEditorView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); - const [ figures, setFigures ] = useState>(null); - const [ figureData, setFigureData ] = useState(null); - const [ categories, setCategories ] = useState>(null); - const [ activeCategory, setActiveCategory ] = useState(null); - const [ figureSetIds, setFigureSetIds ] = useState([]); - const [ boundFurnitureNames, setBoundFurnitureNames ] = useState([]); - const [ savedFigures, setSavedFigures ] = useState<[ IAvatarFigureContainer, string ][]>([]); - const [ isWardrobeVisible, setIsWardrobeVisible ] = useState(false); - const [ lastFigure, setLastFigure ] = useState(null); - const [ lastGender, setLastGender ] = useState(null); - const [ needsReset, setNeedsReset ] = useState(true); - const [ isInitalized, setIsInitalized ] = useState(false); - const [ genderFootballGate, setGenderFootballGate ] = useState(null); - const [ objectFootballGate, setObjectFootballGate ] = useState(null); - - const DEFAULT_MALE_FOOTBALL_GATE = JSON.parse(window.localStorage.getItem('nitro.look.footballgate.M')) || 'ch-3109-92-1408.lg-3116-82-1408.sh-3115-1408-1408'; - const DEFAULT_FEMALE_FOOTBALL_GATE = JSON.parse(window.localStorage.getItem('nitro.look.footballgate.F')) || 'ch-3112-1408-1408.lg-3116-71-1408.sh-3115-1408-1408'; - const maxWardrobeSlots = useMemo(() => GetConfiguration('avatar.wardrobe.max.slots', 10), []); - - const onClose = () => - { - setGenderFootballGate(null); - setObjectFootballGate(null); - setIsVisible(false); - } + const { setIsVisible: setEditorVisibility, avatarModels, activeModelKey, setActiveModelKey, loadAvatarData, getFigureStringWithFace, gender, figureSetIds = [], randomizeCurrentFigure = null, getFigureString = null } = useAvatarEditor(); - useMessageEvent(FigureSetIdsMessageEvent, event => - { - const parser = event.getParser(); - - setFigureSetIds(parser.figureSetIds); - setBoundFurnitureNames(parser.boundsFurnitureNames); - }); - - useMessageEvent(UserWardrobePageEvent, event => - { - const parser = event.getParser(); - const savedFigures: [ IAvatarFigureContainer, string ][] = []; - - let i = 0; - - while(i < maxWardrobeSlots) - { - savedFigures.push([ null, null ]); - - i++; - } - - for(let [ index, [ look, gender ] ] of parser.looks.entries()) - { - const container = GetAvatarRenderManager().createFigureContainer(look); - - savedFigures[(index - 1)] = [ container, gender ]; - } - - setSavedFigures(savedFigures); - }); - - const selectCategory = useCallback((name: string) => - { - if(!categories) return; - - setActiveCategory(categories.get(name)); - }, [ categories ]); - - const resetCategories = useCallback(() => - { - const categories = new Map(); - - if (!genderFootballGate) - { - categories.set(AvatarEditorFigureCategory.GENERIC, new BodyModel()); - categories.set(AvatarEditorFigureCategory.HEAD, new HeadModel()); - categories.set(AvatarEditorFigureCategory.TORSO, new TorsoModel()); - categories.set(AvatarEditorFigureCategory.LEGS, new LegModel()); - } - else - { - categories.set(AvatarEditorFigureCategory.TORSO, new TorsoModel()); - categories.set(AvatarEditorFigureCategory.LEGS, new LegModel()); - } - - setCategories(categories); - }, [ genderFootballGate ]); - - const setupFigures = useCallback(() => - { - const figures: Map = new Map(); - - const maleFigure = new FigureData(); - const femaleFigure = new FigureData(); - - maleFigure.loadAvatarData(DEFAULT_MALE_FIGURE, FigureData.MALE); - femaleFigure.loadAvatarData(DEFAULT_FEMALE_FIGURE, FigureData.FEMALE); - - figures.set(FigureData.MALE, maleFigure); - figures.set(FigureData.FEMALE, femaleFigure); - - setFigures(figures); - setFigureData(figures.get(FigureData.MALE)); - }, []); - - const loadAvatarInEditor = useCallback((figure: string, gender: string, reset: boolean = true) => - { - gender = AvatarEditorUtilities.getGender(gender); - - let newFigureData = figureData; - - if(gender !== newFigureData.gender) newFigureData = figures.get(gender); - - if(figure !== newFigureData.getFigureString()) newFigureData.loadAvatarData(figure, gender); - - if(newFigureData !== figureData) setFigureData(newFigureData); - - if(reset) - { - setLastFigure(figureData.getFigureString()); - setLastGender(figureData.gender); - } - }, [ figures, figureData ]); - - const processAction = useCallback((action: string) => + const processAction = (action: string) => { switch(action) { - case AvatarEditorAction.ACTION_CLEAR: - loadAvatarInEditor(figureData.getFigureStringWithFace(0, false), figureData.gender, false); - resetCategories(); - return; case AvatarEditorAction.ACTION_RESET: - loadAvatarInEditor(lastFigure, lastGender); - resetCategories(); + loadAvatarData(GetSessionDataManager().figure, GetSessionDataManager().gender); + return; + case AvatarEditorAction.ACTION_CLEAR: + loadAvatarData(getFigureStringWithFace(0, false), gender); return; case AvatarEditorAction.ACTION_RANDOMIZE: - const figure = generateRandomFigure(figureData, figureData.gender, GetClubMemberLevel(), figureSetIds, [ FigureData.FACE ]); - - loadAvatarInEditor(figure, figureData.gender, false); - resetCategories(); + randomizeCurrentFigure(); return; case AvatarEditorAction.ACTION_SAVE: - !genderFootballGate ? SendMessageComposer(new UserFigureComposer(figureData.gender, figureData.getFigureString())) : SendMessageComposer(new SetClothingChangeDataMessageComposer(objectFootballGate, genderFootballGate, figureData.getFigureString())); - SetLocalStorage(`nitro.look.footballgate.${ genderFootballGate }`, figureData.getFigureString()); - onClose(); + SendMessageComposer(new UserFigureComposer(gender, getFigureString)); + setIsVisible(false); return; } - }, [ loadAvatarInEditor, figureData, resetCategories, lastFigure, lastGender, figureSetIds, genderFootballGate, objectFootballGate ]) - - const setGender = useCallback((gender: string) => - { - gender = AvatarEditorUtilities.getGender(gender); - - setFigureData(figures.get(gender)); - }, [ figures ]); + }; useEffect(() => { @@ -174,9 +42,6 @@ export const AvatarEditorView: FC<{}> = props => linkReceived: (url: string) => { const parts = url.split('/'); - - setGenderFootballGate(parts[2] ? parts[2] : null); - setObjectFootballGate(parts[3] ? Number(parts[3]) : null); if(parts.length < 2) return; @@ -196,161 +61,62 @@ export const AvatarEditorView: FC<{}> = props => eventUrlPrefix: 'avatar-editor/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); useEffect(() => { - setSavedFigures(new Array(maxWardrobeSlots)); - }, [ maxWardrobeSlots ]); + setEditorVisibility(isVisible); + }, [ isVisible, setEditorVisibility ]); - useEffect(() => - { - SendMessageComposer(new GetWardrobeMessageComposer()); - }, []); - - useEffect(() => - { - if(!categories) return; - - selectCategory(!genderFootballGate ? AvatarEditorFigureCategory.GENERIC : AvatarEditorFigureCategory.TORSO); - }, [ categories, genderFootballGate, selectCategory ]); - - useEffect(() => - { - if(!figureData) return; - - AvatarEditorUtilities.CURRENT_FIGURE = figureData; - - resetCategories(); - - return () => AvatarEditorUtilities.CURRENT_FIGURE = null; - }, [ figureData, resetCategories ]); - - useEffect(() => - { - AvatarEditorUtilities.FIGURE_SET_IDS = figureSetIds; - AvatarEditorUtilities.BOUND_FURNITURE_NAMES = boundFurnitureNames; - - resetCategories(); - - return () => - { - AvatarEditorUtilities.FIGURE_SET_IDS = null; - AvatarEditorUtilities.BOUND_FURNITURE_NAMES = null; - } - }, [ figureSetIds, boundFurnitureNames, resetCategories ]); - - useEffect(() => - { - if(!isVisible) return; - - if(!figures) - { - setupFigures(); - - setIsInitalized(true); - - return; - } - }, [ isVisible, figures, setupFigures ]); - - useEffect(() => - { - if(!isVisible || !isInitalized || !needsReset) return; - - if (!genderFootballGate) loadAvatarInEditor(GetSessionDataManager().figure, GetSessionDataManager().gender); - if (genderFootballGate) loadAvatarInEditor(genderFootballGate === FigureData.MALE ? DEFAULT_MALE_FOOTBALL_GATE : DEFAULT_FEMALE_FOOTBALL_GATE, genderFootballGate); - setNeedsReset(false); - }, [ isVisible, isInitalized, needsReset, loadAvatarInEditor, genderFootballGate, DEFAULT_MALE_FOOTBALL_GATE, DEFAULT_FEMALE_FOOTBALL_GATE ]); - - useEffect(() => // This is so when you have the look editor open and you change the mode to Boy or Girl - { - if(!isVisible) return; - - return () => - { - setupFigures(); - setIsWardrobeVisible(false); - setNeedsReset(true); - } - }, [ isVisible, genderFootballGate, setupFigures ]); - - useEffect(() => - { - if(isVisible) return; - - return () => - { - setNeedsReset(true); - } - }, [ isVisible ]); - - if(!isVisible || !figureData) return null; - - const avatarEditorClasses = `nitro-avatar-editor no-resize ${ isWardrobeVisible ? 'expanded' : '' }`; + if(!isVisible) return null; return ( - - - - { categories && (categories.size > 0) && Array.from(categories.keys()).map(category => + + setIsVisible(false) } /> + + { Object.keys(avatarModels).map(modelKey => { - const isActive = (activeCategory && (activeCategory.name === category)); + const isActive = (activeModelKey === modelKey); return ( - selectCategory(category) }> -
+ setActiveModelKey(modelKey) }> + { LocalizeText(`avatareditor.category.${ modelKey }`) } ); }) } - { (!genderFootballGate) && - setIsWardrobeVisible(!isWardrobeVisible) }> -
-
- }
- - - { (activeCategory) && - - } - - - - - - - { (!genderFootballGate) && - - - - - - } - - - - { isWardrobeVisible && - - - - } - - + +
+ { ((activeModelKey.length > 0) && (activeModelKey !== AvatarEditorFigureCategory.WARDROBE)) && + } + { (activeModelKey === AvatarEditorFigureCategory.WARDROBE) && + } +
+
+ +
+
+ + + +
+ +
+
); -} +}; diff --git a/src/components/avatar-editor/AvatarEditorWardrobeView.tsx b/src/components/avatar-editor/AvatarEditorWardrobeView.tsx new file mode 100644 index 0000000..6981bd5 --- /dev/null +++ b/src/components/avatar-editor/AvatarEditorWardrobeView.tsx @@ -0,0 +1,61 @@ +import { GetAvatarRenderManager, IAvatarFigureContainer, SaveWardrobeOutfitMessageComposer } from '@nitrots/nitro-renderer'; +import { FC, useCallback } from 'react'; +import { GetClubMemberLevel, GetConfigurationValue, LocalizeText, SendMessageComposer } from '../../api'; +import { Button, LayoutAvatarImageView, LayoutCurrencyIcon } from '../../common'; +import { useAvatarEditor } from '../../hooks'; +import { InfiniteGrid } from '../../layout'; + +export const AvatarEditorWardrobeView: FC<{}> = props => +{ + const { savedFigures = [], setSavedFigures = null, loadAvatarData = null, getFigureString = null, gender = null } = useAvatarEditor(); + + const hcDisabled = GetConfigurationValue('hc.disabled', false); + + const wearFigureAtIndex = useCallback((index: number) => + { + if((index >= savedFigures.length) || (index < 0)) return; + + const [ figure, gender ] = savedFigures[index]; + + loadAvatarData(figure.getFigureString(), gender); + }, [ savedFigures, loadAvatarData ]); + + const saveFigureAtWardrobeIndex = useCallback((index: number) => + { + if((index >= savedFigures.length) || (index < 0)) return; + + const newFigures = [ ...savedFigures ]; + + const figure = getFigureString; + + newFigures[index] = [ GetAvatarRenderManager().createFigureContainer(figure), gender ]; + + setSavedFigures(newFigures); + SendMessageComposer(new SaveWardrobeOutfitMessageComposer((index + 1), figure, gender)); + }, [ getFigureString, gender, savedFigures, setSavedFigures ]); + + return ( + + { + const [ figureContainer, gender ] = item; + + let clubLevel = 0; + + if(figureContainer) clubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender); + + return ( + + { figureContainer && + } +
+ { !hcDisabled && (clubLevel > 0) && } +
+ + { figureContainer && + } +
+ + ); + } } items={ savedFigures } overscan={ 5 } /> + ); +}; diff --git a/src/components/avatar-editor/figure-set/AvatarEditorFigureSetItemView.tsx b/src/components/avatar-editor/figure-set/AvatarEditorFigureSetItemView.tsx new file mode 100644 index 0000000..4126fa3 --- /dev/null +++ b/src/components/avatar-editor/figure-set/AvatarEditorFigureSetItemView.tsx @@ -0,0 +1,56 @@ +import { AvatarFigurePartType } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; +import { AvatarEditorThumbnailsHelper, GetConfigurationValue, IAvatarEditorCategoryPartItem } from '../../../api'; +import { LayoutCurrencyIcon, LayoutGridItemProps } from '../../../common'; +import { useAvatarEditor } from '../../../hooks'; +import { InfiniteGrid } from '../../../layout'; +import { AvatarEditorIcon } from '../AvatarEditorIcon'; + +export const AvatarEditorFigureSetItemView: FC<{ + setType: string; + partItem: IAvatarEditorCategoryPartItem; + isSelected: boolean; + width?: string; +} & LayoutGridItemProps> = props => +{ + const { setType = null, partItem = null, isSelected = false, width = '100%', ...rest } = props; + const [ assetUrl, setAssetUrl ] = useState(''); + const { selectedColorParts = null, getFigureStringWithFace = null } = useAvatarEditor(); + + const isHC = !GetConfigurationValue('hc.disabled', false) && ((partItem.partSet?.clubLevel ?? 0) > 0); + + useEffect(() => + { + if(!setType || !setType.length || !partItem) return; + + const loadImage = async () => + { + const isHC = !GetConfigurationValue('hc.disabled', false) && ((partItem.partSet?.clubLevel ?? 0) > 0); + + let url: string = null; + + if(setType === AvatarFigurePartType.HEAD) + { + url = await AvatarEditorThumbnailsHelper.buildForFace(getFigureStringWithFace(partItem.id), isHC); + } + else + { + url = await AvatarEditorThumbnailsHelper.build(setType, partItem, partItem.usesColor, selectedColorParts[setType] ?? null, isHC); + } + + if(url && url.length) setAssetUrl(url); + }; + + loadImage(); + }, [ setType, partItem, selectedColorParts, getFigureStringWithFace ]); + + if(!partItem) return null; + + return ( + + { !partItem.isClear && isHC && } + { partItem.isClear && } + { !partItem.isClear && partItem.partSet.isSellable && } + + ); +}; diff --git a/src/components/avatar-editor/figure-set/AvatarEditorFigureSetView.tsx b/src/components/avatar-editor/figure-set/AvatarEditorFigureSetView.tsx new file mode 100644 index 0000000..9a5b543 --- /dev/null +++ b/src/components/avatar-editor/figure-set/AvatarEditorFigureSetView.tsx @@ -0,0 +1,41 @@ +import { FC } from 'react'; +import { IAvatarEditorCategory, IAvatarEditorCategoryPartItem } from '../../../api'; +import { useAvatarEditor } from '../../../hooks'; +import { InfiniteGrid } from '../../../layout'; +import { AvatarEditorFigureSetItemView } from './AvatarEditorFigureSetItemView'; + +export const AvatarEditorFigureSetView: FC<{ + category: IAvatarEditorCategory; + columnCount: number; +}> = props => +{ + const { category = null, columnCount = 3 } = props; + const { selectedParts = null, selectEditorPart } = useAvatarEditor(); + + const isPartItemSelected = (partItem: IAvatarEditorCategoryPartItem) => + { + if(!category || !category.setType || !selectedParts) return false; + + if(!selectedParts[category.setType]) + { + if(partItem.isClear) return true; + + return false; + } + + const partId = selectedParts[category.setType]; + + return (partId === partItem.id); + }; + + return ( + columnCount={ columnCount } itemRender={ (item: IAvatarEditorCategoryPartItem) => + { + if(!item) return null; + + return ( + selectEditorPart(category.setType, item.partSet?.id ?? -1) } /> + ); + } } items={ category.partItems } overscan={ columnCount } /> + ); +}; diff --git a/src/components/avatar-editor/figure-set/index.ts b/src/components/avatar-editor/figure-set/index.ts new file mode 100644 index 0000000..0c5880b --- /dev/null +++ b/src/components/avatar-editor/figure-set/index.ts @@ -0,0 +1,2 @@ +export * from './AvatarEditorFigureSetItemView'; +export * from './AvatarEditorFigureSetView'; diff --git a/src/components/avatar-editor/index.ts b/src/components/avatar-editor/index.ts new file mode 100644 index 0000000..5ae66e5 --- /dev/null +++ b/src/components/avatar-editor/index.ts @@ -0,0 +1,7 @@ +export * from './AvatarEditorFigurePreviewView'; +export * from './AvatarEditorIcon'; +export * from './AvatarEditorModelView'; +export * from './AvatarEditorView'; +export * from './AvatarEditorWardrobeView'; +export * from './figure-set'; +export * from './palette-set'; diff --git a/src/components/avatar-editor/palette-set/AvatarEditorPaletteSetItemView.tsx b/src/components/avatar-editor/palette-set/AvatarEditorPaletteSetItemView.tsx new file mode 100644 index 0000000..8a520bc --- /dev/null +++ b/src/components/avatar-editor/palette-set/AvatarEditorPaletteSetItemView.tsx @@ -0,0 +1,25 @@ +import { ColorConverter, IPartColor } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; +import { GetConfigurationValue } from '../../../api'; +import { LayoutCurrencyIcon, LayoutGridItemProps } from '../../../common'; +import { InfiniteGrid } from '../../../layout'; + +export const AvatarEditorPaletteSetItem: FC<{ + setType: string; + partColor: IPartColor; + isSelected: boolean; + width?: string; +} & LayoutGridItemProps> = props => +{ + const { setType = null, partColor = null, isSelected = false, width = '100%', ...rest } = props; + + if(!partColor) return null; + + const isHC = !GetConfigurationValue('hc.disabled', false) && (partColor.clubLevel > 0); + + return ( + + { isHC && } + + ); +}; diff --git a/src/components/avatar-editor/palette-set/AvatarEditorPaletteSetView.tsx b/src/components/avatar-editor/palette-set/AvatarEditorPaletteSetView.tsx new file mode 100644 index 0000000..d40c8d1 --- /dev/null +++ b/src/components/avatar-editor/palette-set/AvatarEditorPaletteSetView.tsx @@ -0,0 +1,36 @@ +import { IPartColor } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; +import { IAvatarEditorCategory } from '../../../api'; +import { useAvatarEditor } from '../../../hooks'; +import { InfiniteGrid } from '../../../layout'; +import { AvatarEditorPaletteSetItem } from './AvatarEditorPaletteSetItemView'; + +export const AvatarEditorPaletteSetView: FC<{ + category: IAvatarEditorCategory; + paletteIndex: number; + columnCount: number; +}> = props => +{ + const { category = null, paletteIndex = -1, columnCount = 3 } = props; + const { selectedColorParts = null, selectEditorColor = null } = useAvatarEditor(); + + const isPartColorSelected = (partColor: IPartColor) => + { + if(!category || !category.setType || !selectedColorParts || !selectedColorParts[category.setType] || !selectedColorParts[category.setType][paletteIndex]) return false; + + const selectedColorPart = selectedColorParts[category.setType][paletteIndex]; + + return (selectedColorPart.id === partColor.id); + }; + + return ( + columnCount={ columnCount } itemRender={ (item: IPartColor) => + { + if(!item) return null; + + return ( + selectEditorColor(category.setType, paletteIndex, item.id) } /> + ); + } } items={ category.colorItems[paletteIndex] } overscan={ columnCount } /> + ); +}; diff --git a/src/components/avatar-editor/palette-set/index.ts b/src/components/avatar-editor/palette-set/index.ts new file mode 100644 index 0000000..977e5b9 --- /dev/null +++ b/src/components/avatar-editor/palette-set/index.ts @@ -0,0 +1,2 @@ +export * from './AvatarEditorPaletteSetItemView'; +export * from './AvatarEditorPaletteSetView'; diff --git a/src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx b/src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx deleted file mode 100644 index 8bde241..0000000 --- a/src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { AvatarDirectionAngle } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { FigureData } from '../../../api'; -import { Base, Column, LayoutAvatarImageView } from '../../../common'; -import { AvatarEditorIcon } from './AvatarEditorIcon'; - -export interface AvatarEditorFigurePreviewViewProps -{ - figureData: FigureData; -} - -export const AvatarEditorFigurePreviewView: FC = props => -{ - const { figureData = null } = props; - const [ updateId, setUpdateId ] = useState(-1); - - const rotateFigure = (direction: number) => - { - if(direction < AvatarDirectionAngle.MIN_DIRECTION) - { - direction = (AvatarDirectionAngle.MAX_DIRECTION + (direction + 1)); - } - - if(direction > AvatarDirectionAngle.MAX_DIRECTION) - { - direction = (direction - (AvatarDirectionAngle.MAX_DIRECTION + 1)); - } - - figureData.direction = direction; - } - - useEffect(() => - { - if(!figureData) return; - - figureData.notify = () => setUpdateId(prevValue => (prevValue + 1)); - - return () => - { - figureData.notify = null; - } - }, [ figureData ] ); - - return ( - - - - - rotateFigure(figureData.direction + 1) } /> - - - ); -} diff --git a/src/components/avatar-editor/views/AvatarEditorIcon.tsx b/src/components/avatar-editor/views/AvatarEditorIcon.tsx deleted file mode 100644 index a05baa1..0000000 --- a/src/components/avatar-editor/views/AvatarEditorIcon.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { FC, useMemo } from 'react'; -import { Base, BaseProps } from '../../../common'; - -type AvatarIconType = 'male' | 'female' | 'clear' | 'sellable' | string; - -export interface AvatarEditorIconProps extends BaseProps -{ - icon: AvatarIconType; - selected?: boolean; -} - -export const AvatarEditorIcon: FC = props => -{ - const { icon = null, selected = false, classNames = [], children = null, ...rest } = props; - - const getClassNames = useMemo(() => - { - const newClassNames: string[] = [ 'nitro-avatar-editor-spritesheet' ]; - - if(icon && icon.length) newClassNames.push(icon + '-icon'); - - if(selected) newClassNames.push('selected'); - - if(classNames.length) newClassNames.push(...classNames); - - return newClassNames; - }, [ icon, selected, classNames ]); - - return -} diff --git a/src/components/avatar-editor/views/AvatarEditorModelView.tsx b/src/components/avatar-editor/views/AvatarEditorModelView.tsx deleted file mode 100644 index e88512e..0000000 --- a/src/components/avatar-editor/views/AvatarEditorModelView.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { CategoryData, FigureData, IAvatarEditorCategoryModel, LocalizeText } from '../../../api'; -import { Column, Flex, Grid, Text } from '../../../common'; -import { AvatarEditorIcon } from './AvatarEditorIcon'; -import { AvatarEditorFigureSetView } from './figure-set/AvatarEditorFigureSetView'; -import { AvatarEditorPaletteSetView } from './palette-set/AvatarEditorPaletteSetView'; - -const CATEGORY_FOOTBALL_GATE = [ 'ch', 'cp', 'lg', 'sh' ]; - -export interface AvatarEditorModelViewProps -{ - model: IAvatarEditorCategoryModel; - gender: string; - setGender: Dispatch>; -} - -export const AvatarEditorModelView: FC = props => -{ - const { model = null, gender = null, isFromFootballGate = false, setGender = null } = props; - const [ activeCategory, setActiveCategory ] = useState(null); - const [ maxPaletteCount, setMaxPaletteCount ] = useState(1); - - const selectCategory = useCallback((name: string) => - { - const category = model.categories.get(name); - - if(!category) return; - - category.init(); - - setActiveCategory(category); - - for(const part of category.parts) - { - if(!part || !part.isSelected) continue; - - setMaxPaletteCount(part.maxColorIndex || 1); - - break; - } - }, [ model ]); - - useEffect(() => - { - model.init(); - - for(const name of model.categories.keys()) - { - selectCategory(name); - - break; - } - }, [ model, selectCategory ]); - - if(!model || !activeCategory) return null; - - return ( - - - - { model.canSetGender && - <> - setGender(FigureData.MALE) }> - - { LocalizeText('avatareditor.generic.boy') } - - setGender(FigureData.FEMALE) }> - - { LocalizeText('avatareditor.generic.girl') } - - } - { !model.canSetGender && model.categories && (model.categories.size > 0) && Array.from(model.categories.keys()).map(name => - { - const category = model.categories.get(name); - - return ( -
- selectCategory(name) }> - { (isFromFootballGate && CATEGORY_FOOTBALL_GATE.includes(category.name)) && - - } - { (!isFromFootballGate) && - - } - -
- ); - }) } -
- - - - - { (maxPaletteCount >= 1) && - } - { (maxPaletteCount === 2) && - } - -
-
- ); -} diff --git a/src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx b/src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx deleted file mode 100644 index 4bd3f1b..0000000 --- a/src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import { HabboClubLevelEnum, IAvatarFigureContainer, SaveWardrobeOutfitMessageComposer } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, SetStateAction, useCallback, useMemo } from 'react'; -import { MdKeyboardArrowLeft, MdKeyboardArrowRight } from 'react-icons/md'; -import { CreateLinkEvent, FigureData, GetAvatarRenderManager, GetClubMemberLevel, GetConfiguration, GetSessionDataManager, LocalizeText, SendMessageComposer } from '../../../api'; -import { Flex, LayoutAvatarImageView, LayoutCurrencyIcon } from '../../../common'; -export interface AvatarEditorWardrobeViewProps -{ - figureData: FigureData; - savedFigures: [ IAvatarFigureContainer, string ][]; - setSavedFigures: Dispatch>; - loadAvatarInEditor: (figure: string, gender: string, reset?: boolean) => void; -} - -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; - - const [ figure, gender ] = savedFigures[index]; - - loadAvatarInEditor(figure.getFigureString(), gender); - }, [ savedFigures, loadAvatarInEditor ]); - - const saveFigureAtWardrobeIndex = useCallback((index: number) => - { - if(!figureData || (index >= savedFigures.length) || (index < 0)) return; - - if (GetSessionDataManager().clubLevel === HabboClubLevelEnum.NO_CLUB) return CreateLinkEvent('habboUI/open/hccenter'); - - const newFigures = [ ...savedFigures ]; - - const figure = figureData.getFigureString(); - const gender = figureData.gender; - - newFigures[index] = [ GetAvatarRenderManager().createFigureContainer(figure), gender ]; - - setSavedFigures(newFigures); - SendMessageComposer(new SaveWardrobeOutfitMessageComposer((index + 1), figure, gender)); - }, [ figureData, savedFigures, setSavedFigures ]); - - const getClubLevel = useCallback(() => - { - let highestClubLevel = 0; - - savedFigures.forEach(([ figureContainer, gender ]) => - { - if (figureContainer) - { - const clubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender); - highestClubLevel = Math.max(highestClubLevel, clubLevel); - } - }); - - return highestClubLevel; - }, [ savedFigures ]); - - const figures = useMemo(() => - { - if(!savedFigures || !savedFigures.length) return []; - - const items: JSX.Element[] = []; - - savedFigures.forEach(([ figureContainer, gender ], index) => - { - let clubLevel = 0; - - if(figureContainer) clubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender); - - items.push( - - - - { figureContainer && ( - - ) } - -
- { figureContainer && ( - - ) } -
-
- ); - }); - - return items; - }, [ savedFigures, saveFigureAtWardrobeIndex, wearFigureAtIndex ]); - - return ( -
-
- - { LocalizeText('avatareditor.wardrobe.title') } - - - { !hcDisabled && getClubLevel() > 0 && ( - - ) } - -
-
-
{ figures }
-
-
- ); - -} diff --git a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx deleted file mode 100644 index e960413..0000000 --- a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { AvatarEditorGridPartItem, GetConfiguration } from '../../../../api'; -import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common'; -import { AvatarEditorIcon } from '../AvatarEditorIcon'; - -export interface AvatarEditorFigureSetItemViewProps extends LayoutGridItemProps -{ - partItem: AvatarEditorGridPartItem; -} - -export const AvatarEditorFigureSetItemView: FC = props => -{ - const { partItem = null, children = null, ...rest } = props; - const [ updateId, setUpdateId ] = useState(-1); - - const hcDisabled = GetConfiguration('hc.disabled', false); - - useEffect(() => - { - const rerender = () => setUpdateId(prevValue => (prevValue + 1)); - - partItem.notify = rerender; - - return () => partItem.notify = null; - }, [ partItem ]); - - return ( -
- - { !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 deleted file mode 100644 index f6eb6b1..0000000 --- a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetView.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { HabboClubLevelEnum } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, SetStateAction, useCallback, useEffect, useRef } from 'react'; -import { AvatarEditorGridPartItem, CategoryData, CreateLinkEvent, GetSessionDataManager, IAvatarEditorCategoryModel } from '../../../../api'; -import { AutoGrid } from '../../../../common'; -import { AvatarEditorFigureSetItemView } from './AvatarEditorFigureSetItemView'; - -const TSHIRT_FOOTBALL_GATE = [ 3111, 3110, 3109, 3030, 3114, 266, 265, 262, 3113, 3112, 691, 690, 667 ]; -const NUMBER_BEHIND_FOOTBALL_GATE = [ 3128, 3127, 3126, 3125, 3124, 3123, 3122, 3121, 3120, 3119 ]; -const PANTS_FOOTBALL_GATE = [ 3116, 281, 275, 715, 700, 696, 3006 ]; -const SHOES_FOOTBALL_GATE = [ 3115, 3068, 906 ]; - -export interface AvatarEditorFigureSetViewProps -{ - model: IAvatarEditorCategoryModel; - category: CategoryData; - setMaxPaletteCount: Dispatch>; -} - -export const AvatarEditorFigureSetView: FC = props => -{ - const { model = null, category = null, isFromFootballGate = false, setMaxPaletteCount = null } = props; - const elementRef = useRef(null); - - const selectPart = useCallback((item: AvatarEditorGridPartItem) => - { - const index = category.parts.indexOf(item); - - if(index === -1) return; - - if (item.isHC && GetSessionDataManager().clubLevel === HabboClubLevelEnum.NO_CLUB) return CreateLinkEvent('habboUI/open/hccenter'); - - model.selectPart(category.name, index); - - const partItem = category.getCurrentPart(); - - setMaxPaletteCount(partItem.maxColorIndex || 1); - }, [ model, category, setMaxPaletteCount ]); - - useEffect(() => - { - if(!model || !category || !elementRef || !elementRef.current) return; - - elementRef.current.scrollTop = 0; - }, [ model, category ]); - - return ( - - { (category.parts.length > 0) && category.parts.map(item => - (!isFromFootballGate || (isFromFootballGate && TSHIRT_FOOTBALL_GATE.includes(item.id) || NUMBER_BEHIND_FOOTBALL_GATE.includes(item.id) || PANTS_FOOTBALL_GATE.includes(item.id) || SHOES_FOOTBALL_GATE.includes(item.id))) && - selectPart(item) } />) - } - - ); -} diff --git a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx deleted file mode 100644 index 610995d..0000000 --- a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FC, useEffect, useState } from 'react'; -import { AvatarEditorGridColorItem, GetConfiguration } from '../../../../api'; -import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common'; -import { LayoutGridColorPickerItem } from '../../../../common/layout/LayoutGridColorPickerItem'; - -export interface AvatarEditorPaletteSetItemProps extends LayoutGridItemProps -{ - colorItem: AvatarEditorGridColorItem; -} - -export const AvatarEditorPaletteSetItem: FC = props => -{ - const { colorItem = null, children = null, ...rest } = props; - const [ updateId, setUpdateId ] = useState(-1); - - const hcDisabled = GetConfiguration('hc.disabled', false); - - useEffect(() => - { - const rerender = () => setUpdateId(prevValue => (prevValue + 1)); - - colorItem.notify = rerender; - - return () => colorItem.notify = null; - }, [ colorItem ]); - - return ( - - { !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 deleted file mode 100644 index 3fe0ff9..0000000 --- a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetView.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { HabboClubLevelEnum } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useRef } from 'react'; -import { AvatarEditorGridColorItem, CategoryData, CreateLinkEvent, GetSessionDataManager, IAvatarEditorCategoryModel } from '../../../../api'; -import { AutoGrid } from '../../../../common'; -import { AvatarEditorPaletteSetItem } from './AvatarEditorPaletteSetItemView'; - -export interface AvatarEditorPaletteSetViewProps -{ - model: IAvatarEditorCategoryModel; - category: CategoryData; - paletteSet: AvatarEditorGridColorItem[]; - paletteIndex: number; -} - -export const AvatarEditorPaletteSetView: FC = props => -{ - const { model = null, category = null, paletteSet = [], paletteIndex = -1 } = props; - const elementRef = useRef(null); - - const selectColor = useCallback((item: AvatarEditorGridColorItem) => - { - const index = paletteSet.indexOf(item); - - if(index === -1) return; - - if (item.isHC && GetSessionDataManager().clubLevel === HabboClubLevelEnum.NO_CLUB) return CreateLinkEvent('habboUI/open/hccenter'); - - model.selectColor(category.name, index, paletteIndex); - }, [ model, category, paletteSet, paletteIndex ]); - - useEffect(() => - { - if(!model || !category || !elementRef || !elementRef.current) return; - - elementRef.current.scrollTop = 0; - }, [ model, category ]); - - return ( - - { paletteSet.length > 0 && - paletteSet.map((item, index) => ( - selectColor(item) } - /> - )) } - - ); -} diff --git a/src/components/camera/CameraWidgetView.scss b/src/components/camera/CameraWidgetView.scss index 8de2902..aecd0b1 100644 --- a/src/components/camera/CameraWidgetView.scss +++ b/src/components/camera/CameraWidgetView.scss @@ -25,23 +25,6 @@ filter: brightness(0.8); } } - - .info-camera { - top: 8px; - right: 36px; - cursor: pointer; - background-image: url("@/assets/images/boxes/card/questionmark.png"); - width: 19px; - height: 20px; - - &:hover { - background-image: url("@/assets/images/boxes/card/questionmark_hover.png"); - - &:active { - background-image: url("@/assets/images/boxes/card/questionmark_click.png"); - } - } - } .camera-area { position: absolute; diff --git a/src/components/camera/CameraWidgetView.tsx b/src/components/camera/CameraWidgetView.tsx index 91f9d0e..68e394e 100644 --- a/src/components/camera/CameraWidgetView.tsx +++ b/src/components/camera/CameraWidgetView.tsx @@ -1,7 +1,6 @@ -import { ILinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { AddEventLinkTracker, RemoveLinkEventTracker } from '../../api'; -import { useCamera, useRoomSessionManagerEvent } from '../../hooks'; +import { useCamera, useNitroEvent } from '../../hooks'; import { CameraWidgetCaptureView } from './views/CameraWidgetCaptureView'; import { CameraWidgetCheckoutView } from './views/CameraWidgetCheckoutView'; import { CameraWidgetEditorView } from './views/editor/CameraWidgetEditorView'; @@ -15,7 +14,7 @@ export const CameraWidgetView: FC<{}> = props => { const [ mode, setMode ] = useState(MODE_NONE); const [ base64Url, setSavedPictureUrl ] = useState(null); - const { availableEffects = [], selectedPictureIndex = -1, cameraRoll = [], setCameraRoll = null, myLevel = 0, price = { credits: 0, duckets: 0, publishDucketPrice: 0 }} = useCamera(); + const { availableEffects = [], selectedPictureIndex = -1, cameraRoll = [], setCameraRoll = null, myLevel = 0, price = { credits: 0, duckets: 0, publishDucketPrice: 0 } } = useCamera(); const processAction = (type: string) => { @@ -41,34 +40,15 @@ export const CameraWidgetView: FC<{}> = props => setMode(MODE_CAPTURE); return; } - } + }; const checkoutPictureUrl = (pictureUrl: string) => - { - const expectedPrefix = 'data:image/'; - - if (!pictureUrl.startsWith(expectedPrefix)) { - return; - } + { + setSavedPictureUrl(pictureUrl); + setMode(MODE_CHECKOUT); + }; - const sanitizedUrl = sanitizeImageUrl(pictureUrl); - if (!sanitizedUrl) { - return; - } - - setSavedPictureUrl(sanitizedUrl); - setMode(MODE_CHECKOUT); - } - - const sanitizeImageUrl = (imageUrl: string): string | null => { - if (!imageUrl.startsWith('data:image/')) { - return null; - } - - return imageUrl; - } - - useRoomSessionManagerEvent(RoomSessionEvent.ENDED, event => setMode(MODE_NONE)); + useNitroEvent(RoomSessionEvent.ENDED, event => setMode(MODE_NONE)); useEffect(() => { @@ -76,9 +56,9 @@ export const CameraWidgetView: FC<{}> = props => linkReceived: (url: string) => { const parts = url.split('/'); - + if(parts.length < 2) return; - + switch(parts[1]) { case 'show': @@ -99,7 +79,7 @@ export const CameraWidgetView: FC<{}> = props => eventUrlPrefix: 'camera/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); @@ -113,4 +93,4 @@ export const CameraWidgetView: FC<{}> = props => { (mode === MODE_CHECKOUT) && processAction('close') } onCancelClick={ () => processAction('editor_cancel') } price={ price }> } ); -} +}; diff --git a/src/components/camera/index.ts b/src/components/camera/index.ts new file mode 100644 index 0000000..43c10cd --- /dev/null +++ b/src/components/camera/index.ts @@ -0,0 +1,4 @@ +export * from './CameraWidgetView'; +export * from './views'; +export * from './views/editor'; +export * from './views/editor/effect-list'; diff --git a/src/components/camera/views/CameraWidgetCaptureView.tsx b/src/components/camera/views/CameraWidgetCaptureView.tsx index c3fc015..89fe25e 100644 --- a/src/components/camera/views/CameraWidgetCaptureView.tsx +++ b/src/components/camera/views/CameraWidgetCaptureView.tsx @@ -1,8 +1,8 @@ -import { NitroRectangle, TextureUtils } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, NitroRectangle, TextureUtils } from '@nitrots/nitro-renderer'; import { FC, useRef } from 'react'; import { FaTimes } from 'react-icons/fa'; -import { CameraPicture, CreateLinkEvent, GetRoomEngine, GetRoomSession, LocalizeText, PlaySound, SoundNames } from '../../../api'; -import { Column, DraggableWindow, Flex } from '../../../common'; +import { CameraPicture, GetRoomSession, LocalizeText, PlaySound, SoundNames } from '../../../api'; +import { Button, Column, DraggableWindow } from '../../../common'; import { useCamera, useNotification } from '../../../hooks'; export interface CameraWidgetCaptureViewProps @@ -28,11 +28,11 @@ export const CameraWidgetCaptureView: FC = props = if(!elementRef || !elementRef.current) return null; const frameBounds = elementRef.current.getBoundingClientRect(); - - return new NitroRectangle(Math.floor(frameBounds.x), Math.floor(frameBounds.y), Math.floor(frameBounds.width), Math.floor(frameBounds.height)); - } - const takePicture = () => + return new NitroRectangle(Math.floor(frameBounds.x), Math.floor(frameBounds.y), Math.floor(frameBounds.width), Math.floor(frameBounds.height)); + }; + + const takePicture = async () => { if(selectedPictureIndex > -1) { @@ -52,40 +52,39 @@ export const CameraWidgetCaptureView: FC = props = } PlaySound(SoundNames.CAMERA_SHUTTER); - clone.push(new CameraPicture(texture, TextureUtils.generateImageUrl(texture))); + clone.push(new CameraPicture(texture, await TextureUtils.generateImageUrl(texture))); setCameraRoll(clone); - } + }; return ( - - { selectedPicture && } -
-
CreateLinkEvent('habbopages/camera') }>
-
+ + { selectedPicture && } +
+
- { !selectedPicture &&
} - { selectedPicture && -
-
- - + { !selectedPicture &&
} + { selectedPicture && +
+
+ +
} -
-
+
+
{ (cameraRoll.length > 0) && - +
{ cameraRoll.map((picture, index) => { - return setSelectedPictureIndex(index) } />; + return setSelectedPictureIndex(index) } />; }) } - } +
} ); -} +}; diff --git a/src/components/camera/views/CameraWidgetCheckoutView.tsx b/src/components/camera/views/CameraWidgetCheckoutView.tsx index 23d581b..2ab2f5b 100644 --- a/src/components/camera/views/CameraWidgetCheckoutView.tsx +++ b/src/components/camera/views/CameraWidgetCheckoutView.tsx @@ -1,8 +1,8 @@ -import { CameraPublishStatusMessageEvent, CameraPurchaseOKMessageEvent, CameraStorageUrlMessageEvent, NotEnoughBalanceMessageEvent, PublishPhotoMessageComposer, PurchasePhotoMessageComposer } from '@nitrots/nitro-renderer'; +import { CameraPublishStatusMessageEvent, CameraPurchaseOKMessageEvent, CameraStorageUrlMessageEvent, CreateLinkEvent, GetRoomEngine, PublishPhotoMessageComposer, PurchasePhotoMessageComposer } from '@nitrots/nitro-renderer'; 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, useNotification } from '../../../hooks'; +import { GetConfigurationValue, LocalizeText, SendMessageComposer } from '../../../api'; +import { Button, Column, LayoutCurrencyIcon, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; +import { useMessageEvent } from '../../../hooks'; export interface CameraWidgetCheckoutViewProps { @@ -21,9 +21,8 @@ export const CameraWidgetCheckoutView: FC = props const [ wasPicturePublished, setWasPicturePublished ] = useState(false); const [ isWaiting, setIsWaiting ] = useState(false); const [ publishCooldown, setPublishCooldown ] = useState(0); - const { simpleAlert } = useNotification(); - const publishDisabled = useMemo(() => GetConfiguration('camera.publish.disabled', false), []); + const publishDisabled = useMemo(() => GetConfigurationValue('camera.publish.disabled', false), []); useMessageEvent(CameraPurchaseOKMessageEvent, event => { @@ -35,8 +34,6 @@ export const CameraWidgetCheckoutView: FC = props { const parser = event.getParser(); - if (!parser.ok) simpleAlert(LocalizeText('camera.publish.wait', [ 'minutes' ], [ Math.floor(parser.secondsToWait / 60).toString().replace('-', '') ]), null, null, null, LocalizeText('camera.purchase.pleasewait')); - setPublishUrl(parser.extraDataId); setPublishCooldown(parser.secondsToWait); setWasPicturePublished(parser.ok); @@ -47,20 +44,7 @@ export const CameraWidgetCheckoutView: FC = props { const parser = event.getParser(); - setPictureUrl(GetConfiguration('camera.url') + '/' + parser.url); - }); - - useMessageEvent(NotEnoughBalanceMessageEvent, event => - { - const parser = event.getParser(); - - if (!parser) return null; - - if (parser.notEnoughCredits && !parser.notEnoughActivityPoints) simpleAlert(LocalizeText('catalog.alert.notenough.credits.description'), null, null, null, LocalizeText('catalog.alert.notenough.title')); - - if (!parser.notEnoughCredits && parser.notEnoughActivityPoints) simpleAlert(LocalizeText(`catalog.alert.notenough.activitypoints.description.${ parser.activityPointType }`), null, null, null, LocalizeText(`catalog.alert.notenough.activitypoints.title.${ parser.activityPointType }`)); - - setIsWaiting(false); + setPictureUrl(GetConfigurationValue('camera.url') + '/' + parser.url); }); const processAction = (type: string, value: string | number = null) => @@ -86,7 +70,7 @@ export const CameraWidgetCheckoutView: FC = props onCancelClick(); return; } - } + }; useEffect(() => { @@ -101,75 +85,75 @@ export const CameraWidgetCheckoutView: FC = props processAction('close') } /> - +
{ (pictureUrl && pictureUrl.length) && } { (!pictureUrl || !pictureUrl.length) && - +
{ LocalizeText('camera.loading') } - } - - - +
} +
+
+ { LocalizeText('camera.purchase.header') } { ((price.credits > 0) || (price.duckets > 0)) && - +
{ LocalizeText('catalog.purchase.confirmation.dialog.cost') } { (price.credits > 0) && - +
{ price.credits } - } +
} { (price.duckets > 0) && - +
{ price.duckets } - } - } +
} +
} { (picturesBought > 0) && { LocalizeText('camera.purchase.count.info') } { picturesBought } CreateLinkEvent('inventory/toggle') }>{ LocalizeText('camera.open.inventory') } }
- - - - +
+ +
+
{ !publishDisabled && - - - - { LocalizeText(wasPicturePublished ? 'camera.publish.successful' : 'camera.publish.explanation') } - - - { LocalizeText(wasPicturePublished ? 'camera.publish.success.short.info' : 'camera.publish.detailed.explanation') } - - { wasPicturePublished && { LocalizeText('camera.link.to.published') } } - { !wasPicturePublished && (price.publishDucketPrice > 0) && - - { LocalizeText('catalog.purchase.confirmation.dialog.cost') } - - { price.publishDucketPrice } - - - } - { (publishCooldown > 0) &&
{ LocalizeText('camera.publish.wait', [ 'minutes' ], [ Math.ceil( publishCooldown / 60).toString() ]) }
} -
- { !wasPicturePublished && - - - } -
} +
+
+ + { LocalizeText(wasPicturePublished ? 'camera.publish.successful' : 'camera.publish.explanation') } + + + { LocalizeText(wasPicturePublished ? 'camera.publish.success.short.info' : 'camera.publish.detailed.explanation') } + + { wasPicturePublished && { LocalizeText('camera.link.to.published') } } + { !wasPicturePublished && (price.publishDucketPrice > 0) && +
+ { LocalizeText('catalog.purchase.confirmation.dialog.cost') } +
+ { price.publishDucketPrice } + +
+
} + { (publishCooldown > 0) &&
{ LocalizeText('camera.publish.wait', [ 'minutes' ], [ Math.ceil(publishCooldown / 60).toString() ]) }
} +
+ { !wasPicturePublished && +
+ +
} +
} { LocalizeText('camera.warning.disclaimer') } - +
- +
); -} +}; diff --git a/src/components/camera/views/CameraWidgetShowPhotoView.tsx b/src/components/camera/views/CameraWidgetShowPhotoView.tsx index c01ea07..4f4a59f 100644 --- a/src/components/camera/views/CameraWidgetShowPhotoView.tsx +++ b/src/components/camera/views/CameraWidgetShowPhotoView.tsx @@ -1,7 +1,6 @@ -import { RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { FaArrowLeft, FaArrowRight } from 'react-icons/fa'; -import { GetRoomEngine, GetUserProfile, IPhotoData, LocalizeText } from '../../../api'; +import { GetUserProfile, IPhotoData, LocalizeText } from '../../../api'; import { Flex, Grid, Text } from '../../../common'; export interface CameraWidgetShowPhotoViewProps @@ -14,6 +13,7 @@ export const CameraWidgetShowPhotoView: FC = pro { const { currentIndex = -1, currentPhotos = null } = props; const [ imageIndex, setImageIndex ] = useState(0); + const currentImage = (currentPhotos && currentPhotos.length) ? currentPhotos[imageIndex] : null; const next = () => @@ -21,48 +21,51 @@ export const CameraWidgetShowPhotoView: FC = pro setImageIndex(prevValue => { let newIndex = (prevValue + 1); + if(newIndex >= currentPhotos.length) newIndex = 0; + return newIndex; }); - } + }; const previous = () => { setImageIndex(prevValue => { let newIndex = (prevValue - 1); + if(newIndex < 0) newIndex = (currentPhotos.length - 1); + return newIndex; }); - } - - const getUserData = (roomId: number, objectId: number, type: string): number | string => - { - const roomObject = GetRoomEngine().getRoomObject(roomId, objectId, RoomObjectCategory.WALL); - if (!roomObject) return; - return type == 'username' ? roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_NAME) : roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); - } + }; - useEffect(() => { setImageIndex(currentIndex); }, [ currentIndex ]); + useEffect(() => + { + setImageIndex(currentIndex); + }, [ currentIndex ]); if(!currentImage) return null; return ( - { !currentImage.w && { LocalizeText('camera.loading') } } + { !currentImage.w && + { LocalizeText('camera.loading') } } - { currentImage.m && currentImage.m.length && { currentImage.m } } + { currentImage.m && currentImage.m.length && + { currentImage.m } } - { new Date(currentImage.t * 1000).toLocaleDateString(undefined, { day: 'numeric', month: 'long', year: 'numeric' }) } - GetUserProfile(Number(getUserData(currentImage.s, Number(currentImage.u), 'id')))}> { getUserData(currentImage.s, Number(currentImage.u), 'username') } + { (currentImage.n || '') } + { new Date(currentImage.t * 1000).toLocaleDateString() } { (currentPhotos.length > 1) && - - + + GetUserProfile(currentImage.oi) }>{ currentImage.o } + } ); -} \ No newline at end of file +}; diff --git a/src/components/camera/views/editor/CameraWidgetEditorView.tsx b/src/components/camera/views/editor/CameraWidgetEditorView.tsx index 3eee17b..d9973c0 100644 --- a/src/components/camera/views/editor/CameraWidgetEditorView.tsx +++ b/src/components/camera/views/editor/CameraWidgetEditorView.tsx @@ -1,10 +1,10 @@ -import { IRoomCameraWidgetEffect, IRoomCameraWidgetSelectedEffect, RoomCameraWidgetSelectedEffect } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; +import { GetRoomCameraWidgetManager, IRoomCameraWidgetEffect, IRoomCameraWidgetSelectedEffect, NitroLogger, RoomCameraWidgetSelectedEffect } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { FaSave, FaSearchMinus, FaSearchPlus, FaTrash } from 'react-icons/fa'; import ReactSlider from 'react-slider'; -import { CameraEditorTabs, CameraPicture, CameraPictureThumbnail, GetRoomCameraWidgetManager, LocalizeText } from '../../../../api'; -import { Button, ButtonGroup, Column, Flex, Grid, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Slider, Text } from '../../../../common'; -import { CameraWidgetEffectListView } from './effect-list/CameraWidgetEffectListView'; +import { CameraEditorTabs, CameraPicture, CameraPictureThumbnail, LocalizeText } from '../../../../api'; +import { Button, ButtonGroup, Column, Flex, Grid, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../../common'; +import { CameraWidgetEffectListView } from './effect-list'; export interface CameraWidgetEditorViewProps { @@ -26,6 +26,8 @@ export const CameraWidgetEditorView: FC = props => const [ selectedEffects, setSelectedEffects ] = useState([]); const [ effectsThumbnails, setEffectsThumbnails ] = useState([]); const [ isZoomed, setIsZoomed ] = useState(false); + const [ currentPictureUrl, setCurrentPictureUrl ] = useState(''); + const isBusy = useRef(false); const getColorMatrixEffects = useMemo(() => { @@ -52,12 +54,12 @@ export const CameraWidgetEditorView: FC = props => if(!name || !name.length || !selectedEffects || !selectedEffects.length) return -1; return selectedEffects.findIndex(effect => (effect.effect.name === name)); - }, [ selectedEffects ]) + }, [ selectedEffects ]); const getCurrentEffectIndex = useMemo(() => { - return getSelectedEffectIndex(selectedEffectName) - }, [ selectedEffectName, getSelectedEffectIndex ]) + return getSelectedEffectIndex(selectedEffectName); + }, [ selectedEffectName, getSelectedEffectIndex ]); const getCurrentEffect = useMemo(() => { @@ -83,11 +85,6 @@ export const CameraWidgetEditorView: FC = props => }); }, [ getCurrentEffectIndex, setSelectedEffects ]); - const getCurrentPictureUrl = useMemo(() => - { - return GetRoomCameraWidgetManager().applyEffects(picture.texture, selectedEffects, isZoomed).src; - }, [ picture, selectedEffects, isZoomed ]); - const processAction = useCallback((type: string, effectName: string = null) => { switch(type) @@ -99,7 +96,7 @@ export const CameraWidgetEditorView: FC = props => onCancel(); return; case 'checkout': - onCheckout(getCurrentPictureUrl); + onCheckout(currentPictureUrl); return; case 'change_tab': setCurrentTab(String(effectName)); @@ -108,7 +105,7 @@ export const CameraWidgetEditorView: FC = props => let existingIndex = getSelectedEffectIndex(effectName); if(existingIndex >= 0) return; - + const effect = availableEffects.find(effect => (effect.name === effectName)); if(!effect) return; @@ -143,63 +140,83 @@ export const CameraWidgetEditorView: FC = props => setSelectedEffects([]); return; case 'download': { - const image = new Image(); - - image.src = getCurrentPictureUrl - - const newWindow = window.open(''); - newWindow.document.write(image.outerHTML); + (async () => + { + const image = new Image(); + + image.src = currentPictureUrl; + + const newWindow = window.open(''); + newWindow.document.write(image.outerHTML); + })(); return; } case 'zoom': setIsZoomed(!isZoomed); return; } - }, [ isZoomed, availableEffects, selectedEffectName, getCurrentPictureUrl, getSelectedEffectIndex, onCancel, onCheckout, onClose, setIsZoomed, setSelectedEffects ]); + }, [ isZoomed, availableEffects, selectedEffectName, currentPictureUrl, getSelectedEffectIndex, onCancel, onCheckout, onClose, setIsZoomed, setSelectedEffects ]); useEffect(() => { - const thumbnails: CameraPictureThumbnail[] = []; - - for(const effect of availableEffects) + const processThumbnails = async () => { - thumbnails.push(new CameraPictureThumbnail(effect.name, GetRoomCameraWidgetManager().applyEffects(picture.texture, [ new RoomCameraWidgetSelectedEffect(effect, 1) ], false).src)); - } + const renderedEffects = await Promise.all(availableEffects.map(effect => GetRoomCameraWidgetManager().applyEffects(picture.texture, [ new RoomCameraWidgetSelectedEffect(effect, 1) ], false))); - setEffectsThumbnails(thumbnails); + setEffectsThumbnails(renderedEffects.map((image, index) => new CameraPictureThumbnail(availableEffects[index].name, image.src))); + }; + + processThumbnails(); }, [ picture, availableEffects ]); + useEffect(() => + { + GetRoomCameraWidgetManager() + .applyEffects(picture.texture, selectedEffects, isZoomed) + .then(imageElement => + { + setCurrentPictureUrl(imageElement.src); + }) + .catch(error => + { + NitroLogger.error('Failed to apply effects to picture', error); + }); + }, [ picture, selectedEffects, isZoomed ]); + return ( - + processAction('close') } /> { TABS.map(tab => { - return processAction('change_tab', tab) }> + return processAction('change_tab', tab) }>; }) } - - + + - + - + { selectedEffectName && { LocalizeText('camera.effect.name.' + selectedEffectName) } -
{ state.valueNow }
} step={ 0.01 } value={ getCurrentEffect.alpha } - onChange={ event => setSelectedEffectAlpha(event) } - renderThumb={ (props, state) =>
{ state.valueNow }
} /> + onChange={ event => setSelectedEffectAlpha(event) } /> +
}
- - +
+
@@ -210,19 +227,19 @@ export const CameraWidgetEditorView: FC = props => { isZoomed && } { !isZoomed && } - - +
+
- - +
+
); -} +}; diff --git a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx index cac3a34..d090889 100644 --- a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx +++ b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx @@ -37,4 +37,4 @@ export const CameraWidgetEffectListItemView: FC } ); -} +}; diff --git a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx index 3f67cea..1cceefd 100644 --- a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx +++ b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx @@ -24,8 +24,8 @@ export const CameraWidgetEffectListView: FC = p 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/camera/views/editor/effect-list/index.ts b/src/components/camera/views/editor/effect-list/index.ts new file mode 100644 index 0000000..7a4ebdb --- /dev/null +++ b/src/components/camera/views/editor/effect-list/index.ts @@ -0,0 +1,2 @@ +export * from './CameraWidgetEffectListItemView'; +export * from './CameraWidgetEffectListView'; diff --git a/src/components/camera/views/editor/index.ts b/src/components/camera/views/editor/index.ts new file mode 100644 index 0000000..49c615e --- /dev/null +++ b/src/components/camera/views/editor/index.ts @@ -0,0 +1,2 @@ +export * from './CameraWidgetEditorView'; +export * from './effect-list'; diff --git a/src/components/camera/views/index.ts b/src/components/camera/views/index.ts new file mode 100644 index 0000000..cf44449 --- /dev/null +++ b/src/components/camera/views/index.ts @@ -0,0 +1,5 @@ +export * from './CameraWidgetCaptureView'; +export * from './CameraWidgetCheckoutView'; +export * from './CameraWidgetShowPhotoView'; +export * from './editor'; +export * from './editor/effect-list'; diff --git a/src/components/campaign/CalendarItemView.tsx b/src/components/campaign/CalendarItemView.tsx index 816fa75..234387a 100644 --- a/src/components/campaign/CalendarItemView.tsx +++ b/src/components/campaign/CalendarItemView.tsx @@ -1,6 +1,7 @@ +import { GetRoomEngine, GetSessionDataManager } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { CalendarItemState, GetConfiguration, GetRoomEngine, GetSessionDataManager, ICalendarItem } from '../../api'; -import { Base, Column, Flex, LayoutImage } from '../../common'; +import { CalendarItemState, GetConfigurationValue, ICalendarItem } from '../../api'; +import { Column, Flex, LayoutImage } from '../../common'; interface CalendarItemViewProps { @@ -14,7 +15,7 @@ interface CalendarItemViewProps export const CalendarItemView: FC = props => { const { itemId = -1, state = null, product = null, active = false, onClick = null } = props; - + const getFurnitureIcon = (name: string) => { let furniData = GetSessionDataManager().getFloorItemDataByName(name); @@ -29,24 +30,24 @@ export const CalendarItemView: FC = props => } return url; - } + }; return ( - onClick(itemId) }> + onClick(itemId) }> { (state === CalendarItemState.STATE_UNLOCKED) && { product && - ('image.library.url') + product.customImage : getFurnitureIcon(product.productName) } /> } + ('image.library.url') + product.customImage : getFurnitureIcon(product.productName) } /> } } { (state !== CalendarItemState.STATE_UNLOCKED) && { (state === CalendarItemState.STATE_LOCKED_AVAILABLE) && - } +
} { ((state === CalendarItemState.STATE_LOCKED_EXPIRED) || (state === CalendarItemState.STATE_LOCKED_FUTURE)) && - } +
} } ); -} +}; diff --git a/src/components/campaign/CalendarView.tsx b/src/components/campaign/CalendarView.tsx index e296129..057d088 100644 --- a/src/components/campaign/CalendarView.tsx +++ b/src/components/campaign/CalendarView.tsx @@ -1,6 +1,7 @@ +import { GetSessionDataManager } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; -import { CalendarItemState, GetSessionDataManager, ICalendarItem, LocalizeText } from '../../api'; -import { Base, Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; +import { CalendarItemState, ICalendarItem, LocalizeText } from '../../api'; +import { Button, Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; import { CalendarItemView } from './CalendarItemView'; interface CalendarViewProps @@ -32,7 +33,7 @@ export const CalendarView: FC = props => if(missedDays.includes(day)) return CalendarItemState.STATE_LOCKED_EXPIRED; return CalendarItemState.STATE_LOCKED_AVAILABLE; - } + }; const dayMessage = (day: number) => { @@ -49,7 +50,7 @@ export const CalendarView: FC = props => default: return LocalizeText('campaign.calendar.info.available.desktop'); } - } + }; const onClickNext = () => { @@ -60,7 +61,7 @@ export const CalendarView: FC = props => setSelectedDay(nextDay); if((index + TOTAL_SHOWN_ITEMS) < (nextDay + 1)) setIndex(index + 1); - } + }; const onClickPrev = () => { @@ -71,7 +72,7 @@ export const CalendarView: FC = props => setSelectedDay(prevDay); if(index > prevDay) setIndex(index - 1); - } + }; const onClickItem = (item: number) => { @@ -83,9 +84,9 @@ export const CalendarView: FC = props => return; } - + setSelectedDay(item); - } + }; const forceOpen = () => { @@ -93,51 +94,51 @@ export const CalendarView: FC = props => const state = getDayState(id); if(state !== CalendarItemState.STATE_UNLOCKED) openPackage(id, true); - } + }; return ( - + - - +
+
{ LocalizeText('campaign.calendar.heading.day', [ 'number' ], [ (selectedDay + 1).toString() ]) } { dayMessage(selectedDay) } - +
{ GetSessionDataManager().isModerator && }
- +
- - - - +
+
+
+
{ [ ...Array(TOTAL_SHOWN_ITEMS) ].map((e, i) => { const day = (index + i); - + return ( - + ); }) } - - - - +
+
+
+
- ) -} + ); +}; diff --git a/src/components/campaign/CampaignView.scss b/src/components/campaign/CampaignView.scss deleted file mode 100644 index cea973f..0000000 --- a/src/components/campaign/CampaignView.scss +++ /dev/null @@ -1,71 +0,0 @@ -.nitro-campaign-calendar { - width: $nitro-calendar-width; - height: $nitro-calendar-height; - - .calendar-item { - filter: brightness(80%); - - &.active { - filter: brightness(100%); - } - } -} - -.campaign-spritesheet { - display: block; - background: transparent url('@/assets/images/campaign/campaign_spritesheet.png') no-repeat; - - &.available { - width: 69px; - height: 78px; - background-position: -5px -5px; - } - - &.campaign-day-generic-bg { - max-width: 202px; - height: 447px; - background-position: -84px -5px; - } - - &.campaign-opened { - width: 96px; - height: 66px; - background-position: -296px -5px; - } - - &.locked { - width: 42px; - height: 42px; - background-position: -296px -81px; - } - - &.locked-bg { - width: 132px; - height: 132px; - background-position: -402px -5px; - } - - &.next { - width: 33px; - height: 34px; - background-position: -5px -147px; - } - - &.prev { - width: 33px; - height: 34px; - background-position: -296px -147px; - } - - &.unavailable { - width: 68px; - height: 78px; - background-position: -339px -147px; - } - - &.unlocked-bg { - width: 190px; - height: 189px; - background-position: -296px -235px; - } -} diff --git a/src/components/campaign/CampaignView.tsx b/src/components/campaign/CampaignView.tsx index fe80383..76230f4 100644 --- a/src/components/campaign/CampaignView.tsx +++ b/src/components/campaign/CampaignView.tsx @@ -1,6 +1,6 @@ -import { CampaignCalendarData, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, ILinkEventTracker, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, CampaignCalendarData, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, ILinkEventTracker, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { AddEventLinkTracker, CalendarItem, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; +import { CalendarItem, SendMessageComposer } from '../../api'; import { useMessageEvent } from '../../hooks'; import { CalendarView } from './CalendarView'; @@ -26,14 +26,14 @@ export const CampaignView: FC<{}> = props => { SendMessageComposer(new OpenCampaignCalendarDoorComposer(calendarData.campaignName, id)); } - } + }; useMessageEvent(CampaignCalendarDataMessageEvent, event => { const parser = event.getParser(); if(!parser) return; - + setCalendarData(parser.calendarData); }); @@ -47,19 +47,19 @@ export const CampaignView: FC<{}> = props => if(parser.doorOpened) { - 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; }); } @@ -73,9 +73,9 @@ export const CampaignView: FC<{}> = props => linkReceived: (url: string) => { const value = url.split('/'); - + if(value.length < 2) return; - + switch(value[1]) { case 'calendar': @@ -86,16 +86,16 @@ export const CampaignView: FC<{}> = props => eventUrlPrefix: 'openView/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); return ( <> - { (calendarData && isCalendarOpen) && - setCalendarOpen(false) } campaignName={ calendarData.campaignName } currentDay={ calendarData.currentDay } numDays={ calendarData.campaignDays } openedDays={ calendarData.openedDays } missedDays={ calendarData.missedDays } openPackage={ openPackage } receivedProducts={ receivedProducts } /> + { (calendarData && isCalendarOpen) && + setCalendarOpen(false) } /> } - ) -} + ); +}; diff --git a/src/components/catalog/CatalogView.scss b/src/components/catalog/CatalogView.scss deleted file mode 100644 index 75243dc..0000000 --- a/src/components/catalog/CatalogView.scss +++ /dev/null @@ -1,161 +0,0 @@ -.nitro-catalog { - width: $catalog-width; - height: $catalog-height; - - font[size='16'] { - font-size: 20px; - } - - .catalog-search-button { - min-width: 30px; - width: 30px; - } - - .quantity-input { - min-height: 17px; - height: 17px; - width: 28px; - padding: 0 4px; - text-align: right; - } -} - -.nitro-catalog-gift { - width: 325px; - - .gift-preview { - width: 80px; - height: 80px; - overflow: hidden; - display: flex; - justify-content: center; - align-items: center; - } - - .gift-color { - width: 15px; - height: 15px; - border-radius: $border-radius; - } -} - -.nitro-catalog-navigation-grid-container { - border-color: #b6bec5 !important; - background-color: #cdd3d9; - border: 2px solid; - - .nitro-catalog-navigation-section { - display: grid; - - .nitro-catalog-navigation-section { - padding-left: 5px; - border-left: 2px solid #b6bec5; - } - } - - .layout-grid-item { - font-size: $font-size-sm; - height: 27px !important; - border-color: unset !important; - background-color: #cdd3d9; - border: 0 !important; - padding: 1px 3px; - - .svg-inline--fa { - color: $black; - font-size: 10px; - padding: 1px; - } - } -} - -.nitro-catalog-layout-info-loyalty { - .info-loyalty-content { - background-repeat: no-repeat; - background-position: top right; - background-image: url('@/assets/images/catalog/diamond_info_illustration.gif'); - padding-right: 123px; - } - - .info-image { - width: 123px; - height: 350px; - background-image: url('@/assets/images/catalog/diamond_info_illustration.gif'); - } -} - -.nitro-catalog-layout-vip-buy-grid { - .layout-grid-item { - height: 50px !important; - max-height: 50px !important; - - .icon-hc-banner { - width: 68px; - height: 40px; - background: url('@/assets/images/catalog/hc_big.png') center - no-repeat; - } - } -} - -.nitro-catalog-layout-marketplace-grid { - .layout-grid-item { - height: 75px !important; - } -} - -.nitro-catalog-layout-vip-gifts-grid { - .layout-grid-item { - height: 55px !important; - max-height: 55px !important; - } -} - -.nitro-catalog-layout-marketplace-post-offer { - width: $marketplace-post-offer-width; - height: $marketplace-post-offer-height; -} - -.nitro-catalog-layout-bundle-grid { - .layout-grid-item { - background-color: transparent; - } -} - -.nitro-catalog-header { - width: 290px; - height: 60px; -} - -.autocomplete-gift-container { - background: #fff; - padding: 8px; - list-style-type: none; - min-width: 307px; - border-radius: 0.2rem; - position: absolute; - font-size: 0.7875rem; - top: 81px; - left: 8px; - border: 1px solid #b6c1ce; - margin: 0; - border-radius: 2px; - margin: 0; - box-sizing: border-box; - max-height: 280px; - overflow-y: auto; - z-index: 1; - - .autocomplete-gift-item { - width: 100%; - box-sizing: border-box; - &:hover { - background-color: #ebf4ff; - } - } -} -.blackselectiongen{ - color: #222; -} - -@import './views/targeted-offer/Offer.scss'; diff --git a/src/components/catalog/CatalogView.tsx b/src/components/catalog/CatalogView.tsx index 63cf5af..d7ee89f 100644 --- a/src/components/catalog/CatalogView.tsx +++ b/src/components/catalog/CatalogView.tsx @@ -1,7 +1,7 @@ -import { ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useEffect } from 'react'; -import { AddEventLinkTracker, GetConfiguration, LocalizeText, RemoveLinkEventTracker } from '../../api'; -import { Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; +import { GetConfigurationValue, LocalizeText } from '../../api'; +import { Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; import { useCatalog } from '../../hooks'; import { CatalogIconView } from './views/catalog-icon/CatalogIconView'; import { CatalogGiftView } from './views/gift/CatalogGiftView'; @@ -19,9 +19,9 @@ export const CatalogView: FC<{}> = props => linkReceived: (url: string) => { const parts = url.split('/'); - + if(parts.length < 2) return; - + switch(parts[1]) { case 'show': @@ -54,14 +54,14 @@ export const CatalogView: FC<{}> = props => { setIsVisible(true); } - + return; } }, eventUrlPrefix: 'catalog/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, [ setIsVisible, openPageByOfferId, openPageByName ]); @@ -69,40 +69,36 @@ export const CatalogView: FC<{}> = props => return ( <> { isVisible && - + setIsVisible(false) } /> - {rootNode && - rootNode.children.length > 0 && - rootNode.children.map((child, index) => { - if (!child.isVisible) return null; - // Generate a unique key using the index of the map function - const uniqueKey = `${child.pageId}-${index}`; - return ( - { - if (searchResult) setSearchResult(null); - activateNode(child); - }} - > - - {GetConfiguration('catalog.tab.icons') && } - {child.localization} - - - ); - })} + { rootNode && (rootNode.children.length > 0) && rootNode.children.map(child => + { + if(!child.isVisible) return null; + + return ( + + { + if(searchResult) setSearchResult(null); + + activateNode(child); + } } > +
+ { GetConfigurationValue('catalog.tab.icons') && } + { child.localization } +
+
+ ); + }) }
{ !navigationHidden && - + { activeNodes && (activeNodes.length > 0) && } } - + { GetCatalogLayout(currentPage, () => setNavigationHidden(true)) } @@ -112,4 +108,4 @@ export const CatalogView: FC<{}> = props => ); -} +}; diff --git a/src/components/catalog/views/CatalogPurchaseConfirmView.tsx b/src/components/catalog/views/CatalogPurchaseConfirmView.tsx index 30dcfc3..84ce086 100644 --- a/src/components/catalog/views/CatalogPurchaseConfirmView.tsx +++ b/src/components/catalog/views/CatalogPurchaseConfirmView.tsx @@ -7,4 +7,4 @@ export const CatalogPurchaseConfirmView: FC<{}> = props => return (
); -} +}; diff --git a/src/components/catalog/views/catalog-header/CatalogHeaderView.tsx b/src/components/catalog/views/catalog-header/CatalogHeaderView.tsx index eb8d92c..09ec089 100644 --- a/src/components/catalog/views/catalog-header/CatalogHeaderView.tsx +++ b/src/components/catalog/views/catalog-header/CatalogHeaderView.tsx @@ -1,6 +1,5 @@ import { FC, useEffect, useState } from 'react'; -import { GetConfiguration } from '../../../../api'; -import { Flex } from '../../../../common'; +import { GetConfigurationValue } from '../../../../api'; export interface CatalogHeaderViewProps { @@ -14,13 +13,13 @@ export const CatalogHeaderView: FC = props => useEffect(() => { - setDisplayImageUrl(imageUrl ?? GetConfiguration('catalog.asset.image.url').replace('%name%', 'catalog_header_roombuilder')); + setDisplayImageUrl(imageUrl ?? GetConfigurationValue('catalog.asset.image.url').replace('%name%', 'catalog_header_roombuilder')); }, [ imageUrl ]); - return - + return
+ { - currentTarget.src = GetConfiguration('catalog.asset.image.url').replace('%name%', 'catalog_header_roombuilder'); + currentTarget.src = GetConfigurationValue('catalog.asset.image.url').replace('%name%', 'catalog_header_roombuilder'); } } /> - ; -} +
; +}; diff --git a/src/components/catalog/views/catalog-icon/CatalogIconView.tsx b/src/components/catalog/views/catalog-icon/CatalogIconView.tsx index 7c28ac9..0178662 100644 --- a/src/components/catalog/views/catalog-icon/CatalogIconView.tsx +++ b/src/components/catalog/views/catalog-icon/CatalogIconView.tsx @@ -1,6 +1,6 @@ import { FC, useMemo } from 'react'; -import { GetConfiguration } from '../../../../api'; -import { LayoutImage } from '../../../../common/layout/LayoutImage'; +import { GetConfigurationValue } from '../../../../api'; +import { LayoutImage } from '../../../../common'; export interface CatalogIconViewProps { @@ -13,8 +13,8 @@ export const CatalogIconView: FC = props => const getIconUrl = useMemo(() => { - return ((GetConfiguration('catalog.asset.icon.url')).replace('%name%', icon.toString())); + return ((GetConfigurationValue('catalog.asset.icon.url')).replace('%name%', icon.toString())); }, [ icon ]); return ; -} +}; diff --git a/src/components/catalog/views/catalog-room-previewer/CatalogRoomPreviewerView.tsx b/src/components/catalog/views/catalog-room-previewer/CatalogRoomPreviewerView.tsx index 1eb673f..87738d5 100644 --- a/src/components/catalog/views/catalog-room-previewer/CatalogRoomPreviewerView.tsx +++ b/src/components/catalog/views/catalog-room-previewer/CatalogRoomPreviewerView.tsx @@ -1,11 +1,13 @@ -import { NitroToolbarAnimateIconEvent, TextureUtils, ToolbarIconEnum } from '@nitrots/nitro-renderer'; +import { GetEventDispatcher, NitroToolbarAnimateIconEvent, RoomPreviewer, TextureUtils, ToolbarIconEnum } from '@nitrots/nitro-renderer'; import { FC, useRef } from 'react'; -import { GetRoomEngine } from '../../../../api'; -import { LayoutRoomPreviewerView, LayoutRoomPreviewerViewProps } from '../../../../common'; +import { LayoutRoomPreviewerView } from '../../../../common'; import { CatalogPurchasedEvent } from '../../../../events'; import { useUiEvent } from '../../../../hooks'; -export const CatalogRoomPreviewerView: FC = props => +export const CatalogRoomPreviewerView: FC<{ + roomPreviewer: RoomPreviewer; + height?: number; +}> = props => { const { roomPreviewer = null } = props; const elementRef = useRef(null); @@ -13,25 +15,28 @@ export const CatalogRoomPreviewerView: FC = props useUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, event => { if(!elementRef) return; - + const renderTexture = roomPreviewer.getRoomObjectCurrentImage(); if(!renderTexture) return; - const image = TextureUtils.generateImage(renderTexture); + (async () => + { + const image = await TextureUtils.generateImage(renderTexture); - if(!image) return; + if(!image) return; - const bounds = elementRef.current.getBoundingClientRect(); + const bounds = elementRef.current.getBoundingClientRect(); - const x = (bounds.x + (bounds.width / 2)); - const y = (bounds.y + (bounds.height / 2)); + const x = (bounds.x + (bounds.width / 2)); + const y = (bounds.y + (bounds.height / 2)); - const animateEvent = new NitroToolbarAnimateIconEvent(image, x, y); + const animateEvent = new NitroToolbarAnimateIconEvent(image, x, y); - animateEvent.iconName = ToolbarIconEnum.INVENTORY; + animateEvent.iconName = ToolbarIconEnum.INVENTORY; - GetRoomEngine().events.dispatchEvent(animateEvent); + GetEventDispatcher().dispatchEvent(animateEvent); + })(); }); return ( @@ -39,4 +44,4 @@ export const CatalogRoomPreviewerView: FC = props
); -} +}; diff --git a/src/components/catalog/views/gift/CatalogGiftView.tsx b/src/components/catalog/views/gift/CatalogGiftView.tsx index 2bb2827..c027fba 100644 --- a/src/components/catalog/views/gift/CatalogGiftView.tsx +++ b/src/components/catalog/views/gift/CatalogGiftView.tsx @@ -1,10 +1,11 @@ -import { GiftReceiverNotFoundEvent, PurchaseFromCatalogAsGiftComposer } from '@nitrots/nitro-renderer'; +import { GetSessionDataManager, GiftReceiverNotFoundEvent, PurchaseFromCatalogAsGiftComposer } from '@nitrots/nitro-renderer'; import { ChangeEvent, FC, useCallback, useEffect, useMemo, useState } from 'react'; import { FaChevronLeft, FaChevronRight } from 'react-icons/fa'; -import { ColorUtils, GetSessionDataManager, LocalizeText, MessengerFriend, ProductTypeEnum, SendMessageComposer } from '../../../../api'; -import { Base, Button, ButtonGroup, Column, Flex, FormGroup, LayoutCurrencyIcon, LayoutFurniImageView, LayoutGiftTagView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text, classNames } from '../../../../common'; +import { ColorUtils, LocalizeText, MessengerFriend, ProductTypeEnum, SendMessageComposer } from '../../../../api'; +import { Button, Column, Flex, FormGroup, LayoutCurrencyIcon, LayoutFurniImageView, LayoutGiftTagView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { CatalogEvent, CatalogInitGiftEvent, CatalogPurchasedEvent } from '../../../../events'; import { useCatalog, useFriends, useMessageEvent, useUiEvent } from '../../../../hooks'; +import { classNames } from '../../../../layout'; export const CatalogGiftView: FC<{}> = props => { @@ -22,7 +23,7 @@ export const CatalogGiftView: FC<{}> = props => const [ maxBoxIndex, setMaxBoxIndex ] = useState(0); const [ maxRibbonIndex, setMaxRibbonIndex ] = useState(0); const [ receiverNotFound, setReceiverNotFound ] = useState(false); - const { catalogOptions = null, getNodesByOfferId = null } = useCatalog(); + const { catalogOptions = null } = useCatalog(); const { friends } = useFriends(); const { giftConfiguration = null } = catalogOptions; const [ boxTypes, setBoxTypes ] = useState([]); @@ -53,16 +54,16 @@ export const CatalogGiftView: FC<{}> = props => const boxExtraData = useMemo(() => { - if (!giftConfiguration) return ''; + if(!giftConfiguration) return ''; return ((boxTypes[selectedBoxIndex] * 1000) + giftConfiguration.ribbonTypes[selectedRibbonIndex]).toString(); }, [ giftConfiguration, selectedBoxIndex, selectedRibbonIndex, boxTypes ]); const isColorable = useMemo(() => { - if (!giftConfiguration) return false; + if(!giftConfiguration) return false; - if (isBoxDefault) return false; + if(isBoxDefault) return false; const boxType = boxTypes[selectedBoxIndex]; @@ -72,9 +73,9 @@ export const CatalogGiftView: FC<{}> = props => const colourId = useMemo(() => { return isBoxDefault ? boxTypes[selectedBoxIndex] : selectedColorId; - },[ isBoxDefault, boxTypes, selectedBoxIndex, selectedColorId ]) + }, [ isBoxDefault, boxTypes, selectedBoxIndex, selectedColorId ]); - const allFriends = friends.filter( (friend: MessengerFriend) => friend.id !== -1 ); + const allFriends = friends.filter((friend: MessengerFriend) => friend.id !== -1); const onTextChanged = (e: ChangeEvent) => { @@ -82,7 +83,7 @@ export const CatalogGiftView: FC<{}> = props => let suggestions = []; - if (value.length > 0) + if(value.length > 0) { suggestions = allFriends.sort().filter((friend: MessengerFriend) => friend.name.includes(value)); } @@ -96,7 +97,7 @@ export const CatalogGiftView: FC<{}> = props => { setReceiverName(friendName); setIsAutocompleteVisible(false); - } + }; const handleAction = useCallback((action: string) => { @@ -121,19 +122,10 @@ export const CatalogGiftView: FC<{}> = props => return; } - let buyPageId = pageId - - if(buyPageId === -1) - { - const nodes = getNodesByOfferId(offerId); - - if(nodes) buyPageId = nodes[0].pageId; - } - - SendMessageComposer(new PurchaseFromCatalogAsGiftComposer(buyPageId, offerId, extraData, receiverName, message, colourId, selectedBoxIndex, selectedRibbonIndex, showMyFace)); + SendMessageComposer(new PurchaseFromCatalogAsGiftComposer(pageId, offerId, extraData, receiverName, message, colourId, selectedBoxIndex, selectedRibbonIndex, showMyFace)); return; } - }, [ colourId, extraData, maxBoxIndex, maxRibbonIndex, message, offerId, pageId, receiverName, selectedBoxIndex, selectedRibbonIndex, showMyFace, getNodesByOfferId ]); + }, [ colourId, extraData, maxBoxIndex, maxRibbonIndex, message, offerId, pageId, receiverName, selectedBoxIndex, selectedRibbonIndex, showMyFace ]); useMessageEvent(GiftReceiverNotFoundEvent, event => setReceiverNotFound(true)); @@ -166,20 +158,20 @@ export const CatalogGiftView: FC<{}> = props => const createBoxTypes = useCallback(() => { - if (!giftConfiguration) return; + if(!giftConfiguration) return; setBoxTypes(prev => { let newPrev = [ ...giftConfiguration.boxTypes ]; - newPrev.push(giftConfiguration.defaultStuffTypes[ Math.floor((Math.random() * (giftConfiguration.defaultStuffTypes.length - 1))) ]); + newPrev.push(giftConfiguration.defaultStuffTypes[Math.floor((Math.random() * (giftConfiguration.defaultStuffTypes.length - 1)))]); - setMaxBoxIndex(newPrev.length- 1); + setMaxBoxIndex(newPrev.length - 1); setMaxRibbonIndex(newPrev.length - 1); return newPrev; - }) - },[ giftConfiguration ]) + }); + }, [ giftConfiguration ]); useEffect(() => { @@ -193,8 +185,7 @@ export const CatalogGiftView: FC<{}> = props => if(!giftData) continue; - if (giftData.colors && giftData.colors.length > 0) newColors.push({ id: colorId, color: ColorUtils.makeColorNumberHex(giftData.colors[0]) }); - else newColors.push({ id: colorId, color: '#000000' }); + if(giftData.colors && giftData.colors.length > 0) newColors.push({ id: colorId, color: ColorUtils.makeColorNumberHex(giftData.colors[0]) }); } createBoxTypes(); @@ -208,10 +199,10 @@ export const CatalogGiftView: FC<{}> = props => useEffect(() => { - if (!isVisible) return; + if(!isVisible) return; createBoxTypes(); - },[ createBoxTypes, isVisible ]) + }, [ createBoxTypes, isVisible ]); if(!giftConfiguration || !giftConfiguration.isEnabled || !isVisible) return null; @@ -220,79 +211,79 @@ export const CatalogGiftView: FC<{}> = props => const priceText = 'catalog.gift_wrapping_new.' + (isBoxDefault ? 'freeprice' : 'price'); return ( - + { LocalizeText('catalog.gift_wrapping.receiver') } - onTextChanged(e) } /> + onTextChanged(e) } /> { (suggestions.length > 0 && isAutocompleteVisible) && { suggestions.map((friend: MessengerFriend) => ( - selectedReceiverName(friend.name) }>{ friend.name } +
selectedReceiverName(friend.name) }>{ friend.name }
)) }
} { receiverNotFound && - { LocalizeText('catalog.gift_wrapping.receiver_not_found.title') } } +
{ LocalizeText('catalog.gift_wrapping.receiver_not_found.title') }
}
- setMessage(value) } /> - - setShowMyFace(value => !value) } /> + setMessage(value) } /> +
+ setShowMyFace(value => !value) } /> - - +
+
{ selectedColorId && - - - } - - - +
+ +
} +
+
+
- - +
+
{ LocalizeText(boxName) } - +
{ LocalizeText(priceText, [ 'price' ], [ giftConfiguration.price.toString() ]) } - - - - - +
+
+
+ +
- +
{ LocalizeText(ribbonName) }
- - - +
+
+ { LocalizeText('catalog.gift_wrapping.pick_color') } - - { colors.map(color =>
- - - +
); diff --git a/src/components/catalog/views/navigation/CatalogNavigationItemView.tsx b/src/components/catalog/views/navigation/CatalogNavigationItemView.tsx index 98b1fd0..1bb4373 100644 --- a/src/components/catalog/views/navigation/CatalogNavigationItemView.tsx +++ b/src/components/catalog/views/navigation/CatalogNavigationItemView.tsx @@ -1,7 +1,7 @@ import { FC } from 'react'; import { FaCaretDown, FaCaretUp } from 'react-icons/fa'; import { ICatalogNode } from '../../../../api'; -import { Base, LayoutGridItem, Text } from '../../../../common'; +import { LayoutGridItem, Text } from '../../../../common'; import { useCatalog } from '../../../../hooks'; import { CatalogIconView } from '../catalog-icon/CatalogIconView'; import { CatalogNavigationSetView } from './CatalogNavigationSetView'; @@ -16,20 +16,20 @@ export const CatalogNavigationItemView: FC = pro { const { node = null, child = false } = props; const { activateNode = null } = useCatalog(); - + return ( - - activateNode(node) } className={ child ? 'inset' : '' }> +
+ activateNode(node) }> - { node.localization } + { node.localization } { node.isBranch && <> - { node.isOpen && } - { !node.isOpen && } + { node.isOpen && } + { !node.isOpen && } } { node.isOpen && node.isBranch && - } - + } +
); -} +}; diff --git a/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx b/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx index 8bfdd48..92923fd 100644 --- a/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx +++ b/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx @@ -11,15 +11,15 @@ export interface CatalogNavigationSetViewProps export const CatalogNavigationSetView: FC = props => { const { node = null, child = false } = props; - + return ( <> { node && (node.children.length > 0) && node.children.map((n, index) => { if(!n.isVisible) return null; - - return + + return ; }) } ); -} +}; diff --git a/src/components/catalog/views/navigation/CatalogNavigationView.tsx b/src/components/catalog/views/navigation/CatalogNavigationView.tsx index 2d03f06..da5c850 100644 --- a/src/components/catalog/views/navigation/CatalogNavigationView.tsx +++ b/src/components/catalog/views/navigation/CatalogNavigationView.tsx @@ -15,12 +15,12 @@ export const CatalogNavigationView: FC = props => { const { node = null } = props; const { searchResult = null } = useCatalog(); - + return ( <> - - + + { searchResult && (searchResult.filteredNodes.length > 0) && searchResult.filteredNodes.map((n, index) => { return ; @@ -31,4 +31,4 @@ export const CatalogNavigationView: FC = props => ); -} +}; diff --git a/src/components/catalog/views/page/common/CatalogGridOfferView.tsx b/src/components/catalog/views/page/common/CatalogGridOfferView.tsx index 507bb6c..f99bbad 100644 --- a/src/components/catalog/views/page/common/CatalogGridOfferView.tsx +++ b/src/components/catalog/views/page/common/CatalogGridOfferView.tsx @@ -44,16 +44,16 @@ export const CatalogGridOfferView: FC = props => requestOfferToMover(offer); return; } - } + }; const product = offer.product; if(!product) return null; return ( - + { (offer.product.productType === ProductTypeEnum.ROBOT) && - } + } ); -} +}; diff --git a/src/components/catalog/views/page/common/CatalogRedeemVoucherView.tsx b/src/components/catalog/views/page/common/CatalogRedeemVoucherView.tsx index 504bd4b..c3469ec 100644 --- a/src/components/catalog/views/page/common/CatalogRedeemVoucherView.tsx +++ b/src/components/catalog/views/page/common/CatalogRedeemVoucherView.tsx @@ -2,8 +2,9 @@ import { RedeemVoucherMessageComposer, VoucherRedeemErrorMessageEvent, VoucherRe import { FC, useState } from 'react'; import { FaTag } from 'react-icons/fa'; import { LocalizeText, SendMessageComposer } from '../../../../../api'; -import { Button, Flex } from '../../../../../common'; +import { Button } from '../../../../../common'; import { useMessageEvent, useNotification } from '../../../../../hooks'; +import { NitroInput } from '../../../../../layout'; export interface CatalogRedeemVoucherViewProps { @@ -24,7 +25,7 @@ export const CatalogRedeemVoucherView: FC = props SendMessageComposer(new RedeemVoucherMessageComposer(voucher)); setIsWaiting(true); - } + }; useMessageEvent(VoucherRedeemOkMessageEvent, event => { @@ -35,7 +36,7 @@ export const CatalogRedeemVoucherView: FC = props if(parser.productName) message = LocalizeText('catalog.alert.voucherredeem.ok.description.furni', [ 'productName', 'productDescription' ], [ parser.productName, parser.productDescription ]); simpleAlert(message, null, null, null, LocalizeText('catalog.alert.voucherredeem.ok.title')); - + setIsWaiting(false); setVoucher(''); }); @@ -50,11 +51,17 @@ export const CatalogRedeemVoucherView: FC = props }); return ( - - setVoucher(event.target.value) } /> - - +
); -} +}; diff --git a/src/components/catalog/views/page/common/CatalogSearchView.tsx b/src/components/catalog/views/page/common/CatalogSearchView.tsx index bfa1ea9..dc3f34b 100644 --- a/src/components/catalog/views/page/common/CatalogSearchView.tsx +++ b/src/components/catalog/views/page/common/CatalogSearchView.tsx @@ -1,9 +1,10 @@ -import { IFurnitureData } from '@nitrots/nitro-renderer'; +import { GetSessionDataManager, IFurnitureData } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { FaSearch, FaTimes } from 'react-icons/fa'; -import { CatalogPage, CatalogType, FilterCatalogNode, FurnitureOffer, GetOfferNodes, GetSessionDataManager, ICatalogNode, ICatalogPage, IPurchasableOffer, LocalizeText, PageLocalization, SearchResult } from '../../../../../api'; +import { CatalogPage, CatalogType, FilterCatalogNode, FurnitureOffer, GetOfferNodes, ICatalogNode, ICatalogPage, IPurchasableOffer, LocalizeText, PageLocalization, SearchResult } from '../../../../../api'; import { Button, Flex } from '../../../../../common'; import { useCatalog } from '../../../../../hooks'; +import { NitroInput } from '../../../../../layout'; export const CatalogSearchView: FC<{}> = props => { @@ -23,9 +24,7 @@ export const CatalogSearchView: FC<{}> = props => const timeout = setTimeout(() => { - const furnitureDatas = GetSessionDataManager().getAllFurnitureData({ - loadFurnitureData: null - }); + const furnitureDatas = GetSessionDataManager().getAllFurnitureData(); if(!furnitureDatas || !furnitureDatas.length) return; @@ -42,10 +41,10 @@ export const CatalogSearchView: FC<{}> = props => if((currentType === CatalogType.BUILDER) && (furniture.purchaseOfferId === -1) && (furniture.rentOfferId === -1)) { - // if((furniture.furniLine !== '') && (foundFurniLines.indexOf(furniture.furniLine) < 0)) - // { - // if(searchValues.indexOf(search) >= 0) foundFurniLines.push(furniture.furniLine); - // } + if((furniture.furniLine !== '') && (foundFurniLines.indexOf(furniture.furniLine) < 0)) + { + if(searchValues.indexOf(search) >= 0) foundFurniLines.push(furniture.furniLine); + } } else { @@ -79,18 +78,29 @@ export const CatalogSearchView: FC<{}> = props => }, [ offersToNodes, currentType, rootNode, searchValue, setCurrentPage, setSearchResult ]); return ( - +
- setSearchValue(event.target.value) } /> + + + + + + + setSearchValue(event.target.value) } /> + + { (!searchValue || !searchValue.length) && - } { searchValue && !!searchValue.length && - } - +
); -} +}; diff --git a/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx index 9b6ec6a..224946e 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; import { LocalizeText } from '../../../../../api'; -import { Base, Column, Flex, Grid, Text } from '../../../../../common'; +import { Column, Grid, Text } from '../../../../../common'; import { useCatalog } from '../../../../../hooks'; import { CatalogBadgeSelectorWidgetView } from '../widgets/CatalogBadgeSelectorWidgetView'; import { CatalogFirstProductSelectorWidgetView } from '../widgets/CatalogFirstProductSelectorWidgetView'; @@ -20,14 +20,14 @@ export const CatalogLayoutBadgeDisplayView: FC = props => <> - + - { LocalizeText('catalog_selectbadge') } + { LocalizeText('catalog_selectbadge') } - + { !currentOffer && <> { !!page.localization.getImage(1) && } @@ -35,15 +35,15 @@ export const CatalogLayoutBadgeDisplayView: FC = props => } { currentOffer && <> - +
- - - - { currentOffer.localizationName } - +
+ + + { currentOffer.localizationName } +
- +
} @@ -51,4 +51,4 @@ export const CatalogLayoutBadgeDisplayView: FC = props =>
); -} +}; diff --git a/src/components/catalog/views/page/layout/CatalogLayoutColorGroupingView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutColorGroupingView.tsx index 60ccdba..41d2014 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutColorGroupingView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutColorGroupingView.tsx @@ -2,7 +2,7 @@ import { ColorConverter } from '@nitrots/nitro-renderer'; import { FC, useMemo, useState } from 'react'; import { FaFillDrip } from 'react-icons/fa'; import { IPurchasableOffer } from '../../../../../api'; -import { AutoGrid, Base, Button, Column, Flex, Grid, LayoutGridItem, Text } from '../../../../../common'; +import { AutoGrid, Button, Column, Grid, LayoutGridItem, Text } from '../../../../../common'; import { useCatalog } from '../../../../../hooks'; import { CatalogGridOfferView } from '../common/CatalogGridOfferView'; import { CatalogAddOnBadgeWidgetView } from '../widgets/CatalogAddOnBadgeWidgetView'; @@ -18,7 +18,7 @@ export interface CatalogLayoutColorGroupViewProps extends CatalogLayoutProps } -export const CatalogLayoutColorGroupingView : FC = props => +export const CatalogLayoutColorGroupingView: FC = props => { const { page = null } = props; const [ colorableItems, setColorableItems ] = useState>(new Map()); @@ -27,49 +27,49 @@ export const CatalogLayoutColorGroupingView : FC { - if (((!(a.product.furnitureData.colorIndex)) || (!(b.product.furnitureData.colorIndex)))) + if(((!(a.product.furnitureData.colorIndex)) || (!(b.product.furnitureData.colorIndex)))) { return 1; } - if (a.product.furnitureData.colorIndex > b.product.furnitureData.colorIndex) + if(a.product.furnitureData.colorIndex > b.product.furnitureData.colorIndex) { return 1; } - if (a == b) + if(a == b) { return 0; } return -1; - } + }; const sortyByFurnitureClassName = (a: IPurchasableOffer, b: IPurchasableOffer) => { - if (a.product.furnitureData.className > b.product.furnitureData.className) + if(a.product.furnitureData.className > b.product.furnitureData.className) { return 1; } - if (a == b) + if(a == b) { return 0; } return -1; - } + }; const selectOffer = (offer: IPurchasableOffer) => { offer.activate(); setCurrentOffer(offer); - } + }; const selectColor = (colorIndex: number, productName: string) => { const fullName = `${ productName }*${ colorIndex }`; const index = page.offers.findIndex(offer => offer.product.furnitureData.fullName === fullName); - if (index > -1) + if(index > -1) { selectOffer(page.offers[index]); } - } + }; const offers = useMemo(() => { @@ -100,7 +100,7 @@ export const CatalogLayoutColorGroupingView : FC - + { (!colorsShowing || !currentOffer || !colorableItems.has(currentOffer.product.furnitureData.className)) && - offers.map((offer, index) => ) + offers.map((offer, index) => ) } { (colorsShowing && currentOffer && colorableItems.has(currentOffer.product.furnitureData.className)) && - colorableItems.get(currentOffer.product.furnitureData.className).map((color, index) => selectColor(index, currentOffer.product.furnitureData.className) } />) + colorableItems.get(currentOffer.product.furnitureData.className).map((color, index) => selectColor(index, currentOffer.product.furnitureData.className) } />) } - + { !currentOffer && <> { !!page.localization.getImage(1) && } @@ -150,27 +150,27 @@ export const CatalogLayoutColorGroupingView : FC } { currentOffer && <> - +
- + { currentOffer.product.furnitureData.hasIndexedColor && - } - - - - { currentOffer.localizationName } - - +
+ + + { currentOffer.localizationName } +
+
- - - +
+ +
}
); -} +}; diff --git a/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx index e867ddc..4b86622 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx @@ -1,5 +1,5 @@ import { FC } from 'react'; -import { GetConfiguration, ProductTypeEnum } from '../../../../../api'; +import { GetConfigurationValue, ProductTypeEnum } from '../../../../../api'; import { Column, Flex, Grid, LayoutImage, Text } from '../../../../../common'; import { useCatalog } from '../../../../../hooks'; import { CatalogHeaderView } from '../../catalog-header/CatalogHeaderView'; @@ -20,15 +20,15 @@ export const CatalogLayoutDefaultView: FC = props => return ( <> - - { GetConfiguration('catalog.headers') && - } + + { GetConfigurationValue('catalog.headers') && + } - + { !currentOffer && <> - { !!page.localization.getImage(1) && + { !!page.localization.getImage(1) && } } @@ -43,14 +43,14 @@ export const CatalogLayoutDefaultView: FC = props => { (currentOffer.product.productType === ProductTypeEnum.BADGE) && }
- - { currentOffer.localizationName } - - + + { currentOffer.localizationName } +
+
- - - +
+ +
} @@ -58,4 +58,4 @@ export const CatalogLayoutDefaultView: FC = props => ); -} +}; diff --git a/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx index cf12951..20805ba 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx @@ -1,5 +1,5 @@ import { FC } from 'react'; -import { Base, Column, Flex, Grid, Text } from '../../../../../common'; +import { Column, Grid, Text } from '../../../../../common'; import { useCatalog } from '../../../../../hooks'; import { CatalogGuildBadgeWidgetView } from '../widgets/CatalogGuildBadgeWidgetView'; import { CatalogGuildSelectorWidgetView } from '../widgets/CatalogGuildSelectorWidgetView'; @@ -13,13 +13,13 @@ export const CatalogLayouGuildCustomFurniView: FC = props => { const { page = null } = props; const { currentOffer = null } = useCatalog(); - + return ( - + - + { !currentOffer && <> { !!page.localization.getImage(1) && } @@ -27,22 +27,22 @@ export const CatalogLayouGuildCustomFurniView: FC = props => } { currentOffer && <> - +
- - + +
{ currentOffer.localizationName } - +
- - +
+
- +
}
); -} +}; diff --git a/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx index b5a89ca..ed87f49 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx @@ -1,7 +1,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 { Column, Grid, Text } from '../../../../../common'; import { useCatalog } from '../../../../../hooks'; import { CatalogFirstProductSelectorWidgetView } from '../widgets/CatalogFirstProductSelectorWidgetView'; import { CatalogGuildSelectorWidgetView } from '../widgets/CatalogGuildSelectorWidgetView'; @@ -20,25 +20,25 @@ export const CatalogLayouGuildForumView: FC = props => { SendMessageComposer(new CatalogGroupsComposer()); }, [ page ]); - + return ( <> - - + +
- + { !!currentOffer && <> { currentOffer.localizationName } - +
- - +
+
- +
} @@ -46,4 +46,4 @@ export const CatalogLayouGuildForumView: FC = props => ); -} +}; diff --git a/src/components/catalog/views/page/layout/CatalogLayoutGuildFrontpageView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutGuildFrontpageView.tsx index d467aa4..44f66b8 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutGuildFrontpageView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutGuildFrontpageView.tsx @@ -1,6 +1,6 @@ +import { CreateLinkEvent } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { CreateLinkEvent, LocalizeText } from '../../../../../api'; -import { Base } from '../../../../../common/Base'; +import { LocalizeText } from '../../../../../api'; import { Button } from '../../../../../common/Button'; import { Column } from '../../../../../common/Column'; import { Grid } from '../../../../../common/Grid'; @@ -10,15 +10,15 @@ import { CatalogLayoutProps } from './CatalogLayout.types'; export const CatalogLayouGuildFrontpageView: FC = props => { const { page = null } = props; - + return ( - - - - + +
+
+
- + +
+ - +
); diff --git a/src/components/friends/views/friends-list/FriendsListSearchView.tsx b/src/components/friends/views/friends-list/FriendsListSearchView.tsx index 69073a2..fd53481 100644 --- a/src/components/friends/views/friends-list/FriendsListSearchView.tsx +++ b/src/components/friends/views/friends-list/FriendsListSearchView.tsx @@ -1,7 +1,7 @@ import { HabboSearchComposer, HabboSearchResultData, HabboSearchResultEvent } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { LocalizeText, OpenMessengerChat, SendMessageComposer } from '../../../../api'; -import { Base, Column, Flex, NitroCardAccordionItemView, NitroCardAccordionSetView, NitroCardAccordionSetViewProps, Text, UserProfileIconView } from '../../../../common'; +import { Column, NitroCardAccordionItemView, NitroCardAccordionSetView, NitroCardAccordionSetViewProps, Text, UserProfileIconView } from '../../../../common'; import { useFriends, useMessageEvent } from '../../../../hooks'; interface FriendsSearchViewProps extends NitroCardAccordionSetViewProps @@ -41,8 +41,8 @@ export const FriendsSearchView: FC = props => return ( - setSearchValue(event.target.value) } /> - + setSearchValue(event.target.value) } /> +
{ friendResults && <> { (friendResults.length === 0) && @@ -55,17 +55,17 @@ export const FriendsSearchView: FC = props => { friendResults.map(result => { return ( - - + +
{ result.avatarName }
- - +
+
{ result.isAvatarOnline && - OpenMessengerChat(result.avatarId) } title={ LocalizeText('friendlist.tip.im') } /> } - +
OpenMessengerChat(result.avatarId) } /> } +
- ) + ); }) } } @@ -82,22 +82,22 @@ export const FriendsSearchView: FC = props => { otherResults.map(result => { return ( - - + +
{ result.avatarName }
- - +
+
{ canRequestFriend(result.avatarId) && - requestFriend(result.avatarId, result.avatarName) } title={ LocalizeText('friendlist.tip.addfriend') } /> } - +
requestFriend(result.avatarId, result.avatarName) } /> } +
- ) + ); }) } } } - +
); -} +}; diff --git a/src/components/friends/views/friends-list/FriendsListView.tsx b/src/components/friends/views/friends-list/FriendsListView.tsx index 6d991d1..ef30f23 100644 --- a/src/components/friends/views/friends-list/FriendsListView.tsx +++ b/src/components/friends/views/friends-list/FriendsListView.tsx @@ -1,17 +1,16 @@ -import { ILinkEventTracker, RemoveFriendComposer, SendRoomInviteComposer } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, ILinkEventTracker, RemoveFriendComposer, RemoveLinkEventTracker, SendRoomInviteComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { AddEventLinkTracker, LocalizeText, MessengerFriend, RemoveLinkEventTracker, SendMessageComposer } from '../../../../api'; +import { LocalizeText, MessengerFriend, SendMessageComposer } from '../../../../api'; import { Button, Flex, NitroCardAccordionSetView, NitroCardAccordionView, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; import { useFriends } from '../../../../hooks'; -import { FriendsListGroupView } from './friends-list-group/FriendsListGroupView'; -import { FriendsListRequestView } from './friends-list-request/FriendsListRequestView'; import { FriendsRemoveConfirmationView } from './FriendsListRemoveConfirmationView'; import { FriendsRoomInviteView } from './FriendsListRoomInviteView'; import { FriendsSearchView } from './FriendsListSearchView'; +import { FriendsListGroupView } from './friends-list-group/FriendsListGroupView'; +import { FriendsListRequestView } from './friends-list-request/FriendsListRequestView'; export const FriendsListView: FC<{}> = props => { - const [ isFromSearchToolbar, setIsFromSearchToolbar ] = useState(false); const [ isVisible, setIsVisible ] = useState(false); const [ selectedFriendsIds, setSelectedFriendsIds ] = useState([]); const [ showRoomInvite, setShowRoomInvite ] = useState(false); @@ -50,7 +49,7 @@ export const FriendsListView: FC<{}> = props => if(existingUserIdIndex > -1) { - newValue.splice(existingUserIdIndex, 1) + newValue.splice(existingUserIdIndex, 1); } else { @@ -64,11 +63,11 @@ export const FriendsListView: FC<{}> = props => const sendRoomInvite = (message: string) => { if(!selectedFriendsIds.length || !message || !message.length || (message.length > 255)) return; - + SendMessageComposer(new SendRoomInviteComposer(message, selectedFriendsIds)); setShowRoomInvite(false); - } + }; const removeSelectedFriends = () => { @@ -82,7 +81,7 @@ export const FriendsListView: FC<{}> = props => }); setShowRemoveFriendsConfirmation(false); - } + }; useEffect(() => { @@ -92,20 +91,17 @@ export const FriendsListView: FC<{}> = props => const parts = url.split('/'); if(parts.length < 2) return; - + switch(parts[1]) { case 'show': setIsVisible(true); - setIsFromSearchToolbar(false); return; case 'hide': setIsVisible(false); - setIsFromSearchToolbar(false); return; case 'toggle': setIsVisible(prevValue => !prevValue); - setIsFromSearchToolbar(true); return; case 'request': if(parts.length < 4) return; @@ -116,7 +112,7 @@ export const FriendsListView: FC<{}> = props => eventUrlPrefix: 'friends/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, [ requestFriend ]); @@ -125,9 +121,9 @@ export const FriendsListView: FC<{}> = props => return ( <> - + setIsVisible(false) } /> - + @@ -139,16 +135,16 @@ export const FriendsListView: FC<{}> = props => { selectedFriendsIds && selectedFriendsIds.length > 0 && - + - } + } { showRoomInvite && - setShowRoomInvite(false) } sendRoomInvite={ sendRoomInvite } /> } - { showRemoveFriendsConfirmation && - setShowRemoveFriendsConfirmation(false) } removeSelectedFriends={ removeSelectedFriends } /> } + setShowRoomInvite(false) } /> } + { showRemoveFriendsConfirmation && + setShowRemoveFriendsConfirmation(false) } /> } ); -}; \ No newline at end of file +}; 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 03cd7e9..5096460 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,6 +1,6 @@ import { FC, MouseEvent, useState } from 'react'; import { LocalizeText, MessengerFriend, OpenMessengerChat } from '../../../../../api'; -import { Base, Flex, NitroCardAccordionItemView, UserProfileIconView } from '../../../../../common'; +import { NitroCardAccordionItemView, UserProfileIconView } from '../../../../../common'; import { useFriends } from '../../../../../hooks'; export const FriendsListGroupItemView: FC<{ friend: MessengerFriend, selected: boolean, selectFriend: (userId: number) => void }> = props => @@ -14,30 +14,30 @@ export const FriendsListGroupItemView: FC<{ friend: MessengerFriend, selected: b event.stopPropagation(); followFriend(friend); - } + }; const openMessengerChat = (event: MouseEvent) => { event.stopPropagation(); - + OpenMessengerChat(friend.id); - } + }; const openRelationship = (event: MouseEvent) => { event.stopPropagation(); setIsRelationshipOpen(true); - } + }; const clickUpdateRelationship = (event: MouseEvent, type: number) => { event.stopPropagation(); updateRelationship(friend, type); - + setIsRelationshipOpen(false); - } + }; const getCurrentRelationshipName = () => { @@ -50,36 +50,36 @@ export const FriendsListGroupItemView: FC<{ friend: MessengerFriend, selected: b case MessengerFriend.RELATIONSHIP_BOBBA: return 'bobba'; default: return 'none'; } - } + }; if(!friend) return null; return ( - selectFriend(friend.id) }> - - event.stopPropagation() }> + selectFriend(friend.id) }> +
+
event.stopPropagation() }> - +
{ friend.name }
- - +
+
{ !isRelationshipOpen && <> { friend.followingAllowed && - } +
} { friend.online && - } +
} { (friend.id > 0) && - } +
} } { isRelationshipOpen && <> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_HEART) } /> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_SMILE) } /> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_BOBBA) } /> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_NONE) } /> +
clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_HEART) } /> +
clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_SMILE) } /> +
clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_BOBBA) } /> +
clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_NONE) } /> } - +
); -} +}; 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 c593003..ffd4cde 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 @@ -18,6 +18,6 @@ export const FriendsListGroupView: FC = props => return ( <> { 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 de5d3a3..c06840e 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,6 +1,6 @@ import { FC } from 'react'; import { MessengerRequest } from '../../../../../api'; -import { Base, Flex, NitroCardAccordionItemView, UserProfileIconView } from '../../../../../common'; +import { NitroCardAccordionItemView, UserProfileIconView } from '../../../../../common'; import { useFriends } from '../../../../../hooks'; export const FriendsListRequestItemView: FC<{ request: MessengerRequest }> = props => @@ -11,15 +11,15 @@ export const FriendsListRequestItemView: FC<{ request: MessengerRequest }> = pro if(!request) return null; return ( - - + +
{ request.name }
- - - requestResponse(request.id, true) } /> - requestResponse(request.id, false) } /> - +
+
+
requestResponse(request.id, true) } /> +
requestResponse(request.id, false) } /> +
); -} +}; 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 5f6e991..686b32d 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,6 +1,6 @@ import { FC } from 'react'; import { LocalizeText } from '../../../../../api'; -import { Button, Column, Flex, NitroCardAccordionSetView, NitroCardAccordionSetViewProps } from '../../../../../common'; +import { Button, Column, NitroCardAccordionSetView, NitroCardAccordionSetViewProps } from '../../../../../common'; import { useFriends } from '../../../../../hooks'; import { FriendsListRequestItemView } from './FriendsListRequestItemView'; @@ -13,17 +13,17 @@ export const FriendsListRequestView: FC = props return ( - + { requests.map((request, index) => ) } - +
- +
{ children }
); -} +}; diff --git a/src/components/friends/views/messenger/FriendsMessengerView.tsx b/src/components/friends/views/messenger/FriendsMessengerView.tsx index 42123bc..354ddd5 100644 --- a/src/components/friends/views/messenger/FriendsMessengerView.tsx +++ b/src/components/friends/views/messenger/FriendsMessengerView.tsx @@ -1,9 +1,10 @@ -import { FollowFriendMessageComposer, ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, FollowFriendMessageComposer, GetSessionDataManager, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, KeyboardEvent, useEffect, useRef, useState } from 'react'; import { FaTimes } from 'react-icons/fa'; -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 { GetUserProfile, LocalizeText, ReportType, SendMessageComposer } from '../../../../api'; +import { Button, Column, Flex, Grid, LayoutAvatarImageView, LayoutBadgeImageView, LayoutGridItem, LayoutItemCountView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { useHelp, useMessenger } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { FriendsMessengerThreadView } from './messenger-thread/FriendsMessengerThreadView'; export const FriendsMessengerView: FC<{}> = props => @@ -25,14 +26,14 @@ export const FriendsMessengerView: FC<{}> = props => sendMessage(activeThread, GetSessionDataManager().userId, messageText); setMessageText(''); - } + }; const onKeyDown = (event: KeyboardEvent) => { if(event.key !== 'Enter') return; send(); - } + }; useEffect(() => { @@ -68,7 +69,7 @@ export const FriendsMessengerView: FC<{}> = props => eventUrlPrefix: 'friends-messenger/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, [ getMessageThread, setActiveThreadId ]); @@ -106,48 +107,53 @@ export const FriendsMessengerView: FC<{}> = props => if(!isVisible) return null; return ( - + setIsVisible(false) } /> - + { LocalizeText('toolbar.icon.label.messenger') } - - { visibleThreads && (visibleThreads.length > 0) && visibleThreads.map(thread => { +
+ { visibleThreads && (visibleThreads.length > 0) && visibleThreads.map(thread => + { return ( - setActiveThreadId(thread.threadId) }> - { thread.unread && } - - - 0 ? thread.participant.figure : thread.participant.id <= 0 && thread.participant.figure === 'ADM' ? 'ha-3409-1413-70.lg-285-89.ch-3032-1334-109.sh-3016-110.hd-185-1359.ca-3225-110-62.wa-3264-62-62.fa-1206-90.hr-3322-1403' : thread.participant.figure - } headOnly={true} direction={thread.participant.id > 0 ? 2 : 3} /> - - { thread.participant.name } - - + setActiveThreadId(thread.threadId) }> + { thread.unread && + } +
+
+ { (thread.participant.id > 0) && + } + { (thread.participant.id <= 0) && + } +
+ { thread.participant.name } +
+
); }) } - +
- + { activeThread && <> { LocalizeText('messenger.window.separator', [ 'FRIEND_NAME' ], [ activeThread.participant.name ]) } - - {activeThread && activeThread.participant.id > 0 && ( - - - - - - - - )} + +
+
+ + +
+ +
@@ -157,16 +163,16 @@ export const FriendsMessengerView: FC<{}> = props =>
- - setMessageText(event.target.value) } onKeyDown={ onKeyDown } /> +
+ setMessageText(event.target.value) } onKeyDown={ onKeyDown } /> - +
}
); -} \ No newline at end of file +}; diff --git a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx index 441100d..a6c35b4 100644 --- a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx +++ b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx @@ -1,5 +1,6 @@ +import { GetSessionDataManager } from '@nitrots/nitro-renderer'; import { FC, useMemo } from 'react'; -import { GetGroupChatData, GetSessionDataManager, LocalizeText, MessengerGroupType, MessengerThread, MessengerThreadChat, MessengerThreadChatGroup } from '../../../../../api'; +import { GetGroupChatData, LocalizeText, MessengerGroupType, MessengerThread, MessengerThreadChat, MessengerThreadChatGroup } from '../../../../../api'; import { Base, Flex, LayoutAvatarImageView } from '../../../../../common'; export const FriendsMessengerThreadGroup: FC<{ thread: MessengerThread, group: MessengerThreadChatGroup }> = props => @@ -11,7 +12,7 @@ export const FriendsMessengerThreadGroup: FC<{ thread: MessengerThread, group: M 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; @@ -20,7 +21,7 @@ export const FriendsMessengerThreadGroup: FC<{ thread: MessengerThread, group: M }, [ thread, group, groupChatData ]); if(!thread || !group) return null; - + if(!group.userId) { return ( @@ -29,14 +30,14 @@ export const FriendsMessengerThreadGroup: FC<{ thread: MessengerThread, group: M { return ( - + { (chat.type === MessengerThreadChat.SECURITY_NOTIFICATION) && - + { chat.message } } { (chat.type === MessengerThreadChat.ROOM_INVITE) && - + { (LocalizeText('messenger.invitation') + ' ') }{ chat.message } } @@ -47,32 +48,26 @@ export const FriendsMessengerThreadGroup: FC<{ thread: MessengerThread, group: M ); } - + return ( - + { ((group.type === MessengerGroupType.PRIVATE_CHAT) && !isOwnChat) && - } + } { (groupChatData && !isOwnChat) && - } + } - - { group.chats[0].date.toLocaleTimeString() } + { isOwnChat && GetSessionDataManager().userName } { !isOwnChat && (groupChatData ? groupChatData.username : thread.participant.name) } - - { group.chats.map((chat, index) => ( - - { chat.message } - - )) } + { 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 index 7562778..8636997 100644 --- a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx +++ b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx @@ -10,7 +10,7 @@ export const FriendsMessengerThreadView: FC<{ thread: MessengerThread }> = props return ( <> - { (thread.groups.length > 0) && thread.groups.map((group, index) => ) } + { (thread.groups.length > 0) && thread.groups.map((group, index) => ) } ); -} \ No newline at end of file +}; diff --git a/src/components/game-center/GameCenterView.scss b/src/components/game-center/GameCenterView.scss deleted file mode 100644 index 246278d..0000000 --- a/src/components/game-center/GameCenterView.scss +++ /dev/null @@ -1,44 +0,0 @@ -.game-center-stage { - width: 100%; - height: calc(100% - 55px); - background-color: black; - position: absolute; - inset: 0; -} -.game-center-main { - width: 1280px; - height: calc(100% - 55px); - background: #93d4f3; - - .game-view { - background-position: bottom center; - background-repeat: no-repeat; - - > div { - color: inherit; - } - } - - .gameList-container { - min-height: 107px; - - .game-icon { - width: 83px; - height: 83px; - background-position: center; - background-repeat: no-repeat; - - &.selected { - position: relative; - &::after { - content: ''; - background-image: url('@/assets/images/gamecenter/selectedIcon.png'); - width: 83px; - height: 83px; - position: absolute; - inset: 0; - } - } - } - } -} diff --git a/src/components/game-center/GameCenterView.tsx b/src/components/game-center/GameCenterView.tsx index f0955ae..3b398d5 100644 --- a/src/components/game-center/GameCenterView.tsx +++ b/src/components/game-center/GameCenterView.tsx @@ -1,29 +1,28 @@ -import { ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; import { useEffect } from 'react'; -import { AddEventLinkTracker, RemoveLinkEventTracker } from '../../api'; import { Flex } from '../../common'; import { useGameCenter } from '../../hooks'; import { GameListView } from './views/GameListView'; import { GameStageView } from './views/GameStageView'; import { GameView } from './views/GameView'; -export const GameCenterView = () => +export const GameCenterView = () => { - const{ isVisible, setIsVisible, games, accountStatus } = useGameCenter(); + const { isVisible, setIsVisible, games, accountStatus } = useGameCenter(); useEffect(() => { const toggleGameCenter = () => { setIsVisible(prev => !prev); - } + }; const linkTracker: ILinkEventTracker = { linkReceived: (url: string) => { const value = url.split('/'); - - switch(value[1]) + + switch(value[1]) { case 'toggle': toggleGameCenter(); @@ -33,18 +32,18 @@ export const GameCenterView = () => eventUrlPrefix: 'games/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ ]); + }, [ setIsVisible ]); if(!isVisible || !games || !accountStatus) return; - - return - + + return + - -} + ; +}; diff --git a/src/components/game-center/views/GameListView.tsx b/src/components/game-center/views/GameListView.tsx index 1211bc7..a6cced9 100644 --- a/src/components/game-center/views/GameListView.tsx +++ b/src/components/game-center/views/GameListView.tsx @@ -1,32 +1,31 @@ import { GameConfigurationData } from '@nitrots/nitro-renderer'; import { LocalizeText } from '../../../api'; -import { Base, Flex } from '../../../common'; import { useGameCenter } from '../../../hooks'; -export const GameListView = () => +export const GameListView = () => { - const { games,selectedGame, setSelectedGame } = useGameCenter(); + const { games, selectedGame, setSelectedGame } = useGameCenter(); - const getClasses = (game: GameConfigurationData) => + const getClasses = (game: GameConfigurationData) => { let classes = [ 'game-icon' ]; if(selectedGame === game) classes.push('selected'); return classes.join(' '); - } - - const getIconImage = (game: GameConfigurationData): string => - { - return `url(${ game.assetUrl }${ game.gameNameId }_icon.png)` - } + }; - return + const getIconImage = (game: GameConfigurationData): string => + { + return `url(${ game.assetUrl }${ game.gameNameId }_icon.png)`; + }; + + return
{ LocalizeText('gamecenter.game_list_title') } - - { games && games.map((game,index) => - setSelectedGame(game) } style={ { backgroundImage: getIconImage(game) } }/> +
+ { games && games.map((game, index) => +
setSelectedGame(game) } /> ) } - - -} +
+
; +}; diff --git a/src/components/game-center/views/GameStageView.tsx b/src/components/game-center/views/GameStageView.tsx index 0a26fea..06cd25f 100644 --- a/src/components/game-center/views/GameStageView.tsx +++ b/src/components/game-center/views/GameStageView.tsx @@ -1,16 +1,15 @@ import { Game2ExitGameMessageComposer } from '@nitrots/nitro-renderer'; import { useEffect, useRef, useState } from 'react'; import { SendMessageComposer } from '../../../api'; -import { Base } from '../../../common'; import { useGameCenter } from '../../../hooks'; -export const GameStageView = () => +export const GameStageView = () => { - const { gameURL,setGameURL } = useGameCenter(); + const { gameURL, setGameURL } = useGameCenter(); const [ loadTimes, setLoadTimes ] = useState(0); const ref = useRef(); - useEffect(()=> + useEffect(() => { if(!ref || ref && !ref.current) return; @@ -20,28 +19,28 @@ export const GameStageView = () => frame.src = gameURL; frame.classList.add('game-center-stage'); - frame.classList.add('h-100'); + frame.classList.add('h-full'); - frame.onload = () => - { - setLoadTimes(prev => prev += 1) - } + frame.onload = () => + { + setLoadTimes(prev => prev += 1); + }; ref.current.innerHTML = ''; ref.current.appendChild(frame); - },[ ref, gameURL ]); + }, [ ref, gameURL ]); - useEffect(()=> + useEffect(() => { - if(loadTimes > 1) + if(loadTimes > 1) { setGameURL(null); SendMessageComposer(new Game2ExitGameMessageComposer()); } - },[ loadTimes,setGameURL ]) + }, [ loadTimes, setGameURL ]); if(!gameURL) return null; - return -} + return
; +}; diff --git a/src/components/game-center/views/GameView.tsx b/src/components/game-center/views/GameView.tsx index a9d641f..c5d3561 100644 --- a/src/components/game-center/views/GameView.tsx +++ b/src/components/game-center/views/GameView.tsx @@ -1,58 +1,55 @@ import { Game2GetAccountGameStatusMessageComposer, GetGameStatusMessageComposer, JoinQueueMessageComposer } from '@nitrots/nitro-renderer'; import { useEffect } from 'react'; import { ColorUtils, LocalizeText, SendMessageComposer } from '../../../api'; -import { Base, Button, Flex, LayoutItemCountView, Text } from '../../../common'; +import { Button, Flex, LayoutItemCountView, Text } from '../../../common'; import { useGameCenter } from '../../../hooks'; -export const GameView = () => +export const GameView = () => { const { selectedGame, accountStatus } = useGameCenter(); useEffect(()=> { - if(selectedGame) + if(selectedGame) { SendMessageComposer(new GetGameStatusMessageComposer(selectedGame.gameId)); SendMessageComposer(new Game2GetAccountGameStatusMessageComposer(selectedGame.gameId)); } - },[ selectedGame ]) + },[ selectedGame ]); - const getBgColour = (): string => + const getBgColour = (): string => { - return ColorUtils.uintHexColor(selectedGame.bgColor) - } + return ColorUtils.uintHexColor(selectedGame.bgColor); + }; - const getBgImage = (): string => + const getBgImage = (): string => { - return `url(${ selectedGame.assetUrl }${ selectedGame.gameNameId }_theme.png)` - } + return `url(${ selectedGame.assetUrl }${ selectedGame.gameNameId }_theme.png)`; + }; - const getColor = () => + const getColor = () => { return ColorUtils.uintHexColor(selectedGame.textColor); - } + }; - const onPlay = () => + const onPlay = () => { SendMessageComposer(new JoinQueueMessageComposer(selectedGame.gameId)); - } + }; - return - + return + { LocalizeText(`gamecenter.${ selectedGame.gameNameId }.description_title`) } { (accountStatus.hasUnlimitedGames || accountStatus.freeGamesLeft > 0) && <> - } - { LocalizeText(`gamecenter.${ selectedGame.gameNameId }.description_content`) } + { LocalizeText(`gamecenter.${ selectedGame.gameNameId }.description_content`) } - - - - - -} +
+ ; +}; diff --git a/src/components/groups/GroupView.scss b/src/components/groups/GroupView.scss deleted file mode 100644 index 8882b93..0000000 --- a/src/components/groups/GroupView.scss +++ /dev/null @@ -1,190 +0,0 @@ -.nitro-group-tab-image { - width: 122px; - height: 68px; - background: url('@/assets/images/groups/creator_images.png') no-repeat; - - &.tab-1 { - background-position: 0px 0px; - width: 99px; - height: 50px; - } - - &.tab-2 { - background-position: -99px 0px; - width: 98px; - height: 62px; - } - - &.tab-3 { - background-position: 0px -50px; - width: 96px; - height: 45px; - } - - &.tab-4, - &.tab-5 { - background-position: 0px -95px; - width: 114px; - height: 61px; - } -} - -.group-information { - width: 100%; - height: 100%; - display: flex; - - .group-badge { - width: 78px; - height: 78px; - - .badge-image { - background-size: contain; - } - } - - .group-description { - height: 55px; - } -} - -.nitro-group-information-standalone { - width: 500px; -} - -.nitro-group-members { - width: 400px; - max-height: 380px; - - .nitro-group-members-list-grid { - - .member-list-item { - height: 50px; - max-height: 50px; - - .avatar-head { - position: relative; - overflow: hidden; - width: 40px; - height: 50px; - - .avatar-image { - position: absolute; - left: -25px; - top: -20px; - } - } - } - } -} - -.group-badge-preview { - width: 42px; - height: 42px; - background-color: $grid-bg-color; - - &.active { - border-color: $grid-active-border-color !important; - background-color: $grid-active-bg-color; - - &:before { - position: absolute; - content: ' '; - width: 0; - height: 0; - border-top: 10px solid white; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - bottom: -10px; - } - } -} - -.group-badge-color-swatch, -.group-badge-position-swatch { - position: relative; - border-radius: $border-radius; - width: 16px; - height: 16px; - background: $white; - border: 2px solid $white; - box-shadow: inset 3px 3px rgba(0, 0, 0, .1); - - &.active { - box-shadow: none; - } -} - -.group-badge-position-swatch { - box-shadow: inset 3px 3px rgba(0, 0, 0, .1); - - &.active { - background: $primary; - } -} - -.group-badge-color-swatch { - box-shadow: inset 2px 2px rgba(0, 0, 0, .2); -} - -.group-color-swatch { - width: 30px; - height: 40px; -} - -.nitro-group-manager { - height: $nitro-group-manager-height; - width: $nitro-group-manager-width; -} - -.nitro-group-creator { - height: $nitro-group-manager-height; - width: $nitro-group-manager-width; - - .creator-tabs { - - .tab { - position: relative; - margin-left: -6px; - background-image: url('@/assets/images/groups/creator_tabs.png'); - background-repeat: no-repeat; - - &:first-child { - margin-left: 0; - } - - &.tab-blue-flat { - width: 84px; - height: 24px; - background-position: 0px 0px; - - &.active { - height: 28px; - background-position: 0px -24px; - } - } - - &.tab-blue-arrow { - width: 83px; - height: 24px; - background-position: 0px -52px; - - &.active { - height: 28px; - background-position: 0px -76px; - } - } - - &.tab-yellow { - width: 133px; - height: 28px; - background-position: 0px -104px; - - &.active { - height: 33px; - background-position: 0px -132px; - } - } - } - } -} diff --git a/src/components/groups/GroupsView.tsx b/src/components/groups/GroupsView.tsx index bbaee28..0399861 100644 --- a/src/components/groups/GroupsView.tsx +++ b/src/components/groups/GroupsView.tsx @@ -1,6 +1,6 @@ -import { GroupPurchasedEvent, GroupSettingsComposer, ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, GroupPurchasedEvent, GroupSettingsComposer, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { AddEventLinkTracker, RemoveLinkEventTracker, SendMessageComposer, TryVisitRoom } from '../../api'; +import { SendMessageComposer, TryVisitRoom } from '../../api'; import { useGroup, useMessageEvent } from '../../hooks'; import { GroupCreatorView } from './views/GroupCreatorView'; import { GroupInformationStandaloneView } from './views/GroupInformationStandaloneView'; @@ -26,9 +26,9 @@ export const GroupsView: FC<{}> = props => linkReceived: (url: string) => { const parts = url.split('/'); - + if(parts.length < 2) return; - + switch(parts[1]) { case 'create': @@ -36,7 +36,7 @@ export const GroupsView: FC<{}> = props => return; case 'manage': if(!parts[2]) return; - + setCreatorVisible(false); SendMessageComposer(new GroupSettingsComposer(Number(parts[2]))); return; @@ -45,11 +45,11 @@ export const GroupsView: FC<{}> = props => eventUrlPrefix: 'groups/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); - + return ( <> { isCreatorVisible && diff --git a/src/components/groups/views/GroupBadgeCreatorView.tsx b/src/components/groups/views/GroupBadgeCreatorView.tsx index 8e32c92..3f2e905 100644 --- a/src/components/groups/views/GroupBadgeCreatorView.tsx +++ b/src/components/groups/views/GroupBadgeCreatorView.tsx @@ -1,7 +1,7 @@ import { Dispatch, FC, SetStateAction, useState } from 'react'; import { FaPlus, FaTimes } from 'react-icons/fa'; import { GroupBadgePart } from '../../../api'; -import { Base, Column, Flex, Grid, LayoutBadgeImageView } from '../../../common'; +import { Column, Flex, Grid, LayoutBadgeImageView } from '../../../common'; import { useGroup } from '../../../hooks'; interface GroupBadgeCreatorViewProps @@ -21,13 +21,13 @@ export const GroupBadgeCreatorView: FC = props => const setPartProperty = (partIndex: number, property: string, value: number) => { const newBadgeParts = [ ...badgeParts ]; - + newBadgeParts[partIndex][property] = value; setBadgeParts(newBadgeParts); - + if(property === 'key') setSelectedIndex(-1); - } + }; if(!badgeParts || !badgeParts.length) return null; @@ -36,43 +36,43 @@ export const GroupBadgeCreatorView: FC = props => { ((selectedIndex < 0) && badgeParts && (badgeParts.length > 0)) && badgeParts.map((part, index) => { return ( - - setSelectedIndex(index) }> + + 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) }> - }) } - } - + + { POSITIONS.map((position, posIndex) => + { + return
setPartProperty(index, 'position', position) } />; + }) } + } + { (groupCustomize.badgePartColors.length > 0) && groupCustomize.badgePartColors.map((item, colorIndex) => { - return setPartProperty(index, 'color', (colorIndex + 1)) }> + return
setPartProperty(index, 'color', (colorIndex + 1)) } />; }) } ); }) } { (selectedIndex >= 0) && - + { (badgeParts[selectedIndex].type === GroupBadgePart.SYMBOL) && - setPartProperty(selectedIndex, 'key', 0) }> - + setPartProperty(selectedIndex, 'key', 0) }> + } { ((badgeParts[selectedIndex].type === GroupBadgePart.BASE) ? groupCustomize.badgeBases : groupCustomize.badgeSymbols).map((item, index) => { return ( - setPartProperty(selectedIndex, 'key', item.id) }> + setPartProperty(selectedIndex, 'key', item.id) }> ); @@ -80,4 +80,4 @@ export const GroupBadgeCreatorView: FC = props => } ); -} +}; diff --git a/src/components/groups/views/GroupCreatorView.tsx b/src/components/groups/views/GroupCreatorView.tsx index cd64ef3..ee113ea 100644 --- a/src/components/groups/views/GroupCreatorView.tsx +++ b/src/components/groups/views/GroupCreatorView.tsx @@ -1,7 +1,7 @@ import { GroupBuyComposer, GroupBuyDataComposer, GroupBuyDataEvent } from '@nitrots/nitro-renderer'; 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 { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; import { useMessageEvent } from '../../../hooks'; import { GroupTabBadgeView } from './tabs/GroupTabBadgeView'; import { GroupTabColorsView } from './tabs/GroupTabColorsView'; @@ -30,7 +30,7 @@ export const GroupCreatorView: FC = props => setGroupData(null); if(onClose) onClose(); - } + }; const buyGroup = () => { @@ -49,7 +49,7 @@ export const GroupCreatorView: FC = props => }); SendMessageComposer(new GroupBuyComposer(groupData.groupName, groupData.groupDescription, groupData.groupHomeroomId, groupData.groupColors[0], groupData.groupColors[1], badge)); - } + }; const previousStep = () => { @@ -66,7 +66,7 @@ export const GroupCreatorView: FC = props => } setCurrentTab(value => value - 1); - } + }; const nextStep = () => { @@ -83,7 +83,7 @@ export const GroupCreatorView: FC = props => } setCurrentTab(value => (value === 4 ? value : value + 1)); - } + }; useMessageEvent(GroupBuyDataEvent, event => { @@ -111,52 +111,53 @@ export const GroupCreatorView: FC = props => groupColors: null, groupBadgeParts: null }); - + SendMessageComposer(new GroupBuyDataComposer()); }, [ setGroupData ]); if(!groupData) return null; return ( - + - +
{ TABS.map((tab, index) => { return ( - + { LocalizeText(`group.create.steplabel.${ tab }`) } ); }) } - +
- - +
+
{ LocalizeText(`group.create.stepcaption.${ currentTab }`) } { LocalizeText(`group.create.stepdesc.${ currentTab }`) } - +
{ (currentTab === 1) && - } + } { (currentTab === 2) && - } + } { (currentTab === 3) && - } + } { (currentTab === 4) && - } + } - - - +
diff --git a/src/components/groups/views/GroupInformationView.tsx b/src/components/groups/views/GroupInformationView.tsx index da6bdc8..d2f8a80 100644 --- a/src/components/groups/views/GroupInformationView.tsx +++ b/src/components/groups/views/GroupInformationView.tsx @@ -1,7 +1,7 @@ -import { GroupInformationParser, GroupRemoveMemberComposer } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent, GetSessionDataManager, GroupInformationParser, GroupRemoveMemberComposer } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -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, GetGroupManager, GetGroupMembers, GroupMembershipType, GroupType, LocalizeText, SendMessageComposer, TryJoinGroup, TryVisitRoom } from '../../../api'; +import { Button, Column, Grid, GridProps, LayoutBadgeImageView, Text } from '../../../common'; import { useNotification } from '../../../hooks'; const STATES: string[] = [ 'regular', 'exclusive', 'private' ]; @@ -30,18 +30,18 @@ export const GroupInformationView: FC = props => if(onClose) onClose(); }, null); - } + }; const getRoleIcon = () => { if(groupInformation.membershipType === GroupMembershipType.NOT_MEMBER || groupInformation.membershipType === GroupMembershipType.REQUEST_PENDING) return null; - if(isRealOwner) return ; + if(isRealOwner) return ; - if(groupInformation.isAdmin) return ; + if(groupInformation.isAdmin) return ; - return ; - } + return ; + }; const getButtonText = () => { @@ -56,7 +56,7 @@ export const GroupInformationView: FC = props => if(groupInformation.membershipType === GroupMembershipType.REQUEST_PENDING) return 'group.membershippending'; if((groupInformation.membershipType === GroupMembershipType.NOT_MEMBER) && groupInformation.type === GroupType.EXCLUSIVE) return 'group.requestmembership'; - } + }; const handleButtonClick = () => { @@ -70,7 +70,7 @@ export const GroupInformationView: FC = props => } joinGroup(); - } + }; const handleAction = (action: string) => { @@ -95,52 +95,52 @@ export const GroupInformationView: FC = props => CreateLinkEvent('navigator/search/groups'); break; } - } + }; if(!groupInformation) return null; return ( - - + +
- +
- handleAction('members') }>{ LocalizeText('group.membercount', [ 'totalMembers' ], [ groupInformation.membersCount.toString() ]) } + handleAction('members') }>{ LocalizeText('group.membercount', [ 'totalMembers' ], [ groupInformation.membersCount.toString() ]) } { (groupInformation.pendingRequestsCount > 0) && - handleAction('members_pending') }>{ LocalizeText('group.pendingmembercount', [ 'amount' ], [ groupInformation.pendingRequestsCount.toString() ]) } } + handleAction('members_pending') }>{ LocalizeText('group.pendingmembercount', [ 'amount' ], [ groupInformation.pendingRequestsCount.toString() ]) } } { groupInformation.isOwner && - handleAction('manage') }>{ LocalizeText('group.manage') } } + handleAction('manage') }>{ LocalizeText('group.manage') } } { getRoleIcon() }
- - - - +
+
+
+
{ groupInformation.title } - - +
+ { groupInformation.canMembersDecorate && - } - - + } +
+
{ LocalizeText('group.created', [ 'date', 'owner' ], [ groupInformation.createdAt, groupInformation.ownerName ]) } - - { groupInformation.description } - - - - handleAction('homeroom') }>{ LocalizeText('group.linktobase') } - handleAction('furniture') }>{ LocalizeText('group.buyfurni') } - handleAction('popular_groups') }>{ LocalizeText('group.showgroups') } - +
+ { groupInformation.description } +
+
+
+ handleAction('homeroom') }>{ LocalizeText('group.linktobase') } + handleAction('furniture') }>{ LocalizeText('group.buyfurni') } + handleAction('popular_groups') }>{ LocalizeText('group.showgroups') } +
{ (groupInformation.type !== GroupType.PRIVATE || groupInformation.type === GroupType.PRIVATE && groupInformation.membershipType === GroupMembershipType.MEMBER) && } - - +
+
); }; diff --git a/src/components/groups/views/GroupManagerView.tsx b/src/components/groups/views/GroupManagerView.tsx index 9e1d625..b8336ab 100644 --- a/src/components/groups/views/GroupManagerView.tsx +++ b/src/components/groups/views/GroupManagerView.tsx @@ -1,7 +1,7 @@ import { GroupBadgePart, GroupInformationEvent, GroupSettingsEvent } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; import { IGroupData, LocalizeText } from '../../../api'; -import { Base, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../common'; +import { Column, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../common'; import { useMessageEvent } from '../../../hooks'; import { GroupTabBadgeView } from './tabs/GroupTabBadgeView'; import { GroupTabColorsView } from './tabs/GroupTabColorsView'; @@ -26,14 +26,14 @@ export const GroupManagerView: FC<{}> = props => }); setGroupData(null); - } + }; const changeTab = (tab: number) => { if(closeAction && closeAction.action) closeAction.action(); setCurrentTab(tab); - } + }; useMessageEvent(GroupInformationEvent, event => { @@ -83,7 +83,7 @@ export const GroupManagerView: FC<{}> = props => }); if(!groupData || (groupData.groupId <= 0)) return null; - + return ( @@ -96,22 +96,22 @@ export const GroupManagerView: FC<{}> = props => }) } - - +
+
{ LocalizeText(`group.edit.tabcaption.${ currentTab }`) } { LocalizeText(`group.edit.tabdesc.${ currentTab }`) } - +
{ (currentTab === 1) && - } + } { (currentTab === 2) && - } + } { (currentTab === 3) && - } + } { (currentTab === 5) && - } + } diff --git a/src/components/groups/views/GroupMembersView.tsx b/src/components/groups/views/GroupMembersView.tsx index 366821e..af4d9ee 100644 --- a/src/components/groups/views/GroupMembersView.tsx +++ b/src/components/groups/views/GroupMembersView.tsx @@ -1,9 +1,10 @@ -import { GroupAdminGiveComposer, GroupAdminTakeComposer, GroupConfirmMemberRemoveEvent, GroupConfirmRemoveMemberComposer, GroupMemberParser, GroupMembersComposer, GroupMembersEvent, GroupMembershipAcceptComposer, GroupMembershipDeclineComposer, GroupMembersParser, GroupRank, GroupRemoveMemberComposer, ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, GetSessionDataManager, GroupAdminGiveComposer, GroupAdminTakeComposer, GroupConfirmMemberRemoveEvent, GroupConfirmRemoveMemberComposer, GroupMemberParser, GroupMembersComposer, GroupMembersEvent, GroupMembershipAcceptComposer, GroupMembershipDeclineComposer, GroupMembersParser, GroupRank, GroupRemoveMemberComposer, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { FaChevronLeft, FaChevronRight } from 'react-icons/fa'; -import { AddEventLinkTracker, GetSessionDataManager, GetUserProfile, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../../api'; -import { Base, Button, Column, Flex, Grid, LayoutAvatarImageView, LayoutBadgeImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; +import { GetUserProfile, LocalizeText, SendMessageComposer } from '../../../api'; +import { Button, Column, Flex, Grid, LayoutAvatarImageView, LayoutBadgeImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; import { useMessageEvent, useNotification } from '../../../hooks'; +import { classNames } from '../../../layout'; export const GroupMembersView: FC<{}> = props => { @@ -19,7 +20,7 @@ export const GroupMembersView: FC<{}> = props => const getRankDescription = (member: GroupMemberParser) => { if(member.rank === GroupRank.OWNER) return 'group.members.owner'; - + if(membersData.admin) { if(member.rank === GroupRank.ADMIN) return 'group.members.removerights'; @@ -28,7 +29,7 @@ export const GroupMembersView: FC<{}> = props => } return ''; - } + }; const refreshMembers = useCallback(() => { @@ -40,21 +41,21 @@ export const GroupMembersView: FC<{}> = props => const toggleAdmin = (member: GroupMemberParser) => { if(!membersData.admin || (member.rank === GroupRank.OWNER)) return; - + if(member.rank !== GroupRank.ADMIN) SendMessageComposer(new GroupAdminGiveComposer(membersData.groupId, member.id)); else SendMessageComposer(new GroupAdminTakeComposer(membersData.groupId, member.id)); refreshMembers(); - } + }; const acceptMembership = (member: GroupMemberParser) => { if(!membersData.admin || (member.rank !== GroupRank.REQUESTED)) return; - + SendMessageComposer(new GroupMembershipAcceptComposer(membersData.groupId, member.id)); refreshMembers(); - } + }; const removeMemberOrDeclineMembership = (member: GroupMemberParser) => { @@ -68,10 +69,10 @@ export const GroupMembersView: FC<{}> = props => return; } - + setRemovingMemberName(member.name); SendMessageComposer(new GroupConfirmRemoveMemberComposer(membersData.groupId, member.id)); - } + }; useMessageEvent(GroupMembersEvent, event => { @@ -92,7 +93,7 @@ export const GroupMembersView: FC<{}> = props => refreshMembers(); }, null); - + setRemovingMemberName(null); }); @@ -102,12 +103,12 @@ export const GroupMembersView: FC<{}> = props => 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); @@ -115,7 +116,7 @@ export const GroupMembersView: FC<{}> = props => eventUrlPrefix: 'group-members/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); @@ -140,60 +141,60 @@ export const GroupMembersView: FC<{}> = props => setMembersData(null); setTotalPages(0); setSearchQuery(''); - setRemovingMemberName(null); + setRemovingMemberName(null); }, [ groupId ]); if((groupId === -1) || !membersData) return null; return ( - + setGroupId(-1) } /> - +
- + - setSearchQuery(event.target.value) } /> - setSearchQuery(event.target.value) } /> + - - +
+ { membersData.result.map((member, index) => { return ( - -
GetUserProfile(member.id) }> - + +
GetUserProfile(member.id) }> +
- GetUserProfile(member.id) }>{ member.name } + GetUserProfile(member.id) }>{ member.name } { (member.rank !== GroupRank.REQUESTED) && - { LocalizeText('group.members.since', [ 'date' ], [ member.joinedAt ]) } } + { LocalizeText('group.members.since', [ 'date' ], [ member.joinedAt ]) } } - +
{ (member.rank !== GroupRank.REQUESTED) && - - toggleAdmin(member) } /> - } +
+
toggleAdmin(member) } /> +
} { membersData.admin && (member.rank === GroupRank.REQUESTED) && - - acceptMembership(member) }> - } + +
acceptMembership(member) } /> + } { membersData.admin && (member.rank !== GroupRank.OWNER) && (member.id !== GetSessionDataManager().userId) && - - removeMemberOrDeclineMembership(member) }> - } - + +
removeMemberOrDeclineMembership(member) } /> + } +
); }) } - + diff --git a/src/components/groups/views/GroupRoomInformationView.tsx b/src/components/groups/views/GroupRoomInformationView.tsx index 9ac0ca2..7be8a92 100644 --- a/src/components/groups/views/GroupRoomInformationView.tsx +++ b/src/components/groups/views/GroupRoomInformationView.tsx @@ -1,8 +1,8 @@ -import { DesktopViewEvent, GetGuestRoomResultEvent, GroupInformationComposer, GroupInformationEvent, GroupInformationParser, GroupRemoveMemberComposer, HabboGroupDeactivatedMessageEvent, RoomEntryInfoMessageEvent } from '@nitrots/nitro-renderer'; +import { DesktopViewEvent, GetGuestRoomResultEvent, GetSessionDataManager, GroupInformationComposer, GroupInformationEvent, GroupInformationParser, GroupRemoveMemberComposer, HabboGroupDeactivatedMessageEvent, RoomEntryInfoMessageEvent } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; import { FaChevronDown, FaChevronUp } from 'react-icons/fa'; -import { GetGroupInformation, GetGroupManager, GetSessionDataManager, GroupMembershipType, GroupType, LocalizeText, SendMessageComposer, TryJoinGroup } from '../../../api'; -import { Base, Button, Column, Flex, LayoutBadgeImageView, Text } from '../../../common'; +import { GetGroupInformation, GetGroupManager, GroupMembershipType, GroupType, LocalizeText, SendMessageComposer, TryJoinGroup } from '../../../api'; +import { Button, Flex, LayoutBadgeImageView, Text } from '../../../common'; import { useMessageEvent, useNotification } from '../../../hooks'; export const GroupRoomInformationView: FC<{}> = props => @@ -67,7 +67,7 @@ export const GroupRoomInformationView: FC<{}> = props => { SendMessageComposer(new GroupRemoveMemberComposer(groupInformation.id, GetSessionDataManager().userId)); }, null); - } + }; const isRealOwner = (groupInformation && (groupInformation.ownerName === GetSessionDataManager().userName)); @@ -84,7 +84,7 @@ export const GroupRoomInformationView: FC<{}> = props => if(groupInformation.membershipType === GroupMembershipType.REQUEST_PENDING) return 'group.membershippending'; if((groupInformation.membershipType === GroupMembershipType.NOT_MEMBER) && groupInformation.type === GroupType.EXCLUSIVE) return 'group.requestmembership'; - } + }; const handleButtonClick = () => { @@ -100,14 +100,14 @@ export const GroupRoomInformationView: FC<{}> = props => } TryJoinGroup(groupInformation.id); - } + }; if(!groupInformation) return null; return ( - - - setIsOpen(value => !value) }> +
+
+ setIsOpen(value => !value) }> { LocalizeText('group.homeroominfo.title') } { isOpen && } { !isOpen && } @@ -115,18 +115,18 @@ export const GroupRoomInformationView: FC<{}> = props => { isOpen && <> GetGroupInformation(groupInformation.id) }> - +
- +
{ groupInformation.title }
- { (groupInformation.type !== GroupType.PRIVATE || isRealOwner) && - } } - - +
+
); }; diff --git a/src/components/groups/views/tabs/GroupTabBadgeView.tsx b/src/components/groups/views/tabs/GroupTabBadgeView.tsx index 73d65c0..33c3cd3 100644 --- a/src/components/groups/views/tabs/GroupTabBadgeView.tsx +++ b/src/components/groups/views/tabs/GroupTabBadgeView.tsx @@ -28,7 +28,7 @@ export const GroupTabBadgeView: FC = props => badgeParts.forEach(part => (part.code && (badgeCode += part.code))); return badgeCode; - } + }; const saveBadge = useCallback(() => { @@ -55,12 +55,12 @@ export const GroupTabBadgeView: FC = props => badgeParts.forEach(part => { if(!part.code) return; - + badge.push(part.key); badge.push(part.color); badge.push(part.position); }); - + SendMessageComposer(new GroupSaveBadgeComposer(groupData.groupId, badge)); return true; @@ -69,7 +69,7 @@ export const GroupTabBadgeView: FC = props => useEffect(() => { if(groupData.groupBadgeParts) return; - + const badgeParts = [ new GroupBadgePart(GroupBadgePart.BASE, groupCustomize.badgeBases[0].id, groupCustomize.badgePartColors[0].id), new GroupBadgePart(GroupBadgePart.SYMBOL, 0, groupCustomize.badgePartColors[0].id), @@ -94,7 +94,7 @@ export const GroupTabBadgeView: FC = props => return; } - + setBadgeParts(groupData.groupBadgeParts); }, [ groupData ]); @@ -104,15 +104,15 @@ export const GroupTabBadgeView: FC = props => return () => setCloseAction(null); }, [ setCloseAction, saveBadge ]); - + return ( - + - + diff --git a/src/components/groups/views/tabs/GroupTabColorsView.tsx b/src/components/groups/views/tabs/GroupTabColorsView.tsx index 61f3c86..37a7fbf 100644 --- a/src/components/groups/views/tabs/GroupTabColorsView.tsx +++ b/src/components/groups/views/tabs/GroupTabColorsView.tsx @@ -1,8 +1,9 @@ import { GroupSaveColorsComposer } from '@nitrots/nitro-renderer'; import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; import { IGroupData, LocalizeText, SendMessageComposer } from '../../../../api'; -import { AutoGrid, Base, classNames, Column, Flex, Grid, Text } from '../../../../common'; +import { AutoGrid, Column, Grid, Text } from '../../../../common'; import { useGroup } from '../../../../hooks'; +import { classNames } from '../../../../layout'; interface GroupTabColorsViewProps { @@ -22,7 +23,7 @@ export const GroupTabColorsView: FC = props => if(colorIndex === 0) return groupCustomize.groupColorsA.find(color => (color.id === colors[colorIndex])).color; return groupCustomize.groupColorsB.find(color => (color.id === colors[colorIndex])).color; - } + }; const selectColor = (colorIndex: number, colorId: number) => { @@ -34,7 +35,7 @@ export const GroupTabColorsView: FC = props => return newColors; }); - } + }; const saveColors = useCallback(() => { @@ -55,7 +56,7 @@ export const GroupTabColorsView: FC = props => return true; } - + SendMessageComposer(new GroupSaveColorsComposer(groupData.groupId, colors[0], colors[1])); return true; @@ -81,7 +82,7 @@ export const GroupTabColorsView: FC = props => return; } - + setColors(groupData.groupColors); }, [ groupData ]); @@ -93,32 +94,32 @@ export const GroupTabColorsView: FC = props => }, [ setCloseAction, saveColors ]); if(!colors) return null; - + return ( - + { 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 3046038..9c76e25 100644 --- a/src/components/groups/views/tabs/GroupTabCreatorConfirmationView.tsx +++ b/src/components/groups/views/tabs/GroupTabCreatorConfirmationView.tsx @@ -1,6 +1,6 @@ import { Dispatch, FC, SetStateAction } from 'react'; import { IGroupData, LocalizeText } from '../../../../api'; -import { Base, Column, Flex, Grid, LayoutBadgeImageView, Text } from '../../../../common'; +import { Column, Flex, Grid, LayoutBadgeImageView, Text } from '../../../../common'; import { useGroup } from '../../../../hooks'; interface GroupTabCreatorConfirmationViewProps @@ -24,19 +24,19 @@ export const GroupTabCreatorConfirmationView: FC (part.code && (badgeCode += part.code))); return badgeCode; - } - + }; + const getGroupColor = (colorIndex: number) => { if(colorIndex === 0) return groupCustomize.groupColorsA.find(c => c.id === groupData.groupColors[colorIndex]).color; return groupCustomize.groupColorsB.find(c => c.id === groupData.groupColors[colorIndex]).color; - } + }; if(!groupData) return null; return ( - + { LocalizeText('group.create.confirm.guildbadge') } @@ -44,21 +44,21 @@ export const GroupTabCreatorConfirmationView: FC { LocalizeText('group.edit.color.guild.color') } - - - + +
+
- - - + +
+
{ groupData.groupName } { groupData.groupDescription } - +
{ LocalizeText('group.create.confirm.info') } - - +
+ { LocalizeText('group.create.confirm.buyinfo', [ 'amount' ], [ purchaseCost.toString() ]) }
diff --git a/src/components/groups/views/tabs/GroupTabIdentityView.tsx b/src/components/groups/views/tabs/GroupTabIdentityView.tsx index 025babb..11e3e96 100644 --- a/src/components/groups/views/tabs/GroupTabIdentityView.tsx +++ b/src/components/groups/views/tabs/GroupTabIdentityView.tsx @@ -1,50 +1,81 @@ -import { GroupDeleteComposer, GroupSaveInformationComposer } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { CreateLinkEvent, IGroupData, LocalizeText, SendMessageComposer } from '../../../../api'; -import { Base, Button, Column, Flex, Text } from '../../../../common'; -import { useNotification } from '../../../../hooks'; - -interface GroupTabIdentityViewProps +import { + CreateLinkEvent, + GroupDeleteComposer, + GroupSaveInformationComposer, +} from '@nitrots/nitro-renderer'; +import +{ + Dispatch, + FC, + SetStateAction, + useCallback, + useEffect, + useState, +} from 'react'; +import { IGroupData, LocalizeText, SendMessageComposer } from '../../../../api'; +import { Button, Column, Text } from '../../../../common'; +import { useNotification } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; + +interface GroupTabIdentityViewProps { groupData: IGroupData; setGroupData: Dispatch>; setCloseAction: Dispatch boolean }>>; onClose: () => void; isCreator?: boolean; - availableRooms?: { id: number, name: string }[]; + availableRooms?: { id: number; name: string }[]; } -export const GroupTabIdentityView: FC = props => +export const GroupTabIdentityView: FC = (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 { + 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; + if(!groupData || groupData.groupId <= 0) return; - showConfirm(LocalizeText('group.deleteconfirm.desc'), () => - { - SendMessageComposer(new GroupDeleteComposer(groupData.groupId)); - - if(onClose) onClose(); - }, 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(() => { if(!groupData || !groupName || !groupName.length) return false; - if((groupName === groupData.groupName) && (groupDescription === groupData.groupDescription)) return true; + if( + groupName === groupData.groupName && + groupDescription === groupData.groupDescription + ) + return true; if(groupData.groupId <= 0) { if(groupHomeroomId <= 0) return false; - setGroupData(prevValue => + setGroupData((prevValue) => { const newValue = { ...prevValue }; @@ -58,59 +89,115 @@ export const GroupTabIdentityView: FC = props => return true; } - SendMessageComposer(new GroupSaveInformationComposer(groupData.groupId, groupName, (groupDescription || ''))); + SendMessageComposer( + new GroupSaveInformationComposer( + groupData.groupId, + groupName, + groupDescription || '' + ) + ); return true; - }, [ groupData, groupName, groupDescription, groupHomeroomId, setGroupData ]); + }, [groupData, groupName, groupDescription, groupHomeroomId, setGroupData]); useEffect(() => { setGroupName(groupData.groupName || ''); setGroupDescription(groupData.groupDescription || ''); setGroupHomeroomId(groupData.groupHomeroomId); - }, [ groupData ]); + }, [groupData]); useEffect(() => { setCloseAction({ action: saveIdentity }); return () => setCloseAction(null); - }, [ setCloseAction, saveIdentity ]); + }, [setCloseAction, saveIdentity]); if(!groupData) return null; return ( - - - { LocalizeText('group.edit.name') } - setGroupName(event.target.value) } /> - - - { LocalizeText('group.edit.desc') } - - - + + +
); }; diff --git a/src/components/guide-tool/views/GuideToolUserFeedbackView.tsx b/src/components/guide-tool/views/GuideToolUserFeedbackView.tsx index 9ec7280..e76b669 100644 --- a/src/components/guide-tool/views/GuideToolUserFeedbackView.tsx +++ b/src/components/guide-tool/views/GuideToolUserFeedbackView.tsx @@ -15,29 +15,29 @@ export const GuideToolUserFeedbackView: FC = pro const giveFeedback = (recommend: boolean) => SendMessageComposer(new GuideSessionFeedbackMessageComposer(recommend)); return ( - - +
+ { userName } { LocalizeText('guide.help.request.user.feedback.guide.desc') } - + - +
{ LocalizeText('guide.help.request.user.feedback.closed.title') } { LocalizeText('guide.help.request.user.feedback.closed.desc') } - +
{ userName && (userName.length > 0) && <>
- - { LocalizeText('guide.help.request.user.feedback.question') } - +
+ { LocalizeText('guide.help.request.user.feedback.question') } +
- - +
+
} -
+
); }; diff --git a/src/components/guide-tool/views/GuideToolUserNoHelpersView.tsx b/src/components/guide-tool/views/GuideToolUserNoHelpersView.tsx index 6fcbfd5..9469e78 100644 --- a/src/components/guide-tool/views/GuideToolUserNoHelpersView.tsx +++ b/src/components/guide-tool/views/GuideToolUserNoHelpersView.tsx @@ -1,13 +1,13 @@ import { FC } from 'react'; import { LocalizeText } from '../../../api'; -import { Column, Text } from '../../../common'; +import { Text } from '../../../common'; export const GuideToolUserNoHelpersView: FC<{}> = props => { return ( - +
{ LocalizeText('guide.help.request.no_tour_guides.title') } { LocalizeText('guide.help.request.no_tour_guides.message') } - +
); -}; \ No newline at end of file +}; diff --git a/src/components/guide-tool/views/GuideToolUserPendingView.tsx b/src/components/guide-tool/views/GuideToolUserPendingView.tsx index 81faaff..d897ced 100644 --- a/src/components/guide-tool/views/GuideToolUserPendingView.tsx +++ b/src/components/guide-tool/views/GuideToolUserPendingView.tsx @@ -16,18 +16,18 @@ export const GuideToolUserPendingView: FC = props const cancelRequest = () => SendMessageComposer(new GuideSessionRequesterCancelsMessageComposer()); return ( - - +
+ { LocalizeText('guide.help.request.guide.accept.request.title') } { LocalizeText('guide.help.request.type.1') } - { helpRequestDescription } + { helpRequestDescription } - +
{ LocalizeText('guide.help.request.user.pending.info.title') } { LocalizeText('guide.help.request.user.pending.info.message') } { LocalizeText('guide.help.request.user.pending.info.waiting', [ 'waitingtime' ], [ helpRequestAverageTime.toString() ]) } - +
-
+
); }; diff --git a/src/components/guide-tool/views/GuideToolUserSomethingWrogView.tsx b/src/components/guide-tool/views/GuideToolUserSomethingWrogView.tsx index 1e8ec5e..6943379 100644 --- a/src/components/guide-tool/views/GuideToolUserSomethingWrogView.tsx +++ b/src/components/guide-tool/views/GuideToolUserSomethingWrogView.tsx @@ -1,12 +1,12 @@ import { FC } from 'react'; import { LocalizeText } from '../../../api'; -import { Column, Text } from '../../../common'; +import { Text } from '../../../common'; export const GuideToolUserSomethingWrogView: FC<{}> = props => { return ( - +
{ LocalizeText('guide.help.request.user.guide.disconnected.error.desc') } - +
); -}; \ No newline at end of file +}; diff --git a/src/components/guide-tool/views/GuideToolUserThanksView.tsx b/src/components/guide-tool/views/GuideToolUserThanksView.tsx index 4953b0f..cc74925 100644 --- a/src/components/guide-tool/views/GuideToolUserThanksView.tsx +++ b/src/components/guide-tool/views/GuideToolUserThanksView.tsx @@ -1,13 +1,13 @@ import { FC } from 'react'; import { LocalizeText } from '../../../api'; -import { Column, Text } from '../../../common'; +import { Text } from '../../../common'; export const GuideToolUserThanksView: FC<{}> = props => { return ( - +
{ LocalizeText('guide.help.request.user.thanks.info.title') } { LocalizeText('guide.help.request.user.thanks.info.desc') } - +
); }; diff --git a/src/components/hc-center/HcCenterView.scss b/src/components/hc-center/HcCenterView.scss deleted file mode 100644 index a6af9fa..0000000 --- a/src/components/hc-center/HcCenterView.scss +++ /dev/null @@ -1,44 +0,0 @@ -.nitro-hc-center { - width: 430px; - resize: none; - - .hc-logo { - width: 213px; - height: 37px; - background-image: url('@/assets/images/hc-center/hc_logo.gif'); - } - - .payday-special { - height: 128px; - } - - .payday { - width: 222px; - height: 150px; - background-image: url('@/assets/images/hc-center/payday.png'); - z-index: 3; - color: #6b3502; - } - - .clock { - width: 24px; - height: 24px; - background-image: url('@/assets/images/hc-center/clock.png'); - } - - .streak-info { - min-height: 64px; - line-height: 16px; - } - - .habbo-avatar { - z-index: 4; - } - - .benefits { - background-image: url('@/assets/images/hc-center/benefits.png'); - background-position: right top; - background-repeat: no-repeat; - height: 100%; - } -} diff --git a/src/components/hc-center/HcCenterView.tsx b/src/components/hc-center/HcCenterView.tsx index 2757016..206994e 100644 --- a/src/components/hc-center/HcCenterView.tsx +++ b/src/components/hc-center/HcCenterView.tsx @@ -1,8 +1,7 @@ -import { ClubGiftInfoEvent, FriendlyTime, GetClubGiftInfo, ILinkEventTracker, ScrGetKickbackInfoMessageComposer, ScrKickbackData, ScrSendKickbackInfoMessageEvent } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, ClubGiftInfoEvent, CreateLinkEvent, GetClubGiftInfo, ILinkEventTracker, RemoveLinkEventTracker, ScrGetKickbackInfoMessageComposer, ScrKickbackData, ScrSendKickbackInfoMessageEvent } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { OverlayTrigger, Popover } from 'react-bootstrap'; -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 { ClubStatus, FriendlyTime, GetClubBadge, GetConfigurationValue, LocalizeText, SendMessageComposer } from '../../api'; +import { Button, Column, Flex, LayoutAvatarImageView, LayoutBadgeImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; import { useInventoryBadges, useMessageEvent, usePurse, useSessionInfo } from '../../hooks'; @@ -26,7 +25,7 @@ export const HcCenterView: FC<{}> = props => } return FriendlyTime.shortFormat(((purse.clubPeriods * 31) + purse.clubDays) * 86400); - } + }; const getInfoText = () => { @@ -39,7 +38,7 @@ export const HcCenterView: FC<{}> = props => default: return LocalizeText(`hccenter.status.${ clubStatus }.info`); } - } + }; const getHcPaydayTime = () => (!kickbackData || 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() ]); @@ -85,7 +84,7 @@ export const HcCenterView: FC<{}> = props => eventUrlPrefix: 'habboUI/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); @@ -113,92 +112,88 @@ export const HcCenterView: FC<{}> = props => if(!isVisible) return null; 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.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.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/' + GetConfigurationValue('hc.center')['payday.habbopage']) }> + { LocalizeText('hccenter.special.infolink') } +
+ ); return ( - + setIsVisible(false) } /> - - + +
- - - - - +
+
+ +
- +
- + { LocalizeText('hccenter.status.' + clubStatus) } - - { GetConfiguration('hc.center')['payday.info'] && +
+ { GetConfigurationValue('hc.center')['payday.info'] &&

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

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

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

0 ? LocalizeText('hccenter.unclaimedgifts', [ 'unclaimedgifts' ], [ unclaimedGifts.toString() ]) : LocalizeText('hccenter.gift.info') } }>
-
} - { GetConfiguration('hc.center')['benefits.info'] && + { GetConfigurationValue('hc.center')['benefits.info'] &&
{ LocalizeText('hccenter.general.title') }
-
} ); -} +}; diff --git a/src/components/help/HelpView.scss b/src/components/help/HelpView.scss deleted file mode 100644 index abe4189..0000000 --- a/src/components/help/HelpView.scss +++ /dev/null @@ -1,18 +0,0 @@ -.nitro-help { - height: $help-height; - width: $help-width; - - .index-image { - background: url('@/assets/images/help/help_index.png'); - width: 126px; - height: 105px; - } -} - -.nitro-cfh-sanction-status { - width: 400px; -} - -.nitro-change-username { - width: 300px; -} diff --git a/src/components/help/HelpView.tsx b/src/components/help/HelpView.tsx index e0df417..87ec07d 100644 --- a/src/components/help/HelpView.tsx +++ b/src/components/help/HelpView.tsx @@ -1,16 +1,16 @@ -import { ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker, ReportState } from '../../api'; -import { Base, Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../common'; +import { LocalizeText, ReportState } from '../../api'; +import { Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../common'; 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'; import { SelectTopicView } from './views/SelectTopicView'; +import { NameChangeView } from './views/name-change/NameChangeView'; export const HelpView: FC<{}> = props => { @@ -21,7 +21,7 @@ export const HelpView: FC<{}> = props => { setActiveReport(null); setIsVisible(false); - } + }; useEffect(() => { @@ -29,9 +29,9 @@ export const HelpView: FC<{}> = props => linkReceived: (url: string) => { const parts = url.split('/'); - + if(parts.length < 2) return; - + switch(parts[1]) { case 'show': @@ -59,7 +59,7 @@ export const HelpView: FC<{}> = props => eventUrlPrefix: 'help/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); @@ -70,7 +70,7 @@ export const HelpView: FC<{}> = props => setIsVisible(true); }, [ activeReport ]); - + const CurrentStepView = () => { if(activeReport) @@ -91,7 +91,7 @@ export const HelpView: FC<{}> = props => } return ; - } + }; return ( <> @@ -100,10 +100,10 @@ export const HelpView: FC<{}> = props => - - + +
- + @@ -113,4 +113,4 @@ export const HelpView: FC<{}> = props => ); -} +}; diff --git a/src/components/help/views/DescribeReportView.tsx b/src/components/help/views/DescribeReportView.tsx index 5f231d3..1a4360b 100644 --- a/src/components/help/views/DescribeReportView.tsx +++ b/src/components/help/views/DescribeReportView.tsx @@ -1,6 +1,6 @@ import { FC, useState } from 'react'; import { LocalizeText, ReportState, ReportType } from '../../../api'; -import { Button, Column, Flex, Text } from '../../../common'; +import { Button, Flex, Text } from '../../../common'; import { useHelp } from '../../../hooks'; export const DescribeReportView: FC<{}> = props => @@ -18,7 +18,7 @@ export const DescribeReportView: FC<{}> = props => return { ...prevValue, message, currentStep }; }); - } + }; const back = () => { @@ -26,17 +26,17 @@ export const DescribeReportView: FC<{}> = props => { return { ...prevValue, currentStep: (prevValue.currentStep - 1) }; }); - } + }; return ( <> - +
{ LocalizeText('help.emergency.chat_report.subtitle') } { LocalizeText('help.cfh.input.text') } - - - + +
- +
); -} +}; diff --git a/src/components/mod-tools/views/tickets/CfhChatlogView.tsx b/src/components/mod-tools/views/tickets/CfhChatlogView.tsx index c8bdd7b..9923fa9 100644 --- a/src/components/mod-tools/views/tickets/CfhChatlogView.tsx +++ b/src/components/mod-tools/views/tickets/CfhChatlogView.tsx @@ -19,9 +19,9 @@ export const CfhChatlogView: FC = props => useMessageEvent(CfhChatlogEvent, event => { const parser = event.getParser(); - + if(!parser || parser.data.issueId !== issueId) return; - + setChatlogData(parser.data); }); @@ -38,4 +38,4 @@ export const CfhChatlogView: FC = props => ); -} +}; diff --git a/src/components/mod-tools/views/tickets/ModToolsIssueInfoView.tsx b/src/components/mod-tools/views/tickets/ModToolsIssueInfoView.tsx index 1179d41..7444a73 100644 --- a/src/components/mod-tools/views/tickets/ModToolsIssueInfoView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsIssueInfoView.tsx @@ -23,15 +23,15 @@ export const ModToolsIssueInfoView: FC = props => SendMessageComposer(new ReleaseIssuesMessageComposer([ issueId ])); onIssueInfoClosed(issueId); - } + }; const closeIssue = (resolutionType: number) => { SendMessageComposer(new CloseIssuesMessageComposer([ issueId ], resolutionType)); - onIssueInfoClosed(issueId) - } - + onIssueInfoClosed(issueId); + }; + return ( <> @@ -57,23 +57,23 @@ export const ModToolsIssueInfoView: FC = props => Caller - openUserInfo(ticket.reporterUserId) }>{ ticket.reporterUserName } + openUserInfo(ticket.reporterUserId) }>{ ticket.reporterUserName } Reported User - openUserInfo(ticket.reportedUserId) }>{ ticket.reportedUserName } + openUserInfo(ticket.reportedUserId) }>{ ticket.reportedUserName } - + - + @@ -83,4 +83,4 @@ export const ModToolsIssueInfoView: FC = props => setcfhChatlogOpen(false) }/> } ); -} +}; diff --git a/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx b/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx index 2e1827a..a8de00e 100644 --- a/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx @@ -1,7 +1,7 @@ import { IssueMessageData, ReleaseIssuesMessageComposer } from '@nitrots/nitro-renderer'; import { FC } from 'react'; import { SendMessageComposer } from '../../../../api'; -import { Base, Button, Column, Grid } from '../../../../common'; +import { Button, Column, Grid } from '../../../../common'; interface ModToolsMyIssuesTabViewProps { @@ -16,32 +16,32 @@ export const ModToolsMyIssuesTabView: FC = props = return ( - - Type - Room/Player - Opened - - + +
Type
+
Room/Player
+
Opened
+
+
- + { myIssues && (myIssues.length > 0) && myIssues.map(issue => { return ( - - { issue.categoryId } - { issue.reportedUserName } - { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } - + +
{ issue.categoryId }
+
{ issue.reportedUserName }
+
{ new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() }
+
- - +
+
- +
); }) }
); -} +}; diff --git a/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx b/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx index 6ee23cd..17e4901 100644 --- a/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx @@ -1,7 +1,7 @@ import { IssueMessageData, PickIssuesMessageComposer } from '@nitrots/nitro-renderer'; import { FC } from 'react'; import { SendMessageComposer } from '../../../../api'; -import { Base, Button, Column, Grid } from '../../../../common'; +import { Button, Column, Grid } from '../../../../common'; interface ModToolsOpenIssuesTabViewProps { @@ -15,28 +15,28 @@ export const ModToolsOpenIssuesTabView: FC = pro return ( - - Type - Room/Player - Opened - + +
Type
+
Room/Player
+
Opened
+
- + { openIssues && (openIssues.length > 0) && openIssues.map(issue => { return ( - - { issue.categoryId } - { issue.reportedUserName } - { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } - + +
{ issue.categoryId }
+
{ issue.reportedUserName }
+
{ new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() }
+
- +
); }) }
); -} +}; diff --git a/src/components/mod-tools/views/tickets/ModToolsPickedIssuesTabView.tsx b/src/components/mod-tools/views/tickets/ModToolsPickedIssuesTabView.tsx index 19b899b..ca6003e 100644 --- a/src/components/mod-tools/views/tickets/ModToolsPickedIssuesTabView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsPickedIssuesTabView.tsx @@ -1,6 +1,6 @@ import { IssueMessageData } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { Base, Column, Grid } from '../../../../common'; +import { Column, Grid } from '../../../../common'; interface ModToolsPickedIssuesTabViewProps { @@ -10,30 +10,30 @@ interface ModToolsPickedIssuesTabViewProps export const ModToolsPickedIssuesTabView: FC = props => { const { pickedIssues = null } = props; - + return ( - - Type - Room/Player - Opened - Picker + +
Type
+
Room/Player
+
Opened
+
Picker
- + { pickedIssues && (pickedIssues.length > 0) && pickedIssues.map(issue => { return ( - - { issue.categoryId } - { issue.reportedUserName } - { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } - { issue.pickerUserName } + +
{ issue.categoryId }
+
{ issue.reportedUserName }
+
{ new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() }
+
{ issue.pickerUserName }
); }) }
); -} +}; diff --git a/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx b/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx index d6597da..ab7ac35 100644 --- a/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx @@ -1,6 +1,5 @@ -import { IssueMessageData } from '@nitrots/nitro-renderer'; +import { GetSessionDataManager, IssueMessageData } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; -import { GetSessionDataManager } from '../../../../api'; import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../../../common'; import { useModTools } from '../../../../hooks'; import { ModToolsIssueInfoView } from './ModToolsIssueInfoView'; @@ -41,7 +40,7 @@ export const ModToolsTicketsView: FC = props => return newValue; }); - } + }; const handleIssue = (issueId: number) => { @@ -54,20 +53,20 @@ export const ModToolsTicketsView: FC = props => else newValue.splice(existingIndex, 1); return newValue; - }) - } + }); + }; const CurrentTabComponent = () => { switch(currentTab) { case 0: return ; - case 1: return ; + case 1: return ; case 2: return ; } return null; - } + }; return ( <> @@ -88,4 +87,4 @@ export const ModToolsTicketsView: FC = props => { issueInfoWindows && (issueInfoWindows.length > 0) && issueInfoWindows.map(issueId => ) } ); -} +}; diff --git a/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx b/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx index 7bfb2e1..acae308 100644 --- a/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx @@ -35,10 +35,10 @@ export const ModToolsUserChatlogView: FC = props = return ( - + { userChatlog && } ); -} +}; diff --git a/src/components/mod-tools/views/user/ModToolsUserModActionView.tsx b/src/components/mod-tools/views/user/ModToolsUserModActionView.tsx index bd4c2d5..2dcdd3e 100644 --- a/src/components/mod-tools/views/user/ModToolsUserModActionView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserModActionView.tsx @@ -1,7 +1,7 @@ import { CallForHelpTopicData, DefaultSanctionMessageComposer, ModAlertMessageComposer, ModBanMessageComposer, ModKickMessageComposer, ModMessageMessageComposer, ModMuteMessageComposer, ModTradingLockMessageComposer } from '@nitrots/nitro-renderer'; import { FC, useMemo, useState } from 'react'; import { ISelectedUser, LocalizeText, ModActionDefinition, NotificationAlertType, SendMessageComposer } from '../../../../api'; -import { Button, Column, DraggableWindowPosition, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; +import { Button, DraggableWindowPosition, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { useModTools, useNotification } from '../../../../hooks'; interface ModToolsUserModActionViewProps @@ -64,9 +64,9 @@ export const ModToolsUserModActionView: FC = pro const messageOrDefault = (message.trim().length === 0) ? LocalizeText(`help.cfh.topic.${ category.id }`) : message; SendMessageComposer(new DefaultSanctionMessageComposer(user.userId, selectedTopic, messageOrDefault)); - + onCloseClick(); - } + }; const sendSanction = () => { @@ -83,7 +83,7 @@ export const ModToolsUserModActionView: FC = pro if(errorMessage) { sendAlert(errorMessage); - + return; } @@ -102,7 +102,7 @@ export const ModToolsUserModActionView: FC = pro SendMessageComposer(new ModAlertMessageComposer(user.userId, messageOrDefault, category.id)); break; } - case ModActionDefinition.MUTE: + case ModActionDefinition.MUTE: SendMessageComposer(new ModMuteMessageComposer(user.userId, messageOrDefault, category.id)); break; case ModActionDefinition.BAN: { @@ -146,7 +146,7 @@ export const ModToolsUserModActionView: FC = pro } onCloseClick(); - } + }; if(!user) return null; @@ -155,22 +155,22 @@ export const ModToolsUserModActionView: FC = pro onCloseClick() } /> - +
Optional message type, overrides default - + ); -} +}; diff --git a/src/components/mod-tools/views/user/ModToolsUserView.tsx b/src/components/mod-tools/views/user/ModToolsUserView.tsx index 4454a0c..6f65700 100644 --- a/src/components/mod-tools/views/user/ModToolsUserView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserView.tsx @@ -1,6 +1,6 @@ -import { FriendlyTime, GetModeratorUserInfoMessageComposer, ModeratorUserInfoData, ModeratorUserInfoEvent } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent, GetModeratorUserInfoMessageComposer, ModeratorUserInfoData, ModeratorUserInfoEvent } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useState } from 'react'; -import { CreateLinkEvent, LocalizeText, SendMessageComposer } from '../../../../api'; +import { FriendlyTime, LocalizeText, SendMessageComposer } from '../../../../api'; import { Button, Column, DraggableWindowPosition, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; import { useMessageEvent } from '../../../../hooks'; import { ModToolsUserModActionView } from './ModToolsUserModActionView'; @@ -89,9 +89,9 @@ export const ModToolsUserView: FC = props => useMessageEvent(ModeratorUserInfoEvent, event => { const parser = event.getParser(); - + if(!parser || parser.data.userId !== userId) return; - + setUserInfo(parser.data); }); @@ -108,7 +108,7 @@ export const ModToolsUserView: FC = props => onCloseClick() } /> - + { userProperties.map( (property, index) => @@ -128,7 +128,7 @@ export const ModToolsUserView: FC = props =>
- + @@ -153,4 +153,4 @@ export const ModToolsUserView: FC = props => setRoomVisitsVisible(false) } /> } ); -} +}; diff --git a/src/components/navigator/NavigatorView.scss b/src/components/navigator/NavigatorView.scss deleted file mode 100644 index 18b40e0..0000000 --- a/src/components/navigator/NavigatorView.scss +++ /dev/null @@ -1,295 +0,0 @@ -.nitro-navigator { - height: $navigator-height; - min-width: $navigator-width; - max-width: $navigator-width; - min-height: $navigator-min-height; - - &.expanded { - max-width: $navigator-width + 153px; - min-width: $navigator-width + 153px; - } - - .nav-form { - width: 275px; - } - - .navigator-grid { - - - &:not(.two-columns) { - - .navigator-item { - - &:nth-child(odd) { - background-color: #daecfd; - } - - &:nth-child(even) { - background-color: #fff; - } - - - } - } - - &.two-columns { - - .navigator-item { - - &:nth-child(4n-2), - &:nth-child(4n-3) { - background: $grid-active-bg-color; - } - } - } - } -} - -.nitro-navigator-doorbell, -.nitro-navigator-password { - width: 300px; -} - -.nitro-room-info { - width: $room-info-width; - resize: none; -} - -.text-tag { - font-size: 10px; - background-color: #CEE9FA; -} - -.text-tag:hover { - background-color: #449FCF; -} - -.text-embed { - font-size: 10px; -} - -.nitro-room-link { - width: 400px; -} - -.nitro-room-settings { - width: 400px; - - .list-container { - height: 100px; - - .list-item { - background-color: $grid-active-bg-color; - } - } -} - - -.badge-empty { - background-image: url('@/assets/images/navigator/badge_empty.png'); - background-repeat: no-repeat; - width: 40px; - height: 19px; - color: #fff; -} - -.badge-success { - background-image: url('@/assets/images/navigator/badge_success.png'); - background-repeat: no-repeat; - width: 40px; - height: 19px; - color: #fff; -} - -.badge-danger { - background-image: url('@/assets/images/navigator/badge_danger.png'); - background-repeat: no-repeat; - width: 40px; - height: 19px; - color: #fff; -} - -.badge-warning { - background-image: url('@/assets/images/navigator/badge_warning.png'); - background-repeat: no-repeat; - width: 40px; - height: 19px; - color: #fff; -} - -.nav-category { - font-size: 12px; - color: #2b577b; - font-size: var(--bs-body-font-size); -} - -.nav-icons { - color: #7dd8f6; -} - -.minus-icon { - background-image: url('@/assets/images/navigator/minus.png'); - background-repeat: no-repeat; - width: 18px; - height: 18px; -} - -.plus-icon { - background-image: url('@/assets/images/navigator/plus.png'); - background-repeat: no-repeat; - width: 18px; - height: 18px; -} - -.nav-avatar-icon { - background-image: url('@/assets/images/navigator/avatar_icon.png'); - background-repeat: no-repeat; - height: 8px; - width: 7px; -} - -.nav-thumbnail { - border-image-source: url('@/assets/images/navigator/thumbnail_bg.png'); - border-image-slice: 7 7 7 7 fill; - border-image-width: 7px 7px 7px 7px; -} - -.nav-create-room { - background-image: url('@/assets/images/navigator/create_room.png'); - background-repeat: no-repeat; - height: 60px; - width: 189px; - float: left; - cursor: pointer; -} - -.nav-random-room { - background-image: url('@/assets/images/navigator/random_room.png'); - background-repeat: no-repeat; - height: 60px; - width: 189px; - float: right; - margin-left: 15px; - cursor: pointer; -} - -.nav-promote-room { - background-image: url('@/assets/images/navigator/promote_room.png'); - background-repeat: no-repeat; - height: 60px; - width: 189px; - float: right; - margin-left: 15px; - cursor: pointer; -} - -.nav-bottom { - max-height: 80px; - min-height: 80px; -} - -.nav-bottom-buttons { - bottom: 18px; - left: 10px; -} - -.nav-bottom-buttons-text { - font-size: 12px; - - padding-top: 22px; - margin-left: 86px; -} - -.nitro-room-creator { - width: $nitro-room-creator-width; - height: $nitro-room-creator-height; - - textarea:focus, input:focus { - outline: none; - } - - .room-creator-form-name { - height: 20px; - border: 1px solid grey; - } - - .room-creator-form-desc { - height: 60px; - border: 1px solid grey; - } - - .headline { - } - - .content-area { - font-size: 12px; - } - - .room-creator-info { - width: 240px; - } - - .form-select { - width: 100%; - } - - .room-creator-grid { - width: 305px; - } - -} - -.room-info { - width: 275px; - color: #000; - image-rendering: pixelated; - - .room-info-bg { - border-image-source: url('@/assets/images/navigator/white_bg.png'); - border-image-slice: 6 6 6 6 fill; - border-image-width: 6px 6px 6px 6px; - } - -} - -.navigator-search-button { - right: 10px; - top: 11px; -} - -.button-search-saves { - padding: 4px; - height: 17px; - margin-top: -1px; - font-size: 10px; - border-radius: 4px; - background-color: #FAA700; -} - -.nitro-navigator-search-saves-result { - background-color: #fff; - width: 141px; - min-height: 494px; - max-height: 350px; - border-radius: 10px; - - .bg-orange { - background-color: #FAA700; - } -} - -.nitro-navigator-search-delete { - cursor: pointer; - background-image: url("@/assets/images/navigator/saves-search/delete_search.png"); - width: 18px; - height: 18px; - - &:hover { - background-image: url("@/assets/images/navigator/saves-search/delete_search_hover.png"); - - &:active { - background-image: url("@/assets/images/navigator/saves-search/delete_search_click.png"); - } - - } -} diff --git a/src/components/navigator/NavigatorView.tsx b/src/components/navigator/NavigatorView.tsx index 3f1b97b..813c390 100644 --- a/src/components/navigator/NavigatorView.tsx +++ b/src/components/navigator/NavigatorView.tsx @@ -1,15 +1,15 @@ -import { ConvertGlobalRoomIdMessageComposer, FindNewFriendsMessageComposer, HabboWebTools, ILinkEventTracker, LegacyExternalInterface, NavigatorInitComposer, NavigatorSearchComposer, RoomSessionEvent } from '@nitrots/nitro-renderer'; +import { NitroCard } from '@layout/NitroCard'; +import { AddLinkEventTracker, ConvertGlobalRoomIdMessageComposer, HabboWebTools, ILinkEventTracker, LegacyExternalInterface, NavigatorInitComposer, NavigatorSearchComposer, RemoveLinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useRef, useState } from 'react'; -import { AddEventLinkTracker, CreateLinkEvent, LocalizeText, RemoveLinkEventTracker, SendMessageComposer, TryVisitRoom } from '../../api'; -import { Base, Column, Flex, LayoutSearchSavesView, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../common'; -import { useNavigator, useRoomSessionManagerEvent } from '../../hooks'; +import { FaPlus } from 'react-icons/fa'; +import { LocalizeText, SendMessageComposer, TryVisitRoom } from '../../api'; +import { useNavigator, useNitroEvent } from '../../hooks'; import { NavigatorDoorStateView } from './views/NavigatorDoorStateView'; import { NavigatorRoomCreatorView } from './views/NavigatorRoomCreatorView'; import { NavigatorRoomInfoView } from './views/NavigatorRoomInfoView'; import { NavigatorRoomLinkView } from './views/NavigatorRoomLinkView'; import { NavigatorRoomSettingsView } from './views/room-settings/NavigatorRoomSettingsView'; import { NavigatorSearchResultView } from './views/search/NavigatorSearchResultView'; -import { NavigatorSearchSavesResultView } from './views/search/NavigatorSearchSavesResultView'; import { NavigatorSearchView } from './views/search/NavigatorSearchView'; export const NavigatorView: FC<{}> = props => @@ -19,15 +19,14 @@ export const NavigatorView: FC<{}> = props => const [ isCreatorOpen, setCreatorOpen ] = useState(false); const [ isRoomInfoOpen, setRoomInfoOpen ] = useState(false); const [ isRoomLinkOpen, setRoomLinkOpen ] = useState(false); - const [ isOpenSavesSearchs, setIsOpenSavesSearchs ] = useState(false); const [ isLoading, setIsLoading ] = useState(false); const [ needsInit, setNeedsInit ] = useState(true); const [ needsSearch, setNeedsSearch ] = useState(false); - const { searchResult = null, topLevelContext = null, topLevelContexts = null, navigatorData = null, navigatorSearches = null } = useNavigator(); + const { searchResult = null, topLevelContext = null, topLevelContexts = null, navigatorData = null } = useNavigator(); const pendingSearch = useRef<{ value: string, code: string }>(null); const elementRef = useRef(); - useRoomSessionManagerEvent(RoomSessionEvent.CREATED, event => + useNitroEvent(RoomSessionEvent.CREATED, event => { setIsVisible(false); setCreatorOpen(false); @@ -35,6 +34,8 @@ export const NavigatorView: FC<{}> = props => const sendSearch = useCallback((searchValue: string, contextCode: string) => { + setCreatorOpen(false); + SendMessageComposer(new NavigatorSearchComposer(contextCode, searchValue)); setIsLoading(true); @@ -125,12 +126,9 @@ export const NavigatorView: FC<{}> = props => } return; case 'create': - setCreatorOpen(value => !value); + setIsVisible(true); + setCreatorOpen(true); return; - case 'close-creator': - setCreatorOpen(false); - return; - case 'search': if(parts.length > 2) { @@ -151,7 +149,7 @@ export const NavigatorView: FC<{}> = props => eventUrlPrefix: 'navigator/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, [ isVisible, navigatorData ]); @@ -198,68 +196,45 @@ export const NavigatorView: FC<{}> = props => return ( <> { isVisible && - - CreateLinkEvent('habbopages/navigator') } onCloseClick={ event => setIsVisible(false) } /> - - - setIsOpenSavesSearchs(prevValue => !prevValue) } /> - + + setIsVisible(false) } /> + { topLevelContexts && (topLevelContexts.length > 0) && topLevelContexts.map((context, index) => { return ( - sendSearch('', context.code) }> + sendSearch('', context.code) }> { LocalizeText(('navigator.toplevelview.' + context.code)) } - + ); }) } - - - { isLoading && } - - - { isOpenSavesSearchs && - - - - } - - - - { (searchResult && searchResult.results.map((result, index) => )) } - - - - setCreatorOpen(value => !value) }> - - { LocalizeText('navigator.createroom.create') } - - - { (searchResult?.code !== 'myworld_view' && searchResult?.code !== 'roomads_view') && - SendMessageComposer(new FindNewFriendsMessageComposer()) }> - - { LocalizeText('navigator.random.room') } - - - } - { (searchResult?.code === 'myworld_view' || searchResult?.code === 'roomads_view') && - CreateLinkEvent('catalog/open/room_event') }> - - { LocalizeText('navigator.promote.room') } - - - } - - - - - - - } - { isCreatorOpen && } + setCreatorOpen(true) }> + + + + + { !isCreatorOpen && + <> + +
+ { (searchResult && searchResult.results.map((result, index) => )) } +
+ } + { isCreatorOpen && } +
+ } { isRoomInfoOpen && setRoomInfoOpen(false) } /> } { isRoomLinkOpen && setRoomLinkOpen(false) } /> } ); -} +}; diff --git a/src/components/navigator/views/NavigatorDoorStateView.tsx b/src/components/navigator/views/NavigatorDoorStateView.tsx index ba7e125..0dcaa45 100644 --- a/src/components/navigator/views/NavigatorDoorStateView.tsx +++ b/src/components/navigator/views/NavigatorDoorStateView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; import { CreateRoomSession, DoorStateType, GoToDesktop, LocalizeText } from '../../../api'; -import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; +import { Button, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; import { useNavigator } from '../../../hooks'; +import { NitroInput } from '../../../layout'; const VISIBLE_STATES = [ DoorStateType.START_DOORBELL, DoorStateType.STATE_WAITING, DoorStateType.STATE_NO_ANSWER, DoorStateType.START_PASSWORD, DoorStateType.STATE_WRONG_PASSWORD ]; const DOORBELL_STATES = [ DoorStateType.START_DOORBELL, DoorStateType.STATE_WAITING, DoorStateType.STATE_NO_ANSWER ]; @@ -17,14 +18,14 @@ export const NavigatorDoorStateView: FC<{}> = props => if(doorData && (doorData.state === DoorStateType.STATE_WAITING)) GoToDesktop(); setDoorData(null); - } + }; const ring = () => { if(!doorData || !doorData.roomInfo) return; CreateRoomSession(doorData.roomInfo.roomId); - + setDoorData(prevValue => { const newValue = { ...prevValue }; @@ -33,7 +34,7 @@ export const NavigatorDoorStateView: FC<{}> = props => return newValue; }); - } + }; const tryEntering = () => { @@ -49,7 +50,7 @@ export const NavigatorDoorStateView: FC<{}> = props => return newValue; }); - } + }; useEffect(() => { @@ -63,48 +64,48 @@ export const NavigatorDoorStateView: FC<{}> = props => const isDoorbell = (DOORBELL_STATES.indexOf(doorData.state) >= 0); return ( - + - - - { doorData && doorData.roomInfo && doorData.roomInfo.roomName } + +
+ { doorData && doorData.roomInfo && doorData.roomInfo.roomName } { (doorData.state === DoorStateType.START_DOORBELL) && - { LocalizeText('navigator.doorbell.info') } } + { LocalizeText('navigator.doorbell.info') } } { (doorData.state === DoorStateType.STATE_WAITING) && - { LocalizeText('navigator.doorbell.waiting') } } + { LocalizeText('navigator.doorbell.waiting') } } { (doorData.state === DoorStateType.STATE_NO_ANSWER) && - { LocalizeText('navigator.doorbell.no.answer') } } + { LocalizeText('navigator.doorbell.no.answer') } } { (doorData.state === DoorStateType.START_PASSWORD) && - { LocalizeText('navigator.password.info') } } + { LocalizeText('navigator.password.info') } } { (doorData.state === DoorStateType.STATE_WRONG_PASSWORD) && - { LocalizeText('navigator.password.retryinfo') } } - + { LocalizeText('navigator.password.retryinfo') } } +
{ isDoorbell && - - - { LocalizeText('generic.cancel') } - +
{ (doorData.state === DoorStateType.START_DOORBELL) && - } - } + +
} { !isDoorbell && <> - - { LocalizeText('navigator.password.enter') } - setPassword(event.target.value) } /> - - - - { LocalizeText('generic.cancel') } - - - + +
}
); -} +}; diff --git a/src/components/navigator/views/NavigatorRoomCreatorView.tsx b/src/components/navigator/views/NavigatorRoomCreatorView.tsx index a184f32..8469af3 100644 --- a/src/components/navigator/views/NavigatorRoomCreatorView.tsx +++ b/src/components/navigator/views/NavigatorRoomCreatorView.tsx @@ -1,10 +1,10 @@ -/* eslint-disable no-template-curly-in-string */ + import { CreateFlatMessageComposer, HabboClubLevelEnum } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { CreateLinkEvent, GetClubMemberLevel, GetConfiguration, IRoomModel, LocalizeText, SendMessageComposer } from '../../../api'; -import { AutoGrid, Base, Button, Column, Flex, Grid, LayoutInputErrorView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { RoomCreatorGridItem } from '../../../common/layout/RoomCreatorGridItem'; +import { GetClubMemberLevel, GetConfigurationValue, IRoomModel, LocalizeText, SendMessageComposer } from '../../../api'; +import { Button, Flex, Grid, LayoutCurrencyIcon, LayoutGridItem, Text } from '../../../common'; import { useNavigator } from '../../../hooks'; +import { NitroInput } from '../../../layout'; export const NavigatorRoomCreatorView: FC<{}> = props => { @@ -18,25 +18,21 @@ export const NavigatorRoomCreatorView: FC<{}> = props => const [ selectedModelName, setSelectedModelName ] = useState(''); const { categories = null } = useNavigator(); - const hcDisabled = GetConfiguration('hc.disabled', false); + const hcDisabled = GetConfigurationValue('hc.disabled', false); - const getRoomModelImage = (name: string) => GetConfiguration('images.url') + `/navigator/models/model_${ name }.png`; + const getRoomModelImage = (name: string) => GetConfigurationValue('images.url') + `/navigator/models/model_${ name }.png`; const selectModel = (model: IRoomModel, index: number) => { - if(!model) return; - - if (GetClubMemberLevel() < model.clubLevel) return CreateLinkEvent('habboUI/open/hccenter'); + if(!model || (model.clubLevel > GetClubMemberLevel())) return; setSelectedModelName(roomModels[index].name); - } + }; const createRoom = () => { - if (!name || (name.length < 3)) return; - SendMessageComposer(new CreateFlatMessageComposer(name, description, 'model_' + selectedModelName, Number(category), Number(visitorsCount), tradesSetting)); - } + }; useEffect(() => { @@ -58,7 +54,7 @@ export const NavigatorRoomCreatorView: FC<{}> = props => useEffect(() => { - const models = GetConfiguration('navigator.room.models'); + const models = GetConfigurationValue('navigator.room.models'); if(models && models.length) { @@ -68,73 +64,60 @@ export const NavigatorRoomCreatorView: FC<{}> = props => }, []); return ( - - CreateLinkEvent('navigator/close-creator') } /> - - - - - - { LocalizeText('navigator.createroom.roomnameinfo') } - setName(event.target.value) } placeholder={ LocalizeText('navigator.createroom.roomnameinfo') } /> - { (!name || (name.length < 3)) && } - - - { LocalizeText('navigator.createroom.roomdescinfo') } - +
); -} +}; diff --git a/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx b/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx index 19787d8..741a35e 100644 --- a/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx +++ b/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx @@ -2,7 +2,7 @@ import { FurnitureStackHeightComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; import { LocalizeText, SendMessageComposer } from '../../../../api'; -import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Slider, Text } from '../../../../common'; +import { Button, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { useFurnitureStackHeightWidget } from '../../../../hooks'; export const FurnitureStackHeightView: FC<{}> = props => @@ -19,7 +19,7 @@ export const FurnitureStackHeightView: FC<{}> = props => if(isNaN(newValue) || (newValue === height)) return; updateHeight(newValue); - } + }; useEffect(() => { @@ -33,25 +33,26 @@ export const FurnitureStackHeightView: FC<{}> = props => { LocalizeText('widget.custom.stack.height.text') } - - +
{ state.valueNow }
} step={ 0.01 } value={ height } - onChange={ event => updateHeight(event) } - renderThumb={ (props, state) =>
{ state.valueNow }
} /> - updateTempHeight(event.target.value) } /> -
- + onChange={ event => updateHeight(event) } /> + updateTempHeight(event.target.value) } /> +
+
- +
); -} +}; diff --git a/src/components/room/widgets/furniture/FurnitureStickieView.tsx b/src/components/room/widgets/furniture/FurnitureStickieView.tsx index 2f0e0fe..fec4845 100644 --- a/src/components/room/widgets/furniture/FurnitureStickieView.tsx +++ b/src/components/room/widgets/furniture/FurnitureStickieView.tsx @@ -3,9 +3,9 @@ import { ColorUtils } from '../../../../api'; import { DraggableWindow, DraggableWindowPosition } from '../../../../common'; import { useFurnitureStickieWidget } from '../../../../hooks'; -const STICKIE_COLORS = [ '9CCEFF','FF9CFF', '9CFF9C','FFFF33' ]; +const STICKIE_COLORS = [ '9CCEFF', 'FF9CFF', '9CFF9C', 'FFFF33' ]; const STICKIE_COLOR_NAMES = [ 'blue', 'pink', 'green', 'yellow' ]; -const STICKIE_TYPES = [ 'post_it','post_it_shakesp', 'post_it_dreams','post_it_xmas', 'post_it_vd', 'post_it_juninas' ]; +const STICKIE_TYPES = [ 'post_it', 'post_it_shakesp', 'post_it_dreams', 'post_it_xmas', 'post_it_vd', 'post_it_juninas' ]; const STICKIE_TYPE_NAMES = [ 'post_it', 'shakesp', 'dreams', 'christmas', 'heart', 'juninas' ]; const getStickieColorName = (color: string) => @@ -15,7 +15,7 @@ const getStickieColorName = (color: string) => if(index === -1) index = 0; return STICKIE_COLOR_NAMES[index]; -} +}; const getStickieTypeName = (type: string) => { @@ -24,7 +24,7 @@ const getStickieTypeName = (type: string) => if(index === -1) index = 0; return STICKIE_TYPE_NAMES[index]; -} +}; export const FurnitureStickieView: FC<{}> = props => { @@ -41,26 +41,26 @@ export const FurnitureStickieView: FC<{}> = props => return (
-
-
+
+
{ canModify && - <> -
- { type == 'post_it' && - <> - { STICKIE_COLORS.map(color => - { - return
updateColor(color) } style={ { backgroundColor: ColorUtils.makeColorHex(color) } } /> - }) } - } - } + <> +
+ { type == 'post_it' && + <> + { STICKIE_COLORS.map(color => + { + return
updateColor(color) } />; + }) } + } + }
-
+
- { (!isEditing || !canModify) ?
(canModify && setIsEditing(true)) }>{ text }
: } + { (!isEditing || !canModify) ?
(canModify && setIsEditing(true)) }>{ text }
: }
); -} +}; diff --git a/src/components/room/widgets/furniture/FurnitureTrophyView.tsx b/src/components/room/widgets/furniture/FurnitureTrophyView.tsx index 7977097..2e08af0 100644 --- a/src/components/room/widgets/furniture/FurnitureTrophyView.tsx +++ b/src/components/room/widgets/furniture/FurnitureTrophyView.tsx @@ -8,5 +8,5 @@ export const FurnitureTrophyView: FC<{}> = props => if(objectId === -1) return null; - return ; -} + return ; +}; diff --git a/src/components/room/widgets/furniture/FurnitureWidgets.scss b/src/components/room/widgets/furniture/FurnitureWidgets.scss deleted file mode 100644 index 02afb4f..0000000 --- a/src/components/room/widgets/furniture/FurnitureWidgets.scss +++ /dev/null @@ -1,554 +0,0 @@ -.nitro-room-widgets { - pointer-events: none; -} - -.nitro-widget-custom-stack-height { - width: $nitro-widget-custom-stack-height-width; - height: $nitro-widget-custom-stack-height-height; -} - -.nitro-room-widget-toner { - width: 190px; -} - -.nitro-room-widget-dimmer { - width: 275px; - - .dimmer-banner { - width: 56px; - height: 79px; - 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, 0.2); - - &.active { - box-shadow: none; - } - } -} - -.nitro-widget-crafting { - width: $nitro-widget-crafting-width; - height: $nitro-widget-crafting-height; -} - -.nitro-widget-exchange-credit { - width: $nitro-widget-exchange-credit-width; - height: $nitro-widget-exchange-credit-height; - - .exchange-image { - 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; - } - - .picture-preview-buttons { - display: flex; - align-items: center; - justify-content: space-between; - color: gray; - } - - .picture-preview-buttons-previous, - .picture-preview-buttons-next { - color: #222; - background-color: white; - padding: 10px; - border-radius: 50%; - } -} - -.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; - } - } -} - -.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-christmas { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-christmas.png'); - } - - &.stickie-shakesp { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-shakesp.png'); - } - - &.stickie-dreams { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-dreams.png'); - } - - &.stickie-heart { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-heart.png'); - } - - &.stickie-juninas { - background-image: url('@/assets/images/room-widgets/stickie-widget/stickie-juninas.png'); - } - - &.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, 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: 280px; - max-width: 280px; - height: 320px; - - border-radius: 0.3rem; - border: solid 1px #000; - - .header { - border-image-source: none !important; - background-color: #40403e; - border-radius: 0.3rem 0.3rem 0 0; - } - - .align-right { - text-align: right; - } - - .section-border { - border: solid 1px #8c8a88; - } - - .high-score-content { - height: 100%; - background-color: #000; - border-radius: 0.3rem; - } - - .score-footer { - color: #9a9896; - font-weight: bold; - } -} - -.youtube-tv-widget { - width: 600px; - height: 380px; - - .youtube-video-container { - .empty-video { - background-color: black; - color: white; - width: 100%; - height: 100%; - text-align: center; - } - - .youtubeContainer { - position: relative; - width: 100%; - height: 100%; - overflow: hidden; - margin-bottom: 50px; - } - - .youtubeContainer iframe { - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - } - } - - .playlist-container { - overflow-y: auto; - margin-right: -10px; - color: black; - height: 100%; - - .playlist-controls { - width: 100%; - .icon { - margin-right: 10px; - margin-bottom: 10px; - } - } - - .playlist-grid { - height: 100%; - width: 100%; - } - } -} - -.nitro-playlist-editor-widget { - width: 625px; - height: 440px; - - img.my-music { - position: absolute; - top: -4px; - left: -4px; - z-index: 0; - } - - img.playlist-img { - position: absolute; - top: -4px; - left: 0; - z-index: 0; - } - - img.get-more, - img.add-songs { - position: absolute; - bottom: 0; - left: 0; - z-index: 0; - } - - .playlist-bottom { - z-index: 3; - } - - .move-disk { - width: 22px; - height: 18px; - background-image: url('@/assets/images/room-widgets/playlist-editor/move.png'); - } - - .disk-2, - .disk-image { - background-blend-mode: multiply; - } - - .disk-2 { - width: 38px; - height: 38px; - background-image: url('@/assets/images/room-widgets/playlist-editor/disk_2.png'); - background-position: center; - background-repeat: no-repeat; - - &.playing-song { - background-image: url('@/assets/images/room-widgets/playlist-editor/playing.png'); - } - - &.selected-song { - background-image: url('@/assets/images/room-widgets/playlist-editor/move.png'); - transform: scaleX(-1); - } - - &:not(.playing-song):not(.selected-song) { - -webkit-mask-image: url('@/assets/images/room-widgets/playlist-editor/disk_2.png'); - mask-image: url('@/assets/images/room-widgets/playlist-editor/disk_2.png'); - } - } - - .pause-song { - width: 18px; - height: 20px; - background-image: url('@/assets/images/room-widgets/playlist-editor/pause.png'); - } - - .pause-btn { - width: 16px; - height: 16px; - - background-image: url('@/assets/images/room-widgets/playlist-editor/pause-btn.png'); - } - - .music-note { - width: 38px; - height: 38px; - background-image: url('@/assets/images/room-widgets/playlist-editor/playing.png'); - } - - .preview-song { - width: 16px; - height: 16px; - background-image: url('@/assets/images/room-widgets/playlist-editor/preview.png'); - } - - .layout-grid-item { - min-height: 95px; - min-width: 95px; - position: relative; - - .disk-image { - background: url('@/assets/images/room-widgets/playlist-editor/disk_image.png'); - -webkit-mask-image: url('@/assets/images/room-widgets/playlist-editor/disk_image.png'); - mask-image: url('@/assets/images/room-widgets/playlist-editor/disk_image.png'); - height: 76px; - width: 76px; - } - } -} - -.nitro-mysterybox-dialog { - width: 375px; - height: 210px; - - .prize-container { - height: 80px; - width: 81px; - background-image: url('@/assets/images/prize/prize_background.png'); - background-repeat: no-repeat; - background-position: center; - } -} - -.nitro-mysterytrophy-dialog -{ - .mysterytrophy-dialog-top - { - width: 400px; - height: 120px; - border-radius: 2px; - background-color: #0E3F52; - - .mysterytrophy-image - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/mysterytrophy/frank_mystery_trophy.png'); - background-repeat: no-repeat; - } - - .mysterytrophy-text-big - { - font-size: 16px; - } - } - - .mysterytrophy-dialog-bottom - { - display: flex; - justify-content: center; - width: 400px; - height: 120px; - border-radius: 2px; - background-color: #E9E9E1; - - .input-mysterytrophy-dialog - { - width: 380px; - border: 1px solid black; - - .input-mysterytrophy - { - width: 350px; - border: 0; - outline: 0; - } - - .mysterytrophy-pencil-image - { - width: 16px; - height: 16px; - position: relative; - background-image: url('@/assets/images/infostand/pencil-icon.png'); - background-repeat: no-repeat; - } - } - - .text-decoration - { - text-decoration: underline; - } - } -} diff --git a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx index d0e4066..807846a 100644 --- a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx +++ b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx @@ -1,6 +1,5 @@ import { FC } from 'react'; -import { Base } from '../../../../common'; -import { FurnitureContextMenuView } from './context-menu/FurnitureContextMenuView'; +import { FurnitureAreaHideView } from './FurnitureAreaHideView'; import { FurnitureBackgroundColorView } from './FurnitureBackgroundColorView'; import { FurnitureBadgeDisplayView } from './FurnitureBadgeDisplayView'; import { FurnitureCraftingView } from './FurnitureCraftingView'; @@ -18,12 +17,13 @@ import { FurnitureStackHeightView } from './FurnitureStackHeightView'; import { FurnitureStickieView } from './FurnitureStickieView'; import { FurnitureTrophyView } from './FurnitureTrophyView'; import { FurnitureYoutubeDisplayView } from './FurnitureYoutubeDisplayView'; +import { FurnitureContextMenuView } from './context-menu/FurnitureContextMenuView'; import { FurniturePlaylistEditorWidgetView } from './playlist-editor/FurniturePlaylistEditorWidgetView'; export const FurnitureWidgetsView: FC<{}> = props => { return ( - + <> @@ -43,6 +43,7 @@ export const FurnitureWidgetsView: FC<{}> = props => - + + ); -} +}; diff --git a/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx b/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx index cd7d43d..0d8dd5e 100644 --- a/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx +++ b/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx @@ -20,14 +20,14 @@ export const FurnitureYoutubeDisplayView: FC<{}> = FurnitureYoutubeDisplayViewPr setPlayer(event.target); if(objectId === -1) return; - + switch(event.target.getPlayerState()) { case -1: case 1: if(currentVideoState === 2) { - //event.target.pauseVideo(); + //event.target.pauseVideo(); } if(currentVideoState !== 1) play(); @@ -35,7 +35,7 @@ export const FurnitureYoutubeDisplayView: FC<{}> = FurnitureYoutubeDisplayViewPr case 2: if(currentVideoState !== 2) pause(); } - } + }; useEffect(() => { @@ -70,40 +70,40 @@ export const FurnitureYoutubeDisplayView: FC<{}> = FurnitureYoutubeDisplayViewPr start: videoStart, end: videoEnd } - } + }; return ( - + -
-
+
+
{ (videoId && videoId.length > 0) && - setPlayer(event.target) } onStateChange={ onStateChange } containerClassName={ 'youtubeContainer' } /> + setPlayer(event.target) } onStateChange={ onStateChange } /> } { (!videoId || videoId.length === 0) && -
{ LocalizeText('widget.furni.video_viewer.no_videos') }
+
{ 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) }> + selectVideo(entry.video) }> { entry.title } - ) + ); }) }
- ) -} + ); +}; diff --git a/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx b/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx index f7e35b9..a818152 100644 --- a/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx +++ b/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; import { LocalizeText } from '../../../../../api'; -import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; +import { Button, Column, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; import { useRoom } from '../../../../../hooks'; interface EffectBoxConfirmViewProps @@ -19,22 +19,22 @@ export const EffectBoxConfirmView: FC = props => roomSession.useMultistateItem(objectId); 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 56ac66d..7976d99 100644 --- a/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx +++ b/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx @@ -1,6 +1,6 @@ -import { ContextMenuEnum, CustomUserNotificationMessageEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { ContextMenuEnum, CustomUserNotificationMessageEvent, GetSessionDataManager, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { GetGroupInformation, GetSessionDataManager, LocalizeText } from '../../../../../api'; +import { GetGroupInformation, LocalizeText } from '../../../../../api'; import { EFFECTBOX_OPEN, GROUP_FURNITURE, MONSTERPLANT_SEED_CONFIRMATION, MYSTERYTROPHY_OPEN_DIALOG, PURCHASABLE_CLOTHING_CONFIRMATION, useFurnitureContextMenuWidget, useMessageEvent, useNotification } from '../../../../../hooks'; import { ContextMenuHeaderView } from '../../context-menu/ContextMenuHeaderView'; import { ContextMenuListItemView } from '../../context-menu/ContextMenuListItemView'; @@ -52,7 +52,7 @@ export const FurnitureContextMenuView: FC<{}> = props => } { (objectId >= 0) && mode && - + { (mode === ContextMenuEnum.FRIEND_FURNITURE) && <> @@ -126,5 +126,5 @@ export const FurnitureContextMenuView: FC<{}> = props => } } - ) -} + ); +}; diff --git a/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx b/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx index b7163cc..4a5ed98 100644 --- a/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx +++ b/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx @@ -1,7 +1,7 @@ import { IFurnitureData, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { FurniCategory, GetFurnitureDataForRoomObject, LocalizeText } from '../../../../../api'; -import { Base, Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; +import { Button, Column, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; import { useRoom } from '../../../../../hooks'; interface MonsterPlantSeedConfirmViewProps @@ -25,7 +25,7 @@ export const MonsterPlantSeedConfirmView: FC = roomSession.useMultistateItem(objectId); onClose(); - } + }; useEffect(() => { @@ -57,29 +57,29 @@ export const MonsterPlantSeedConfirmView: FC = }, [ roomSession, objectId, onClose ]); if(mode === MODE_DEFAULT) return null; - + return ( - - - - - - - +
+
+
+
+
+
+
- { LocalizeText('useproduct.widget.text.plant_seed', [ 'productName' ], [ furniData.name ] ) } + { LocalizeText('useproduct.widget.text.plant_seed', [ 'productName' ], [ furniData.name ]) } { 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 d07d5e8..85a6f80 100644 --- a/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx +++ b/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx @@ -1,7 +1,7 @@ -import { RedeemItemClothingComposer, RoomObjectCategory, UserFigureComposer } from '@nitrots/nitro-renderer'; +import { AvatarFigurePartType, GetAvatarRenderManager, GetSessionDataManager, RedeemItemClothingComposer, RoomObjectCategory, UserFigureComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { FigureData, FurniCategory, GetAvatarRenderManager, GetConnection, GetFurnitureDataForRoomObject, GetSessionDataManager, LocalizeText } from '../../../../../api'; -import { Base, Button, Column, Flex, LayoutAvatarImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; +import { FurniCategory, GetFurnitureDataForRoomObject, LocalizeText, SendMessageComposer } from '../../../../../api'; +import { Button, Column, LayoutAvatarImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; import { useRoom } from '../../../../../hooks'; interface PurchasableClothingConfirmViewProps @@ -17,17 +17,17 @@ export const PurchasableClothingConfirmView: FC(FigureData.MALE); + const [ gender, setGender ] = useState(AvatarFigurePartType.MALE); const [ newFigure, setNewFigure ] = useState(null); const { roomSession = null } = useRoom(); const useProduct = () => { - GetConnection().send(new RedeemItemClothingComposer(objectId)); - GetConnection().send(new UserFigureComposer(gender, newFigure)); + SendMessageComposer(new RedeemItemClothingComposer(objectId)); + SendMessageComposer(new UserFigureComposer(gender, newFigure)); onClose(); - } + }; useEffect(() => { @@ -66,7 +66,7 @@ export const PurchasableClothingConfirmView: FC - - - - - - - +
+
+
+ +
+
+
{ LocalizeText('useproduct.widget.text.bind_clothing') } { LocalizeText('useproduct.widget.info.bind_clothing') } - +
- - - +
+
+
); -} +}; diff --git a/src/components/room/widgets/furniture/playlist-editor/DiskInventoryView.tsx b/src/components/room/widgets/furniture/playlist-editor/DiskInventoryView.tsx index 11bb6da..7550af9 100644 --- a/src/components/room/widgets/furniture/playlist-editor/DiskInventoryView.tsx +++ b/src/components/room/widgets/furniture/playlist-editor/DiskInventoryView.tsx @@ -1,7 +1,7 @@ -import { IAdvancedMap, MusicPriorities } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent, GetSoundManager, IAdvancedMap, MusicPriorities } from '@nitrots/nitro-renderer'; import { FC, MouseEvent, useCallback, useEffect, useState } from 'react'; -import { CatalogPageName, CreateLinkEvent, GetConfiguration, GetDiskColor, GetNitroInstance, LocalizeText } from '../../../../../api'; -import { AutoGrid, Base, Button, Flex, LayoutGridItem, Text } from '../../../../../common'; +import { CatalogPageName, GetConfigurationValue, GetDiskColor, LocalizeText } from '../../../../../api'; +import { AutoGrid, Button, Flex, LayoutGridItem, Text } from '../../../../../common'; export interface DiskInventoryViewProps { @@ -26,24 +26,24 @@ export const DiskInventoryView: FC = props => { event.stopPropagation(); - addToPlaylist(diskId, GetNitroInstance().soundManager.musicController?.getRoomItemPlaylist()?.length) + addToPlaylist(diskId, GetSoundManager().musicController?.getRoomItemPlaylist()?.length); }, [ addToPlaylist ]); const openCatalogPage = () => { CreateLinkEvent('catalog/open/' + CatalogPageName.TRAX_SONGS); - } + }; useEffect(() => { if(previewSongId === -1) return; - GetNitroInstance().soundManager.musicController?.playSong(previewSongId, MusicPriorities.PRIORITY_SONG_PLAY, 0, 0, 0, 0); + GetSoundManager().musicController?.playSong(previewSongId, MusicPriorities.PRIORITY_SONG_PLAY, 0, 0, 0, 0); return () => { - GetNitroInstance().soundManager.musicController?.stop(MusicPriorities.PRIORITY_SONG_PLAY); - } + GetSoundManager().musicController?.stop(MusicPriorities.PRIORITY_SONG_PLAY); + }; }, [ previewSongId ]); useEffect(() => @@ -52,43 +52,43 @@ export const DiskInventoryView: FC = props => }, []); return (<> -
- +
+

{ LocalizeText('playlist.editor.my.music') }

-
+
- { diskInventory && diskInventory.getKeys().map( (key, index) => + { diskInventory && diskInventory.getKeys().map((key, index) => { const diskId = diskInventory.getKey(index); const songId = diskInventory.getWithIndex(index); - const songInfo = GetNitroInstance().soundManager.musicController?.getSongInfo(songId); + const songInfo = GetSoundManager().musicController?.getSongInfo(songId); return ( - setSelectedItem(prev => prev === index ? -1 : index) } classNames={ [ 'text-black' ] }> -
+ setSelectedItem(prev => prev === index ? -1 : index) }> +
- { songInfo?.name } + { songInfo?.name } { (selectedItem === index) && - - - - + + + + } -
) + ); }) }
-
+
{ LocalizeText('playlist.editor.text.get.more.music') }
{ LocalizeText('playlist.editor.text.you.have.no.songdisks.available') }
{ LocalizeText('playlist.editor.text.you.can.buy.some.from.the.catalogue') }
- + ); -} +}; diff --git a/src/components/room/widgets/furniture/playlist-editor/FurniturePlaylistEditorWidgetView.tsx b/src/components/room/widgets/furniture/playlist-editor/FurniturePlaylistEditorWidgetView.tsx index ceb0db9..611eba2 100644 --- a/src/components/room/widgets/furniture/playlist-editor/FurniturePlaylistEditorWidgetView.tsx +++ b/src/components/room/widgets/furniture/playlist-editor/FurniturePlaylistEditorWidgetView.tsx @@ -15,15 +15,15 @@ export const FurniturePlaylistEditorWidgetView: FC<{}> = props => -
-
+
+
-
- +
+
); -} +}; diff --git a/src/components/room/widgets/furniture/playlist-editor/SongPlaylistView.tsx b/src/components/room/widgets/furniture/playlist-editor/SongPlaylistView.tsx index 241bdc5..95289a7 100644 --- a/src/components/room/widgets/furniture/playlist-editor/SongPlaylistView.tsx +++ b/src/components/room/widgets/furniture/playlist-editor/SongPlaylistView.tsx @@ -1,7 +1,7 @@ import { ISongInfo } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; -import { GetConfiguration, GetDiskColor, LocalizeText } from '../../../../../api'; -import { Base, Button, Flex, Text } from '../../../../../common'; +import { GetConfigurationValue, GetDiskColor, LocalizeText } from '../../../../../api'; +import { Button, Text } from '../../../../../common'; export interface SongPlaylistViewProps { @@ -20,60 +20,59 @@ export const SongPlaylistView: FC = props => const action = (index: number) => { if(selectedItem === index) removeFromPlaylist(index); - } + }; const playPause = (furniId: number, selectedItem: number) => { - togglePlayPause(furniId, selectedItem !== -1 ? selectedItem : 0 ) - } + togglePlayPause(furniId, selectedItem !== -1 ? selectedItem : 0); + }; return (<> -
- +
+

{ LocalizeText('playlist.editor.playlist') }

-
- - { playlist && playlist.map( (songInfo, index) => +
+
+ { playlist && playlist.map((songInfo, index) => { - return setSelectedItem(prev => prev === index ? -1 : index) }> - action(index) } className={ 'disk-2 ' + (selectedItem === index ? 'selected-song' : '') } style={ { backgroundColor: (selectedItem === index ? '' : GetDiskColor(songInfo.songData)) } }/> + return
setSelectedItem(prev => prev === index ? -1 : index) }> +
action(index) } /> { songInfo.name } - +
; }) } - +
- { (!playlist || playlist.length === 0 ) && - <>
-
{ LocalizeText('playlist.editor.add.songs.to.your.playlist') }
-
{ LocalizeText('playlist.editor.text.click.song.to.choose.click.again.to.move') }
-
- + { (!playlist || playlist.length === 0) && + <>
+
{ LocalizeText('playlist.editor.add.songs.to.your.playlist') }
+
{ LocalizeText('playlist.editor.text.click.song.to.choose.click.again.to.move') }
+
+ } { (playlist && playlist.length > 0) && <> { (currentPlayingIndex === -1) && - + } { (currentPlayingIndex !== -1) && - +
- +
{ LocalizeText('playlist.editor.text.now.playing.in.your.room') } { playlist[currentPlayingIndex]?.name + ' - ' + playlist[currentPlayingIndex]?.creator } - - - +
+
} } ); -} +}; diff --git a/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.scss b/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.scss deleted file mode 100644 index 254821c..0000000 --- a/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.scss +++ /dev/null @@ -1,52 +0,0 @@ -.mysterybox-extension { - - .mysterybox-container { - max-width: 50px; - max-height: 50px; - width: 50px; - height: 50px; - - background-color: rgba(28, 28, 32, 0.95); - box-shadow: inset 0px 5px rgb(34 34 39 / 60%), inset 0 -4px rgb(18 18 21 / 60%); - border-color: #5b5a57; - } - - .box-image { - width: 31px; - height: 36px; - position: relative; - background-image: url('@/assets/images/mysterybox/mystery_box.png'); - -webkit-mask-image: url('@/assets/images/mysterybox/mystery_box.png'); - mask-image: url('@/assets/images/mysterybox/mystery_box.png'); - - .chain-overlay-image { - width: 31px; - height: 36px; - position: absolute; - background-image: url('@/assets/images/mysterybox/chain_mysterybox_box_overlay.png'); - } - } - - .key-image { - width: 39px; - height: 39px; - position: relative; - background-image: url('@/assets/images/mysterybox/mystery_box_key.png'); - -webkit-mask-image: url('@/assets/images/mysterybox/mystery_box_key.png'); - mask-image: url('@/assets/images/mysterybox/mystery_box_key.png'); - - .key-overlay-image { - width: 39px; - height: 39px; - position: absolute; - background-image: url('@/assets/images/mysterybox/key_overlay.png'); - } - } - - .box-image, - .key-image { - background-blend-mode: multiply; - background-position: center; - background-repeat: no-repeat; - } -} diff --git a/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.tsx b/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.tsx index 83ae06c..1e18286 100644 --- a/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.tsx +++ b/src/components/room/widgets/mysterybox/MysteryBoxExtensionView.tsx @@ -2,8 +2,8 @@ import { MysteryBoxKeysUpdateEvent } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; import { FaChevronDown, FaChevronUp } from 'react-icons/fa'; import { ColorUtils, LocalizeText } from '../../../../api'; -import { Base, Column, Flex, LayoutGridItem, Text } from '../../../../common'; -import { useSessionDataManagerEvent } from '../../../../hooks'; +import { Flex, LayoutGridItem, Text } from '../../../../common'; +import { useNitroEvent } from '../../../../hooks'; const colorMap = { 'purple': 9452386, @@ -14,7 +14,7 @@ const colorMap = { 'orange': 10841125, 'turquoise': 2661026, 'red': 10104881 -} +}; export const MysteryBoxExtensionView: FC<{}> = props => { @@ -22,7 +22,7 @@ export const MysteryBoxExtensionView: FC<{}> = props => const [ keyColor, setKeyColor ] = useState(''); const [ boxColor, setBoxColor ] = useState(''); - useSessionDataManagerEvent(MysteryBoxKeysUpdateEvent.MYSTERY_BOX_KEYS_UPDATE, event => + useNitroEvent(MysteryBoxKeysUpdateEvent.MYSTERY_BOX_KEYS_UPDATE, event => { setKeyColor(event.keyColor); setBoxColor(event.boxColor); @@ -33,14 +33,14 @@ export const MysteryBoxExtensionView: FC<{}> = props => const colorInt = colorMap[color]; return ColorUtils.int2rgb(colorInt); - } + }; if(keyColor === '' && boxColor === '') return null; return ( - - - setIsOpen(value => !value) }> +
+
+ setIsOpen(value => !value) }> { LocalizeText('mysterybox.tracker.title') } { isOpen && } { !isOpen && } @@ -48,20 +48,20 @@ export const MysteryBoxExtensionView: FC<{}> = props => { isOpen && <> { LocalizeText('mysterybox.tracker.description') } - +
-
+
- +
} - - +
+
); -} +}; diff --git a/src/components/room/widgets/object-location/ObjectLocationView.tsx b/src/components/room/widgets/object-location/ObjectLocationView.tsx index 237090b..0bd1a48 100644 --- a/src/components/room/widgets/object-location/ObjectLocationView.tsx +++ b/src/components/room/widgets/object-location/ObjectLocationView.tsx @@ -1,7 +1,7 @@ import { GetTicker } from '@nitrots/nitro-renderer'; import { FC, useEffect, useRef, useState } from 'react'; import { GetRoomObjectBounds, GetRoomSession } from '../../../../api'; -import { Base, BaseProps } from '../../../../common'; +import { BaseProps } from '../../../../common'; interface ObjectLocationViewProps extends BaseProps { @@ -12,7 +12,7 @@ interface ObjectLocationViewProps extends BaseProps export const ObjectLocationView: FC = props => { - const { objectId = -1, category = -1, noFollow = false, position = 'absolute', ...rest } = props; + const { objectId = -1, category = -1, noFollow = false, ...rest } = props; const [ pos, setPos ] = useState<{ x: number, y: number }>({ x: -1, y: -1 }); const elementRef = useRef(); @@ -26,7 +26,7 @@ export const ObjectLocationView: FC = props => const objectBounds = GetRoomObjectBounds(roomSession.roomId, objectId, category, 1); return objectBounds; - } + }; const updatePosition = () => { @@ -38,7 +38,7 @@ export const ObjectLocationView: FC = props => x: Math.round(((bounds.left + (bounds.width / 2)) - (elementRef.current.offsetWidth / 2))), y: Math.round((bounds.top - elementRef.current.offsetHeight) + 10) }); - } + }; if(noFollow) { @@ -54,8 +54,8 @@ export const ObjectLocationView: FC = props => return () => { if(remove) GetTicker().remove(updatePosition); - } + }; }, [ objectId, category, noFollow ]); - return -1 } className="object-location" style={ { left: pos.x, top: pos.y } } { ...rest } />; -} + return
-1) ? 'visible' : 'hidden' } } { ...rest } />; +}; diff --git a/src/components/room/widgets/pet-package/PetPackageWidgetView.scss b/src/components/room/widgets/pet-package/PetPackageWidgetView.scss deleted file mode 100644 index 97a6d2e..0000000 --- a/src/components/room/widgets/pet-package/PetPackageWidgetView.scss +++ /dev/null @@ -1,106 +0,0 @@ -.nitro-pet-package -{ - .pet-package-container-top - { - width: 400px; - height: 120px; - border-radius: 2px; - background-color: #0E3F52; - - .package-image-gnome_box - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/gnome.png'); - background-repeat: no-repeat; - } - - .package-image-leprechaun_box - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/leprechaun_box.png'); - background-repeat: no-repeat; - } - - .package-image-val11_present - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/val11_present.png'); - background-repeat: no-repeat; - } - - .package-image-velociraptor_egg - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/velociraptor_egg.png'); - background-repeat: no-repeat; - } - - .package-image-pterosaur_egg - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/pterosaur_egg.png'); - background-repeat: no-repeat; - } - - .package-image-petbox_epic - { - width: 80px; - height: 84px; - position: relative; - background-image: url('@/assets/images/pets/pet-package/petbox_epic.png'); - background-repeat: no-repeat; - } - - .package-text-big - { - font-size: 16px; - } - } - - .pet-package-container-bottom - { - display: flex; - justify-content: center; - width: 400px; - height: 120px; - border-radius: 2px; - background-color: #E9E9E1; - - .input-pet-package-container - { - width: 380px; - border: 1px solid black; - - .input-pet-package - { - width: 350px; - border: 0; - outline: 0; - } - - .package-pencil-image - { - width: 16px; - height: 16px; - position: relative; - background-image: url('@/assets/images/infostand/pencil-icon.png'); - background-repeat: no-repeat; - } - } - - .text-decoration - { - text-decoration: underline; - } - } -} diff --git a/src/components/room/widgets/pet-package/PetPackageWidgetView.tsx b/src/components/room/widgets/pet-package/PetPackageWidgetView.tsx index 048c9aa..9b4ff4a 100644 --- a/src/components/room/widgets/pet-package/PetPackageWidgetView.tsx +++ b/src/components/room/widgets/pet-package/PetPackageWidgetView.tsx @@ -1,7 +1,6 @@ import { FC } from 'react'; -import { Button } from 'react-bootstrap'; -import { GetConfiguration, LocalizeText } from '../../../../api'; -import { Base, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; +import { GetConfigurationValue, LocalizeText } from '../../../../api'; +import { Button, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { usePetPackageWidget } from '../../../../hooks'; export const PetPackageWidgetView: FC<{}> = props => @@ -14,29 +13,29 @@ export const PetPackageWidgetView: FC<{}> = props => onClose() } /> - +
- { objectType === 'gnome_box' ? LocalizeText('widgets.gnomepackage.name.title') : LocalizeText('furni.petpackage') } + { objectType === 'gnome_box' ? LocalizeText('widgets.gnomepackage.name.title') : LocalizeText('furni.petpackage') }
- - - - - onChangePetName(event.target.value) } /> +
+
+
+
+ onChangePetName(event.target.value) } />
- +
{ (errorResult.length > 0) && - { errorResult } } - +
{ errorResult }
} +
onClose() }>{ LocalizeText('cancel') } - - - - + +
+
+
} ); -} +}; diff --git a/src/components/room/widgets/room-filter-words/RoomFilterWordsWidgetView.tsx b/src/components/room/widgets/room-filter-words/RoomFilterWordsWidgetView.tsx index 4f7825f..bbed44b 100644 --- a/src/components/room/widgets/room-filter-words/RoomFilterWordsWidgetView.tsx +++ b/src/components/room/widgets/room-filter-words/RoomFilterWordsWidgetView.tsx @@ -1,8 +1,9 @@ import { UpdateRoomFilterMessageComposer } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; import { LocalizeText, SendMessageComposer } from '../../../../api'; -import { Button, classNames, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; +import { Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { useFilterWordsWidget, useNavigator } from '../../../../hooks'; +import { NitroInput, classNames } from '../../../../layout'; export const RoomFilterWordsWidgetView: FC<{}> = props => { @@ -14,14 +15,14 @@ export const RoomFilterWordsWidgetView: FC<{}> = props => const processAction = (isAddingWord: boolean) => { - if ((isSelectingWord) ? (!selectedWord) : (!word)) return; + if((isSelectingWord) ? (!selectedWord) : (!word)) return; SendMessageComposer(new UpdateRoomFilterMessageComposer(navigatorData.enteredGuestRoom.roomId, isAddingWord, (isSelectingWord ? selectedWord : word))); setSelectedWord(''); setWord('bobba'); setIsSelectingWord(false); - if (isAddingWord && wordsFilter.includes((isSelectingWord ? selectedWord : word))) return; + if(isAddingWord && wordsFilter.includes((isSelectingWord ? selectedWord : word))) return; setWordsFilter(prevValue => { @@ -31,42 +32,42 @@ export const RoomFilterWordsWidgetView: FC<{}> = props => return newWords; }); - } + }; const onTyping = (word: string) => { setWord(word); setIsSelectingWord(false); - } + }; const onSelectedWord = (word: string) => { setSelectedWord(word); setIsSelectingWord(true); - } + }; - if (!isVisible) return null; + if(!isVisible) return null; return ( onClose() } /> - - onTyping(event.target.value) } /> + + onTyping(event.target.value) } /> - + { wordsFilter && (wordsFilter.length > 0) && wordsFilter.map((word, index) => { return ( - onSelectedWord(word) }> + onSelectedWord(word) }> { word } - ) + ); }) } - - + + diff --git a/src/components/room/widgets/room-promotes/RoomPromotesWidgetView.tsx b/src/components/room/widgets/room-promotes/RoomPromotesWidgetView.tsx index bfd66fa..07cf841 100644 --- a/src/components/room/widgets/room-promotes/RoomPromotesWidgetView.tsx +++ b/src/components/room/widgets/room-promotes/RoomPromotesWidgetView.tsx @@ -1,8 +1,7 @@ -import { DesktopViewEvent } from '@nitrots/nitro-renderer'; +import { DesktopViewEvent, GetSessionDataManager } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; import { FaChevronDown, FaChevronUp } from 'react-icons/fa'; -import { GetSessionDataManager } from '../../../../api'; -import { Base, Column, Flex, Text } from '../../../../common'; +import { Flex, Text } from '../../../../common'; import { useMessageEvent, useRoomPromote } from '../../../../hooks'; import { RoomPromoteEditWidgetView, RoomPromoteMyOwnEventWidgetView, RoomPromoteOtherEventWidgetView } from './views'; @@ -22,10 +21,10 @@ export const RoomPromotesWidgetView: FC<{}> = props => return ( <> { promoteInformation.data.adId !== -1 && - - - setIsOpen(value => !value) }> - { promoteInformation.data.eventName } +
+
+ setIsOpen(value => !value) }> + { promoteInformation.data.eventName } { isOpen && } { !isOpen && } @@ -42,14 +41,14 @@ export const RoomPromotesWidgetView: FC<{}> = props => } { isEditingPromote && setIsEditingPromote(false) } /> } - - +
+
} ); diff --git a/src/components/room/widgets/room-promotes/views/RoomPromoteEditWidgetView.tsx b/src/components/room/widgets/room-promotes/views/RoomPromoteEditWidgetView.tsx index f9b8462..bb3e610 100644 --- a/src/components/room/widgets/room-promotes/views/RoomPromoteEditWidgetView.tsx +++ b/src/components/room/widgets/room-promotes/views/RoomPromoteEditWidgetView.tsx @@ -1,7 +1,8 @@ import { EditEventMessageComposer } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; import { LocalizeText, SendMessageComposer } from '../../../../../api'; -import { Button, Column, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; +import { Button, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; +import { NitroInput } from '../../../../../layout'; interface RoomPromoteEditWidgetViewProps { @@ -21,23 +22,23 @@ export const RoomPromoteEditWidgetView: FC = pro { SendMessageComposer(new EditEventMessageComposer(eventId, newEventName, newEventDescription)); setIsEditingPromote(false); - } + }; return ( setIsEditingPromote(false) } /> - +
{ LocalizeText('navigator.eventsettings.name') } - setNewEventName(event.target.value) } /> - - + setNewEventName(event.target.value) } /> +
+
{ LocalizeText('navigator.eventsettings.desc') } - - - + +
+
- +
); diff --git a/src/components/room/widgets/room-promotes/views/RoomPromoteMyOwnEventWidgetView.tsx b/src/components/room/widgets/room-promotes/views/RoomPromoteMyOwnEventWidgetView.tsx index 169cc9b..e53497d 100644 --- a/src/components/room/widgets/room-promotes/views/RoomPromoteMyOwnEventWidgetView.tsx +++ b/src/components/room/widgets/room-promotes/views/RoomPromoteMyOwnEventWidgetView.tsx @@ -1,5 +1,6 @@ +import { CreateLinkEvent } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { CreateLinkEvent, LocalizeText } from '../../../../../api'; +import { LocalizeText } from '../../../../../api'; import { Button, Flex, Grid, Text } from '../../../../../common'; import { useRoomPromote } from '../../../../../hooks'; @@ -18,7 +19,7 @@ export const RoomPromoteMyOwnEventWidgetView: FC @@ -26,9 +27,9 @@ export const RoomPromoteMyOwnEventWidgetView: FC{ eventDescription }


- - - + + + ); diff --git a/src/components/room/widgets/room-promotes/views/RoomPromoteOtherEventWidgetView.tsx b/src/components/room/widgets/room-promotes/views/RoomPromoteOtherEventWidgetView.tsx index 5adb517..3a3ed08 100644 --- a/src/components/room/widgets/room-promotes/views/RoomPromoteOtherEventWidgetView.tsx +++ b/src/components/room/widgets/room-promotes/views/RoomPromoteOtherEventWidgetView.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; import { LocalizeText } from '../../../../../api'; -import { Base, Column, Flex, Text } from '../../../../../common'; +import { Column, Flex, Text } from '../../../../../common'; interface RoomPromoteOtherEventWidgetViewProps { @@ -18,12 +18,12 @@ export const RoomPromoteOtherEventWidgetView: FC

- - - { LocalizeText('navigator.eventinprogress') } - +
+
+ { LocalizeText('navigator.eventinprogress') } +
  - +
); diff --git a/src/components/room/widgets/room-thumbnail/RoomThumbnailWidgetView.tsx b/src/components/room/widgets/room-thumbnail/RoomThumbnailWidgetView.tsx index 055e734..a14744c 100644 --- a/src/components/room/widgets/room-thumbnail/RoomThumbnailWidgetView.tsx +++ b/src/components/room/widgets/room-thumbnail/RoomThumbnailWidgetView.tsx @@ -1,6 +1,5 @@ -import { NitroRenderTexture } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, NitroRenderTexture } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; -import { GetRoomEngine } from '../../../../api'; import { LayoutMiniCameraView } from '../../../../common'; import { RoomWidgetThumbnailEvent } from '../../../../events'; import { useRoom, useUiEvent } from '../../../../hooks'; @@ -22,21 +21,21 @@ export const RoomThumbnailWidgetView: FC<{}> = props => return; case RoomWidgetThumbnailEvent.HIDE_THUMBNAIL: setIsVisible(false); - return; + return; case RoomWidgetThumbnailEvent.TOGGLE_THUMBNAIL: setIsVisible(value => !value); return; } }); - const receiveTexture = (texture: NitroRenderTexture) => + const receiveTexture = async (texture: NitroRenderTexture) => { - GetRoomEngine().saveTextureAsScreenshot(texture, true); + await GetRoomEngine().saveTextureAsScreenshot(texture, true); setIsVisible(false); - } + }; if(!isVisible) return null; - return setIsVisible(false) } /> + return setIsVisible(false) } />; }; diff --git a/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx b/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx index 690875f..b504d97 100644 --- a/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx +++ b/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx @@ -1,216 +1,126 @@ -import { GetGuestRoomResultEvent, NavigatorSearchComposer, RateFlatMessageComposer, RoomDataParser } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { CreateLinkEvent, GetRoomEngine, LocalizeText, SendMessageComposer, SetLocalStorage, TryVisitRoom } from '../../../../api'; -import { Base, Column, Flex, Text, TransitionAnimation, TransitionAnimationTypes, classNames } from '../../../../common'; +import { CreateLinkEvent, GetGuestRoomResultEvent, GetRoomEngine, NavigatorSearchComposer, RateFlatMessageComposer } from '@nitrots/nitro-renderer'; +import { AnimatePresence, motion } from 'framer-motion'; +import { FC, useCallback, useEffect, useState } from 'react'; +import { LocalizeText, SendMessageComposer } from '../../../../api'; +import { Text } from '../../../../common'; import { useMessageEvent, useNavigator, useRoom } from '../../../../hooks'; +import { classNames } from '../../../../layout'; -export const RoomToolsWidgetView: FC<{}> = props => -{ - const [ areBubblesMuted, setAreBubblesMuted ] = useState(false); - 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 [ isOpenHistory, setIsOpenHistory ] = useState(false); - const [ show, setShow ] = useState(true); - const [ roomHistory, setRoomHistory ] = useState<{ roomId: number, roomName: string }[]>([]); +export const RoomToolsWidgetView: FC<{}> = () => { + 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(); - - useEffect(() => { if (!roomName) { setRoomName(LocalizeText('landing.view.generic.welcome.first_login')); } }, [roomName]); - const handleToolClick = (action: string, value?: string) => - { - switch(action) - { + const handleToolClick = useCallback((action: string, value?: string) => { + if (!roomSession?.roomId) return; + + switch (action) { case 'settings': CreateLinkEvent('navigator/toggle-room-info'); - return; + break; case 'zoom': - setIsZoomedIn(prevValue => - { - let scale = GetRoomEngine().getRoomInstanceRenderingCanvasScale(roomSession.roomId, 1); - - if(!prevValue) scale /= 2; - else scale *= 2; - - GetRoomEngine().setRoomInstanceRenderingCanvasScale(roomSession.roomId, 1, scale); - + setIsZoomedIn(prevValue => { + const scale = GetRoomEngine().getRoomInstanceRenderingCanvasScale(roomSession.roomId, 1); + const newScale = prevValue ? scale * 2 : scale / 2; + GetRoomEngine().setRoomInstanceRenderingCanvasScale(roomSession.roomId, 1, newScale); return !prevValue; }); - return; + break; case 'chat_history': CreateLinkEvent('chat-history/toggle'); - return; - case 'hiddenbubbles': - CreateLinkEvent('nitrobubblehidden/toggle'); - const bubbleElement = document.getElementById('bubble'); - if (bubbleElement) { - bubbleElement.classList.toggle('icon-chat-disablebubble'); - } - const hiddenbubblesTextElement = document.getElementById('hiddenbubblesText'); - if (hiddenbubblesTextElement) { - const newText = areBubblesMuted ? LocalizeText('room.unmute.button.text') : LocalizeText('room.mute.button.text'); - hiddenbubblesTextElement.innerText = newText; - } - setAreBubblesMuted(!areBubblesMuted); - const bubbleIcon = document.getElementById('bubbleIcon'); - if (bubbleIcon) { - bubbleIcon.classList.toggle('icon-chat-disablebubble'); - } - return; + break; case 'like_room': SendMessageComposer(new RateFlatMessageComposer(1)); - return; + break; case 'toggle_room_link': CreateLinkEvent('navigator/toggle-room-link'); - return; + break; case 'navigator_search_tag': - CreateLinkEvent(`navigator/search/${ value }`); - SendMessageComposer(new NavigatorSearchComposer('hotel_view', `tag:${ value }`)); - return; - case 'room_history': - if (roomHistory.length > 0) setIsOpenHistory(prevValue => !prevValue); - return; - case 'room_history_back': - TryVisitRoom(roomHistory[roomHistory.findIndex(room => room.roomId === navigatorData.currentRoomId) - 1].roomId); - return; - case 'room_history_next': - TryVisitRoom(roomHistory[roomHistory.findIndex(room => room.roomId === navigatorData.currentRoomId) + 1].roomId); - return; + if (value) { + CreateLinkEvent(`navigator/search/${value}`); + SendMessageComposer(new NavigatorSearchComposer('hotel_view', `tag:${value}`)); + } + break; + default: + break; } - } + }, [roomSession]); - const onChangeRoomHistory = (roomId: number, roomName: string) => - { - let newStorage = JSON.parse(window.localStorage.getItem('nitro.room.history')); - - if (newStorage && newStorage.filter( (room: RoomDataParser) => room.roomId === roomId ).length > 0) return; - - if (newStorage && newStorage.length >= 10) newStorage.shift(); - - const newData = !newStorage ? [ { roomId: roomId, roomName: roomName } ] : [ ...newStorage, { roomId: roomId, roomName: roomName } ]; - - setRoomHistory(newData); - return SetLocalStorage('nitro.room.history', newData ); - } - - useMessageEvent(GetGuestRoomResultEvent, event => - { + useMessageEvent(GetGuestRoomResultEvent, event => { const parser = event.getParser(); + if (!parser.roomEnter || parser.data.roomId !== roomSession?.roomId) return; - if(!parser.roomEnter || (parser.data.roomId !== roomSession.roomId)) return; - - 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); - - onChangeRoomHistory(parser.data.roomId, parser.data.roomName); + setRoomName(prev => prev !== parser.data.roomName ? parser.data.roomName : prev); + setRoomOwner(prev => prev !== parser.data.ownerName ? parser.data.ownerName : prev); + setRoomTags(prev => prev !== parser.data.tags ? parser.data.tags : prev); }); - useEffect(() => - { - const handleTabClose = () => - { - if (JSON.parse(window.localStorage.getItem('nitro.room.history'))) window.localStorage.removeItem('nitro.room.history'); - }; - - window.addEventListener('beforeunload', handleTabClose); - - return () => - { - window.removeEventListener('beforeunload', handleTabClose); - }; - }, []); + useEffect(() => { + if (!roomName && !roomOwner && !roomTags) return; - useEffect(() => - { setIsOpen(true); - const timeout = setTimeout(() => setIsOpen(false), 5000); return () => clearTimeout(timeout); - }, [ roomName, roomOwner, roomTags, show ]); + }, [roomName, roomOwner, roomTags]); - useEffect(() => - { - setRoomHistory(JSON.parse(window.localStorage.getItem('nitro.room.history')) ?? []); - }, [ ]); + if (!roomSession) return null; return ( - -
setShow(!show) }> -
+
+
+
handleToolClick('settings')} + /> +
handleToolClick('zoom')} + /> +
handleToolClick('chat_history')} + /> + {navigatorData?.canRate && ( +
handleToolClick('like_room')} + /> + )}
- { show && ( - <> - - - - handleToolClick('settings') } /> - handleToolClick('zoom') } className={ classNames('icon', (!isZoomedIn && 'icon-zoom-less'), (isZoomedIn && 'icon-zoom-more')) } /> - handleToolClick('chat_history') } className="icon icon-chat-history" /> - { navigatorData.canRate && - handleToolClick('like_room') } className="icon icon-like-room" /> } - handleToolClick('toggle_room_link') } className="icon icon-room-link" /> - handleToolClick('hiddenbubbles') } className={`icon ${areBubblesMuted ? 'icon-chat-disablebubble' : 'icon-chat-enablebubble'}`} /> - - - - handleToolClick('settings') }>{ LocalizeText('room.settings.button.text') } - - - handleToolClick('zoom') }>{ LocalizeText('room.zoom.button.text') } - - - handleToolClick('chat_history') }>{ LocalizeText('room.chathistory.button.text') } - { navigatorData.canRate && - - handleToolClick('like_room') }>{ LocalizeText('room.like.button.text') } - } - - handleToolClick('toggle_room_link') }>{ LocalizeText('navigator.embed.caption') } - - - handleToolClick('hiddenbubbles')}> {areBubblesMuted ? LocalizeText('room.unmute.button.text') : LocalizeText('room.mute.button.text')} - - - - - 1 && roomHistory[0]?.roomId !== navigatorData.currentRoomId } title={ LocalizeText('room.history.button.back.tooltip') } className={ `icon ${ (roomHistory?.length === 0 || roomHistory[0]?.roomId === navigatorData.currentRoomId) ? 'icon-room-history-back-disabled' : 'icon-room-history-back-enabled' }` } onClick={ () => (roomHistory?.length === 0 || roomHistory[0]?.roomId === navigatorData.currentRoomId) ? null : handleToolClick('room_history_back') } /> - 0 } title={ LocalizeText('room.history.button.tooltip') } className={ `icon ${ roomHistory?.length === 0 ? 'icon-room-history-disabled' : 'icon-room-history-enabled' } margin-button-history` } onClick={ () => roomHistory?.length === 0 ? null : handleToolClick('room_history') } /> - 1 && roomHistory[roomHistory.length - 1]?.roomId !== navigatorData.currentRoomId } title={ LocalizeText('room.history.button.forward.tooltip') } className={ `icon ${ (roomHistory?.length === 0 || roomHistory[roomHistory.length - 1]?.roomId === navigatorData.currentRoomId) ? 'icon-room-history-next-disabled' : 'icon-room-history-next-enabled' }` } onClick={ () => (roomHistory?.length === 0 || roomHistory[roomHistory.length - 1]?.roomId === navigatorData.currentRoomId) ? null : handleToolClick('room_history_next') } /> - - - - - - - - { (roomHistory.length > 0) && roomHistory.map(history => - { - return TryVisitRoom(history.roomId) }>{ history.roomName }; - }) } - - - - - - - - - - {roomName} {roomOwner} - {roomTags && roomTags.length > 0 ? ( - {roomTags.map((tag, index) => ( handleToolClick('navigator_search_tag', tag)} > #{tag} ))} - ) : ( { LocalizeText('navigator.notagsfound') } )} - - - - - - ) } - +
+ + {isOpen && ( + +
+
+
+ {roomName} + {roomOwner} +
+ {roomTags?.length > 0 && ( +
+ {roomTags.map((tag, index) => ( + handleToolClick('navigator_search_tag', tag)}> + #{tag} + + ))} +
+ )} +
+
+
+ )} +
+
+
); -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/components/room/widgets/user-location/UserLocationView.tsx b/src/components/room/widgets/user-location/UserLocationView.tsx index ca281ec..f7b9daa 100644 --- a/src/components/room/widgets/user-location/UserLocationView.tsx +++ b/src/components/room/widgets/user-location/UserLocationView.tsx @@ -20,5 +20,5 @@ export const UserLocationView: FC = props => if(!userData) return null; - return ; -} + return ; +}; diff --git a/src/components/room/widgets/word-quiz/WordQuizQuestionView.tsx b/src/components/room/widgets/word-quiz/WordQuizQuestionView.tsx index 3b4d051..92f0b96 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 { Column, Flex, Text } from '../../../../common'; interface WordQuizQuestionViewProps { @@ -14,31 +14,31 @@ interface WordQuizQuestionViewProps export const WordQuizQuestionView: FC = props => { const { question = null, canVote = null, vote = null, noVotes = null, yesVotes = null } = props; - + return ( - + { !canVote && - - +
+
{ noVotes } - - { question } - +
+ { question } +
{ yesVotes } - - } +
+
} { canVote && - - { question } - +
+ { question } +
vote(VALUE_KEY_DISLIKE) }> - +
vote(VALUE_KEY_LIKE) }> - +
- - } +
+
} ); -} +}; diff --git a/src/components/room/widgets/word-quiz/WordQuizVoteView.tsx b/src/components/room/widgets/word-quiz/WordQuizVoteView.tsx index 8437d76..b1925a0 100644 --- a/src/components/room/widgets/word-quiz/WordQuizVoteView.tsx +++ b/src/components/room/widgets/word-quiz/WordQuizVoteView.tsx @@ -1,7 +1,7 @@ import { RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC } from 'react'; import { VALUE_KEY_DISLIKE } from '../../../../api'; -import { Base, BaseProps, Flex } from '../../../../common'; +import { BaseProps } from '../../../../common'; import { ObjectLocationView } from '../object-location/ObjectLocationView'; interface WordQuizVoteViewProps extends BaseProps @@ -15,10 +15,10 @@ export const WordQuizVoteView: FC = props => const { userIndex = null, vote = null, ...rest } = props; return ( - - - - + +
+
+
); -} +}; diff --git a/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx b/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx index a04cfd8..d433d35 100644 --- a/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx +++ b/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx @@ -11,9 +11,9 @@ export const WordQuizWidgetView: FC<{}> = props => return ( <> { question && - } + } { userAnswers && Array.from(userAnswers.entries()).map(([ key, value ], index) => ) } ); -} +}; diff --git a/src/components/toolbar/ToolbarItemView.tsx b/src/components/toolbar/ToolbarItemView.tsx new file mode 100644 index 0000000..3a0822a --- /dev/null +++ b/src/components/toolbar/ToolbarItemView.tsx @@ -0,0 +1,22 @@ +import { DetailedHTMLProps, forwardRef, HTMLAttributes, PropsWithChildren } from 'react'; +import { classNames } from '../../layout'; + +export const ToolbarItemView = forwardRef & DetailedHTMLProps, HTMLDivElement>>((props, ref) => +{ + const { icon = null, className = null, ...rest } = props; + + return ( +
+ ); +}); + +ToolbarItemView.displayName = 'ToolbarItemView'; diff --git a/src/components/toolbar/ToolbarMeView.tsx b/src/components/toolbar/ToolbarMeView.tsx index d162cdd..6df6d5b 100644 --- a/src/components/toolbar/ToolbarMeView.tsx +++ b/src/components/toolbar/ToolbarMeView.tsx @@ -1,7 +1,7 @@ -import { MouseEventType, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent, GetRoomEngine, GetSessionDataManager, MouseEventType, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { Dispatch, FC, PropsWithChildren, SetStateAction, useEffect, useRef } from 'react'; -import { CreateLinkEvent, DispatchUiEvent, GetConfiguration, GetRoomEngine, GetRoomSession, GetSessionDataManager, GetUserProfile } from '../../api'; -import { Base, Flex, LayoutItemCountView } from '../../common'; +import { DispatchUiEvent, GetConfigurationValue, GetRoomSession, GetUserProfile } from '../../api'; +import { Flex, LayoutItemCountView } from '../../common'; import { GuideToolEvent } from '../../events'; interface ToolbarMeViewProps @@ -35,18 +35,18 @@ export const ToolbarMeView: FC> = props => }, [ setMeExpanded ]); return ( - - { (GetConfiguration('guides.enabled') && useGuideTool) && - DispatchUiEvent(new GuideToolEvent(GuideToolEvent.TOGGLE_GUIDE_TOOL)) } /> } - CreateLinkEvent('achievements/toggle') }> + + { (GetConfigurationValue('guides.enabled') && useGuideTool) && +
DispatchUiEvent(new GuideToolEvent(GuideToolEvent.TOGGLE_GUIDE_TOOL)) } /> } +
CreateLinkEvent('achievements/toggle') }> { (unseenAchievementCount > 0) && } - - GetUserProfile(GetSessionDataManager().userId) } /> - CreateLinkEvent('navigator/search/myworld_view') } /> - CreateLinkEvent('avatar-editor/toggle') } /> - CreateLinkEvent('user-settings/toggle') } /> +
+
GetUserProfile(GetSessionDataManager().userId) } /> +
CreateLinkEvent('navigator/search/myworld_view') } /> +
CreateLinkEvent('avatar-editor/toggle') } /> +
CreateLinkEvent('user-settings/toggle') } /> { children } ); -} +}; diff --git a/src/components/toolbar/ToolbarView.scss b/src/components/toolbar/ToolbarView.scss deleted file mode 100644 index 2a356dc..0000000 --- a/src/components/toolbar/ToolbarView.scss +++ /dev/null @@ -1,141 +0,0 @@ -.nitro-toolbar { - position: absolute; - bottom: 14px; - left: 0; - width: 100%; - height: $toolbar-height; - z-index: $toolbar-zindex; - pointer-events: all; - //background: rgba($dark, 0.95); - //box-shadow: inset 0px 5px lighten(rgba($dark, 0.6), 2.5), inset 0 -4px darken(rgba($dark, 0.6), 4); - - .navigation-item { - position: relative; - - &.item-avatar { - color: #fff; - background-color: #b69b83; - width: 50px; - height: 50px; - border-radius: 32px; - border: 2px solid #fff; - padding: 1.75em; - position: relative; - @include media-breakpoint-down(sm) { - position: fixed; - top: 50px; - left: 6px; - } - - .avatar-image { - margin-left: 0px; - margin-top: 45px; - } - } - - &:hover { - -webkit-transform: translate(-1px, -1px); - transform: translate(-1px, -1px); - filter: drop-shadow(2px 2px 0 rgba($black, 0.8)); - } - - &.active, - &:active { - -webkit-transform: unset; - transform: unset; - filter: none; - } - } - - #toolbar-chat-input-container { - width: 100%; - display: block!important; - - @include media-breakpoint-down(sm) { - width: 0px; - height: 0px; - } - } - .click-box { - background-color: #424354; - border: 2px solid #63647a; - box-shadow: 0 0 0 1px #63647a; - border-radius: 1rem; - padding: 0.2rem; - width: 3.65em; - height: 3.65em; - position: relative; - } -} - -.nitro-toolbar-me { - position: absolute; - bottom: 68px; - left: 15px; - z-index: $toolbar-memenu-zindex; - //background: rgba(20, 20, 20, .95); - //border: 1px solid #101010; - //box-shadow: inset 2px 2px rgba(255, 255, 255, .1), inset -2px -2px rgba(255, 255, 255, .1); - //border-radius: $border-radius; - @include media-breakpoint-down(sm) { - position: fixed!important; - top: 37px; - display: grid!important; - grid-template-columns: repeat(2, minmax(0, 5fr)); - -moz-column-gap: 0rem!important; - column-gap: 0.5rem!important; - row-gap: 0rem!important; - height: 200px; - left: 62px; - z-index: 9999999; - } - - .navigation-item { - transition: filter .2s ease-out; - } - .click-box { - background-color: #212131; - border-radius: 3.3rem; - padding: 0.2rem; - width: 3.5em; - height: 3.5em; - text-align: center; - position: relative; - } - .click-box:hover { - border: 3px solid #3c3c59; - } -} - -.toolbar-icon-animation { - position: absolute; - object-fit: cover; - height: auto; - width: auto; - max-width: 120px; - max-height: 150px; - z-index: 500; - filter: drop-shadow(2px 1px 0 rgba($white, 1)) - drop-shadow(-2px 1px 0 rgba($white, 1)) - drop-shadow(0 -2px 0 rgba($white, 1)); -} -.widthsizemax{ - width: 100%; - @include media-breakpoint-down(sm) { - justify-content: center; - } -} -.friendsmovilgen{ - @include media-breakpoint-down(sm) { - position: fixed!important; - top: 110px; - left: 6px; - } -} -.mensajesmovilgen{ - @include media-breakpoint-down(sm) { - position: fixed!important; - top: 169px; - left: 6px; - } -} diff --git a/src/components/toolbar/ToolbarView.tsx b/src/components/toolbar/ToolbarView.tsx index 940e60b..5f97b58 100644 --- a/src/components/toolbar/ToolbarView.tsx +++ b/src/components/toolbar/ToolbarView.tsx @@ -1,8 +1,10 @@ -import { Dispose, DropBounce, EaseOut, JumpBy, Motions, NitroToolbarAnimateIconEvent, PerkAllowancesMessageEvent, PerkEnum, Queue, Wait } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent, Dispose, DropBounce, EaseOut, GetSessionDataManager, JumpBy, Motions, NitroToolbarAnimateIconEvent, PerkAllowancesMessageEvent, PerkEnum, Queue, Wait } from '@nitrots/nitro-renderer'; +import { AnimatePresence, motion } from 'framer-motion'; import { FC, useState } from 'react'; -import { CreateLinkEvent, GetConfiguration, GetSessionDataManager, MessengerIconState, OpenMessengerChat, VisitDesktop } from '../../api'; -import { Base, Flex, LayoutAvatarImageView, LayoutItemCountView, TransitionAnimation, TransitionAnimationTypes } from '../../common'; -import { useAchievements, useFriends, useInventoryUnseenTracker, useMessageEvent, useMessenger, useRoomEngineEvent, useSessionInfo } from '../../hooks'; +import { GetConfigurationValue, MessengerIconState, OpenMessengerChat, VisitDesktop } from '../../api'; +import { Flex, LayoutAvatarImageView, LayoutItemCountView } from '../../common'; +import { useAchievements, useFriends, useInventoryUnseenTracker, useMessageEvent, useMessenger, useNitroEvent, useSessionInfo } from '../../hooks'; +import { ToolbarItemView } from './ToolbarItemView'; import { ToolbarMeView } from './ToolbarMeView'; export const ToolbarView: FC<{ isInRoom: boolean }> = props => @@ -16,22 +18,20 @@ export const ToolbarView: FC<{ isInRoom: boolean }> = props => const { requests = [] } = useFriends(); const { iconState = MessengerIconState.HIDDEN } = useMessenger(); const isMod = GetSessionDataManager().isModerator; - + useMessageEvent(PerkAllowancesMessageEvent, event => { - const parser = event.getParser(); - - setUseGuideTool(parser.isAllowed(PerkEnum.USE_GUIDE_TOOL)); + setUseGuideTool(event.getParser().isAllowed(PerkEnum.USE_GUIDE_TOOL)); }); - useRoomEngineEvent(NitroToolbarAnimateIconEvent.ANIMATE_ICON, event => + useNitroEvent(NitroToolbarAnimateIconEvent.ANIMATE_ICON, event => { const animationIconToToolbar = (iconName: string, image: HTMLImageElement, x: number, y: number) => { const target = (document.body.getElementsByClassName(iconName)[0] as HTMLElement); if(!target) return; - + image.className = 'toolbar-icon-animation'; image.style.visibility = 'visible'; image.style.left = (x + 'px'); @@ -58,54 +58,56 @@ export const ToolbarView: FC<{ isInRoom: boolean }> = props => const motion = new Queue(new EaseOut(new JumpBy(image, wait, ((targetBounds.x - imageBounds.x) + height), (targetBounds.y - imageBounds.y), 100, 1), 1), new Dispose(image)); Motions.runMotion(motion); - } + }; animationIconToToolbar('icon-inventory', event.image, event.x, event.y); }); return ( <> - - - - - + { isMeExpanded && + + } + + + - setMeExpanded(!isMeExpanded) }> - + setMeExpanded(!isMeExpanded) }> + { (getTotalUnseen > 0) && } { isInRoom && - VisitDesktop() } /> } + VisitDesktop() } /> } { !isInRoom && - CreateLinkEvent('navigator/goto/home') } /> } - CreateLinkEvent('navigator/toggle') } /> - { GetConfiguration('game.center.enabled') && CreateLinkEvent('games/toggle') } /> } - CreateLinkEvent('catalog/toggle') } /> - CreateLinkEvent('inventory/toggle') }> + CreateLinkEvent('navigator/goto/home') } /> } + CreateLinkEvent('navigator/toggle') } /> + { GetConfigurationValue('game.center.enabled') && + CreateLinkEvent('games/toggle') } /> } + CreateLinkEvent('catalog/toggle') } /> + CreateLinkEvent('inventory/toggle') }> { (getFullCount > 0) && } - + { isInRoom && - CreateLinkEvent('camera/toggle') } /> } + CreateLinkEvent('camera/toggle') } /> } { isMod && - CreateLinkEvent('mod-tools/toggle') } /> } + CreateLinkEvent('mod-tools/toggle') } /> } - CreateLinkEvent('friends/toggle') }> + CreateLinkEvent('friends/toggle') }> { (requests.length > 0) && } - + { ((iconState === MessengerIconState.SHOW) || (iconState === MessengerIconState.UNREAD)) && - OpenMessengerChat() } /> } + OpenMessengerChat() } /> } - +
); -} +}; diff --git a/src/components/user-profile/views/FriendsContainerView.tsx b/src/components/user-profile/FriendsContainerView.tsx similarity index 64% rename from src/components/user-profile/views/FriendsContainerView.tsx rename to src/components/user-profile/FriendsContainerView.tsx index f5449d1..b92b82d 100644 --- a/src/components/user-profile/views/FriendsContainerView.tsx +++ b/src/components/user-profile/FriendsContainerView.tsx @@ -1,7 +1,6 @@ import { RelationshipStatusInfoMessageParser } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { LocalizeText } from '../../../api'; -import { Column, Text } from '../../../common'; +import { LocalizeText } from '../../api'; import { RelationshipsContainerView } from './RelationshipsContainerView'; interface FriendsContainerViewProps @@ -10,19 +9,19 @@ interface FriendsContainerViewProps friendsCount: number; } -export const FriendsContainerView: FC = props => +export const FriendsContainerView: FC = props => { const { relationships = null, friendsCount = null } = props; return ( - - +
+

{ LocalizeText('extendedprofile.friends.count') } { friendsCount } - - { LocalizeText('extendedprofile.relstatus') } - +

+
+

{ LocalizeText('extendedprofile.relstatus') }

- - - ) -} +
+
+ ); +}; diff --git a/src/components/user-profile/views/GroupsContainerView.tsx b/src/components/user-profile/GroupsContainerView.tsx similarity index 64% rename from src/components/user-profile/views/GroupsContainerView.tsx rename to src/components/user-profile/GroupsContainerView.tsx index bd598ee..3ffd787 100644 --- a/src/components/user-profile/views/GroupsContainerView.tsx +++ b/src/components/user-profile/GroupsContainerView.tsx @@ -1,9 +1,9 @@ import { GroupInformationComposer, GroupInformationEvent, GroupInformationParser, HabboGroupEntryData } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { SendMessageComposer, ToggleFavoriteGroup } from '../../../api'; -import { AutoGrid, Base, Column, Flex, Grid, GridProps, LayoutBadgeImageView, LayoutGridItem } from '../../../common'; -import { useMessageEvent } from '../../../hooks'; -import { GroupInformationView } from '../../groups/views/GroupInformationView'; +import { SendMessageComposer, ToggleFavoriteGroup } from '../../api'; +import { AutoGrid, Column, Grid, GridProps, LayoutBadgeImageView, LayoutGridItem } from '../../common'; +import { useMessageEvent } from '../../hooks'; +import { GroupInformationView } from '../groups/views/GroupInformationView'; interface GroupsContainerViewProps extends GridProps { @@ -30,7 +30,7 @@ export const GroupsContainerView: FC = props => useEffect(() => { if(!selectedGroupId) return; - + SendMessageComposer(new GroupInformationComposer(selectedGroupId, false)); }, [ selectedGroupId ]); @@ -56,35 +56,35 @@ export const GroupsContainerView: FC = props => { return ( - - - - - +
+
+
+
+
); } - + return ( - - - + + + { groups.map((group, index) => { return ( - setSelectedGroupId(group.groupId) } className="p-1"> + setSelectedGroupId(group.groupId) }> { itsMe && - ToggleFavoriteGroup(group) } /> } + ToggleFavoriteGroup(group) } /> } - ) + ); }) } - + { groupInformation && } ); -} +}; diff --git a/src/components/user-profile/views/RelationshipsContainerView.tsx b/src/components/user-profile/RelationshipsContainerView.tsx similarity index 65% rename from src/components/user-profile/views/RelationshipsContainerView.tsx rename to src/components/user-profile/RelationshipsContainerView.tsx index 9b698ec..7bdca66 100644 --- a/src/components/user-profile/views/RelationshipsContainerView.tsx +++ b/src/components/user-profile/RelationshipsContainerView.tsx @@ -1,7 +1,7 @@ import { RelationshipStatusEnum, RelationshipStatusInfoMessageParser } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { GetUserProfile, LocalizeText } from '../../../api'; -import { Column, Flex, LayoutAvatarImageView, Text } from '../../../common'; +import { GetUserProfile, LocalizeText } from '../../api'; +import { Flex, LayoutAvatarImageView } from '../../common'; interface RelationshipsContainerViewProps { @@ -23,34 +23,34 @@ export const RelationshipsContainerView: FC = p const relationshipName = RelationshipStatusEnum.RELATIONSHIP_NAMES[type].toLocaleLowerCase(); return ( - - +
+ - - - (relationshipInfo && (relationshipInfo.randomFriendId >= 1) && GetUserProfile(relationshipInfo.randomFriendId)) }> +
+
+

(relationshipInfo && (relationshipInfo.randomFriendId >= 1) && GetUserProfile(relationshipInfo.randomFriendId)) }> { (!relationshipInfo || (relationshipInfo.friendCount === 0)) && LocalizeText('extendedprofile.add.friends') } { (relationshipInfo && (relationshipInfo.friendCount >= 1)) && relationshipInfo.randomFriendName } - +

{ (relationshipInfo && (relationshipInfo.friendCount >= 1)) && - - - } - - +
+ +
} +
+

{ (!relationshipInfo || (relationshipInfo.friendCount === 0)) && LocalizeText('extendedprofile.no.friends.in.this.category') } { (relationshipInfo && (relationshipInfo.friendCount > 1)) && LocalizeText(`extendedprofile.relstatus.others.${ relationshipName }`, [ 'count' ], [ (relationshipInfo.friendCount - 1).toString() ]) }   - - - +

+
+
); - } + }; return ( <> @@ -59,4 +59,4 @@ export const RelationshipsContainerView: FC = p ); -} +}; diff --git a/src/components/user-profile/UserContainerView.tsx b/src/components/user-profile/UserContainerView.tsx new file mode 100644 index 0000000..20d0768 --- /dev/null +++ b/src/components/user-profile/UserContainerView.tsx @@ -0,0 +1,71 @@ +import { GetSessionDataManager, RequestFriendComposer, UserProfileParser } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; +import { FriendlyTime, LocalizeText, SendMessageComposer } from '../../api'; +import { LayoutAvatarImageView, Text } from '../../common'; + +export const UserContainerView: FC<{ + userProfile: UserProfileParser; +}> = props => +{ + const { userProfile = null } = props; + const [ requestSent, setRequestSent ] = useState(userProfile.requestSent); + const isOwnProfile = (userProfile.id === GetSessionDataManager().userId); + const canSendFriendRequest = !requestSent && (!isOwnProfile && !userProfile.isMyFriend && !userProfile.requestSent); + + const addFriend = () => + { + setRequestSent(true); + + SendMessageComposer(new RequestFriendComposer(userProfile.username)); + }; + + useEffect(() => + { + setRequestSent(userProfile.requestSent); + }, [ userProfile ]); + + return ( +
+
+ +
+
+
+

{ userProfile.username }

+

{ userProfile.motto }

+
+
+

+ { LocalizeText('extendedprofile.created') } { userProfile.registration } +

+

+ { LocalizeText('extendedprofile.last.login') } { FriendlyTime.format(userProfile.secondsSinceLastVisit, '.ago', 2) } +

+

+ { LocalizeText('extendedprofile.achievementscore') } { userProfile.achievementPoints } +

+
+
+ { userProfile.isOnline && + } + { !userProfile.isOnline && + } +
+ { canSendFriendRequest && + { LocalizeText('extendedprofile.addasafriend') } } + { !canSendFriendRequest && + <> + + { isOwnProfile && +

{ LocalizeText('extendedprofile.me') }

} + { userProfile.isMyFriend && +

{ LocalizeText('extendedprofile.friend') }

} + { (requestSent || userProfile.requestSent) && +

{ LocalizeText('extendedprofile.friendrequestsent') }

} + } +
+
+
+
+ ); +}; diff --git a/src/components/user-profile/UserProfileVew.scss b/src/components/user-profile/UserProfileVew.scss deleted file mode 100644 index edcfde6..0000000 --- a/src/components/user-profile/UserProfileVew.scss +++ /dev/null @@ -1,67 +0,0 @@ -.user-profile { - width: $user-profile-width; - height: $user-profile-height; - - .user-container { - border-right: 1px solid gray; - - .avatar-container { - width: 75px; - height: 120px; - } - } - - .rooms-button-container { - border-top: 1px solid gray; - border-bottom: 1px solid gray; - } - - .user-relationship { - height: 25px; - - .avatar-image-container { - width: 50px; - height: 50px; - - .avatar-image { - top: 20px; - right: -8pxpx; - } - } - } - - .user-relationship-count { - margin-top: 2px; - margin-left: 5px; - color: #939392 !important; - } - - .user-groups-container { - - .layout-grid-item { - width: 50px; - } - } - - .no-group-spritesheet { - background: transparent url('@/assets/images/groups/no-group-spritesheet.png') no-repeat; - - &.image-1 { - width: 95px; - height: 136px; - background-position: -3px -3px; - } - - &.image-2 { - width: 95px; - height: 136px; - background-position: -104px -3px; - } - - &.image-3 { - width: 95px; - height: 136px; - background-position: -205px -3px; - } - } -} diff --git a/src/components/user-profile/UserProfileView.tsx b/src/components/user-profile/UserProfileView.tsx index 6327c29..f57612b 100644 --- a/src/components/user-profile/UserProfileView.tsx +++ b/src/components/user-profile/UserProfileView.tsx @@ -1,12 +1,12 @@ -import { ExtendedProfileChangedMessageEvent, RelationshipStatusInfoEvent, RelationshipStatusInfoMessageParser, RoomEngineObjectEvent, RoomObjectCategory, RoomObjectType, UserCurrentBadgesComposer, UserCurrentBadgesEvent, UserProfileEvent, UserProfileParser, UserRelationshipsComposer } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent, ExtendedProfileChangedMessageEvent, GetSessionDataManager, RelationshipStatusInfoEvent, RelationshipStatusInfoMessageParser, RoomEngineObjectEvent, RoomObjectCategory, RoomObjectType, UserCurrentBadgesComposer, UserCurrentBadgesEvent, UserProfileEvent, UserProfileParser, UserRelationshipsComposer } from '@nitrots/nitro-renderer'; import { FC, useState } from 'react'; -import { CreateLinkEvent, GetRoomSession, GetSessionDataManager, GetUserProfile, LocalizeText, SendMessageComposer } from '../../api'; -import { Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { useMessageEvent, useRoomEngineEvent } from '../../hooks'; -import { BadgesContainerView } from './views/BadgesContainerView'; -import { FriendsContainerView } from './views/FriendsContainerView'; -import { GroupsContainerView } from './views/GroupsContainerView'; -import { UserContainerView } from './views/UserContainerView'; +import { GetRoomSession, GetUserProfile, LocalizeText, SendMessageComposer } from '../../api'; +import { Flex, Grid, LayoutBadgeImageView, Text } from '../../common'; +import { useMessageEvent, useNitroEvent } from '../../hooks'; +import { NitroCard } from '../../layout'; +import { FriendsContainerView } from './FriendsContainerView'; +import { GroupsContainerView } from './GroupsContainerView'; +import { UserContainerView } from './UserContainerView'; export const UserProfileView: FC<{}> = props => { @@ -19,14 +19,14 @@ export const UserProfileView: FC<{}> = props => setUserProfile(null); setUserBadges([]); setUserRelationships(null); - } + }; const onLeaveGroup = () => { if(!userProfile || (userProfile.id !== GetSessionDataManager().userId)) return; GetUserProfile(userProfile.id); - } + }; useMessageEvent(UserCurrentBadgesEvent, event => { @@ -78,7 +78,7 @@ export const UserProfileView: FC<{}> = props => GetUserProfile(parser.userId); }); - useRoomEngineEvent(RoomEngineObjectEvent.SELECTED, event => + useNitroEvent(RoomEngineObjectEvent.SELECTED, event => { if(!userProfile) return; @@ -94,29 +94,32 @@ export const UserProfileView: FC<{}> = props => if(!userProfile) return null; return ( - - - + + + - +
- - - - - +
+ { userBadges && (userBadges.length > 0) && userBadges.map((badge, index) => ) } +
+
+
{ userRelationships && - } - + } +
- + CreateLinkEvent(`navigator/search/hotel_view/owner:${ userProfile.username }`) }> - - { LocalizeText('extendedprofile.rooms') } + + { LocalizeText('extendedprofile.rooms') } - -
-
- ) -} + + + + ); +}; diff --git a/src/components/user-profile/views/BadgesContainerView.tsx b/src/components/user-profile/views/BadgesContainerView.tsx deleted file mode 100644 index ca59fc2..0000000 --- a/src/components/user-profile/views/BadgesContainerView.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { FC } from 'react'; -import { Column, FlexProps, LayoutBadgeImageView } from '../../../common'; - -interface BadgesContainerViewProps extends FlexProps -{ - badges: string[]; -} - -export const BadgesContainerView: FC = props => -{ - const { badges = null, gap = 1, justifyContent = 'between', ...rest } = props; - - return ( - <> - { badges && (badges.length > 0) && badges.map((badge, index) => - { - return ( - - - - ); - }) } - - ); -} diff --git a/src/components/user-profile/views/UserContainerView.tsx b/src/components/user-profile/views/UserContainerView.tsx deleted file mode 100644 index ceba4bf..0000000 --- a/src/components/user-profile/views/UserContainerView.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { FriendlyTime, RequestFriendComposer, UserProfileParser } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { GetSessionDataManager, LocalizeText, SendMessageComposer } from '../../../api'; -import { Column, Flex, LayoutAvatarImageView, Text } from '../../../common'; - -interface UserContainerViewProps -{ - userProfile: UserProfileParser; -} - -export const UserContainerView: FC = props => -{ - const { userProfile = null } = props; - const [ requestSent, setRequestSent ] = useState(userProfile.requestSent); - const isOwnProfile = (userProfile.id === GetSessionDataManager().userId); - const canSendFriendRequest = !requestSent && (!isOwnProfile && !userProfile.isMyFriend && !userProfile.requestSent); - - const addFriend = () => - { - setRequestSent(true); - - SendMessageComposer(new RequestFriendComposer(userProfile.username)); - } - - useEffect(() => - { - setRequestSent(userProfile.requestSent); - }, [ userProfile ]) - - return ( - - - - - - - { userProfile.username } - { userProfile.motto }  - - - - { LocalizeText('extendedprofile.created') } { userProfile.registration } - - - { LocalizeText('extendedprofile.last.login') } { FriendlyTime.format(userProfile.secondsSinceLastVisit, '.ago', 2) } - - - { LocalizeText('extendedprofile.achievementscore') } { userProfile.achievementPoints } - - - - { userProfile.isOnline && - } - { !userProfile.isOnline && - } - - { canSendFriendRequest && - { LocalizeText('extendedprofile.addasafriend') } } - { !canSendFriendRequest && - <> - - { isOwnProfile && - { LocalizeText('extendedprofile.me') } } - { userProfile.isMyFriend && - { LocalizeText('extendedprofile.friend') } } - { (requestSent || userProfile.requestSent) && - { LocalizeText('extendedprofile.friendrequestsent') } } - } - - - - - ) -} diff --git a/src/components/user-settings/UserSettingsView.tsx b/src/components/user-settings/UserSettingsView.tsx index 45a4546..d52df74 100644 --- a/src/components/user-settings/UserSettingsView.tsx +++ b/src/components/user-settings/UserSettingsView.tsx @@ -1,9 +1,10 @@ -import { ILinkEventTracker, NitroSettingsEvent, UserSettingsCameraFollowComposer, UserSettingsEvent, UserSettingsOldChatComposer, UserSettingsRoomInvitesComposer, UserSettingsSoundComposer } from '@nitrots/nitro-renderer'; +import { AddLinkEventTracker, ILinkEventTracker, NitroSettingsEvent, RemoveLinkEventTracker, UserSettingsCameraFollowComposer, UserSettingsEvent, UserSettingsOldChatComposer, UserSettingsRoomInvitesComposer, UserSettingsSoundComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { FaVolumeDown, FaVolumeMute, FaVolumeUp } from 'react-icons/fa'; -import { AddEventLinkTracker, DispatchMainEvent, DispatchUiEvent, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; -import { classNames, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; +import { DispatchMainEvent, DispatchUiEvent, LocalizeText, SendMessageComposer } from '../../api'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; import { useCatalogPlaceMultipleItems, useCatalogSkipPurchaseConfirmation, useMessageEvent } from '../../hooks'; +import { classNames } from '../../layout'; export const UserSettingsView: FC<{}> = props => { @@ -54,9 +55,9 @@ export const UserSettingsView: FC<{}> = props => } if(doUpdate) setUserSettings(clone); - - DispatchMainEvent(clone) - } + + DispatchMainEvent(clone); + }; const saveRangeSlider = (type: string) => { @@ -66,7 +67,7 @@ export const UserSettingsView: FC<{}> = props => SendMessageComposer(new UserSettingsSoundComposer(Math.round(userSettings.volumeSystem), Math.round(userSettings.volumeFurni), Math.round(userSettings.volumeTrax))); break; } - } + }; useMessageEvent(UserSettingsEvent, event => { @@ -94,7 +95,7 @@ export const UserSettingsView: FC<{}> = props => const parts = url.split('/'); if(parts.length < 2) return; - + switch(parts[1]) { case 'show': @@ -111,7 +112,7 @@ export const UserSettingsView: FC<{}> = props => eventUrlPrefix: 'user-settings/' }; - AddEventLinkTracker(linkTracker); + AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); @@ -126,62 +127,62 @@ export const UserSettingsView: FC<{}> = props => if(!isVisible || !userSettings) return null; return ( - + processAction('close_view') } /> - - - processAction('oldchat', event.target.checked) } /> +
+
+ processAction('oldchat', event.target.checked) } /> { LocalizeText('memenu.settings.chat.prefer.old.chat') } - - - processAction('room_invites', event.target.checked) } /> +
+
+ processAction('room_invites', event.target.checked) } /> { LocalizeText('memenu.settings.other.ignore.room.invites') } - - - processAction('camera_follow', event.target.checked) } /> +
+
+ processAction('camera_follow', event.target.checked) } /> { LocalizeText('memenu.settings.other.disable.room.camera.follow') } - - - setCatalogPlaceMultipleObjects(event.target.checked) } /> +
+
+ setCatalogPlaceMultipleObjects(event.target.checked) } /> { LocalizeText('memenu.settings.other.place.multiple.objects') } - - - setCatalogSkipPurchaseConfirmation(event.target.checked) } /> +
+
+ setCatalogSkipPurchaseConfirmation(event.target.checked) } /> { LocalizeText('memenu.settings.other.skip.purchase.confirmation') } - - - +
+
+
{ LocalizeText('widget.memenu.settings.volume') } - +
{ LocalizeText('widget.memenu.settings.volume.ui') } - +
{ (userSettings.volumeSystem === 0) && = 50) && 'text-muted', 'fa-icon') } /> } { (userSettings.volumeSystem > 0) && = 50) && 'text-muted', 'fa-icon') } /> } - processAction('system_volume', event.target.value) } onMouseUp={ () => saveRangeSlider('volume') }/> + processAction('system_volume', event.target.value) } onMouseUp={ () => saveRangeSlider('volume') } /> - - - +
+
+
{ LocalizeText('widget.memenu.settings.volume.furni') } - +
{ (userSettings.volumeFurni === 0) && = 50) && 'text-muted', 'fa-icon') } /> } { (userSettings.volumeFurni > 0) && = 50) && 'text-muted', 'fa-icon') } /> } - processAction('furni_volume', event.target.value) } onMouseUp={ () => saveRangeSlider('volume') }/> + processAction('furni_volume', event.target.value) } onMouseUp={ () => saveRangeSlider('volume') } /> - - - +
+
+
{ LocalizeText('widget.memenu.settings.volume.trax') } - +
{ (userSettings.volumeTrax === 0) && = 50) && 'text-muted', 'fa-icon') } /> } { (userSettings.volumeTrax > 0) && = 50) && 'text-muted', 'fa-icon') } /> } - processAction('trax_volume', event.target.value) } onMouseUp={ () => saveRangeSlider('volume') }/> + processAction('trax_volume', event.target.value) } onMouseUp={ () => saveRangeSlider('volume') } /> - - - +
+
+
); -} +}; diff --git a/src/components/wired/WiredView.scss b/src/components/wired/WiredView.scss deleted file mode 100644 index 06569ad..0000000 --- a/src/components/wired/WiredView.scss +++ /dev/null @@ -1,175 +0,0 @@ -.nitro-wired { - width: 300px; - - .icon { - background-repeat: no-repeat; - background-position: center; - - &.icon-mv-1 { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_around.png'); - } - &.icon-mv-2 { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_up_down.png'); - } - &.icon-mv-3 { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_left_right.png'); - } - &.icon-ne { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_north_east.png'); - } - &.icon-se { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_south_east.png'); - } - &.icon-sw { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_south_west.png'); - } - &.icon-nw { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_north_west.png'); - } - &.icon-rot-1 { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_rotate_clockwise.png'); - } - &.icon-rot-2 { - width: 16px; - height: 9px; - background-image: url('@/assets/images/wired/icon_wired_rotate_counter_clockwise.png'); - } - } - - .nitro-wired-header { - color: #000; - margin-bottom:3px; - - .nitro-wired-title, .nitro-wired-close { - border:1px solid rgba($black,.8); - background-image: linear-gradient(45deg, #00d9cb 25%, #00bdb0 25%, #00bdb0 50%, #00d9cb 50%, #00d9cb 75%, #00bdb0 75%, #00bdb0 100%); - background-size: 197.99px 197.99px; - animation: wiredSlider 3s linear infinite; - text-align: center; - box-shadow:inset 0 0 0 2px rgba($white,.6), 0 2px rgba($black,.4); - } - - .nitro-wired-title { - margin-right:3px; - } - - .nitro-wired-close { - min-width: 23px; - } - } - - &.nitro-wired-trigger { - background-color: #3b2516 !important; - border: 1px solid #000 !important; - box-shadow: inset 0px -2px #50321f, - inset 0px -3px #86583b, - inset 0 0 0 1px #86583b, - inset 0 0 0 3px #644029, - inset 0 0 0 4px rgba($black,.4) !important; - - .bg-light,.bg-primary { - background-color: transparent !important; - } - - .bg-dark { - background-color: #000 !important; - } - } - - &.nitro-wired-action { - background-color: #686868 !important; - border: 1px solid #000 !important; - box-shadow: inset 0px -2px #9d9d9d, - inset 0px -3px #c5c5c5, - inset 0 0 0 1px #c5c5c5, - inset 0 0 0 3px #9d9d9d, - inset 0 0 0 4px rgba($black,.4) !important; - - .bg-light,.bg-primary { - background-color: transparent !important; - } - - .bg-dark { - background-color: #000 !important; - } - - &::before, - &::after, - .content-area::before, - .content-area::after { - content: ''; - height: 6px; - width: 6px; - position: absolute; - background-image: url('@/assets/images/wired/card-action-corners.png'); - } - - &::before { - background-position: 0 0; - top: 0; - left: 0; - } - - &::after { - background-position: 6px 0; - top: 0; - right: 0; - } - - .content-area { - &::before { - background-position: 0 6px; - bottom: 0; - left: 0; - } - - &::after { - background-position: 6px 6px; - bottom: 0; - right: 0; - } - } - } - - &.nitro-wired-condition { - background-color: #cfd2dd !important; - border: 1px solid #000 !important; - box-shadow: inset 0 0 0 3px #efefef, inset 4px 4px #abaeb9 !important; - color: #000; - - .bg-light,.bg-primary { - background-color: transparent !important; - } - - .bg-dark { - background-color: #000 !important; - } - } -} - - -@keyframes wiredSlider { - 0% { - background-position: 0 0; - } - - 100% { - background-position: 0 -197.99px; - } -} diff --git a/src/components/wired/WiredView.tsx b/src/components/wired/WiredView.tsx index cb3b4ba..0f073ab 100644 --- a/src/components/wired/WiredView.tsx +++ b/src/components/wired/WiredView.tsx @@ -14,8 +14,8 @@ export const WiredView: FC<{}> = props => if(trigger instanceof WiredActionDefinition) return WiredActionLayoutView(trigger.code); if(trigger instanceof TriggerDefinition) return WiredTriggerLayoutView(trigger.code); - + if(trigger instanceof ConditionDefinition) return WiredConditionLayoutView(trigger.code); - + return null; }; diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx index 32fe0c3..8e8fb37 100644 --- a/src/components/wired/views/WiredBaseView.tsx +++ b/src/components/wired/views/WiredBaseView.tsx @@ -1,101 +1,113 @@ +import { GetSessionDataManager } from '@nitrots/nitro-renderer'; 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 { LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../api'; +import { Button, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; import { useWired } from '../../../hooks'; import { WiredFurniSelectorView } from './WiredFurniSelectorView'; -export interface WiredBaseViewProps { +export interface WiredBaseViewProps +{ wiredType: string; requiresFurni: number; hasSpecialInput: boolean; save: () => void; validate?: () => boolean; - maxItemSelectionCount?: number; // Optional parameter } -export const WiredBaseView: FC> = props => { - const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false, maxItemSelectionCount = 5 } = props; - const [wiredName, setWiredName] = useState(null); - const [wiredDescription, setWiredDescription] = useState(null); - const [needsSave, setNeedsSave] = useState(false); - const { trigger, setTrigger, setIntParams, setStringParam, setFurniIds, setAllowsFurni, saveWired, setMaxItemSelectionCount: setMaxCount } = useWired(); - - useEffect(() => { - setMaxCount(maxItemSelectionCount); - }, [maxItemSelectionCount, setMaxCount]); +export const WiredBaseView: FC> = 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 [ needsSave, setNeedsSave ] = useState(false); + const { trigger = null, setTrigger = null, setIntParams = null, setStringParam = null, setFurniIds = null, setAllowsFurni = null, saveWired = null } = useWired(); const onClose = () => setTrigger(null); - const onSave = () => { - if (validate && !validate()) return; - if (save) save(); + const onSave = () => + { + if(validate && !validate()) return; + + if(save) save(); + setNeedsSave(true); }; - useEffect(() => { - if (!needsSave) return; - saveWired(); - setNeedsSave(false); - }, [needsSave, saveWired]); + useEffect(() => + { + if(!needsSave) return; - useEffect(() => { - if (!trigger) return; - const spriteId = trigger.spriteId || -1; + saveWired(); + + setNeedsSave(false); + }, [ needsSave, saveWired ]); + + useEffect(() => + { + if(!trigger) return; + + const spriteId = (trigger.spriteId || -1); const furniData = GetSessionDataManager().getFloorItemData(spriteId); - if (!furniData) { - setWiredName('NAME: ' + spriteId); - setWiredDescription('NAME: ' + spriteId); - } else { + if(!furniData) + { + setWiredName(('NAME: ' + spriteId)); + setWiredDescription(('NAME: ' + spriteId)); + } + else + { setWiredName(furniData.name); setWiredDescription(furniData.description); } - if (hasSpecialInput) { + 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(requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) + { + setFurniIds(prevValue => + { + if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); + + if(trigger.selectedItems && trigger.selectedItems.length) + { WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); + return trigger.selectedItems; } + return []; }); } setAllowsFurni(requiresFurni); - if (WiredSelectionVisualizer.setMaxItemSelectionCount) { - WiredSelectionVisualizer.setMaxItemSelectionCount(maxItemSelectionCount); - } - }, [trigger, hasSpecialInput, requiresFurni, setIntParams, setStringParam, setFurniIds, setAllowsFurni, maxItemSelectionCount]); + }, [ trigger, hasSpecialInput, requiresFurni, setIntParams, setStringParam, setFurniIds, setAllowsFurni ]); return ( - - + + - - - - {wiredName} - - {wiredDescription} - - {!!children &&
} - {children} - {requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE && ( +
+
+ + { wiredName } +
+ { wiredDescription } +
+ { !!children &&
} + { children } + { (requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) && <>
- - - )} - - - - + + } +
+ + +
); diff --git a/src/components/wired/views/WiredFurniSelectorView.tsx b/src/components/wired/views/WiredFurniSelectorView.tsx index 52b2b14..1363326 100644 --- a/src/components/wired/views/WiredFurniSelectorView.tsx +++ b/src/components/wired/views/WiredFurniSelectorView.tsx @@ -1,27 +1,16 @@ import { FC } from 'react'; import { LocalizeText } from '../../../api'; -import { Column, Text } from '../../../common'; +import { Text } from '../../../common'; import { useWired } from '../../../hooks'; -export interface WiredFurniSelectorViewProps { - maxItemSelectionCount: number; -} - -export const WiredFurniSelectorView: FC = props => { - const { maxItemSelectionCount } = props; - const { furniIds, selectObjectForWired } = useWired(); - - // Enforce the selection limit - const selectionText = LocalizeText('wiredfurni.pickfurnis.caption', ['count', 'limit'], [furniIds.length.toString(), maxItemSelectionCount.toString()]); - - const onSelectFurni = (furniId: number) => { - selectObjectForWired(furniId, 0); - }; +export const WiredFurniSelectorView: FC<{}> = props => +{ + const { trigger = null, furniIds = [] } = useWired(); return ( - - {selectionText} - {LocalizeText('wiredfurni.pickfurnis.desc')} - +
+ { 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 f8cc521..aef1cdb 100644 --- a/src/components/wired/views/actions/WiredActionBaseView.tsx +++ b/src/components/wired/views/actions/WiredActionBaseView.tsx @@ -1,7 +1,8 @@ import { WiredActionDefinition } from '@nitrots/nitro-renderer'; import { FC, PropsWithChildren, useEffect } from 'react'; +import ReactSlider from 'react-slider'; import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; -import { Button, Column, Flex, Slider, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredBaseView } from '../WiredBaseView'; @@ -23,18 +24,18 @@ export const WiredActionBaseView: FC }, [ trigger, setActionDelay ]); return ( - + { children } { !!children &&
} - +
{ LocalizeText('wiredfurni.params.delay', [ 'seconds' ], [ GetWiredTimeLocale(actionDelay) ]) } - setActionDelay(event) } /> - +
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx b/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx index 4289f95..e359037 100644 --- a/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx +++ b/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx @@ -1,7 +1,9 @@ +import { GetSessionDataManager } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { GetSessionDataManager, LocalizeText, WiredFurniType, WIRED_STRING_DELIMETER } from '../../../../api'; -import { Button, Column, Flex, LayoutAvatarImageView, Text } from '../../../../common'; +import { LocalizeText, WIRED_STRING_DELIMETER, WiredFurniType } from '../../../../api'; +import { Button, LayoutAvatarImageView, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; const DEFAULT_FIGURE: string = 'hd-180-1.ch-210-66.lg-270-82.sh-290-81'; @@ -23,15 +25,15 @@ export const WiredActionBotChangeFigureView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - - + setBotName(event.target.value) } /> +
+
+ - +
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx index 2acb5cc..9576ea0 100644 --- a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionBotFollowAvatarView: FC<{}> = props => @@ -14,7 +15,7 @@ export const WiredActionBotFollowAvatarView: FC<{}> = props => { setStringParam(botName); setIntParams([ followMode ]); - } + }; useEffect(() => { @@ -23,21 +24,21 @@ export const WiredActionBotFollowAvatarView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - - - setFollowMode(1) } /> + setBotName(event.target.value) } /> +
+
+
+ setFollowMode(1) } /> { LocalizeText('wiredfurni.params.start.following') } - - - setFollowMode(0) } /> +
+
+ setFollowMode(0) } /> { LocalizeText('wiredfurni.params.stop.following') } - - +
+
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx index c93d0de..0dc2bc4 100644 --- a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx +++ b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; const ALLOWED_HAND_ITEM_IDS: number[] = [ 2, 5, 7, 8, 9, 10, 27 ]; @@ -16,7 +17,7 @@ export const WiredActionBotGiveHandItemView: FC<{}> = props => { setStringParam(botName); setIntParams([ handItemId ]); - } + }; useEffect(() => { @@ -25,18 +26,18 @@ export const WiredActionBotGiveHandItemView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - + setBotName(event.target.value) } /> +
+
{ LocalizeText('wiredfurni.params.handitem') } - +
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionBotMoveView.tsx b/src/components/wired/views/actions/WiredActionBotMoveView.tsx index d09a359..644b34e 100644 --- a/src/components/wired/views/actions/WiredActionBotMoveView.tsx +++ b/src/components/wired/views/actions/WiredActionBotMoveView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionBotMoveView: FC<{}> = props => @@ -17,11 +18,11 @@ export const WiredActionBotMoveView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - + setBotName(event.target.value) } /> +
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx index ebebe2d..b69a972 100644 --- a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; -import { GetConfiguration, LocalizeText, WiredFurniType, WIRED_STRING_DELIMETER } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { GetConfigurationValue, LocalizeText, WIRED_STRING_DELIMETER, WiredFurniType } from '../../../../api'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionBotTalkToAvatarView: FC<{}> = props => @@ -15,38 +16,38 @@ export const WiredActionBotTalkToAvatarView: FC<{}> = props => { setStringParam(botName + WIRED_STRING_DELIMETER + message); setIntParams([ talkMode ]); - } + }; useEffect(() => { const data = trigger.stringData.split(WIRED_STRING_DELIMETER); - + 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); }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - + setBotName(event.target.value) } /> +
+
{ LocalizeText('wiredfurni.params.message') } - ('wired.action.bot.talk.to.avatar.max.length', 64) } value={ message } onChange={ event => setMessage(event.target.value) } /> - - - - setTalkMode(0) } /> + ('wired.action.bot.talk.to.avatar.max.length', 64) } type="text" value={ message } onChange={ event => setMessage(event.target.value) } /> +
+
+
+ setTalkMode(0) } /> { LocalizeText('wiredfurni.params.talk') } - - - setTalkMode(1) } /> +
+
+ setTalkMode(1) } /> { LocalizeText('wiredfurni.params.whisper') } - - +
+
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionBotTalkView.tsx b/src/components/wired/views/actions/WiredActionBotTalkView.tsx index cd2d28e..31b6a14 100644 --- a/src/components/wired/views/actions/WiredActionBotTalkView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTalkView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; -import { GetConfiguration, LocalizeText, WiredFurniType, WIRED_STRING_DELIMETER } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { GetConfigurationValue, LocalizeText, WIRED_STRING_DELIMETER, WiredFurniType } from '../../../../api'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionBotTalkView: FC<{}> = props => @@ -15,38 +16,38 @@ export const WiredActionBotTalkView: FC<{}> = props => { setStringParam(botName + WIRED_STRING_DELIMETER + message); setIntParams([ talkMode ]); - } + }; useEffect(() => { const data = trigger.stringData.split(WIRED_STRING_DELIMETER); - + 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); }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - - + setBotName(event.target.value) } /> +
+
{ LocalizeText('wiredfurni.params.message') } - ('wired.action.bot.talk.max.length', 64) } value={ message } onChange={ event => setMessage(event.target.value) } /> - - - - setTalkMode(0) } /> + ('wired.action.bot.talk.max.length', 64) } type="text" value={ message } onChange={ event => setMessage(event.target.value) } /> +
+
+
+ setTalkMode(0) } /> { LocalizeText('wiredfurni.params.talk') } - - - setTalkMode(1) } /> +
+
+ setTalkMode(1) } /> { LocalizeText('wiredfurni.params.shout') } - - +
+
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionBotTeleportView.tsx b/src/components/wired/views/actions/WiredActionBotTeleportView.tsx index 5d767b1..1979930 100644 --- a/src/components/wired/views/actions/WiredActionBotTeleportView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTeleportView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionBotTeleportView: FC<{}> = props => @@ -17,11 +18,11 @@ export const WiredActionBotTeleportView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - + setBotName(event.target.value) } /> +
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx b/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx index ee6d547..69c17fe 100644 --- a/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx +++ b/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx @@ -4,5 +4,5 @@ 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 c494503..d0e1c41 100644 --- a/src/components/wired/views/actions/WiredActionChaseView.tsx +++ b/src/components/wired/views/actions/WiredActionChaseView.tsx @@ -4,5 +4,5 @@ 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 ed256dc..8f622c2 100644 --- a/src/components/wired/views/actions/WiredActionChatView.tsx +++ b/src/components/wired/views/actions/WiredActionChatView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; -import { GetConfiguration, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; +import { GetConfigurationValue, LocalizeText, WiredFurniType } from '../../../../api'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionChatView: FC<{}> = props => @@ -17,11 +18,11 @@ export const WiredActionChatView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.message') } - setMessage(event.target.value) } maxLength={ GetConfiguration('wired.action.chat.max.length', 100) } /> - + ('wired.action.chat.max.length', 100) } type="text" value={ message } onChange={ event => setMessage(event.target.value) } /> +
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionFleeView.tsx b/src/components/wired/views/actions/WiredActionFleeView.tsx index a80ab43..e3e5776 100644 --- a/src/components/wired/views/actions/WiredActionFleeView.tsx +++ b/src/components/wired/views/actions/WiredActionFleeView.tsx @@ -4,5 +4,5 @@ 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 e7f1895..8e87167 100644 --- a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx @@ -1,8 +1,10 @@ import { FC, useEffect, useState } from 'react'; import { FaPlus, FaTrash } from 'react-icons/fa'; +import ReactSlider from 'react-slider'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Button, Column, Flex, Slider, Text } from '../../../../common'; +import { Button, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionGiveRewardView: FC<{}> = props => @@ -27,7 +29,7 @@ export const WiredActionGiveRewardView: FC<{}> = props => return newValues; }); - } + }; const updateReward = (index: number, isBadge: boolean, itemCode: string, probability: number) => { @@ -41,10 +43,10 @@ export const WiredActionGiveRewardView: FC<{}> = props => reward.probability = probability; setRewards(rewardsClone); - } + }; const save = () => - { + { let stringRewards = []; for(const reward of rewards) @@ -60,7 +62,7 @@ export const WiredActionGiveRewardView: FC<{}> = props => setStringParam(stringRewards.join(';')); setIntParams([ rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval ]); } - } + }; useEffect(() => { @@ -91,68 +93,69 @@ export const WiredActionGiveRewardView: FC<{}> = props => }, [ trigger ]); return ( - - - setLimitEnabled(event.target.checked) } /> + +
+ setLimitEnabled(event.target.checked) } /> { LocalizeText('wiredfurni.params.prizelimit', [ 'amount' ], [ limitEnabled ? rewardsLimit.toString() : '' ]) } - +
{ !limitEnabled && - + Reward limit not set. Make sure rewards are badges or non-tradeable items. } { limitEnabled && - setRewardsLimit(event) } /> }
- +
How often can a user be rewarded? - - setRewardTime(Number(e.target.value)) }> - { (rewardTime > 0) && setLimitationInterval(Number(event.target.value)) } /> } - - + { (rewardTime > 0) && setLimitationInterval(Number(event.target.value)) } /> } +
+

- - setUniqueRewards(e.target.checked) } /> +
+ setUniqueRewards(e.target.checked) } /> Unique rewards - - +
+ If checked each reward will be given once to each user. This will disable the probabilities option.
- +
Rewards - - +
+
{ rewards && rewards.map((reward, index) => { return ( - - - updateReward(index, e.target.checked, reward.itemCode, reward.probability) } /> +
+
+ 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" /> +
+ updateReward(index, reward.isBadge, e.target.value, reward.probability) } /> + updateReward(index, reward.isBadge, reward.itemCode, Number(e.target.value)) } /> { (index > 0) && - } - - ) + } +
+ ); }) } - +
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx b/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx index c7ec598..02d2281 100644 --- a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx @@ -1,7 +1,7 @@ import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Slider, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -31,35 +31,37 @@ export const WiredActionGiveScoreToPredefinedTeamView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.setpoints', [ 'points' ], [ points.toString() ]) } - setPoints(event) } /> - - +
+
{ LocalizeText('wiredfurni.params.settimesingame', [ 'times' ], [ time.toString() ]) } - setTime(event) } /> - - +
+
{ LocalizeText('wiredfurni.params.team') } { [ 1, 2, 3, 4 ].map(value => { return ( - - setSelectedTeam(value) } /> +
+ 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 7b8be0b..a2b9f86 100644 --- a/src/components/wired/views/actions/WiredActionGiveScoreView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveScoreView.tsx @@ -1,7 +1,7 @@ import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Slider, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -28,23 +28,25 @@ export const WiredActionGiveScoreView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.setpoints', [ 'points' ], [ points.toString() ]) } - setPoints(event) } /> - - +
+
{ LocalizeText('wiredfurni.params.settimesingame', [ 'times' ], [ time.toString() ]) } - setTime(event) } /> - +
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionJoinTeamView.tsx b/src/components/wired/views/actions/WiredActionJoinTeamView.tsx index 7580564..10b8c24 100644 --- a/src/components/wired/views/actions/WiredActionJoinTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionJoinTeamView.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -17,19 +17,19 @@ export const WiredActionJoinTeamView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.team') } { [ 1, 2, 3, 4 ].map(team => { return ( - - setSelectedTeam(team) } /> +
+ 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 c9bd10c..002426d 100644 --- a/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx +++ b/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; -import { GetConfiguration, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; +import { GetConfigurationValue, LocalizeText, WiredFurniType } from '../../../../api'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionKickFromRoomView: FC<{}> = props => @@ -17,11 +18,11 @@ export const WiredActionKickFromRoomView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.message') } - setMessage(event.target.value) } maxLength={ GetConfiguration('wired.action.kick.from.room.max.length', 100) } /> - + ('wired.action.kick.from.room.max.length', 100) } type="text" value={ message } onChange={ event => setMessage(event.target.value) } /> +
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionLayoutView.tsx b/src/components/wired/views/actions/WiredActionLayoutView.tsx index f43666a..36d14d4 100644 --- a/src/components/wired/views/actions/WiredActionLayoutView.tsx +++ b/src/components/wired/views/actions/WiredActionLayoutView.tsx @@ -82,4 +82,4 @@ export const WiredActionLayoutView = (code: number) => } return null; -} +}; diff --git a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx b/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx index eaa834f..9202ed3 100644 --- a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx @@ -4,5 +4,5 @@ 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 62801af..d30b43b 100644 --- a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -48,35 +48,35 @@ export const WiredActionMoveAndRotateFurniView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.startdir') } - +
{ directionOptions.map(option => { return ( - - setMovement(option.value) } /> +
+ setMovement(option.value) } /> - - ) +
+ ); }) } -
- - +
+
+
{ LocalizeText('wiredfurni.params.turn') } { rotationOptions.map(option => { return ( - - setRotation(option) } /> +
+ 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 5fdae57..0b6d781 100644 --- a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx @@ -1,7 +1,7 @@ import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Slider, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -47,29 +47,30 @@ export const WiredActionMoveFurniToView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.emptytiles', [ 'tiles' ], [ spacing.toString() ]) } - setSpacing(event) } /> - - +
+
{ LocalizeText('wiredfurni.params.startdir') } - +
{ directionOptions.map(value => { return ( - - setMovement(value.value) } /> +
+ setMovement(value.value) } /> - - ) +
+ ); }) } -
- +
+
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionMoveFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniView.tsx index b5a0888..1a7c0ed 100644 --- a/src/components/wired/views/actions/WiredActionMoveFurniView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveFurniView.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -60,41 +60,41 @@ export const WiredActionMoveFurniView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.movefurni') } - - setMovement(0) } /> +
+ setMovement(0) } /> { LocalizeText('wiredfurni.params.movefurni.0') } - - +
+
{ directionOptions.map(option => { return ( - - setMovement(option.value) } /> - - - ) +
+ setMovement(option.value) } /> + +
+ ); }) }
- - - +
+
+
{ LocalizeText('wiredfurni.params.rotatefurni') } { rotationOptions.map(option => { return ( - - setRotation(option) } /> +
+ setRotation(option) } /> - { [ 1, 2 ].includes(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 6b1c7f8..a5e2a3d 100644 --- a/src/components/wired/views/actions/WiredActionMuteUserView.tsx +++ b/src/components/wired/views/actions/WiredActionMuteUserView.tsx @@ -1,8 +1,9 @@ import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; -import { GetConfiguration, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Slider, Text } from '../../../../common'; +import { GetConfigurationValue, LocalizeText, WiredFurniType } from '../../../../api'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionMuteUserView: FC<{}> = props => @@ -15,7 +16,7 @@ export const WiredActionMuteUserView: FC<{}> = props => { setIntParams([ time ]); setStringParam(message); - } + }; useEffect(() => { @@ -24,19 +25,20 @@ export const WiredActionMuteUserView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.length.minutes', [ 'minutes' ], [ time.toString() ]) } - setTime(event) } /> - - +
+
{ LocalizeText('wiredfurni.params.message') } - setMessage(event.target.value) } maxLength={ GetConfiguration('wired.action.mute.user.max.length', 100) } /> - + ('wired.action.mute.user.max.length', 100) } type="text" value={ message } onChange={ event => setMessage(event.target.value) } /> +
); -} +}; diff --git a/src/components/wired/views/actions/WiredActionResetView.tsx b/src/components/wired/views/actions/WiredActionResetView.tsx index 9245c67..eed03e3 100644 --- a/src/components/wired/views/actions/WiredActionResetView.tsx +++ b/src/components/wired/views/actions/WiredActionResetView.tsx @@ -4,5 +4,5 @@ import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionResetView: FC<{}> = props => { - return ; -} + return ; +}; diff --git a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx index 587254c..96b7237 100644 --- a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx +++ b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -21,22 +21,22 @@ export const WiredActionSetFurniStateToView: FC<{}> = props => }, [ 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 652da61..04ef42d 100644 --- a/src/components/wired/views/actions/WiredActionTeleportView.tsx +++ b/src/components/wired/views/actions/WiredActionTeleportView.tsx @@ -4,5 +4,5 @@ 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 37b5d2e..486aa8e 100644 --- a/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx +++ b/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx @@ -4,5 +4,5 @@ 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 24e89ed..5c6c391 100644 --- a/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; @@ -19,16 +19,16 @@ 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 e278eab..0f425f3 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsGroupMemberView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsGroupMemberView.tsx @@ -4,5 +4,5 @@ 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 10cddf5..9aedea6 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsOnFurniView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsOnFurniView.tsx @@ -4,5 +4,5 @@ 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 20db3ac..7fc69ba 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; @@ -17,21 +17,21 @@ export const WiredConditionActorIsTeamMemberView: FC<{}> = props => { setSelectedTeam((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.params.team') } { teamIds.map(value => { return ( - - setSelectedTeam(value) } /> +
+ 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 01e6d3b..5a46f64 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsWearingBadgeView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsWearingBadgeView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionActorIsWearingBadgeView: FC<{}> = props => @@ -15,13 +16,13 @@ export const WiredConditionActorIsWearingBadgeView: FC<{}> = props => { setBadge(trigger.stringData); }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.params.badgecode') } - setBadge(event.target.value) } /> - + setBadge(event.target.value) } /> +
); -} +}; diff --git a/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx index 00d7fa6..42188cc 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionActorIsWearingEffectView: FC<{}> = props => @@ -15,13 +16,13 @@ export const WiredConditionActorIsWearingEffectView: FC<{}> = props => { setEffect(trigger?.intData[0] ?? 0); }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.tooltip.effectid') } - setEffect(parseInt(event.target.value)) } /> - + setEffect(parseInt(event.target.value)) } /> +
); -} +}; diff --git a/src/components/wired/views/conditions/WiredConditionBaseView.tsx b/src/components/wired/views/conditions/WiredConditionBaseView.tsx index 6b116c7..5782942 100644 --- a/src/components/wired/views/conditions/WiredConditionBaseView.tsx +++ b/src/components/wired/views/conditions/WiredConditionBaseView.tsx @@ -2,26 +2,22 @@ import { FC, PropsWithChildren } from 'react'; import { WiredFurniType } from '../../../../api'; import { WiredBaseView } from '../WiredBaseView'; -export interface WiredConditionBaseViewProps { +export interface WiredConditionBaseViewProps +{ hasSpecialInput: boolean; requiresFurni: number; save: () => void; - maxItemSelectionCount?: number; // Optional parameter } -export const WiredConditionBaseView: FC> = props => { - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null, maxItemSelectionCount = 5 } = props; - +export const WiredConditionBaseView: FC> = props => +{ + const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; + const onSave = () => (save && save()); return ( - - {children} + + { children } ); -} \ No newline at end of file +}; diff --git a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx b/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx index 36832e1..8eedbf3 100644 --- a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx +++ b/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredDateToString, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionDateRangeView: FC<{}> = props => @@ -25,7 +26,7 @@ export const WiredConditionDateRangeView: FC<{}> = props => } setIntParams([ startDateMili, endDateMili ]); - } + }; useEffect(() => { @@ -42,17 +43,17 @@ export const WiredConditionDateRangeView: FC<{}> = props => setEndDate(WiredDateToString(endDate)); } }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.params.startdate') } - setStartDate(e.target.value) } /> - - + setStartDate(e.target.value) } /> +
+
{ LocalizeText('wiredfurni.params.enddate') } - setEndDate(e.target.value) } /> - + setEndDate(e.target.value) } /> +
); -} +}; diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx index 1d7aad5..5575e13 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx @@ -1,42 +1,8 @@ -import { FC, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { FC } from 'react'; +import { WiredFurniType } from '../../../../api'; import { WiredConditionBaseView } from './WiredConditionBaseView'; -export const WiredConditionFurniHasAvatarOnView: FC<{}> = props => { - const [requireAll, setRequireAll] = useState(5); // Default to 5 - - const handleRadioChange = (value: number) => { - setRequireAll(value); - }; - - return ( - - - {LocalizeText('wiredfurni.params.requireall.caption')} - {[1, 5].map(value => ( - - handleRadioChange(value)} - /> - - - ))} - - - ); +export const WiredConditionFurniHasAvatarOnView: FC<{}> = props => +{ + return ; }; diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx index 1a9d0ef..7759f94 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; @@ -15,21 +15,21 @@ export const WiredConditionFurniHasFurniOnView: FC<{}> = props => { setRequireAll((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.params.requireall') } { [ 0, 1 ].map(value => { return ( - - setRequireAll(value) } /> +
+ 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 031ec08..44c1935 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; @@ -15,21 +15,21 @@ export const WiredConditionFurniHasNotFurniOnView: FC<{}> = props => { setRequireAll((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.params.not_requireall') } { [ 0, 1 ].map(value => { return ( - - setRequireAll(value) } /> +
+ 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 2b0ddf4..5cda9f7 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx @@ -4,5 +4,5 @@ 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 47a555e..176a0e6 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; @@ -19,24 +19,24 @@ export const WiredConditionFurniMatchesSnapshotView: FC<{}> = props => 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/conditions/WiredConditionLayoutView.tsx b/src/components/wired/views/conditions/WiredConditionLayoutView.tsx index c7c49b2..a1a88c2 100644 --- a/src/components/wired/views/conditions/WiredConditionLayoutView.tsx +++ b/src/components/wired/views/conditions/WiredConditionLayoutView.tsx @@ -61,4 +61,4 @@ export const WiredConditionLayoutView = (code: number) => } return null; -} +}; diff --git a/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx b/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx index 93968b9..9054fe3 100644 --- a/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx +++ b/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx @@ -1,6 +1,7 @@ import { FC, useEffect, useState } from 'react'; +import ReactSlider from 'react-slider'; import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Slider, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; @@ -15,17 +16,18 @@ export const WiredConditionTimeElapsedLessView: FC<{}> = props => { setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.params.allowbefore', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } - setTime(event) } /> - +
); -} +}; diff --git a/src/components/wired/views/conditions/WiredConditionTimeElapsedMoreView.tsx b/src/components/wired/views/conditions/WiredConditionTimeElapsedMoreView.tsx index 2bd518a..a31efdb 100644 --- a/src/components/wired/views/conditions/WiredConditionTimeElapsedMoreView.tsx +++ b/src/components/wired/views/conditions/WiredConditionTimeElapsedMoreView.tsx @@ -1,6 +1,7 @@ import { FC, useEffect, useState } from 'react'; +import ReactSlider from 'react-slider'; import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Slider, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; @@ -15,17 +16,18 @@ export const WiredConditionTimeElapsedMoreView: FC<{}> = props => { setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.params.allowafter', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } - setTime(event) } /> - +
); -} +}; diff --git a/src/components/wired/views/conditions/WiredConditionUserCountInRoomView.tsx b/src/components/wired/views/conditions/WiredConditionUserCountInRoomView.tsx index 82454d5..d655721 100644 --- a/src/components/wired/views/conditions/WiredConditionUserCountInRoomView.tsx +++ b/src/components/wired/views/conditions/WiredConditionUserCountInRoomView.tsx @@ -1,13 +1,14 @@ import { FC, useEffect, useState } from 'react'; +import ReactSlider from 'react-slider'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Slider, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionUserCountInRoomView: FC<{}> = props => { const [ min, setMin ] = useState(1); - const [ max, setMax ] = useState(1); + const [ max, setMax ] = useState(0); const { trigger = null, setIntParams = null } = useWired(); const save = () => setIntParams([ min, max ]); @@ -22,28 +23,30 @@ export const WiredConditionUserCountInRoomView: FC<{}> = props => else { setMin(1); - setMax(1); + setMax(0); } }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.params.usercountmin', [ 'value' ], [ min.toString() ]) } - setMin(event) } /> - - +
+
{ LocalizeText('wiredfurni.params.usercountmax', [ 'value' ], [ max.toString() ]) } - setMax(event) } /> - +
); -} +}; diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarEnterRoomView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarEnterRoomView.tsx index b14eafb..2d948a4 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarEnterRoomView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarEnterRoomView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerAvatarEnterRoomView: FC<{}> = props => @@ -19,20 +20,20 @@ export const WiredTriggerAvatarEnterRoomView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.picktriggerer') } - - setAvatarMode(0) } /> +
+ setAvatarMode(0) } /> { LocalizeText('wiredfurni.params.anyavatar') } - - - setAvatarMode(1) } /> +
+
+ setAvatarMode(1) } /> { LocalizeText('wiredfurni.params.certainavatar') } - +
{ (avatarMode === 1) && - setUsername(event.target.value) } /> } - + setUsername(event.target.value) } /> } +
); -} +}; diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx index d8bc621..e2d9dd3 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx @@ -1,7 +1,9 @@ +import { GetSessionDataManager } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { GetSessionDataManager, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Flex, Text } from '../../../../common'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerAvatarSaysSomethingView: FC<{}> = props => @@ -14,31 +16,31 @@ export const WiredTriggerAvatarSaysSomethingView: FC<{}> = props => { setStringParam(message); setIntParams([ triggererAvatar ]); - } + }; useEffect(() => { setMessage(trigger.stringData); setTriggererAvatar((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.params.whatissaid') } - setMessage(event.target.value) } /> - - + setMessage(event.target.value) } /> +
+
{ LocalizeText('wiredfurni.params.picktriggerer') } - - setTriggererAvatar(0) } /> +
+ setTriggererAvatar(0) } /> { LocalizeText('wiredfurni.params.anyavatar') } - - - setTriggererAvatar(1) } /> +
+
+ setTriggererAvatar(1) } /> { GetSessionDataManager().userName } - - +
+
); -} +}; diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx index 0b98a56..fc6c198 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx @@ -4,5 +4,5 @@ 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 25572e7..217cbd5 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx @@ -4,5 +4,5 @@ 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 f8f1575..7590d9a 100644 --- a/src/components/wired/views/triggers/WiredTriggerBaseView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerBaseView.tsx @@ -12,12 +12,12 @@ export interface WiredTriggerBaseViewProps export const WiredTriggerBaseView: FC> = props => { const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; - + 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 6984dc6..6aa3fde 100644 --- a/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerBotReachedAvatarView: FC<{}> = props => @@ -15,13 +16,13 @@ export const WiredTriggerBotReachedAvatarView: FC<{}> = props => { setBotName(trigger.stringData); }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - + setBotName(event.target.value) } /> +
); -} +}; diff --git a/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx b/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx index 9cde173..0034603 100644 --- a/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx @@ -1,7 +1,8 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; +import { NitroInput } from '../../../../layout'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerBotReachedStuffView: FC<{}> = props => @@ -15,13 +16,13 @@ export const WiredTriggerBotReachedStuffView: FC<{}> = props => { setBotName(trigger.stringData); }, [ trigger ]); - + return ( - - + +
{ LocalizeText('wiredfurni.params.bot.name') } - setBotName(event.target.value) } /> - + setBotName(event.target.value) } /> +
); -} +}; diff --git a/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx b/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx index be23a6b..d7efc34 100644 --- a/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx @@ -4,5 +4,5 @@ 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 2d237a7..0b91a90 100644 --- a/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx @@ -1,6 +1,7 @@ import { FC, useEffect, useState } from 'react'; +import ReactSlider from 'react-slider'; import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Slider, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; @@ -17,15 +18,16 @@ export const WiredTriggeExecuteOnceView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.settime', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } - setTime(event) } /> - +
); -} +}; diff --git a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyLongView.tsx b/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyLongView.tsx index cc484e7..b20e7ed 100644 --- a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyLongView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyLongView.tsx @@ -1,7 +1,7 @@ -import { FriendlyTime } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Slider, Text } from '../../../../common'; +import ReactSlider from 'react-slider'; +import { FriendlyTime, LocalizeText, WiredFurniType } from '../../../../api'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; @@ -18,15 +18,16 @@ export const WiredTriggeExecutePeriodicallyLongView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.setlongtime', [ 'time' ], [ FriendlyTime.format(time * 5).toString() ]) } - setTime(event) } /> - +
); -} +}; diff --git a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyView.tsx b/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyView.tsx index f385b7b..35471ce 100644 --- a/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerExecutePeriodicallyView.tsx @@ -1,6 +1,7 @@ import { FC, useEffect, useState } from 'react'; +import ReactSlider from 'react-slider'; import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Slider, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; @@ -17,15 +18,16 @@ export const WiredTriggeExecutePeriodicallyView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.settime', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } - setTime(event) } /> - +
); -} +}; diff --git a/src/components/wired/views/triggers/WiredTriggerGameEndsView.tsx b/src/components/wired/views/triggers/WiredTriggerGameEndsView.tsx index c6f1c67..476ed70 100644 --- a/src/components/wired/views/triggers/WiredTriggerGameEndsView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerGameEndsView.tsx @@ -4,5 +4,5 @@ import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerGameEndsView: FC<{}> = props => { - return ; -} + return ; +}; diff --git a/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx b/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx index 6e43a2c..5c9b937 100644 --- a/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx @@ -4,5 +4,5 @@ import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerGameStartsView: FC<{}> = props => { - return ; -} + return ; +}; diff --git a/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx b/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx index e45b2ea..0b01922 100644 --- a/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerLayoutView.tsx @@ -49,4 +49,4 @@ export const WiredTriggerLayoutView = (code: number) => } return null; -} +}; diff --git a/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx b/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx index 8097227..0c4c738 100644 --- a/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx @@ -1,6 +1,7 @@ import { FC, useEffect, useState } from 'react'; +import ReactSlider from 'react-slider'; import { LocalizeText, WiredFurniType } from '../../../../api'; -import { Column, Slider, Text } from '../../../../common'; +import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; @@ -17,15 +18,16 @@ export const WiredTriggeScoreAchievedView: FC<{}> = props => }, [ trigger ]); return ( - - + +
{ LocalizeText('wiredfurni.params.setscore', [ 'points' ], [ points.toString() ]) } - setPoints(event) } /> - +
); -} +}; diff --git a/src/components/wired/views/triggers/WiredTriggerToggleFurniView.tsx b/src/components/wired/views/triggers/WiredTriggerToggleFurniView.tsx index 865006b..4748481 100644 --- a/src/components/wired/views/triggers/WiredTriggerToggleFurniView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerToggleFurniView.tsx @@ -4,5 +4,5 @@ import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerToggleFurniView: FC<{}> = props => { - return ; -} + return ; +}; diff --git a/src/components/youtube-tv/YoutubeTvView.tsx b/src/components/youtube-tv/YoutubeTvView.tsx deleted file mode 100644 index dd55e77..0000000 --- a/src/components/youtube-tv/YoutubeTvView.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { FC, useEffect, useMemo, useState } from 'react'; -import { AddEventLinkTracker, GetConfiguration, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; -import { Button, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../common'; -import { useMessageEvent } from '../../hooks'; - -export const YoutubeTvView: FC<{}> = props => -{ - const [ itemId, setItemId ] = useState(-1); - const [ videoId, setVideoId ] = useState(''); - const [ videoLink, setVideoLink ] = useState(''); - const [ isVisible, setIsVisible ] = useState(false); - - const close = () => - { - setIsVisible(false); - }; - - useEffect(() => - { - const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { - const parts = url.split('/'); - - if(parts.length < 3) return; - - switch(parts[1]) - { - case 'show': - setIsVisible(true); - setVideoId(parts[2]); - return; - } - }, - eventUrlPrefix: 'youtube-tv/' - }; - - AddEventLinkTracker(linkTracker); - - return () => RemoveLinkEventTracker(linkTracker); - }, []); - - const origineUrl = useMemo(() => GetConfiguration('url.prefix'), [ ]); - - if(!isVisible) return null; - - return ( - - - -
- { (videoId && videoId.length > 0) && - - } -
-
-
- ); -} diff --git a/src/css/PurseView.css b/src/css/PurseView.css new file mode 100644 index 0000000..7134551 --- /dev/null +++ b/src/css/PurseView.css @@ -0,0 +1,111 @@ +.nitro-purse-container { + font-size: 1em; + pointer-events: all; + + .nitro-purse { + margin-top: 4px; + + .nitro-purse-subscription { + background-color: rgba($light, 0.1); + } + + .nitro-purse-button { + padding: 3px 2px; + } + .coffecurrencybutton{ + border-radius: 0.5rem !important; + background-color: #b69b83; + border: 2px solid hsla(0deg, 0%, 100%, 0.5); + margin-bottom: 3px; + padding: 0px !important; + width: 30px; + pointer-events: all; + } + .borderhccontent{ + background-color: #212131; + border-radius: 0.5rem!important; + border: 2px solid #383853; + height: calc(100% - 3px); + } + .nitro-purse-button.currency--1 { + background: #e8b125; + border: 2px solid #f4d892; + } + .nitro-purse-button.currency-0 { + background: #c364c1; + border: 2px solid #ecb3ea; + } + .nitro-purse-button.currency-5 { + background: #6bafaa; + border: 2px solid #ace6e2; + } + .allcurrencypurse{ + border-radius: 5px!important; + margin-bottom: 2px; + } + } + + .nitro-purse-seasonal-currency { + background-color: #212131; + background: linear-gradient(to right, #5f5f8d, transparent); + height: 30px; + margin-bottom: 4px; + border-radius: 0.5rem !important; + } + + .seasonal-image-padding { + padding: 6px; + } + + .seasonal-text-padding, + .seasonal-amount { + margin-left: 4px; + display: flex; + align-items: center; + + } + + .nitro-purse-seasonal-currency.purple { + &.purple { + background: linear-gradient(to right, #b17fbe, transparent); + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + } + } + +.nitro-purse-seasonal-currency.bronze { + .bronze { + background: linear-gradient(to right, #d4943c, transparent); + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + } +} + +.nitro-purse-seasonal-currency.pink { + .pink { + background: linear-gradient(to right, #d89ba8, transparent); + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + } +} + +.nitro-purse-seasonal-currency.blue { + .blue{ + background: linear-gradient(to right, #95c3e5, transparent); + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + } +} + +.nitro-purse-seasonal-currency.red { + &.red{ + background: linear-gradient(to right, #ff0004, transparent); + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + } +} +} + +.topcurrencygen { + margin-top: 2px; +} \ No newline at end of file diff --git a/src/components/room/widgets/chat/ChatWidgetView.scss b/src/css/chats.css similarity index 73% rename from src/components/room/widgets/chat/ChatWidgetView.scss rename to src/css/chats.css index c8dd62e..c381e39 100644 --- a/src/components/room/widgets/chat/ChatWidgetView.scss +++ b/src/css/chats.css @@ -1,79 +1,14 @@ -.nitro-chat-widget { - position: absolute; - display: flex; - justify-content: center; - align-items: center; - width: 100%; - top: 0; - min-height: 1px; - z-index: $chat-zindex; - background-color: transparent; - border-radius: 0; - box-shadow: none; - pointer-events: none; -} - -.chat-mention { - padding: 1px 5px; - font-weight: bold; - background: rgba(0, 0, 0, 0.2); - cursor: pointer; - border-radius: 100px; - - &:hover { - color: blue; - } -} - .bubble-container { - position: absolute; - width: fit-content; transition: top 0.2s ease 0s; - user-select: none; - pointer-events: all; - - // -webkit-animation-duration: 0.2s; - // animation-duration: 0.2s; - // -webkit-animation-fill-mode: both; - // animation-fill-mode: both; - // -webkit-animation-name: bounceIn; - // animation-name: bounceIn; - - .user-container-bg { - position: absolute; - top: -1px; - left: 1px; - width: 30px; - height: calc(100% - 0.5px); - border-radius: 7px; - z-index: 1; - background-color: #c8c8c8; - } .chat-bubble { - position: relative; - z-index: 1; - word-break: break-word; - max-width: 350px; - min-height: 26px; - font-size: 14px; - border-image-slice: 17 6 6 29 fill; border-image-width: 17px 6px 6px 29px; border-image-outset: 2px 0px 0px 0px; border-image-repeat: repeat repeat; - .pointer { - position: absolute; - left: 50%; - transform: translateX(-50%); - - width: 9px; - height: 6px; - bottom: -5px; - } - &.type-0 { + // normal .message { font-weight: 400; @@ -81,6 +16,7 @@ } &.type-1 { + // whisper .message { font-weight: 400; @@ -90,6 +26,7 @@ } &.type-2 { + // shout .message { font-weight: 700; @@ -686,186 +623,6 @@ } } - &.bubble-39 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_39.png"); - - border-image-slice: 16 6 7 32 fill; - border-image-width: 16px 6px 7px 32px; - border-image-outset: 5px 0px 0px 3px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_39_pointer.png"); - } - } - - &.bubble-40 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_40.png"); - - border-image-slice: 16 6 7 32 fill; - border-image-width: 16px 6px 7px 32px; - border-image-outset: 5px 0px 0px 3px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_40_pointer.png"); - } - } - - &.bubble-41 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_41.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_41_pointer.png"); - } - } - - &.bubble-42 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_42.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_42_pointer.png"); - } - } - - &.bubble-43 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_43.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_43_pointer.png"); - } - } - - &.bubble-44 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_44.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_44_pointer.png"); - } - } - - &.bubble-45 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_45.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_45_pointer.png"); - } - } - - &.bubble-46 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_46.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_46_pointer.png"); - } - } - - &.bubble-47 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_47.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_47_pointer.png"); - } - } - - &.bubble-48 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_48.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_48_pointer.png"); - } - } - - &.bubble-49 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_49.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_49_pointer.png"); - } - } - - &.bubble-50 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_50.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_50_pointer.png"); - } - } - - &.bubble-51 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_51.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_51_pointer.png"); - } - } - - &.bubble-52 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_52.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_52_pointer.png"); - } - } - - &.bubble-53 { - border-image-source: url("@/assets/images/chat/chatbubbles/bubble_53.png"); - - border-image-slice: 16 7 6 33 fill; - border-image-width: 16px 6px 6px 32px; - border-image-outset: 7px 0px 0px 5px; - - .pointer { - background: url("@/assets/images/chat/chatbubbles/bubble_53_pointer.png"); - } - } - .user-container { z-index: 3; display: flex; @@ -1096,64 +853,4 @@ background: url('@/assets/images/chat/chatbubbles/bubble_38_extra.png'); } } - - &.bubble-39 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_39.png"); - } - - &.bubble-40 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_40.png"); - } - - &.bubble-41 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_41.png"); - } - - &.bubble-42 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_42.png"); - } - - &.bubble-43 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_43.png"); - } - - &.bubble-44 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_44.png"); - } - - &.bubble-45 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_45.png"); - } - - &.bubble-46 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_46.png"); - } - - &.bubble-47 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_47.png"); - } - - &.bubble-48 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_48.png"); - } - - &.bubble-49 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_49.png"); - } - - &.bubble-50 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_50.png"); - } - - &.bubble-51 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_51.png"); - } - - &.bubble-52 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_52.png"); - } - - &.bubble-53 { - background-image: url("@/assets/images/chat/chatbubbles/bubble_53.png"); - } } diff --git a/src/css/index.css b/src/css/index.css new file mode 100644 index 0000000..0c89f63 --- /dev/null +++ b/src/css/index.css @@ -0,0 +1,1470 @@ +@font-face { + font-family: Ubuntu; + src: url("@/assets/webfonts/Ubuntu-C.ttf"); +} + +@tailwind base; +@tailwind components; +@tailwind utilities; + +html, +body { + padding: 0; + width: 100%; + height: 100%; + overflow: hidden; + -webkit-user-select: none; + user-select: none; + scrollbar-width: thin; +} + +*, +*:focus, +*:hover { + @apply outline-0; +} + +::-webkit-scrollbar { + width: .5rem +} + +::-webkit-scrollbar:horizontal { + height: .5rem +} + +::-webkit-scrollbar:not(:horizontal) { + width: .5rem +} + +::-webkit-scrollbar-track:horizontal { + border-bottom: .25rem solid rgba(0, 0, 0, .1) +} + +::-webkit-scrollbar-track:not(:horizontal) { + border-right: .25rem solid rgba(0, 0, 0, .1) +} + +::-webkit-scrollbar-thumb:horizontal { + border-bottom: .25rem solid rgba(30, 114, 149, .4) +} + +::-webkit-scrollbar-thumb:horizontal:hover { + border-bottom: .25rem solid rgba(30, 114, 149, .8) +} + +::-webkit-scrollbar-thumb:horizontal:active { + border-bottom: .25rem solid #185D79 +} + +::-webkit-scrollbar-thumb:not(:horizontal) { + border-right: .25rem solid rgba(30, 114, 149, .4) +} + +::-webkit-scrollbar-thumb:not(:horizontal):hover { + border-right: .25rem solid rgba(30, 114, 149, .8) +} + +::-webkit-scrollbar-thumb:not(:horizontal):active { + border-right: .25rem solid #185D79 +} + +::-webkit-scrollbar-corner { + background: rgba(0, 0, 0, .1) +} + +@layer components { + @keyframes blink { + + 0%, + 100% { + opacity: 1; + } + + 50% { + opacity: 0; + } + } + + @keyframes scale { + + 0%, + 100% { + transform: scale(1); + } + + 50% { + transform: scale(1.5); + } + } + + .dot { + position: absolute; + width: 2px; + height: 2px; + background-color: white; + animation: blink 2s infinite; + } + + .star { + position: absolute; + width: 10px; + height: 10px; + color: #ffffff; + + &:after { + content: ""; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: currentColor; + width: 5px; + height: 5px; + -webkit-animation: blink 1s linear infinite; + animation: blink 1s linear infinite; + } + + .star-part { + position: absolute; + background-color: currentColor; + + &:nth-child(1) { + top: 0; + left: 50%; + width: 1px; + height: 100%; + transform: translateX(-50%); + } + + &:nth-child(2) { + top: 50%; + left: 0; + width: 100%; + height: 1px; + transform: translateY(-50%); + } + } + } + + .toolbar { + @apply relative; + background: rgb(33, 33, 33); + background: linear-gradient(0deg, rgba(33, 33, 33, 0.9) 0%, rgba(51, 51, 51, 0.9) 100%); + + &::before { + content: ""; + display: block; + position: absolute; + top: 1px; + left: 0; + right: 0; + height: 2px; + background-color: rgba(255, 255, 255, 0.05); + } + + &::after { + content: ""; + display: block; + position: absolute; + bottom: 2px; + left: 0; + right: 0; + height: 2px; + background-color: rgba(0, 0, 0, 0.1); + } + } + + .avatar-image { + @apply pointer-events-none relative h-[130px] w-[90px] bg-[center_-8px] bg-no-repeat; + } + + .ubuntu-close-button { + @apply inline-block h-[20px] w-[19px] bg-transparent bg-[0px_0px] bg-no-repeat outline-0; + background-image: url("@/assets/images/ui/ubuntu-close-buttons.png"); + + &:hover { + @apply bg-[-38px]; + } + + &:active { + @apply bg-[-19px]; + } + } + + .nitro-icon { + @apply inline-block bg-transparent bg-center bg-no-repeat outline-0; + + &:hover { + @apply translate-x-[-1px] translate-y-[-1px] drop-shadow-hover + } + + &:active { + @apply transform-none filter-none + } + + &.icon-nitro-light { + background-image: url("@/assets/images/nitro/nitro-n-light.svg"); + } + + &.icon-nitro-dark { + background-image: url("@/assets/images/nitro/nitro-n-dark.svg"); + } + + &.icon-nitro-light, + &.icon-nitro-dark { + width: 100%; + height: 40px; + } + + &.icon-catalog { + background-image: url("@/assets/images/toolbar/icons/catalog.png"); + width: 37px; + height: 36px; + } + + &.icon-game { + background-image: url("@/assets/images/toolbar/icons/game.png"); + width: 44px; + height: 25px; + } + + &.icon-rooms { + background-image: url("@/assets/images/toolbar/icons/rooms.png"); + width: 44px; + height: 30px; + } + + &.icon-house { + background-image: url("@/assets/images/toolbar/icons/house.png"); + height: 30px; + width: 32px; + } + + &.gray { + opacity: 0.5; + } + + &.icon-inventory { + background-image: url("@/assets/images/toolbar/icons/inventory.png"); + height: 41px; + width: 44px; + } + + &.icon-modtools { + background-image: url("@/assets/images/toolbar/icons/modtools.png"); + height: 34px; + width: 29px; + } + + &.icon-friendall { + background-image: url("@/assets/images/toolbar/icons/friend_all.png"); + height: 33px; + width: 32px; + } + + &.icon-friendsearch { + background-image: url("@/assets/images/toolbar/icons/friend_search.png"); + height: 33px; + width: 29px; + } + + &.icon-sendmessage { + background-image: url("@/assets/images/toolbar/icons/sendmessage.png"); + width: 20px; + height: 21px; + } + + &.icon-me-talents { + background-image: url("@/assets/images/toolbar/icons/me-menu/talents.png"); + width: 32px; + height: 30px; + } + + &.icon-me-helper-tool { + background-image: url("@/assets/images/toolbar/icons/me-menu/helper-tool.png"); + width: 32px; + height: 30px; + } + + &.icon-me-profile { + background-image: url("@/assets/images/toolbar/icons/me-menu/profile.png"); + width: 32px; + height: 30px; + } + + &.icon-me-forums { + background-image: url("@/assets/images/toolbar/icons/me-menu/forums.png"); + width: 32px; + height: 30px; + } + + &.icon-me-rooms { + background-image: url("@/assets/images/toolbar/icons/me-menu/my-rooms.png"); + width: 30px; + height: 30px; + } + + &.icon-me-achievements { + background-image: url("@/assets/images/toolbar/icons/me-menu/achievements.png"); + width: 31px; + height: 30px; + } + + &.icon-me-clothing { + background-image: url("@/assets/images/toolbar/icons/me-menu/clothing.png"); + width: 27px; + height: 30px; + } + + &.icon-me-settings { + background-image: url("@/assets/images/toolbar/icons/me-menu/cog.png"); + width: 28px; + height: 34px; + } + + &.icon-cog { + background: url("@/assets/images/icons/icon_cog.png"); + width: 14px; + height: 15px; + } + + &.icon-help { + background: url("@/assets/images/icons/help.png"); + width: 13px; + height: 23px; + } + + &.icon-joinroom { + background-image: url("@/assets/images/toolbar/icons/joinroom.png"); + width: 21px; + height: 21px; + } + + &.icon-habbo { + background-image: url("@/assets/images/toolbar/icons/habbo.png"); + width: 28px; + height: 28px; + } + + &.icon-camera { + background-image: url("@/assets/images/toolbar/icons/camera.png"); + width: 38px; + height: 45px; + } + + &.icon-message { + background-image: url("@/assets/images/toolbar/icons/message.png"); + width: 36px; + height: 32px; + + &.is-unseen { + background-image: url("@/assets/images/toolbar/icons/message_unsee.gif"); + } + } + + &.icon-wired-trigger { + background-image: url("@/assets/images/wired/icon_trigger.png"); + width: 13px; + height: 14px; + } + + &.icon-wired-condition { + background-image: url("@/assets/images/wired/icon_condition.png"); + width: 13px; + height: 14px; + } + + &.icon-wired-action { + background-image: url("@/assets/images/wired/icon_action.png"); + width: 13px; + height: 14px; + } + + &.chatstyles-icon { + background-image: url("@/assets/images/chat/styles-icon.png"); + width: 17px; + height: 19px; + filter: grayscale(100%); + + &:hover { + filter: grayscale(0%); + } + } + + &.pencil-icon { + background-image: url("@/assets/images/infostand/pencil-icon.png"); + width: 17px; + height: 18px; + } + + &.disk-icon { + background-image: url("@/assets/images/infostand/disk-icon.png"); + width: 14px; + height: 14px; + } + + &.disk-creator { + background-image: url("@/assets/images/infostand/disk-creator.png"); + width: 14px; + height: 14px; + } + + &.trade-locked-icon { + background-image: url("@/assets/images/inventory/trading/locked-icon.png"); + width: 29px; + height: 43px; + } + + &.trade-unlocked-icon { + background-image: url("@/assets/images/inventory/trading/unlocked-icon.png"); + width: 29px; + height: 43px; + } + + &.modtool-room-icon { + background-image: url("@/assets/images/modtool/room.png"); + width: 20px; + height: 15px; + } + + &.modtool-chatlog-icon { + background-image: url("@/assets/images/modtool/chatlog.gif"); + width: 20px; + height: 15px; + } + + &.modtool-user-icon { + background-image: url("@/assets/images/modtool/user.gif"); + width: 20px; + height: 15px; + } + + &.modtool-reports-icon { + background-image: url("@/assets/images/modtool/reports.png"); + width: 20px; + height: 15px; + } + + &.modtool-wrench-icon { + background-image: url("@/assets/images/modtool/wrench.gif"); + width: 20px; + height: 15px; + } + + &.modtool-key-icon { + background-image: url("@/assets/images/modtool/key.gif"); + width: 20px; + height: 15px; + } + + &.icon-catalogue-hc_small { + background-image: url("@/assets/images/catalog/hc_small.png"); + height: 17px; + width: 31px; + } + + &.icon-catalogue-hc_big { + background: url("@/assets/images/catalog/hc_big.png"); + width: 68px; + height: 40px; + } + + &.icon-sign-exclamation { + background: url("@/assets/images/icons/sign-exclamation.png"); + width: 7px; + height: 17px; + } + + &.icon-sign-heart { + background: url("@/assets/images/icons/sign-heart.png"); + width: 15px; + height: 13px; + } + + &.icon-sign-red { + background: url("@/assets/images/icons/sign-red.png"); + width: 11px; + height: 19px; + } + + &.icon-sign-yellow { + background: url("@/assets/images/icons/sign-yellow.png"); + width: 11px; + height: 19px; + } + + &.icon-sign-skull { + background: url("@/assets/images/icons/sign-skull.png"); + width: 12px; + height: 12px; + } + + &.icon-sign-smile { + background: url("@/assets/images/icons/sign-smile.png"); + width: 7px; + height: 14px; + } + + &.icon-sign-soccer { + background: url("@/assets/images/icons/sign-soccer.png"); + width: 20px; + height: 20px; + } + + &.icon-house-small { + background: url("@/assets/images/icons/house-small.png"); + width: 19px; + height: 14px; + } + + &.icon-camera-small { + background: url("@/assets/images/icons/camera-small.png"); + width: 17px; + height: 15px; + } + + &.icon-small-room { + background: url("@/assets/images/icons/small-room.png"); + width: 17px; + height: 16px; + } + + &.icon-cog { + background: url("@/assets/images/icons/cog.png"); + width: 21px; + height: 21px; + } + + &.icon-chat-history { + background: url("@/assets/images/icons/chat-history.png"); + width: 17px; + height: 21px; + } + + &.icon-room-link { + background: url("@/assets/images/icons/room-link.png"); + width: 17px; + height: 15px; + } + + &.icon-zoom-more { + background: url("@/assets/images/icons/zoom-more.png"); + width: 12px; + height: 22px; + } + + &.icon-zoom-less { + background: url("@/assets/images/icons/zoom-less.png"); + width: 12px; + height: 22px; + } + + &.icon-like-room { + background: url("@/assets/images/icons/like-room.png"); + width: 20px; + height: 22px; + } + + &.icon-arrows { + background: url("@/assets/images/icons/arrows.png"); + width: 17px; + height: 15px; + } + + &.icon-camera-colormatrix { + background: url("@/assets/images/icons/camera-colormatrix.png"); + width: 32px; + height: 21px; + } + + &.icon-camera-composite { + background: url("@/assets/images/icons/camera-composite.png"); + width: 32px; + height: 21px; + } + + &.icon-pf-online { + background: url("@/assets/images/profile/icons/online.gif"); + width: 40px; + height: 16px; + } + + &.icon-pf-offline { + background: url("@/assets/images/profile/icons/offline.png"); + width: 39px; + height: 16px; + } + + &.icon-pf-tick { + background: url("@/assets/images/profile/icons/tick.png"); + width: 11px; + height: 10px; + } + + &.icon-group-type-0 { + background: url("@/assets/images/groups/icons/grouptype_icon_0.png"); + width: 16px; + height: 16px; + } + + &.icon-group-type-1 { + background: url("@/assets/images/groups/icons/grouptype_icon_1.png"); + width: 16px; + height: 16px; + } + + &.icon-group-type-2 { + background: url("@/assets/images/groups/icons/grouptype_icon_2.png"); + width: 16px; + height: 16px; + } + + &.icon-group-decorate { + background: url("@/assets/images/groups/icons/group_decorate_icon.png"); + width: 15px; + height: 15px; + } + + &.icon-group-member { + background: url("@/assets/images/groups/icons/group_icon_big_member.png"); + width: 20px; + height: 20px; + } + + &.icon-group-admin { + background: url("@/assets/images/groups/icons/group_icon_big_admin.png"); + width: 20px; + height: 20px; + } + + &.icon-group-owner { + background: url("@/assets/images/groups/icons/group_icon_big_owner.png"); + width: 20px; + height: 20px; + } + + &.icon-group-favorite { + background: url("@/assets/images/groups/icons/group_favorite.png"); + width: 14px; + height: 14px; + } + + &.icon-group-not-favorite { + background: url("@/assets/images/groups/icons/group_notfavorite.png"); + width: 14px; + height: 14px; + } + + &.icon-group-small-admin { + background: url("@/assets/images/groups/icons/group_icon_admin.png"); + width: 11px; + height: 13px; + } + + &.icon-group-small-not-admin { + background: url("@/assets/images/groups/icons/group_icon_not_admin.png"); + width: 11px; + height: 13px; + } + + &.icon-group-small-owner { + background: url("@/assets/images/groups/icons/group_icon_small_owner.png"); + width: 13px; + height: 13px; + } + + &.icon-navigator-info { + background: url("@/assets/images/navigator/icons/info.png"); + width: 18px; + height: 18px; + } + + &.icon-navigator-room-locked { + background: url("@/assets/images/navigator/icons/room_locked.png"); + width: 13px; + height: 16px; + } + + &.icon-navigator-room-password { + background: url("@/assets/images/navigator/icons/room_password.png"); + width: 13px; + height: 16px; + } + + &.icon-navigator-room-invisible { + background: url("@/assets/images/navigator/icons/room_invisible.png"); + width: 13px; + height: 16px; + } + + &.icon-navigator-room-group { + background: url("@/assets/images/navigator/icons/room_group.png"); + width: 13px; + height: 11px; + } + + &.icon-youtube-next { + background: url("@/assets/images/room-widgets/youtube-widget/next.png"); + width: 21px; + height: 16px; + } + + &.icon-youtube-prev { + background: url("@/assets/images/room-widgets/youtube-widget/prev.png"); + width: 21px; + height: 16px; + } + + &.icon-hc-banner { + background: url("@/assets/images/catalog/hc_big.png"); + width: 68px; + height: 40px; + } + + &.icon-set-tile { + background-image: url("@/assets/images/floorplaneditor/icon-tile-set.png"); + width: 40px; + height: 40px; + } + + &.icon-unset-tile { + background-image: url("@/assets/images/floorplaneditor/icon-tile-unset.png"); + width: 40px; + height: 40px; + } + + &.icon-increase-height { + background-image: url("@/assets/images/floorplaneditor/icon-tile-up.png"); + width: 40px; + height: 40px; + } + + &.icon-decrease-height { + background-image: url("@/assets/images/floorplaneditor/icon-tile-down.png"); + width: 40px; + height: 40px; + } + + &.icon-set-door { + background-image: url("@/assets/images/floorplaneditor/icon-door.png"); + width: 40px; + height: 40px; + } + + &.icon-door-direction-0 { + background-image: url("@/assets/images/floorplaneditor/door-direction-0.png"); + width: 80px; + height: 45px; + } + + &.icon-door-direction-1 { + background-image: url("@/assets/images/floorplaneditor/door-direction-1.png"); + width: 80px; + height: 45px; + } + + &.icon-door-direction-2 { + background-image: url("@/assets/images/floorplaneditor/door-direction-2.png"); + width: 80px; + height: 45px; + } + + &.icon-door-direction-3 { + background-image: url("@/assets/images/floorplaneditor/door-direction-3.png"); + width: 80px; + height: 45px; + } + + &.icon-door-direction-4 { + background-image: url("@/assets/images/floorplaneditor/door-direction-4.png"); + width: 80px; + height: 45px; + } + + &.icon-door-direction-5 { + background-image: url("@/assets/images/floorplaneditor/door-direction-5.png"); + width: 80px; + height: 45px; + } + + &.icon-door-direction-6 { + background-image: url("@/assets/images/floorplaneditor/door-direction-6.png"); + width: 80px; + height: 45px; + } + + &.icon-door-direction-7 { + background-image: url("@/assets/images/floorplaneditor/door-direction-7.png"); + width: 80px; + height: 45px; + } + + &.icon-tickets { + background-image: url("@/assets/images/icons/tickets.png"); + width: 17px; + height: 17px; + } + + &.icon-user { + background-image: url("@/assets/images/icons/user.png"); + width: 18px; + height: 19px; + } + + &.icon-loading { + background-image: url("@/assets/images/ui/loading_icon.png"); + + &.with-size { + width: 16px; + height: 16px; + } + } + } +} + +.unique-item { + .unique-bg-override { + @apply z-[2] bg-center bg-no-repeat; + } + + &:before { + @apply absolute z-[1] size-full bg-center bg-no-repeat [content:""]; + background-image: url("@/assets/images/unique/grid-bg.png"); + } + + &:after { + @apply absolute bottom-0 z-[4] size-full bg-center bg-no-repeat [content:""]; + background-image: url("@/assets/images/unique/grid-bg-glass.png"); + } + + &.sold-out:after { + @apply bg-center bg-no-repeat; + background-image: url("@/assets/images/unique/grid-bg-sold-out.png"), + url("@/assets/images/unique/grid-bg-glass.png"); + } + + .unique-item-counter { + background-image: url("@/assets/images/unique/grid-count-bg.png"); + @apply bottom-[1px] z-[3] mx-auto my-0 flex h-[9px] w-full items-center justify-center bg-center bg-no-repeat; + } +} + +.unique-sold-out-blocker { + width: 364px; + height: 30px; + background: url("@/assets/images/unique/catalog-info-sold-out.png"); + + div { + float: right; + width: 140px; + text-align: center; + font-weight: bold; + margin-top: 5px; + margin-right: 17px; + color: #000; + } +} + +.unique-compact-plate { + display: flex; + flex-direction: column; + justify-content: flex-end; + align-items: center; + right: 16px; + width: 34px; + height: 37px; + background: url("@/assets/images/unique/inventory-info-amount-bg.png"); + + div { + display: flex; + justify-content: center; + align-items: center; + height: 9.5px; + } +} + +.unique-complete-plate { + width: 170px; + height: 29px; + background: url("@/assets/images/unique/catalog-info-amount-bg.png") no-repeat center; + z-index: 1; + padding-top: 3px; + + .plate-container { + margin-left: 45px; + width: 100px; + font-size: 10px; + color: black; + + > :first-child { + margin-bottom: 2px; + } + } +} + +.limited-edition-number { + display: inline-block; + outline: 0; + height: 5px; + margin-right: 1px; + background-image: url("@/assets/images/unique/numbers.png"); + background-repeat: no-repeat; + + &:last-child { + margin-right: 0px; + } + + &.n-0 { + width: 4px; + background-position: -1px 0px; + } + + &.n-1 { + width: 2px; + background-position: -6px 0px; + } + + &.n-2 { + width: 4px; + background-position: -9px 0px; + } + + &.n-3 { + width: 4px; + background-position: -14px 0px; + } + + &.n-4 { + width: 4px; + background-position: -19px 0px; + } + + &.n-5 { + width: 4px; + background-position: -24px 0px; + } + + &.n-6 { + width: 4px; + background-position: -29px 0px; + } + + &.n-7 { + width: 4px; + background-position: -34px 0px; + } + + &.n-8 { + width: 4px; + background-position: -39px 0px; + } + + &.n-9 { + width: 4px; + background-position: -44px 0px; + } +} + +.nitro-slider { + display: flex; + align-items: center; + width: 100%; + height: 25px; + + .track { + height: 3px; + border-radius: .25rem; + overflow: hidden; + + &.track-0 { + background-color: #1e7295; + } + + &.track-1 { + background-color: #b6bec5; + } + } + + .thumb { + border-radius: 50%; + width: 25px; + height: 25px; + background-color: gray; + font-size: 10px; + text-align: center; + line-height: 25px; + padding: 0 3px; + + &:hover, + .active { + cursor: pointer; + } + + &.active { + outline: none; + } + + &.degree { + + &:after { + content: '\00b0' + } + } + + &.percent { + + &:after { + content: '\0025' + } + } + } +} + +.layout-grid-item { + height: var(--nitro-grid-column-min-height, unset); + background-position: center; + background-repeat: no-repeat; + background-color: #cdd3d9; +} + +.nitro-friends-spritesheet { + background: url('@/assets/images/friends/friends-spritesheet.png') transparent no-repeat; + + &.icon-friendbar-visit { + width: 21px; + height: 21px; + background-position: -38px -5px; + } + + &.icon-heart { + width: 16px; + height: 14px; + background-position: -5px -67px; + } + + &.icon-new-message { + width: 14px; + height: 14px; + background-position: -96px -53px; + } + + &.icon-none { + width: 16px; + height: 14px; + background-position: -31px -67px; + } + + &.icon-profile { + width: 21px; + height: 21px; + background-position: -5px -36px; + } + + &.icon-profile-sm { + width: 13px; + height: 11px; + background-position: -51px -91px; + + &:hover { + width: 13px; + height: 11px; + background-position: -74px -91px; + } + } + + &.icon-smile { + width: 16px; + height: 14px; + background-position: -57px -67px; + } + + &.icon-warning { + width: 23px; + height: 21px; + background-position: -5px -5px; + } + + &.icon-accept { + width: 13px; + height: 14px; + background-position: -5px -91px; + } + + &.icon-add { + width: 16px; + height: 15px; + background-position: -69px -31px; + } + + &.icon-bobba { + width: 16px; + height: 14px; + background-position: -96px -5px; + } + + &.icon-chat { + width: 17px; + height: 16px; + background-position: -69px -5px; + } + + &.icon-deny { + width: 13px; + height: 14px; + background-position: -28px -91px; + } + + &.icon-follow { + width: 16px; + height: 14px; + background-position: -96px -29px; + } + + &.icon-friendbar-chat { + width: 20px; + height: 21px; + background-position: -36px -36px; + } +} + +.nitro-avatar-editor-spritesheet { + background: url('@/assets/images/avatareditor/avatar-editor-spritesheet.png') transparent no-repeat; + + &.arrow-left-icon { + width: 28px; + height: 21px; + background-position: -226px -131px; + } + + &.arrow-right-icon { + width: 28px; + height: 21px; + background-position: -226px -162px; + } + + &.ca-icon { + width: 25px; + height: 25px; + background-position: -226px -61px; + + &.selected { + width: 25px; + height: 25px; + background-position: -226px -96px; + } + } + + &.cc-icon { + width: 31px; + height: 29px; + background-position: -145px -5px; + + &.selected { + width: 31px; + height: 29px; + background-position: -145px -44px; + } + } + + &.ch-icon { + width: 29px; + height: 24px; + background-position: -186px -39px; + + &.selected { + width: 29px; + height: 24px; + background-position: -186px -73px; + } + } + + &.clear-icon { + width: 27px; + height: 27px; + background-position: -145px -157px; + } + + &.cp-icon { + width: 30px; + height: 24px; + background-position: -145px -264px; + + &.selected { + width: 30px; + height: 24px; + background-position: -186px -5px; + } + } + + + &.ea-icon { + width: 35px; + height: 16px; + background-position: -226px -193px; + + &.selected { + width: 35px; + height: 16px; + background-position: -226px -219px; + } + } + + &.fa-icon { + width: 27px; + height: 20px; + background-position: -186px -137px; + + &.selected { + width: 27px; + height: 20px; + background-position: -186px -107px; + } + } + + &.female-icon { + width: 18px; + height: 27px; + background-position: -186px -202px; + + &.selected { + width: 18px; + height: 27px; + background-position: -186px -239px; + } + } + + &.ha-icon { + width: 25px; + height: 22px; + background-position: -226px -245px; + + &.selected { + width: 25px; + height: 22px; + background-position: -226px -277px; + } + } + + &.he-icon { + width: 31px; + height: 27px; + background-position: -145px -83px; + + &.selected { + width: 31px; + height: 27px; + background-position: -145px -120px; + } + } + + &.hr-icon { + width: 29px; + height: 25px; + background-position: -145px -194px; + + &.selected { + width: 29px; + height: 25px; + background-position: -145px -229px; + } + } + + &.lg-icon { + width: 19px; + height: 20px; + background-position: -303px -45px; + + &.selected { + width: 19px; + height: 20px; + background-position: -303px -75px; + } + } + + &.loading-icon { + width: 21px; + height: 25px; + background-position: -186px -167px; + } + + + &.male-icon { + width: 21px; + height: 21px; + background-position: -186px -276px; + + &.selected { + width: 21px; + height: 21px; + background-position: -272px -5px; + } + } + + + &.sellable-icon { + width: 17px; + height: 15px; + background-position: -303px -105px; + } + + + &.sh-icon { + width: 37px; + height: 10px; + background-position: -303px -5px; + + &.selected { + width: 37px; + height: 10px; + background-position: -303px -25px; + } + } + + + &.spotlight-icon { + width: 130px; + height: 305px; + background-position: -5px -5px; + } + + + &.wa-icon { + width: 36px; + height: 18px; + background-position: -226px -5px; + + &.selected { + width: 36px; + height: 18px; + background-position: -226px -33px; + } + } +} + +.nitro-avatar-editor-wardrobe-figure-preview { + background-color: #677181; + overflow: hidden; + z-index: 1; + + .avatar-image { + position: absolute; + bottom: 15px; + margin: 0 auto; + z-index: 4; + } + + .avatar-shadow { + position: absolute; + left: 0; + right: 0; + bottom: 25px; + width: 40px; + height: 20px; + margin: 0 auto; + border-radius: 100%; + background-color: rgba(0, 0, 0, 0.20); + z-index: 2; + } + + &:after { + position: absolute; + content: ''; + top: 75%; + bottom: 0; + left: 0; + right: 0; + border-radius: 50%; + background-color: #677181; + box-shadow: 0 0 8px 2px rgba(255, 255, 255, 0.6); + transform: scale(2); + } + + .button-container { + position: absolute; + bottom: 0; + z-index: 5; + } +} + +.nitro-avatar-editor { + + + .category-item { + height: 40px; + } + + .figure-preview-container { + position: relative; + height: 100%; + background-color: #677181; + overflow: hidden; + z-index: 1; + + .arrow-container { + position: absolute; + width: 100%; + margin: 0 auto; + padding: 0 10px; + display: flex; + justify-content: space-between; + bottom: 12px; + z-index: 5; + + .icon { + cursor: pointer; + } + } + + .avatar-image { + position: absolute; + left: 0; + right: 0; + bottom: 50px; + margin: 0 auto; + z-index: 4; + } + + .avatar-spotlight { + position: absolute; + top: -10px; + left: 0; + right: 0; + margin: 0 auto; + opacity: 0.3; + pointer-events: none; + z-index: 3; + } + + .avatar-shadow { + position: absolute; + left: 0; + right: 0; + bottom: 15px; + width: 70px; + height: 30px; + margin: 0 auto; + border-radius: 100%; + background-color: rgba(0, 0, 0, 0.20); + z-index: 2; + } + + &:after { + position: absolute; + content: ''; + top: 75%; + bottom: 0; + left: 0; + right: 0; + border-radius: 50%; + background-color: #677181; + box-shadow: 0 0 8px 2px rgba(255, 255, 255, 0.6); + transform: scale(2); + } + } +} + +/* Font Size */ + +.fs-custom { + font-size: var(--font-size, 16px); /* Fallback to 16px if not set */ +} \ No newline at end of file diff --git a/src/components/loading/LoadingView.scss b/src/css/loading.css similarity index 59% rename from src/components/loading/LoadingView.scss rename to src/css/loading.css index 4995543..dbf725e 100644 --- a/src/components/loading/LoadingView.scss +++ b/src/css/loading.css @@ -1,28 +1,32 @@ .nitro-loading { position: relative; - background-image: radial-gradient(#1d1a24, #003a6b); + background-image: radial-gradient(#1d1a24, #003a6b); z-index: 100; } -.connecting-duck { +.nitro-loading_animation { position: absolute; top: 0; bottom: 0; margin: auto; right: 0; left: 0; - background: url('@/assets/images/loading/caja.gif') no-repeat top left; + background: url('@/assets/images/loading/loading.gif') no-repeat top left; width: 84px; height: 84px; zoom: 1.5; image-rendering: pixelated; } -.logo { +.nitro-loading_logo { position: absolute; top: 20px; left: 20px; - background: url('@/assets/images/notifications/coolui.png') no-repeat top left; /* Fixed the typo here */ + background: url('@/assets/images/notifications/coolui.png') no-repeat top left; width: 150px; height: 100px; +} + +.text-shadow { + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); } \ No newline at end of file diff --git a/src/events/catalog/CatalogPostMarketplaceOfferEvent.ts b/src/events/catalog/CatalogPostMarketplaceOfferEvent.ts index d54c6c4..31c49c2 100644 --- a/src/events/catalog/CatalogPostMarketplaceOfferEvent.ts +++ b/src/events/catalog/CatalogPostMarketplaceOfferEvent.ts @@ -4,7 +4,7 @@ import { FurnitureItem } from '../../api'; export class CatalogPostMarketplaceOfferEvent extends CatalogEvent { public static readonly POST_MARKETPLACE = 'CE_POST_MARKETPLACE'; - + private _item: FurnitureItem; constructor(item: FurnitureItem) diff --git a/src/events/inventory/DeleteItemConfirmEvent.ts b/src/events/inventory/DeleteItemConfirmEvent.ts deleted file mode 100644 index 7ba95aa..0000000 --- a/src/events/inventory/DeleteItemConfirmEvent.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { FurnitureItem } from '../../api'; -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class DeleteItemConfirmEvent extends NitroEvent -{ - public static DELETE_ITEM_CONFIRM = 'DIC_DELETE_ITEM_CONFIRM'; - - private _item: FurnitureItem; - private _amount: number; - - constructor(item: FurnitureItem, amount: number) - { - super(DeleteItemConfirmEvent.DELETE_ITEM_CONFIRM); - this._item = item; - this._amount = amount; - } - - public get item(): FurnitureItem - { - return this._item; - } - - public get amount(): number - { - return this._amount; - } -} diff --git a/src/events/inventory/index.ts b/src/events/inventory/index.ts index a037def..58503ea 100644 --- a/src/events/inventory/index.ts +++ b/src/events/inventory/index.ts @@ -1,2 +1 @@ -export * from './DeleteItemConfirmEvent'; -export * from './InventoryFurniAddedEvent'; \ No newline at end of file +export * from './InventoryFurniAddedEvent'; diff --git a/src/hooks/UseMountEffect.tsx b/src/hooks/UseMountEffect.tsx deleted file mode 100644 index 0ead14b..0000000 --- a/src/hooks/UseMountEffect.tsx +++ /dev/null @@ -1,7 +0,0 @@ -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/useAchievements.ts b/src/hooks/achievements/useAchievements.ts index a067ff7..cf818e6 100644 --- a/src/hooks/achievements/useAchievements.ts +++ b/src/hooks/achievements/useAchievements.ts @@ -136,7 +136,7 @@ const useAchievementsState = () => { const parser = event.getParser(); const categories: AchievementCategory[] = []; - + for(const achievement of parser.achievements) { const categoryName = achievement.category; @@ -180,6 +180,6 @@ const useAchievementsState = () => }, [ selectedCategoryCode, selectedAchievementId, setAchievementSeen ]); return { achievementCategories, selectedCategoryCode, setSelectedCategoryCode, selectedAchievementId, setSelectedAchievementId, achievementScore, getTotalUnseen, getProgress, getMaxProgress, scaledProgressPercent, selectedCategory, selectedAchievement, setAchievementSeen }; -} +}; export const useAchievements = () => useBetween(useAchievementsState); diff --git a/src/hooks/avatar-editor/index.ts b/src/hooks/avatar-editor/index.ts new file mode 100644 index 0000000..ab8a733 --- /dev/null +++ b/src/hooks/avatar-editor/index.ts @@ -0,0 +1,2 @@ +export * from './useAvatarEditor'; +export * from './useFigureData'; diff --git a/src/hooks/avatar-editor/useAvatarEditor.ts b/src/hooks/avatar-editor/useAvatarEditor.ts new file mode 100644 index 0000000..e92ec7c --- /dev/null +++ b/src/hooks/avatar-editor/useAvatarEditor.ts @@ -0,0 +1,318 @@ +import { AvatarEditorFigureCategory, AvatarFigureContainer, AvatarFigurePartType, FigureSetIdsMessageEvent, GetAvatarRenderManager, GetSessionDataManager, GetWardrobeMessageComposer, IAvatarFigureContainer, IFigurePartSet, IPalette, IPartColor, SetType, UserWardrobePageEvent } from '@nitrots/nitro-renderer'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useBetween } from 'use-between'; +import { AvatarEditorColorSorter, AvatarEditorPartSorter, AvatarEditorThumbnailsHelper, GetClubMemberLevel, GetConfigurationValue, IAvatarEditorCategory, IAvatarEditorCategoryPartItem, Randomizer, SendMessageComposer } from '../../api'; +import { useMessageEvent } from '../events'; +import { useFigureData } from './useFigureData'; + +const MAX_PALETTES: number = 2; + +const useAvatarEditorState = () => +{ + const [ isVisible, setIsVisible ] = useState(false); + const [ avatarModels, setAvatarModels ] = useState<{ [index: string]: IAvatarEditorCategory[] }>({}); + const [ activeModelKey, setActiveModelKey ] = useState(''); + const [ maxPaletteCount, setMaxPaletteCount ] = useState(1); + const [ figureSetIds, setFigureSetIds ] = useState([]); + const [ boundFurnitureNames, setBoundFurnitureNames ] = useState([]); + const [ savedFigures, setSavedFigures ] = useState<[ IAvatarFigureContainer, string ][]>(null); + const { selectedColors, gender, setGender, loadAvatarData, selectPart, selectColor, getFigureString, getFigureStringWithFace, selectedParts } = useFigureData(); + + const activeModel = useMemo(() => (avatarModels[activeModelKey] ?? null), [ activeModelKey, avatarModels ]); + + const selectedColorParts = useMemo(() => + { + const colorSets: { [index: string]: IPartColor[] } = {}; + + for(const setType of Object.keys(selectedColors)) + { + if(!selectedColors[setType]) continue; + + const parts: IPartColor[] = []; + + for(const paletteId of Object.keys(selectedColors[setType])) + { + const partColor = activeModel.find(category => (category.setType === setType))?.colorItems[paletteId]?.find(partColor => (partColor.id === selectedColors[setType][paletteId])); + + if(partColor) parts.push(partColor); + } + + colorSets[setType] = parts; + } + + return colorSets; + + }, [ activeModel, selectedColors ]); + + const selectEditorPart = useCallback((setType: string, partId: number) => + { + if(!setType || !setType.length) return; + + const category = activeModel.find(category => (category.setType === setType)); + + if(!category || !category.partItems || !category.partItems.length) return; + + const partItem = category.partItems.find(partItem => partItem.id === partId); + + if(!partItem) return; + + if(partItem.isClear) + { + selectPart(setType, -1); + + return; + } + + if(GetClubMemberLevel() < partItem.partSet.clubLevel) return; + + setMaxPaletteCount(partItem.maxPaletteCount || 1); + + selectPart(setType, partId); + }, [ activeModel, selectPart ]); + + const selectEditorColor = useCallback((setType: string, paletteId: number, colorId: number) => + { + if(!setType || !setType.length) return; + + const category = activeModel.find(category => (category.setType === setType)); + + if(!category || !category.colorItems || !category.colorItems.length) return; + + const palette = category.colorItems[paletteId]; + + if(!palette || !palette.length) return; + + const partColor = palette.find(partColor => (partColor.id === colorId)); + + if(!partColor) return; + + if(GetClubMemberLevel() < partColor.clubLevel) return; + + selectColor(setType, paletteId, colorId); + }, [ activeModel, selectColor ]); + + const getFirstSelectableColor = useCallback((setType: string) => + { + const set = GetAvatarRenderManager().structureData.getSetType(setType); + + if(!setType) return -1; + + const palette = GetAvatarRenderManager().structureData.getPalette(set.paletteID); + + if(!palette) return -1; + + for(const color of palette.colors.getValues()) + { + if(!color.isSelectable || (GetClubMemberLevel() < color.clubLevel)) continue; + + return color.id; + } + + return -1; + }, []); + + const randomizeCurrentFigure = useCallback((ignoredSets: string[] = []) => + { + const structure = GetAvatarRenderManager().structure; + const figureContainer = new AvatarFigureContainer(''); + + const getRandomSetTypes = (requiredSets: string[], options: string[]) => + { + options = options.filter(option => (requiredSets.indexOf(option) === -1)); + + return [ ...requiredSets, ...Randomizer.getRandomElements(options, (Randomizer.getRandomNumber(options.length) + 1)) ]; + }; + + const requiredSets = getRandomSetTypes(structure.getMandatorySetTypeIds(gender, GetClubMemberLevel()), AvatarFigurePartType.FIGURE_SETS); + + const getRandomPartSet = (setType: SetType, gender: string, clubLevel: number, figureSetIds: number[]) => + { + 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; + + return option; + }); + + if(!options || !options.length) return null; + + return Randomizer.getRandomElement(options); + }; + + const getRandomColors = (palette: IPalette, partSet: IFigurePartSet, clubLevel: number) => + { + const options = palette.colors.getValues().filter(option => + { + if(!option.isSelectable || (option.clubLevel > clubLevel)) return null; + + return option; + }); + + if(!options || !options.length) return null; + + const getTotalColors = (partSet: IFigurePartSet) => + { + const parts = partSet.parts; + + let totalColors = 0; + + for(const part of parts) totalColors = Math.max(totalColors, part.colorLayerIndex); + + return totalColors; + }; + + return Randomizer.getRandomElements(options, getTotalColors(partSet)); + }; + + for(const setType of ignoredSets) + { + const partSetId = selectedParts[setType]; + const colors = selectedColors[setType]; + + figureContainer.updatePart(setType, partSetId, colors); + } + + for(const type of requiredSets) + { + if(figureContainer.hasPartType(type)) continue; + + const setType = (structure.figureData.getSetType(type) as SetType); + const selectedSet = getRandomPartSet(setType, gender, GetClubMemberLevel(), figureSetIds); + + if(!selectedSet) continue; + + let selectedColors: number[] = []; + + if(selectedSet.isColorable) + { + selectedColors = getRandomColors(structure.figureData.getPalette(setType.paletteID), selectedSet, GetClubMemberLevel()).map(color => color.id); + } + + figureContainer.updatePart(setType.type, selectedSet.id, selectedColors); + } + + loadAvatarData(figureContainer.getFigureString(), gender); + }, [ figureSetIds, gender, loadAvatarData, selectedColors, selectedParts ]); + + useMessageEvent(FigureSetIdsMessageEvent, event => + { + const parser = event.getParser(); + + setFigureSetIds(parser.figureSetIds); + setBoundFurnitureNames(parser.boundsFurnitureNames); + }); + + useMessageEvent(UserWardrobePageEvent, event => + { + const parser = event.getParser(); + const savedFigures: [ IAvatarFigureContainer, string ][] = []; + + let i = 0; + + while(i < GetConfigurationValue('avatar.wardrobe.max.slots', 10)) + { + savedFigures.push([ null, null ]); + + i++; + } + + for(let [ index, [ look, gender ] ] of parser.looks.entries()) + { + const container = GetAvatarRenderManager().createFigureContainer(look); + + savedFigures[(index - 1)] = [ container, gender ]; + } + + setSavedFigures(savedFigures); + }); + + useEffect(() => + { + AvatarEditorThumbnailsHelper.clearCache(); + }, [ selectedColorParts ]); + + useEffect(() => + { + if(!isVisible) return; + + const newAvatarModels: { [index: string]: IAvatarEditorCategory[] } = {}; + + const buildCategory = (setType: string) => + { + const partItems: IAvatarEditorCategoryPartItem[] = []; + const colorItems: IPartColor[][] = []; + + for(let i = 0; i < MAX_PALETTES; i++) colorItems.push([]); + + const set = GetAvatarRenderManager().structureData.getSetType(setType); + const palette = GetAvatarRenderManager().structureData.getPalette(set.paletteID); + + if(!set || !palette) return null; + + for(const partColor of palette.colors.getValues()) + { + if(!partColor || !partColor.isSelectable) continue; + + for(let i = 0; i < MAX_PALETTES; i++) colorItems[i].push(partColor); + } + + let mandatorySetIds: string[] = GetAvatarRenderManager().getMandatoryAvatarPartSetIds(gender, GetClubMemberLevel()); + + const isntMandatorySet = (mandatorySetIds.indexOf(setType) === -1); + + if(isntMandatorySet) partItems.push({ id: -1, isClear: true }); + + const usesColor = (setType !== AvatarFigurePartType.HEAD); + const partSets = set.partSets; + + for(let i = (partSets.length); i >= 0; i--) + { + const partSet = partSets.getWithIndex(i); + + if(!partSet || !partSet.isSelectable || ((partSet.gender !== gender) && (partSet.gender !== AvatarFigurePartType.UNISEX))) continue; + + if(partSet.isSellable && figureSetIds.indexOf(partSet.id) === -1) continue; + + let maxPaletteCount = 0; + + for(const part of partSet.parts) maxPaletteCount = Math.max(maxPaletteCount, part.colorLayerIndex); + + partItems.push({ id: partSet.id, partSet, usesColor, maxPaletteCount }); + } + + partItems.sort(AvatarEditorPartSorter(false)); + + for(let i = 0; i < MAX_PALETTES; i++) colorItems[i].sort(AvatarEditorColorSorter); + + return { setType, partItems, colorItems }; + }; + + newAvatarModels[AvatarEditorFigureCategory.GENERIC] = [ AvatarFigurePartType.HEAD ].map(setType => buildCategory(setType)); + newAvatarModels[AvatarEditorFigureCategory.HEAD] = [ AvatarFigurePartType.HAIR, AvatarFigurePartType.HEAD_ACCESSORY, AvatarFigurePartType.HEAD_ACCESSORY_EXTRA, AvatarFigurePartType.EYE_ACCESSORY, AvatarFigurePartType.FACE_ACCESSORY ].map(setType => buildCategory(setType)); + newAvatarModels[AvatarEditorFigureCategory.TORSO] = [ AvatarFigurePartType.CHEST, AvatarFigurePartType.CHEST_PRINT, AvatarFigurePartType.COAT_CHEST, AvatarFigurePartType.CHEST_ACCESSORY ].map(setType => buildCategory(setType)); + newAvatarModels[AvatarEditorFigureCategory.LEGS] = [ AvatarFigurePartType.LEGS, AvatarFigurePartType.SHOES, AvatarFigurePartType.WAIST_ACCESSORY ].map(setType => buildCategory(setType)); + newAvatarModels[AvatarEditorFigureCategory.WARDROBE] = []; + + setAvatarModels(newAvatarModels); + setActiveModelKey(AvatarEditorFigureCategory.GENERIC); + }, [ isVisible, gender, figureSetIds ]); + + useEffect(() => + { + if(!isVisible) return; + + loadAvatarData(GetSessionDataManager().figure, GetSessionDataManager().gender); + }, [ isVisible, loadAvatarData ]); + + useEffect(() => + { + if(!isVisible || savedFigures) return; + + setSavedFigures(new Array(GetConfigurationValue('avatar.wardrobe.max.slots', 10))); + SendMessageComposer(new GetWardrobeMessageComposer()); + }, [ isVisible, savedFigures ]); + + return { isVisible, setIsVisible, avatarModels, activeModelKey, setActiveModelKey, maxPaletteCount, selectedColorParts, selectEditorColor, selectEditorPart, loadAvatarData, getFigureString, getFigureStringWithFace, selectedParts, gender, setGender, figureSetIds, randomizeCurrentFigure, savedFigures, setSavedFigures, getFirstSelectableColor }; +}; + +export const useAvatarEditor = () => useBetween(useAvatarEditorState); diff --git a/src/hooks/avatar-editor/useFigureData.ts b/src/hooks/avatar-editor/useFigureData.ts new file mode 100644 index 0000000..bdd0d50 --- /dev/null +++ b/src/hooks/avatar-editor/useFigureData.ts @@ -0,0 +1,150 @@ +import { AvatarFigurePartType } from '@nitrots/nitro-renderer'; +import { useCallback, useMemo, useState } from 'react'; + +const useFigureDataState = () => +{ + const [ selectedParts, setSelectedParts ] = useState<{ [index: string]: number }>({}); + const [ selectedColors, setSelectedColors ] = useState<{ [index: string]: number[] }>({}); + const [ gender, setGender ] = useState(AvatarFigurePartType.MALE); + + const loadAvatarData = useCallback((figureString: string, gender: string) => + { + const parse = (figure: string) => + { + const sets = figure.split('.'); + + if(!sets || !sets.length) return; + + const partSets: { [index: string]: number } = {}; + const colorSets: { [index: string]: number[] } = {}; + + for(const set of sets) + { + const parts = set.split('-'); + + if(!parts.length) continue; + + const setType = parts[0]; + const partId = parseInt(parts[1]); + const colorIds: number[] = []; + + let offset = 2; + + while(offset < parts.length) + { + colorIds.push(parseInt(parts[offset])); + + offset++; + } + + if(!colorIds.length) colorIds.push(0); + + if(partId >= 0) partSets[setType] = partId; + + if(colorIds.length) colorSets[setType] = colorIds; + } + + return { partSets, colorSets }; + }; + + const { partSets, colorSets } = parse(figureString); + + setSelectedParts(partSets); + setSelectedColors(colorSets); + setGender(gender); + }, []); + + const selectPart = useCallback((setType: string, partId: number) => + { + if(!setType || !setType.length) return; + + setSelectedParts(prevValue => + { + const newValue = { ...prevValue }; + + if(partId === -1) delete newValue[setType]; + else newValue[setType] = partId; + + return newValue; + }); + }, []); + + const selectColor = useCallback((setType: string, paletteId: number, colorId: number) => + { + if(!setType || !setType.length) return; + + setSelectedColors(prevValue => + { + const newValue = { ...prevValue }; + + if(!newValue[setType]) newValue[setType] = []; + + if(!newValue[setType][paletteId]) newValue[setType][paletteId] = 0; + + newValue[setType][paletteId] = colorId; + + return newValue; + }); + }, []); + + const getFigureString = useMemo(() => + { + let figureString = ''; + + const partSets: string[] = []; + const setTypes = Object.keys(selectedParts); + + for(const setType of setTypes) + { + const partId = selectedParts[setType]; + + if(!partId) continue; + + let setPart = `${ setType }-${ partId }`; + + if(selectedColors[setType] && selectedColors[setType].length) + { + let i = 0; + + while(i < selectedColors[setType].length) + { + setPart += `-${ selectedColors[setType][i] }`; + + i++; + } + } + + partSets.push(setPart); + } + + for(const partSet of partSets) + { + figureString += partSet; + + if(partSets.indexOf(partSet) < (partSets.length - 1)) figureString += '.'; + } + + return figureString; + }, [ selectedParts, selectedColors ]); + + const getFigureStringWithFace = useCallback((overridePartId: number, override: boolean = true) => + { + const figureSets = [ AvatarFigurePartType.HEAD ].map(setType => + { + let partId = (setType === AvatarFigurePartType.HEAD && override) ? overridePartId : selectedParts[setType]; + const colors = selectedColors[setType] || []; + + let figureSet = `${ setType }-${ partId }`; + + if(partId >= 0) figureSet += colors.map(color => `-${ color }`).join(''); + + return figureSet; + }); + + return figureSets.join('.'); + }, [ selectedParts, selectedColors ]); + + return { selectedParts, selectedColors, gender, setGender, loadAvatarData, selectPart, selectColor, getFigureString, getFigureStringWithFace }; +}; + +export const useFigureData = useFigureDataState; diff --git a/src/hooks/camera/useCamera.ts b/src/hooks/camera/useCamera.ts index e2449c8..45cb8ea 100644 --- a/src/hooks/camera/useCamera.ts +++ b/src/hooks/camera/useCamera.ts @@ -1,8 +1,8 @@ -import { InitCameraMessageEvent, IRoomCameraWidgetEffect, RequestCameraConfigurationComposer, RoomCameraWidgetManagerEvent } from '@nitrots/nitro-renderer'; +import { GetRoomCameraWidgetManager, 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'; +import { CameraPicture, SendMessageComposer } from '../../api'; +import { useMessageEvent, useNitroEvent } from '../events'; const useCameraState = () => { @@ -12,7 +12,7 @@ const useCameraState = () => const [ myLevel, setMyLevel ] = useState(10); const [ price, setPrice ] = useState<{ credits: number, duckets: number, publishDucketPrice: number }>(null); - useCameraEvent(RoomCameraWidgetManagerEvent.INITIALIZED, event => + useNitroEvent(RoomCameraWidgetManagerEvent.INITIALIZED, event => { setAvailableEffects(Array.from(GetRoomCameraWidgetManager().effects.values())); }); @@ -20,23 +20,20 @@ const useCameraState = () => useMessageEvent(InitCameraMessageEvent, event => { const parser = event.getParser(); - + setPrice({ credits: parser.creditPrice, duckets: parser.ducketPrice, publishDucketPrice: parser.publishDucketPrice }); }); useEffect(() => { - if(!GetRoomCameraWidgetManager().isLoaded) - { - GetRoomCameraWidgetManager().init(); + if(GetRoomCameraWidgetManager().isLoaded) return; - SendMessageComposer(new RequestCameraConfigurationComposer()); + GetRoomCameraWidgetManager().init(); - return; - } + SendMessageComposer(new RequestCameraConfigurationComposer()); }, []); return { availableEffects, cameraRoll, setCameraRoll, selectedPictureIndex, setSelectedPictureIndex, myLevel, price }; -} +}; -export const useCamera = () => useBetween(useCameraState); +export const useCamera = () => useBetween(useCameraState); \ No newline at end of file diff --git a/src/hooks/catalog/useCatalog.ts b/src/hooks/catalog/useCatalog.ts index 6a8b266..4f6c0db 100644 --- a/src/hooks/catalog/useCatalog.ts +++ b/src/hooks/catalog/useCatalog.ts @@ -1,9 +1,9 @@ -import { BuildersClubFurniCountMessageEvent, BuildersClubPlaceRoomItemMessageComposer, BuildersClubPlaceWallItemMessageComposer, BuildersClubQueryFurniCountMessageComposer, BuildersClubSubscriptionStatusMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, ClubGiftInfoEvent, FrontPageItem, FurniturePlaceComposer, FurniturePlacePaintComposer, GetCatalogIndexComposer, GetCatalogPageComposer, GetClubGiftInfo, GetGiftWrappingConfigurationComposer, GetTickerTime, 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 { BuildersClubFurniCountMessageEvent, BuildersClubPlaceRoomItemMessageComposer, BuildersClubPlaceWallItemMessageComposer, BuildersClubQueryFurniCountMessageComposer, BuildersClubSubscriptionStatusMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, ClubGiftInfoEvent, CreateLinkEvent, FrontPageItem, FurniturePlaceComposer, FurniturePlacePaintComposer, GetCatalogIndexComposer, GetCatalogPageComposer, GetClubGiftInfo, GetGiftWrappingConfigurationComposer, GetRoomEngine, GetTickerTime, 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, 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 { BuilderFurniPlaceableStatus, CatalogNode, CatalogPage, CatalogPetPalette, CatalogType, DispatchUiEvent, FurniCategory, GetFurnitureData, GetProductDataForLocalization, GetRoomSession, GiftWrappingConfiguration, ICatalogNode, ICatalogOptions, ICatalogPage, IPageLocalization, IProduct, IPurchasableOffer, IPurchaseOptions, LocalizeText, NotificationAlertType, Offer, PageLocalization, PlacedObjectPurchaseData, PlaySound, Product, ProductTypeEnum, RequestedPage, SearchResult, SendMessageComposer, SoundNames } from '../../api'; import { CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent, CatalogPurchasedEvent, InventoryFurniAddedEvent } from '../../events'; -import { useMessageEvent, useRoomEngineEvent, useUiEvent } from '../events'; +import { useMessageEvent, useNitroEvent, useUiEvent } from '../events'; import { useNotification } from '../notification'; import { useCatalogPlaceMultipleItems } from './useCatalogPlaceMultipleItems'; import { useCatalogSkipPurchaseConfirmation } from './useCatalogSkipPurchaseConfirmation'; @@ -223,7 +223,7 @@ const useCatalogState = () => for(const child of node.children) { - const found = (getNodeById(id, child) as ICatalogNode); + const found = (getNodeById(id, child)); if(found) return found; } @@ -237,7 +237,7 @@ const useCatalogState = () => for(const child of node.children) { - const found = (getNodeByName(name, child) as ICatalogNode); + const found = (getNodeByName(name, child)); if(found) return found; } @@ -286,7 +286,7 @@ const useCatalogState = () => { if(offer.offerId !== offerId) continue; - setCurrentOffer(offer) + setCurrentOffer(offer); break; } @@ -436,7 +436,7 @@ const useCatalogState = () => for(const child of node.children) catalogNode.addChild(getCatalogNode(child, depth, catalogNode)); return catalogNode; - } + }; setRootNode(getCatalogNode(parser.root, 0, null)); setOffersToNodes(offers); @@ -685,7 +685,7 @@ const useCatalogState = () => useUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, event => PlaySound(SoundNames.CREDITS)); - useRoomEngineEvent(RoomEngineObjectPlacedEvent.PLACED, event => + useNitroEvent(RoomEngineObjectPlacedEvent.PLACED, event => { if(!objectMoverRequested || (event.type !== RoomEngineObjectPlacedEvent.PLACED)) return; @@ -904,10 +904,10 @@ const useCatalogState = () => 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/chat-history/useChatHistory.ts b/src/hooks/chat-history/useChatHistory.ts index 4c0aa03..348f5d4 100644 --- a/src/hooks/chat-history/useChatHistory.ts +++ b/src/hooks/chat-history/useChatHistory.ts @@ -2,8 +2,7 @@ import { GetGuestRoomResultEvent, NewConsoleMessageEvent, RoomInviteEvent, RoomS import { useState } from 'react'; import { useBetween } from 'use-between'; import { ChatEntryType, ChatHistoryCurrentDate, IChatEntry, IRoomHistoryEntry, MessengerHistoryCurrentDate } from '../../api'; -import { useMessageEvent, useRoomSessionManagerEvent } from '../events'; -import { useLocalStorage } from '../useLocalStorage'; +import { useMessageEvent, useNitroEvent } from '../events'; const CHAT_HISTORY_MAX = 1000; const ROOM_HISTORY_MAX = 10; @@ -14,10 +13,10 @@ let MESSENGER_HISTORY_COUNTER: number = 0; const useChatHistoryState = () => { - const [ chatHistory, setChatHistory ] = useLocalStorage('chatHistory', []); - const [ roomHistory, setRoomHistory ] = useLocalStorage('roomHistory', []); - const [ messengerHistory, setMessengerHistory ] = useLocalStorage('messengerHistory', []); - const [ needsRoomInsert, setNeedsRoomInsert ] = useLocalStorage('needsRoomInsert', false); + const [ chatHistory, setChatHistory ] = useState([]); + const [ roomHistory, setRoomHistory ] = useState([]); + const [ messengerHistory, setMessengerHistory ] = useState([]); + const [ needsRoomInsert, setNeedsRoomInsert ] = useState(false); const addChatEntry = (entry: IChatEntry) => { @@ -33,7 +32,7 @@ const useChatHistoryState = () => return newValue; }); - } + }; const addRoomHistoryEntry = (entry: IRoomHistoryEntry) => { @@ -47,7 +46,7 @@ const useChatHistoryState = () => return newValue; }); - } + }; const addMessengerEntry = (entry: IChatEntry) => { @@ -63,9 +62,9 @@ const useChatHistoryState = () => return newValue; }); - } + }; - useRoomSessionManagerEvent(RoomSessionEvent.STARTED, event => setNeedsRoomInsert(true)); + useNitroEvent(RoomSessionEvent.STARTED, event => setNeedsRoomInsert(true)); useMessageEvent(GetGuestRoomResultEvent, event => { @@ -98,8 +97,8 @@ const useChatHistoryState = () => addMessengerEntry({ id: -1, webId: parser.senderId, entityId: -1, name: '', message: parser.messageText, roomId: -1, timestamp: MessengerHistoryCurrentDate(), type: ChatEntryType.TYPE_IM }); }); - + return { addChatEntry, chatHistory, roomHistory, messengerHistory }; -} +}; export const useChatHistory = () => useBetween(useChatHistoryState); diff --git a/src/hooks/events/core/index.ts b/src/hooks/events/core/index.ts deleted file mode 100644 index b69a57e..0000000 --- a/src/hooks/events/core/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './useCommunicationEvent'; -export * from './useConfigurationEvent'; diff --git a/src/hooks/events/core/useCommunicationEvent.tsx b/src/hooks/events/core/useCommunicationEvent.tsx deleted file mode 100644 index 83d6ed5..0000000 --- a/src/hooks/events/core/useCommunicationEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 617e9a2..0000000 --- a/src/hooks/events/core/useConfigurationEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -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 cafd793..6d9903b 100644 --- a/src/hooks/events/index.ts +++ b/src/hooks/events/index.ts @@ -1,5 +1,4 @@ -export * from './core'; -export * from './nitro'; export * from './useEventDispatcher'; export * from './useMessageEvent'; +export * from './useNitroEvent'; export * from './useUiEvent'; diff --git a/src/hooks/events/nitro/index.ts b/src/hooks/events/nitro/index.ts deleted file mode 100644 index 2248da9..0000000 --- a/src/hooks/events/nitro/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from './useAvatarEvent'; -export * from './useCameraEvent'; -export * from './useLocalizationEvent'; -export * from './useMainEvent'; -export * from './useRoomEngineEvent'; -export * from './useRoomSessionManagerEvent'; -export * from './useSessionDataManagerEvent'; -export * from './useSoundEvent'; diff --git a/src/hooks/events/nitro/useAvatarEvent.tsx b/src/hooks/events/nitro/useAvatarEvent.tsx deleted file mode 100644 index 9212a68..0000000 --- a/src/hooks/events/nitro/useAvatarEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 42bee39..0000000 --- a/src/hooks/events/nitro/useCameraEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 0dccbdc..0000000 --- a/src/hooks/events/nitro/useLocalizationEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 8a2ad8b..0000000 --- a/src/hooks/events/nitro/useMainEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 6d2d419..0000000 --- a/src/hooks/events/nitro/useRoomEngineEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 5cccb98..0000000 --- a/src/hooks/events/nitro/useRoomSessionManagerEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index fa49271..0000000 --- a/src/hooks/events/nitro/useSessionDataManagerEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -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/nitro/useSoundEvent.tsx b/src/hooks/events/nitro/useSoundEvent.tsx deleted file mode 100644 index 4bfbd5d..0000000 --- a/src/hooks/events/nitro/useSoundEvent.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../../../api'; -import { useEventDispatcher } from '../useEventDispatcher'; - -export const useSoundEvent = (type: string | string[], handler: (event: T) => void, enabled = true) => useEventDispatcher(type, GetNitroInstance().soundManager.events, handler, enabled); diff --git a/src/hooks/events/useEventDispatcher.tsx b/src/hooks/events/useEventDispatcher.tsx index 60555f2..4b1dd18 100644 --- a/src/hooks/events/useEventDispatcher.tsx +++ b/src/hooks/events/useEventDispatcher.tsx @@ -26,6 +26,6 @@ export const useEventDispatcher = (type: string | string[] { eventDispatcher.removeEventListener(type, handler); } - } + }; }, [ type, eventDispatcher, enabled, handler ]); -} +}; diff --git a/src/hooks/events/useMessageEvent.tsx b/src/hooks/events/useMessageEvent.tsx index 3a62ebe..cd4e7a6 100644 --- a/src/hooks/events/useMessageEvent.tsx +++ b/src/hooks/events/useMessageEvent.tsx @@ -1,16 +1,22 @@ -import { IMessageEvent, MessageEvent } from '@nitrots/nitro-renderer'; +import { + GetCommunication, + IMessageEvent, + MessageEvent, +} from '@nitrots/nitro-renderer'; import { useEffect } from 'react'; -import { GetCommunication } from '../../api'; -export const useMessageEvent = (eventType: typeof MessageEvent, handler: (event: T) => void) => +export const useMessageEvent = ( + eventType: typeof MessageEvent, + handler: (event: T) => void +) => { useEffect(() => { //@ts-ignore const event = new eventType(handler); - + GetCommunication().registerMessageEvent(event); - + return () => GetCommunication().removeMessageEvent(event); - }, [ eventType, handler ]); -} + }, [eventType, handler]); +}; diff --git a/src/hooks/events/useNitroEvent.tsx b/src/hooks/events/useNitroEvent.tsx new file mode 100644 index 0000000..ef202bf --- /dev/null +++ b/src/hooks/events/useNitroEvent.tsx @@ -0,0 +1,8 @@ +import { GetEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer'; +import { useEventDispatcher } from './useEventDispatcher'; + +export const useNitroEvent = ( + type: string | string[], + handler: (event: T) => void, + enabled = true +) => useEventDispatcher(type, GetEventDispatcher(), handler, enabled); diff --git a/src/hooks/friends/useFriends.ts b/src/hooks/friends/useFriends.ts index 46820b2..aa4d49f 100644 --- a/src/hooks/friends/useFriends.ts +++ b/src/hooks/friends/useFriends.ts @@ -1,9 +1,8 @@ -import { AcceptFriendMessageComposer, DeclineFriendMessageComposer, FindFriendsProcessResultEvent, FollowFriendMessageComposer, FriendListFragmentEvent, FriendListUpdateComposer, FriendListUpdateEvent, FriendParser, FriendRequestsEvent, GetFriendRequestsComposer, MessengerInitComposer, MessengerInitEvent, NewFriendRequestEvent, RequestFriendComposer, SetRelationshipStatusComposer } from '@nitrots/nitro-renderer'; +import { AcceptFriendMessageComposer, DeclineFriendMessageComposer, FollowFriendMessageComposer, FriendListFragmentEvent, FriendListUpdateComposer, FriendListUpdateEvent, FriendParser, FriendRequestsEvent, GetFriendRequestsComposer, GetSessionDataManager, MessengerInitComposer, MessengerInitEvent, NewFriendRequestEvent, RequestFriendComposer, SetRelationshipStatusComposer } from '@nitrots/nitro-renderer'; import { useEffect, useMemo, useState } from 'react'; import { useBetween } from 'use-between'; -import { CloneObject, GetSessionDataManager, LocalizeText, MessengerFriend, MessengerRequest, MessengerSettings, SendMessageComposer } from '../../api'; +import { CloneObject, MessengerFriend, MessengerRequest, MessengerSettings, SendMessageComposer } from '../../api'; import { useMessageEvent } from '../events'; -import { useNotification } from '../notification'; const useFriendsState = () => { @@ -12,20 +11,12 @@ const useFriendsState = () => const [ sentRequests, setSentRequests ] = useState([]); const [ dismissedRequestIds, setDismissedRequestIds ] = useState([]); const [ settings, setSettings ] = useState(null); - const { simpleAlert } = useNotification(); 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; - }); + onlineFriends.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())); return onlineFriends; }, [ friends ]); @@ -34,14 +25,7 @@ const useFriendsState = () => { 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; - }); + offlineFriends.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())); return offlineFriends; }, [ friends ]); @@ -58,12 +42,12 @@ const useFriendsState = () => } 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; @@ -71,7 +55,7 @@ const useFriendsState = () => if(sentRequests.indexOf(userId) >= 0) return false; return true; - } + }; const requestFriend = (userId: number, userName: string) => { @@ -87,7 +71,7 @@ const useFriendsState = () => }); SendMessageComposer(new RequestFriendComposer(userName)); - } + }; const requestResponse = (requestId: number, flag: boolean) => { @@ -120,7 +104,7 @@ const useFriendsState = () => return newRequests; }); } - } + }; useMessageEvent(MessengerInitEvent, event => { @@ -180,7 +164,7 @@ const useFriendsState = () => { newValue[index].populate(friend); } - } + }; for(const friend of parser.addedFriends) processUpdate(friend); @@ -196,7 +180,7 @@ const useFriendsState = () => return newValue; }); }); - + useMessageEvent(FriendRequestsEvent, event => { const parser = event.getParser(); @@ -209,7 +193,7 @@ const useFriendsState = () => { const index = newValue.findIndex(existing => (existing.requesterUserId === request.requesterUserId)); - if(index >= 0) + if(index > 0) { newValue[index] = CloneObject(newValue[index]); newValue[index].populate(request); @@ -250,28 +234,19 @@ const useFriendsState = () => }); }); - useMessageEvent(FindFriendsProcessResultEvent, event => - { - const parser = event.getParser(); - - if (!parser) return; - - simpleAlert(LocalizeText(!parser.success ? 'friendbar.find.error.text' : 'friendbar.find.success.text'), '', '', '', LocalizeText(!parser.success ? 'friendbar.find.error.title' : 'friendbar.find.success.title')); - }); - useEffect(() => { SendMessageComposer(new MessengerInitComposer()); - const interval = window.setInterval(() => SendMessageComposer(new FriendListUpdateComposer()), 120000); + 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); \ No newline at end of file +export const useFriends = () => useBetween(useFriendsState); diff --git a/src/hooks/friends/useMessenger.ts b/src/hooks/friends/useMessenger.ts index a48b6cf..b289867 100644 --- a/src/hooks/friends/useMessenger.ts +++ b/src/hooks/friends/useMessenger.ts @@ -1,45 +1,45 @@ -import { NewConsoleMessageEvent, RoomInviteErrorEvent, RoomInviteEvent, SendMessageComposer as SendMessageComposerPacket } from '@nitrots/nitro-renderer'; +import { GetSessionDataManager, 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 { CloneObject, 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 [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 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) + if (!thread) { const friend = getFriend(userId); - if(!friend) return null; - + 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 ]; - + const newValue = [...prevValue]; + newValue.push(thread); - + return newValue; }); } @@ -47,75 +47,75 @@ const useMessengerState = () => { const hiddenIndex = hiddenThreadIds.indexOf(thread.threadId); - if(hiddenIndex >= 0) + if (hiddenIndex >= 0) { setHiddenThreadIds(prevValue => { - const newValue = [ ...prevValue ]; - + const newValue = [...prevValue]; + newValue.splice(hiddenIndex, 1); - + return newValue; - }) + }); } } return thread; - } + }; const closeThread = (threadId: number) => { setHiddenThreadIds(prevValue => { - const newValue = [ ...prevValue ]; + const newValue = [...prevValue]; - if(newValue.indexOf(threadId) >= 0) return prevValue; + if (newValue.indexOf(threadId) >= 0) return prevValue; newValue.push(threadId); return newValue; }); - if(activeThreadId === threadId) setActiveThreadId(-1); - } + 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; + if (!thread || !messageText || !messageText.length) return; const ownMessage = (senderId === GetSessionDataManager().userId); - if(ownMessage && (messageText.length <= 255)) SendMessageComposer(new SendMessageComposerPacket(thread.participant.id, messageText)); + if (ownMessage && (messageText.length <= 255)) SendMessageComposer(new SendMessageComposerPacket(thread.participant.id, messageText)); setMessageThreads(prevValue => { - const newValue = [ ...prevValue ]; + const newValue = [...prevValue]; const index = newValue.findIndex(newThread => (newThread.threadId === thread.threadId)); - if(index === -1) return prevValue; + if (index === -1) return prevValue; thread = CloneObject(newValue[index]); - if(ownMessage && (thread.groups.length === 1)) PlaySound(SoundNames.MESSENGER_NEW_THREAD); + 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(); + if (activeThreadId === thread.threadId) thread.setRead(); newValue[index] = thread; - if(!ownMessage && thread.unread) PlaySound(SoundNames.MESSENGER_MESSAGE_RECEIVED); + 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; + if (!thread) return; sendMessage(thread, parser.senderId, parser.messageText, parser.secondsSinceSent, parser.extraData); }); @@ -125,7 +125,7 @@ const useMessengerState = () => const parser = event.getParser(); const thread = getMessageThread(parser.senderId); - if(!thread) return; + if (!thread) return; sendMessage(thread, parser.senderId, parser.messageText, 0, null, MessengerThreadChat.ROOM_INVITE); }); @@ -133,20 +133,20 @@ const useMessengerState = () => 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')); + + simpleAlert(`Received room invite error: ${parser.errorCode},recipients: ${parser.failedRecipients.join(',')}`, NotificationAlertType.DEFAULT, null, null, LocalizeText('friendlist.alert.title')); }); useEffect(() => { - if(activeThreadId <= 0) return; + if (activeThreadId <= 0) return; setMessageThreads(prevValue => { - const newValue = [ ...prevValue ]; + const newValue = [...prevValue]; const index = newValue.findIndex(newThread => (newThread.threadId === activeThreadId)); - if(index >= 0) + if (index >= 0) { newValue[index] = CloneObject(newValue[index]); @@ -155,19 +155,19 @@ const useMessengerState = () => return newValue; }); - }, [ activeThreadId ]); + }, [activeThreadId]); useEffect(() => { setIconState(prevValue => { - if(!visibleThreads.length) return MessengerIconState.HIDDEN; + if (!visibleThreads.length) return MessengerIconState.HIDDEN; let isUnread = false; - for(const thread of visibleThreads) + for (const thread of visibleThreads) { - if(thread.unreadCount > 0) + if (thread.unreadCount > 0) { isUnread = true; @@ -175,13 +175,13 @@ const useMessengerState = () => } } - if(isUnread) return MessengerIconState.UNREAD; + if (isUnread) return MessengerIconState.UNREAD; return MessengerIconState.SHOW; }); - }, [ visibleThreads ]); + }, [visibleThreads]); return { messageThreads, activeThread, iconState, visibleThreads, getMessageThread, setActiveThreadId, closeThread, sendMessage }; -} +}; export const useMessenger = () => useBetween(useMessengerState); diff --git a/src/hooks/game-center/useGameCenter.ts b/src/hooks/game-center/useGameCenter.ts index 0b9dbcb..43db6f6 100644 --- a/src/hooks/game-center/useGameCenter.ts +++ b/src/hooks/game-center/useGameCenter.ts @@ -4,7 +4,7 @@ import { useBetween } from 'use-between'; import { SendMessageComposer, VisitDesktop } from '../../api'; import { useMessageEvent } from '../events'; -const useGameCenterState = () => +const useGameCenterState = () => { const [ isVisible, setIsVisible ] = useState(false); const [ games, setGames ] = useState(null); @@ -13,7 +13,7 @@ const useGameCenterState = () => const [ gameOffline, setGameOffline ] = useState(false); const [ gameURL, setGameURL ] = useState(null); - useMessageEvent(GameListMessageEvent, event => + useMessageEvent(GameListMessageEvent, event => { let parser = event.getParser(); @@ -24,7 +24,7 @@ const useGameCenterState = () => setGames(parser.games); }); - useMessageEvent(Game2AccountGameStatusMessageEvent, event => + useMessageEvent(Game2AccountGameStatusMessageEvent, event => { let parser = event.getParser(); @@ -33,25 +33,25 @@ const useGameCenterState = () => setAccountStatus(parser); }); - useMessageEvent(GameStatusMessageEvent, event => + useMessageEvent(GameStatusMessageEvent, event => { let parser = event.getParser(); if(!parser) return; setGameOffline(parser.isInMaintenance); - }) + }); - useMessageEvent(LoadGameUrlEvent, event => + useMessageEvent(LoadGameUrlEvent, event => { let parser = event.getParser(); if(!parser) return; - switch(parser.gameTypeId) + switch(parser.gameTypeId) { case 2: - return console.log('snowwar') + return console.log('snowwar'); default: return setGameURL(parser.url); } @@ -59,12 +59,12 @@ const useGameCenterState = () => useEffect(()=> { - if(isVisible) + if(isVisible) { SendMessageComposer(new GetGameListMessageComposer()); VisitDesktop(); } - else + else { // dispose or wtv } @@ -77,7 +77,7 @@ const useGameCenterState = () => selectedGame, setSelectedGame, gameOffline, gameURL, setGameURL - } -} + }; +}; export const useGameCenter = () => useBetween(useGameCenterState); diff --git a/src/hooks/groups/useGroup.ts b/src/hooks/groups/useGroup.ts index 7a9fd22..e365b99 100644 --- a/src/hooks/groups/useGroup.ts +++ b/src/hooks/groups/useGroup.ts @@ -33,7 +33,7 @@ const useGroupState = () => if(a.id > b.id) return 1; return 0; - } + }; customize.badgeBases.sort(CompareId); customize.badgeSymbols.sort(CompareId); @@ -50,6 +50,6 @@ const useGroupState = () => }, []); return { groupCustomize }; -} +}; export const useGroup = () => useBetween(useGroupState); diff --git a/src/hooks/help/useHelp.ts b/src/hooks/help/useHelp.ts index 1c74b62..a81858c 100644 --- a/src/hooks/help/useHelp.ts +++ b/src/hooks/help/useHelp.ts @@ -66,7 +66,7 @@ const useHelpState = () => } setActiveReport(newReport); - } + }; useMessageEvent(CallForHelpResultMessageEvent, event => { @@ -133,7 +133,7 @@ const useHelpState = () => { 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')) + 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 => @@ -144,6 +144,6 @@ const useHelpState = () => }); return { activeReport, setActiveReport, sanctionInfo, setSanctionInfo, report }; -} +}; export const useHelp = () => useBetween(useHelpState); diff --git a/src/hooks/index.ts b/src/hooks/index.ts index bec20d5..955e919 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1,10 +1,9 @@ export * from './achievements'; +export * from './avatar-editor'; export * from './camera'; export * from './catalog'; export * from './chat-history'; export * from './events'; -export * from './events/core'; -export * from './events/nitro'; export * from './friends'; export * from './game-center'; export * from './groups'; @@ -15,9 +14,11 @@ export * from './navigator'; export * from './notification'; export * from './purse'; export * from './rooms'; +export * from './rooms/engine'; +export * from './rooms/promotes'; +export * from './rooms/widgets'; +export * from './rooms/widgets/furniture'; export * from './session'; export * from './useLocalStorage'; -export * from './UseMountEffect'; -export * from './useOnClickChat'; export * from './useSharedVisibility'; export * from './wired'; diff --git a/src/hooks/inventory/useInventoryBadges.ts b/src/hooks/inventory/useInventoryBadges.ts index 000e4e3..8191d13 100644 --- a/src/hooks/inventory/useInventoryBadges.ts +++ b/src/hooks/inventory/useInventoryBadges.ts @@ -1,7 +1,7 @@ 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 { GetConfigurationValue, SendMessageComposer, UnseenItemCategory } from '../../api'; import { useMessageEvent } from '../events'; import { useSharedVisibility } from '../useSharedVisibility'; import { useInventoryUnseenTracker } from './useInventoryUnseenTracker'; @@ -16,7 +16,7 @@ const useInventoryBadgesState = () => const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); - const maxBadgeCount = GetConfiguration('user.badges.max.slots', 5); + const maxBadgeCount = GetConfigurationValue('user.badges.max.slots', 5); const isWearingBadge = (badgeCode: string) => (activeBadgeCodes.indexOf(badgeCode) >= 0); const canWearBadges = () => (activeBadgeCodes.length < maxBadgeCount); @@ -47,7 +47,7 @@ const useInventoryBadgesState = () => return newValue; }); - } + }; const getBadgeId = (badgeCode: string) => { @@ -56,7 +56,7 @@ const useInventoryBadgesState = () => if(index === -1) return 0; return (badgeIds.get(badgeCode) ?? 0); - } + }; useMessageEvent(BadgesEvent, event => { @@ -78,7 +78,7 @@ const useInventoryBadgesState = () => badgesToAdd.push(code); }); - + return newValue; }); @@ -95,7 +95,7 @@ const useInventoryBadgesState = () => { const newValue = [ ...prevValue ]; - if(unseen) newValue.unshift(parser.badgeCode) + if(unseen) newValue.unshift(parser.badgeCode); else newValue.push(parser.badgeCode); return newValue; @@ -134,7 +134,7 @@ const useInventoryBadgesState = () => return () => { resetCategory(UnseenItemCategory.BADGE); - } + }; }, [ isVisible, resetCategory ]); useEffect(() => @@ -147,6 +147,6 @@ const useInventoryBadgesState = () => }, [ 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 index aba5d39..ac97b71 100644 --- a/src/hooks/inventory/useInventoryBots.ts +++ b/src/hooks/inventory/useInventoryBots.ts @@ -1,7 +1,7 @@ -import { BotAddedToInventoryEvent, BotData, BotInventoryMessageEvent, BotRemovedFromInventoryEvent, GetBotInventoryComposer } from '@nitrots/nitro-renderer'; +import { BotAddedToInventoryEvent, BotData, BotInventoryMessageEvent, BotRemovedFromInventoryEvent, CreateLinkEvent, 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 { IBotItem, SendMessageComposer, UnseenItemCategory, cancelRoomObjectPlacement, getPlacingItemId } from '../../api'; import { useMessageEvent } from '../events'; import { useSharedVisibility } from '../useSharedVisibility'; import { useInventoryUnseenTracker } from './useInventoryUnseenTracker'; @@ -140,7 +140,7 @@ const useInventoryBotsState = () => return () => { resetCategory(UnseenItemCategory.BOT); - } + }; }, [ isVisible, resetCategory ]); useEffect(() => @@ -153,6 +153,6 @@ const useInventoryBotsState = () => }, [ 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 index d57bd8d..7dd16ad 100644 --- a/src/hooks/inventory/useInventoryFurni.ts +++ b/src/hooks/inventory/useInventoryFurni.ts @@ -1,7 +1,7 @@ -import { FurnitureListAddOrUpdateEvent, FurnitureListComposer, FurnitureListEvent, FurnitureListInvalidateEvent, FurnitureListItemParser, FurnitureListRemovedEvent, FurniturePostItPlacedEvent } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent, 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 { CloneObject, DispatchUiEvent, FurnitureItem, GroupItem, SendMessageComposer, UnseenItemCategory, addFurnitureItem, attemptItemPlacement, cancelRoomObjectPlacement, getAllItemIds, getPlacingItemId, mergeFurniFragments } from '../../api'; import { InventoryFurniAddedEvent } from '../../events'; import { useMessageEvent } from '../events'; import { useSharedVisibility } from '../useSharedVisibility'; @@ -22,7 +22,7 @@ const useInventoryFurniState = () => if(!groupItems || !groupItems.length) return; return groupItems.filter((i) => i.type === type); - } + }; const getWallItemById = (id: number) => { @@ -36,7 +36,7 @@ const useInventoryFurniState = () => } return null; - } + }; const getFloorItemById = (id: number) => { @@ -50,7 +50,7 @@ const useInventoryFurniState = () => } return null; - } + }; useMessageEvent(FurnitureListAddOrUpdateEvent, event => { @@ -90,7 +90,7 @@ const useInventoryFurniState = () => break; } - j++ + j++; } if(groupItem) break; @@ -121,7 +121,7 @@ const useInventoryFurniState = () => useMessageEvent(FurnitureListEvent, event => { const parser = event.getParser(); - + if(!furniMsgFragments) furniMsgFragments = new Array(parser.totalFragments); const fragment = mergeFurniFragments(parser.fragment, parser.totalFragments, parser.fragmentNumber, furniMsgFragments); @@ -150,7 +150,7 @@ const useInventoryFurniState = () => continue; } - + if(getPlacingItemId() === item.ref) { cancelRoomObjectPlacement(); @@ -220,7 +220,7 @@ const useInventoryFurniState = () => continue; } - + if(getPlacingItemId() === item.ref) { cancelRoomObjectPlacement(); @@ -274,13 +274,13 @@ const useInventoryFurniState = () => setGroupItems(prevValue => { const newValue = [ ...prevValue ]; - + for(const newGroup of newValue) newGroup.hasUnseenItems = false; - + return newValue; }); } - } + }; }, [ isVisible, resetCategory ]); useEffect(() => @@ -293,6 +293,6 @@ const useInventoryFurniState = () => }, [ isVisible, needsUpdate ]); return { isVisible, groupItems, setGroupItems, selectedItem, setSelectedItem, activate, deactivate, getWallItemById, getFloorItemById, getItemsByType }; -} +}; export const useInventoryFurni = () => useBetween(useInventoryFurniState); diff --git a/src/hooks/inventory/useInventoryPets.ts b/src/hooks/inventory/useInventoryPets.ts index d95e8bf..16292e0 100644 --- a/src/hooks/inventory/useInventoryPets.ts +++ b/src/hooks/inventory/useInventoryPets.ts @@ -89,7 +89,7 @@ const useInventoryPetsState = () => return () => { resetCategory(UnseenItemCategory.PET); - } + }; }, [ isVisible, resetCategory ]); useEffect(() => @@ -102,6 +102,6 @@ const useInventoryPetsState = () => }, [ 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 index 7eb7481..9156482 100644 --- a/src/hooks/inventory/useInventoryTrade.ts +++ b/src/hooks/inventory/useInventoryTrade.ts @@ -1,7 +1,7 @@ -import { AdvancedMap, TradingAcceptComposer, TradingAcceptEvent, TradingCancelComposer, TradingCloseComposer, TradingCloseEvent, TradingCloseParser, TradingCompletedEvent, TradingConfirmationComposer, TradingConfirmationEvent, TradingListItemEvent, TradingListItemRemoveComposer, TradingNotOpenEvent, TradingOpenEvent, TradingOpenFailedEvent, TradingOtherNotAllowedEvent, TradingUnacceptComposer, TradingYouAreNotAllowedEvent } from '@nitrots/nitro-renderer'; +import { AdvancedMap, GetSessionDataManager, 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 { CloneObject, GetRoomSession, GroupItem, LocalizeText, SendMessageComposer, TradeState, TradeUserData, TradingNotificationType, parseTradeItems } from '../../api'; import { useMessageEvent } from '../events'; import { useNotification } from '../notification'; import { useInventoryFurni } from './useInventoryFurni'; @@ -40,7 +40,7 @@ const useInventoryTradeState = () => setTradeState(TradeState.TRADING_STATE_CONFIRMED); return; } - } + }; const removeItem = (group: GroupItem) => { @@ -49,7 +49,7 @@ const useInventoryTradeState = () => if(!item) return; SendMessageComposer(new TradingListItemRemoveComposer(item.id)); - } + }; const stopTrading = () => { @@ -64,7 +64,7 @@ const useInventoryTradeState = () => SendMessageComposer(new TradingCancelComposer()); return; } - } + }; useMessageEvent(TradingAcceptEvent, event => { @@ -217,7 +217,7 @@ const useInventoryTradeState = () => const firstUser = new TradeUserData(); const firstUserData = GetRoomSession().userDataManager.getUserData(parser.userID); - + firstUser.userItems = new AdvancedMap(); const secondUser = new TradeUserData(); @@ -246,7 +246,7 @@ const useInventoryTradeState = () => secondUser.userName = firstUserData.name; secondUser.canTrade = parser.userCanTrade; } - + setOwnUser(firstUser); setOtherUser(secondUser); setTradeState(TradeState.TRADING_STATE_RUNNING); @@ -265,7 +265,7 @@ const useInventoryTradeState = () => showTradeAlert(TradingNotificationType.THEY_NOT_ALLOWED); }); - + useMessageEvent(TradingYouAreNotAllowedEvent, event => { const parser = event.getParser(); @@ -283,6 +283,6 @@ const useInventoryTradeState = () => }, [ 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 index 90ba66e..9a22fb0 100644 --- a/src/hooks/inventory/useInventoryUnseenTracker.ts +++ b/src/hooks/inventory/useInventoryUnseenTracker.ts @@ -127,6 +127,6 @@ const useInventoryUnseenTrackerState = () => }); return { getCount, getFullCount, resetCategory, resetItems, isUnseen, removeUnseen }; -} +}; export const useInventoryUnseenTracker = () => useBetween(useInventoryUnseenTrackerState); diff --git a/src/hooks/mod-tools/useModTools.ts b/src/hooks/mod-tools/useModTools.ts index 93628f1..be1013a 100644 --- a/src/hooks/mod-tools/useModTools.ts +++ b/src/hooks/mod-tools/useModTools.ts @@ -21,7 +21,7 @@ const useModToolsState = () => if(openRooms.indexOf(roomId) >= 0) return; setOpenRooms(prevValue => [ ...prevValue, roomId ]); - } + }; const closeRoomInfo = (roomId: number) => { @@ -34,20 +34,20 @@ const useModToolsState = () => 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) => { @@ -60,20 +60,20 @@ const useModToolsState = () => 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) => { @@ -86,20 +86,20 @@ const useModToolsState = () => 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) => { @@ -112,13 +112,13 @@ const useModToolsState = () => return newValue; }); - } + }; const toggleUserChatlog = (userId: number) => { if(openRoomChatlogs.indexOf(userId) >= 0) closeUserChatlog(userId); else openUserChatlog(userId); - } + }; useMessageEvent(ModeratorInitMessageEvent, event => { @@ -126,7 +126,7 @@ const useModToolsState = () => const data = parser.data; setSettings(data); - setTickets(data.issues); + setTickets(data.issues); }); useMessageEvent(IssueInfoMessageEvent, event => @@ -161,7 +161,7 @@ const useModToolsState = () => if(!parser) return; - simpleAlert('Failed to pick issue', NotificationAlertType.DEFAULT, null, null, 'Error') + simpleAlert('Failed to pick issue', NotificationAlertType.DEFAULT, null, null, 'Error'); }); useMessageEvent(IssueDeletedMessageEvent, event => @@ -197,11 +197,11 @@ const useModToolsState = () => 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/useNavigator.ts b/src/hooks/navigator/useNavigator.ts index b27435e..60f949e 100644 --- a/src/hooks/navigator/useNavigator.ts +++ b/src/hooks/navigator/useNavigator.ts @@ -1,330 +1,442 @@ -import { CanCreateRoomEventEvent, CantConnectMessageParser, DoorbellMessageEvent, FlatAccessDeniedMessageEvent, FlatCreatedEvent, FollowFriendMessageComposer, GenericErrorEvent, GetGuestRoomMessageComposer, GetGuestRoomResultEvent, GetUserEventCatsMessageComposer, GetUserFlatCatsMessageComposer, HabboWebTools, LegacyExternalInterface, NavigatorCategoryDataParser, NavigatorEventCategoryDataParser, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSavedSearch, NavigatorSearchEvent, NavigatorSearchResultSet, NavigatorSearchesEvent, 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"; +import { CanCreateRoomEventEvent, CantConnectMessageParser, CreateLinkEvent, DoorbellMessageEvent, FlatAccessDeniedMessageEvent, FlatCreatedEvent, FollowFriendMessageComposer, GenericErrorEvent, GetGuestRoomMessageComposer, GetGuestRoomResultEvent, GetSessionDataManager, 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 { CreateRoomSession, DoorStateType, GetConfigurationValue, 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 [searchResultQuery, setSearchResultQuery] = useState(""); - const [navigatorSearches, setNavigatorSearches] = 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 create - 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); - setSearchResultQuery(parser.result.data); - }); - - 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")); - - useMessageEvent(NavigatorSearchesEvent, (event) => { - const parser = event.getParser(); - if (!parser) return; - setNavigatorSearches(parser.searches); - }); - - return { categories, doorData, setDoorData, topLevelContext, topLevelContexts, searchResult, navigatorData, navigatorSearches, searchResultQuery }; - }; +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(GetConfigurationValue('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((GetConfigurationValue('friend.id') !== undefined) && (parseInt(GetConfigurationValue('friend.id')) > 0)) + { + forwardType = 0; + SendMessageComposer(new FollowFriendMessageComposer(parseInt(GetConfigurationValue('friend.id')))); + } + + if((GetConfigurationValue('forward.type') !== undefined) && (GetConfigurationValue('forward.id') !== undefined)) + { + forwardType = parseInt(GetConfigurationValue('forward.type')); + forwardId = parseInt(GetConfigurationValue('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/useNotification.ts b/src/hooks/notification/useNotification.ts index 0089b86..4cd3f68 100644 --- a/src/hooks/notification/useNotification.ts +++ b/src/hooks/notification/useNotification.ts @@ -1,7 +1,7 @@ -import { AchievementNotificationMessageEvent, ActivityPointNotificationMessageEvent, ClubGiftNotificationEvent, ClubGiftSelectedEvent, ConnectionErrorEvent, HabboBroadcastMessageEvent, HotelClosedAndOpensEvent, HotelClosesAndWillOpenAtEvent, HotelWillCloseInMinutesEvent, InfoFeedEnableMessageEvent, MaintenanceStatusMessageEvent, ModeratorCautionEvent, ModeratorMessageEvent, MOTDNotificationEvent, NotificationDialogMessageEvent, PetLevelNotificationEvent, PetReceivedMessageEvent, RespectReceivedEvent, RoomEnterEffect, RoomEnterEvent, SimpleAlertMessageEvent, UserBannedMessageEvent, Vector3d } from '@nitrots/nitro-renderer'; +import { AchievementNotificationMessageEvent, ActivityPointNotificationMessageEvent, ClubGiftNotificationEvent, ClubGiftSelectedEvent, ConnectionErrorEvent, GetLocalizationManager, GetRoomEngine, GetSessionDataManager, HabboBroadcastMessageEvent, HotelClosedAndOpensEvent, HotelClosesAndWillOpenAtEvent, HotelWillCloseInMinutesEvent, InfoFeedEnableMessageEvent, MaintenanceStatusMessageEvent, ModeratorCautionEvent, ModeratorMessageEvent, MOTDNotificationEvent, NotificationDialogMessageEvent, PetLevelNotificationEvent, PetReceivedMessageEvent, RespectReceivedEvent, RoomEnterEffect, RoomEnterEvent, SimpleAlertMessageEvent, 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 { GetConfigurationValue, 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') : ''; @@ -11,7 +11,7 @@ const getTimeZeroPadded = (time: number) => const text = ('0' + time); return text.substr((text.length - 2), text.length); -} +}; let modDisclaimerTimeout: ReturnType = null; @@ -23,7 +23,7 @@ const useNotificationState = () => 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 getMainNotificationConfig = () => GetConfigurationValue<{ [key: string]: { delivery?: string, display?: string; title?: string; image?: string }}>('notification', {}); const getNotificationConfig = (key: string) => { @@ -32,7 +32,7 @@ const useNotificationState = () => if(!mainConfig) return null; return mainConfig[key]; - } + }; const getNotificationPart = (options: Map, type: string, key: string, localize: boolean) => { @@ -40,19 +40,19 @@ const useNotificationState = () => const localizeKey = [ 'notification', type, key ].join('.'); - if(GetNitroInstance().localization.hasValue(localizeKey) || localize) return LocalizeText(localizeKey, Array.from(options.keys()), Array.from(options.values())); + if(GetLocalizationManager().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, '_')); + if(!imageUrl) imageUrl = GetConfigurationValue('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) => { @@ -84,7 +84,7 @@ const useNotificationState = () => if(configuration) for(const key in configuration) options.set(key, configuration[key]); - if (type === 'floorplan_editor.error') options.set('message', options.get('message').replace(/[^a-zA-Z._ ]/g, '')); + if(type === 'floorplan_editor.error') options.set('message', options.get('message').replace(/[^a-zA-Z._ ]/g, '')); const title = getNotificationPart(options, type, 'title', true); const message = getNotificationPart(options, type, 'message', true).replace(/\\r/g, '\r'); @@ -102,7 +102,7 @@ const useNotificationState = () => } 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) => { @@ -120,7 +120,7 @@ const useNotificationState = () => 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 = '') => { @@ -169,7 +169,7 @@ const useNotificationState = () => if(index >= 0) newAlerts.splice(index, 1); return newAlerts; - }) + }); }, []); const closeConfirm = useCallback((item: NotificationConfirmItem) => @@ -182,7 +182,7 @@ const useNotificationState = () => if(index >= 0) newConfirms.splice(index, 1); return newConfirms; - }) + }); }, []); useMessageEvent(RespectReceivedEvent, event => @@ -223,7 +223,7 @@ const useNotificationState = () => if(parser.numGifts <= 0) return; - showSingleBubble(parser.numGifts.toString(), NotificationBubbleType.CLUBGIFT, null, ('catalog/open/' + GetConfiguration('catalog.links')['hc.hc_gifts'])); + showSingleBubble(parser.numGifts.toString(), NotificationBubbleType.CLUBGIFT, null, ('catalog/open/' + GetConfigurationValue('catalog.links')['hc.hc_gifts'])); }); useMessageEvent(ModeratorMessageEvent, event => @@ -239,7 +239,7 @@ const useNotificationState = () => if((parser.amountChanged <= 0) || (parser.type !== 5)) return; - const imageUrl = GetConfiguration('currency.asset.icon.url', '').replace('%type%', parser.type.toString()); + const imageUrl = GetConfigurationValue('currency.asset.icon.url', '').replace('%type%', parser.type.toString()); showSingleBubble(LocalizeText('notifications.text.loyalty.received', [ 'AMOUNT' ], [ parser.amountChanged.toString() ]), NotificationBubbleType.INFO, imageUrl); }); @@ -258,7 +258,7 @@ const useNotificationState = () => 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 => + useMessageEvent(PetReceivedMessageEvent, async event => { const parser = event.getParser(); @@ -268,7 +268,7 @@ const useNotificationState = () => 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; + if(imageResult) imageUrl = (await imageResult.getImage())?.src; showSingleBubble(text, NotificationBubbleType.PETLEVEL, imageUrl); }); @@ -284,7 +284,7 @@ const useNotificationState = () => setAlerts(prevValue => [ alertItem, ...prevValue ]); }); - useMessageEvent(PetLevelNotificationEvent, event => + useMessageEvent(PetLevelNotificationEvent, async event => { const parser = event.getParser(); @@ -292,7 +292,7 @@ const useNotificationState = () => 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; + if(imageResult) imageUrl = (await imageResult.getImage())?.src; showSingleBubble(LocalizeText('notifications.text.petlevel', [ 'pet_name', 'level' ], [ parser.petName, parser.level.toString() ]), NotificationBubbleType.PETLEVEL, imageUrl); }); @@ -381,7 +381,8 @@ const useNotificationState = () => case 1017: case 1018: case 1019: - event.connection.dispose(); + // TODO: fix dispose + //event.connection.dispose(); break; case 4013: simpleAlert(LocalizeText('connection.room.maintenance.desc'), NotificationAlertType.ALERT, null, null, LocalizeText('connection.room.maintenance.title')); @@ -427,6 +428,6 @@ const useNotificationState = () => useMessageEvent(RoomEnterEvent, onRoomEnterEvent); return { alerts, bubbleAlerts, confirms, simpleAlert, showNitroAlert, showTradeAlert, showConfirm, showSingleBubble, closeAlert, closeBubbleAlert, closeConfirm }; -} +}; export const useNotification = () => useBetween(useNotificationState); diff --git a/src/hooks/purse/usePurse.ts b/src/hooks/purse/usePurse.ts index 6bb5a54..f02e541 100644 --- a/src/hooks/purse/usePurse.ts +++ b/src/hooks/purse/usePurse.ts @@ -1,13 +1,13 @@ 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 { CloneObject, ClubStatus, GetConfigurationValue, 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 hcDisabled = useMemo(() => GetConfigurationValue('hc.disabled', false), []); const clubStatus = useMemo(() => { @@ -21,16 +21,16 @@ const usePurseState = () => 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 => { @@ -74,7 +74,7 @@ const usePurseState = () => newValue.activityPoints.set(parser.type, parser.amount); - if(parser.type === 0) PlaySound(SoundNames.DUCKETS) + if(parser.type === 0) PlaySound(SoundNames.DUCKETS); return newValue; }); @@ -121,6 +121,6 @@ const usePurseState = () => }, []); return { purse, hcDisabled, clubStatus, getCurrencyAmount }; -} +}; export const usePurse = () => useBetween(usePurseState); diff --git a/src/hooks/rooms/engine/useFurniAddedEvent.ts b/src/hooks/rooms/engine/useFurniAddedEvent.ts index f5422c6..ae01dde 100644 --- a/src/hooks/rooms/engine/useFurniAddedEvent.ts +++ b/src/hooks/rooms/engine/useFurniAddedEvent.ts @@ -14,6 +14,6 @@ export const useFurniAddedEvent = (isActive: boolean, handler: (event: RoomWidge 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 index ddd1be2..dccf12c 100644 --- a/src/hooks/rooms/engine/useFurniRemovedEvent.ts +++ b/src/hooks/rooms/engine/useFurniRemovedEvent.ts @@ -14,6 +14,6 @@ export const useFurniRemovedEvent = (isActive: boolean, handler: (event: RoomWid 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 index ba54981..f66d81a 100644 --- a/src/hooks/rooms/engine/useObjectDeselectedEvent.ts +++ b/src/hooks/rooms/engine/useObjectDeselectedEvent.ts @@ -4,4 +4,4 @@ import { useUiEvent } from '../../events'; export const useObjectDeselectedEvent = (handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => { useUiEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED, handler); -} +}; diff --git a/src/hooks/rooms/engine/useObjectDoubleClickedEvent.ts b/src/hooks/rooms/engine/useObjectDoubleClickedEvent.ts index 66e3673..9aeed92 100644 --- a/src/hooks/rooms/engine/useObjectDoubleClickedEvent.ts +++ b/src/hooks/rooms/engine/useObjectDoubleClickedEvent.ts @@ -4,4 +4,4 @@ import { useUiEvent } from '../../events'; export const useObjectDoubleClickedEvent = (handler: (event: RoomWidgetUpdateRoomObjectEvent) => void) => { useUiEvent(RoomWidgetUpdateRoomObjectEvent.OBJECT_DOUBLE_CLICKED, handler); -} +}; diff --git a/src/hooks/rooms/engine/useObjectRollOutEvent.ts b/src/hooks/rooms/engine/useObjectRollOutEvent.ts index 433ca91..216d309 100644 --- a/src/hooks/rooms/engine/useObjectRollOutEvent.ts +++ b/src/hooks/rooms/engine/useObjectRollOutEvent.ts @@ -4,4 +4,4 @@ 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 index 2774ef2..7af472a 100644 --- a/src/hooks/rooms/engine/useObjectRollOverEvent.ts +++ b/src/hooks/rooms/engine/useObjectRollOverEvent.ts @@ -4,4 +4,4 @@ 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 index 38db66f..0da7aeb 100644 --- a/src/hooks/rooms/engine/useObjectSelectedEvent.ts +++ b/src/hooks/rooms/engine/useObjectSelectedEvent.ts @@ -4,4 +4,4 @@ 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 index d3c761b..d02eee8 100644 --- a/src/hooks/rooms/engine/useUserAddedEvent.ts +++ b/src/hooks/rooms/engine/useUserAddedEvent.ts @@ -14,6 +14,6 @@ export const useUserAddedEvent = (isActive: boolean, handler: (event: RoomWidget 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 index 2820241..9c86b98 100644 --- a/src/hooks/rooms/engine/useUserRemovedEvent.ts +++ b/src/hooks/rooms/engine/useUserRemovedEvent.ts @@ -14,6 +14,6 @@ export const useUserRemovedEvent = (isActive: boolean, handler: (event: RoomWidg return () => { UI_EVENT_DISPATCHER.removeEventListener(RoomWidgetUpdateRoomObjectEvent.USER_REMOVED, onRoomWidgetUpdateRoomObjectEvent); - } + }; }, [ isActive, handler ]); -} +}; diff --git a/src/hooks/rooms/promotes/useRoomPromote.ts b/src/hooks/rooms/promotes/useRoomPromote.ts index e534d18..5d546d9 100644 --- a/src/hooks/rooms/promotes/useRoomPromote.ts +++ b/src/hooks/rooms/promotes/useRoomPromote.ts @@ -12,12 +12,12 @@ const useRoomPromoteState = () => { const parser = event.getParser(); - if (!parser) return; + if(!parser) return; setPromoteInformation(parser); }); return { promoteInformation, isExtended, setPromoteInformation, setIsExtended }; -} +}; export const useRoomPromote = () => useBetween(useRoomPromoteState); diff --git a/src/hooks/rooms/useRoom.ts b/src/hooks/rooms/useRoom.ts index af1c12a..540f2aa 100644 --- a/src/hooks/rooms/useRoom.ts +++ b/src/hooks/rooms/useRoom.ts @@ -1,14 +1,14 @@ -import { AdjustmentFilter, ColorConverter, IRoomSession, NitroContainer, NitroSprite, NitroTexture, RoomBackgroundColorEvent, RoomEngineEvent, RoomEngineObjectEvent, RoomGeometry, RoomId, RoomObjectCategory, RoomObjectHSLColorEnabledEvent, RoomObjectOperationType, RoomSessionEvent, RoomVariableEnum, Vector3d } from '@nitrots/nitro-renderer'; +import { ColorConverter, GetRenderer, GetRoomEngine, GetStage, IRoomSession, NitroAdjustmentFilter, 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'; +import { CanManipulateFurniture, DispatchUiEvent, GetRoomSession, InitializeRoomInstanceRenderingCanvas, IsFurnitureSelectionDisabled, ProcessRoomObjectOperation, RoomWidgetUpdateBackgroundColorPreviewEvent, RoomWidgetUpdateRoomObjectEvent, SetActiveRoomId, StartRoomSession } from '../../api'; +import { useNitroEvent, useUiEvent } from '../events'; const useRoomState = () => { const [ roomSession, setRoomSession ] = useState(null); const [ roomBackground, setRoomBackground ] = useState(null); - const [ roomFilter, setRoomFilter ] = useState(null); + const [ roomFilter, setRoomFilter ] = useState(null); const [ originalRoomBackgroundColor, setOriginalRoomBackgroundColor ] = useState(0); const updateRoomBackgroundColor = (hue: number, saturation: number, lightness: number, original: boolean = false) => @@ -27,7 +27,7 @@ const useRoomState = () => { roomBackground.tint = newColor; } - } + }; const updateRoomFilter = (color: number) => { @@ -40,7 +40,7 @@ const useRoomState = () => roomFilter.red = (r / 255); roomFilter.green = (g / 255); roomFilter.blue = (b / 255); - } + }; useUiEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.PREVIEW, event => updateRoomBackgroundColor(event.hue, event.saturation, event.lightness)); @@ -51,7 +51,7 @@ const useRoomState = () => roomBackground.tint = originalRoomBackgroundColor; }); - useRoomEngineEvent(RoomObjectHSLColorEnabledEvent.ROOM_BACKGROUND_COLOR, event => + useNitroEvent(RoomObjectHSLColorEnabledEvent.ROOM_BACKGROUND_COLOR, event => { if(RoomId.isRoomPreviewerId(event.roomId)) return; @@ -59,7 +59,7 @@ const useRoomState = () => else updateRoomBackgroundColor(0, 0, 0, true); }); - useRoomEngineEvent(RoomBackgroundColorEvent.ROOM_COLOR, event => + useNitroEvent(RoomBackgroundColorEvent.ROOM_COLOR, event => { if(RoomId.isRoomPreviewerId(event.roomId)) return; @@ -75,7 +75,7 @@ const useRoomState = () => updateRoomFilter(ColorConverter.hslToRGB(((ColorConverter.rgbToHSL(color) & 0xFFFF00) + brightness))); }); - useRoomEngineEvent([ + useNitroEvent([ RoomEngineEvent.INITIALIZED, RoomEngineEvent.DISPOSED ], event => @@ -98,7 +98,7 @@ const useRoomState = () => } }); - useRoomSessionManagerEvent([ + useNitroEvent([ RoomSessionEvent.CREATED, RoomSessionEvent.ENDED ], event => @@ -114,7 +114,7 @@ const useRoomState = () => } }); - useRoomEngineEvent([ + useNitroEvent([ RoomEngineObjectEvent.SELECTED, RoomEngineObjectEvent.DESELECTED, RoomEngineObjectEvent.ADDED, @@ -197,21 +197,14 @@ const useRoomState = () => { 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.application.renderer; + const renderer = GetRenderer(); - if(renderer) - { - renderer.view.style.width = `${ width }px`; - renderer.view.style.height = `${ height }px`; - renderer.resolution = window.devicePixelRatio; - renderer.resize(width, height); - } + if(renderer) renderer.resize(width, height, window.devicePixelRatio); const displayObject = roomEngine.getRoomInstanceDisplay(roomId, canvasId, width, height, RoomGeometry.SCALE_ZOOMED_IN); const canvas = GetRoomEngine().getRoomInstanceRenderingCanvas(roomId, canvasId); @@ -219,8 +212,8 @@ const useRoomState = () => if(!displayObject || !canvas) return; const background = new NitroSprite(NitroTexture.WHITE); - const filter = new AdjustmentFilter(); - const master = (canvas.master as NitroContainer); + const filter = new NitroAdjustmentFilter(); + const master = canvas.master; background.tint = 0; background.width = width; @@ -254,11 +247,7 @@ const useRoomState = () => geometry.location = new Vector3d(x, y, z); } - const stage = nitroInstance.application.stage; - - if(!stage) return; - - stage.addChild(displayObject); + GetStage().addChild(displayObject); SetActiveRoomId(roomSession.roomId); @@ -267,18 +256,14 @@ const useRoomState = () => 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); + renderer.resize(width, height, window.devicePixelRatio); - nitroInstance.application.render(); - } + InitializeRoomInstanceRenderingCanvas(width, height, 1); + GetRenderer().render(GetStage()); + }; window.addEventListener('resize', resize); @@ -289,10 +274,10 @@ const useRoomState = () => setOriginalRoomBackgroundColor(0); window.removeEventListener('resize', resize); - } + }; }, [ roomSession ]); return { roomSession }; -} +}; -export const useRoom = () => useBetween(useRoomState); +export const useRoom = () => useBetween(useRoomState); \ No newline at end of file diff --git a/src/hooks/rooms/widgets/furniture/index.ts b/src/hooks/rooms/widgets/furniture/index.ts index 37fa573..d9eccba 100644 --- a/src/hooks/rooms/widgets/furniture/index.ts +++ b/src/hooks/rooms/widgets/furniture/index.ts @@ -1,3 +1,4 @@ +export * from './useFurnitureAreaHideWidget'; export * from './useFurnitureBackgroundColorWidget'; export * from './useFurnitureBadgeDisplayWidget'; export * from './useFurnitureContextMenuWidget'; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureAreaHideWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureAreaHideWidget.ts new file mode 100644 index 0000000..a454401 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureAreaHideWidget.ts @@ -0,0 +1,93 @@ +import { GetRoomEngine, RoomAreaSelectionManager, RoomEngineAreaHideStateEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { CanManipulateFurniture } from '../../../../api'; +import { useNitroEvent } from '../../../events'; +import { useRoom } from '../../useRoom'; + +const useFurnitureAreaHideWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ isOn, setIsOn ] = useState(false); + const [ rootX, setRootX ] = useState(0); + const [ rootY, setRootY ] = useState(0); + const [ width, setWidth ] = useState(0); + const [ length, setLength ] = useState(0); + const [ invisibility, setInvisibility ] = useState(false); + const [ wallItems, setWallItems ] = useState(false); + const [ inverted, setInverted ] = useState(false); + const { roomSession = null } = useRoom(); + + const onClose = () => + { + setObjectId(-1); + setCategory(-1); + setIsOn(false); + setRootX(0); + setRootY(0); + setWidth(0); + setLength(0); + setInvisibility(false); + setWallItems(false); + setInverted(false); + + GetRoomEngine().areaSelectionManager.deactivate(); + }; + + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_AREA_HIDE, event => + { + if(!CanManipulateFurniture(roomSession, event.objectId, event.category)) return; + + setObjectId(event.objectId); + setCategory(event.category); + + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + const model = roomObject.model; + + setIsOn(roomObject.getState(0) === 1); + setRootX(model.getValue(RoomObjectVariable.FURNITURE_AREA_HIDE_ROOT_X) ?? 0); + setRootY(model.getValue(RoomObjectVariable.FURNITURE_AREA_HIDE_ROOT_Y) ?? 0); + setWidth(model.getValue(RoomObjectVariable.FURNITURE_AREA_HIDE_WIDTH) ?? 0); + setLength(model.getValue(RoomObjectVariable.FURNITURE_AREA_HIDE_LENGTH) ?? 0); + setInvisibility(model.getValue(RoomObjectVariable.FURNITURE_AREA_HIDE_INVISIBILITY) === 1); + setWallItems(model.getValue(RoomObjectVariable.FURNITURE_AREA_HIDE_WALL_ITEMS) === 1); + setInverted(model.getValue(RoomObjectVariable.FURNITURE_AREA_HIDE_INVERT) === 1); + }); + + useNitroEvent(RoomEngineAreaHideStateEvent.UPDATE_STATE_AREA_HIDE, event => + { + setObjectId(event.objectId); + setCategory(event.category); + setIsOn(event.isOn); + }); + + useEffect(() => + { + if(objectId === -1) return; + + if(!isOn) + { + const callback = (rootX: number, rootY: number, width: number, height: number) => + { + setRootX(rootX); + setRootY(rootY); + setWidth(width); + setLength(height); + }; + + if(GetRoomEngine().areaSelectionManager.activate(callback, RoomAreaSelectionManager.HIGHLIGHT_DARKEN)) + { + GetRoomEngine().areaSelectionManager.setHighlight(rootX, rootY, width, length); + } + } + else + { + GetRoomEngine().areaSelectionManager.deactivate(); + } + }, [ objectId, isOn, rootX, rootY, width, length ]); + + return { objectId, category, isOn, setIsOn, rootX, setRootX, rootY, setRootY, width, setWidth, length, setLength, invisibility, setInvisibility, wallItems, setWallItems, inverted, setInverted, onClose }; +}; + +export const useFurnitureAreaHideWidget = useFurnitureAreaHideWidgetState; \ No newline at end of file diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts index 273a037..ca8bd7a 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts @@ -1,7 +1,7 @@ -import { ApplyTonerComposer, ColorConverter, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { ApplyTonerComposer, ColorConverter, GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { useEffect, useState } from 'react'; -import { CanManipulateFurniture, ColorUtils, DispatchUiEvent, GetRoomEngine, RoomWidgetUpdateBackgroundColorPreviewEvent, SendMessageComposer } from '../../../../api'; -import { useRoomEngineEvent } from '../../../events'; +import { CanManipulateFurniture, ColorUtils, DispatchUiEvent, RoomWidgetUpdateBackgroundColorPreviewEvent, SendMessageComposer } from '../../../../api'; +import { useNitroEvent } from '../../../events'; import { useFurniRemovedEvent } from '../../engine'; import { useRoom } from '../../useRoom'; @@ -17,7 +17,7 @@ const useFurnitureBackgroundColorWidgetState = () => const hsl = ColorConverter.rgbToHSL(color); const [ _, hue, saturation, lightness ] = ColorUtils.int_to_8BitVals(hsl); SendMessageComposer(new ApplyTonerComposer(objectId, hue, saturation, lightness)); - } + }; const toggleToner = () => roomSession.useMultistateItem(objectId); @@ -28,9 +28,9 @@ const useFurnitureBackgroundColorWidgetState = () => setObjectId(-1); setCategory(-1); setColor(0); - } + }; - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR, event => { if(!CanManipulateFurniture(roomSession, event.objectId, event.category)) return; @@ -38,7 +38,7 @@ const useFurnitureBackgroundColorWidgetState = () => const model = roomObject.model; setObjectId(event.objectId); - setCategory(event.category) + setCategory(event.category); const hue = parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_HUE)); const saturation = parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION)); const light = parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS)); @@ -66,6 +66,6 @@ const useFurnitureBackgroundColorWidgetState = () => }, [ objectId, category, color ]); return { objectId, color, setColor, 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 index 5ef2bfc..52c8a4e 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts @@ -1,7 +1,7 @@ -import { RoomEngineTriggerWidgetEvent, RoomObjectVariable, StringDataType } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, GetSessionDataManager, RoomEngineTriggerWidgetEvent, RoomObjectVariable, StringDataType } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine, GetSessionDataManager, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../../api'; -import { useRoomEngineEvent } from '../../../events'; +import { LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../../api'; +import { useNitroEvent } from '../../../events'; import { useNotification } from '../../../notification'; import { useFurniRemovedEvent } from '../../engine'; @@ -25,9 +25,9 @@ const useFurnitureBadgeDisplayWidgetState = () => setBadgeDesc(''); setDate(''); setSenderName(''); - } + }; - useRoomEngineEvent([ + useNitroEvent([ RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING, RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING ], event => @@ -49,7 +49,7 @@ const useFurnitureBadgeDisplayWidgetState = () => setSenderName(stringStuff.getValue(3)); }); - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_FAILED, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_FAILED, event => { const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); @@ -58,7 +58,7 @@ const useFurnitureBadgeDisplayWidgetState = () => 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')); }); @@ -70,6 +70,6 @@ const useFurnitureBadgeDisplayWidgetState = () => }); 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 index 74aecb9..c952dfc 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts @@ -1,7 +1,7 @@ -import { ContextMenuEnum, GroupFurniContextMenuInfoMessageEvent, GroupFurniContextMenuInfoMessageParser, RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { ContextMenuEnum, GetRoomEngine, GroupFurniContextMenuInfoMessageEvent, GroupFurniContextMenuInfoMessageParser, RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine, IsOwnerOfFurniture, TryJoinGroup, TryVisitRoom } from '../../../../api'; -import { useMessageEvent, useRoomEngineEvent } from '../../../events'; +import { IsOwnerOfFurniture, TryJoinGroup, TryVisitRoom } from '../../../../api'; +import { useMessageEvent, useNitroEvent } from '../../../events'; import { useRoom } from '../../useRoom'; export const MONSTERPLANT_SEED_CONFIRMATION: string = 'MONSTERPLANT_SEED_CONFIRMATION'; @@ -27,13 +27,13 @@ const useFurnitureContextMenuWidgetState = () => setGroupData(null); setIsGroupMember(false); setMode(null); - } + }; const closeConfirm = () => { setConfirmMode(null); setConfirmingObjectId(-1); - } + }; const processAction = (name: string) => { @@ -73,9 +73,9 @@ const useFurnitureContextMenuWidgetState = () => } onClose(); - } + }; - useRoomEngineEvent([ + useNitroEvent([ RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU, RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU, RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG, @@ -174,6 +174,6 @@ const useFurnitureContextMenuWidgetState = () => }); return { objectId, mode, confirmMode, confirmingObjectId, groupData, isGroupMember, objectOwnerId, closeConfirm, processAction, onClose }; -} +}; export const useFurnitureContextMenuWidget = useFurnitureContextMenuWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureCraftingWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureCraftingWidget.ts index fc73c7d..9f7b511 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureCraftingWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureCraftingWidget.ts @@ -1,12 +1,12 @@ -import { CraftableProductsEvent, CraftComposer, CraftingRecipeEvent, CraftingRecipeIngredientParser, CraftingRecipesAvailableEvent, CraftingResultEvent, GetCraftableProductsComposer, GetCraftingRecipeComposer, RoomEngineTriggerWidgetEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; +import { CraftableProductsEvent, CraftComposer, CraftingRecipeEvent, CraftingRecipeIngredientParser, CraftingRecipesAvailableEvent, CraftingResultEvent, GetCraftableProductsComposer, GetCraftingRecipeComposer, GetRoomContentLoader, GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; import { useEffect, useState } from 'react'; -import { GetRoomEngine, ICraftingIngredient, ICraftingRecipe, LocalizeText, SendMessageComposer } from '../../../../api'; -import { useMessageEvent, useRoomEngineEvent } from '../../../events'; +import { ICraftingIngredient, ICraftingRecipe, LocalizeText, SendMessageComposer } from '../../../../api'; +import { useMessageEvent, useNitroEvent } from '../../../events'; import { useInventoryFurni } from '../../../inventory'; import { useNotification } from './../../../notification'; const useFurnitureCraftingWidgetState = () => -{ +{ const [ objectId, setObjectId ] = useState(-1); const [ recipes, setRecipes ] = useState([]); const [ selectedRecipe, setSelectedRecipe ] = useState(null); @@ -43,15 +43,15 @@ const useFurnitureCraftingWidgetState = () => const selectRecipe = (recipe: ICraftingRecipe) => { setSelectedRecipe(recipe); - + const cache = cachedIngredients.get(recipe.name); if(!cache) SendMessageComposer(new GetCraftingRecipeComposer(recipe.name)); - } + }; - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.OPEN_WIDGET, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.OPEN_WIDGET, event => { - if (event.widget !== RoomWidgetEnum.CRAFTING) return; + if(event.widget !== RoomWidgetEnum.CRAFTING) return; setObjectId(event.objectId); resetData(); @@ -62,7 +62,7 @@ const useFurnitureCraftingWidgetState = () => { const parser = event.getParser(); - if (!parser.isActive()) + if(!parser.isActive()) { setObjectId(-1); @@ -76,7 +76,7 @@ const useFurnitureCraftingWidgetState = () => for(const recipe of parser.recipes) { //@ts-ignore - const itemId = GetRoomEngine().roomContentLoader._activeObjectTypeIds.get(recipe.itemName); + const itemId = GetRoomContentLoader()._activeObjectTypeIds.get(recipe.itemName); const iconUrl = GetRoomEngine().getFurnitureFloorIconUrl(itemId); newValue.push({ @@ -131,14 +131,14 @@ const useFurnitureCraftingWidgetState = () => for(const name of ingredientNames) { //@ts-ignore - const itemId = GetRoomEngine().roomContentLoader._activeObjectTypeIds.get(name); + const itemId = GetRoomContentLoader()._activeObjectTypeIds.get(name); const iconUrl = GetRoomEngine().getFurnitureFloorIconUrl(itemId); const inventoryItems = getItemsByType(itemId); let amountAvailable = 0; - if (inventoryItems) for (const inventoryItem of inventoryItems) amountAvailable += inventoryItem.items.length; + if(inventoryItems) for(const inventoryItem of inventoryItems) amountAvailable += inventoryItem.items.length; newValue.push({ name: name, @@ -161,6 +161,6 @@ const useFurnitureCraftingWidgetState = () => }, [ objectId, activate, deactivate ]); return { objectId, recipes, ingredients, selectedRecipe, requiredIngredients, isCrafting, selectRecipe, craft, onClose }; -} +}; export const useFurnitureCraftingWidget = useFurnitureCraftingWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts index 6ac8f89..52b2093 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts @@ -1,7 +1,7 @@ -import { RoomControllerLevel, RoomEngineDimmerStateEvent, RoomEngineTriggerWidgetEvent, RoomId, RoomSessionDimmerPresetsEvent } from '@nitrots/nitro-renderer'; +import { GetSessionDataManager, 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 { DimmerFurnitureWidgetPresetItem, FurnitureDimmerUtilities } from '../../../../api'; +import { useNitroEvent } from '../../../events'; import { useRoom } from '../../useRoom'; const useFurnitureDimmerWidgetState = () => @@ -25,12 +25,12 @@ const useFurnitureDimmerWidgetState = () => const preset = presets[(id - 1)]; if(!preset) return; - + setSelectedPresetId(preset.id); setSelectedEffectId(preset.type); setSelectedColor(preset.color); setSelectedBrightness(preset.light); - } + }; const applyChanges = () => { @@ -54,16 +54,16 @@ const useFurnitureDimmerWidgetState = () => }); FurnitureDimmerUtilities.savePreset(preset.id, selectedEffectId, selectedColor, selectedBrightness, true); - } + }; - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_DIMMER, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_DIMMER, event => { if(!canOpenWidget()) return; - + roomSession.requestMoodlightSettings(); }); - useRoomSessionManagerEvent(RoomSessionDimmerPresetsEvent.ROOM_DIMMER_PRESETS, event => + useNitroEvent(RoomSessionDimmerPresetsEvent.ROOM_DIMMER_PRESETS, event => { const presets: DimmerFurnitureWidgetPresetItem[] = []; @@ -82,7 +82,7 @@ const useFurnitureDimmerWidgetState = () => setSelectedPresetId(event.selectedPresetId); }); - useRoomEngineEvent(RoomEngineDimmerStateEvent.ROOM_COLOR, event => + useNitroEvent(RoomEngineDimmerStateEvent.ROOM_COLOR, event => { if(RoomId.isRoomPreviewerId(event.roomId)) return; @@ -105,6 +105,6 @@ const useFurnitureDimmerWidgetState = () => }, [ 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 index 0dbb3d4..31ff3d2 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts @@ -1,7 +1,7 @@ -import { FurnitureExchangeComposer, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { FurnitureExchangeComposer, GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine, GetRoomSession, IsOwnerOfFurniture } from '../../../../api'; -import { useRoomEngineEvent } from '../../../events'; +import { IsOwnerOfFurniture, SendMessageComposer } from '../../../../api'; +import { useNitroEvent } from '../../../events'; import { useFurniRemovedEvent } from '../../engine'; const useFurnitureExchangeWidgetState = () => @@ -15,16 +15,16 @@ const useFurnitureExchangeWidgetState = () => setObjectId(-1); setCategory(-1); setValue(0); - } + }; const redeem = () => { - GetRoomSession().connection.send(new FurnitureExchangeComposer(objectId)); + SendMessageComposer(new FurnitureExchangeComposer(objectId)); onClose(); - } + }; - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_CREDITFURNI, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_CREDITFURNI, event => { const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); @@ -43,6 +43,6 @@ const useFurnitureExchangeWidgetState = () => }); 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 index dbc1d52..fcebf7d 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts @@ -1,7 +1,7 @@ -import { RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine, IPhotoData } from '../../../../api'; -import { useRoomEngineEvent } from '../../../events'; +import { IPhotoData } from '../../../../api'; +import { useNitroEvent } from '../../../events'; import { useFurniRemovedEvent } from '../../engine'; import { useRoom } from '../../useRoom'; @@ -19,9 +19,9 @@ const useFurnitureExternalImageWidgetState = () => setCategory(-1); setCurrentPhotoIndex(-1); setCurrentPhotos([]); - } + }; - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_EXTERNAL_IMAGE, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_EXTERNAL_IMAGE, event => { const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); const roomTotalImages = GetRoomEngine().getRoomObjects(roomSession?.roomId, RoomObjectCategory.WALL); @@ -32,7 +32,7 @@ const useFurnitureExternalImageWidgetState = () => roomTotalImages.forEach(object => { - if (object.type !== 'external_image_wallitem_poster_small') return null; + if(object.type !== 'external_image_wallitem_poster_small') return null; const data = object.model.getValue(RoomObjectVariable.FURNITURE_DATA); const jsonData: IPhotoData = JSON.parse(data); @@ -52,7 +52,7 @@ const useFurnitureExternalImageWidgetState = () => if(roomObjectPhotoData) { - index = datas.findIndex(data => (data.w === roomObjectPhotoData.w)) + index = datas.findIndex(data => (data.u === roomObjectPhotoData.u)); } if(index < 0) index = 0; @@ -69,6 +69,6 @@ const useFurnitureExternalImageWidgetState = () => }); return { objectId, currentPhotoIndex, currentPhotos, onClose }; -} +}; export const useFurnitureExternalImageWidget = useFurnitureExternalImageWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts index e658189..d278fdf 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts @@ -1,7 +1,7 @@ -import { FriendFurniConfirmLockMessageComposer, LoveLockFurniFinishedEvent, LoveLockFurniFriendConfirmedEvent, LoveLockFurniStartEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { FriendFurniConfirmLockMessageComposer, GetRoomEngine, LoveLockFurniFinishedEvent, LoveLockFurniFriendConfirmedEvent, LoveLockFurniStartEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine, GetRoomSession } from '../../../../api'; -import { useMessageEvent, useRoomEngineEvent } from '../../../events'; +import { SendMessageComposer } from '../../../../api'; +import { useMessageEvent, useNitroEvent } from '../../../events'; import { useFurniRemovedEvent } from '../../engine'; const useFurnitureFriendFurniWidgetState = () => @@ -22,14 +22,14 @@ const useFurnitureFriendFurniWidgetState = () => setUsernames([]); setFigures([]); setDate(null); - } + }; const respond = (flag: boolean) => { - GetRoomSession().connection.send(new FriendFurniConfirmLockMessageComposer(objectId, flag)); + SendMessageComposer(new FriendFurniConfirmLockMessageComposer(objectId, flag)); onClose(); - } + }; useMessageEvent(LoveLockFurniStartEvent, event => { @@ -42,7 +42,7 @@ const useFurnitureFriendFurniWidgetState = () => useMessageEvent(LoveLockFurniFinishedEvent, event => onClose()); useMessageEvent(LoveLockFurniFriendConfirmedEvent, event => onClose()); - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, event => { const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); @@ -52,7 +52,7 @@ const useFurnitureFriendFurniWidgetState = () => 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); @@ -70,6 +70,6 @@ const useFurnitureFriendFurniWidgetState = () => }); 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 index 0d986d5..b34b397 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts @@ -1,7 +1,6 @@ -import { HighScoreDataType, ObjectDataFactory, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, HighScoreDataType, ObjectDataFactory, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine } from '../../../../api'; -import { useRoomEngineEvent } from '../../../events'; +import { useNitroEvent } from '../../../events'; import { useRoom } from '../../useRoom'; const SCORE_TYPES = [ 'perteam', 'mostwins', 'classic' ]; @@ -15,10 +14,10 @@ const useFurnitureHighScoreWidgetState = () => const getScoreType = (type: number) => SCORE_TYPES[type]; const getClearType = (type: number) => CLEAR_TYPES[type]; - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY, event => + useNitroEvent(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); @@ -36,7 +35,7 @@ const useFurnitureHighScoreWidgetState = () => }); }); - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY, event => { if(event.roomId !== roomSession.roomId) return; @@ -51,6 +50,6 @@ const useFurnitureHighScoreWidgetState = () => }); 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 index c1b6880..5f5ecd0 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts @@ -1,15 +1,14 @@ -import { RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { CreateLinkEvent, GetRoomEngine } from '../../../../api'; -import { useRoomEngineEvent } from '../../../events'; +import { CreateLinkEvent, GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useNitroEvent } from '../../../events'; const INTERNALLINK = 'internalLink'; const useFurnitureInternalLinkWidgetState = () => { - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK, event => + useNitroEvent(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); @@ -22,6 +21,6 @@ const useFurnitureInternalLinkWidgetState = () => }); return {}; -} +}; export const useFurnitureInternalLinkWidget = useFurnitureInternalLinkWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts index 6042975..5f5a950 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts @@ -1,7 +1,7 @@ -import { FurnitureMannequinSaveLookComposer, FurnitureMannequinSaveNameComposer, FurnitureMultiStateComposer, HabboClubLevelEnum, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { FurnitureMannequinSaveLookComposer, FurnitureMannequinSaveNameComposer, FurnitureMultiStateComposer, GetAvatarRenderManager, GetRoomEngine, HabboClubLevelEnum, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetAvatarRenderManager, GetRoomEngine, MannequinUtilities, SendMessageComposer } from '../../../../api'; -import { useRoomEngineEvent } from '../../../events'; +import { MannequinUtilities, SendMessageComposer } from '../../../../api'; +import { useNitroEvent } from '../../../events'; import { useFurniRemovedEvent } from '../../engine'; const useFurnitureMannequinWidgetState = () => @@ -20,7 +20,7 @@ const useFurnitureMannequinWidgetState = () => setFigure(null); setGender(null); setName(null); - } + }; const saveFigure = () => { @@ -29,7 +29,7 @@ const useFurnitureMannequinWidgetState = () => SendMessageComposer(new FurnitureMannequinSaveLookComposer(objectId)); onClose(); - } + }; const wearFigure = () => { @@ -38,16 +38,16 @@ const useFurnitureMannequinWidgetState = () => SendMessageComposer(new FurnitureMultiStateComposer(objectId)); onClose(); - } + }; const saveName = () => { if(objectId === -1) return; SendMessageComposer(new FurnitureMannequinSaveNameComposer(objectId, name)); - } + }; - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_MANNEQUIN, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_MANNEQUIN, event => { const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); @@ -75,6 +75,6 @@ const useFurnitureMannequinWidgetState = () => }); return { objectId, figure, gender, clubLevel, name, setName, saveFigure, wearFigure, saveName, onClose }; -} +}; export const useFurnitureMannequinWidget = useFurnitureMannequinWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurniturePlaylistEditorWidget.ts b/src/hooks/rooms/widgets/furniture/useFurniturePlaylistEditorWidget.ts index 05607f0..131fef9 100644 --- a/src/hooks/rooms/widgets/furniture/useFurniturePlaylistEditorWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurniturePlaylistEditorWidget.ts @@ -1,7 +1,7 @@ -import { AddJukeboxDiskComposer, AdvancedMap, FurnitureListAddOrUpdateEvent, FurnitureListEvent, FurnitureListRemovedEvent, FurnitureMultiStateComposer, IAdvancedMap, IMessageEvent, ISongInfo, NotifyPlayedSongEvent, NowPlayingEvent, PlayListStatusEvent, RemoveJukeboxDiskComposer, RoomControllerLevel, RoomEngineTriggerWidgetEvent, SongDiskInventoryReceivedEvent } from '@nitrots/nitro-renderer'; +import { AddJukeboxDiskComposer, AdvancedMap, FurnitureListAddOrUpdateEvent, FurnitureListEvent, FurnitureListRemovedEvent, FurnitureMultiStateComposer, GetRoomEngine, GetSessionDataManager, GetSoundManager, IAdvancedMap, IMessageEvent, ISongInfo, NotifyPlayedSongEvent, NowPlayingEvent, PlayListStatusEvent, RemoveJukeboxDiskComposer, RoomControllerLevel, RoomEngineTriggerWidgetEvent, SongDiskInventoryReceivedEvent } from '@nitrots/nitro-renderer'; import { useCallback, useState } from 'react'; -import { GetNitroInstance, GetRoomEngine, GetSessionDataManager, IsOwnerOfFurniture, LocalizeText, NotificationAlertType, NotificationBubbleType, SendMessageComposer } from '../../../../api'; -import { useMessageEvent, useRoomEngineEvent, useSoundEvent } from '../../../events'; +import { IsOwnerOfFurniture, LocalizeText, NotificationAlertType, NotificationBubbleType, SendMessageComposer } from '../../../../api'; +import { useMessageEvent, useNitroEvent } from '../../../events'; import { useNotification } from '../../../notification'; import { useFurniRemovedEvent } from '../../engine'; import { useRoom } from '../../useRoom'; @@ -20,7 +20,7 @@ const useFurniturePlaylistEditorWidgetState = () => { setObjectId(-1); setCategory(-1); - } + }; const addToPlaylist = useCallback((diskId: number, slotNumber: number) => SendMessageComposer(new AddJukeboxDiskComposer(diskId, slotNumber)), []); @@ -28,7 +28,7 @@ const useFurniturePlaylistEditorWidgetState = () => const togglePlayPause = useCallback((furniId: number, position: number) => SendMessageComposer(new FurnitureMultiStateComposer(furniId, position)), []); - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_PLAYLIST_EDITOR, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_PLAYLIST_EDITOR, event => { const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); @@ -40,8 +40,8 @@ const useFurniturePlaylistEditorWidgetState = () => setObjectId(event.objectId); setCategory(event.category); - GetNitroInstance().soundManager.musicController?.requestUserSongDisks(); - GetNitroInstance().soundManager.musicController?.getRoomItemPlaylist()?.requestPlayList(); + GetSoundManager().musicController?.requestUserSongDisks(); + GetSoundManager().musicController?.getRoomItemPlaylist()?.requestPlayList(); return; } @@ -56,27 +56,27 @@ const useFurniturePlaylistEditorWidgetState = () => onClose(); }); - useSoundEvent(NowPlayingEvent.NPE_SONG_CHANGED, event => + useNitroEvent(NowPlayingEvent.NPE_SONG_CHANGED, event => { setCurrentPlayingIndex(event.position); }); - useSoundEvent(NotifyPlayedSongEvent.NOTIFY_PLAYED_SONG, event => + useNitroEvent(NotifyPlayedSongEvent.NOTIFY_PLAYED_SONG, event => { - showSingleBubble(LocalizeText('soundmachine.notification.playing', [ 'songname', 'songauthor' ], [ event.name, event.creator ]), NotificationBubbleType.SOUNDMACHINE) + showSingleBubble(LocalizeText('soundmachine.notification.playing', [ 'songname', 'songauthor' ], [ event.name, event.creator ]), NotificationBubbleType.SOUNDMACHINE); }); - useSoundEvent(SongDiskInventoryReceivedEvent.SDIR_SONG_DISK_INVENTORY_RECEIVENT_EVENT, event => + useNitroEvent(SongDiskInventoryReceivedEvent.SDIR_SONG_DISK_INVENTORY_RECEIVENT_EVENT, event => { - setDiskInventory(GetNitroInstance().soundManager.musicController?.songDiskInventory.clone()); + setDiskInventory(GetSoundManager().musicController?.songDiskInventory.clone()); }); - useSoundEvent(PlayListStatusEvent.PLUE_PLAY_LIST_UPDATED, event => + useNitroEvent(PlayListStatusEvent.PLUE_PLAY_LIST_UPDATED, event => { - setPlaylist(GetNitroInstance().soundManager.musicController?.getRoomItemPlaylist()?.entries.concat()) + setPlaylist(GetSoundManager().musicController?.getRoomItemPlaylist()?.entries.concat()); }); - useSoundEvent(PlayListStatusEvent.PLUE_PLAY_LIST_FULL, event => + useNitroEvent(PlayListStatusEvent.PLUE_PLAY_LIST_FULL, event => { simpleAlert(LocalizeText('playlist.editor.alert.playlist.full'), NotificationAlertType.ALERT, '', '', LocalizeText('playlist.editor.alert.playlist.full.title')); }); @@ -89,20 +89,20 @@ const useFurniturePlaylistEditorWidgetState = () => { if(event.getParser().fragmentNumber === 0) { - GetNitroInstance().soundManager.musicController?.requestUserSongDisks(); + GetSoundManager().musicController?.requestUserSongDisks(); } } else { - GetNitroInstance().soundManager.musicController?.requestUserSongDisks(); + GetSoundManager().musicController?.requestUserSongDisks(); } - } + }; useMessageEvent(FurnitureListEvent, onFurniListUpdated); useMessageEvent(FurnitureListRemovedEvent, onFurniListUpdated); useMessageEvent(FurnitureListAddOrUpdateEvent, onFurniListUpdated); return { objectId, diskInventory, playlist, currentPlayingIndex, onClose, addToPlaylist, removeFromPlaylist, togglePlayPause }; -} +}; export const useFurniturePlaylistEditorWidget = useFurniturePlaylistEditorWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts b/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts index 8342b51..4c1611c 100644 --- a/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts @@ -1,9 +1,9 @@ -import { IFurnitureData, IGetImageListener, PetFigureData, RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable, RoomSessionPresentEvent, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, GetSessionDataManager, 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 { IsOwnerOfFurniture, LocalizeText, ProductTypeEnum } from '../../../../api'; +import { useNitroEvent } from '../../../events'; import { useFurniRemovedEvent } from '../../engine'; +import { useRoom } from '../../useRoom'; const FLOOR: string = 'floor'; const WALLPAPER: string = 'wallpaper'; @@ -38,34 +38,38 @@ const useFurniturePresentWidgetState = () => 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(() => { + // async fix image return { imageReady: (id, texture, image) => { - if(!image && texture) + (async () => { - image = TextureUtils.generateImage(texture); - } + if(!image && texture) + { + image = await TextureUtils.generateImage(texture); + } - setImageUrl(image.src); + setImageUrl(image.src); + })(); }, imageFailed: null - } + }; }, []); - useRoomSessionManagerEvent(RoomSessionPresentEvent.RSPE_PRESENT_OPENED, event => + useNitroEvent(RoomSessionPresentEvent.RSPE_PRESENT_OPENED, event => { let furniData: IFurnitureData = null; @@ -119,7 +123,7 @@ const useFurniturePresentWidgetState = () => imageType = 'packagecard_icon_wallpaper'; message = LocalizeText('inventory.furni.item.wallpaper.name'); } - + setText(message); //setImageUrl(getGiftImageUrl(imageType)); break; @@ -165,16 +169,22 @@ const useFurniturePresentWidgetState = () => { const petFigureData = new PetFigureData(petfigureString); - const petImage = GetRoomEngine().getRoomObjectPetImage(petFigureData.typeId, petFigureData.paletteId, petFigureData.color, new Vector3d(90), 64, imageListener, true, 0, petFigureData.customParts); + (async () => + { + 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); + if(petImage) setImageUrl((await petImage.getImage()).src); + })(); } } else { - const furniImage = GetRoomEngine().getFurnitureFloorImage(event.classId, new Vector3d(90), 64, imageListener); + (async () => + { + const furniImage = GetRoomEngine().getFurnitureFloorImage(event.classId, new Vector3d(90), 64, imageListener); - if(furniImage) setImageUrl(furniImage.getImage().src); + if(furniImage) setImageUrl((await furniImage.getImage()).src); + })(); } const productData = GetSessionDataManager().getProductData(event.productCode); @@ -193,7 +203,7 @@ const useFurniturePresentWidgetState = () => setPlacedInRoom(event.placedInRoom); }); - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_PRESENT, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_PRESENT, event => { const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); @@ -220,6 +230,6 @@ const useFurniturePresentWidgetState = () => }); 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 index aa21127..28ec30a 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts @@ -1,7 +1,7 @@ -import { GetGuestRoomMessageComposer, GetGuestRoomResultEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { GetGuestRoomMessageComposer, GetGuestRoomResultEvent, GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine, SendMessageComposer } from '../../../../api'; -import { useMessageEvent, useRoomEngineEvent } from '../../../events'; +import { SendMessageComposer } from '../../../../api'; +import { useMessageEvent, useNitroEvent } from '../../../events'; const INTERNALLINK = 'internalLink'; @@ -9,10 +9,10 @@ const useFurnitureRoomLinkWidgetState = () => { const [ roomIdToEnter, setRoomIdToEnter ] = useState(0); - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK, event => + useNitroEvent(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); @@ -44,6 +44,6 @@ const useFurnitureRoomLinkWidgetState = () => }); return {}; -} +}; export const useFurnitureRoomLinkWidget = useFurnitureRoomLinkWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts index 64f89b0..62c84ac 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts @@ -1,6 +1,6 @@ -import { AddSpamWallPostItMessageComposer, RequestSpamWallPostItMessageEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { AddSpamWallPostItMessageComposer, GetRoomEngine, RequestSpamWallPostItMessageEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine, SendMessageComposer } from '../../../../api'; +import { SendMessageComposer } from '../../../../api'; import { useMessageEvent } from '../../../events'; import { useInventoryFurni } from '../../../inventory'; @@ -26,12 +26,12 @@ const useFurnitureSpamWallPostItWidgetState = () => setColor('0'); setText(''); setCanModify(false); - } + }; useMessageEvent(RequestSpamWallPostItMessageEvent, event => { const parser = event.getParser(); - + setObjectId(parser.itemId); setCategory(RoomObjectCategory.WALL); @@ -54,6 +54,6 @@ const useFurnitureSpamWallPostItWidgetState = () => }); 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 index 3f8c851..90a2a93 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts @@ -1,7 +1,7 @@ -import { FurnitureStackHeightComposer, FurnitureStackHeightEvent, RoomEngineTriggerWidgetEvent } from '@nitrots/nitro-renderer'; +import { FurnitureStackHeightComposer, FurnitureStackHeightEvent, GetRoomEngine, RoomEngineTriggerWidgetEvent } from '@nitrots/nitro-renderer'; import { useEffect, useState } from 'react'; -import { CanManipulateFurniture, GetRoomEngine, GetRoomSession, SendMessageComposer } from '../../../../api'; -import { useMessageEvent, useRoomEngineEvent } from '../../../events'; +import { CanManipulateFurniture, GetRoomSession, SendMessageComposer } from '../../../../api'; +import { useMessageEvent, useNitroEvent } from '../../../events'; import { useFurniRemovedEvent } from '../../engine'; const MAX_HEIGHT: number = 40; @@ -19,7 +19,7 @@ const useFurnitureStackHeightWidgetState = () => setCategory(-1); setHeight(0); setPendingHeight(-1); - } + }; const updateHeight = (height: number, server: boolean = false) => { @@ -32,7 +32,7 @@ const useFurnitureStackHeightWidgetState = () => setHeight(parseFloat(height.toFixed(2))); if(!server) setPendingHeight(height * 100); - } + }; useMessageEvent(FurnitureStackHeightEvent, event => { @@ -43,7 +43,7 @@ const useFurnitureStackHeightWidgetState = () => updateHeight(parser.height, true); }); - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_STACK_HEIGHT, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_STACK_HEIGHT, event => { if(!CanManipulateFurniture(GetRoomSession(), event.objectId, event.category)) return; @@ -74,6 +74,6 @@ const useFurnitureStackHeightWidgetState = () => }, [ 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 index 7cc1597..d008360 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts @@ -1,7 +1,7 @@ -import { RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, GetSessionDataManager, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine, GetRoomSession, GetSessionDataManager, IsOwnerOfFurniture } from '../../../../api'; -import { useRoomEngineEvent } from '../../../events'; +import { GetRoomSession, IsOwnerOfFurniture } from '../../../../api'; +import { useNitroEvent } from '../../../events'; import { useFurniRemovedEvent } from '../../engine'; const useFurnitureStickieWidgetState = () => @@ -21,7 +21,7 @@ const useFurnitureStickieWidgetState = () => setText(''); setType(''); setCanModify(false); - } + }; const updateColor = (newColor: string) => { @@ -30,18 +30,18 @@ const useFurnitureStickieWidgetState = () => 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 => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_STICKIE, event => { const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); @@ -80,6 +80,6 @@ const useFurnitureStickieWidgetState = () => }); return { objectId, color, text, type, 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 index d5a1e33..b5e19b6 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts @@ -1,7 +1,6 @@ -import { RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine } from '../../../../api'; -import { useRoomEngineEvent } from '../../../events'; +import { useNitroEvent } from '../../../events'; import { useFurniRemovedEvent } from '../../engine'; const useFurnitureTrophyWidgetState = () => @@ -21,9 +20,9 @@ const useFurnitureTrophyWidgetState = () => setSenderName(''); setDate(''); setMessage(''); - } + }; - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_TROPHY, event => + useNitroEvent(RoomEngineTriggerWidgetEvent.REQUEST_TROPHY, event => { const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); @@ -58,6 +57,6 @@ const useFurnitureTrophyWidgetState = () => }); 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 index 79548e7..7f91c1e 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts @@ -1,7 +1,7 @@ -import { ControlYoutubeDisplayPlaybackMessageComposer, GetYoutubeDisplayStatusMessageComposer, RoomEngineTriggerWidgetEvent, RoomId, SecurityLevel, SetYoutubeDisplayPlaylistMessageComposer, YoutubeControlVideoMessageEvent, YoutubeDisplayPlaylist, YoutubeDisplayPlaylistsEvent, YoutubeDisplayVideoMessageEvent } from '@nitrots/nitro-renderer'; +import { ControlYoutubeDisplayPlaybackMessageComposer, GetRoomEngine, GetSessionDataManager, 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 { IsOwnerOfFurniture, SendMessageComposer, YoutubeVideoPlaybackStateEnum } from '../../../../api'; +import { useMessageEvent, useNitroEvent } from '../../../events'; import { useFurniRemovedEvent } from '../../engine'; const CONTROL_COMMAND_PREVIOUS_VIDEO = 0; @@ -32,7 +32,7 @@ const useFurnitureYoutubeWidgetState = () => setSelectedVideo(null); setPlaylists(null); setHasControl(false); - } + }; const previous = () => SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_PREVIOUS_VIDEO)); @@ -54,14 +54,14 @@ const useFurnitureYoutubeWidgetState = () => setSelectedVideo(video); SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, video)); - } + }; - useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_YOUTUBE, event => + useNitroEvent(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); @@ -122,6 +122,6 @@ const useFurnitureYoutubeWidgetState = () => }); 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/useAvatarInfoWidget.ts b/src/hooks/rooms/widgets/useAvatarInfoWidget.ts index b69caff..f0421f9 100644 --- a/src/hooks/rooms/widgets/useAvatarInfoWidget.ts +++ b/src/hooks/rooms/widgets/useAvatarInfoWidget.ts @@ -1,7 +1,7 @@ -import { RoomEngineObjectEvent, RoomEngineUseProductEvent, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionPetInfoUpdateEvent, RoomSessionPetStatusUpdateEvent, RoomSessionUserDataUpdateEvent } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, GetSessionDataManager, 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 { AvatarInfoFurni, AvatarInfoName, AvatarInfoPet, AvatarInfoRentableBot, AvatarInfoUser, AvatarInfoUtilities, CanManipulateFurniture, FurniCategory, IAvatarInfo, IsOwnerOfFurniture, RoomWidgetUpdateRoomObjectEvent, UseProductItem } from '../../../api'; +import { useNitroEvent, useUiEvent } from '../../events'; import { useFriends } from '../../friends'; import { useWired } from '../../wired'; import { useObjectDeselectedEvent, useObjectRollOutEvent, useObjectRollOverEvent, useObjectSelectedEvent } from '../engine'; @@ -30,7 +30,7 @@ const useAvatarInfoWidgetState = () => return newValue; }); - } + }; const removeProductBubble = (index: number) => { @@ -43,13 +43,13 @@ const useAvatarInfoWidgetState = () => return newValue; }); - } + }; const updateConfirmingProduct = (product: UseProductItem) => { setConfirmingProduct(product); setProductBubbles([]); - } + }; const getObjectName = (objectId: number, category: number) => { @@ -60,7 +60,7 @@ const useAvatarInfoWidgetState = () => setActiveNameBubble(name); if(category !== RoomObjectCategory.UNIT) setProductBubbles([]); - } + }; const getObjectInfo = (objectId: number, category: number) => { @@ -102,18 +102,18 @@ const useAvatarInfoWidgetState = () => if(!info) return; setAvatarInfo(info); - } + }; const processUsableRoomObject = (objectId: number) => { - } + }; const refreshPetInfo = () => { // roomSession.userDataManager.requestPetInfo(petData.id); - } + }; - useRoomSessionManagerEvent(RoomSessionUserDataUpdateEvent.USER_DATA_UPDATED, event => + useNitroEvent(RoomSessionUserDataUpdateEvent.USER_DATA_UPDATED, event => { if(!event.addedUsers.length) return; @@ -148,7 +148,7 @@ const useAvatarInfoWidgetState = () => }); }); - useRoomSessionManagerEvent(RoomSessionPetInfoUpdateEvent.PET_INFO, event => + useNitroEvent(RoomSessionPetInfoUpdateEvent.PET_INFO, event => { const petData = event.petInfo; @@ -164,7 +164,7 @@ const useAvatarInfoWidgetState = () => setPendingPetId(-1); }); - useRoomSessionManagerEvent(RoomSessionPetStatusUpdateEvent.PET_STATUS_UPDATE, event => + useNitroEvent(RoomSessionPetStatusUpdateEvent.PET_STATUS_UPDATE, event => { /* var _local_2:Boolean; var _local_3:Boolean; @@ -188,12 +188,12 @@ const useAvatarInfoWidgetState = () => this._container.events.dispatchEvent(_local_7); */ }); - useRoomEngineEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_INVENTORY, event => + useNitroEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_INVENTORY, event => { // this._Str_23199((k as RoomEngineUseProductEvent).inventoryStripId, (k as RoomEngineUseProductEvent).furnitureTypeId); }); - useRoomEngineEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM, event => + useNitroEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM, event => { const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, RoomObjectCategory.FLOOR); @@ -257,7 +257,7 @@ const useAvatarInfoWidgetState = () => if(useProductBubbles.length) setProductBubbles(useProductBubbles); }); - useRoomEngineEvent(RoomEngineObjectEvent.REQUEST_MANIPULATION, event => + useNitroEvent(RoomEngineObjectEvent.REQUEST_MANIPULATION, event => { if(!CanManipulateFurniture(roomSession, event.objectId, event.category)) return; @@ -350,6 +350,6 @@ const useAvatarInfoWidgetState = () => }, [ 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 index da201ec..8c2a6c1 100644 --- a/src/hooks/rooms/widgets/useChatInputWidget.ts +++ b/src/hooks/rooms/widgets/useChatInputWidget.ts @@ -1,7 +1,7 @@ -import { AvatarExpressionEnum, GetTicker, HabboClubLevelEnum, RoomControllerLevel, RoomEngineObjectEvent, RoomObjectCategory, RoomRotatingEffect, RoomSessionChatEvent, RoomSettingsComposer, RoomShakingEffect, RoomZoomEvent, TextureUtils } from '@nitrots/nitro-renderer'; +import { AvatarExpressionEnum, CreateLinkEvent, GetEventDispatcher, GetRoomEngine, GetSessionDataManager, GetTicker, HabboClubLevelEnum, RoomControllerLevel, RoomEngineObjectEvent, RoomObjectCategory, RoomRotatingEffect, RoomSessionChatEvent, RoomSettingsComposer, RoomShakingEffect, RoomZoomEvent, TextureUtils } from '@nitrots/nitro-renderer'; import { useEffect, useState } from 'react'; -import { ChatMessageTypeEnum, CreateLinkEvent, GetClubMemberLevel, GetConfiguration, GetRoomEngine, GetSessionDataManager, LocalizeText, SendMessageComposer } from '../../../api'; -import { useRoomEngineEvent, useRoomSessionManagerEvent } from '../../events'; +import { ChatMessageTypeEnum, GetClubMemberLevel, GetConfigurationValue, LocalizeText, SendMessageComposer } from '../../../api'; +import { useNitroEvent } from '../../events'; import { useNotification } from '../../notification'; import { useObjectSelectedEvent } from '../engine'; import { useRoom } from '../useRoom'; @@ -17,7 +17,7 @@ const useChatInputWidgetState = () => const { showNitroAlert = null, showConfirm = null } = useNotification(); const { roomSession = null } = useRoom(); - const sendChat = (text: string, chatType: number, recipientName: string = '', styleId: number = 0, chatColour: string = '') => + const sendChat = (text: string, chatType: number, recipientName: string = '', styleId: number = 0) => { if(text === '') return null; @@ -51,13 +51,13 @@ const useChatInputWidgetState = () => case ':shake': RoomShakingEffect.init(2500, 5000); RoomShakingEffect.turnVisualizationOn(); - + return null; case ':rotate': RoomRotatingEffect.init(2500, 5000); RoomRotatingEffect.turnVisualizationOn(); - + return null; case ':d': case ';d': @@ -104,32 +104,25 @@ const useChatInputWidgetState = () => return null; case ':iddqd': case ':flip': - GetRoomEngine().events.dispatchEvent(new RoomZoomEvent(roomSession.roomId, -1, true)); + GetEventDispatcher().dispatchEvent(new RoomZoomEvent(roomSession.roomId, -1, true)); return null; case ':zoom': - let requestedZoomLevel = parseFloat(secondPart); - if (isNaN(requestedZoomLevel)) { - requestedZoomLevel = 1; - } - if (requestedZoomLevel >= 1 && requestedZoomLevel <= 5) { - GetRoomEngine().events.dispatchEvent(new RoomZoomEvent(roomSession.roomId, requestedZoomLevel, false)); - } else if (requestedZoomLevel === 0) { - GetRoomEngine().events.dispatchEvent(new RoomZoomEvent(roomSession.roomId, 1, false)); - } else { - GetRoomEngine().events.dispatchEvent(new RoomZoomEvent(roomSession.roomId, 1, false)); - } + GetEventDispatcher().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); + (async () => + { + const image = new Image(); + + image.src = await TextureUtils.generateImageUrl(texture); + + const newWindow = window.open(''); + newWindow.document.write(image.outerHTML); + })(); return null; case ':pickall': if(roomSession.isRoomOwner || GetSessionDataManager().isModerator) @@ -138,14 +131,14 @@ const useChatInputWidgetState = () => { GetSessionDataManager().sendSpecialCommandMessage(':pickall'); }, - null, null, null, LocalizeText('generic.alert.title'), null, 'pickall'); + null, null, null, LocalizeText('generic.alert.title')); } return null; case ':ejectall': - if (roomSession.isRoomOwner || GetSessionDataManager().isModerator || roomSession.controllerLevel >= RoomControllerLevel.GUEST) + if(roomSession.isRoomOwner || GetSessionDataManager().isModerator || roomSession.controllerLevel >= RoomControllerLevel.GUEST) { - showConfirm(LocalizeText('room.confirm.eject_all'), () => + showConfirm(LocalizeText('room.confirm.eject_all'), () => { GetSessionDataManager().sendSpecialCommandMessage(':ejectall'); }, @@ -161,11 +154,11 @@ const useChatInputWidgetState = () => case ':floor': case ':bcfloor': if(roomSession.controllerLevel >= RoomControllerLevel.ROOM_OWNER) CreateLinkEvent('floor-editor/show'); - + return null; case ':togglefps': { if(GetTicker().maxFPS > 0) GetTicker().maxFPS = 0; - else GetTicker().maxFPS = GetConfiguration('system.animation.fps'); + else GetTicker().maxFPS = GetConfigurationValue('system.animation.fps'); return null; } @@ -187,18 +180,18 @@ const useChatInputWidgetState = () => switch(chatType) { case ChatMessageTypeEnum.CHAT_DEFAULT: - roomSession.sendChatMessage(text, styleId, chatColour); + roomSession.sendChatMessage(text, styleId); break; case ChatMessageTypeEnum.CHAT_SHOUT: - roomSession.sendShoutMessage(text, styleId, chatColour); + roomSession.sendShoutMessage(text, styleId); break; case ChatMessageTypeEnum.CHAT_WHISPER: roomSession.sendWhisperMessage(recipientName, text, styleId); break; } - } + }; - useRoomSessionManagerEvent(RoomSessionChatEvent.FLOOD_EVENT, event => + useNitroEvent(RoomSessionChatEvent.FLOOD_EVENT, event => { setFloodBlocked(true); setFloodBlockedSeconds(parseFloat(event.message)); @@ -215,7 +208,7 @@ const useChatInputWidgetState = () => setSelectedUsername(userData.name); }); - useRoomEngineEvent(RoomEngineObjectEvent.DESELECTED, event => setSelectedUsername('')); + useNitroEvent(RoomEngineObjectEvent.DESELECTED, event => setSelectedUsername('')); useEffect(() => { @@ -223,7 +216,7 @@ const useChatInputWidgetState = () => let seconds = 0; - const interval = window.setInterval(() => + const interval = setInterval(() => { setFloodBlockedSeconds(prevValue => { @@ -254,7 +247,7 @@ const useChatInputWidgetState = () => timeout = setTimeout(() => { setIsIdle(false); - setIsTyping(false) + setIsTyping(false); }, 10000); } @@ -284,6 +277,6 @@ const useChatInputWidgetState = () => }, [ 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 index 7bc8248..fa59fe0 100644 --- a/src/hooks/rooms/widgets/useChatWidget.ts +++ b/src/hooks/rooms/widgets/useChatWidget.ts @@ -1,18 +1,14 @@ -import { AvatarFigurePartType, AvatarScaleType, AvatarSetType, GetGuestRoomResultEvent, NitroPoint, PetFigureData, RoomChatSettings, RoomChatSettingsEvent, RoomDragEvent, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionChatEvent, RoomUserData, SystemChatStyleEnum, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; +import { GetGuestRoomResultEvent, GetRoomEngine, PetFigureData, RoomChatSettings, RoomChatSettingsEvent, RoomDragEvent, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionChatEvent, RoomUserData, SystemChatStyleEnum } from '@nitrots/nitro-renderer'; import { useEffect, useMemo, useRef, useState } from 'react'; -import { ChatBubbleMessage, ChatEntryType, ChatHistoryCurrentDate, GetAvatarRenderManager, GetConfiguration, GetRoomEngine, GetRoomObjectScreenLocation, IRoomChatSettings, LocalizeText, PlaySound, RoomChatFormatter } from '../../../api'; -import { useMessageEvent, useRoomEngineEvent, useRoomSessionManagerEvent } from '../../events'; +import { ChatBubbleMessage, ChatBubbleUtilities, ChatEntryType, ChatHistoryCurrentDate, GetConfigurationValue, GetRoomObjectScreenLocation, IRoomChatSettings, LocalizeText, PlaySound, RoomChatFormatter } from '../../../api'; +import { useMessageEvent, useNitroEvent } from '../../events'; import { useRoom } from '../useRoom'; import { useChatHistory } from './../../chat-history'; -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({ + 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, @@ -36,69 +32,12 @@ const useChatWidgetState = () => case RoomChatSettings.CHAT_SCROLL_SPEED_SLOW: return 12000; } - }, [ chatSettings ]); + }, [chatSettings]); - const setFigureImage = (figure: string) => + useNitroEvent(RoomSessionChatEvent.CHAT_EVENT, async event => { - 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; - } - - 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 roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, RoomObjectCategory.UNIT); + const bubbleLocation = roomObject ? GetRoomObjectScreenLocation(roomSession.roomId, roomObject?.id, RoomObjectCategory.UNIT) : { x: 0, y: 0 }; const userData = roomObject ? roomSession.userDataManager.getUserDataByIndex(event.objectId) : new RoomUserData(-1); let username = ''; @@ -109,9 +48,8 @@ const useChatWidgetState = () => let userType = 0; let petType = -1; let text = event.message; - let chatColours = event._chatColours - - if(userData) + + if(userData) { userType = userData.type; @@ -120,30 +58,28 @@ const useChatWidgetState = () => switch(userType) { case RoomObjectType.PET: - imageUrl = getPetImage(figure, 2, true, 64, roomObject.model.getValue(RoomObjectVariable.FIGURE_POSTURE)); + imageUrl = await ChatBubbleUtilities.getPetImage(figure, 2, true, 64, roomObject.model.getValue(RoomObjectVariable.FIGURE_POSTURE)); petType = new PetFigureData(figure).typeId; - chatColours = "black" break; case RoomObjectType.USER: - imageUrl = getUserImage(figure); + imageUrl = await ChatBubbleUtilities.getUserImage(figure); break; case RoomObjectType.RENTABLE_BOT: case RoomObjectType.BOT: styleId = SystemChatStyleEnum.BOT; - chatColours = "black" break; } - avatarColor = avatarColorCache.get(figure); + avatarColor = ChatBubbleUtilities.AVATAR_COLOR_CACHE.get(figure); username = userData.name; } switch(chatType) { case RoomSessionChatEvent.CHAT_TYPE_RESPECT: - text = LocalizeText('widgets.chatbubble.respect', [ 'username' ], [ username ]); + text = LocalizeText('widgets.chatbubble.respect', ['username'], [username]); - if(GetConfiguration('respect.options')['enabled']) PlaySound(GetConfiguration('respect.options')['sound']); + if(GetConfigurationValue('respect.options')['enabled']) PlaySound(GetConfigurationValue('respect.options')['sound']); break; case RoomSessionChatEvent.CHAT_TYPE_PETREVIVE: @@ -172,31 +108,31 @@ const useChatWidgetState = () => if(newUserData) targetUserName = newUserData.name; } - text = LocalizeText(textKey, [ 'petName', 'userName' ], [ username, targetUserName ]); + text = LocalizeText(textKey, ['petName', 'userName'], [username, targetUserName]); break; } case RoomSessionChatEvent.CHAT_TYPE_PETRESPECT: - text = LocalizeText('widget.chatbubble.petrespect', [ 'petname' ], [ username ]); + text = LocalizeText('widget.chatbubble.petrespect', ['petname'], [username]); break; case RoomSessionChatEvent.CHAT_TYPE_PETTREAT: - text = LocalizeText('widget.chatbubble.pettreat', [ 'petname' ], [ username ]); + 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)) ]); + 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 ]); + text = LocalizeText('widget.chatbubble.mutetime', ['hours', 'minutes', 'seconds'], [hours, minutes, seconds]); break; } } const formattedText = RoomChatFormatter(text); const color = (avatarColor && (('#' + (avatarColor.toString(16).padStart(6, '0'))) || null)); - + const chatMessage = new ChatBubbleMessage( userData.roomIndex, RoomObjectCategory.UNIT, @@ -204,18 +140,17 @@ const useChatWidgetState = () => text, formattedText, username, - new NitroPoint(bubbleLocation.x, bubbleLocation.y), + { x: bubbleLocation.x, y: bubbleLocation.y }, chatType, styleId, imageUrl, - color, - chatColours); + color); - setChatMessages(prevValue => [ ...prevValue, chatMessage ]); - addChatEntry({ id: -1, webId: userData.webID, entityId: userData.roomIndex, name: username, imageUrl, style: styleId, chatType: chatType, entityType: userData.type, message: formattedText, timestamp: ChatHistoryCurrentDate(), type: ChatEntryType.TYPE_CHAT, roomId: roomSession.roomId, color, chatColours }); + setChatMessages(prevValue => [...prevValue, chatMessage]); + addChatEntry({ id: -1, webId: userData.webID, entityId: userData.roomIndex, name: username, imageUrl, style: styleId, chatType: chatType, entityType: userData.type, message: formattedText, timestamp: ChatHistoryCurrentDate(), type: ChatEntryType.TYPE_CHAT, roomId: roomSession.roomId, color }); }); - useRoomEngineEvent(RoomDragEvent.ROOM_DRAG, event => + useNitroEvent(RoomDragEvent.ROOM_DRAG, event => { if(!chatMessages.length || (event.roomId !== roomSession.roomId)) return; @@ -229,14 +164,14 @@ const useChatWidgetState = () => const parser = event.getParser(); if(!parser.roomEnter) return; - + setChatSettings(parser.chat); }); useMessageEvent(RoomChatSettingsEvent, event => { const parser = event.getParser(); - + setChatSettings(parser.chat); }); @@ -247,10 +182,10 @@ const useChatWidgetState = () => return () => { isDisposed.current = true; - } + }; }, []); return { chatMessages, setChatMessages, chatSettings, getScrollSpeed }; -} +}; -export const useChatWidget = useChatWidgetState; \ No newline at end of file +export const useChatWidget = useChatWidgetState; diff --git a/src/hooks/rooms/widgets/useDoorbellWidget.ts b/src/hooks/rooms/widgets/useDoorbellWidget.ts index 4ae5142..4a90e7b 100644 --- a/src/hooks/rooms/widgets/useDoorbellWidget.ts +++ b/src/hooks/rooms/widgets/useDoorbellWidget.ts @@ -1,7 +1,7 @@ import { RoomSessionDoorbellEvent } from '@nitrots/nitro-renderer'; import { useState } from 'react'; import { GetRoomSession } from '../../../api'; -import { useRoomSessionManagerEvent } from '../../events'; +import { useNitroEvent } from '../../events'; const useDoorbellWidgetState = () => { @@ -12,7 +12,7 @@ const useDoorbellWidgetState = () => if(users.indexOf(userName) >= 0) return; setUsers([ ...users, userName ]); - } + }; const removeUser = (userName: string) => { @@ -25,20 +25,20 @@ const useDoorbellWidgetState = () => 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)); + useNitroEvent(RoomSessionDoorbellEvent.DOORBELL, event => addUser(event.userName)); + useNitroEvent(RoomSessionDoorbellEvent.RSDE_REJECTED, event => removeUser(event.userName)); + useNitroEvent(RoomSessionDoorbellEvent.RSDE_ACCEPTED, event => removeUser(event.userName)); return { users, addUser, removeUser, answer }; -} +}; export const useDoorbellWidget = useDoorbellWidgetState; diff --git a/src/hooks/rooms/widgets/useFilterWordsWidget.ts b/src/hooks/rooms/widgets/useFilterWordsWidget.ts index 3811682..460e4bd 100644 --- a/src/hooks/rooms/widgets/useFilterWordsWidget.ts +++ b/src/hooks/rooms/widgets/useFilterWordsWidget.ts @@ -18,6 +18,6 @@ const useFilterWordsWidgetState = () => }); return { wordsFilter, isVisible, setWordsFilter, onClose }; -} +}; export const useFilterWordsWidget = useFilterWordsWidgetState; diff --git a/src/hooks/rooms/widgets/useFriendRequestWidget.ts b/src/hooks/rooms/widgets/useFriendRequestWidget.ts index 82bf6a2..22324d5 100644 --- a/src/hooks/rooms/widgets/useFriendRequestWidget.ts +++ b/src/hooks/rooms/widgets/useFriendRequestWidget.ts @@ -23,7 +23,7 @@ const useFriendRequestWidgetState = () => return newValue; }); - } + }; useUserAddedEvent(true, event => { @@ -32,7 +32,7 @@ const useFriendRequestWidgetState = () => 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; @@ -76,6 +76,6 @@ const useFriendRequestWidgetState = () => }, [ requests ]); return { displayedRequests, hideFriendRequest }; -} +}; export const useFriendRequestWidget = useFriendRequestWidgetState; diff --git a/src/hooks/rooms/widgets/useFurniChooserWidget.ts b/src/hooks/rooms/widgets/useFurniChooserWidget.ts index 4542dba..f3c7a3c 100644 --- a/src/hooks/rooms/widgets/useFurniChooserWidget.ts +++ b/src/hooks/rooms/widgets/useFurniChooserWidget.ts @@ -1,6 +1,6 @@ -import { RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, GetSessionDataManager, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine, GetRoomSession, GetSessionDataManager, LocalizeText, RoomObjectItem } from '../../../api'; +import { GetRoomSession, LocalizeText, RoomObjectItem } from '../../../api'; import { useFurniAddedEvent, useFurniRemovedEvent } from '../engine'; import { useRoom } from '../useRoom'; @@ -55,7 +55,7 @@ const useFurniChooserWidgetState = () => }); setItems([ ...wallItems, ...floorItems ].sort((a, b) => ((a.name < b.name) ? -1 : 1))); - } + }; useFurniAddedEvent(!!items, event => { @@ -127,6 +127,6 @@ const useFurniChooserWidgetState = () => }); return { items, onClose, selectItem, populateChooser }; -} +}; export const useFurniChooserWidget = useFurniChooserWidgetState; diff --git a/src/hooks/rooms/widgets/usePetPackageWidget.ts b/src/hooks/rooms/widgets/usePetPackageWidget.ts index 55b0c3a..0fb933b 100644 --- a/src/hooks/rooms/widgets/usePetPackageWidget.ts +++ b/src/hooks/rooms/widgets/usePetPackageWidget.ts @@ -1,7 +1,7 @@ -import { OpenPetPackageMessageComposer, RoomObjectCategory, RoomSessionPetPackageEvent } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, OpenPetPackageMessageComposer, RoomObjectCategory, RoomSessionPetPackageEvent } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine, LocalizeText, SendMessageComposer } from '../../../api'; -import { useRoomSessionManagerEvent } from '../../events'; +import { LocalizeText, SendMessageComposer } from '../../../api'; +import { useNitroEvent } from '../../events'; const usePetPackageWidgetState = () => { @@ -10,7 +10,7 @@ const usePetPackageWidgetState = () => const [ objectType, setObjectType ] = useState(''); const [ petName, setPetName ] = useState(''); const [ errorResult, setErrorResult ] = useState(''); - + const onClose = () => { setErrorResult(''); @@ -18,23 +18,23 @@ const usePetPackageWidgetState = () => setObjectType(''); setObjectId(-1); setIsVisible(false); - } + }; const onConfirm = () => { SendMessageComposer(new OpenPetPackageMessageComposer(objectId, petName)); - } + }; const onChangePetName = (petName: string) => { setPetName(petName); - if (errorResult.length > 0) setErrorResult(''); - } + if(errorResult.length > 0) setErrorResult(''); + }; const getErrorResultForCode = (errorCode: number) => { - if (!errorCode || errorCode === 0) return; - + if(!errorCode || errorCode === 0) return; + switch(errorCode) { case 1: @@ -47,29 +47,29 @@ const usePetPackageWidgetState = () => default: return LocalizeText('catalog.alert.petname.bobba'); } - } + }; - useRoomSessionManagerEvent(RoomSessionPetPackageEvent.RSOPPE_OPEN_PET_PACKAGE_REQUESTED, event => + useNitroEvent(RoomSessionPetPackageEvent.RSOPPE_OPEN_PET_PACKAGE_REQUESTED, event => { - if (!event) return; + if(!event) return; const roomObject = GetRoomEngine().getRoomObject(event.session.roomId, event.objectId, RoomObjectCategory.FLOOR); - + setObjectId(event.objectId); setObjectType(roomObject.type); setIsVisible(true); }); - useRoomSessionManagerEvent(RoomSessionPetPackageEvent.RSOPPE_OPEN_PET_PACKAGE_RESULT, event => + useNitroEvent(RoomSessionPetPackageEvent.RSOPPE_OPEN_PET_PACKAGE_RESULT, event => { - if (!event) return; + if(!event) return; - if (event.nameValidationStatus === 0) onClose(); - - if (event.nameValidationStatus !== 0) setErrorResult(getErrorResultForCode(event.nameValidationStatus)); + if(event.nameValidationStatus === 0) onClose(); + + if(event.nameValidationStatus !== 0) setErrorResult(getErrorResultForCode(event.nameValidationStatus)); }); return { isVisible, errorResult, petName, objectType, onChangePetName, onConfirm, onClose }; -} +}; export const usePetPackageWidget = usePetPackageWidgetState; diff --git a/src/hooks/rooms/widgets/usePollWidget.ts b/src/hooks/rooms/widgets/usePollWidget.ts index 138a56e..95d9d9c 100644 --- a/src/hooks/rooms/widgets/usePollWidget.ts +++ b/src/hooks/rooms/widgets/usePollWidget.ts @@ -1,6 +1,6 @@ import { RoomSessionPollEvent } from '@nitrots/nitro-renderer'; import { DispatchUiEvent, RoomWidgetPollUpdateEvent } from '../../../api'; -import { useRoomSessionManagerEvent } from '../../events'; +import { useNitroEvent } from '../../events'; import { useRoom } from '../useRoom'; const usePollWidgetState = () => @@ -13,7 +13,7 @@ const usePollWidgetState = () => const answerPoll = (pollId: number, questionId: number, answers: string[]) => roomSession.sendPollAnswerMessage(pollId, questionId, answers); - useRoomSessionManagerEvent(RoomSessionPollEvent.OFFER, event => + useNitroEvent(RoomSessionPollEvent.OFFER, event => { const pollEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.OFFER, event.id); @@ -23,7 +23,7 @@ const usePollWidgetState = () => DispatchUiEvent(pollEvent); }); - useRoomSessionManagerEvent(RoomSessionPollEvent.ERROR, event => + useNitroEvent(RoomSessionPollEvent.ERROR, event => { const pollEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.ERROR, event.id); @@ -33,7 +33,7 @@ const usePollWidgetState = () => DispatchUiEvent(pollEvent); }); - useRoomSessionManagerEvent(RoomSessionPollEvent.CONTENT, event => + useNitroEvent(RoomSessionPollEvent.CONTENT, event => { const pollEvent = new RoomWidgetPollUpdateEvent(RoomWidgetPollUpdateEvent.CONTENT, event.id); @@ -47,6 +47,6 @@ const usePollWidgetState = () => }); return { startPoll, rejectPoll, answerPoll }; -} +}; export const usePollWidget = usePollWidgetState; diff --git a/src/hooks/rooms/widgets/useUserChooserWidget.ts b/src/hooks/rooms/widgets/useUserChooserWidget.ts index 857922a..40fcde8 100644 --- a/src/hooks/rooms/widgets/useUserChooserWidget.ts +++ b/src/hooks/rooms/widgets/useUserChooserWidget.ts @@ -1,6 +1,6 @@ -import { RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { useState } from 'react'; -import { GetRoomEngine, GetRoomSession, RoomObjectItem } from '../../../api'; +import { GetRoomSession, RoomObjectItem } from '../../../api'; import { useUserAddedEvent, useUserRemovedEvent } from '../engine'; import { useRoom } from '../useRoom'; @@ -22,7 +22,7 @@ const useUserChooserWidgetState = () => .map(roomObject => { if(roomObject.id < 0) return null; - + const userData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); if(!userData) return null; @@ -30,7 +30,7 @@ const useUserChooserWidgetState = () => return new RoomObjectItem(userData.roomIndex, RoomObjectCategory.UNIT, userData.name); }) .sort((a, b) => ((a.name < b.name) ? -1 : 1))); - } + }; useUserAddedEvent(!!items, event => { @@ -75,6 +75,6 @@ const useUserChooserWidgetState = () => }); 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 index 3c5f5ac..2074cf2 100644 --- a/src/hooks/rooms/widgets/useWordQuizWidget.ts +++ b/src/hooks/rooms/widgets/useWordQuizWidget.ts @@ -1,7 +1,7 @@ -import { AvatarAction, IQuestion, RoomSessionWordQuizEvent } from '@nitrots/nitro-renderer'; +import { AvatarAction, GetRoomEngine, IQuestion, RoomSessionWordQuizEvent } from '@nitrots/nitro-renderer'; import { useEffect, useState } from 'react'; -import { GetRoomEngine, VoteValue } from '../../../api'; -import { useRoomSessionManagerEvent } from '../../events'; +import { VoteValue } from '../../../api'; +import { useNitroEvent } from '../../events'; import { useRoom } from '../useRoom'; import { usePollWidget } from './usePollWidget'; @@ -23,7 +23,7 @@ const useWordQuizWidgetState = () => { setPollId(-1); setQuestion(null); - } + }; const vote = (vote: string) => { @@ -32,9 +32,9 @@ const useWordQuizWidgetState = () => answerPoll(pollId, question.id, [ vote ]); setAnswerSent(true); - } + }; - useRoomSessionManagerEvent(RoomSessionWordQuizEvent.ANSWERED, event => + useNitroEvent(RoomSessionWordQuizEvent.ANSWERED, event => { const userData = roomSession.userDataManager.getUserData(event.userId); @@ -59,7 +59,7 @@ const useWordQuizWidgetState = () => GetRoomEngine().updateRoomObjectUserGesture(roomSession.roomId, userData.roomIndex, AvatarAction.getGestureId((event.value === '0') ? AvatarAction.GESTURE_SAD : AvatarAction.GESTURE_SMILE)); }); - useRoomSessionManagerEvent(RoomSessionWordQuizEvent.FINISHED, event => + useNitroEvent(RoomSessionWordQuizEvent.FINISHED, event => { if(question && (question.id === event.questionId)) { @@ -77,7 +77,7 @@ const useWordQuizWidgetState = () => setUserAnswers(new Map()); }); - useRoomSessionManagerEvent(RoomSessionWordQuizEvent.QUESTION, event => + useNitroEvent(RoomSessionWordQuizEvent.QUESTION, event => { setPollId(event.id); setQuestion(event.question); @@ -123,7 +123,7 @@ const useWordQuizWidgetState = () => return copy; }); - } + }; const interval = setInterval(() => checkSignFade(), 1000); @@ -140,10 +140,10 @@ const useWordQuizWidgetState = () => return null; }); - } + }; }, []); return { question, answerSent, answerCounts, userAnswers, vote }; -} +}; export const useWordQuizWidget = useWordQuizWidgetState; diff --git a/src/hooks/session/useSessionInfo.ts b/src/hooks/session/useSessionInfo.ts index d270976..9959698 100644 --- a/src/hooks/session/useSessionInfo.ts +++ b/src/hooks/session/useSessionInfo.ts @@ -1,45 +1,37 @@ -import { FigureUpdateEvent, RoomUnitChatStyleComposer, UserInfoDataParser, UserInfoEvent } from '@nitrots/nitro-renderer'; -import { useEffect, useState } from 'react'; +import { FigureUpdateEvent, GetSessionDataManager, RoomUnitChatStyleComposer, UserInfoDataParser, UserInfoEvent, UserSettingsEvent } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; import { useBetween } from 'use-between'; -import { GetLocalStorage, GetSessionDataManager, SendMessageComposer } from '../../api'; +import { SendMessageComposer } from '../../api'; import { useMessageEvent } from '../events'; -import { useLocalStorage } from '../useLocalStorage'; const useSessionInfoState = () => { const [ userInfo, setUserInfo ] = useState(null); const [ userFigure, setUserFigure ] = useState(null); - const [ chatStyleId, setChatStyleId ] = useLocalStorage('chatStyleId', 0); - const [ chatColour, setChatColour ] = useLocalStorage('chatColour', ''); + const [ chatStyleId, setChatStyleId ] = useState(0); const [ userRespectRemaining, setUserRespectRemaining ] = useState(0); const [ petRespectRemaining, setPetRespectRemaining ] = useState(0); - const [ screenSize, setScreenSize ] = useLocalStorage('nitroScreensize', { width: window.innerWidth, height: window.innerHeight }); const updateChatStyleId = (styleId: number) => { setChatStyleId(styleId); SendMessageComposer(new RoomUnitChatStyleComposer(styleId)); - } - - const updateChatColour = (colour: string) => - { - setChatColour(colour); - } + }; const respectUser = (userId: number) => { GetSessionDataManager().giveRespect(userId); setUserRespectRemaining(GetSessionDataManager().respectsLeft); - } + }; const respectPet = (petId: number) => { GetSessionDataManager().givePetRespect(petId); setPetRespectRemaining(GetSessionDataManager().respectsPetLeft); - } + }; useMessageEvent(UserInfoEvent, event => { @@ -50,7 +42,7 @@ const useSessionInfoState = () => setUserRespectRemaining(parser.userInfo.respectsRemaining); setPetRespectRemaining(parser.userInfo.respectsPetRemaining); }); - + useMessageEvent(FigureUpdateEvent, event => { const parser = event.getParser(); @@ -58,35 +50,14 @@ const useSessionInfoState = () => setUserFigure(parser.figure); }); - useEffect(() => + useMessageEvent(UserSettingsEvent, event => { - const currentScreenSize = <{ width: number, height: number }>GetLocalStorage('nitroScreensize'); + const parser = event.getParser(); - if(currentScreenSize && ((currentScreenSize.width !== window.innerWidth) || (currentScreenSize.height !== window.innerHeight))) - { - let i = window.localStorage.length; + setChatStyleId(parser.chatType); + }); - while(i > 0) - { - const key = window.localStorage.key(i); - - if(key && key.startsWith('nitro.window')) window.localStorage.removeItem(key); - - i--; - } - } - - const onResize = (event: UIEvent) => setScreenSize({ width: window.innerWidth, height: window.innerHeight }); - - window.addEventListener('resize', onResize); - - return () => - { - window.removeEventListener('resize', onResize); - } - }, [ setScreenSize ]); - - return { userInfo, userFigure, chatStyleId, userRespectRemaining, petRespectRemaining, respectUser, respectPet, updateChatStyleId, updateChatColour, chatColour }; -} + return { userInfo, userFigure, chatStyleId, userRespectRemaining, petRespectRemaining, respectUser, respectPet, updateChatStyleId }; +}; export const useSessionInfo = () => useBetween(useSessionInfoState); diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts index 62576e8..6282300 100644 --- a/src/hooks/useLocalStorage.ts +++ b/src/hooks/useLocalStorage.ts @@ -2,21 +2,20 @@ import { NitroLogger } from '@nitrots/nitro-renderer'; import { Dispatch, SetStateAction, useState } from 'react'; import { GetLocalStorage, SetLocalStorage } from '../api'; -const userId = new URLSearchParams(window.location.search).get('userid') || 0; - const useLocalStorageState = (key: string, initialValue: T): [ T, Dispatch>] => { - key = userId ? `${ key }.${ userId }` : key; - const [ storedValue, setStoredValue ] = useState(() => { + if(typeof window === 'undefined') return initialValue; + try { - const item = typeof window !== 'undefined' ? GetLocalStorage(key) as T : undefined; + const item = GetLocalStorage(key); + return item ?? initialValue; } - catch(error) + catch (error) { return initialValue; } @@ -33,13 +32,13 @@ const useLocalStorageState = (key: string, initialValue: T): [ T, Dispatch -{ - const { showConfirm = null } = useNotification(); - - const onClickChat = (event: React.MouseEvent) => - { - if (event.target instanceof HTMLAnchorElement && event.target.href) - { - event.stopPropagation(); - event.preventDefault(); - - const url = event.target.href; - if (url.includes('youtube.com') || url.includes('youtu.be')) - { - const videoCode = extractVideoCode(url); - if (videoCode) - { - CreateLinkEvent('youtube-tv/show/' + videoCode) - } - } - else - { - showConfirm(LocalizeText('chat.confirm.openurl', [ 'url' ], [ url ]), () => - { - window.open(url, '_blank'); - }, - null, null, null, LocalizeText('generic.alert.title'), null, 'link'); - } - } - } - - const extractVideoCode = (url: string): string | null => - { - const regex = /(?:http:\/\/|https:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?.*v=|shorts\/)?([a-zA-Z0-9_-]{11})/; - const match = url.match(regex); - - return match ? match[1] : null; - } - - - return { onClickChat } -} - -export const useOnClickChat = () => useBetween(useOnClickChatState); diff --git a/src/hooks/useSharedVisibility.ts b/src/hooks/useSharedVisibility.ts index b55855b..6307264 100644 --- a/src/hooks/useSharedVisibility.ts +++ b/src/hooks/useSharedVisibility.ts @@ -41,4 +41,4 @@ export const useSharedVisibility = () => }, []); return { isVisible, activate, deactivate }; -} +}; diff --git a/src/hooks/wired/useWired.ts b/src/hooks/wired/useWired.ts index 724d59b..dca79e0 100644 --- a/src/hooks/wired/useWired.ts +++ b/src/hooks/wired/useWired.ts @@ -1,4 +1,4 @@ -import { ConditionDefinition, Triggerable, TriggerDefinition, UpdateActionMessageComposer, UpdateConditionMessageComposer, UpdateTriggerMessageComposer, WiredActionDefinition, WiredFurniActionEvent, WiredFurniConditionEvent, WiredFurniTriggerEvent, WiredSaveSuccessEvent } from '@nitrots/nitro-renderer'; +import { ConditionDefinition, OpenMessageComposer, Triggerable, TriggerDefinition, UpdateActionMessageComposer, UpdateConditionMessageComposer, UpdateTriggerMessageComposer, WiredActionDefinition, WiredFurniActionEvent, WiredFurniConditionEvent, WiredFurniTriggerEvent, WiredOpenEvent, WiredSaveSuccessEvent } from '@nitrots/nitro-renderer'; import { useEffect, useState } from 'react'; import { useBetween } from 'use-between'; import { IsOwnerOfFloorFurniture, LocalizeText, SendMessageComposer, WiredFurniType, WiredSelectionVisualizer } from '../../api'; @@ -13,8 +13,7 @@ const useWiredState = () => const [ furniIds, setFurniIds ] = useState([]); const [ actionDelay, setActionDelay ] = useState(0); const [ allowsFurni, setAllowsFurni ] = useState(WiredFurniType.STUFF_SELECTION_OPTION_NONE); - const [ maxItemSelectionCount, setMaxItemSelectionCount ] = useState(5); - const { showConfirm } = useNotification(); + const { showConfirm = null } = useNotification(); const saveWired = () => { @@ -36,20 +35,20 @@ const useWiredState = () => { SendMessageComposer(new UpdateConditionMessageComposer(trigger.id, intParams, stringParam, furniIds, trigger.stuffTypeSelectionCode)); } - } + }; if(!IsOwnerOfFloorFurniture(trigger.id)) { showConfirm(LocalizeText('wiredfurni.nonowner.change.confirm.body'), () => { - save(trigger) + save(trigger); }, null, null, null, LocalizeText('wiredfurni.nonowner.change.confirm.title')); } else { save(trigger); } - } + }; const selectObjectForWired = (objectId: number, category: number) => { @@ -70,7 +69,7 @@ const useWiredState = () => WiredSelectionVisualizer.hide(objectId); } - else if(newFurniIds.length < maxItemSelectionCount) + else if(newFurniIds.length < trigger.maximumItemSelectionCount) { newFurniIds.push(objectId); @@ -79,7 +78,14 @@ const useWiredState = () => return newFurniIds; }); - } + }; + + useMessageEvent(WiredOpenEvent, event => + { + const parser = event.getParser(); + + SendMessageComposer(new OpenMessageComposer(parser.stuffId)); + }); useMessageEvent(WiredSaveSuccessEvent, event => { @@ -121,14 +127,14 @@ const useWiredState = () => setFurniIds(prevValue => { if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); - + return []; }); setAllowsFurni(WiredFurniType.STUFF_SELECTION_OPTION_NONE); - } + }; }, [ trigger ]); - return { trigger, setTrigger, intParams, setIntParams, stringParam, setStringParam, furniIds, setFurniIds, actionDelay, setActionDelay, setAllowsFurni, saveWired, selectObjectForWired, maxItemSelectionCount, setMaxItemSelectionCount }; -} + return { trigger, setTrigger, intParams, setIntParams, stringParam, setStringParam, furniIds, setFurniIds, actionDelay, setActionDelay, setAllowsFurni, saveWired, selectObjectForWired }; +}; -export const useWired = () => useBetween(useWiredState); \ No newline at end of file +export const useWired = () => useBetween(useWiredState); diff --git a/src/index.tsx b/src/index.tsx index 196309d..e90c1f9 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,5 +1,8 @@ import { createRoot } from 'react-dom/client'; import { App } from './App'; -import './index.scss'; +import './css/chats.css'; +import './css/index.css'; +import './css/loading.css'; +import './css/PurseView.css'; createRoot(document.getElementById('root')).render(); diff --git a/src/layout/InfiniteGrid.tsx b/src/layout/InfiniteGrid.tsx new file mode 100644 index 0000000..0937c1c --- /dev/null +++ b/src/layout/InfiniteGrid.tsx @@ -0,0 +1,185 @@ +import { useVirtualizer } from '@tanstack/react-virtual'; +import { DetailedHTMLProps, Fragment, HTMLAttributes, ReactElement, forwardRef, useEffect, useRef, useState } from 'react'; +import { classNames } from './classNames'; +import { NitroLimitedEditionStyledNumberView } from './limited-edition'; +import { styleNames } from './styleNames'; + +type Props = { + items: T[]; + columnCount: number; + overscan?: number; + estimateSize?: number; + itemRender?: (item: T, index?: number) => ReactElement; +} + +const InfiniteGridRoot = (props: Props) => +{ + const { items = [], columnCount = 4, overscan = 5, estimateSize = 45, itemRender = null } = props; + const parentRef = useRef(null); + + const virtualizer = useVirtualizer({ + count: Math.ceil(items.length / columnCount), + overscan, + getScrollElement: () => parentRef.current, + estimateSize: () => estimateSize + }); + + useEffect(() => + { + const element = parentRef.current; + + if(!element || !items) return; + + const checkAndApplyPadding = () => + { + if(!element) return; + + element.style.paddingRight = (element.scrollHeight > element.clientHeight) ? '0.25rem' : '0'; + }; + + checkAndApplyPadding(); + + window.addEventListener('resize', checkAndApplyPadding); + + return () => + { + window.removeEventListener('resize', checkAndApplyPadding); + }; + }, [ items ]); + + useEffect(() => + { + if(!items || !items.length) return; + + virtualizer.scrollToIndex(0); + }, [ items, virtualizer ]); + + const virtualItems = virtualizer.getVirtualItems(); + + return ( +
+
+ { virtualItems.map(virtualRow => ( +
+ { Array.from(Array(columnCount)).map((e, i) => + { + const item = items[i + (virtualRow.index * columnCount)]; + + if(!item) return ; + + return ( + + { itemRender(item, i) } + + ); + }) } +
+ )) } +
+
+ ); +}; + +const InfiniteGridItem = forwardRef, HTMLDivElement>>((props, ref) => +{ + const { itemImage = undefined, itemColor = undefined, itemActive = false, itemCount = 1, itemCountMinimum = 1, itemUniqueSoldout = false, itemUniqueNumber = -2, itemUnseen = false, itemHighlight = false, disabled = false, className = null, style = {}, children = null, ...rest } = props; + const [ backgroundImageUrl, setBackgroundImageUrl ] = useState(null); + const disposed = useRef(false); + + useEffect(() => + { + if(!itemImage || !itemImage.length) return; + + const image = new Image(); + + image.onload = () => + { + if(disposed.current) return; + + setBackgroundImageUrl(image.src); + }; + + image.src = itemImage; + }, [ itemImage ]); + + useEffect(() => + { + disposed.current = false; + + return () => + { + disposed.current = true; + }; + }, []); + + return ( +
0)) && 'unique-item', + itemUniqueSoldout && 'sold-out', + itemUnseen && ' bg-green-500 bg-opacity-40', + className + ) } + style={ styleNames( + backgroundImageUrl && backgroundImageUrl.length && !(itemUniqueSoldout || (itemUniqueNumber > 0)) && { + backgroundImage: `url(${ backgroundImageUrl })` + }, + itemColor && { + backgroundColor: itemColor + }, + style + ) } + { ...rest }> + { (itemCount > itemCountMinimum) && +
{ itemCount }
} + { (itemUniqueNumber > 0) && + <> +
+
+ +
+ } + { children } +
+ ); +}); + +InfiniteGridItem.displayName = 'InfiniteGridItem'; + +export const InfiniteGrid = Object.assign(InfiniteGridRoot, { + Item: InfiniteGridItem +}); diff --git a/src/layout/NitroButton.tsx b/src/layout/NitroButton.tsx new file mode 100644 index 0000000..937f2be --- /dev/null +++ b/src/layout/NitroButton.tsx @@ -0,0 +1,44 @@ +import { ButtonHTMLAttributes, DetailedHTMLProps, forwardRef, PropsWithChildren } from 'react'; +import { classNames } from './classNames'; + +const classes = { + base: 'inline-flex justify-center items-center gap-2 transition-[background-color] duration-300 transform tracking-wide rounded-md', + disabled: '', + size: { + default: 'px-2 py-0.5 font-medium', + lg: 'px-5 py-3 text-base font-medium', + xl: 'px-6 py-3.5 text-base font-medium', + }, + outline: { + default: 'text-blue-700 hover:text-white border border-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 dark:border-blue-500 dark:text-blue-500 dark:hover:text-white dark:hover:bg-blue-600 dark:focus:ring-blue-800' + }, + color: { + default: 'bg-button-gradient-gray border border-gray-500', + } +}; + +export const NitroButton = forwardRef & DetailedHTMLProps, HTMLButtonElement>>((props, ref) => +{ + const { color = 'default', size = 'default', outline = false, disabled = false, type = 'button', className = null, ...rest } = props; + + return ( +