From fc48fd199e9b0c004a22c807e4f707e56842dd3a Mon Sep 17 00:00:00 2001 From: Andrew Snaith Date: Tue, 16 Nov 2021 01:50:09 -0800 Subject: [PATCH 01/44] add template for pull requests (#1751) Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> --- .../ISSUE_TEMPLATE/pull_request_template.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/pull_request_template.md diff --git a/.github/ISSUE_TEMPLATE/pull_request_template.md b/.github/ISSUE_TEMPLATE/pull_request_template.md new file mode 100644 index 0000000000..1f16343693 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/pull_request_template.md @@ -0,0 +1,19 @@ +closes # + +--- + +Submission checklist: + +> Remove anything below that is not applicable + +- [x] Functionality +- - [x] Feature works as intended after change +- - [x] Applicable dependancies have been deployed + +- [x] Layout +- - [x] Change looks good in the desktop web ui +- - [x] Change looks good in the mobile web ui + +- [x] Theme +- - [x] Components / elements inspected in light mode +- - [x] Components / elements inspected in dark mode \ No newline at end of file From b21a7b8954eb0429f4db4134ebf5c8b57d3b9451 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 09:52:16 +0000 Subject: [PATCH 02/44] Bump ssri from 6.0.1 to 6.0.2 (#1747) Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2. - [Release notes](https://github.com/npm/ssri/releases) - [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md) - [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2) --- updated-dependencies: - dependency-name: ssri dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index a0cb19c4bb..1e75f22e3d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22740,9 +22740,9 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" From 92abc3119f75f56fee396ac6cf83baf643dd835e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 09:57:32 +0000 Subject: [PATCH 03/44] Bump merge-deep from 3.0.2 to 3.0.3 (#1744) Bumps [merge-deep](https://github.com/jonschlinkert/merge-deep) from 3.0.2 to 3.0.3. - [Release notes](https://github.com/jonschlinkert/merge-deep/releases) - [Commits](https://github.com/jonschlinkert/merge-deep/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: merge-deep dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1e75f22e3d..2fbcbeddbd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17350,9 +17350,9 @@ merge-class-names@^1.1.1: integrity sha512-k0Qaj36VBpKgdc8c188LEZvo6v/zzry/FUufwopWbMSp6/knfVFU/KIB55/hJjeIpg18IH2WskXJCRnM/1BrdQ== merge-deep@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" - integrity sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" + integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== dependencies: arr-union "^3.1.0" clone-deep "^0.2.4" From 9784c123ee0bac9a341bd7a22623a9388892c527 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 10:04:25 +0000 Subject: [PATCH 04/44] Bump dns-packet from 1.3.1 to 1.3.4 (#1745) Bumps [dns-packet](https://github.com/mafintosh/dns-packet) from 1.3.1 to 1.3.4. - [Release notes](https://github.com/mafintosh/dns-packet/releases) - [Changelog](https://github.com/mafintosh/dns-packet/blob/master/CHANGELOG.md) - [Commits](https://github.com/mafintosh/dns-packet/compare/v1.3.1...v1.3.4) --- updated-dependencies: - dependency-name: dns-packet dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2fbcbeddbd..ba9982e653 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11153,9 +11153,9 @@ dns-over-http-resolver@^1.0.0: receptacle "^1.3.2" dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" From 3599ee4a4f84b49b96062f54a6a864db31b3afa5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 10:11:30 +0000 Subject: [PATCH 05/44] Bump tmpl from 1.0.4 to 1.0.5 (#1741) Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5. - [Release notes](https://github.com/daaku/nodejs-tmpl/releases) - [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5) --- updated-dependencies: - dependency-name: tmpl dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index ba9982e653..224394046a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23494,9 +23494,9 @@ tmp@~0.2.1: rimraf "^3.0.0" tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-arraybuffer@^1.0.0: version "1.0.1" From 6337f63858e3560b1a5a116e0218b3808c998457 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 10:20:26 +0000 Subject: [PATCH 06/44] Bump path-parse from 1.0.6 to 1.0.7 (#1742) Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 224394046a..4f6c34b752 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18901,9 +18901,9 @@ path-key@^3.0.0, path-key@^3.1.0: integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" From 71e7d7e125b1bd2bbf006d0a75249e26d005d819 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 10:31:37 +0000 Subject: [PATCH 07/44] Bump color-string from 1.5.3 to 1.6.0 (#1743) Bumps [color-string](https://github.com/Qix-/color-string) from 1.5.3 to 1.6.0. - [Release notes](https://github.com/Qix-/color-string/releases) - [Changelog](https://github.com/Qix-/color-string/blob/master/CHANGELOG.md) - [Commits](https://github.com/Qix-/color-string/commits/1.6.0) --- updated-dependencies: - dependency-name: color-string dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4f6c34b752..6f8b3d68ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9931,9 +9931,9 @@ color-name@^1.0.0, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" From 4e64f034435dc05f0885be7110c7fd7399ef9b20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 10:46:38 +0000 Subject: [PATCH 08/44] Bump hosted-git-info from 2.8.8 to 2.8.9 (#1746) Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9. - [Release notes](https://github.com/npm/hosted-git-info/releases) - [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) - [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9) --- updated-dependencies: - dependency-name: hosted-git-info dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6f8b3d68ae..b454953f93 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14344,9 +14344,9 @@ home-or-tmp@^2.0.0: os-tmpdir "^1.0.1" hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hotkeys-js@3.8.1: version "3.8.1" From 9addf3ed039f52ec5fc465e1dff1e7d3d1cab421 Mon Sep 17 00:00:00 2001 From: Andrew Snaith Date: Tue, 16 Nov 2021 02:58:04 -0800 Subject: [PATCH 09/44] bump cypress to v9.0 (#1749) Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> --- packages/files-ui/package.json | 2 +- packages/gaming-ui/package.json | 2 +- packages/storage-ui/package.json | 2 +- yarn.lock | 21 ++++++++++----------- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/files-ui/package.json b/packages/files-ui/package.json index aa63b8d35c..05a30f268b 100644 --- a/packages/files-ui/package.json +++ b/packages/files-ui/package.json @@ -74,7 +74,7 @@ "@types/yup": "^0.29.9", "@types/zxcvbn": "^4.4.0", "babel-plugin-macros": "^2.8.0", - "cypress": "^8.6", + "cypress": "^9.0", "cypress-file-upload": "^5.0.8", "cypress-pipe": "^2.0.0" }, diff --git a/packages/gaming-ui/package.json b/packages/gaming-ui/package.json index 3098d56e7d..22f8021c47 100644 --- a/packages/gaming-ui/package.json +++ b/packages/gaming-ui/package.json @@ -56,7 +56,7 @@ "@types/yup": "^0.29.9", "@types/zxcvbn": "^4.4.0", "babel-plugin-macros": "^2.8.0", - "cypress": "^8.6", + "cypress": "^9.0", "cypress-file-upload": "^5.0.8", "cypress-pipe": "^2.0.0" }, diff --git a/packages/storage-ui/package.json b/packages/storage-ui/package.json index 872888ea68..e7ae0c3fba 100644 --- a/packages/storage-ui/package.json +++ b/packages/storage-ui/package.json @@ -64,7 +64,7 @@ "@types/yup": "^0.29.9", "@types/zxcvbn": "^4.4.0", "babel-plugin-macros": "^2.8.0", - "cypress": "^8.6", + "cypress": "^9.0", "cypress-file-upload": "^5.0.8", "cypress-pipe": "^2.0.0" }, diff --git a/yarn.lock b/yarn.lock index b454953f93..f7de52c4a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2017,10 +2017,10 @@ react-qr-reader "^2.2.1" rxjs "^6.6.3" -"@cypress/request@^2.88.6": - version "2.88.6" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.6.tgz#a970dd675befc6bdf8a8921576c01f51cc5798e9" - integrity sha512-z0UxBE/+qaESAHY9p9sM2h8Y4XqtsbDCt0/DPOrqA/RZgKi4PkxdpXyK4wCCnSk1xHqWHZZAE+gV6aDAR6+caQ== +"@cypress/request@^2.88.7": + version "2.88.7" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.7.tgz#386d960ab845a96953723348088525d5a75aaac4" + integrity sha512-FTULIP2rnDJvZDT9t6B4nSfYR40ue19tVmv3wUcY05R9/FPCoMl1nAPJkzWzBCo7ltVn5ThQTbxiMoGBN7k0ig== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -10727,12 +10727,12 @@ cypress-pipe@^2.0.0: resolved "https://registry.yarnpkg.com/cypress-pipe/-/cypress-pipe-2.0.0.tgz#577df7a70a8603d89a96dfe4092a605962181af8" integrity sha512-KW9s+bz4tFLucH3rBGfjW+Q12n7S4QpUSSyxiGrgPOfoHlbYWzAGB3H26MO0VTojqf9NVvfd5Kt0MH5XMgbfyg== -cypress@^8.6: - version "8.6.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-8.6.0.tgz#8d02fa58878b37cfc45bbfce393aa974fa8a8e22" - integrity sha512-F7qEK/6Go5FsqTueR+0wEw2vOVKNgk5847Mys8vsWkzPoEKdxs+7N9Y1dit+zhaZCLtMPyrMwjfA53ZFy+lSww== +cypress@^9.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-9.0.0.tgz#8c496f7f350e611604cc2f77b663fb81d0c235d2" + integrity sha512-/93SWBZTw7BjFZ+I9S8SqkFYZx7VhedDjTtRBmXO0VzTeDbmxgK/snMJm/VFjrqk/caWbI+XY4Qr80myDMQvYg== dependencies: - "@cypress/request" "^2.88.6" + "@cypress/request" "^2.88.7" "@cypress/xvfb" "^1.2.4" "@types/node" "^14.14.31" "@types/sinonjs__fake-timers" "^6.0.2" @@ -10767,7 +10767,6 @@ cypress@^8.6: ospath "^1.2.2" pretty-bytes "^5.6.0" proxy-from-env "1.0.0" - ramda "~0.27.1" request-progress "^3.0.0" supports-color "^8.1.1" tmp "~0.2.1" @@ -20351,7 +20350,7 @@ ramda@^0.21.0: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35" integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU= -ramda@^0.27.1, ramda@~0.27.1: +ramda@^0.27.1: version "0.27.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== From 6674c0f03e48c6f78411171e7d672973101b68ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 11:03:09 +0000 Subject: [PATCH 10/44] Bump url-parse from 1.4.7 to 1.5.3 (#1748) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.4.7 to 1.5.3. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.4.7...1.5.3) --- updated-dependencies: - dependency-name: url-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f7de52c4a9..c25cf21b1b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24041,9 +24041,9 @@ url-loader@2.3.0, url-loader@^2.0.1: schema-utils "^2.5.0" url-parse@^1.4.3: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + version "1.5.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" From f994607cdb5661bb234f86cbf8fd1011c858bf2a Mon Sep 17 00:00:00 2001 From: Thibaut Sardan <33178835+Tbaut@users.noreply.github.com> Date: Tue, 16 Nov 2021 18:26:15 +0000 Subject: [PATCH 11/44] Link sharing redesign (#1722) * redesign * copy buttons * lingui extract * dynamic dropdown * copy working * remove label * styling suggestions * lingui extract Co-authored-by: GitHub Actions Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> Co-authored-by: Tanmoy Basak Anjan --- .../src/Components/Elements/MnemonicForm.tsx | 6 +- .../CreateOrEditSharedFolderModal.tsx | 21 +- .../FileBrowsers/LinkSharing/LinkList.tsx | 253 +++++++++++++----- .../FileBrowsers/LinkSharing/SharingLink.tsx | 205 +++++++++++--- .../FileBrowsers/SharedFoldersOverview.tsx | 17 +- packages/files-ui/src/locales/de/messages.po | 24 +- packages/files-ui/src/locales/en/messages.po | 30 +-- packages/files-ui/src/locales/es/messages.po | 24 +- packages/files-ui/src/locales/fr/messages.po | 30 +-- packages/files-ui/src/locales/no/messages.po | 24 +- 10 files changed, 435 insertions(+), 199 deletions(-) diff --git a/packages/files-ui/src/Components/Elements/MnemonicForm.tsx b/packages/files-ui/src/Components/Elements/MnemonicForm.tsx index 31e95cf972..067befa0da 100644 --- a/packages/files-ui/src/Components/Elements/MnemonicForm.tsx +++ b/packages/files-ui/src/Components/Elements/MnemonicForm.tsx @@ -136,8 +136,10 @@ const MnemonicForm = ({ buttonLabel, onComplete }: Props) => { component="p" className={classes.loader} > - + Generating… diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrEditSharedFolderModal.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrEditSharedFolderModal.tsx index 454992d687..a0b0c385cd 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrEditSharedFolderModal.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrEditSharedFolderModal.tsx @@ -13,7 +13,6 @@ import { useLookupSharedFolderUser } from "./hooks/useLookupUser" import { nameValidator } from "../../../Utils/validationSchema" import { getUserDisplayName } from "../../../Utils/getUserDisplayName" import LinkList from "./LinkSharing/LinkList" -import clsx from "clsx" const useStyles = makeStyles( ({ breakpoints, constants, typography, zIndex, palette }: CSFTheme) => { @@ -109,7 +108,8 @@ const useStyles = makeStyles( color: palette.error.main }, sharingLink: { - padding: constants.generalUnit * 1.25 + padding: constants.generalUnit * 2, + margin: 0 } }) } @@ -204,6 +204,12 @@ const CreateOrEditSharedFolderModal = ({ mode, isModalOpen, onClose, bucketToEdi closePosition="none" maxWidth="sm" testId="create-or-edit-shared-folder" + subModal={mode === "edit" && !!bucketToEdit && ( + + )} >
@@ -293,17 +299,6 @@ const CreateOrEditSharedFolderModal = ({ mode, isModalOpen, onClose, bucketToEdi data-cy="tag-edit-permission-user" />
- {mode === "edit" && !!bucketToEdit && ( -
- - Sharing link - - -
- )} { return createStyles({ root: { + padding: 2 * constants.generalUnit }, options: { backgroundColor: constants.header.optionsBackground, @@ -47,49 +48,131 @@ const useStyles = makeStyles( }, permissionDropdown: { padding: `0px ${constants.generalUnit}px`, - backgroundColor: palette.additional["gray"][5], - marginLeft: constants.generalUnit + backgroundColor: palette.additional["gray"][1], + marginLeft: constants.generalUnit, + borderColor: palette.additional["gray"][5], + borderWidth: "1px", + borderStyle: "solid", + borderRadius: "4px" }, - createLink: { - display: "flex", - alignItems: "center", - margin: `${constants.generalUnit * 2.5}px 0` + rightsText: { + display: "inline-block" }, createLinkButton: { - marginRight: constants.generalUnit + width: "100%" }, dropdownTitle: { padding: `${constants.generalUnit * 0.75}px ${constants.generalUnit}px` + }, + heading : { + marginBottom: constants.generalUnit + }, + loadingContainer: { + display: "flex", + flexDirection: "column", + justifyContent: "center", + alignItems: "center" + }, + grayWrapper: { + backgroundColor: palette.additional["gray"][3], + borderRadius: "4px", + display: "flex", + padding: constants.generalUnit * 2, + flexDirection: "column" + }, + creationWrapper: { + display: "flex", + alignItems: "center", + justifyContent: "center", + flexDirection: "column", + margin: "auto" + }, + rightSelection: { + marginBottom: constants.generalUnit + }, + loader: { + textAlign: "center" + }, + activeLinks: { + marginBottom: constants.generalUnit } }) } ) +const MAX_LINKS = 2 + interface Props { bucketId: string bucketEncryptionKey: string } -const readRights = t`read rights` -const editRights = t`edit rights` +interface LinkMenuItems { + id: NonceResponsePermission + onClick: () => void + contents: ReactNode +} + +const readRights = t`view-only` +const editRights = t`can-edit` export const translatedPermission = (permission: NonceResponsePermission) => permission === "read" ? readRights : editRights const LinkList = ({ bucketId, bucketEncryptionKey }: Props) => { const classes = useStyles() const { filesApiClient } = useFilesApi() const [nonces, setNonces] = useState([]) - const [isLoading, setIsLoading] = useState(false) - const [newLinkPermission, setNewLinkPermission] = useState("read") + const [isLoadingNonces, setIsLoadingNonces] = useState(false) + const [isLoadingCreation, setIsLoadingCreation] = useState(false) + const hasAReadNonce = useMemo(() => !!nonces.find(n => n.permission === "read"), [nonces]) + const [newLinkPermission, setNewLinkPermission] = useState(undefined) + const menuItems: LinkMenuItems[] = useMemo(() => [ + { + id: "read", + onClick: () => setNewLinkPermission("read"), + contents: ( +
+ {readRights} +
+ ) + }, + { + id: "write", + onClick: () => setNewLinkPermission("write"), + contents: ( +
+ {editRights} +
+ ) + } + ], [classes.menuItem]) + + const displayedItems = useMemo(() => nonces.length === 0 + ? menuItems + : hasAReadNonce + ? menuItems.filter(i => i.id === "write") + : menuItems.filter(i => i.id === "read") + , [hasAReadNonce, menuItems, nonces.length] + ) + + useEffect(() => { + setNewLinkPermission(displayedItems[0].id) + }, [displayedItems]) const refreshNonces = useCallback(() => { - setIsLoading(true) + setIsLoadingNonces(true) filesApiClient.getAllNonces() .then((res) => { const noncesForCurrentBucket = res.filter(n => n.bucket_id === bucketId) setNonces(noncesForCurrentBucket) }) .catch(console.error) - .finally(() => setIsLoading(false)) + .finally(() => setIsLoadingNonces(false)) }, [bucketId, filesApiClient]) useEffect(() => { @@ -98,77 +181,101 @@ const LinkList = ({ bucketId, bucketEncryptionKey }: Props) => { const onCreateNonce = useCallback(() => { - setIsLoading(true) + if (!newLinkPermission) { + console.error("Permission not set") + return + } + + setIsLoadingCreation(true) return filesApiClient .createNonce({ bucket_id: bucketId, permission: newLinkPermission }) .catch(console.error) .finally(() => { - setIsLoading(false) + setIsLoadingCreation(false) refreshNonces() }) }, [bucketId, filesApiClient, newLinkPermission, refreshNonces]) return (
-
-
+ )} + {isLoadingNonces && ( + - Create new link - - with - setNewLinkPermission("read"), - contents: ( -
- {readRights} -
- ) - }, - { - onClick: () => setNewLinkPermission("write"), - contents: ( -
- {editRights} -
- ) - } - ]} - /> -
- { - isLoading && - } - { - !isLoading && nonces.length > 0 && nonces.map((nonce) => - - ) - } + + )} + {nonces.length < MAX_LINKS && ( + <> + + Create a sharing link + +
+
+
+ + Anyone with the link can: + + +
+ +
+
+ + )}
) } diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx index 882f8c64fd..347dcb5414 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx @@ -1,5 +1,5 @@ -import { Button, DeleteSvg, Typography } from "@chainsafe/common-components" +import { CopyIcon, DeleteSvg, Loading, MoreIcon, Typography } from "@chainsafe/common-components" import { createStyles, debounce, makeStyles } from "@chainsafe/common-theme" import { NonceResponse } from "@chainsafe/files-api-client" import { Trans } from "@lingui/macro" @@ -7,19 +7,24 @@ import React, { useCallback, useEffect, useState } from "react" import { useFilesApi } from "../../../../Contexts/FilesApiContext" import { useThresholdKey } from "../../../../Contexts/ThresholdKeyContext" import { CSFTheme } from "../../../../Themes/types" +import Menu from "../../../../UI-components/Menu" import { ROUTE_LINKS } from "../../../FilesRoutes" import { translatedPermission } from "./LinkList" const useStyles = makeStyles( - ({ constants }: CSFTheme) => { + ({ constants, palette, zIndex, animation, typography }: CSFTheme) => { return createStyles({ root: { display: "flex", - marginBottom: constants.generalUnit * 0.5 + maxWidth: "100%", + position: "relative", + "&:not(:first-child)": { + marginTop: constants.generalUnit * 2 + } }, linkWrapper: { whiteSpace: "nowrap", - marginRight: constants.generalUnit * 2, + marginRight: constants.generalUnit * 3, display: "flex", alignItems: "center", overflow: "hidden" @@ -27,14 +32,18 @@ const useStyles = makeStyles( permissionWrapper: { display: "flex", alignItems: "center", - marginRight: constants.generalUnit, + marginRight: constants.generalUnit * 3, flex: 1, - whiteSpace: "nowrap" + whiteSpace: "nowrap", + textAlign: "right", + fontWeight: typography.fontWeight.regular }, copyButton: { - flex: 1, - whiteSpace: "nowrap", - marginRight: constants.generalUnit + display: "flex", + justifyContent: "center", + alignItems: "center", + marginRight: constants.generalUnit * 2, + cursor: "pointer" }, link: { textOverflow: "ellipsis", @@ -47,6 +56,69 @@ const useStyles = makeStyles( width: 20, marginRight: constants.generalUnit * 1.5, fill: constants.fileSystemItemRow.menuIcon + }, + copyIcon: { + fontSize: "18px", + fill: palette.additional["gray"][8] + }, + copiedFlag: { + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + left: "50%", + top: -15, + position: "absolute", + transform: "translate(-50%, -50%)", + zIndex: zIndex?.layer1, + transitionDuration: `${animation.transform}ms`, + backgroundColor: constants.loginModule.flagBg, + color: constants.loginModule.flagText, + padding: `${constants.generalUnit / 2}px ${constants.generalUnit}px`, + borderRadius: 2, + "&:after": { + transitionDuration: `${animation.transform}ms`, + content: "''", + position: "absolute", + top: "100%", + left: "50%", + transform: "translate(-50%,0)", + width: 0, + height: 0, + borderLeft: "5px solid transparent", + borderRight: "5px solid transparent", + borderTop: `5px solid ${constants.loginModule.flagBg}` + } + }, + dropdownIcon: { + width: 14, + height: 14, + padding: 0, + display: "flex", + justifyContent: "center", + alignItems: "center", + fontSize: "unset", + "& svg": { + fill: constants.fileSystemItemRow.dropdownIcon, + width: 14, + height: 14 + } + }, + focusVisible: { + backgroundColor: "transparent !important" + }, + menuRoot: { + zIndex: "2500 !important" as any + }, + loader: { + display: "flex", + alignItems: "center", + margin: "auto" + }, + menuWrapper: { + display: "flex", + alignItems: "center", + margin: "auto" } }) } @@ -65,7 +137,7 @@ const SharingLink = ({ nonce, bucketEncryptionKey, refreshNonces }: Props) => { const [jwt, setJwt] = useState("") const { createJWT } = useThresholdKey() const [copied, setCopied] = useState(false) - const [isLoading, setIsLoading] = useState(true) + const [isDeleting, setIsDeleting] = useState(false) useEffect(() => { if(!nonce?.bucket_id || !nonce?.id) { @@ -74,7 +146,6 @@ const SharingLink = ({ nonce, bucketEncryptionKey, refreshNonces }: Props) => { const newJwt = createJWT(nonce.bucket_id, nonce.id, nonce.permission) newJwt && setJwt(newJwt) - setIsLoading(false) }, [createJWT, nonce]) useEffect(() => { @@ -87,28 +158,84 @@ const SharingLink = ({ nonce, bucketEncryptionKey, refreshNonces }: Props) => { const debouncedSwitchCopied = debounce(() => setCopied(false), 3000) + const onCopyInfo = useCallback(() => { - navigator.clipboard.writeText(link) - .then(() => { - setCopied(true) - debouncedSwitchCopied() - }) - .catch(console.error) + // this doesn't work on Mobile + // navigator.clipboard.writeText(link) + // .then(() => { + // setCopied(true) + // debouncedSwitchCopied() + // }) + // .catch(console.error) + + //Create a textbox field where we can insert text to. + const copyFrom = document.createElement("textarea") + + //Set the text content to be the text you wished to copy. + copyFrom.textContent = link + + //Append the textbox field into the body as a child. + //"execCommand()" only works when there exists selected text, and the text is inside + //document.body (meaning the text is part of a valid rendered HTML element). + document.body.appendChild(copyFrom) + + //Select all the text! + copyFrom.select() + + //Execute command + document.execCommand("copy") + + //(Optional) De-select the text using blur(). + copyFrom.blur() + + //Remove the textbox field from the document.body, so no other JavaScript nor + //other elements can get access to this. + document.body.removeChild(copyFrom) + + setCopied(true) + debouncedSwitchCopied() + }, [debouncedSwitchCopied, link]) const onDeleteNonce = useCallback(() => { - setIsLoading(true) + setIsDeleting(true) filesApiClient.revokeNonce(nonce.id) .catch(console.error) .finally(() => { refreshNonces() - setIsLoading(false) + setIsDeleting(false) }) }, [filesApiClient, nonce, refreshNonces]) + if (isDeleting) { + return ( + <> + + + + + ) + } + return (
-
+ {copied && ( +
+ + Copied! + +
+ )} +
{link} @@ -118,26 +245,30 @@ const SharingLink = ({ nonce, bucketEncryptionKey, refreshNonces }: Props) => { {translatedPermission(nonce.permission)}
- - + +
+
+ } + options={[{ + contents: ( + <> + + + Delete + + + ), + onClick: onDeleteNonce + }]} + style={{ focusVisible: classes.focusVisible, root: classes.menuRoot }} + /> +
) } diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFoldersOverview.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFoldersOverview.tsx index acae947f4d..cbae598f21 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFoldersOverview.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFoldersOverview.tsx @@ -18,7 +18,6 @@ import { t, Trans } from "@lingui/macro" import { createStyles, makeStyles, useThemeSwitcher } from "@chainsafe/common-theme" import { CSFTheme } from "../../../Themes/types" import CreateOrEditSharedFolderModal from "./CreateOrEditSharedFolderModal" -import clsx from "clsx" import { useFilesApi } from "../../../Contexts/FilesApiContext" import { ROUTE_LINKS } from "../../FilesRoutes" import SharedFolderRow from "./views/FileSystemItem/SharedFolderRow" @@ -197,13 +196,15 @@ const SharedFolderOverview = () => { {isLoadingBuckets && ( -
- - +
+ + Loading your shared folders…
diff --git a/packages/files-ui/src/locales/de/messages.po b/packages/files-ui/src/locales/de/messages.po index fb2e752eb6..e84119bc7a 100644 --- a/packages/files-ui/src/locales/de/messages.po +++ b/packages/files-ui/src/locales/de/messages.po @@ -28,6 +28,9 @@ msgstr "Akzeptieren" msgid "Account" msgstr "Konto" +msgid "Active links" +msgstr "" + msgid "Add a username" msgstr "Einen Benutzernamen hinzufügen" @@ -52,6 +55,9 @@ msgstr "" msgid "An error occurred:" msgstr "Es ist ein Fehler aufgetreten:" +msgid "Anyone with the link can:" +msgstr "" + msgid "Approve" msgstr "Genehmigen" @@ -142,9 +148,6 @@ msgstr "" msgid "Copy info" msgstr "" -msgid "Copy link" -msgstr "" - msgid "Copy over" msgstr "" @@ -166,7 +169,10 @@ msgstr "" msgid "Create a new shared folder" msgstr "" -msgid "Create new link" +msgid "Create a sharing link" +msgstr "" + +msgid "Create link" msgstr "" msgid "Create your public username in <0>Settings!" @@ -652,9 +658,6 @@ msgstr "" msgid "Sharing files" msgstr "" -msgid "Sharing link" -msgstr "" - msgid "Sign Out" msgstr "Abmelden" @@ -883,7 +886,7 @@ msgstr "" msgid "Your recovery key can be used to restore your account in place of your backup secret phrase." msgstr "Ihr Wiederherstellungsschlüssel kann zur Wiederherstellung Ihres Kontos anstelle Ihres Sicherungsgeheimsatz verwendet werden." -msgid "edit rights" +msgid "can-edit" msgstr "" msgid "me" @@ -892,13 +895,10 @@ msgstr "ich" msgid "on" msgstr "am" -msgid "read rights" -msgstr "" - msgid "unknown" msgstr "unbekannt" -msgid "with" +msgid "view-only" msgstr "" msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" diff --git a/packages/files-ui/src/locales/en/messages.po b/packages/files-ui/src/locales/en/messages.po index aa68d3a494..9e448a9c13 100644 --- a/packages/files-ui/src/locales/en/messages.po +++ b/packages/files-ui/src/locales/en/messages.po @@ -28,6 +28,9 @@ msgstr "Accept" msgid "Account" msgstr "Account" +msgid "Active links" +msgstr "Active links" + msgid "Add a username" msgstr "Add a username" @@ -52,6 +55,9 @@ msgstr "Allow lookup by sharing key, wallet address or username" msgid "An error occurred:" msgstr "An error occurred:" +msgid "Anyone with the link can:" +msgstr "Anyone with the link can:" + msgid "Approve" msgstr "Approve" @@ -142,9 +148,6 @@ msgstr "Copy file" msgid "Copy info" msgstr "Copy info" -msgid "Copy link" -msgstr "Copy link" - msgid "Copy over" msgstr "Copy over" @@ -166,8 +169,11 @@ msgstr "Create a Shared Folder" msgid "Create a new shared folder" msgstr "Create a new shared folder" -msgid "Create new link" -msgstr "Create new link" +msgid "Create a sharing link" +msgstr "Create a sharing link" + +msgid "Create link" +msgstr "Create link" msgid "Create your public username in <0>Settings!" msgstr "Create your public username in <0>Settings!" @@ -655,9 +661,6 @@ msgstr "Shared with" msgid "Sharing files" msgstr "Sharing files" -msgid "Sharing link" -msgstr "Sharing link" - msgid "Sign Out" msgstr "Sign Out" @@ -886,8 +889,8 @@ msgstr "You will need to sign a message in your wallet to complete sign in." msgid "Your recovery key can be used to restore your account in place of your backup secret phrase." msgstr "Your recovery key can be used to restore your account in place of your backup secret phrase." -msgid "edit rights" -msgstr "edit rights" +msgid "can-edit" +msgstr "can-edit" msgid "me" msgstr "me" @@ -895,14 +898,11 @@ msgstr "me" msgid "on" msgstr "on" -msgid "read rights" -msgstr "read rights" - msgid "unknown" msgstr "unknown" -msgid "with" -msgstr "with" +msgid "view-only" +msgstr "view-only" msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" msgstr "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" diff --git a/packages/files-ui/src/locales/es/messages.po b/packages/files-ui/src/locales/es/messages.po index fce90f9fe5..ac8d5514b2 100644 --- a/packages/files-ui/src/locales/es/messages.po +++ b/packages/files-ui/src/locales/es/messages.po @@ -29,6 +29,9 @@ msgstr "" msgid "Account" msgstr "Cuenta" +msgid "Active links" +msgstr "" + msgid "Add a username" msgstr "" @@ -53,6 +56,9 @@ msgstr "" msgid "An error occurred:" msgstr "" +msgid "Anyone with the link can:" +msgstr "" + msgid "Approve" msgstr "Aprobar" @@ -143,9 +149,6 @@ msgstr "" msgid "Copy info" msgstr "" -msgid "Copy link" -msgstr "" - msgid "Copy over" msgstr "" @@ -167,7 +170,10 @@ msgstr "" msgid "Create a new shared folder" msgstr "" -msgid "Create new link" +msgid "Create a sharing link" +msgstr "" + +msgid "Create link" msgstr "" msgid "Create your public username in <0>Settings!" @@ -656,9 +662,6 @@ msgstr "" msgid "Sharing files" msgstr "" -msgid "Sharing link" -msgstr "" - msgid "Sign Out" msgstr "Desconectar" @@ -887,7 +890,7 @@ msgstr "Deberá firmar un mensaje en su billetera para completar el inicio de se msgid "Your recovery key can be used to restore your account in place of your backup secret phrase." msgstr "" -msgid "edit rights" +msgid "can-edit" msgstr "" msgid "me" @@ -896,13 +899,10 @@ msgstr "" msgid "on" msgstr "en" -msgid "read rights" -msgstr "" - msgid "unknown" msgstr "" -msgid "with" +msgid "view-only" msgstr "" msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" diff --git a/packages/files-ui/src/locales/fr/messages.po b/packages/files-ui/src/locales/fr/messages.po index 92ea300aff..242cd5700b 100644 --- a/packages/files-ui/src/locales/fr/messages.po +++ b/packages/files-ui/src/locales/fr/messages.po @@ -29,6 +29,9 @@ msgstr "Accepter" msgid "Account" msgstr "Compte" +msgid "Active links" +msgstr "" + msgid "Add a username" msgstr "Ajouter un nom d’utilisateur" @@ -53,6 +56,9 @@ msgstr "" msgid "An error occurred:" msgstr "Une erreur s'est produite :" +msgid "Anyone with the link can:" +msgstr "" + msgid "Approve" msgstr "Accepter" @@ -143,9 +149,6 @@ msgstr "Copier le fichier" msgid "Copy info" msgstr "Copier les infos" -msgid "Copy link" -msgstr "Copier le lien" - msgid "Copy over" msgstr "Copier" @@ -167,8 +170,11 @@ msgstr "Créer un dossier partagé" msgid "Create a new shared folder" msgstr "Créer un nouveau dossier partagé" -msgid "Create new link" -msgstr "Créer un nouveau lien" +msgid "Create a sharing link" +msgstr "" + +msgid "Create link" +msgstr "" msgid "Create your public username in <0>Settings!" msgstr "Créez votre nom d'utilisateur public dans <0>Paramètres !" @@ -656,9 +662,6 @@ msgstr "Partagé avec" msgid "Sharing files" msgstr "Partage des fichiers" -msgid "Sharing link" -msgstr "Lien de partage" - msgid "Sign Out" msgstr "Se déconnecter" @@ -887,8 +890,8 @@ msgstr "Vous devrez signer un message avec votre wallet pour terminer la procéd msgid "Your recovery key can be used to restore your account in place of your backup secret phrase." msgstr "Votre clé de récupération peut être utilisée pour restaurer votre compte à la place de votre phrase de sauvegarde secrète." -msgid "edit rights" -msgstr "droits de modification" +msgid "can-edit" +msgstr "" msgid "me" msgstr "moi" @@ -896,14 +899,11 @@ msgstr "moi" msgid "on" msgstr "le" -msgid "read rights" -msgstr "droits de lecture" - msgid "unknown" msgstr "inconnu" -msgid "with" -msgstr "avec" +msgid "view-only" +msgstr "" msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" msgstr "{0, plural, one {Téléchargement de {1} fichier} other {Téléchargement de {2} fichiers}}" diff --git a/packages/files-ui/src/locales/no/messages.po b/packages/files-ui/src/locales/no/messages.po index 683cae7f68..3b99b371b3 100644 --- a/packages/files-ui/src/locales/no/messages.po +++ b/packages/files-ui/src/locales/no/messages.po @@ -28,6 +28,9 @@ msgstr "" msgid "Account" msgstr "Konto" +msgid "Active links" +msgstr "" + msgid "Add a username" msgstr "Legg til et brukernavn" @@ -52,6 +55,9 @@ msgstr "" msgid "An error occurred:" msgstr "" +msgid "Anyone with the link can:" +msgstr "" + msgid "Approve" msgstr "Godkjenn" @@ -142,9 +148,6 @@ msgstr "" msgid "Copy info" msgstr "" -msgid "Copy link" -msgstr "" - msgid "Copy over" msgstr "" @@ -166,7 +169,10 @@ msgstr "" msgid "Create a new shared folder" msgstr "" -msgid "Create new link" +msgid "Create a sharing link" +msgstr "" + +msgid "Create link" msgstr "" msgid "Create your public username in <0>Settings!" @@ -652,9 +658,6 @@ msgstr "" msgid "Sharing files" msgstr "" -msgid "Sharing link" -msgstr "" - msgid "Sign Out" msgstr "Logg ut" @@ -883,7 +886,7 @@ msgstr "" msgid "Your recovery key can be used to restore your account in place of your backup secret phrase." msgstr "" -msgid "edit rights" +msgid "can-edit" msgstr "" msgid "me" @@ -892,13 +895,10 @@ msgstr "" msgid "on" msgstr "" -msgid "read rights" -msgstr "" - msgid "unknown" msgstr "" -msgid "with" +msgid "view-only" msgstr "" msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" From 328b402d7f37bd7096d71d755ca356dc8115b00f Mon Sep 17 00:00:00 2001 From: Ryan Noble Date: Tue, 16 Nov 2021 20:39:06 +0200 Subject: [PATCH 12/44] Resolved (#1731) Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> Co-authored-by: Tanmoy Basak Anjan --- .../src/Provider/ThemeSwitcherContext.tsx | 6 ++++++ .../FileBrowsers/CreateOrEditSharedFolderModal.tsx | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/common-theme/src/Provider/ThemeSwitcherContext.tsx b/packages/common-theme/src/Provider/ThemeSwitcherContext.tsx index ffe8dc549a..aafb1d886c 100644 --- a/packages/common-theme/src/Provider/ThemeSwitcherContext.tsx +++ b/packages/common-theme/src/Provider/ThemeSwitcherContext.tsx @@ -10,6 +10,8 @@ import { useLocalStorage } from "@chainsafe/browser-storage-hooks" type ThemeSwitcherContext = { desktop: boolean + tablet: boolean + mobile: boolean themeKey: string availableThemes: string[] setTheme(themeName: string): void @@ -26,6 +28,8 @@ type ThemeSwitcherProps = { const ThemeSwitcher = ({ children, themes, storageKey = "cs.themeKey" }: ThemeSwitcherProps) => { const breakpoints = createBreakpoints({}) const desktop = useMediaQuery(breakpoints.up("md")) + const tablet = useMediaQuery(breakpoints.up("sm")) + const mobile = useMediaQuery(breakpoints.up("xs")) const { canUseLocalStorage, localStorageGet, localStorageSet } = useLocalStorage() // TODO: check min 1 theme @@ -60,6 +64,8 @@ const ThemeSwitcher = ({ children, themes, storageKey = "cs.themeKey" }: ThemeSw { const classes = useStyles() - const { desktop } = useThemeSwitcher() + const { desktop, tablet, mobile } = useThemeSwitcher() const { handleCreateSharedFolder, handleEditSharedFolder, isEditingSharedFolder, isCreatingSharedFolder } = useCreateOrEditSharedFolder() const [sharedFolderName, setSharedFolderName] = useState("") const { sharedFolderReaders, sharedFolderWriters, onNewUsers, handleLookupUser, usersError, resetUsers } = useLookupSharedFolderUser() @@ -266,6 +266,12 @@ const CreateOrEditSharedFolderModal = ({ mode, isModalOpen, onClose, bucketToEdi ...provided, minHeight: 90, alignContent: "start" + }), + valueContainer: (provided) => mobile && !tablet ? ({ + ...provided, + paddingBottom: 24 + }) : ({ + ...provided }) }} loadingMessage={t`Loading`} @@ -292,6 +298,12 @@ const CreateOrEditSharedFolderModal = ({ mode, isModalOpen, onClose, bucketToEdi ...provided, minHeight: 90, alignContent: "start" + }), + valueContainer: (provided) => mobile && !tablet ? ({ + ...provided, + paddingBottom: 24 + }) : ({ + ...provided }) }} loadingMessage={t`Loading`} From 0062f31d410983bcac1687cef7ab990bd80d229e Mon Sep 17 00:00:00 2001 From: Andrew Snaith Date: Wed, 17 Nov 2021 03:46:34 -0800 Subject: [PATCH 13/44] Add subdirectory for pr template (#1756) --- .../pull_request_template.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE/pull_request_template.md diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md new file mode 100644 index 0000000000..1f16343693 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -0,0 +1,19 @@ +closes # + +--- + +Submission checklist: + +> Remove anything below that is not applicable + +- [x] Functionality +- - [x] Feature works as intended after change +- - [x] Applicable dependancies have been deployed + +- [x] Layout +- - [x] Change looks good in the desktop web ui +- - [x] Change looks good in the mobile web ui + +- [x] Theme +- - [x] Components / elements inspected in light mode +- - [x] Components / elements inspected in dark mode \ No newline at end of file From d80d513f45adb40599d9e876bf8d323179cdc192 Mon Sep 17 00:00:00 2001 From: Andrew Snaith Date: Wed, 17 Nov 2021 08:54:23 -0800 Subject: [PATCH 14/44] add test for hotkey navigation in file preview (#1755) --- .../fixtures/uploadedFiles/chainsafe.png | Bin 0 -> 39311 bytes .../cypress/tests/file-preview-spec.ts | 74 ++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 packages/files-ui/cypress/fixtures/uploadedFiles/chainsafe.png diff --git a/packages/files-ui/cypress/fixtures/uploadedFiles/chainsafe.png b/packages/files-ui/cypress/fixtures/uploadedFiles/chainsafe.png new file mode 100644 index 0000000000000000000000000000000000000000..eee4cbc3b087af456327b3aebfb4b4c881c30d1f GIT binary patch literal 39311 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 literal 0 HcmV?d00001 diff --git a/packages/files-ui/cypress/tests/file-preview-spec.ts b/packages/files-ui/cypress/tests/file-preview-spec.ts index 6f2dc17cee..655e1c68e5 100644 --- a/packages/files-ui/cypress/tests/file-preview-spec.ts +++ b/packages/files-ui/cypress/tests/file-preview-spec.ts @@ -51,6 +51,80 @@ describe("File Preview", () => { homePage.appHeaderLabel().should("exist") }) + it("can navigate through preview using keyboard hotkeys", () => { + cy.web3Login({ clearCSFBucket: true }) + + // add files + homePage.uploadFile("../fixtures/uploadedFiles/chainsafe.png") + homePage.uploadFile("../fixtures/uploadedFiles/logo.png") + homePage.uploadFile("../fixtures/uploadedFiles/text-file.txt") + homePage.fileItemRow().should("have.length", 3) + + // store the 3 file names as cypress aliases for later comparison + homePage.fileItemName().eq(0).invoke("text").as("fileNameA") + homePage.fileItemName().eq(1).invoke("text").as("fileNameB") + homePage.fileItemName().eq(2).invoke("text").as("fileNameC") + + // navigate to the preview modal for the first file + homePage.fileItemKebabButton().first().click() + homePage.previewMenuOption().eq(0).click() + previewModal.body().should("exist") + + // ensure the correct file is being previewed + cy.get("@fileNameA").then(($fileNameA) => { + previewModal.fileNameLabel().should("contain.text", $fileNameA) + previewModal.contentContainer() + .should("be.visible") + .should("not.have.text", "Loading preview") + previewModal.unsupportedFileLabel().should("not.exist") + }) + + // browse to the 2nd file via the right arrow key + cy.get("body").type("{rightarrow}") + cy.get("@fileNameB").then(($fileNameB) => { + previewModal.fileNameLabel().should("contain.text", $fileNameB) + previewModal.contentContainer() + .should("be.visible") + .should("not.have.text", "Loading preview") + previewModal.unsupportedFileLabel().should("not.exist") + }) + + // browse to the 3rd file via the right arrow key + cy.get("body").type("{rightarrow}") + cy.get("@fileNameC").then(($fileNameC) => { + previewModal.fileNameLabel().should("contain.text", $fileNameC) + previewModal.contentContainer() + .should("be.visible") + .should("not.have.text", "Loading preview") + previewModal.unsupportedFileLabel().should("not.exist") + }) + + // return to the 2nd file via the left arrow key + cy.get("body").type("{leftarrow}") + cy.get("@fileNameB").then(($fileNameB) => { + previewModal.fileNameLabel().should("contain.text", $fileNameB) + previewModal.contentContainer() + .should("be.visible") + .should("not.have.text", "Loading preview") + previewModal.unsupportedFileLabel().should("not.exist") + }) + + // return to the 1st file via the left arrow key + cy.get("body").type("{leftarrow}") + cy.get("@fileNameA").then(($fileNameA) => { + previewModal.fileNameLabel().should("contain.text", $fileNameA) + previewModal.contentContainer() + .should("be.visible") + .should("not.have.text", "Loading preview") + previewModal.unsupportedFileLabel().should("not.exist") + }) + + // exit preview via the escape key + cy.get("body").type("{esc}") + previewModal.body().should("not.exist") + homePage.appHeaderLabel().should("exist") + }) + it("can see option to download file from the preview screen", () => { cy.web3Login({ clearCSFBucket: true }) homePage.uploadFile("../fixtures/uploadedFiles/logo.png") From 9c52fbeb44d8221b7856f9ce24cc0ac69a786ba7 Mon Sep 17 00:00:00 2001 From: Michael Yankelev <12774278+FSM1@users.noreply.github.com> Date: Wed, 17 Nov 2021 21:51:31 +0200 Subject: [PATCH 15/44] fix video preview overflow (#1752) --- .../src/Components/Modules/PreviewRenderers/VideoPreview.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/files-ui/src/Components/Modules/PreviewRenderers/VideoPreview.tsx b/packages/files-ui/src/Components/Modules/PreviewRenderers/VideoPreview.tsx index 8c6b688ea9..8b84d80b7e 100644 --- a/packages/files-ui/src/Components/Modules/PreviewRenderers/VideoPreview.tsx +++ b/packages/files-ui/src/Components/Modules/PreviewRenderers/VideoPreview.tsx @@ -5,7 +5,8 @@ import { makeStyles, createStyles } from "@chainsafe/common-theme" const useStyles = makeStyles(() => createStyles({ root: { - maxWidth: "100vw" + maxWidth: "100vw", + maxHeight: "100vh" } }) ) @@ -28,7 +29,7 @@ const VideoPreview: React.FC = ({ contents }) => { className={classes.root} src={videoUrl} controls - autoPlay/> + autoPlay /> ) } From ef5e6779fc58e6b4107414a7e4e3a89598612cb8 Mon Sep 17 00:00:00 2001 From: Tanmoy Basak Anjan Date: Thu, 18 Nov 2021 20:48:58 +0600 Subject: [PATCH 16/44] Share files from browser support (#1736) * redesign * copy buttons * lingui extract * dynamic dropdown * copy working * remove label * styling suggestions * lingui extract * landing modal alignments * lingui extract * modal config * lingui extract * manage shared folder code refactor * lingui extract * modals progress working * added posthog event * lingui extract * changing widths * added width breaks * removed extra styled * compile translations * added status checks * close instead of cancel Co-authored-by: Thibaut Sardan Co-authored-by: GitHub Actions Co-authored-by: Thibaut Sardan <33178835+Tbaut@users.noreply.github.com> Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> --- .../common-components/src/Button/Button.tsx | 16 +- .../src/CheckboxInput/CheckboxInput.tsx | 1 + .../common-components/src/Modal/Modal.tsx | 1 + .../src/SelectInput/SelectInput.tsx | 1 - .../src/stories/Button.stories.tsx | 4 +- packages/common-theme/src/Overrides/Button.ts | 12 + .../src/Components/Elements/CustomModal.tsx | 6 +- .../CreateOrManageSharedFolder.tsx | 309 ++++++++++++++ .../CreateOrManageSharedFolderModal.tsx | 76 ++++ .../Modules/FileBrowsers/ShareModal.tsx | 401 ++++++++---------- .../FileBrowsers/SharedFoldersOverview.tsx | 4 +- .../Modules/FileBrowsers/views/FilesList.tsx | 2 +- .../files-ui/src/Contexts/PosthogContext.tsx | 13 +- packages/files-ui/src/locales/de/messages.po | 28 +- packages/files-ui/src/locales/en/messages.po | 30 +- packages/files-ui/src/locales/es/messages.po | 28 +- packages/files-ui/src/locales/fr/messages.po | 32 +- packages/files-ui/src/locales/no/messages.po | 28 +- 18 files changed, 710 insertions(+), 282 deletions(-) create mode 100644 packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrManageSharedFolder.tsx create mode 100644 packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrManageSharedFolderModal.tsx diff --git a/packages/common-components/src/Button/Button.tsx b/packages/common-components/src/Button/Button.tsx index 0900773aaf..435a625b8d 100644 --- a/packages/common-components/src/Button/Button.tsx +++ b/packages/common-components/src/Button/Button.tsx @@ -109,6 +109,20 @@ const useStyles = makeStyles( }, ...overrides?.Button?.variants?.secondary?.root }, + text: { + backgroundColor: "transparent", + color: palette.additional["gray"][9], + "&:hover": { + ...overrides?.Button?.variants?.text?.hover + }, + "&:focus": { + ...overrides?.Button?.variants?.text?.focus + }, + "&:active": { + ...overrides?.Button?.variants?.text?.active + }, + ...overrides?.Button?.variants?.text?.root + }, tertiary: { backgroundColor: palette.additional["gray"][3], color: palette.common.black.main, @@ -293,7 +307,7 @@ interface IButtonProps extends Omit { className?: string children?: ReactNode | ReactNode[] fullsize?: boolean - variant?: "link" | "primary" | "secondary" |"tertiary" | "outline" | "dashed" | "danger" + variant?: "link" | "primary" | "secondary" |"tertiary" | "outline" | "dashed" | "danger" | "text" iconButton?: boolean size?: "large" | "medium" | "small" type?: "button" | "submit" | "reset" diff --git a/packages/common-components/src/CheckboxInput/CheckboxInput.tsx b/packages/common-components/src/CheckboxInput/CheckboxInput.tsx index 7d508154fa..8a1f4375a3 100644 --- a/packages/common-components/src/CheckboxInput/CheckboxInput.tsx +++ b/packages/common-components/src/CheckboxInput/CheckboxInput.tsx @@ -10,6 +10,7 @@ const useStyles = makeStyles( root: { cursor: "pointer", display: "flex", + alignItems: "center", ...overrides?.CheckboxInput?.root }, checkbox: { diff --git a/packages/common-components/src/Modal/Modal.tsx b/packages/common-components/src/Modal/Modal.tsx index 63db06daa0..92d95e9bc4 100644 --- a/packages/common-components/src/Modal/Modal.tsx +++ b/packages/common-components/src/Modal/Modal.tsx @@ -94,6 +94,7 @@ const useStyles = makeStyles( margin: "auto", maxHeight: "100%", overflow: "auto", + alignItems: "center", "&.xs": { width: `calc(100% - ${constants.generalUnit * 2}px)`, maxWidth: breakpoints.width("xs"), diff --git a/packages/common-components/src/SelectInput/SelectInput.tsx b/packages/common-components/src/SelectInput/SelectInput.tsx index 802587398d..2af294f69b 100644 --- a/packages/common-components/src/SelectInput/SelectInput.tsx +++ b/packages/common-components/src/SelectInput/SelectInput.tsx @@ -8,7 +8,6 @@ const useStyles = makeStyles( ({ animation, constants, palette, overrides }: ITheme) => createStyles({ root: { - margin: 5, display: "block", ...overrides?.SelectInput?.root }, diff --git a/packages/common-components/src/stories/Button.stories.tsx b/packages/common-components/src/stories/Button.stories.tsx index cffaf6a3b2..2f26a91e4e 100644 --- a/packages/common-components/src/stories/Button.stories.tsx +++ b/packages/common-components/src/stories/Button.stories.tsx @@ -15,12 +15,14 @@ export const actionsData = { onClick: action("onClickButton") } -type VariantOption = "primary" | "secondary" | "tertiary" | "outline" | "dashed" | "danger" | undefined; +type VariantOption = "primary" | "secondary" | "tertiary" | "link" | "text" | "outline" | "dashed" | "danger" | undefined; const variantOptions: VariantOption[] = [ "primary", "outline", "dashed", "danger", + "link", + "text", undefined ] diff --git a/packages/common-theme/src/Overrides/Button.ts b/packages/common-theme/src/Overrides/Button.ts index 106c92e11c..6f44e7e8a6 100644 --- a/packages/common-theme/src/Overrides/Button.ts +++ b/packages/common-theme/src/Overrides/Button.ts @@ -42,6 +42,18 @@ export interface IButtonOverride { focus?: Record active?: Record } + link?: { + root?: Record + hover?: Record + focus?: Record + active?: Record + } + text?: { + root?: Record + hover?: Record + focus?: Record + active?: Record + } } state?: { danger?: { diff --git a/packages/files-ui/src/Components/Elements/CustomModal.tsx b/packages/files-ui/src/Components/Elements/CustomModal.tsx index 62d63fa07c..dbe5d76a25 100644 --- a/packages/files-ui/src/Components/Elements/CustomModal.tsx +++ b/packages/files-ui/src/Components/Elements/CustomModal.tsx @@ -13,7 +13,8 @@ const useStyles = makeStyles(({ constants, breakpoints }: CSFTheme) => }, inner: { backgroundColor: constants.modalDefault.backgroundColor, - color: constants.modalDefault.color + color: constants.modalDefault.color, + width: "100%" }, mobileStickyBottom: { [breakpoints.down("md")]: { @@ -51,7 +52,8 @@ const CustomModal = ({ className, children, injectedClass, mobileStickyBottom = className={clsx(classes.root, className)} injectedClass={{ closeIcon: clsx(classes.closeIcon, injectedClass?.closeIcon), - inner: clsx(classes.inner, mobileStickyBottom ? classes.mobileStickyBottom : undefined, injectedClass?.inner) + inner: clsx(classes.inner, mobileStickyBottom ? classes.mobileStickyBottom : undefined, injectedClass?.inner), + subModalInner: injectedClass?.subModalInner }} {...rest} > diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrManageSharedFolder.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrManageSharedFolder.tsx new file mode 100644 index 0000000000..489c4ccebd --- /dev/null +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrManageSharedFolder.tsx @@ -0,0 +1,309 @@ +import { Button, ShareAltSvg, TagsInput, Typography, Grid, TextInput } from "@chainsafe/common-components" +import { createStyles, makeStyles, useThemeSwitcher } from "@chainsafe/common-theme" +import React, { useState, useCallback } from "react" +import { CSFTheme } from "../../../Themes/types" +import { BucketKeyPermission } from "../../../Contexts/FilesContext" +import CustomButton from "../../Elements/CustomButton" +import { t, Trans } from "@lingui/macro" +import { useEffect } from "react" +import { SharedFolderModalMode } from "./types" +import { useCreateOrEditSharedFolder } from "./hooks/useCreateOrEditSharedFolder" +import { useLookupSharedFolderUser } from "./hooks/useLookupUser" +import { nameValidator } from "../../../Utils/validationSchema" +import { getUserDisplayName } from "../../../Utils/getUserDisplayName" + +const useStyles = makeStyles( + ({ breakpoints, constants, typography, palette }: CSFTheme) => { + return createStyles({ + root: { + padding: constants.generalUnit * 2, + flexDirection: "column", + display: "flex", + alignItems: "center", + [breakpoints.down("sm")]: { + padding: constants.generalUnit + } + }, + okButton: { + marginLeft: constants.generalUnit + }, + cancelButton: { + [breakpoints.down("md")]: { + position: "fixed", + bottom: 0, + left: 0, + width: "100%", + height: constants?.mobileButtonHeight + } + }, + label: { + fontSize: 14, + lineHeight: "22px" + }, + heading: { + color: constants.modalDefault.color, + fontWeight: typography.fontWeight.semibold, + marginBottom: 10 + }, + iconBacking: { + backgroundColor: constants.modalDefault.iconBackingColor, + width: 48, + height: 48, + borderRadius: 24, + marginBottom: constants.generalUnit * 2, + marginTop: constants.generalUnit, + "& > svg": { + width: 16, + height: 16, + fill: palette.primary.main, + position: "relative", + display: "block", + transform: "translate(-50%, -50%)", + top: "50%", + left: "50%" + } + }, + modalFlexItem: { + width: "100%", + margin: 5 + }, + inputLabel: { + fontSize: 16, + fontWeight: 600 + }, + shareFolderNameInput: { + margin: `0 ${constants.generalUnit * 1.5}px ${constants.generalUnit}px`, + display: "block" + }, + footer: { + width: "100%", + padding: `${constants.generalUnit * 2}px ${constants.generalUnit * 2}px ${constants.generalUnit}px 0` + }, + errorText: { + marginLeft: constants.generalUnit * 1.5, + color: palette.error.main + } + }) + } +) + +interface ICreateOrManageSharedFolderProps { + mode?: SharedFolderModalMode + onClose: () => void + bucketToEdit?: BucketKeyPermission +} + +const CreateOrManageSharedFolder = ({ mode, onClose, bucketToEdit }: ICreateOrManageSharedFolderProps) => { + const classes = useStyles() + const { desktop } = useThemeSwitcher() + const { handleCreateSharedFolder, handleEditSharedFolder, isEditingSharedFolder, isCreatingSharedFolder } = useCreateOrEditSharedFolder() + const [sharedFolderName, setSharedFolderName] = useState("") + const { sharedFolderReaders, sharedFolderWriters, onNewUsers, handleLookupUser, usersError, resetUsers } = useLookupSharedFolderUser() + const [hasPermissionsChanged, setHasPermissionsChanged] = useState(false) + const [nameError, setNameError] = useState("") + + const onReset = useCallback(() => { + setSharedFolderName("") + setHasPermissionsChanged(false) + resetUsers() + }, [resetUsers]) + + useEffect(() => { + onReset() + + if (!bucketToEdit) return + + const newWriters = bucketToEdit.writers.map((writer) => ({ + label: getUserDisplayName(writer), + value: writer.uuid || "", + data: writer + }) + ) || [] + + const newReaders = bucketToEdit.readers.map((reader) => ({ + label: getUserDisplayName(reader), + value: reader.uuid || "", + data: reader + }) + ) || [] + + onNewUsers(newWriters, "write") + onNewUsers(newReaders, "read") + }, [bucketToEdit, onNewUsers, onReset]) + + const onNameChange = useCallback((value?: string | number) => { + if (value === undefined) return + + const name = value.toString() + setSharedFolderName(name) + + nameValidator + .validate({ name }) + .then(() => { + setNameError("") + }) + .catch((e: Error) => { + setNameError(e.message) + }) + }, []) + + const handleClose = useCallback(() => { + onReset() + onClose() + }, [onClose, onReset]) + + const onCreateSharedFolder = useCallback(() => { + handleCreateSharedFolder(sharedFolderName, sharedFolderReaders, sharedFolderWriters) + .catch(console.error) + .finally(handleClose) + }, [handleCreateSharedFolder, sharedFolderName, sharedFolderWriters, sharedFolderReaders, handleClose]) + + const onEditSharedFolder = useCallback(() => { + if (!bucketToEdit) return + handleEditSharedFolder(bucketToEdit, sharedFolderReaders, sharedFolderWriters) + .catch(console.error) + .finally(handleClose) + }, [handleEditSharedFolder, sharedFolderWriters, sharedFolderReaders, handleClose, bucketToEdit]) + + return ( +
+
+ +
+
+ + {mode === "create" + ? Create Shared Folder + : Manage Shared Folder + } + + +
+ {mode === "create" && +
+ + {nameError && ( + + {nameError} + + )} +
+ } +
+ { + setHasPermissionsChanged(true) + onNewUsers(values, "read") + }} + label={t`Give view-only permission to:`} + labelClassName={classes.inputLabel} + value={sharedFolderReaders} + fetchTags={(inputVal) => handleLookupUser(inputVal, "read")} + placeholder={t`Add by sharing address, username or wallet address`} + styles={{ + control: (provided) => ({ + ...provided, + minHeight: 90, + alignContent: "start" + }) + }} + loadingMessage={t`Loading`} + noOptionsMessage={t`No user found for this query.`} + data-cy="tag-view-permission-user" + /> +
+
+ { + setHasPermissionsChanged(true) + onNewUsers(values, "write") + }} + label={t`Give edit permission to:`} + labelClassName={classes.inputLabel} + value={sharedFolderWriters} + fetchTags={(inputVal) => handleLookupUser(inputVal, "write")} + placeholder={t`Add by sharing address, username or wallet address`} + styles={{ + control: (provided) => ({ + ...provided, + minHeight: 90, + alignContent: "start" + }) + }} + loadingMessage={t`Loading`} + noOptionsMessage={t`No user found for this query.`} + data-cy="tag-edit-permission-user" + /> +
+ + {!!usersError && ( + + {usersError} + + )} + + + Cancel + + + + +
+ ) +} + +export default CreateOrManageSharedFolder diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrManageSharedFolderModal.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrManageSharedFolderModal.tsx new file mode 100644 index 0000000000..94e3da4c65 --- /dev/null +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/CreateOrManageSharedFolderModal.tsx @@ -0,0 +1,76 @@ +import { createStyles, makeStyles } from "@chainsafe/common-theme" +import React from "react" +import CustomModal from "../../Elements/CustomModal" +import { CSFTheme } from "../../../Themes/types" +import { BucketKeyPermission } from "../../../Contexts/FilesContext" +import { SharedFolderModalMode } from "./types" +import LinkList from "./LinkSharing/LinkList" +import CreateOrManageSharedFolder from "./CreateOrManageSharedFolder" + +const useStyles = makeStyles( + ({ breakpoints, constants, zIndex }: CSFTheme) => { + return createStyles({ + modalRoot: { + zIndex: zIndex?.blocker, + [breakpoints.down("md")]: { + paddingBottom: Number(constants?.mobileButtonHeight) + constants.generalUnit + } + }, + modalInner: { + backgroundColor: constants.modalDefault.backgroundColor, + color: constants.modalDefault.color, + [breakpoints.down("md")]: { + bottom: + Number(constants?.mobileButtonHeight) + constants.generalUnit, + borderTopLeftRadius: `${constants.generalUnit * 1.5}px`, + borderTopRightRadius: `${constants.generalUnit * 1.5}px`, + maxWidth: `${breakpoints.width("md")}px !important` + } + }, + subModal: { + width: "100%" + } + }) + } +) + +interface ICreateOrManageSharedFolderModalProps { + mode?: SharedFolderModalMode + isModalOpen: boolean + onClose: () => void + bucketToEdit?: BucketKeyPermission +} + +const CreateOrManageSharedFolderModal = ( + { mode, isModalOpen, onClose, bucketToEdit }: ICreateOrManageSharedFolderModalProps +) => { + const classes = useStyles() + + return ( + + )} + > + + + ) +} + +export default CreateOrManageSharedFolderModal diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/ShareModal.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/ShareModal.tsx index d88b27c568..070b0e9531 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/ShareModal.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/ShareModal.tsx @@ -2,11 +2,10 @@ import { createStyles, makeStyles } from "@chainsafe/common-theme" import React, { useState } from "react" import CustomModal from "../../Elements/CustomModal" import { t, Trans } from "@lingui/macro" -import { Button, CheckboxInput, SelectInput, ShareAltSvg, TagsInput, TextInput, Typography } from "@chainsafe/common-components" +import { Button, CheckboxInput, SelectInput, ShareAltSvg, TextInput, Typography } from "@chainsafe/common-components" import { CSFTheme } from "../../../Themes/types" import { useCallback } from "react" import { useCreateOrEditSharedFolder } from "./hooks/useCreateOrEditSharedFolder" -import { useLookupSharedFolderUser } from "./hooks/useLookupUser" import { useMemo } from "react" import { BucketKeyPermission, FileSystemItem, useFiles } from "../../../Contexts/FilesContext" import { useUser } from "../../../Contexts/UserContext" @@ -14,65 +13,37 @@ import { useFileBrowser } from "../../../Contexts/FileBrowserContext" import clsx from "clsx" import { useEffect } from "react" import { nameValidator } from "../../../Utils/validationSchema" +import CreateOrManageSharedFolder from "./CreateOrManageSharedFolder" +import LinkList from "./LinkSharing/LinkList" +import { usePosthogContext } from "../../../Contexts/PosthogContext" + +interface StyleProps { + width: number +} const useStyles = makeStyles( ({ breakpoints, constants, palette, typography, zIndex }: CSFTheme) => { return createStyles({ - modalRoot: { - zIndex: zIndex?.blocker, - [breakpoints.down("md")]: {} - }, - modalInner: { - backgroundColor: constants.fileInfoModal.background, - color: constants.fileInfoModal.color - }, root: { - padding: constants.generalUnit * 4, + padding: constants.generalUnit * 3, flexDirection: "column", - display: "flex", - alignItems: "center" + display: "flex" }, - closeButton: { - flex: 1, - marginLeft: constants.generalUnit * 2, - [breakpoints.down("md")]: { - position: "fixed", - bottom: 0, - left: 0, - width: "100%", - height: constants?.mobileButtonHeight, - margin: 0 - } + modalRoot: { + zIndex: zIndex?.blocker }, - title: { - fontWeight: typography.fontWeight.semibold, - textAlign: "left", - [breakpoints.down("md")]: { - textAlign: "center" + modalInner: ({ width }: StyleProps) => ({ + backgroundColor: constants.fileInfoModal.background, + color: constants.fileInfoModal.color, + width, + [breakpoints.down("sm")]: { + width: "100%" } - }, - infoHeading: { - fontWeight: typography.fontWeight.semibold, - textAlign: "left" - }, - infoContainer: { - borderTop: constants.fileInfoModal.infoContainerBorderTop, - padding: `${constants.generalUnit * 2}px ${constants.generalUnit * 3}px` - }, - infoBox: { - paddingLeft: constants.generalUnit - }, - subInfoBox: { - padding: `${constants.generalUnit * 1}px 0` - }, - subSubtitle: { - color: palette.additional["gray"][8] - }, - paddedContainer: { - padding: `${constants.generalUnit * 2}px ${ - constants.generalUnit * 4 - }px`, - borderBottom: `1px solid ${palette.additional["gray"][3]}` + }), + topIconContainer: { + display: "flex", + flexDirection: "column", + alignItems: "center" }, buttonsArea: { display: "flex", @@ -86,29 +57,28 @@ const useStyles = makeStyles( }, buttonsContainer: { display: "flex", - justifyContent: "center", + flexDirection: "column", + alignItems: "center", marginTop: constants.generalUnit * 2 }, mainButton: { - width: "100%" + width: 240, + marginBottom: constants.generalUnit * 0.5 }, - sideBySideButton: { - minWidth: constants.generalUnit * 12, - "&:first-child": { - marginRight: constants.generalUnit * 2 - } + cancelButton: { + maxWidth: 100 }, heading: { color: constants.modalDefault.color, fontWeight: typography.fontWeight.semibold, - marginBottom: 10 + marginBottom: constants.generalUnit * 3 }, iconBacking: { backgroundColor: constants.modalDefault.iconBackingColor, width: 48, height: 48, borderRadius: 24, - marginBottom: 16, + marginBottom: 8, "& > svg": { width: 16, height: 16, @@ -121,82 +91,70 @@ const useStyles = makeStyles( } }, inputLabel: { - fontSize: 16, - fontWeight: 600 + fontSize: 14, + fontWeight: 600, + marginBottom: constants.generalUnit }, modalFlexItem: { width: "100%", - margin: 5, marginBottom: constants.generalUnit * 2 }, - loadingContainer: { - width: "100%", - paddingBottom: constants.generalUnit * 6, - display: "flex", - flexDirection: "column", - alignItems: "center", - "& svg": { - marginBottom: constants.generalUnit * 2 - } - }, - shareFolderNameInput: { - display: "block" + newFolderInput: { + margin: 0, + width: "100%" }, buttonLink: { color: palette.additional["gray"][10], outline: "none", textDecoration: "underline", cursor: "pointer", - textAlign: "center", + textAlign: "left", marginBottom: constants.generalUnit * 2 }, error: { color: palette.error.main, textAlign: "center" }, - checkIcon: { - marginRight: constants.generalUnit * 2 - }, - successBox: { - textAlign: "center", - marginBottom: constants.generalUnit * 4 - }, - successText: { - display: "flex", - marginBottom: constants.generalUnit * 2 - }, inputWrapper: { marginBottom: 0 }, errorText: { - marginLeft: constants.generalUnit * 2, + marginTop: constants.generalUnit * 1, color: palette.error.main }, - titleWrapper: { - padding: "0 5px" - } + subModal: ({ width }: StyleProps) => ({ + width, + [breakpoints.down("sm")]: { + width: "100%" + } + }) }) } ) interface IShareFileProps { fileSystemItems: FileSystemItem[] - close: () => void + onClose: () => void } -const ShareModal = ({ close, fileSystemItems }: IShareFileProps) => { - const classes = useStyles() +const ShareModal = ({ onClose, fileSystemItems }: IShareFileProps) => { const { handleCreateSharedFolder } = useCreateOrEditSharedFolder() const [sharedFolderName, setSharedFolderName] = useState("") - const { sharedFolderReaders, sharedFolderWriters, handleLookupUser, onNewUsers, usersError, resetUsers } = useLookupSharedFolderUser() - const [isUsingCurrentBucket, setIsUsingCurrentBucket] = useState(true) + const [isUsingExistingBucket, setIsUsingExistingBucket] = useState(true) const [keepOriginalFile, setKeepOriginalFile] = useState(true) + const [bucketToUpload, setBucketToUpload] = useState() const [destinationBucket, setDestinationBucket] = useState() + const [isFolderCreationLoading, setIsFolderCreationLoading] = useState(false) const { buckets, transferFileBetweenBuckets } = useFiles() const { bucket, currentPath } = useFileBrowser() const { profile } = useUser() const [nameError, setNameError] = useState("") const inSharedBucket = useMemo(() => bucket?.type === "share", [bucket]) + + const classes = useStyles({ + width: bucketToUpload ? 600 : 500 + }) + const isReader = useMemo(() => { if (!bucket) return false @@ -210,6 +168,8 @@ const ShareModal = ({ close, fileSystemItems }: IShareFileProps) => { return buckets .filter(buck => buck.type === "share" || buck.type === "csf") + // keep only alive buckets + .filter(buck => buck.status !== "deleting") // filter out the current bucket .filter(buck => buck.id !== bucket?.id) // all buckets where the user is reader or writer @@ -224,15 +184,14 @@ const ShareModal = ({ close, fileSystemItems }: IShareFileProps) => { const hasNoSharedBucket = useMemo(() => bucketsOptions.length === 0, [bucketsOptions.length]) useEffect(() => { - resetUsers() setSharedFolderName("") setNameError("") - }, [resetUsers]) + }, []) // if the user has no shared bucket, we default to new folder creation useEffect(() => { if (hasNoSharedBucket) { - setIsUsingCurrentBucket(false) + setIsUsingExistingBucket(false) } }, [hasNoSharedBucket]) @@ -258,15 +217,16 @@ const ShareModal = ({ close, fileSystemItems }: IShareFileProps) => { return } - if(!destinationBucket && isUsingCurrentBucket){ + if(!destinationBucket && isUsingExistingBucket){ return } let bucketToUpload: BucketKeyPermission | undefined = destinationBucket - if (!isUsingCurrentBucket) { + if (!isUsingExistingBucket) { + setIsFolderCreationLoading(true) try { - const newBucket = await handleCreateSharedFolder(sharedFolderName, sharedFolderReaders, sharedFolderWriters) + const newBucket = await handleCreateSharedFolder(sharedFolderName, [], []) if(!newBucket){ return @@ -276,6 +236,7 @@ const ShareModal = ({ close, fileSystemItems }: IShareFileProps) => { console.error(e) return } + setIsFolderCreationLoading(false) } if(!bucketToUpload){ @@ -284,69 +245,90 @@ const ShareModal = ({ close, fileSystemItems }: IShareFileProps) => { } transferFileBetweenBuckets(bucket, fileSystemItems, currentPath, bucketToUpload, keepOriginalFile) - close() + setBucketToUpload(bucketToUpload) + if (isUsingExistingBucket) { + onClose() + } }, [ bucket, destinationBucket, handleCreateSharedFolder, - isUsingCurrentBucket, + isUsingExistingBucket, sharedFolderName, - sharedFolderReaders, - sharedFolderWriters, keepOriginalFile, - close, + onClose, transferFileBetweenBuckets, currentPath, fileSystemItems ]) + const { captureEvent } = usePosthogContext() + return ( + )} > -
-
- -
-
- - {inSharedBucket - ? t`Copy file` - : t`Share file` - } - -
-
- {isUsingCurrentBucket - ? ( -
- setDestinationBucket(buckets.find((bu) => bu.id === val))} - /> -
- ) - : ( - <> -
+ {bucketToUpload + ? + :
+
+
+ +
+
+ + {inSharedBucket + ? t`Copy file` + : t`Share file` + } + +
+
+
+ {isUsingExistingBucket + ? ( +
+ setDestinationBucket(buckets.find((bu) => bu.id === val))} + /> +
+ ) + : ( +
- {nameError && ( + {!!nameError && ( { )}
-
- onNewUsers(values, "read")} - label={t`Give view-only permission to:`} - labelClassName={classes.inputLabel} - value={sharedFolderReaders} - fetchTags={(inputVal) => handleLookupUser(inputVal, "read")} - placeholder={t`Add by sharing address, username or wallet address`} - styles={{ - control: (provided) => ({ - ...provided, - minHeight: 90, - alignContent: "start" - }) - }} - loadingMessage={t`Loading`} - noOptionsMessage={t`No user found for this query.`} - /> -
-
- onNewUsers(values, "write")} - label={t`Give edit permission to:`} - labelClassName={classes.inputLabel} - value={sharedFolderWriters} - fetchTags={(inputVal) => handleLookupUser(inputVal, "write")} - placeholder={t`Add by sharing address, username or wallet address`} - styles={{ - control: (provided) => ({ - ...provided, - minHeight: 90, - alignContent: "start" - }) - }} - loadingMessage={t`Loading...`} - noOptionsMessage={t`No user found for this query.`} - /> -
- {!!usersError && ( - - {usersError} - - )} - - )} -
-
+ )} +
{!hasNoSharedBucket && (
setIsUsingCurrentBucket(!isUsingCurrentBucket)} + onClick={() => setIsUsingExistingBucket(!isUsingExistingBucket)} > { - isUsingCurrentBucket - ? Create a new shared folder - : Use an existing shared folder + isUsingExistingBucket + ? Or Create a new shared folder + : Or Use an existing shared folder }
)} - {!isReader && ( -
- setKeepOriginalFile(!keepOriginalFile)} - label={t`Keep original files`} - /> +
+ {!isReader && ( +
+ { + captureEvent("copy or move files on share") + setKeepOriginalFile(!keepOriginalFile)} + } + label={t`Keep original files`} + /> +
+ )} +
+ +
- )} -
- -
-
+ } + ) } diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFoldersOverview.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFoldersOverview.tsx index cbae598f21..434e44902e 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFoldersOverview.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/SharedFoldersOverview.tsx @@ -17,7 +17,7 @@ import { BucketKeyPermission, useFiles } from "../../../Contexts/FilesContext" import { t, Trans } from "@lingui/macro" import { createStyles, makeStyles, useThemeSwitcher } from "@chainsafe/common-theme" import { CSFTheme } from "../../../Themes/types" -import CreateOrEditSharedFolderModal from "./CreateOrEditSharedFolderModal" +import CreateOrManageSharedFolderModal from "./CreateOrManageSharedFolderModal" import { useFilesApi } from "../../../Contexts/FilesApiContext" import { ROUTE_LINKS } from "../../FilesRoutes" import SharedFolderRow from "./views/FileSystemItem/SharedFolderRow" @@ -281,7 +281,7 @@ const SharedFolderOverview = () => { showModal={!hasSeenSharingExplainerModal} onHide={hideModal} /> - { diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx index 15edfaf251..8482222332 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx @@ -1115,7 +1115,7 @@ const FilesList = ({ isShared = false }: Props) => { } { !showExplainerBeforeShare && isShareModalOpen && selectedItems.length && { + onClose={() => { setIsShareModalOpen(false) setFilePath(undefined) }} diff --git a/packages/files-ui/src/Contexts/PosthogContext.tsx b/packages/files-ui/src/Contexts/PosthogContext.tsx index 47be991ef7..3021ce91c7 100644 --- a/packages/files-ui/src/Contexts/PosthogContext.tsx +++ b/packages/files-ui/src/Contexts/PosthogContext.tsx @@ -10,6 +10,7 @@ import { useUser } from "./UserContext" export type PosthogContext = { hasOptedIn: boolean posthogInitialized: boolean + captureEvent: (eventName: string, properties?: posthog.Properties) => void } type PosthogProviderProps = posthog.Config & { @@ -18,7 +19,8 @@ type PosthogProviderProps = posthog.Config & { const PosthogContext = React.createContext({ hasOptedIn: false, - posthogInitialized: false + posthogInitialized: false, + captureEvent: () => undefined }) const useStyles = makeStyles( @@ -116,6 +118,12 @@ const PosthogProvider = ({ children }: PosthogProviderProps) => { } }, [posthogInitialized, touchCookieBanner]) + const captureEvent = useCallback((eventName: string, properties?: posthog.Properties) => { + if (posthogInitialized) { + posthog.capture(eventName, properties) + } + }, [posthogInitialized]) + useEffect(() => { if (profile) { posthogInitialized && posthog.identify(profile.userId) @@ -128,7 +136,8 @@ const PosthogProvider = ({ children }: PosthogProviderProps) => { {children} diff --git a/packages/files-ui/src/locales/de/messages.po b/packages/files-ui/src/locales/de/messages.po index e84119bc7a..c6862fb312 100644 --- a/packages/files-ui/src/locales/de/messages.po +++ b/packages/files-ui/src/locales/de/messages.po @@ -166,10 +166,13 @@ msgstr "" msgid "Create a Shared Folder" msgstr "" -msgid "Create a new shared folder" +msgid "Create a sharing link" msgstr "" -msgid "Create a sharing link" +msgid "Create folder & Copy over" +msgstr "" + +msgid "Create folder & Move over" msgstr "" msgid "Create link" @@ -394,9 +397,6 @@ msgstr "Vorschau wird geladen" msgid "Loading your shared folders…" msgstr "" -msgid "Loading..." -msgstr "" - msgid "Looks like you’re signing in from a new browser. Please choose one of the following to continue:" msgstr "Sieht aus, als würden Sie sich über einen neuen Browser anmelden. Bitte wählen Sie eine der folgenden Möglichkeiten, um fortzufahren:" @@ -406,6 +406,9 @@ msgstr "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elemen msgid "Manage Access" msgstr "" +msgid "Manage Shared Folder" +msgstr "" + msgid "Move" msgstr "Verschieben" @@ -430,6 +433,9 @@ msgstr "Name zu lang" msgid "New folder" msgstr "Neuer Ordner" +msgid "New shared folder name" +msgstr "" + msgid "Next" msgstr "Nächste" @@ -475,6 +481,12 @@ msgstr "Nur Sie können dies sehen." msgid "Operating system:" msgstr "Betriebssystem:" +msgid "Or Create a new shared folder" +msgstr "" + +msgid "Or Use an existing shared folder" +msgstr "" + msgid "Or confirm by signing into your Files on any browser you’ve used before." msgstr "" @@ -649,6 +661,9 @@ msgstr "Geteilt" msgid "Shared Folder Name" msgstr "" +msgid "Shared folder name" +msgstr "" + msgid "Shared folders" msgstr "" @@ -799,9 +814,6 @@ msgstr "Eine andere Anmeldemethode verwenden" msgid "Use a saved browser" msgstr "Einen gespeicherten Browser verwenden" -msgid "Use an existing shared folder" -msgstr "" - msgid "User {0} is both a reader and writer" msgstr "" diff --git a/packages/files-ui/src/locales/en/messages.po b/packages/files-ui/src/locales/en/messages.po index 9e448a9c13..18c9225048 100644 --- a/packages/files-ui/src/locales/en/messages.po +++ b/packages/files-ui/src/locales/en/messages.po @@ -166,12 +166,15 @@ msgstr "Create Shared Folder" msgid "Create a Shared Folder" msgstr "Create a Shared Folder" -msgid "Create a new shared folder" -msgstr "Create a new shared folder" - msgid "Create a sharing link" msgstr "Create a sharing link" +msgid "Create folder & Copy over" +msgstr "Create folder & Copy over" + +msgid "Create folder & Move over" +msgstr "Create folder & Move over" + msgid "Create link" msgstr "Create link" @@ -397,9 +400,6 @@ msgstr "Loading preview" msgid "Loading your shared folders…" msgstr "Loading your shared folders…" -msgid "Loading..." -msgstr "Loading..." - msgid "Looks like you’re signing in from a new browser. Please choose one of the following to continue:" msgstr "Looks like you’re signing in from a new browser. Please choose one of the following to continue:" @@ -409,6 +409,9 @@ msgstr "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elemen msgid "Manage Access" msgstr "Manage Access" +msgid "Manage Shared Folder" +msgstr "Manage Shared Folder" + msgid "Move" msgstr "Move" @@ -433,6 +436,9 @@ msgstr "Name too long" msgid "New folder" msgstr "New folder" +msgid "New shared folder name" +msgstr "New shared folder name" + msgid "Next" msgstr "Next" @@ -478,6 +484,12 @@ msgstr "Only you can see this." msgid "Operating system:" msgstr "Operating system:" +msgid "Or Create a new shared folder" +msgstr "Or Create a new shared folder" + +msgid "Or Use an existing shared folder" +msgstr "Or Use an existing shared folder" + msgid "Or confirm by signing into your Files on any browser you’ve used before." msgstr "Or confirm by signing into your Files on any browser you’ve used before." @@ -652,6 +664,9 @@ msgstr "Shared" msgid "Shared Folder Name" msgstr "Shared Folder Name" +msgid "Shared folder name" +msgstr "Shared folder name" + msgid "Shared folders" msgstr "Shared folders" @@ -802,9 +817,6 @@ msgstr "Use a different login method" msgid "Use a saved browser" msgstr "Use a saved browser" -msgid "Use an existing shared folder" -msgstr "Use an existing shared folder" - msgid "User {0} is both a reader and writer" msgstr "User {0} is both a reader and writer" diff --git a/packages/files-ui/src/locales/es/messages.po b/packages/files-ui/src/locales/es/messages.po index ac8d5514b2..12bbce2060 100644 --- a/packages/files-ui/src/locales/es/messages.po +++ b/packages/files-ui/src/locales/es/messages.po @@ -167,10 +167,13 @@ msgstr "" msgid "Create a Shared Folder" msgstr "" -msgid "Create a new shared folder" +msgid "Create a sharing link" msgstr "" -msgid "Create a sharing link" +msgid "Create folder & Copy over" +msgstr "" + +msgid "Create folder & Move over" msgstr "" msgid "Create link" @@ -398,9 +401,6 @@ msgstr "Cargando vista previa" msgid "Loading your shared folders…" msgstr "" -msgid "Loading..." -msgstr "" - msgid "Looks like you’re signing in from a new browser. Please choose one of the following to continue:" msgstr "Parece que está iniciando sesión desde un nuevo navegador. Elija una de las siguientes opciones para continuar:" @@ -410,6 +410,9 @@ msgstr "Lorem ipsum Aenean, y un gran maquillaje. Usamos más y colocamos en rat msgid "Manage Access" msgstr "" +msgid "Manage Shared Folder" +msgstr "" + msgid "Move" msgstr "Moverse" @@ -434,6 +437,9 @@ msgstr "" msgid "New folder" msgstr "Nuevo Folder" +msgid "New shared folder name" +msgstr "" + msgid "Next" msgstr "Próximo" @@ -479,6 +485,12 @@ msgstr "" msgid "Operating system:" msgstr "Sistema operativo:" +msgid "Or Create a new shared folder" +msgstr "" + +msgid "Or Use an existing shared folder" +msgstr "" + msgid "Or confirm by signing into your Files on any browser you’ve used before." msgstr "O confirme iniciando sesión en sus Archivos en cualquier navegador que haya usado antes." @@ -653,6 +665,9 @@ msgstr "" msgid "Shared Folder Name" msgstr "" +msgid "Shared folder name" +msgstr "" + msgid "Shared folders" msgstr "" @@ -803,9 +818,6 @@ msgstr "Utilice un método de inicio de sesión diferente" msgid "Use a saved browser" msgstr "Utilice un navegador guardado" -msgid "Use an existing shared folder" -msgstr "" - msgid "User {0} is both a reader and writer" msgstr "" diff --git a/packages/files-ui/src/locales/fr/messages.po b/packages/files-ui/src/locales/fr/messages.po index 242cd5700b..2be24f4f63 100644 --- a/packages/files-ui/src/locales/fr/messages.po +++ b/packages/files-ui/src/locales/fr/messages.po @@ -167,12 +167,15 @@ msgstr "Créer un dossier partagé" msgid "Create a Shared Folder" msgstr "Créer un dossier partagé" -msgid "Create a new shared folder" -msgstr "Créer un nouveau dossier partagé" - msgid "Create a sharing link" msgstr "" +msgid "Create folder & Copy over" +msgstr "" + +msgid "Create folder & Move over" +msgstr "" + msgid "Create link" msgstr "" @@ -398,9 +401,6 @@ msgstr "Chargement de l’aperçu" msgid "Loading your shared folders…" msgstr "Chargement de vos dossiers partagés…" -msgid "Loading..." -msgstr "Chargement…" - msgid "Looks like you’re signing in from a new browser. Please choose one of the following to continue:" msgstr "Il semble que vous vous connectiez à partir d’un nouveau navigateur. Veuillez choisir une des options suivantes pour continuer :" @@ -410,6 +410,9 @@ msgstr "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elemen msgid "Manage Access" msgstr "Gérer l’accès" +msgid "Manage Shared Folder" +msgstr "" + msgid "Move" msgstr "Déplacer" @@ -434,6 +437,9 @@ msgstr "Le nom est trop long" msgid "New folder" msgstr "Nouveau dossier" +msgid "New shared folder name" +msgstr "" + msgid "Next" msgstr "Suivant" @@ -479,6 +485,12 @@ msgstr "Vous seul(e) pouvez voir ceci." msgid "Operating system:" msgstr "Système d’exploitation :" +msgid "Or Create a new shared folder" +msgstr "" + +msgid "Or Use an existing shared folder" +msgstr "" + msgid "Or confirm by signing into your Files on any browser you’ve used before." msgstr "Ou accepte la requête de connexion depuis n’importe quel appareil ou navigateur utilisé auparavant." @@ -653,6 +665,9 @@ msgstr "Partagé" msgid "Shared Folder Name" msgstr "Nom du dossier partagé" +msgid "Shared folder name" +msgstr "" + msgid "Shared folders" msgstr "Dossiers partagés" @@ -789,7 +804,7 @@ msgid "Update" msgstr "Mettre à jour" msgid "Update Shared Folder" -msgstr "Mettre à jour le dossier partagé" +msgstr "" msgid "Upload" msgstr "Téléverser" @@ -803,9 +818,6 @@ msgstr "Utilisez une méthode de connexion différente" msgid "Use a saved browser" msgstr "Utiliser un navigateur enregistré" -msgid "Use an existing shared folder" -msgstr "Utiliser un dossier partagé existant" - msgid "User {0} is both a reader and writer" msgstr "L'utilisateur {0} est dans les auteurs et lecteurs" diff --git a/packages/files-ui/src/locales/no/messages.po b/packages/files-ui/src/locales/no/messages.po index 3b99b371b3..d44b4e5dfa 100644 --- a/packages/files-ui/src/locales/no/messages.po +++ b/packages/files-ui/src/locales/no/messages.po @@ -166,10 +166,13 @@ msgstr "" msgid "Create a Shared Folder" msgstr "" -msgid "Create a new shared folder" +msgid "Create a sharing link" msgstr "" -msgid "Create a sharing link" +msgid "Create folder & Copy over" +msgstr "" + +msgid "Create folder & Move over" msgstr "" msgid "Create link" @@ -394,9 +397,6 @@ msgstr "" msgid "Loading your shared folders…" msgstr "" -msgid "Loading..." -msgstr "" - msgid "Looks like you’re signing in from a new browser. Please choose one of the following to continue:" msgstr "" @@ -406,6 +406,9 @@ msgstr "" msgid "Manage Access" msgstr "" +msgid "Manage Shared Folder" +msgstr "" + msgid "Move" msgstr "Flytt" @@ -430,6 +433,9 @@ msgstr "Navnet er for langt" msgid "New folder" msgstr "Ny mappe" +msgid "New shared folder name" +msgstr "" + msgid "Next" msgstr "Neste" @@ -475,6 +481,12 @@ msgstr "Kun du kan se dette." msgid "Operating system:" msgstr "Operativsystem:" +msgid "Or Create a new shared folder" +msgstr "" + +msgid "Or Use an existing shared folder" +msgstr "" + msgid "Or confirm by signing into your Files on any browser you’ve used before." msgstr "" @@ -649,6 +661,9 @@ msgstr "Delt" msgid "Shared Folder Name" msgstr "" +msgid "Shared folder name" +msgstr "" + msgid "Shared folders" msgstr "" @@ -799,9 +814,6 @@ msgstr "Bruk en annen innloggingsmetode" msgid "Use a saved browser" msgstr "" -msgid "Use an existing shared folder" -msgstr "" - msgid "User {0} is both a reader and writer" msgstr "" From 7170268e916955d20fb330a42fdc7160bbc5ac7e Mon Sep 17 00:00:00 2001 From: Michael Yankelev <12774278+FSM1@users.noreply.github.com> Date: Fri, 19 Nov 2021 18:36:37 +0200 Subject: [PATCH 17/44] Revert "copy working" (#1759) This reverts commit 424f4278a558c64d6d9317693aa40a4ee477dd03. Co-authored-by: Tanmoy Basak Anjan --- .../FileBrowsers/LinkSharing/SharingLink.tsx | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx index 347dcb5414..adc8cca9f3 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx @@ -158,43 +158,40 @@ const SharingLink = ({ nonce, bucketEncryptionKey, refreshNonces }: Props) => { const debouncedSwitchCopied = debounce(() => setCopied(false), 3000) - const onCopyInfo = useCallback(() => { - // this doesn't work on Mobile - // navigator.clipboard.writeText(link) - // .then(() => { - // setCopied(true) - // debouncedSwitchCopied() - // }) - // .catch(console.error) + navigator.clipboard.writeText(link) + .then(() => { + setCopied(true) + debouncedSwitchCopied() + }) + .catch(console.error) - //Create a textbox field where we can insert text to. - const copyFrom = document.createElement("textarea") + // //Create a textbox field where we can insert text to. + // const copyFrom = document.createElement("textarea") - //Set the text content to be the text you wished to copy. - copyFrom.textContent = link + // //Set the text content to be the text you wished to copy. + // copyFrom.textContent = link - //Append the textbox field into the body as a child. - //"execCommand()" only works when there exists selected text, and the text is inside - //document.body (meaning the text is part of a valid rendered HTML element). - document.body.appendChild(copyFrom) + // //Append the textbox field into the body as a child. + // //"execCommand()" only works when there exists selected text, and the text is inside + // //document.body (meaning the text is part of a valid rendered HTML element). + // document.body.appendChild(copyFrom) - //Select all the text! - copyFrom.select() + // //Select all the text! + // copyFrom.select() - //Execute command - document.execCommand("copy") + // //Execute command + // document.execCommand("copy") - //(Optional) De-select the text using blur(). - copyFrom.blur() + // //(Optional) De-select the text using blur(). + // copyFrom.blur() - //Remove the textbox field from the document.body, so no other JavaScript nor - //other elements can get access to this. - document.body.removeChild(copyFrom) + // //Remove the textbox field from the document.body, so no other JavaScript nor + // //other elements can get access to this. + // document.body.removeChild(copyFrom) setCopied(true) debouncedSwitchCopied() - }, [debouncedSwitchCopied, link]) const onDeleteNonce = useCallback(() => { From 9dc9db8ce6a4bc357ca292f123425f69ba3bff36 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Mon, 22 Nov 2021 11:35:29 +0100 Subject: [PATCH 18/44] Translations update from Hosted Weblate (#1753) * Translated using Weblate (French) Currently translated at 100.0% (304 of 304 strings) Translation: ChainSafe Files/Chainsafe Files user interface Translate-URL: https://hosted.weblate.org/projects/chainsafe-files/chainsafe-files-user-interface/fr/ * Translated using Weblate (French) Currently translated at 100.0% (310 of 310 strings) Translation: ChainSafe Files/Chainsafe Files user interface Translate-URL: https://hosted.weblate.org/projects/chainsafe-files/chainsafe-files-user-interface/fr/ * Translated using Weblate (French) Currently translated at 100.0% (317 of 317 strings) Translation: ChainSafe Files/Chainsafe Files user interface Translate-URL: https://hosted.weblate.org/projects/chainsafe-files/chainsafe-files-user-interface/fr/ Co-authored-by: J. Lavoie --- packages/files-ui/src/locales/fr/messages.po | 279 ++++++++++++++----- 1 file changed, 210 insertions(+), 69 deletions(-) diff --git a/packages/files-ui/src/locales/fr/messages.po b/packages/files-ui/src/locales/fr/messages.po index 2be24f4f63..db12edfd27 100644 --- a/packages/files-ui/src/locales/fr/messages.po +++ b/packages/files-ui/src/locales/fr/messages.po @@ -3,19 +3,26 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-04-23 11:05+0200\n" -"PO-Revision-Date: 2021-11-08 03:51+0000\n" +"PO-Revision-Date: 2021-11-21 00:53+0000\n" "Last-Translator: J. Lavoie \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.9.1\n" "Mime-Version: 1.0\n" -msgid "A backup secret phrase will be generated and used for your account.<0/>We do not store it and <1>it can only be displayed once. Save it somewhere safe!" -msgstr "Une phrase secrète de sauvegarde sera générée et utilisé pour ce compte.<0/>Nous ne la sauvergardons pas <1>elle ne peut être affichée qu’une seule fois. Gardez-la dans un endroit sûr !" +msgid "" +"A backup secret phrase will be generated and used for your account.<0/>We do " +"not store it and <1>it can only be displayed once. Save it somewhere " +"safe!" +msgstr "" +"Une phrase secrète de sauvegarde sera générée et utilisé pour ce compte.<0/" +">Nous ne la sauvergardons pas <1>elle ne peut être affichée qu’une seule " +"fois. Gardez-la dans un endroit sûr !" msgid "A better sharing experience is coming soon." msgstr "Une meilleure expérience de partage sera bientôt disponible." @@ -30,34 +37,44 @@ msgid "Account" msgstr "Compte" msgid "Active links" -msgstr "" +msgstr "Liens actifs" msgid "Add a username" msgstr "Ajouter un nom d’utilisateur" -msgid "Add at least one more authentication method to protect your account. You’d only need any two to sign in to Files from any device." -msgstr "Ajoutez au moins une méthode d’authentification pour protéger ce compte. Vous avez besoin de deux méthode pour accéder à Files depuis n’importe quel appareil." +msgid "" +"Add at least one more authentication method to protect your account. You’d " +"only need any two to sign in to Files from any device." +msgstr "" +"Ajoutez au moins une méthode d’authentification pour protéger ce compte. " +"Vous avez besoin de deux méthode pour accéder à Files depuis n’importe quel " +"appareil." msgid "Add by sharing address, username or wallet address" -msgstr "Ajouter par adresse de partage, nom d'utilisateur ou adresse de portefeuille" +msgstr "" +"Ajouter par adresse de partage, nom d'utilisateur ou adresse de portefeuille" msgid "Add more files" msgstr "Ajouter d’autres fichiers" msgid "Add viewers and editors by username, sharing id or Ethereum address." -msgstr "Ajoutez des personnes pouvant visualiser ou afficher par nom d'utilisateur, identifiant de partage ou adresse Ethereum." +msgstr "" +"Ajoutez des personnes pouvant visualiser ou afficher par nom d'utilisateur, " +"identifiant de partage ou adresse Ethereum." msgid "Adding you to the shared folder..." msgstr "Je vous ajoute au dossier partagé…" msgid "Allow lookup by sharing key, wallet address or username" msgstr "" +"Permettre la recherche par clé de partage, adresse du portefeuille ou nom " +"d'utilisateur" msgid "An error occurred:" msgstr "Une erreur s'est produite :" msgid "Anyone with the link can:" -msgstr "" +msgstr "Toute personne ayant le lien peut le faire :" msgid "Approve" msgstr "Accepter" @@ -65,8 +82,12 @@ msgstr "Accepter" msgid "Backup secret phrase" msgstr "Phrase secrète de sauvegarde" -msgid "Backup secret phrase does not match user account, please double-check and try again." -msgstr "La phrase secrète de sauvegarde est incorrecte, merci de vérifier et réessayer." +msgid "" +"Backup secret phrase does not match user account, please double-check and " +"try again." +msgstr "" +"La phrase secrète de sauvegarde est incorrecte, merci de vérifier et " +"réessayer." msgid "Bin" msgstr "Corbeille" @@ -80,11 +101,19 @@ msgstr "Explorateur :" msgid "Bucket id" msgstr "Identifiant du seau" -msgid "By connecting your wallet, you agree to our <0>Terms of Service and <1>Privacy Policy" -msgstr "En connectant votre portefeuille, vous acceptez nos <0>conditions de service et notre <1>politique de confidentialité" +msgid "" +"By connecting your wallet, you agree to our <0>Terms of Service and " +"<1>Privacy Policy" +msgstr "" +"En connectant votre portefeuille, vous acceptez nos <0>conditions de " +"service et notre <1>politique de confidentialité" -msgid "By forgetting this browser, you will not be able to use its associated recovery key to sign-in." -msgstr "En oubliant ce navigateur, vous ne pourrez pas utiliser la clé de récupération qui lui est associée pour vous connecter." +msgid "" +"By forgetting this browser, you will not be able to use its associated " +"recovery key to sign-in." +msgstr "" +"En oubliant ce navigateur, vous ne pourrez pas utiliser la clé de " +"récupération qui lui est associée pour vous connecter." msgid "CID (Content Identifier)" msgstr "CID (Identifiant de contenu)" @@ -99,7 +128,8 @@ msgid "Change password" msgstr "Changer le mot de passe" msgid "Check your inbox! We've sent another email." -msgstr "Vérifiez votre boîte de réception ! Nous avons envoyé un autre courriel." +msgstr "" +"Vérifiez votre boîte de réception ! Nous avons envoyé un autre courriel." msgid "Click or drag to upload files" msgstr "Cliquer ou faire glisser un ficher pour le téléverser" @@ -168,16 +198,16 @@ msgid "Create a Shared Folder" msgstr "Créer un dossier partagé" msgid "Create a sharing link" -msgstr "" +msgstr "Créer un lien de partage" msgid "Create folder & Copy over" -msgstr "" +msgstr "Créer un dossier et le copier" msgid "Create folder & Move over" -msgstr "" +msgstr "Créer un dossier et le déplacer" msgid "Create link" -msgstr "" +msgstr "Créer un lien" msgid "Create your public username in <0>Settings!" msgstr "Créez votre nom d'utilisateur public dans <0>Paramètres !" @@ -311,8 +341,12 @@ msgstr "Le téléversement de dossiers n'est pas actuellement pris en charge" msgid "Folders" msgstr "Dossiers" -msgid "For security reasons, each time you sign in we’ll ask you for one of the following to confirm your identity." -msgstr "Pour des raisons de sécurité, chaque fois que vous vous connectez, nous vous demanderons l’une des informations suivantes pour confirmer votre identité." +msgid "" +"For security reasons, each time you sign in we’ll ask you for one of the " +"following to confirm your identity." +msgstr "" +"Pour des raisons de sécurité, chaque fois que vous vous connectez, nous vous " +"demanderons l’une des informations suivantes pour confirmer votre identité." msgid "Forget this browser" msgstr "Oublier ce navigateur" @@ -350,8 +384,13 @@ msgstr "Compris" msgid "Hello again!" msgstr "Ravis de vous revoir !" -msgid "Hey! You only have two sign-in methods. If you lose that and have only one left, you will be locked out of your account forever." -msgstr "Hé ! Vous n’avez que deux méthodes de connexion. Si vous en perdez une et qu’il ne vous en reste qu’une, vous ne pourrez plus jamais vous connecter à votre compte." +msgid "" +"Hey! You only have two sign-in methods. If you lose that and have only one " +"left, you will be locked out of your account forever." +msgstr "" +"Hé ! Vous n’avez que deux méthodes de connexion. Si vous en perdez une et " +"qu’il ne vous en reste qu’une, vous ne pourrez plus jamais vous connecter à " +"votre compte." msgid "Hold on, we are logging you in…" msgstr "Un instant, nous te connectons…" @@ -359,8 +398,17 @@ msgstr "Un instant, nous te connectons…" msgid "Home" msgstr "Accueil" -msgid "If you think this file does not comply with our <0>Terms of Service, please send the following information to report@files.chainsafe.io. Beware that by sending the file's decryption key, an admin can then decrypt any file in this shared folder." -msgstr "Si vous pensez que ce fichier n'est pas conforme à nos <0>Conditions de service, veuillez envoyer les informations suivantes à report@files.chainsafe.io. Attention, en envoyant la clé de déchiffrement du fichier, un administrateur peut ensuite déchiffrer n'importe quel fichier de ce dossier partagé." +msgid "" +"If you think this file does not comply with our <0>Terms of Service, " +"please send the following information to report@files.chainsafe.io. Beware " +"that by sending the file's decryption key, an admin can then decrypt any " +"file in this shared folder." +msgstr "" +"Si vous pensez que ce fichier n'est pas conforme à nos <0>Conditions de " +"service, veuillez envoyer les informations suivantes à report@files." +"chainsafe.io. Attention, en envoyant la clé de déchiffrement du fichier, un " +"administrateur peut ensuite déchiffrer n'importe quel fichier de ce dossier " +"partagé." msgid "Info" msgstr "Infos" @@ -401,17 +449,25 @@ msgstr "Chargement de l’aperçu" msgid "Loading your shared folders…" msgstr "Chargement de vos dossiers partagés…" -msgid "Looks like you’re signing in from a new browser. Please choose one of the following to continue:" -msgstr "Il semble que vous vous connectiez à partir d’un nouveau navigateur. Veuillez choisir une des options suivantes pour continuer :" +msgid "" +"Looks like you’re signing in from a new browser. Please choose one of the " +"following to continue:" +msgstr "" +"Il semble que vous vous connectiez à partir d’un nouveau navigateur. " +"Veuillez choisir une des options suivantes pour continuer :" -msgid "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." -msgstr "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." +msgid "" +"Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum " +"sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." +msgstr "" +"Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum " +"sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." msgid "Manage Access" msgstr "Gérer l’accès" msgid "Manage Shared Folder" -msgstr "" +msgstr "Gérer le dossier partagé" msgid "Move" msgstr "Déplacer" @@ -438,7 +494,7 @@ msgid "New folder" msgstr "Nouveau dossier" msgid "New shared folder name" -msgstr "" +msgstr "Nouveau nom de dossier partagé" msgid "Next" msgstr "Suivant" @@ -486,13 +542,16 @@ msgid "Operating system:" msgstr "Système d’exploitation :" msgid "Or Create a new shared folder" -msgstr "" +msgstr "Ou créer un nouveau dossier partagé" msgid "Or Use an existing shared folder" -msgstr "" +msgstr "Ou utiliser un dossier partagé existant" -msgid "Or confirm by signing into your Files on any browser you’ve used before." -msgstr "Ou accepte la requête de connexion depuis n’importe quel appareil ou navigateur utilisé auparavant." +msgid "" +"Or confirm by signing into your Files on any browser you’ve used before." +msgstr "" +"Ou accepte la requête de connexion depuis n’importe quel appareil ou " +"navigateur utilisé auparavant." msgid "Or using one of the following:" msgstr "Ou en utilisant l’un des moyens suivants :" @@ -506,8 +565,10 @@ msgstr "Mot de passe" msgid "Password confirmation is required" msgstr "La confirmation du mot de passe est requise" -msgid "Password does not match user account, please double-check and try again." -msgstr "Le mot de passe ne correspond pas au compte, merci de vérifier et réessayer." +msgid "" +"Password does not match user account, please double-check and try again." +msgstr "" +"Le mot de passe ne correspond pas au compte, merci de vérifier et réessayer." msgid "Password needs to be more complex" msgstr "Le mot de passe doit être plus complexe" @@ -666,7 +727,7 @@ msgid "Shared Folder Name" msgstr "Nom du dossier partagé" msgid "Shared folder name" -msgstr "" +msgstr "Nom du dossier partagé" msgid "Shared folders" msgstr "Dossiers partagés" @@ -705,7 +766,9 @@ msgid "Social Sign-in Wallet" msgstr "Connecté avec un réseau social ou wallet" msgid "Something went wrong with email login! Please try again." -msgstr "Un problème est survenu lors de la connexion avec courriel ! Veuillez réessayer." +msgstr "" +"Un problème est survenu lors de la connexion avec courriel ! Veuillez " +"réessayer." msgid "Something went wrong!" msgstr "Quelque chose a mal tourné !" @@ -725,8 +788,12 @@ msgstr "Plan de stockage" msgid "Stored by miner" msgstr "Sauvegardé par le mineur" -msgid "System maintenance is scheduled to start at {0}. The system will be unavailable." -msgstr "Une maintenance du système est prévue pour démarrer à {0}. Le système sera indisponible." +msgid "" +"System maintenance is scheduled to start at {0}. The system will be " +"unavailable." +msgstr "" +"Une maintenance du système est prévue pour démarrer à {0}. Le système sera " +"indisponible." msgid "Teams" msgstr "Équipes" @@ -765,7 +832,8 @@ msgid "There was an error deleting your data" msgstr "Une erreur s'est produite lors de la suppression de vos données" msgid "There was an error getting search results" -msgstr "Une erreur s’est produite lors de l’obtention des résultats de recherche" +msgstr "" +"Une erreur s’est produite lors de l’obtention des résultats de recherche" msgid "There was an error getting the preview." msgstr "Une erreur s’est produite lors de la génération de l’aperçu." @@ -779,8 +847,11 @@ msgstr "Une erreur s'est produite lors de la restauration de vos données" msgid "There was an error when setting username." msgstr "Une erreur s'est produite lors de la définition du nom d'utilisateur." -msgid "This link is marlformed. Please verify that you copy/pasted it correctly." -msgstr "Ce lien est marlformé. Veuillez vérifier que vous l'avez copié/collé correctement." +msgid "" +"This link is marlformed. Please verify that you copy/pasted it correctly." +msgstr "" +"Ce lien est marlformé. Veuillez vérifier que vous l'avez copié/collé " +"correctement." msgid "This link is not valid any more." msgstr "Ce lien n'est plus valide." @@ -791,8 +862,17 @@ msgstr "Ce nom d’utilisateur est déjà pris" msgid "This website uses cookies" msgstr "Ce site web utilise des cookies" -msgid "This website uses cookies that help the website function and track interactions for analytics purposes. You have the right to decline our use of cookies. For us to provide a customizable user experience to you, please click on the Accept button below.<0>Learn more" -msgstr "Ce site web utilise des cookies qui l'aident à fonctionner et à suivre les interactions à des fins d'analyse. Vous avez le droit de refuser notre utilisation des cookies. Pour que nous puissions vous offrir une expérience utilisateur personnalisable, veuillez cliquer sur le bouton Accepter ci-dessous.<0>En savoir plus" +msgid "" +"This website uses cookies that help the website function and track " +"interactions for analytics purposes. You have the right to decline our use " +"of cookies. For us to provide a customizable user experience to you, please " +"click on the Accept button below.<0>Learn more" +msgstr "" +"Ce site web utilise des cookies qui l'aident à fonctionner et à suivre les " +"interactions à des fins d'analyse. Vous avez le droit de refuser notre " +"utilisation des cookies. Pour que nous puissions vous offrir une expérience " +"utilisateur personnalisable, veuillez cliquer sur le bouton Accepter ci-" +"dessous.<0>En savoir plus" msgid "Try again" msgstr "Essayer de nouveau" @@ -804,7 +884,7 @@ msgid "Update" msgstr "Mettre à jour" msgid "Update Shared Folder" -msgstr "" +msgstr "Mettre à jour le dossier partagé" msgid "Upload" msgstr "Téléverser" @@ -828,7 +908,9 @@ msgid "Username set successfully" msgstr "Nom d’utilisateur défini avec succès" msgid "Usernames are public and can't be changed after creation." -msgstr "Les noms d’utilisateur sont publics et ne peuvent pas être modifiés après leur création." +msgstr "" +"Les noms d’utilisateur sont publics et ne peuvent pas être modifiés après " +"leur création." msgid "Using an email:" msgstr "En utilisant un courriel :" @@ -854,20 +936,35 @@ msgstr "Addresse du wallet" msgid "Want to help shape this product?" msgstr "Vous voulez participer à l'élaboration de ce produit ?" -msgid "We are performing routine maintenance of the system. Service status updates will be posted on the <0>Files Support Channel on Discord" -msgstr "Nous effectuons une maintenance de routine du système. Les mises à jour de l'état du service seront postées sur le canal <0>Files Support<0> sur Discord" +msgid "" +"We are performing routine maintenance of the system. Service status updates " +"will be posted on the <0>Files Support Channel on Discord" +msgstr "" +"Nous effectuons une maintenance de routine du système. Les mises à jour de " +"l'état du service seront postées sur le canal <0>Files Support<0> sur Discord" msgid "We can't encrypt files larger than 2GB. Some items will not be uploaded" -msgstr "Nous ne pouvons pas chiffrer les fichiers de plus de 2 Go. Certains éléments ne pourront pas être téléversés" +msgstr "" +"Nous ne pouvons pas chiffrer les fichiers de plus de 2 Go. Certains éléments " +"ne pourront pas être téléversés" msgid "Web3: {0}" msgstr "Web3 : {0}" -msgid "We’ve got a new authentication system in place. All you need to do is enter your password again to migrate your credentials over to the new system." -msgstr "Nous avons mis en place un nouveau système d’authentification. Tout ce que vous avez à faire est de saisir à nouveau votre mot de passe pour migrer vos informations d’identification vers le nouveau système." +msgid "" +"We’ve got a new authentication system in place. All you need to do is enter " +"your password again to migrate your credentials over to the new system." +msgstr "" +"Nous avons mis en place un nouveau système d’authentification. Tout ce que " +"vous avez à faire est de saisir à nouveau votre mot de passe pour migrer vos " +"informations d’identification vers le nouveau système." -msgid "We’ve sent an email to {email}. It contains a verification code that’ll sign you in super quickly!" -msgstr "Nous avons envoyé un courriel à {email}. Il contient un code de vérification pour vous connecter !" +msgid "" +"We’ve sent an email to {email}. It contains a verification code that’ll sign " +"you in super quickly!" +msgstr "" +"Nous avons envoyé un courriel à {email}. Il contient un code de vérification " +"pour vous connecter !" msgid "What a fine day it is." msgstr "Quelle belle journée." @@ -882,7 +979,8 @@ msgid "You can change this later." msgstr "Vous pouvez en changer plus tard." msgid "You can now create shared folders to share a file." -msgstr "Vous pouvez maintenant créer des dossiers partagés pour partager un fichier." +msgstr "" +"Vous pouvez maintenant créer des dossiers partagés pour partager un fichier." msgid "You can't move folders to this path" msgstr "Vous ne pouvez pas déplacer les dossiers vers ce chemin" @@ -897,13 +995,19 @@ msgid "You were added to the shared folder ({0}): {1}" msgstr "Vous avez été ajouté(e) au dossier partagé ({0}) : {1}" msgid "You will need to sign a message in your wallet to complete sign in." -msgstr "Vous devrez signer un message avec votre wallet pour terminer la procédure connexion." +msgstr "" +"Vous devrez signer un message avec votre wallet pour terminer la procédure " +"connexion." -msgid "Your recovery key can be used to restore your account in place of your backup secret phrase." -msgstr "Votre clé de récupération peut être utilisée pour restaurer votre compte à la place de votre phrase de sauvegarde secrète." +msgid "" +"Your recovery key can be used to restore your account in place of your " +"backup secret phrase." +msgstr "" +"Votre clé de récupération peut être utilisée pour restaurer votre compte à " +"la place de votre phrase de sauvegarde secrète." msgid "can-edit" -msgstr "" +msgstr "peut-modifier" msgid "me" msgstr "moi" @@ -915,16 +1019,26 @@ msgid "unknown" msgstr "inconnu" msgid "view-only" -msgstr "" +msgstr "affichage seul" msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" -msgstr "{0, plural, one {Téléchargement de {1} fichier} other {Téléchargement de {2} fichiers}}" +msgstr "" +"{0, plural, one {Téléchargement de {1} fichier} other {Téléchargement de {2} " +"fichiers}}" -msgid "{0, plural, one {Encrypting and uploading {1} file} other {Encrypting and uploading {2} files}}" -msgstr "{0, plural, one {Chiffrement et téléversement de {1} fichier} other {Chiffrement et téléversements {2} fichiers}}" +msgid "" +"{0, plural, one {Encrypting and uploading {1} file} other {Encrypting and " +"uploading {2} files}}" +msgstr "" +"{0, plural, one {Chiffrement et téléversement de {1} fichier} other " +"{Chiffrement et téléversements {2} fichiers}}" -msgid "{0, plural, one {You are about to delete {1} item.} other {You are about to delete {2} items.}}" -msgstr "{0, plural, one {Vous êtes sur le point de supprimer {1} élément.} other {Vous êtes sur le point de supprimer {2} éléments.}}" +msgid "" +"{0, plural, one {You are about to delete {1} item.} other {You are about to " +"delete {2} items.}}" +msgstr "" +"{0, plural, one {Vous êtes sur le point de supprimer {1} élément.} other " +"{Vous êtes sur le point de supprimer {2} éléments.}}" msgid "{0} cancelled" msgstr "{0} annulé(s)" @@ -943,3 +1057,30 @@ msgstr "{0} {fileProgress} – {1}" msgid "{successCount} files transferred successfully, {0} failed" msgstr "{successCount} fichiers transférés avec succès, {0} échec(s)" + +msgid "Create a new shared folder" +msgstr "Créer un nouveau dossier partagé" + +msgid "Loading..." +msgstr "Chargement…" + +msgid "Use an existing shared folder" +msgstr "Utiliser un dossier partagé existant" + +msgid "Copy link" +msgstr "Copier le lien" + +msgid "Create new link" +msgstr "Créer un nouveau lien" + +msgid "Sharing link" +msgstr "Lien de partage" + +msgid "edit rights" +msgstr "droits de modification" + +msgid "read rights" +msgstr "droits de lecture" + +msgid "with" +msgstr "avec" From c2ee766e8b0ab03f643d2bb74b204aefe7bfbe92 Mon Sep 17 00:00:00 2001 From: "imgbot[bot]" <31301654+imgbot[bot]@users.noreply.github.com> Date: Mon, 22 Nov 2021 10:39:39 +0000 Subject: [PATCH 19/44] [ImgBot] Optimize images (#1767) *Total -- 66.99kb -> 35.67kb (46.75%) /packages/files-ui/cypress/fixtures/uploadedFiles/chainsafe.png -- 38.39kb -> 14.61kb (61.94%) /packages/files-ui/src/Media/sharingExplainer/step2.png -- 9.24kb -> 4.60kb (50.19%) /packages/files-ui/src/Media/sharingExplainer/step1.png -- 5.66kb -> 3.65kb (35.47%) /packages/common-components/src/Icons/svgs/ethereum-logo.svg -- 0.78kb -> 0.62kb (20.88%) /packages/files-ui/src/Media/sharingExplainer/step3.png -- 12.38kb -> 11.66kb (5.87%) /packages/common-components/src/Icons/svgs/document.svg -- 0.54kb -> 0.53kb (0.55%) Signed-off-by: ImgBotApp Co-authored-by: ImgBotApp Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> --- .../src/Icons/svgs/document.svg | 4 +- .../src/Icons/svgs/ethereum-logo.svg | 14 +- .../fixtures/uploadedFiles/chainsafe.png | Bin 39311 -> 14960 bytes .../src/Media/sharingExplainer/step1.png | Bin 5799 -> 3742 bytes .../src/Media/sharingExplainer/step2.png | Bin 9457 -> 4711 bytes .../src/Media/sharingExplainer/step3.png | Bin 12680 -> 11936 bytes packages/files-ui/src/locales/fr/messages.po | 249 ++++-------------- 7 files changed, 56 insertions(+), 211 deletions(-) diff --git a/packages/common-components/src/Icons/svgs/document.svg b/packages/common-components/src/Icons/svgs/document.svg index da7d381789..b805583c15 100644 --- a/packages/common-components/src/Icons/svgs/document.svg +++ b/packages/common-components/src/Icons/svgs/document.svg @@ -1,3 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/packages/common-components/src/Icons/svgs/ethereum-logo.svg b/packages/common-components/src/Icons/svgs/ethereum-logo.svg index 15eb15600a..7fe1413ff0 100644 --- a/packages/common-components/src/Icons/svgs/ethereum-logo.svg +++ b/packages/common-components/src/Icons/svgs/ethereum-logo.svg @@ -1,13 +1 @@ - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/packages/files-ui/cypress/fixtures/uploadedFiles/chainsafe.png b/packages/files-ui/cypress/fixtures/uploadedFiles/chainsafe.png index eee4cbc3b087af456327b3aebfb4b4c881c30d1f..8a019d65e3e85405e56c87f36e4f146e64fb5635 100644 GIT binary patch literal 14960 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 diff --git a/packages/files-ui/src/Media/sharingExplainer/step1.png b/packages/files-ui/src/Media/sharingExplainer/step1.png index 432ce8c0a9a2e78b0a58233e2dbad8f233618529..4e25c8fa751285e021e3759292e09e0d8160e152 100644 GIT binary patch literal 3742 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 literal 9457 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 diff --git a/packages/files-ui/src/Media/sharingExplainer/step3.png b/packages/files-ui/src/Media/sharingExplainer/step3.png index cacabf056932fcfc575d6af19ed6814d07f9b228..bd43adaa93d68eac671c8be9e1ad7602f6fd3dd0 100644 GIT binary patch literal 11936 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 Y3N!{OYG|e?19AXGIaS#*X|u5Z1+jsT2><{9 delta 12363 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 Z2VVSmUsFs&-+u&xWF!?OD#Q!|{|9vb%me@c diff --git a/packages/files-ui/src/locales/fr/messages.po b/packages/files-ui/src/locales/fr/messages.po index db12edfd27..473586161d 100644 --- a/packages/files-ui/src/locales/fr/messages.po +++ b/packages/files-ui/src/locales/fr/messages.po @@ -5,8 +5,7 @@ msgstr "" "POT-Creation-Date: 2021-04-23 11:05+0200\n" "PO-Revision-Date: 2021-11-21 00:53+0000\n" "Last-Translator: J. Lavoie \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -15,14 +14,8 @@ msgstr "" "X-Generator: Weblate 4.9.1\n" "Mime-Version: 1.0\n" -msgid "" -"A backup secret phrase will be generated and used for your account.<0/>We do " -"not store it and <1>it can only be displayed once. Save it somewhere " -"safe!" -msgstr "" -"Une phrase secrète de sauvegarde sera générée et utilisé pour ce compte.<0/" -">Nous ne la sauvergardons pas <1>elle ne peut être affichée qu’une seule " -"fois. Gardez-la dans un endroit sûr !" +msgid "A backup secret phrase will be generated and used for your account.<0/>We do not store it and <1>it can only be displayed once. Save it somewhere safe!" +msgstr "Une phrase secrète de sauvegarde sera générée et utilisé pour ce compte.<0/>Nous ne la sauvergardons pas <1>elle ne peut être affichée qu’une seule fois. Gardez-la dans un endroit sûr !" msgid "A better sharing experience is coming soon." msgstr "Une meilleure expérience de partage sera bientôt disponible." @@ -42,33 +35,23 @@ msgstr "Liens actifs" msgid "Add a username" msgstr "Ajouter un nom d’utilisateur" -msgid "" -"Add at least one more authentication method to protect your account. You’d " -"only need any two to sign in to Files from any device." -msgstr "" -"Ajoutez au moins une méthode d’authentification pour protéger ce compte. " -"Vous avez besoin de deux méthode pour accéder à Files depuis n’importe quel " -"appareil." +msgid "Add at least one more authentication method to protect your account. You’d only need any two to sign in to Files from any device." +msgstr "Ajoutez au moins une méthode d’authentification pour protéger ce compte. Vous avez besoin de deux méthode pour accéder à Files depuis n’importe quel appareil." msgid "Add by sharing address, username or wallet address" -msgstr "" -"Ajouter par adresse de partage, nom d'utilisateur ou adresse de portefeuille" +msgstr "Ajouter par adresse de partage, nom d'utilisateur ou adresse de portefeuille" msgid "Add more files" msgstr "Ajouter d’autres fichiers" msgid "Add viewers and editors by username, sharing id or Ethereum address." -msgstr "" -"Ajoutez des personnes pouvant visualiser ou afficher par nom d'utilisateur, " -"identifiant de partage ou adresse Ethereum." +msgstr "Ajoutez des personnes pouvant visualiser ou afficher par nom d'utilisateur, identifiant de partage ou adresse Ethereum." msgid "Adding you to the shared folder..." msgstr "Je vous ajoute au dossier partagé…" msgid "Allow lookup by sharing key, wallet address or username" -msgstr "" -"Permettre la recherche par clé de partage, adresse du portefeuille ou nom " -"d'utilisateur" +msgstr "Permettre la recherche par clé de partage, adresse du portefeuille ou nom d'utilisateur" msgid "An error occurred:" msgstr "Une erreur s'est produite :" @@ -82,12 +65,8 @@ msgstr "Accepter" msgid "Backup secret phrase" msgstr "Phrase secrète de sauvegarde" -msgid "" -"Backup secret phrase does not match user account, please double-check and " -"try again." -msgstr "" -"La phrase secrète de sauvegarde est incorrecte, merci de vérifier et " -"réessayer." +msgid "Backup secret phrase does not match user account, please double-check and try again." +msgstr "La phrase secrète de sauvegarde est incorrecte, merci de vérifier et réessayer." msgid "Bin" msgstr "Corbeille" @@ -101,19 +80,11 @@ msgstr "Explorateur :" msgid "Bucket id" msgstr "Identifiant du seau" -msgid "" -"By connecting your wallet, you agree to our <0>Terms of Service and " -"<1>Privacy Policy" -msgstr "" -"En connectant votre portefeuille, vous acceptez nos <0>conditions de " -"service et notre <1>politique de confidentialité" +msgid "By connecting your wallet, you agree to our <0>Terms of Service and <1>Privacy Policy" +msgstr "En connectant votre portefeuille, vous acceptez nos <0>conditions de service et notre <1>politique de confidentialité" -msgid "" -"By forgetting this browser, you will not be able to use its associated " -"recovery key to sign-in." -msgstr "" -"En oubliant ce navigateur, vous ne pourrez pas utiliser la clé de " -"récupération qui lui est associée pour vous connecter." +msgid "By forgetting this browser, you will not be able to use its associated recovery key to sign-in." +msgstr "En oubliant ce navigateur, vous ne pourrez pas utiliser la clé de récupération qui lui est associée pour vous connecter." msgid "CID (Content Identifier)" msgstr "CID (Identifiant de contenu)" @@ -128,8 +99,7 @@ msgid "Change password" msgstr "Changer le mot de passe" msgid "Check your inbox! We've sent another email." -msgstr "" -"Vérifiez votre boîte de réception ! Nous avons envoyé un autre courriel." +msgstr "Vérifiez votre boîte de réception ! Nous avons envoyé un autre courriel." msgid "Click or drag to upload files" msgstr "Cliquer ou faire glisser un ficher pour le téléverser" @@ -341,12 +311,8 @@ msgstr "Le téléversement de dossiers n'est pas actuellement pris en charge" msgid "Folders" msgstr "Dossiers" -msgid "" -"For security reasons, each time you sign in we’ll ask you for one of the " -"following to confirm your identity." -msgstr "" -"Pour des raisons de sécurité, chaque fois que vous vous connectez, nous vous " -"demanderons l’une des informations suivantes pour confirmer votre identité." +msgid "For security reasons, each time you sign in we’ll ask you for one of the following to confirm your identity." +msgstr "Pour des raisons de sécurité, chaque fois que vous vous connectez, nous vous demanderons l’une des informations suivantes pour confirmer votre identité." msgid "Forget this browser" msgstr "Oublier ce navigateur" @@ -384,13 +350,8 @@ msgstr "Compris" msgid "Hello again!" msgstr "Ravis de vous revoir !" -msgid "" -"Hey! You only have two sign-in methods. If you lose that and have only one " -"left, you will be locked out of your account forever." -msgstr "" -"Hé ! Vous n’avez que deux méthodes de connexion. Si vous en perdez une et " -"qu’il ne vous en reste qu’une, vous ne pourrez plus jamais vous connecter à " -"votre compte." +msgid "Hey! You only have two sign-in methods. If you lose that and have only one left, you will be locked out of your account forever." +msgstr "Hé ! Vous n’avez que deux méthodes de connexion. Si vous en perdez une et qu’il ne vous en reste qu’une, vous ne pourrez plus jamais vous connecter à votre compte." msgid "Hold on, we are logging you in…" msgstr "Un instant, nous te connectons…" @@ -398,17 +359,8 @@ msgstr "Un instant, nous te connectons…" msgid "Home" msgstr "Accueil" -msgid "" -"If you think this file does not comply with our <0>Terms of Service, " -"please send the following information to report@files.chainsafe.io. Beware " -"that by sending the file's decryption key, an admin can then decrypt any " -"file in this shared folder." -msgstr "" -"Si vous pensez que ce fichier n'est pas conforme à nos <0>Conditions de " -"service, veuillez envoyer les informations suivantes à report@files." -"chainsafe.io. Attention, en envoyant la clé de déchiffrement du fichier, un " -"administrateur peut ensuite déchiffrer n'importe quel fichier de ce dossier " -"partagé." +msgid "If you think this file does not comply with our <0>Terms of Service, please send the following information to report@files.chainsafe.io. Beware that by sending the file's decryption key, an admin can then decrypt any file in this shared folder." +msgstr "Si vous pensez que ce fichier n'est pas conforme à nos <0>Conditions de service, veuillez envoyer les informations suivantes à report@files.chainsafe.io. Attention, en envoyant la clé de déchiffrement du fichier, un administrateur peut ensuite déchiffrer n'importe quel fichier de ce dossier partagé." msgid "Info" msgstr "Infos" @@ -449,19 +401,11 @@ msgstr "Chargement de l’aperçu" msgid "Loading your shared folders…" msgstr "Chargement de vos dossiers partagés…" -msgid "" -"Looks like you’re signing in from a new browser. Please choose one of the " -"following to continue:" -msgstr "" -"Il semble que vous vous connectiez à partir d’un nouveau navigateur. " -"Veuillez choisir une des options suivantes pour continuer :" +msgid "Looks like you’re signing in from a new browser. Please choose one of the following to continue:" +msgstr "Il semble que vous vous connectiez à partir d’un nouveau navigateur. Veuillez choisir une des options suivantes pour continuer :" -msgid "" -"Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum " -"sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." -msgstr "" -"Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum " -"sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." +msgid "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." +msgstr "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." msgid "Manage Access" msgstr "Gérer l’accès" @@ -547,11 +491,8 @@ msgstr "Ou créer un nouveau dossier partagé" msgid "Or Use an existing shared folder" msgstr "Ou utiliser un dossier partagé existant" -msgid "" -"Or confirm by signing into your Files on any browser you’ve used before." -msgstr "" -"Ou accepte la requête de connexion depuis n’importe quel appareil ou " -"navigateur utilisé auparavant." +msgid "Or confirm by signing into your Files on any browser you’ve used before." +msgstr "Ou accepte la requête de connexion depuis n’importe quel appareil ou navigateur utilisé auparavant." msgid "Or using one of the following:" msgstr "Ou en utilisant l’un des moyens suivants :" @@ -565,10 +506,8 @@ msgstr "Mot de passe" msgid "Password confirmation is required" msgstr "La confirmation du mot de passe est requise" -msgid "" -"Password does not match user account, please double-check and try again." -msgstr "" -"Le mot de passe ne correspond pas au compte, merci de vérifier et réessayer." +msgid "Password does not match user account, please double-check and try again." +msgstr "Le mot de passe ne correspond pas au compte, merci de vérifier et réessayer." msgid "Password needs to be more complex" msgstr "Le mot de passe doit être plus complexe" @@ -766,9 +705,7 @@ msgid "Social Sign-in Wallet" msgstr "Connecté avec un réseau social ou wallet" msgid "Something went wrong with email login! Please try again." -msgstr "" -"Un problème est survenu lors de la connexion avec courriel ! Veuillez " -"réessayer." +msgstr "Un problème est survenu lors de la connexion avec courriel ! Veuillez réessayer." msgid "Something went wrong!" msgstr "Quelque chose a mal tourné !" @@ -788,12 +725,8 @@ msgstr "Plan de stockage" msgid "Stored by miner" msgstr "Sauvegardé par le mineur" -msgid "" -"System maintenance is scheduled to start at {0}. The system will be " -"unavailable." -msgstr "" -"Une maintenance du système est prévue pour démarrer à {0}. Le système sera " -"indisponible." +msgid "System maintenance is scheduled to start at {0}. The system will be unavailable." +msgstr "Une maintenance du système est prévue pour démarrer à {0}. Le système sera indisponible." msgid "Teams" msgstr "Équipes" @@ -832,8 +765,7 @@ msgid "There was an error deleting your data" msgstr "Une erreur s'est produite lors de la suppression de vos données" msgid "There was an error getting search results" -msgstr "" -"Une erreur s’est produite lors de l’obtention des résultats de recherche" +msgstr "Une erreur s’est produite lors de l’obtention des résultats de recherche" msgid "There was an error getting the preview." msgstr "Une erreur s’est produite lors de la génération de l’aperçu." @@ -847,11 +779,8 @@ msgstr "Une erreur s'est produite lors de la restauration de vos données" msgid "There was an error when setting username." msgstr "Une erreur s'est produite lors de la définition du nom d'utilisateur." -msgid "" -"This link is marlformed. Please verify that you copy/pasted it correctly." -msgstr "" -"Ce lien est marlformé. Veuillez vérifier que vous l'avez copié/collé " -"correctement." +msgid "This link is marlformed. Please verify that you copy/pasted it correctly." +msgstr "Ce lien est marlformé. Veuillez vérifier que vous l'avez copié/collé correctement." msgid "This link is not valid any more." msgstr "Ce lien n'est plus valide." @@ -862,17 +791,8 @@ msgstr "Ce nom d’utilisateur est déjà pris" msgid "This website uses cookies" msgstr "Ce site web utilise des cookies" -msgid "" -"This website uses cookies that help the website function and track " -"interactions for analytics purposes. You have the right to decline our use " -"of cookies. For us to provide a customizable user experience to you, please " -"click on the Accept button below.<0>Learn more" -msgstr "" -"Ce site web utilise des cookies qui l'aident à fonctionner et à suivre les " -"interactions à des fins d'analyse. Vous avez le droit de refuser notre " -"utilisation des cookies. Pour que nous puissions vous offrir une expérience " -"utilisateur personnalisable, veuillez cliquer sur le bouton Accepter ci-" -"dessous.<0>En savoir plus" +msgid "This website uses cookies that help the website function and track interactions for analytics purposes. You have the right to decline our use of cookies. For us to provide a customizable user experience to you, please click on the Accept button below.<0>Learn more" +msgstr "Ce site web utilise des cookies qui l'aident à fonctionner et à suivre les interactions à des fins d'analyse. Vous avez le droit de refuser notre utilisation des cookies. Pour que nous puissions vous offrir une expérience utilisateur personnalisable, veuillez cliquer sur le bouton Accepter ci-dessous.<0>En savoir plus" msgid "Try again" msgstr "Essayer de nouveau" @@ -908,9 +828,7 @@ msgid "Username set successfully" msgstr "Nom d’utilisateur défini avec succès" msgid "Usernames are public and can't be changed after creation." -msgstr "" -"Les noms d’utilisateur sont publics et ne peuvent pas être modifiés après " -"leur création." +msgstr "Les noms d’utilisateur sont publics et ne peuvent pas être modifiés après leur création." msgid "Using an email:" msgstr "En utilisant un courriel :" @@ -936,35 +854,20 @@ msgstr "Addresse du wallet" msgid "Want to help shape this product?" msgstr "Vous voulez participer à l'élaboration de ce produit ?" -msgid "" -"We are performing routine maintenance of the system. Service status updates " -"will be posted on the <0>Files Support Channel on Discord" -msgstr "" -"Nous effectuons une maintenance de routine du système. Les mises à jour de " -"l'état du service seront postées sur le canal <0>Files Support<0> sur Discord" +msgid "We are performing routine maintenance of the system. Service status updates will be posted on the <0>Files Support Channel on Discord" +msgstr "Nous effectuons une maintenance de routine du système. Les mises à jour de l'état du service seront postées sur le canal <0>Files Support<0> sur Discord" msgid "We can't encrypt files larger than 2GB. Some items will not be uploaded" -msgstr "" -"Nous ne pouvons pas chiffrer les fichiers de plus de 2 Go. Certains éléments " -"ne pourront pas être téléversés" +msgstr "Nous ne pouvons pas chiffrer les fichiers de plus de 2 Go. Certains éléments ne pourront pas être téléversés" msgid "Web3: {0}" msgstr "Web3 : {0}" -msgid "" -"We’ve got a new authentication system in place. All you need to do is enter " -"your password again to migrate your credentials over to the new system." -msgstr "" -"Nous avons mis en place un nouveau système d’authentification. Tout ce que " -"vous avez à faire est de saisir à nouveau votre mot de passe pour migrer vos " -"informations d’identification vers le nouveau système." +msgid "We’ve got a new authentication system in place. All you need to do is enter your password again to migrate your credentials over to the new system." +msgstr "Nous avons mis en place un nouveau système d’authentification. Tout ce que vous avez à faire est de saisir à nouveau votre mot de passe pour migrer vos informations d’identification vers le nouveau système." -msgid "" -"We’ve sent an email to {email}. It contains a verification code that’ll sign " -"you in super quickly!" -msgstr "" -"Nous avons envoyé un courriel à {email}. Il contient un code de vérification " -"pour vous connecter !" +msgid "We’ve sent an email to {email}. It contains a verification code that’ll sign you in super quickly!" +msgstr "Nous avons envoyé un courriel à {email}. Il contient un code de vérification pour vous connecter !" msgid "What a fine day it is." msgstr "Quelle belle journée." @@ -979,8 +882,7 @@ msgid "You can change this later." msgstr "Vous pouvez en changer plus tard." msgid "You can now create shared folders to share a file." -msgstr "" -"Vous pouvez maintenant créer des dossiers partagés pour partager un fichier." +msgstr "Vous pouvez maintenant créer des dossiers partagés pour partager un fichier." msgid "You can't move folders to this path" msgstr "Vous ne pouvez pas déplacer les dossiers vers ce chemin" @@ -995,16 +897,10 @@ msgid "You were added to the shared folder ({0}): {1}" msgstr "Vous avez été ajouté(e) au dossier partagé ({0}) : {1}" msgid "You will need to sign a message in your wallet to complete sign in." -msgstr "" -"Vous devrez signer un message avec votre wallet pour terminer la procédure " -"connexion." +msgstr "Vous devrez signer un message avec votre wallet pour terminer la procédure connexion." -msgid "" -"Your recovery key can be used to restore your account in place of your " -"backup secret phrase." -msgstr "" -"Votre clé de récupération peut être utilisée pour restaurer votre compte à " -"la place de votre phrase de sauvegarde secrète." +msgid "Your recovery key can be used to restore your account in place of your backup secret phrase." +msgstr "Votre clé de récupération peut être utilisée pour restaurer votre compte à la place de votre phrase de sauvegarde secrète." msgid "can-edit" msgstr "peut-modifier" @@ -1022,23 +918,13 @@ msgid "view-only" msgstr "affichage seul" msgid "{0, plural, one {Downloading {1} file} other {Downloading {2} files}}" -msgstr "" -"{0, plural, one {Téléchargement de {1} fichier} other {Téléchargement de {2} " -"fichiers}}" +msgstr "{0, plural, one {Téléchargement de {1} fichier} other {Téléchargement de {2} fichiers}}" -msgid "" -"{0, plural, one {Encrypting and uploading {1} file} other {Encrypting and " -"uploading {2} files}}" -msgstr "" -"{0, plural, one {Chiffrement et téléversement de {1} fichier} other " -"{Chiffrement et téléversements {2} fichiers}}" +msgid "{0, plural, one {Encrypting and uploading {1} file} other {Encrypting and uploading {2} files}}" +msgstr "{0, plural, one {Chiffrement et téléversement de {1} fichier} other {Chiffrement et téléversements {2} fichiers}}" -msgid "" -"{0, plural, one {You are about to delete {1} item.} other {You are about to " -"delete {2} items.}}" -msgstr "" -"{0, plural, one {Vous êtes sur le point de supprimer {1} élément.} other " -"{Vous êtes sur le point de supprimer {2} éléments.}}" +msgid "{0, plural, one {You are about to delete {1} item.} other {You are about to delete {2} items.}}" +msgstr "{0, plural, one {Vous êtes sur le point de supprimer {1} élément.} other {Vous êtes sur le point de supprimer {2} éléments.}}" msgid "{0} cancelled" msgstr "{0} annulé(s)" @@ -1057,30 +943,3 @@ msgstr "{0} {fileProgress} – {1}" msgid "{successCount} files transferred successfully, {0} failed" msgstr "{successCount} fichiers transférés avec succès, {0} échec(s)" - -msgid "Create a new shared folder" -msgstr "Créer un nouveau dossier partagé" - -msgid "Loading..." -msgstr "Chargement…" - -msgid "Use an existing shared folder" -msgstr "Utiliser un dossier partagé existant" - -msgid "Copy link" -msgstr "Copier le lien" - -msgid "Create new link" -msgstr "Créer un nouveau lien" - -msgid "Sharing link" -msgstr "Lien de partage" - -msgid "edit rights" -msgstr "droits de modification" - -msgid "read rights" -msgstr "droits de lecture" - -msgid "with" -msgstr "avec" From 4e867caed1c3e9f58ac3f7b09741178fece057db Mon Sep 17 00:00:00 2001 From: Tanmoy Basak Anjan Date: Tue, 23 Nov 2021 21:10:07 +0600 Subject: [PATCH 20/44] Report modal styles and cut off fix (#1766) * report modal fix * removed copy Co-authored-by: Ryan Noble --- .../Modules/FileBrowsers/ReportFileModal.tsx | 65 ++++++++++++++----- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/ReportFileModal.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/ReportFileModal.tsx index 71b0d70597..86548de9c0 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/ReportFileModal.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/ReportFileModal.tsx @@ -67,10 +67,12 @@ const useStyles = makeStyles( }px` }, infoBox: { - paddingLeft: constants.generalUnit + paddingLeft: constants.generalUnit, + maxWidth: "100%" }, subInfoBox: { - padding: `${constants.generalUnit * 1}px 0` + padding: `${constants.generalUnit * 1}px 0`, + maxWidth: "100%" }, subSubtitle: { color: palette.additional["gray"][8] @@ -137,14 +139,37 @@ const useStyles = makeStyles( }, decryptionKey: { width: "100%", - wordBreak: "break-all" + overflow: "hidden", + textOverflow: "ellipsis", + marginRight: constants.generalUnit * 2 }, infoText: { marginBottom: constants.generalUnit * 2 }, keysWrapper: { - maxHeight: constants.generalUnit * 10, - overflow: "scroll" + whiteSpace: "nowrap", + overflow: "hidden", + textOverflow: "ellipsis", + maxWidth: "100%", + display: "flex", + cursor: "pointer" + }, + copyIcon: { + fontSize: "16px", + fill: palette.additional["gray"][9], + marginRight: constants.generalUnit, + [breakpoints.down("md")]: { + fontSize: "18px", + fill: palette.additional["gray"][9] + } + }, + decryptionKeyTitle: { + display: "flex", + justifyContent: "space-between", + marginBottom: constants.generalUnit * 0.5 + }, + titleMargin: { + marginBottom: constants.generalUnit * 0.5 } }) } @@ -164,7 +189,7 @@ const ReportFileModal = ({ filePath, close }: IReportFileModalProps) => { const classes = useStyles() const { bucket } = useFileBrowser() const { encryptionKey, id } = bucket || {} - const [isLoadingAdminKey, setIsloadingAdminKey] = useState(true) + const [isLoadingAdminKey, setIsLoadingAdminKey] = useState(true) const [adminPubKeys, setAdminPubkeys] = useState([]) const [encryptedDecryptionKeyMap, setEncryptedDecryptionKeyMap] = useState([]) const { encryptForPublicKey } = useThresholdKey() @@ -199,7 +224,7 @@ const ReportFileModal = ({ filePath, close }: IReportFileModalProps) => { setEncryptedDecryptionKeyMap(map) }) .catch(console.error) - .finally(() => setIsloadingAdminKey(false)) + .finally(() => setIsLoadingAdminKey(false)) }, [adminPubKeys, encryptForPublicKey, encryptionKey]) @@ -287,12 +312,13 @@ const ReportFileModal = ({ filePath, close }: IReportFileModalProps) => { Bucket id {id} @@ -302,28 +328,33 @@ const ReportFileModal = ({ filePath, close }: IReportFileModalProps) => { File path {filePath}
- + + Decryption key + +
+
- Decryption key - -
{JSON.stringify(encryptedDecryptionKeyMap)} @@ -353,7 +384,7 @@ const ReportFileModal = ({ filePath, close }: IReportFileModalProps) => {
- Copied! + Copied!
From ea0e03fab48eee2a5d1c2594636dfe9f655de0a9 Mon Sep 17 00:00:00 2001 From: Michael Yankelev <12774278+FSM1@users.noreply.github.com> Date: Tue, 23 Nov 2021 17:12:16 +0200 Subject: [PATCH 21/44] Fix Mobile Nav Drawer blocks breadcrumb (#1768) --- .../src/Components/Layouts/AppNav.tsx | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/files-ui/src/Components/Layouts/AppNav.tsx b/packages/files-ui/src/Components/Layouts/AppNav.tsx index f1099a9405..45bd47098b 100644 --- a/packages/files-ui/src/Components/Layouts/AppNav.tsx +++ b/packages/files-ui/src/Components/Layouts/AppNav.tsx @@ -80,12 +80,12 @@ const useStyles = makeStyles( top: `${constants.mobileHeaderHeight}px`, backgroundColor: constants.nav.mobileBackgroundColor, zIndex: zIndex?.layer1, - padding: `0 ${constants.generalUnit * 4}px`, maxWidth: "100vw", visibility: "hidden", "&.active": { visibility: "visible", - width: `${constants.mobileNavWidth}px` + width: `${constants.mobileNavWidth}px`, + padding: `0 ${constants.generalUnit * 4}px` } } }, @@ -178,7 +178,7 @@ const useStyles = makeStyles( } }, "& svg": { - "& path" : { + "& path": { fill: constants.nav.headingColor }, transitionDuration: `${animation.transform}ms`, @@ -264,10 +264,10 @@ const AppNav = ({ navOpen, setNavOpen }: IAppNav) => { })} > {isLoggedIn && - secured && - !!publicKey && - !isNewDevice && - !shouldInitializeAccount && ( + secured && + !!publicKey && + !isNewDevice && + !shouldInitializeAccount && ( <> {desktop && (
@@ -277,14 +277,14 @@ const AppNav = ({ navOpen, setNavOpen }: IAppNav) => { > - Files + Files -   +   - beta + beta
From 57028b184f4673baa946a20d03a9407e1edf721b Mon Sep 17 00:00:00 2001 From: Tanmoy Basak Anjan Date: Tue, 23 Nov 2021 21:23:15 +0600 Subject: [PATCH 22/44] secondary colors update (#1769) Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> --- packages/common-components/src/Button/Button.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/common-components/src/Button/Button.tsx b/packages/common-components/src/Button/Button.tsx index 435a625b8d..05ae395162 100644 --- a/packages/common-components/src/Button/Button.tsx +++ b/packages/common-components/src/Button/Button.tsx @@ -93,7 +93,7 @@ const useStyles = makeStyles( fill: palette.common.white.main }, "&:hover": { - backgroundColor: palette.primary.main, + backgroundColor: palette.primary.hover, color: palette.common.white.main, ...overrides?.Button?.variants?.secondary?.hover }, From 99c3cce85e0085ec43d4818414e316ecb0f62b47 Mon Sep 17 00:00:00 2001 From: Tanmoy Basak Anjan Date: Wed, 24 Nov 2021 10:46:36 +0600 Subject: [PATCH 23/44] File info modal CID and Key copy arrangements (#1773) * adding flags * info modal copy buttons ready * lingui extract Co-authored-by: GitHub Actions --- .../Modules/FileBrowsers/FileInfoModal.tsx | 130 ++++++++++-------- packages/files-ui/src/locales/de/messages.po | 3 - packages/files-ui/src/locales/en/messages.po | 3 - packages/files-ui/src/locales/es/messages.po | 3 - packages/files-ui/src/locales/fr/messages.po | 3 - packages/files-ui/src/locales/no/messages.po | 3 - 6 files changed, 74 insertions(+), 71 deletions(-) diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/FileInfoModal.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/FileInfoModal.tsx index ae9553623c..6bdf62a4f3 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/FileInfoModal.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/FileInfoModal.tsx @@ -9,7 +9,7 @@ import CustomButton from "../../Elements/CustomButton" import { Trans } from "@lingui/macro" import { FileFullInfo } from "../../../Contexts/FilesContext" import { - Button, + CopyIcon, formatBytes, Grid, Loading, @@ -44,7 +44,6 @@ const useStyles = makeStyles( }, closeButton: { flex: 1, - marginLeft: constants.generalUnit * 2, [breakpoints.down("md")]: { position: "fixed", bottom: 0, @@ -61,13 +60,6 @@ const useStyles = makeStyles( textAlign: "center" } }, - heading: { - fontWeight: typography.fontWeight.semibold, - textAlign: "left", - [breakpoints.down("md")]: { - textAlign: "center" - } - }, infoHeading: { fontWeight: typography.fontWeight.semibold, textAlign: "left" @@ -89,7 +81,8 @@ const useStyles = makeStyles( color: palette.additional["gray"][8], whiteSpace: "nowrap", overflow: "hidden", - textOverflow: "ellipsis" + textOverflow: "ellipsis", + marginRight: constants.generalUnit * 2 }, technicalContainer: { paddingTop: constants.generalUnit, @@ -114,7 +107,7 @@ const useStyles = makeStyles( alignItems: "center", justifyContent: "center", left: "50%", - bottom: "calc(100% + 5px)", + bottom: "calc(100% + 8px)", position: "absolute", transform: "translate(-50%, 0%)", zIndex: zIndex?.layer1, @@ -143,17 +136,20 @@ const useStyles = makeStyles( visibility: "visible" } }, - copyButton: { - width: "100%" - }, copyContainer: { - position: "relative", - flexBasis: "75%", - color: palette.additional["gray"][9], + position: "relative" + }, + copyIcon: { + fontSize: "16px", + fill: palette.additional["gray"][9], [breakpoints.down("md")]: { - flexBasis: "100%", - margin: `${constants.generalUnit * 2}px` + fontSize: "18px", + fill: palette.additional["gray"][9] } + }, + copyRow: { + display: "flex", + cursor: "pointer" } }) } @@ -186,15 +182,27 @@ const FileInfoModal = ({ filePath, close }: IFileInfoModuleProps) => { } , [bucket, filePath, filesApiClient]) - const [copied, setCopied] = useState(false) - const debouncedSwitchCopied = debounce(() => setCopied(false), 3000) + const [copiedCID, setCopiedCID] = useState(false) + const [copiedKey, setCopiedKey] = useState(false) + const debouncedSwitchCopiedCID = debounce(() => setCopiedCID(false), 3000) + const debouncedSwitchCopiedKey = debounce(() => setCopiedKey(false), 3000) const onCopyCID = () => { if (fullFileInfo?.content?.cid) { - navigator.clipboard.writeText(fullFileInfo?.content?.cid) + navigator.clipboard.writeText(fullFileInfo.content.cid) + .then(() => { + setCopiedCID(true) + debouncedSwitchCopiedCID() + }).catch(console.error) + } + } + + const onCopyKey = () => { + if (bucket?.encryptionKey) { + navigator.clipboard.writeText(bucket.encryptionKey) .then(() => { - setCopied(true) - debouncedSwitchCopied() + setCopiedKey(true) + debouncedSwitchCopiedKey() }).catch(console.error) } } @@ -360,13 +368,27 @@ const FileInfoModal = ({ filePath, close }: IFileInfoModuleProps) => { CID (Content Identifier)
- - {fullFileInfo.content?.cid} - + + {fullFileInfo.content?.cid} + +
+ +
+ + + Copied! + + +
+
+
{ Decryption key - - - {bucket?.encryptionKey} - - + + + {bucket?.encryptionKey} + + +
+ +
+ + + Copied! + + +
+
+
@@ -398,24 +434,6 @@ const FileInfoModal = ({ filePath, close }: IFileInfoModuleProps) => { flexDirection="row" className={classes.buttonsContainer} > -
- -
- - - Copied! - - -
-
close()} size="large" diff --git a/packages/files-ui/src/locales/de/messages.po b/packages/files-ui/src/locales/de/messages.po index c6862fb312..4b638dc278 100644 --- a/packages/files-ui/src/locales/de/messages.po +++ b/packages/files-ui/src/locales/de/messages.po @@ -139,9 +139,6 @@ msgstr "Weiter mit Web3 Wallet" msgid "Copied!" msgstr "Kopiert!" -msgid "Copy CID" -msgstr "IID kopieren" - msgid "Copy file" msgstr "" diff --git a/packages/files-ui/src/locales/en/messages.po b/packages/files-ui/src/locales/en/messages.po index 18c9225048..04bb945de9 100644 --- a/packages/files-ui/src/locales/en/messages.po +++ b/packages/files-ui/src/locales/en/messages.po @@ -139,9 +139,6 @@ msgstr "Continue with Web3 Wallet" msgid "Copied!" msgstr "Copied!" -msgid "Copy CID" -msgstr "Copy CID" - msgid "Copy file" msgstr "Copy file" diff --git a/packages/files-ui/src/locales/es/messages.po b/packages/files-ui/src/locales/es/messages.po index 12bbce2060..9e42c68e91 100644 --- a/packages/files-ui/src/locales/es/messages.po +++ b/packages/files-ui/src/locales/es/messages.po @@ -140,9 +140,6 @@ msgstr "Continuar con Monedero Web3 " msgid "Copied!" msgstr "Copiado!" -msgid "Copy CID" -msgstr "Copiar CID" - msgid "Copy file" msgstr "" diff --git a/packages/files-ui/src/locales/fr/messages.po b/packages/files-ui/src/locales/fr/messages.po index 473586161d..9fe354a98d 100644 --- a/packages/files-ui/src/locales/fr/messages.po +++ b/packages/files-ui/src/locales/fr/messages.po @@ -140,9 +140,6 @@ msgstr "Continuer avec un wallet Web3" msgid "Copied!" msgstr "Copié !" -msgid "Copy CID" -msgstr "Copier le CID" - msgid "Copy file" msgstr "Copier le fichier" diff --git a/packages/files-ui/src/locales/no/messages.po b/packages/files-ui/src/locales/no/messages.po index d44b4e5dfa..63bd31f410 100644 --- a/packages/files-ui/src/locales/no/messages.po +++ b/packages/files-ui/src/locales/no/messages.po @@ -139,9 +139,6 @@ msgstr "Fortsett med Web3-lommebok" msgid "Copied!" msgstr "Kopiert!" -msgid "Copy CID" -msgstr "Kopier CID" - msgid "Copy file" msgstr "" From a011e6fc6b2e888ca7f9d0d6a64dea9bba7cac2b Mon Sep 17 00:00:00 2001 From: Michael Yankelev <12774278+FSM1@users.noreply.github.com> Date: Wed, 24 Nov 2021 12:09:16 +0200 Subject: [PATCH 24/44] fix share transfer modal alignment (#1774) * fix alignment * lint :) Co-authored-by: Ryan Noble --- .../src/Components/Elements/ShareTransferRequestModal.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/files-ui/src/Components/Elements/ShareTransferRequestModal.tsx b/packages/files-ui/src/Components/Elements/ShareTransferRequestModal.tsx index 61c2a6094b..d988592972 100644 --- a/packages/files-ui/src/Components/Elements/ShareTransferRequestModal.tsx +++ b/packages/files-ui/src/Components/Elements/ShareTransferRequestModal.tsx @@ -19,6 +19,8 @@ const useStyles = makeStyles(({ constants }: CSFTheme) => modalInner: { padding: constants.generalUnit * 4, textAlign: "center", + display: "flex", + flexDirection: "column", "& img" : { width: "min-content", margin: "auto", From d1d8b62f5f17ccb55141bedd41dc4c78aae52ce4 Mon Sep 17 00:00:00 2001 From: Andrew Snaith Date: Wed, 24 Nov 2021 03:44:19 -0800 Subject: [PATCH 25/44] move pr template to .github root dir (#1776) Co-authored-by: Ryan Noble Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> --- .../pull_request_template.md | 19 ------------------- .../pull_request_template.md | 0 2 files changed, 19 deletions(-) delete mode 100644 .github/PULL_REQUEST_TEMPLATE/pull_request_template.md rename .github/{ISSUE_TEMPLATE => }/pull_request_template.md (100%) diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md deleted file mode 100644 index 1f16343693..0000000000 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ /dev/null @@ -1,19 +0,0 @@ -closes # - ---- - -Submission checklist: - -> Remove anything below that is not applicable - -- [x] Functionality -- - [x] Feature works as intended after change -- - [x] Applicable dependancies have been deployed - -- [x] Layout -- - [x] Change looks good in the desktop web ui -- - [x] Change looks good in the mobile web ui - -- [x] Theme -- - [x] Components / elements inspected in light mode -- - [x] Components / elements inspected in dark mode \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/pull_request_template.md b/.github/pull_request_template.md similarity index 100% rename from .github/ISSUE_TEMPLATE/pull_request_template.md rename to .github/pull_request_template.md From 484b7f1cbdf5406f2f449c78da4dc80f760452fb Mon Sep 17 00:00:00 2001 From: Tanmoy Basak Anjan Date: Thu, 25 Nov 2021 15:50:27 +0600 Subject: [PATCH 26/44] UI fix (#1777) --- packages/storage-ui/src/Components/Modules/LoginModule.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/storage-ui/src/Components/Modules/LoginModule.tsx b/packages/storage-ui/src/Components/Modules/LoginModule.tsx index f05306d874..f6cbe3da5d 100644 --- a/packages/storage-ui/src/Components/Modules/LoginModule.tsx +++ b/packages/storage-ui/src/Components/Modules/LoginModule.tsx @@ -32,7 +32,7 @@ const useStyles = makeStyles( alignItems: "center", borderRadius: 6, [breakpoints.up("md")]:{ - minHeight: "64vh", + minHeight: "72vh", justifyContent: "space-between", width: 440 }, From 2c1ea377bbbbeaa08ad6e5a9068d3af7e838152d Mon Sep 17 00:00:00 2001 From: Michael Yankelev <12774278+FSM1@users.noreply.github.com> Date: Thu, 25 Nov 2021 12:33:57 +0200 Subject: [PATCH 27/44] resolve double tap (#1778) Co-authored-by: Ryan Noble --- .../src/Components/Modules/FileBrowsers/views/FilesList.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx index 8482222332..c708e746f3 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FilesList.tsx @@ -609,8 +609,8 @@ const FilesList = ({ isShared = false }: Props) => { }, [setIsSurveyBannerVisible]) const handleViewFolder = useCallback((cid: string) => { - viewFolder && viewFolder(cid) - }, [viewFolder]) + !loadingCurrentPath && viewFolder && viewFolder(cid) + }, [viewFolder, loadingCurrentPath]) const handleOpenMoveFileDialog = useCallback((e: React.MouseEvent) => { e.preventDefault() From 1335725dc8b62f7cee325496c63c64cd9a0259d7 Mon Sep 17 00:00:00 2001 From: Ryan Noble Date: Thu, 25 Nov 2021 22:34:03 +0200 Subject: [PATCH 28/44] Mobile sharing folder rename modal (#1779) * Done# * Update packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/SharedFolderRow.tsx Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> * lingui extract Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> Co-authored-by: Tanmoy Basak Anjan Co-authored-by: GitHub Actions --- .../views/FileSystemItem/SharedFolderRow.tsx | 213 +++++++++++++----- packages/files-ui/src/locales/de/messages.po | 3 + packages/files-ui/src/locales/en/messages.po | 3 + packages/files-ui/src/locales/es/messages.po | 3 + packages/files-ui/src/locales/fr/messages.po | 3 + packages/files-ui/src/locales/no/messages.po | 3 + 6 files changed, 171 insertions(+), 57 deletions(-) diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/SharedFolderRow.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/SharedFolderRow.tsx index f5cc3276f3..8d8a79bda9 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/SharedFolderRow.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/SharedFolderRow.tsx @@ -1,6 +1,7 @@ import React, { useCallback, useMemo, useRef, useState } from "react" import { makeStyles, createStyles, useThemeSwitcher, useDoubleClick, useOnClickOutside } from "@chainsafe/common-theme" import { + Button, CloseCirceSvg, DeleteSvg, EditSvg, @@ -25,6 +26,7 @@ import UserBubble from "../../../../Elements/UserBubble" import { nameValidator } from "../../../../../Utils/validationSchema" import Menu from "../../../../../UI-components/Menu" import { getUserDisplayName } from "../../../../../Utils/getUserDisplayName" +import CustomModal from "../../../../Elements/CustomModal" const useStyles = makeStyles(({ breakpoints, constants, palette }: CSFTheme) => { @@ -111,6 +113,46 @@ const useStyles = makeStyles(({ breakpoints, constants, palette }: CSFTheme) => }, focusVisible:{ backgroundColor: "transparent !important" + }, + modalRoot: { + [breakpoints.down("md")]: { + paddingBottom: Number(constants?.mobileButtonHeight) + constants.generalUnit + } + }, + modalInner: { + [breakpoints.down("md")]: { + bottom: + Number(constants?.mobileButtonHeight) + constants.generalUnit, + borderTopLeftRadius: `${constants.generalUnit * 1.5}px`, + borderTopRightRadius: `${constants.generalUnit * 1.5}px`, + borderBottomLeftRadius: `${constants.generalUnit * 1.5}px`, + borderBottomRightRadius: `${constants.generalUnit * 1.5}px`, + maxWidth: `${breakpoints.width("md")}px !important` + } + }, + renameHeader: { + textAlign: "center" + }, + renameFooter: { + display: "flex", + flexDirection: "row", + alignItems: "center", + justifyContent: "flex-end" + }, + renameModal: { + padding: constants.generalUnit * 4 + }, + okButton: { + marginLeft: constants.generalUnit + }, + cancelButton: { + [breakpoints.down("md")]: { + position: "fixed", + bottom: 0, + left: 0, + width: "100%", + height: constants?.mobileButtonHeight + } } }) }) @@ -228,79 +270,136 @@ const SharedFolderRow = ({ bucket, handleRename, openSharedFolder, handleDeleteS useOnClickOutside(formRef, stopEditing) return ( - - {desktop && + <> + + {desktop && onFolderClick(e)} > - } - onFolderClick(e)} - > - {!isRenaming - ? {name} - : ( - -
- { - if (event.key === "Escape") { - stopEditing() - } - }} - placeholder = {t`Please enter a folder name`} - autoFocus={isRenaming} - /> - -
- ) } -
- {desktop && + onFolderClick(e)} + > + {!isRenaming || !desktop + ? {name} + : ( + +
+ { + if (event.key === "Escape") { + stopEditing() + } + }} + placeholder = {t`Please enter a folder name`} + autoFocus={isRenaming} + /> + +
+ ) + } +
+ {desktop && {isOwner ? t`me` : } - } - - - - {desktop && + } + + + + {desktop && {formatBytes(size, 2)} + } + + } + options={menuItems} + style={{ focusVisible: classes.focusVisible }} + /> + + + { + isRenaming && !desktop && ( + <> + setIsRenaming(false)} + > + +
+ + Rename shared folder + + +
+ + +
+ +
+
+ {name} + + ) } - - } - options={menuItems} - style={{ focusVisible: classes.focusVisible }} - /> - - + ) } diff --git a/packages/files-ui/src/locales/de/messages.po b/packages/files-ui/src/locales/de/messages.po index 4b638dc278..10d1d1dd18 100644 --- a/packages/files-ui/src/locales/de/messages.po +++ b/packages/files-ui/src/locales/de/messages.po @@ -571,6 +571,9 @@ msgstr "Datei umbenennen" msgid "Rename folder" msgstr "Ordner umbenennen" +msgid "Rename shared folder" +msgstr "" + msgid "Report" msgstr "Melden" diff --git a/packages/files-ui/src/locales/en/messages.po b/packages/files-ui/src/locales/en/messages.po index 04bb945de9..7368400942 100644 --- a/packages/files-ui/src/locales/en/messages.po +++ b/packages/files-ui/src/locales/en/messages.po @@ -574,6 +574,9 @@ msgstr "Rename file" msgid "Rename folder" msgstr "Rename folder" +msgid "Rename shared folder" +msgstr "Rename shared folder" + msgid "Report" msgstr "Report" diff --git a/packages/files-ui/src/locales/es/messages.po b/packages/files-ui/src/locales/es/messages.po index 9e42c68e91..f20a794b81 100644 --- a/packages/files-ui/src/locales/es/messages.po +++ b/packages/files-ui/src/locales/es/messages.po @@ -575,6 +575,9 @@ msgstr "" msgid "Rename folder" msgstr "" +msgid "Rename shared folder" +msgstr "" + msgid "Report" msgstr "" diff --git a/packages/files-ui/src/locales/fr/messages.po b/packages/files-ui/src/locales/fr/messages.po index 9fe354a98d..6c6d6a0c32 100644 --- a/packages/files-ui/src/locales/fr/messages.po +++ b/packages/files-ui/src/locales/fr/messages.po @@ -575,6 +575,9 @@ msgstr "Renommer le fichier" msgid "Rename folder" msgstr "Renommer le dossier" +msgid "Rename shared folder" +msgstr "" + msgid "Report" msgstr "Signaler" diff --git a/packages/files-ui/src/locales/no/messages.po b/packages/files-ui/src/locales/no/messages.po index 63bd31f410..9e48c15b8a 100644 --- a/packages/files-ui/src/locales/no/messages.po +++ b/packages/files-ui/src/locales/no/messages.po @@ -571,6 +571,9 @@ msgstr "" msgid "Rename folder" msgstr "" +msgid "Rename shared folder" +msgstr "" + msgid "Report" msgstr "" From ffa9706a43684bb395eb8be0f5d70387a9032fc4 Mon Sep 17 00:00:00 2001 From: Ryan Noble Date: Fri, 26 Nov 2021 00:11:30 +0200 Subject: [PATCH 29/44] Rename with split extension (#1760) * Filesplitting done * Desktop done * Mobile done * Yolo files * Fixed rename for folder * Removing end of string * Apply suggestions from code review * fix lint Co-authored-by: Tanmoy Basak Anjan Co-authored-by: Michael Yankelev <12774278+FSM1@users.noreply.github.com> Co-authored-by: Michael Yankelev --- .../FileSystemItem/FileSystemGridItem.tsx | 54 ++++++++++- .../views/FileSystemItem/FileSystemItem.tsx | 92 +++++++++++++++---- .../FileSystemItem/FileSystemTableItem.tsx | 52 ++++++++++- 3 files changed, 172 insertions(+), 26 deletions(-) diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/FileSystemGridItem.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/FileSystemGridItem.tsx index c9d140d722..62b1e5aeb7 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/FileSystemGridItem.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/FileSystemGridItem.tsx @@ -1,11 +1,12 @@ -import React, { useCallback, useEffect, useRef } from "react" +import React, { useCallback, useEffect, useMemo, useRef } from "react" import { makeStyles, createStyles, useThemeSwitcher, useOnClickOutside, LongPressEvents } from "@chainsafe/common-theme" import { t } from "@lingui/macro" import clsx from "clsx" import { FormikTextInput, IMenuItem, - MoreIcon + MoreIcon, + Typography } from "@chainsafe/common-components" import { CSFTheme } from "../../../../../Themes/types" import { FileSystemItem } from "../../../../../Contexts/FilesContext" @@ -64,9 +65,15 @@ const useStyles = makeStyles(({ breakpoints, constants, palette }: CSFTheme) => desktopRename: { display: "flex", flexDirection: "row", + alignItems: "center", "& svg": { width: 20, height: 20 + }, + "& > span": { + fontSize: 16, + lineHeight: "20px", + marginLeft: constants.generalUnit / 2 } }, dropdownIcon: { @@ -152,15 +159,45 @@ const FileSystemGridItem = React.forwardRef( const { desktop } = useThemeSwitcher() const formRef = useRef(null) + const { + fileName, + extension + } = useMemo(() => { + if (isFolder) { + return { + fileName : name, + extension: "" + } + } + const split = name.split(".") + const extension = `.${split[split.length - 1]}` + + if (split.length === 1) { + return { + fileName : name, + extension: "" + } + } + + return { + fileName: name.slice(0, name.length - extension.length), + extension: split[split.length - 1] + } + }, [name, isFolder]) + const formik = useFormik({ initialValues: { - name + name: fileName }, validationSchema: nameValidator, onSubmit: (values: { name: string }) => { - const newName = values.name.trim() + const newName = extension !== "" ? `${values.name.trim()}.${extension}` : values.name.trim() - newName && handleRename && handleRename(file.cid, newName) + if (newName !== name) { + newName && handleRename && handleRename(file.cid, newName) + } else { + stopEditing() + } }, enableReinitialize: true }) @@ -241,6 +278,13 @@ const FileSystemGridItem = React.forwardRef( } autoFocus={editing === cid} /> + { + !isFolder && extension !== "" && ( + + { `.${extension}` } + + ) + } ) diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/FileSystemItem.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/FileSystemItem.tsx index 01f6d2756b..f86bfafdb4 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/FileSystemItem.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/views/FileSystemItem/FileSystemItem.tsx @@ -43,9 +43,6 @@ const useStyles = makeStyles(({ breakpoints, constants }: CSFTheme) => { width: "100%", [breakpoints.up("md")]: { margin: 0 - }, - [breakpoints.down("md")]: { - margin: `${constants.generalUnit * 4.2}px 0` } }, modalRoot: { @@ -64,18 +61,34 @@ const useStyles = makeStyles(({ breakpoints, constants }: CSFTheme) => { maxWidth: `${breakpoints.width("md")}px !important` } }, + renameModal: { + padding: constants.generalUnit * 4 + }, renameHeader: { textAlign: "center" }, + renameInputWrapper: { + display: "flex", + flexDirection: "row", + alignItems: "flex-end", + [breakpoints.down("md")]: { + margin: `${constants.generalUnit * 4.2}px 0` + }, + "& > span": { + display: "block", + fontSize: 16, + lineHeight: "20px", + marginLeft: constants.generalUnit / 2, + marginBottom: (constants.generalUnit * 2.50), + transform: "translateY(50%)" + } + }, renameFooter: { display: "flex", flexDirection: "row", alignItems: "center", justifyContent: "flex-end" }, - renameModal: { - padding: constants.generalUnit * 4 - }, okButton: { marginLeft: constants.generalUnit }, @@ -154,19 +167,55 @@ const FileSystemItem = ({ const { downloadMultipleFiles } = useFiles() const { cid, name, isFolder, content_type } = file const inSharedFolder = useMemo(() => bucket?.type === "share", [bucket]) + + const { + fileName, + extension + } = useMemo(() => { + if (isFolder) { + return { + fileName : name, + extension: "" + } + } + const split = name.split(".") + const extension = `.${split[split.length - 1]}` + + if (split.length === 1) { + return { + fileName : name, + extension: "" + } + } + + return { + fileName: name.slice(0, name.length - extension.length), + extension: split[split.length - 1] + } + }, [name, isFolder]) + const formik = useFormik({ initialValues: { - name + name: fileName }, validationSchema: nameValidator, onSubmit: (values: { name: string }) => { - const newName = values.name.trim() + const newName = extension !== "" ? `${values.name.trim()}.${extension}` : values.name.trim() - newName && handleRename && handleRename(file.cid, newName) + if (newName !== name) { + newName && handleRename && handleRename(file.cid, newName) + } else { + stopEditing() + } }, enableReinitialize: true }) + const stopEditing = useCallback(() => { + setEditing(undefined) + formik.resetForm() + }, [formik, setEditing]) + let Icon if (isFolder) { Icon = FolderFilledSvg @@ -482,7 +531,7 @@ const FileSystemItem = ({ }} closePosition="none" active={editing === cid} - onClose={() => setEditing("")} + onClose={() => stopEditing()} >
@@ -496,13 +545,22 @@ const FileSystemItem = ({ : Rename file } - +
+ + { + !isFolder && extension !== "" && ( + + { `.${extension}` } + + ) + } +
@@ -269,6 +270,7 @@ const LinkList = ({ bucketId, bucketEncryptionKey }: Props) => { variant="secondary" disabled={isLoadingCreation} loading={isLoadingCreation} + data-cy="button-create-link" > Create link diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx index adc8cca9f3..885258804e 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/LinkSharing/SharingLink.tsx @@ -232,12 +232,16 @@ const SharingLink = ({ nonce, bucketEncryptionKey, refreshNonces }: Props) => {
{link}
-
+
{translatedPermission(nonce.permission)} @@ -245,18 +249,19 @@ const SharingLink = ({ nonce, bucketEncryptionKey, refreshNonces }: Props) => {
} options={[{ contents: ( <> - + Delete From c50aca3935ff1a4019e006597eddcf97c5b3b672 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Mon, 29 Nov 2021 11:06:52 +0100 Subject: [PATCH 31/44] Translated using Weblate (French) (#1784) Currently translated at 100.0% (308 of 308 strings) Translation: ChainSafe Files/Chainsafe Files user interface Translate-URL: https://hosted.weblate.org/projects/chainsafe-files/chainsafe-files-user-interface/fr/ Co-authored-by: J. Lavoie --- packages/files-ui/src/locales/fr/messages.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/files-ui/src/locales/fr/messages.po b/packages/files-ui/src/locales/fr/messages.po index 6c6d6a0c32..4cad15eadf 100644 --- a/packages/files-ui/src/locales/fr/messages.po +++ b/packages/files-ui/src/locales/fr/messages.po @@ -3,15 +3,16 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-04-23 11:05+0200\n" -"PO-Revision-Date: 2021-11-21 00:53+0000\n" +"PO-Revision-Date: 2021-11-27 00:52+0000\n" "Last-Translator: J. Lavoie \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.9.1\n" +"X-Generator: Weblate 4.10-dev\n" "Mime-Version: 1.0\n" msgid "A backup secret phrase will be generated and used for your account.<0/>We do not store it and <1>it can only be displayed once. Save it somewhere safe!" @@ -576,7 +577,7 @@ msgid "Rename folder" msgstr "Renommer le dossier" msgid "Rename shared folder" -msgstr "" +msgstr "Renommer le dossier partagé" msgid "Report" msgstr "Signaler" From e2dc42908502715ffefadfc9f72f2b4750f552b5 Mon Sep 17 00:00:00 2001 From: Thibaut Sardan <33178835+Tbaut@users.noreply.github.com> Date: Tue, 30 Nov 2021 11:13:10 +0000 Subject: [PATCH 32/44] Bump Cypress to 9.1 (#1785) * bump * devdep * lingui extract Co-authored-by: GitHub Actions --- packages/files-ui/package.json | 2 +- packages/files-ui/src/locales/fr/messages.po | 3 +-- packages/gaming-ui/package.json | 2 +- packages/storage-ui/package.json | 2 +- yarn.lock | 12 ++++++------ 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/files-ui/package.json b/packages/files-ui/package.json index 05a30f268b..c906a834cb 100644 --- a/packages/files-ui/package.json +++ b/packages/files-ui/package.json @@ -74,7 +74,7 @@ "@types/yup": "^0.29.9", "@types/zxcvbn": "^4.4.0", "babel-plugin-macros": "^2.8.0", - "cypress": "^9.0", + "cypress": "^9.1.0", "cypress-file-upload": "^5.0.8", "cypress-pipe": "^2.0.0" }, diff --git a/packages/files-ui/src/locales/fr/messages.po b/packages/files-ui/src/locales/fr/messages.po index 4cad15eadf..e8fbd3480e 100644 --- a/packages/files-ui/src/locales/fr/messages.po +++ b/packages/files-ui/src/locales/fr/messages.po @@ -5,8 +5,7 @@ msgstr "" "POT-Creation-Date: 2021-04-23 11:05+0200\n" "PO-Revision-Date: 2021-11-27 00:52+0000\n" "Last-Translator: J. Lavoie \n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" diff --git a/packages/gaming-ui/package.json b/packages/gaming-ui/package.json index 22f8021c47..e0112066d4 100644 --- a/packages/gaming-ui/package.json +++ b/packages/gaming-ui/package.json @@ -56,7 +56,7 @@ "@types/yup": "^0.29.9", "@types/zxcvbn": "^4.4.0", "babel-plugin-macros": "^2.8.0", - "cypress": "^9.0", + "cypress": "^9.1.0", "cypress-file-upload": "^5.0.8", "cypress-pipe": "^2.0.0" }, diff --git a/packages/storage-ui/package.json b/packages/storage-ui/package.json index e7ae0c3fba..44a80fe987 100644 --- a/packages/storage-ui/package.json +++ b/packages/storage-ui/package.json @@ -64,7 +64,7 @@ "@types/yup": "^0.29.9", "@types/zxcvbn": "^4.4.0", "babel-plugin-macros": "^2.8.0", - "cypress": "^9.0", + "cypress": "^9.1.0", "cypress-file-upload": "^5.0.8", "cypress-pipe": "^2.0.0" }, diff --git a/yarn.lock b/yarn.lock index c25cf21b1b..009c04dd9f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8797,7 +8797,7 @@ blob-util@^2.0.2: resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== -bluebird@^3.3.5, bluebird@^3.5.1, bluebird@^3.5.2, bluebird@^3.5.5, bluebird@^3.7.2: +bluebird@3.7.2, bluebird@^3.3.5, bluebird@^3.5.1, bluebird@^3.5.2, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -10727,10 +10727,10 @@ cypress-pipe@^2.0.0: resolved "https://registry.yarnpkg.com/cypress-pipe/-/cypress-pipe-2.0.0.tgz#577df7a70a8603d89a96dfe4092a605962181af8" integrity sha512-KW9s+bz4tFLucH3rBGfjW+Q12n7S4QpUSSyxiGrgPOfoHlbYWzAGB3H26MO0VTojqf9NVvfd5Kt0MH5XMgbfyg== -cypress@^9.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-9.0.0.tgz#8c496f7f350e611604cc2f77b663fb81d0c235d2" - integrity sha512-/93SWBZTw7BjFZ+I9S8SqkFYZx7VhedDjTtRBmXO0VzTeDbmxgK/snMJm/VFjrqk/caWbI+XY4Qr80myDMQvYg== +cypress@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-9.1.0.tgz#5d23c1b363b7d4853009c74a422a083a8ad2601c" + integrity sha512-fyXcCN51vixkPrz/vO/Qy6WL3hKYJzCQFeWofOpGOFewVVXrGfmfSOGFntXpzWBXsIwPn3wzW0HOFw51jZajNQ== dependencies: "@cypress/request" "^2.88.7" "@cypress/xvfb" "^1.2.4" @@ -10739,7 +10739,7 @@ cypress@^9.0: "@types/sizzle" "^2.3.2" arch "^2.2.0" blob-util "^2.0.2" - bluebird "^3.7.2" + bluebird "3.7.2" cachedir "^2.3.0" chalk "^4.1.0" check-more-types "^2.24.0" From a31313b208f270e7f6e8fbbae04a93d74c858a2a Mon Sep 17 00:00:00 2001 From: Michael Yankelev <12774278+FSM1@users.noreply.github.com> Date: Wed, 1 Dec 2021 19:28:27 +0200 Subject: [PATCH 33/44] removing gaming dashboard from monorepo (#1790) * removing gaming dashboard from monorepo * remove leftover gaming --- .github/workflows/lingui-extract-gaming.yml | 40 -- README.md | 4 - package.json | 3 - packages/gaming-ui/.env.example | 8 - packages/gaming-ui/.gitignore | 29 - packages/gaming-ui/.linguirc | 14 - packages/gaming-ui/.sentryclirc | 3 - packages/gaming-ui/README.md | 28 - packages/gaming-ui/craco.config.js | 48 -- packages/gaming-ui/cypress.json | 4 - .../gaming-ui/cypress/fixtures/loginData.ts | 3 - packages/gaming-ui/cypress/plugins/index.ts | 57 -- .../gaming-ui/cypress/support/commands.ts | 171 ------ packages/gaming-ui/cypress/support/index.ts | 32 - .../page-objects/authenticationPage.ts | 10 - .../cypress/support/page-objects/basePage.ts | 6 - .../cypress/support/page-objects/homePage.ts | 64 -- .../support/page-objects/navigationMenu.ts | 11 - .../support/page-objects/settingsPage.ts | 6 - .../cypress/support/utils/CustomBridge.ts | 82 --- .../cypress/support/utils/apiTestHelper.ts | 9 - .../cypress/tests/main-navigation-spec.ts | 32 - packages/gaming-ui/cypress/tsconfig.json | 10 - packages/gaming-ui/package.json | 89 --- packages/gaming-ui/public/ChainSafe-logo.png | Bin 23173 -> 0 bytes packages/gaming-ui/public/_redirects | 1 - .../public/android-chrome-192x192.png | Bin 23173 -> 0 bytes .../public/android-chrome-512x512.png | Bin 15170 -> 0 bytes .../gaming-ui/public/apple-touch-icon.png | Bin 23173 -> 0 bytes packages/gaming-ui/public/favicon-16x16.png | Bin 1438 -> 0 bytes packages/gaming-ui/public/favicon-32x32.png | Bin 2595 -> 0 bytes packages/gaming-ui/public/favicon.ico | Bin 21822 -> 0 bytes packages/gaming-ui/public/index.html | 58 -- packages/gaming-ui/public/manifest.json | 15 - packages/gaming-ui/public/robots.txt | 3 - .../public/serviceworker/redirect.html | 316 ---------- packages/gaming-ui/public/serviceworker/sw.js | 312 ---------- packages/gaming-ui/public/site.webmanifest | 19 - packages/gaming-ui/scripts/sentry.js | 37 -- packages/gaming-ui/src/App.tsx | 121 ---- .../src/Components/Elements/ApiKeyCard.tsx | 86 --- .../src/Components/Elements/CustomButton.tsx | 54 -- .../src/Components/Elements/CustomModal.tsx | 61 -- .../src/Components/Elements/SecretField.tsx | 34 - .../gaming-ui/src/Components/GamingRoutes.tsx | 51 -- .../src/Components/Layouts/AppHeader.tsx | 232 ------- .../src/Components/Layouts/AppNav.tsx | 272 -------- .../src/Components/Layouts/AppWrapper.tsx | 90 --- .../Components/Modules/DashboardModule.tsx | 263 -------- .../src/Components/Modules/LoginModule.tsx | 435 ------------- .../Modules/LoginModule/PasswordlessEmail.tsx | 300 --------- .../src/Components/Pages/DashboardPage.tsx | 11 - .../src/Components/Pages/LoginPage.tsx | 165 ----- .../src/Components/Pages/SettingsPage.tsx | 171 ------ .../src/Contexts/GamingApiContext.tsx | 429 ------------- .../src/Contexts/LanguageContext.tsx | 140 ----- .../gaming-ui/src/Contexts/UserContext.tsx | 93 --- packages/gaming-ui/src/Media/Empty.svg.tsx | 3 - packages/gaming-ui/src/Media/devices.png | Bin 75905 -> 0 bytes .../Media/landing/layers/ForegroundSVG.tsx | 16 - .../landing/layers/dark/Bottom.dark.svg.tsx | 3 - .../landing/layers/dark/Top.dark.svg.tsx | 3 - .../Media/landing/layers/dark/bottom-bg.svg | 1 - .../src/Media/landing/layers/dark/top-bg.svg | 1 - .../Media/landing/layers/desktop-mobile.png | Bin 93644 -> 0 bytes .../src/Media/landing/layers/foreground.svg | 1 - .../landing/layers/light/Bottom.light.svg.tsx | 3 - .../landing/layers/light/Top.light.svg.tsx | 3 - .../Media/landing/layers/light/bottom-bg.svg | 1 - .../src/Media/landing/layers/light/top-bg.svg | 1 - .../src/Media/landing/layers/password-key.png | Bin 37054 -> 0 bytes .../landing/layers/peaceful-succotash.png | Bin 64511 -> 0 bytes .../gaming-ui/src/Media/svgs/complete.svg | 1 - packages/gaming-ui/src/Media/svgs/empty.svg | 1 - packages/gaming-ui/src/Themes/Constants.ts | 161 ----- packages/gaming-ui/src/Themes/DarkTheme.ts | 580 ------------------ packages/gaming-ui/src/Themes/LightTheme.ts | 196 ------ packages/gaming-ui/src/Themes/types.ts | 4 - .../gaming-ui/src/Utils/StringHelpers.tsx | 14 - packages/gaming-ui/src/index.css | 27 - packages/gaming-ui/src/index.tsx | 12 - packages/gaming-ui/src/locales/en/messages.po | 185 ------ packages/gaming-ui/src/react-app-env.d.ts | 1 - packages/gaming-ui/src/serviceWorker.ts | 146 ----- packages/gaming-ui/src/setupTests.ts | 5 - packages/gaming-ui/tsconfig.json | 23 - 86 files changed, 5924 deletions(-) delete mode 100644 .github/workflows/lingui-extract-gaming.yml delete mode 100644 packages/gaming-ui/.env.example delete mode 100644 packages/gaming-ui/.gitignore delete mode 100644 packages/gaming-ui/.linguirc delete mode 100644 packages/gaming-ui/.sentryclirc delete mode 100644 packages/gaming-ui/README.md delete mode 100644 packages/gaming-ui/craco.config.js delete mode 100644 packages/gaming-ui/cypress.json delete mode 100644 packages/gaming-ui/cypress/fixtures/loginData.ts delete mode 100644 packages/gaming-ui/cypress/plugins/index.ts delete mode 100644 packages/gaming-ui/cypress/support/commands.ts delete mode 100644 packages/gaming-ui/cypress/support/index.ts delete mode 100644 packages/gaming-ui/cypress/support/page-objects/authenticationPage.ts delete mode 100644 packages/gaming-ui/cypress/support/page-objects/basePage.ts delete mode 100644 packages/gaming-ui/cypress/support/page-objects/homePage.ts delete mode 100644 packages/gaming-ui/cypress/support/page-objects/navigationMenu.ts delete mode 100644 packages/gaming-ui/cypress/support/page-objects/settingsPage.ts delete mode 100644 packages/gaming-ui/cypress/support/utils/CustomBridge.ts delete mode 100644 packages/gaming-ui/cypress/support/utils/apiTestHelper.ts delete mode 100644 packages/gaming-ui/cypress/tests/main-navigation-spec.ts delete mode 100644 packages/gaming-ui/cypress/tsconfig.json delete mode 100644 packages/gaming-ui/package.json delete mode 100644 packages/gaming-ui/public/ChainSafe-logo.png delete mode 100644 packages/gaming-ui/public/_redirects delete mode 100644 packages/gaming-ui/public/android-chrome-192x192.png delete mode 100644 packages/gaming-ui/public/android-chrome-512x512.png delete mode 100644 packages/gaming-ui/public/apple-touch-icon.png delete mode 100644 packages/gaming-ui/public/favicon-16x16.png delete mode 100644 packages/gaming-ui/public/favicon-32x32.png delete mode 100644 packages/gaming-ui/public/favicon.ico delete mode 100644 packages/gaming-ui/public/index.html delete mode 100644 packages/gaming-ui/public/manifest.json delete mode 100644 packages/gaming-ui/public/robots.txt delete mode 100644 packages/gaming-ui/public/serviceworker/redirect.html delete mode 100644 packages/gaming-ui/public/serviceworker/sw.js delete mode 100644 packages/gaming-ui/public/site.webmanifest delete mode 100644 packages/gaming-ui/scripts/sentry.js delete mode 100644 packages/gaming-ui/src/App.tsx delete mode 100644 packages/gaming-ui/src/Components/Elements/ApiKeyCard.tsx delete mode 100644 packages/gaming-ui/src/Components/Elements/CustomButton.tsx delete mode 100644 packages/gaming-ui/src/Components/Elements/CustomModal.tsx delete mode 100644 packages/gaming-ui/src/Components/Elements/SecretField.tsx delete mode 100644 packages/gaming-ui/src/Components/GamingRoutes.tsx delete mode 100644 packages/gaming-ui/src/Components/Layouts/AppHeader.tsx delete mode 100644 packages/gaming-ui/src/Components/Layouts/AppNav.tsx delete mode 100644 packages/gaming-ui/src/Components/Layouts/AppWrapper.tsx delete mode 100644 packages/gaming-ui/src/Components/Modules/DashboardModule.tsx delete mode 100644 packages/gaming-ui/src/Components/Modules/LoginModule.tsx delete mode 100644 packages/gaming-ui/src/Components/Modules/LoginModule/PasswordlessEmail.tsx delete mode 100644 packages/gaming-ui/src/Components/Pages/DashboardPage.tsx delete mode 100644 packages/gaming-ui/src/Components/Pages/LoginPage.tsx delete mode 100644 packages/gaming-ui/src/Components/Pages/SettingsPage.tsx delete mode 100644 packages/gaming-ui/src/Contexts/GamingApiContext.tsx delete mode 100644 packages/gaming-ui/src/Contexts/LanguageContext.tsx delete mode 100644 packages/gaming-ui/src/Contexts/UserContext.tsx delete mode 100644 packages/gaming-ui/src/Media/Empty.svg.tsx delete mode 100644 packages/gaming-ui/src/Media/devices.png delete mode 100644 packages/gaming-ui/src/Media/landing/layers/ForegroundSVG.tsx delete mode 100644 packages/gaming-ui/src/Media/landing/layers/dark/Bottom.dark.svg.tsx delete mode 100644 packages/gaming-ui/src/Media/landing/layers/dark/Top.dark.svg.tsx delete mode 100644 packages/gaming-ui/src/Media/landing/layers/dark/bottom-bg.svg delete mode 100644 packages/gaming-ui/src/Media/landing/layers/dark/top-bg.svg delete mode 100644 packages/gaming-ui/src/Media/landing/layers/desktop-mobile.png delete mode 100644 packages/gaming-ui/src/Media/landing/layers/foreground.svg delete mode 100644 packages/gaming-ui/src/Media/landing/layers/light/Bottom.light.svg.tsx delete mode 100644 packages/gaming-ui/src/Media/landing/layers/light/Top.light.svg.tsx delete mode 100644 packages/gaming-ui/src/Media/landing/layers/light/bottom-bg.svg delete mode 100644 packages/gaming-ui/src/Media/landing/layers/light/top-bg.svg delete mode 100644 packages/gaming-ui/src/Media/landing/layers/password-key.png delete mode 100644 packages/gaming-ui/src/Media/landing/layers/peaceful-succotash.png delete mode 100644 packages/gaming-ui/src/Media/svgs/complete.svg delete mode 100644 packages/gaming-ui/src/Media/svgs/empty.svg delete mode 100644 packages/gaming-ui/src/Themes/Constants.ts delete mode 100644 packages/gaming-ui/src/Themes/DarkTheme.ts delete mode 100644 packages/gaming-ui/src/Themes/LightTheme.ts delete mode 100644 packages/gaming-ui/src/Themes/types.ts delete mode 100644 packages/gaming-ui/src/Utils/StringHelpers.tsx delete mode 100644 packages/gaming-ui/src/index.css delete mode 100644 packages/gaming-ui/src/index.tsx delete mode 100644 packages/gaming-ui/src/locales/en/messages.po delete mode 100644 packages/gaming-ui/src/react-app-env.d.ts delete mode 100644 packages/gaming-ui/src/serviceWorker.ts delete mode 100644 packages/gaming-ui/src/setupTests.ts delete mode 100644 packages/gaming-ui/tsconfig.json diff --git a/.github/workflows/lingui-extract-gaming.yml b/.github/workflows/lingui-extract-gaming.yml deleted file mode 100644 index aca20cda66..0000000000 --- a/.github/workflows/lingui-extract-gaming.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Lingui extract - Gaming -on: - pull_request: - branches: - - "dev" - paths: - - "packages/gaming-ui/**/*" -jobs: - # extract any new translatable string - # and commit if there are new ones - # and if the user submitting the PR isn't weblate - extract: - name: lingui-extract - runs-on: ubuntu-latest - if: ${{ github.actor != 'weblate' }} - steps: - - uses: actions/checkout@v2 - with: - ref: ${{ github.event.pull_request.head.ref }} - ssh-key: ${{ secrets.LINGUI_GH_ACTION_COMMIT_KEY }} - - name: set user - run: | - git config --global user.name 'GitHub Actions' - git config --global user.email 'actions@github.com' - - # use node module caching - - uses: actions/cache@v2 - with: - path: '**/node_modules' - key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} - - - name: install packages - run: yarn install --immutable - - - name: lingui-extract and commit - if: ${{ github.actor != 'weblate' }} - run: | - (cd packages/gaming-ui && yarn extract --clean) - git add packages/gaming-ui/src/locales/* - if git commit -m "lingui extract"; then git push; else echo 'exiting successfully without commit'; fi diff --git a/README.md b/README.md index b9736e21ad..18ec6322b1 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,6 @@ Theme context and other utilities for generating and using the theming capabilit The UI for Chainsafe Files -#### **`packages/gaming-ui`** - -The UI for Chainsafe Gaming - #### **`packages/storage-ui`** The UI for Chainsafe Storage diff --git a/package.json b/package.json index a62f07950c..6696a69830 100644 --- a/package.json +++ b/package.json @@ -38,9 +38,6 @@ "build:files-ui": "yarn wsrun -p files-ui -c build", "release:files-ui": "yarn wsrun -p files-ui -c release", "start:files-ui": "yarn wsrun -p files-ui -c start", - "build:gaming-ui": "yarn wsrun -p gaming-ui -c build", - "release:gaming-ui": "yarn wsrun -p gaming-ui -c release", - "start:gaming-ui": "yarn wsrun -p gaming-ui -c start", "build:storage-ui": "yarn wsrun -p storage-ui -c build", "release:storage-ui": "yarn wsrun -p storage-ui -c release", "start:storage-ui": "yarn wsrun -p storage-ui -c start", diff --git a/packages/gaming-ui/.env.example b/packages/gaming-ui/.env.example deleted file mode 100644 index f1c140f7b7..0000000000 --- a/packages/gaming-ui/.env.example +++ /dev/null @@ -1,8 +0,0 @@ -PORT=3000 -HTTPS=false - -REACT_APP_API_URL=https://stage.imploy.site/api/v1 -REACT_APP_BLOCKNATIVE_ID= -REACT_APP_GOOGLE_CLIENT_ID= -REACT_APP_AUTH0_DOMAIN= -REACT_APP_AUTH0_CLIENT_ID= \ No newline at end of file diff --git a/packages/gaming-ui/.gitignore b/packages/gaming-ui/.gitignore deleted file mode 100644 index 9532771241..0000000000 --- a/packages/gaming-ui/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -.env - -src/locales/*/messages.js -src/locales/_build - diff --git a/packages/gaming-ui/.linguirc b/packages/gaming-ui/.linguirc deleted file mode 100644 index 1b7ae61f54..0000000000 --- a/packages/gaming-ui/.linguirc +++ /dev/null @@ -1,14 +0,0 @@ -{ - "catalogs": [{ - "path": "/src/locales/{locale}/messages", - "include": ["/src/**"], - "exclude": ["**/node_modules/**", "/src/locales/**"] - }], - "compileNamespace": "cjs", - "format": "po", - "formatOptions": { - "origins": false - }, - "locales": ["en"], - "sourceLocale": "en" -} \ No newline at end of file diff --git a/packages/gaming-ui/.sentryclirc b/packages/gaming-ui/.sentryclirc deleted file mode 100644 index b50913bad5..0000000000 --- a/packages/gaming-ui/.sentryclirc +++ /dev/null @@ -1,3 +0,0 @@ -[defaults] -org=chainsafe -project=gaming-ui diff --git a/packages/gaming-ui/README.md b/packages/gaming-ui/README.md deleted file mode 100644 index cba766f6f8..0000000000 --- a/packages/gaming-ui/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# ChainSafe Gaming UI Repo - -![Dev](https://github.com/imploy/files-ui/workflows/Dev/badge.svg?branch=dev) -[![Netlify Status](https://api.netlify.com/api/v1/badges/cb6afc46-ec5d-4cac-91c2-dbd0d866b89a/deploy-status)](https://app.netlify.com/sites/angry-lewin-719dd6/deploys) -[![Maintainability](https://api.codeclimate.com/v1/badges/6a9b1984bc9622792d3e/maintainability)](https://codeclimate.com/repos/5f0224802dfa0b018f0021b0/maintainability) -[![Test Coverage](https://api.codeclimate.com/v1/badges/6a9b1984bc9622792d3e/test_coverage)](https://codeclimate.com/repos/5f0224802dfa0b018f0021b0/test_coverage) - -## Run development (.env) - -``` -yarn install -yarn start -``` - -## Build production (.env) - -``` -yarn build -``` - -## Run test and test coverage - -``` -yarn test -yarn coverage -``` - -**Visit**: `http://localhost:3000` diff --git a/packages/gaming-ui/craco.config.js b/packages/gaming-ui/craco.config.js deleted file mode 100644 index 16c3b8144d..0000000000 --- a/packages/gaming-ui/craco.config.js +++ /dev/null @@ -1,48 +0,0 @@ -const TerserPlugin = require("terser-webpack-plugin") - -module.exports = { - babel: { - presets: [], - plugins: ["macros"], - loaderOptions: (babelLoaderOptions, { env, paths }) => { - return babelLoaderOptions - } - }, - webpack: { - configure: (webpackConfig) => ({ - ...webpackConfig, - optimization: { - ...webpackConfig.optimization, - minimizer: [ - new TerserPlugin({ - terserOptions: { - parse: { - ecma: 8 - }, - compress: { - ecma: 5, - warnings: false, - comparisons: false, - inline: 2, - drop_console: true - }, - mangle: { - safari10: true - }, - output: { - ecma: 5, - comments: false, - ascii_only: true - } - }, - parallel: 2, - cache: true, - sourceMap: true, - extractComments: false - }) - ] - }, - devtool: "source-map" - }) - } -} diff --git a/packages/gaming-ui/cypress.json b/packages/gaming-ui/cypress.json deleted file mode 100644 index fb59b54133..0000000000 --- a/packages/gaming-ui/cypress.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "integrationFolder": "cypress/tests", - "video": false -} diff --git a/packages/gaming-ui/cypress/fixtures/loginData.ts b/packages/gaming-ui/cypress/fixtures/loginData.ts deleted file mode 100644 index 9852d7c4c4..0000000000 --- a/packages/gaming-ui/cypress/fixtures/loginData.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const testPrivateKey = "0x4fd9a44c051834e28a919096f154e3f805f58d8f2d90a1ab9a29b0b46a6ac363" -export const testAddress = "0xDa1f70D176E0F7F16f2a3bB509cD37Bd36aFD902" -export const localHost = "http://localhost:3000" \ No newline at end of file diff --git a/packages/gaming-ui/cypress/plugins/index.ts b/packages/gaming-ui/cypress/plugins/index.ts deleted file mode 100644 index 77ca4f8215..0000000000 --- a/packages/gaming-ui/cypress/plugins/index.ts +++ /dev/null @@ -1,57 +0,0 @@ -/// -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** -import { existsSync, readFileSync } from "fs" - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -/** - * @type {Cypress.PluginConfig} - */ - -export default (on: any) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config - - on("task", { - readFileMaybe(filename: string) { - if (existsSync(filename)) { - return readFileSync(filename, "utf8") - } - - return null - } - }) - - on("before:browser:launch", (browser: Cypress.Browser, launchOptions: Cypress.BrowserLaunchOptions) => { - if (browser.name === "chrome" && browser.isHeadless) { - // fullPage screenshot size is 1280x720 on non-retina screens - launchOptions.args.push("--window-size=1280,720") - - // force screen to be non-retina (1280x720 size) - launchOptions.args.push("--force-device-scale-factor=1") - } - - if (browser.name === "electron" && browser.isHeadless) { - // fullPage screenshot size is 12807200 - launchOptions.preferences.width = 1280 - launchOptions.preferences.height = 720 - } - - if (browser.name === "firefox" && browser.isHeadless) { - // menubars take up height on the screen - launchOptions.args.push("--width=1280") - launchOptions.args.push("--height=720") - } - - return launchOptions - }) -} diff --git a/packages/gaming-ui/cypress/support/commands.ts b/packages/gaming-ui/cypress/support/commands.ts deleted file mode 100644 index 134cb8f541..0000000000 --- a/packages/gaming-ui/cypress/support/commands.ts +++ /dev/null @@ -1,171 +0,0 @@ -/* eslint-disable @typescript-eslint/no-namespace */ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add("login", (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) - -import { authenticationPage } from "./page-objects/authenticationPage" -import { ethers, Wallet } from "ethers" -import { testPrivateKey, localHost } from "../fixtures/loginData" -import { CustomizedBridge } from "./utils/CustomBridge" -import "cypress-file-upload" -import { cidsPage } from "./page-objects/cidsPage" - -export type Storage = Record[]; - -export interface Web3LoginOptions { - url?: string - apiUrlBase?: string - saveBrowser?: boolean - useLocalAndSessionStorage?: boolean - clearCSFBucket?: boolean - clearTrashBucket?: boolean -} - -const SESSION_FILE = "cypress/fixtures/storage/sessionStorage.json" -const LOCAL_FILE = "cypress/fixtures/storage/localStorage.json" - -Cypress.Commands.add("saveLocalAndSession", () => { - // save local and session storage in files - cy.window().then((win) => { - const newLocal: Storage = [] - const newSession: Storage = [] - - Object.keys(win.localStorage).forEach((key) => { - newLocal.push({ key, value: win.localStorage.getItem(key) || "" }) - }) - - Object.keys(win.sessionStorage).forEach((key) => { - newSession.push({ key, value: win.sessionStorage.getItem(key) || "" }) - }) - - const newLocalString = JSON.stringify(newLocal) - const newSessionString = JSON.stringify(newSession) - - cy.writeFile(SESSION_FILE, newSessionString) - cy.writeFile(LOCAL_FILE, newLocalString) - }) -}) - -Cypress.Commands.add( - "web3Login", - ({ - url = localHost, - // apiUrlBase = "https://stage.imploy.site/api/v1", - useLocalAndSessionStorage = true - }: Web3LoginOptions = {}) => { - let session: Storage = [] - let local: Storage = [] - - cy.task("readFileMaybe", SESSION_FILE).then( - (unparsedSession) => { - session = (unparsedSession && JSON.parse(unparsedSession)) || [] - } - ) - - cy.task("readFileMaybe", LOCAL_FILE).then( - (unparsedLocal) => { - local = (unparsedLocal && JSON.parse(unparsedLocal)) || [] - } - ) - - cy.on("window:before:load", (win) => { - const provider = new ethers.providers.JsonRpcProvider( - "https://rinkeby.infura.io/v3/4bf032f2d38a4ed6bb975b80d6340847", - 4 - ) - const signer = new Wallet(testPrivateKey, provider) - // inject ethereum object in the global window - Object.defineProperty(win, "ethereum", { - get: () => new CustomizedBridge(signer as any, provider as any) - }) - - // clear session storage in any case, if previous session storage should be - // kept will be decided after. - // Note that Cypress keep the session storage between test but clears localStorage - win.sessionStorage.clear() - win.localStorage.clear() - - if (useLocalAndSessionStorage) { - session.forEach(({ key, value }) => { - win.sessionStorage.setItem(key, value) - }) - - local.forEach(({ key, value }) => { - win.localStorage.setItem(key, value) - }) - } - }) - - cy.visit(url) - - // with nothing in localstorage (and in session storage) - // the whole login flow should kick in - cy.then(() => { - cy.log( - "Logging in", - local.length > 0 && - "there is something in session storage ---> direct login" - ) - - if (local.length === 0) { - cy.log("nothing in session storage, --> click on web3 button") - authenticationPage.web3Button().click() - authenticationPage.metaMaskButton().click() - authenticationPage.web3SignInButton().click() - } - }) - - cidsPage.cidsHeaderLabel().should("be.visible") - - cy.saveLocalAndSession() - - } -) - -// Must be declared global to be detected by typescript (allows import/export) -// eslint-disable @typescript/interface-name -declare global { - namespace Cypress { - interface Chainable { - /** - * Login using Metamask to an instance of Files. - * @param {String} options.url - (default: "http://localhost:3000") - what url to visit. - * @param {String} apiUrlBase - (default: "https://stage.imploy.site/api/v1") - what url to call for the api. - * @param {Boolean} options.useLocalAndSessionStorage - (default: true) - use what could have been stored before to speedup login - * @example cy.web3Login({saveBrowser: true, url: 'http://localhost:8080'}) - */ - web3Login: (options?: Web3LoginOptions) => Chainable - - /** - * Save local and session storage to local files - * @example cy.saveLocalAndSession() - */ - saveLocalAndSession: () => Chainable - } - } -} - -// Convert this to a module instead of script (allows import/export) -export {} diff --git a/packages/gaming-ui/cypress/support/index.ts b/packages/gaming-ui/cypress/support/index.ts deleted file mode 100644 index cb8233c617..0000000000 --- a/packages/gaming-ui/cypress/support/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -/// -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** -// Import commands.js using ES2015 syntax: -import "./commands" - -// the following gets rid of the exception "ResizeObserver loop limit exceeded" -// which someone on the internet says we can safely ignore -// source https://stackoverflow.com/questions/49384120/resizeobserver-loop-limit-exceeded -Cypress.on("uncaught:exception", (err) => { - /* returning false here prevents Cypress from failing the test */ - if (err.message.includes("ResizeObserver loop limit exceeded")) { - // returning false here prevents Cypress from - // failing the test - return false - } -}) - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/packages/gaming-ui/cypress/support/page-objects/authenticationPage.ts b/packages/gaming-ui/cypress/support/page-objects/authenticationPage.ts deleted file mode 100644 index ccd7a616d2..0000000000 --- a/packages/gaming-ui/cypress/support/page-objects/authenticationPage.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { basePage } from "./basePage" - -export const authenticationPage = { - ...basePage, - - // get started section elements - web3Button: () => cy.get("[data-cy=web3]", { timeout: 120000 }), - metaMaskButton: () => cy.get(".bn-onboard-modal-select-wallets > :nth-child(1) > .bn-onboard-custom"), - web3SignInButton: () => cy.get("[data-cy=sign-in-with-web3-button]") -} diff --git a/packages/gaming-ui/cypress/support/page-objects/basePage.ts b/packages/gaming-ui/cypress/support/page-objects/basePage.ts deleted file mode 100644 index bcf8f88e52..0000000000 --- a/packages/gaming-ui/cypress/support/page-objects/basePage.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Only add things here that could be applicable to all / most pages - -export const basePage = { - // Mobile view only element - hamburgerMenuButton: () => cy.get("[data-testId=hamburger-menu]") -} diff --git a/packages/gaming-ui/cypress/support/page-objects/homePage.ts b/packages/gaming-ui/cypress/support/page-objects/homePage.ts deleted file mode 100644 index b2a30da731..0000000000 --- a/packages/gaming-ui/cypress/support/page-objects/homePage.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { basePage } from "./basePage" - -export const click = ($el: JQuery) => $el.trigger("click") - -export const homePage = { - ...basePage - - // // main file browser elements - // uploadButton: () => cy.get("[data-cy=upload-modal-button]"), - // uploadFileForm: () => cy.get("[data-cy=upload-file-form] input", { timeout: 20000 }), - // moveSelectedButton: () => cy.get("[data-testId=button-move-selected-file]"), - // deleteSelectedButton: () => cy.get("[data-testId=button-delete-selected-file]"), - // deleteFileDialog: () => cy.get("[data-testid=modal-container-file-deletion]"), - // deleteFileCancelButton: () => cy.get("[data-testid=button-cancel-deletion]"), - // deleteFileConfirmButton: () => cy.get("[data-testid=button-confirm-deletion]"), - // uploadStatusToast: () => cy.get("[data-cy=upload-status-toast-message]", { timeout: 10000 }), - - // // file browser row elements - // fileItemRow: () => cy.get("[data-cy=file-item-row]", { timeout: 20000 }), - // fileItemName: () => cy.get("[data-cy=file-item-name]"), - // fileRenameInput: () => cy.get("[data-cy=rename-form] input"), - // fileRenameSubmitButton: () => cy.get("[data-cy=rename-submit-button]"), - // fileRenameErrorLabel: () => cy.get("[data-cy=rename-form] span.minimal.error"), - // fileItemKebabButton: () => cy.get("[data-testid=dropdown-title-fileDropdown]"), - - // // upload modal elements - // startUploadButton: () => cy.get("[data-testId=button-start-upload]"), - // uploadCancelButton: () => cy.get("[data-testId=button-cancel-upload]"), - // fileListRemoveButton: () => cy.get("[data-testid=button-remove-from-file-list]"), - // fileUploadList: () => cy.get("[data-testid=file-list-fileUpload] li"), - // fileUploadDropzone : () => cy.get("[data-testid=file-input-dropzone-fileUpload]"), - - // // menu elements - // previewMenuOption: () => cy.get("[data-cy=menu-preview]"), - // downloadMenuOption: () => cy.get("[data-cy=menu-download]"), - // infoMenuOption: () => cy.get("[data-cy=menu-info]"), - // renameMenuOption: () => cy.get("[data-cy=menu-rename]"), - // moveMenuOption: () => cy.get("[data-cy=menu-move]"), - // deleteMenuOption: () => cy.get("[data-cy=menu-delete]"), - - // clickUploadButton: () => homePage.startUploadButton() - // .should("not.be.disabled") - // // this pipe is needed to prevent https://github.com/ChainSafe/ui-monorepo/issues/1146 - // // as described https://www.cypress.io/blog/2019/01/22/when-can-the-test-click/ - // .pipe(click) - // .should(($el: JQuery) => { - // expect($el).to.not.be.visible - // }), - - // // helpers and convenience functions - // uploadFile(filePath: string) { - // this.uploadButton().click() - // this.uploadFileForm().attachFile(filePath) - // this.fileUploadList().should("have.length", 1) - // this.fileListRemoveButton().should("be.visible") - // this.clickUploadButton() - - // // ensure upload is complete before proceeding - // this.uploadFileForm().should("not.exist") - // this.uploadStatusToast().should("not.exist") - // } - -} - diff --git a/packages/gaming-ui/cypress/support/page-objects/navigationMenu.ts b/packages/gaming-ui/cypress/support/page-objects/navigationMenu.ts deleted file mode 100644 index a8fab10caf..0000000000 --- a/packages/gaming-ui/cypress/support/page-objects/navigationMenu.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { basePage } from "./basePage" - -export const navigationMenu = { - ...basePage, - homeNavButton: () => cy.get("[data-cy=home-nav]"), - settingsNavButton: () => cy.get("[data-cy=settings-nav]") - // spaceUsedLabel: () => cy.get("[data-cy=space-used-label]"), - // spaceUsedProgressBar: () => cy.get("[data-cy=space-used-progress-bar]"), - // sendFeedbackNavButton: () => cy.get("[data-cy=send-feedback-nav]"), - // signOutButton: () => cy.get("[data-cy=signout-nav]") -} diff --git a/packages/gaming-ui/cypress/support/page-objects/settingsPage.ts b/packages/gaming-ui/cypress/support/page-objects/settingsPage.ts deleted file mode 100644 index 40f6cf9bfe..0000000000 --- a/packages/gaming-ui/cypress/support/page-objects/settingsPage.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { basePage } from "./basePage" - -export const settingsPage = { - ...basePage - -} diff --git a/packages/gaming-ui/cypress/support/utils/CustomBridge.ts b/packages/gaming-ui/cypress/support/utils/CustomBridge.ts deleted file mode 100644 index 4924ecbbff..0000000000 --- a/packages/gaming-ui/cypress/support/utils/CustomBridge.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Eip1193Bridge } from "@ethersproject/experimental/lib/eip1193-bridge" -import { toUtf8String } from "ethers/lib/utils" -import { testAddress } from "../../fixtures/loginData" - -export class CustomizedBridge extends Eip1193Bridge { - async sendAsync(...args: Array) { - return this.send(...args) - } - - async isMetaMask() { - return true - } - - async send(...args: Array) { - const isCallbackForm = typeof args[0] === "object" && typeof args[1] === "function" - let callback - let method - let params - if (isCallbackForm) { - callback = args[1] - method = args[0].method - params = args[0].params - } else { - method = args[0] - params = args[1] - } - - if (method === "personal_sign") { - const addr = params[1] - const message = params[0] - - if ( - (addr as string).toLowerCase() !== testAddress.toLowerCase() - ) { - return Promise.reject( - `Wrong address, expected ${testAddress}, but got ${addr}` - ) - } - - try { - const sig = await this.signer.signMessage(toUtf8String(message)) - return sig - } catch (e) { - return Promise.reject( - `Error in CustomizedBridge for personal_sign: ${e.message}` - ) - } - } - - if (method === "eth_requestAccounts" || method === "eth_accounts") { - if (isCallbackForm) { - callback({ result: [testAddress] }) - } else { - return Promise.resolve([testAddress]) - } - } - - if (method === "eth_chainId") { - if (isCallbackForm) { - callback(null, { result: "0x4" }) - } else { - return Promise.resolve("0x4") - } - } - - try { - const result = await super.send(method, params) - - if (isCallbackForm) { - callback(null, { result }) - } else { - return result - } - } catch (error) { - if (isCallbackForm) { - callback(error, null) - } else { - throw error - } - } - } -} \ No newline at end of file diff --git a/packages/gaming-ui/cypress/support/utils/apiTestHelper.ts b/packages/gaming-ui/cypress/support/utils/apiTestHelper.ts deleted file mode 100644 index 7f34ea2f37..0000000000 --- a/packages/gaming-ui/cypress/support/utils/apiTestHelper.ts +++ /dev/null @@ -1,9 +0,0 @@ -// import axios from "axios" -// import { FilesApiClient } from "@chainsafe/files-api-client" -// import { BucketType } from "@chainsafe/files-api-client" - -// const REFRESH_TOKEN_KEY = "csf.refreshToken" - -// export const apiTestHelper = { - -// } diff --git a/packages/gaming-ui/cypress/tests/main-navigation-spec.ts b/packages/gaming-ui/cypress/tests/main-navigation-spec.ts deleted file mode 100644 index b9a998cf33..0000000000 --- a/packages/gaming-ui/cypress/tests/main-navigation-spec.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { navigationMenu } from "../support/page-objects/navigationMenu" -import { homePage } from "../support/page-objects/homePage" - -describe("Main Navigation", () => { - - context("desktop", () => { - before(() => { - cy.web3Login() - }) - - it("can navigate to the cids page", () => { - navigationMenu.settingsNavButton().click() - cy.url().should("include", "/cids") - }) - }) - - context("mobile", () => { - before(() => { - cy.web3Login() - }) - - beforeEach(() => { - cy.viewport("iphone-6") - homePage.hamburgerMenuButton().click() - }) - - it("can navigate to the cids page", () => { - navigationMenu.settingsNavButton().click() - cy.url().should("include", "/cids") - }) - }) -}) diff --git a/packages/gaming-ui/cypress/tsconfig.json b/packages/gaming-ui/cypress/tsconfig.json deleted file mode 100644 index c58896952f..0000000000 --- a/packages/gaming-ui/cypress/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "target": "es5", - "jsx": "react", - "lib": ["es5", "dom"], - "types": ["cypress", "cypress-file-upload"] - }, - "include": ["**/*.ts"] - } \ No newline at end of file diff --git a/packages/gaming-ui/package.json b/packages/gaming-ui/package.json deleted file mode 100644 index e0112066d4..0000000000 --- a/packages/gaming-ui/package.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "gaming-ui", - "version": "1.0.0", - "private": true, - "dependencies": { - "@babel/core": "^7.12.10", - "@babel/runtime": "^7.0.0", - "@chainsafe/browser-storage-hooks": "^1.0.1", - "@chainsafe/files-api-client": "^1.18.20", - "@chainsafe/web3-context": "1.1.4", - "@lingui/core": "^3.7.2", - "@lingui/react": "^3.7.2", - "@sentry/react": "^5.28.0", - "@toruslabs/torus-direct-web-sdk": "4.15.1", - "axios": "0.21.4", - "babel-loader": "8.1.0", - "babel-plugin-macros": "^2.8.0", - "babel-preset-env": "^1.7.0", - "babel-preset-react": "^6.24.1", - "bnc-onboard": "1.32.0", - "clsx": "^1.1.1", - "dayjs": "^1.9.7", - "eth-crypto": "^1.8.0", - "ethers": "^5.4.3", - "formik": "^2.2.5", - "mime-matcher": "^1.0.5", - "react": "^16.14.0", - "react-dom": "^16.14.0", - "react-hotkeys-hook": "^2.4.0", - "react-scripts": "3.4.4", - "react-swipeable": "^6.0.1", - "react-toast-notifications": "^2.4.0", - "react-use-hotjar": "1.0.8", - "react-zoom-pan-pinch": "^1.6.1", - "remark-gfm": "^1.0.0", - "typescript": "~4.0.5", - "yup": "^0.32.8", - "zxcvbn": "^4.4.2" - }, - "devDependencies": { - "@craco/craco": "^5.9.0", - "@ethersproject/experimental": "^5.1.2", - "@lingui/babel-preset-react": "^2.9.2", - "@lingui/cli": "^3.7.2", - "@lingui/macro": "3.7.2", - "@testing-library/jest-dom": "^5.11.6", - "@testing-library/react": "^11.2.2", - "@testing-library/user-event": "^12.5.0", - "@types/jest": "^26.0.16", - "@types/node": "^14.14.10", - "@types/react": "^17.0.0", - "@types/react-beforeunload": "^2.1.0", - "@types/react-dom": "^16.9.10", - "@types/react-pdf": "^5.0.0", - "@types/react-toast-notifications": "^2.4.0", - "@types/yup": "^0.29.9", - "@types/zxcvbn": "^4.4.0", - "babel-plugin-macros": "^2.8.0", - "cypress": "^9.1.0", - "cypress-file-upload": "^5.0.8", - "cypress-pipe": "^2.0.0" - }, - "scripts": { - "postinstall": "yarn compile", - "start": "yarn compile && craco --max_old_space_size=4096 start", - "build": "craco --max_old_space_size=4096 --openssl-legacy-provider build ", - "sentry": "(export REACT_APP_SENTRY_RELEASE=$(sentry-cli releases propose-version); node scripts/sentry.js)", - "release": "(export REACT_APP_SENTRY_RELEASE=$(sentry-cli releases propose-version); yarn compile && yarn build && node scripts/sentry.js)", - "test": "cypress open", - "test:ci": "cypress run --browser chrome --headless", - "analyze": "source-map-explorer 'build/static/js/*.js'", - "extract": "lingui extract", - "compile": "lingui compile", - "lingui-version": "lingui --version", - "lint": "eslint './{src, cypress}/**/*.{js,jsx,ts,tsx}'" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/packages/gaming-ui/public/ChainSafe-logo.png b/packages/gaming-ui/public/ChainSafe-logo.png deleted file mode 100644 index cfffdc4a8245eb62692ca59477cca53c72a83b0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23173 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 diff --git a/packages/gaming-ui/public/_redirects b/packages/gaming-ui/public/_redirects deleted file mode 100644 index 50a463356b..0000000000 --- a/packages/gaming-ui/public/_redirects +++ /dev/null @@ -1 +0,0 @@ -/* /index.html 200 \ No newline at end of file diff --git a/packages/gaming-ui/public/android-chrome-192x192.png b/packages/gaming-ui/public/android-chrome-192x192.png deleted file mode 100644 index cfffdc4a8245eb62692ca59477cca53c72a83b0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23173 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 diff --git a/packages/gaming-ui/public/android-chrome-512x512.png b/packages/gaming-ui/public/android-chrome-512x512.png deleted file mode 100644 index 300ed95cd243678f6a12cb4b7096e6f059235403..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15170 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 diff --git a/packages/gaming-ui/public/apple-touch-icon.png b/packages/gaming-ui/public/apple-touch-icon.png deleted file mode 100644 index cfffdc4a8245eb62692ca59477cca53c72a83b0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23173 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 diff --git a/packages/gaming-ui/public/favicon-16x16.png b/packages/gaming-ui/public/favicon-16x16.png deleted file mode 100644 index c515dca67ee594461933f632592ab7dbe9e180c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1438 zcmZ`(4NOy46uz%OQ5lo5DGU|&BZ#0v!^mSs4hGMI)r# zkB}QuN((|e83+wZ5MmuiC~U`xt7}pa!hD&lviTH1iAa)NT^+C2bF^AcbaZ5MGh4B3 zo<@TY4-0PJUJe+NR4$8;?&(P#8A-EPI3^SK^5rEYiEjMLGMhO)J$PRq%q#l)ITaQ2 zHJVhbm8()E0rA>3=D1U!)3F~sSTQ`D_V{rsB!O*jYiJU5byYLhRMhs z9OTv3E(GcRe!RJPX;tMy02>Fm&!6)Un*8KRYG-G%Ue8r3<62vj&1UY?r?}b7)9LWG zHdaf^QiFk`(Xc@RMqS-vgkFQ1tybQ*H3|9oQC2H|U;uYG1nup~D%DcEoo_O6bUF@z z&!0~k84*~m9H_jeCIK=JAEu6u3iNvX#S6imJ5&?8x>BA!!<|k++0LlGJ{-!n+xWe` zY@3ZYVB{DK+)J03paoSy&A{#L#bvTN&?Oih9Vu`=XjN3iAr!4vr>ND-RVwJ=2V-Mt z4hP@m5*m$M;6f`%GMykq!w$aJn+`{j@EK zG`tH*uC!Qq&{(L=;}JQXaI9c-l<)JUyWJv-h3j?+|F{J{G%{ecGfF$0g>B`g;Puv-MK=R1vmmWg4%3?o_%zEGF*|<`y9o6iOL( zU%STx$v}lDgCA%NjG%|UJ^Pm9DMi{|D9*;zwYzE{ri*xZcKCxNbvK8Gqky}&BJvx; zd&;%i3N1APXvtj{>S7XOi$6URU*>zpZpVt9uOC8Hsp8+Z9PDlD4&H~5y|8N0>IQLq zS*hO%+VH#A&0%|dpQBhh9ZR{~(th|ZyS}!-uEs@9`Ig@Uh!mfuMYn8HF zu()#tchVnqwwtD-f}ox!TB7N&_cM|)b!OzO@6p+d8xnR2aY;zsLTFEkG)E-M$Uw0W zPeK7$D5Cx$7(57zK-7-|B9xBJcok=1F@Irb2z?<()MZeZbzsyGf>G-~J?$jz6(Z!M z-`_C>{qpQlF1RQKKS!~7qe9BcE0lsmiHyXA1&k#N5}DZyCM$u-T9g>aV6YgBQ=I8t z{~~PNzF96S{eQy!*^R|O2&ELHC2|>y57TOytVpUr%NV%_bl<>k*sI-4d5N?jhbP}E k-Bu*uz6~WXf0<}G@Lx#oKOvHh;gbP^M0_!?kt5mnJF+fuHvj+t diff --git a/packages/gaming-ui/public/favicon-32x32.png b/packages/gaming-ui/public/favicon-32x32.png deleted file mode 100644 index ee6522854f0560172530a262b7892a372dec33b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2595 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 HPxk)+bR~Wj diff --git a/packages/gaming-ui/public/index.html b/packages/gaming-ui/public/index.html deleted file mode 100644 index a955172684..0000000000 --- a/packages/gaming-ui/public/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - ChainSafe Gaming - - - -
- - - diff --git a/packages/gaming-ui/public/manifest.json b/packages/gaming-ui/public/manifest.json deleted file mode 100644 index 5bb42011c2..0000000000 --- a/packages/gaming-ui/public/manifest.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "short_name": "Chainsafe Gaming", - "name": "Chainsafe Gaming", - "icons": [ - { - "src": "ChainSafe-logo.png", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/packages/gaming-ui/public/robots.txt b/packages/gaming-ui/public/robots.txt deleted file mode 100644 index e9e57dc4d4..0000000000 --- a/packages/gaming-ui/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/packages/gaming-ui/public/serviceworker/redirect.html b/packages/gaming-ui/public/serviceworker/redirect.html deleted file mode 100644 index 3ed34e79f7..0000000000 --- a/packages/gaming-ui/public/serviceworker/redirect.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - - Redirect - - - - -
-
-
-
-
-
-

- You can close this window now -

-
- - - - diff --git a/packages/gaming-ui/public/serviceworker/sw.js b/packages/gaming-ui/public/serviceworker/sw.js deleted file mode 100644 index e49ffdfb2b..0000000000 --- a/packages/gaming-ui/public/serviceworker/sw.js +++ /dev/null @@ -1,312 +0,0 @@ -// This service worker handles all OAuth redirects and calls, as well as parsing -// tokens returned, parsing said tokens and communication with the DirectAuth SDK. -// For more information see https://github.com/torusresearch/torus-direct-web-sdk/blob/master/README.md -// and https://docs.tor.us/direct-auth/integrating-directauth - -/* eslint-disable */ -function getScope() { - return self.registration.scope; -} - -self.addEventListener("message", function (event) { - if (event.data && event.data.type === "SKIP_WAITING") { - self.skipWaiting(); - } -}); - -self.addEventListener("fetch", function (event) { - try { - const url = new URL(event.request.url); - if (url.pathname.includes("redirect") && url.href.includes(getScope())) { - event.respondWith( - new Response( - new Blob( - [ - ` - - - - - - - Redirect - - - -
-
-
-
-
-
-

You can close this window now

-
- - - - - -${""} - `, - ], - { type: "text/html" } - ) - ) - ); - } - } catch (error) { - console.error(error); - } -}); diff --git a/packages/gaming-ui/public/site.webmanifest b/packages/gaming-ui/public/site.webmanifest deleted file mode 100644 index d3f31c43ac..0000000000 --- a/packages/gaming-ui/public/site.webmanifest +++ /dev/null @@ -1,19 +0,0 @@ -{ - "short_name": "Chainsafe Gaming", - "name": "Chainsafe Gaming", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/packages/gaming-ui/scripts/sentry.js b/packages/gaming-ui/scripts/sentry.js deleted file mode 100644 index efa38ef60a..0000000000 --- a/packages/gaming-ui/scripts/sentry.js +++ /dev/null @@ -1,37 +0,0 @@ -const SentryCli = require("@sentry/cli") -const dotenv = require("dotenv") -dotenv.config() - -async function createReleaseAndUpload() { - const release = process.env.REACT_APP_SENTRY_RELEASE - const environment = process.env.REACT_APP_SENTRY_ENV - - if (!release || !environment) { - console.warn("REACT_APP_SENTRY_RELEASE or REACT_APP_SENTRY_ENV is not set") - return - } - - const cli = new SentryCli() - - try { - console.log("Creating sentry release " + release) - await cli.releases.new(release) - - console.log("Uploading source maps") - await cli.releases.uploadSourceMaps(release, { - include: ["build/static/js"], - rewrite: true, - validate: true, - }) - - console.log("Finalizing release") - // await cli.releases.setCommits(release, {auto: true}) - await cli.releases.newDeploy(release, { env: environment }) - - await cli.releases.finalize(release) - } catch (e) { - console.error("Creating a release on Sentry failed.", e) - } -} - -createReleaseAndUpload() diff --git a/packages/gaming-ui/src/App.tsx b/packages/gaming-ui/src/App.tsx deleted file mode 100644 index ea78e7f068..0000000000 --- a/packages/gaming-ui/src/App.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import React, { useCallback } from "react" -import { init as initSentry, ErrorBoundary, showReportDialog } from "@sentry/react" -import { Web3Provider } from "@chainsafe/web3-context" -import { ThemeSwitcher } from "@chainsafe/common-theme" -import "@chainsafe/common-theme/dist/font-faces.css" -import { Button, CssBaseline, Modal, Router, ToastProvider, Typography } from "@chainsafe/common-components" -import StorageRoutes from "./Components/GamingRoutes" -import AppWrapper from "./Components/Layouts/AppWrapper" -import { LanguageProvider } from "./Contexts/LanguageContext" -import { lightTheme } from "./Themes/LightTheme" -import { darkTheme } from "./Themes/DarkTheme" -import { useLocalStorage } from "@chainsafe/browser-storage-hooks" -import { GamingApiProvider } from "./Contexts/GamingApiContext" -import { UserProvider } from "./Contexts/UserContext" - -if ( - process.env.NODE_ENV === "production" && - process.env.REACT_APP_SENTRY_DSN_URL -) { - initSentry({ - dsn: process.env.REACT_APP_SENTRY_DSN_URL, - release: process.env.REACT_APP_SENTRY_RELEASE, - environment: process.env.REACT_APP_SENTRY_ENV - }) -} - -const availableLanguages = [ - { id: "en", label: "English" } -] - -const onboardConfig = { - dappId: process.env.REACT_APP_BLOCKNATIVE_ID || "", - walletSelect: { - wallets: [ - { walletName: "coinbase" }, - { - walletName: "trust", - rpcUrl: - "https://mainnet.infura.io/v3/a7e16429d2254d488d396710084e2cd3" - }, - { walletName: "metamask", preferred: true }, - { walletName: "authereum" }, - { walletName: "opera" }, - { walletName: "operaTouch" }, - { walletName: "torus" }, - { walletName: "status" }, - { - walletName: "walletConnect", - infuraKey: "a7e16429d2254d488d396710084e2cd3", - preferred: true - } - ] - } -} - -const App = () => { - const { canUseLocalStorage } = useLocalStorage() - const apiUrl = process.env.REACT_APP_API_URL || "https://stage.imploy.site/api/v1" - // This will default to testnet unless mainnet is specifically set in the ENV - - const fallBack = useCallback(({ error, componentStack, eventId, resetError }) => ( - - - An error occurred and has been logged. If you would like to - provide additional info to help us debug and resolve the issue, - click the `"`Provide Additional Details`"` button - - {error?.message.toString()} - {componentStack} - {eventId} - - - - ), []) - - return ( - - window.location.reload()} - > - - - - - - - - - - - - - - - - - - - ) -} - -export default App diff --git a/packages/gaming-ui/src/Components/Elements/ApiKeyCard.tsx b/packages/gaming-ui/src/Components/Elements/ApiKeyCard.tsx deleted file mode 100644 index db489b7d8b..0000000000 --- a/packages/gaming-ui/src/Components/Elements/ApiKeyCard.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import React from "react" -import { AccessKey } from "@chainsafe/files-api-client" -import { makeStyles, createStyles } from "@chainsafe/common-theme" -import { CSGTheme } from "../../Themes/types" -import { Button, Typography, Paper } from "@chainsafe/common-components" -import { Trans } from "@lingui/macro" -import dayjs from "dayjs" - - -const useStyles = makeStyles(({ constants }: CSGTheme) => - createStyles({ - root: { - position: "relative", - margin: constants.generalUnit, - borderRadius: constants.generalUnit / 2, - maxWidth: 250, - padding: `${constants.generalUnit * 2}px ${constants.generalUnit}px` - }, - button: { - marginTop: constants.generalUnit * 2 - } - }) -) - -interface IApiKeyCard { - apiKey: AccessKey - deleteKey: () => void -} - -const ApiKeyCard = ({ apiKey, deleteKey }: IApiKeyCard) => { - const classes = useStyles() - - return ( - - - - Id: - - - - { apiKey.id } - - - - Status: - - - - { apiKey.status } - - - - Created on: - - - - { dayjs(apiKey.created_at).format("DD MMM YYYY h:mm a") } - - - - ) -} - -export default ApiKeyCard \ No newline at end of file diff --git a/packages/gaming-ui/src/Components/Elements/CustomButton.tsx b/packages/gaming-ui/src/Components/Elements/CustomButton.tsx deleted file mode 100644 index 3d9de50746..0000000000 --- a/packages/gaming-ui/src/Components/Elements/CustomButton.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { Button, IButtonProps } from "@chainsafe/common-components" -import { createStyles, ITheme, makeStyles } from "@chainsafe/common-theme" -import React, { ReactNode } from "react" -import clsx from "clsx" - -const useStyles = makeStyles(({ palette }: ITheme) => - createStyles({ - root: { - "&.gray": { - backgroundColor: palette.additional["gray"][3], - color: palette.additional["gray"][9] - } - } - }) -) - -const CUSTOM_VARIANTS = ["gray"] - -const temp = [...CUSTOM_VARIANTS] -type customVariant = typeof temp[0] - -type buttonVariant = IButtonProps["variant"] | customVariant - -interface ICustomButton extends Omit { - children: ReactNode - variant?: buttonVariant - className?: string -} - -const CustomButton: React.FC = ({ - className, - children, - variant, - ...rest -}: ICustomButton) => { - const classes = useStyles() - - const setVariant = - variant && CUSTOM_VARIANTS.includes(variant) - ? "primary" - : variant || "primary" - - return ( - - ) -} - -export default CustomButton diff --git a/packages/gaming-ui/src/Components/Elements/CustomModal.tsx b/packages/gaming-ui/src/Components/Elements/CustomModal.tsx deleted file mode 100644 index 224b120ab3..0000000000 --- a/packages/gaming-ui/src/Components/Elements/CustomModal.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { IModalProps, Modal } from "@chainsafe/common-components" -import { createStyles, makeStyles } from "@chainsafe/common-theme" -import React, { ReactNode } from "react" -import clsx from "clsx" -import { CSGTheme } from "../../Themes/types" - -const useStyles = makeStyles(({ constants, breakpoints }: CSGTheme) => - createStyles({ - root: { - "&:before": { - backgroundColor: constants.modalDefault.fadeBackground - } - }, - inner: { - [breakpoints.down("md")]: { - backgroundColor: constants.modalDefault.background, - top: "unset", - bottom: 0, - left: 0, - width: "100% !important", - transform: "unset", - borderRadiusLeftTop: `${constants.generalUnit * 1.5}px`, - borderRadiusRightTop: `${constants.generalUnit * 1.5}px`, - borderRadiusLeftBottom: 0, - borderRadiusRightBottom: 0 - } - }, - closeIcon: { - [breakpoints.down("md")]: {} - } - }) -) - -interface ICustomModal extends IModalProps { - children: ReactNode - className?: string -} - -const CustomModal: React.FC = ({ - className, - children, - injectedClass, - ...rest -}: ICustomModal) => { - const classes = useStyles() - - return ( - - {children} - - ) -} - -export default CustomModal diff --git a/packages/gaming-ui/src/Components/Elements/SecretField.tsx b/packages/gaming-ui/src/Components/Elements/SecretField.tsx deleted file mode 100644 index ba059aa666..0000000000 --- a/packages/gaming-ui/src/Components/Elements/SecretField.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React, { useCallback, useState } from "react" -import { EyeOpenIcon, EyeClosedIcon, Typography } from "@chainsafe/common-components" -import { makeStyles, createStyles } from "@chainsafe/common-theme" - -interface Props { - value: string -} - -const useStyles = makeStyles(() => - createStyles({ - root: { - display: "flex", - justifyContent: "space-between" - } - }) -) - -const SecretField = ({ value }: Props) => { - const [showValue, setShowValue] = useState(false) - const classes = useStyles() - - const toggleShowValue = useCallback(() => { - setShowValue(!showValue) - }, [showValue]) - - return ( -
- {showValue ? value : "⚫⚫⚫⚫⚫⚫⚫⚫⚫" } - {showValue ? : } -
- ) -} - -export default SecretField \ No newline at end of file diff --git a/packages/gaming-ui/src/Components/GamingRoutes.tsx b/packages/gaming-ui/src/Components/GamingRoutes.tsx deleted file mode 100644 index 3936871e6b..0000000000 --- a/packages/gaming-ui/src/Components/GamingRoutes.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from "react" -import { Switch, ConditionalRoute } from "@chainsafe/common-components" -import LoginPage from "./Pages/LoginPage" -import { useGamingApi } from "../Contexts/GamingApiContext" -import SettingsPage from "./Pages/SettingsPage" -import DashboardPage from "./Pages/DashboardPage" - -export const SETTINGS_PATHS = ["apiKeys"] as const -export type SettingsPath = typeof SETTINGS_PATHS[number] - -export const ROUTE_LINKS = { - Landing: "/", - Dashboard: "/dashboard", - SettingsRoot: "/settings", - Settings: (path: SettingsPath) => `/settings/${path}`, - PrivacyPolicy: "https://files.chainsafe.io/privacy-policy", - Terms: "https://files.chainsafe.io/terms-of-service", - ChainSafe: "https://chainsafe.io/" -} - -const GamingRoutes = () => { - const { isLoggedIn } = useGamingApi() - - return ( - - - - - - ) -} - -export default GamingRoutes diff --git a/packages/gaming-ui/src/Components/Layouts/AppHeader.tsx b/packages/gaming-ui/src/Components/Layouts/AppHeader.tsx deleted file mode 100644 index 45ed28b61a..0000000000 --- a/packages/gaming-ui/src/Components/Layouts/AppHeader.tsx +++ /dev/null @@ -1,232 +0,0 @@ -import React, { useCallback } from "react" -import { createStyles, makeStyles, useThemeSwitcher } from "@chainsafe/common-theme" -import clsx from "clsx" -import { - Link, - Typography, - ChainsafeLogo, - HamburgerMenu, - MenuDropdown, - PowerDownSvg, - useHistory -} from "@chainsafe/common-components" -import { ROUTE_LINKS } from "../GamingRoutes" -import { Trans } from "@lingui/macro" -import { CSGTheme } from "../../Themes/types" -import { useGamingApi } from "../../Contexts/GamingApiContext" -import { useUser } from "../../Contexts/UserContext" - -const useStyles = makeStyles( - ({ palette, animation, breakpoints, constants, zIndex }: CSGTheme) => { - return createStyles({ - root: { - position: "fixed", - display: "flex", - flexDirection: "row", - top: 0, - transitionDuration: `${animation.translate}ms`, - visibility: "hidden", - [breakpoints.up("md")]: { - width: `calc(100% - ${constants.navWidth}px)`, - padding: `${0}px ${constants.contentPadding}px ${0}px ${ - constants.contentPadding - }px`, - left: Number(constants.navWidth), - opacity: 0, - - backgroundColor: constants.header.rootBackground, - - "& > *:first-child": { - flex: "1 1 0" - }, - "&.active": { - opacity: 1, - height: "auto", - visibility: "visible", - padding: `${constants.headerTopPadding}px ${ - constants.contentPadding - }px ${0}px ${constants.contentPadding}px`, - zIndex: zIndex?.layer1 - } - }, - [breakpoints.down("md")]: { - left: 0, - width: "100%", - justifyContent: "space-between", - alignItems: "center", - position: "fixed", - backgroundColor: palette.additional["gray"][3], - "&.active": { - opacity: 1, - visibility: "visible", - height: Number(constants.mobileHeaderHeight), - zIndex: Number(zIndex?.layer1) - } - } - }, - hamburgerMenu: { - position: "absolute", - "& span": { - backgroundColor: constants.header.hamburger - } - }, - logo: { - textDecoration: "none", - display: "flex", - flexDirection: "row", - alignItems: "center", - [breakpoints.up("md")]: { - "& img": { - height: constants.generalUnit * 5, - width: "auto" - } - }, - [breakpoints.down("md")]: { - position: "absolute", - left: "50%", - top: "50%", - transform: "translate(-50%,-50%)", - "& img": { - height: constants.generalUnit * 3.25, - width: "auto" - } - } - }, - accountControls: { - display: "flex", - justifyContent: "flex-end", - alignItems: "center", - flexDirection: "row", - [breakpoints.up("md")]: { - marginLeft: constants.accountControlsPadding - }, - "& > *:first-child": { - marginRight: constants.generalUnit * 2 - } - }, - searchModule: { - [breakpoints.down("md")]: { - height: constants.mobileHeaderHeight, - position: "absolute", - width: "100%", - zIndex: zIndex?.background, - "&.active": {} - } - }, - options: { - backgroundColor: constants.header.optionsBackground, - color: constants.header.optionsTextColor, - border: `1px solid ${constants.header.optionsBorder}`, - minWidth: 145 - }, - menuItem: { - width: "100%", - display: "flex", - flexDirection: "row", - alignItems: "center", - color: constants.header.menuItemTextColor, - "& svg": { - width: constants.generalUnit * 2, - height: constants.generalUnit * 2, - marginRight: constants.generalUnit, - fill: palette.additional["gray"][7], - stroke: palette.additional["gray"][7] - } - }, - icon: { - "& svg": { - fill: constants.header.iconColor - } - }, - title : { - marginLeft: constants.generalUnit - } - }) - } -) - -interface IAppHeader { - navOpen: boolean - setNavOpen: (state: boolean) => void -} - -const AppHeader = ({ navOpen, setNavOpen }: IAppHeader) => { - const { desktop } = useThemeSwitcher() - const classes = useStyles() - const { isLoggedIn, logout } = useGamingApi() - const { history } = useHistory() - const { getProfileTitle } = useUser() - - const signOut = useCallback(async () => { - logout() - history.replace("/", {}) - }, [logout, history]) - - return ( -
- {isLoggedIn && ( - <> - {desktop ? ( - <> -
- signOut(), - contents: ( -
- - - Sign Out - -
- ) - } - ]} - /> -
- - ) : ( - <> - setNavOpen(!navOpen)} - variant={navOpen ? "active" : "default"} - className={clsx(classes.hamburgerMenu, "hamburger-menu")} - testId="hamburger-menu" - /> - - - - Dashboard - - - - )} - - )} -
- ) -} - -export default AppHeader diff --git a/packages/gaming-ui/src/Components/Layouts/AppNav.tsx b/packages/gaming-ui/src/Components/Layouts/AppNav.tsx deleted file mode 100644 index 7746860bf1..0000000000 --- a/packages/gaming-ui/src/Components/Layouts/AppNav.tsx +++ /dev/null @@ -1,272 +0,0 @@ -import { - createStyles, - makeStyles, - useThemeSwitcher -} from "@chainsafe/common-theme" -import React, { useCallback } from "react" -import clsx from "clsx" -import { - Link, - Typography, - PowerDownSvg, - ChainsafeLogo -} from "@chainsafe/common-components" -import { ROUTE_LINKS } from "../GamingRoutes" -import { Trans } from "@lingui/macro" -import { CSGTheme } from "../../Themes/types" -import { useGamingApi } from "../../Contexts/GamingApiContext" - -const useStyles = makeStyles( - ({ palette, animation, breakpoints, constants, zIndex }: CSGTheme) => { - return createStyles({ - root: { - width: 0, - overflow: "hidden", - transitionDuration: `${animation.translate}ms`, - display: "flex", - flexDirection: "column", - position: "fixed", - left: 0, - opacity: 0, - "&.active": { - opacity: 1 - }, - [breakpoints.up("md")]: { - padding: `${constants.topPadding}px ${ - constants.generalUnit * 4.5 - }px`, - top: 0, - height: "100%", - backgroundColor: constants.nav.backgroundColor, - "&.active": { - width: `${constants.navWidth}px` - } - }, - [breakpoints.down("md")]: { - height: `calc(100% - ${constants.mobileHeaderHeight}px)`, - top: `${constants.mobileHeaderHeight}px`, - backgroundColor: constants.nav.mobileBackgroundColor, - zIndex: zIndex?.layer1, - padding: `0 ${constants.generalUnit * 4}px`, - maxWidth: "100vw", - visibility: "hidden", - "&.active": { - visibility: "visible", - width: `${constants.mobileNavWidth}px` - } - } - }, - blocker: { - display: "block", - backgroundColor: constants.nav.blocker, - position: "fixed", - top: Number(constants.mobileHeaderHeight), - left: 0, - height: `calc(100% - ${constants.mobileHeaderHeight}px)`, - width: "100%", - transitionDuration: `${animation.translate}ms`, - zIndex: zIndex?.background, - opacity: 0, - visibility: "hidden", - "&.active": { - visibility: "visible", - [breakpoints.down("md")]: { - opacity: 0.5 - } - } - }, - logo: { - textDecoration: "none", - display: "flex", - flexDirection: "row", - alignItems: "center", - - [breakpoints.up("md")]: { - "& img": { - height: constants.generalUnit * 5, - width: "auto" - }, - "& > *:first-child": { - marginRight: constants.generalUnit - } - }, - [breakpoints.down("md")]: { - position: "absolute", - left: "50%", - top: "50%", - transform: "translate(-50%,-50%)", - "& img": { - height: constants.generalUnit * 3.25, - width: "auto" - } - } - }, - navMenu: { - display: "flex", - flexDirection: "column", - marginBottom: constants.generalUnit * 8.5, - transitionDuration: `${animation.translate}ms` - }, - linksArea: { - display: "flex", - flexDirection: "column", - flex: "1 1 0", - justifyContent: "center", - transitionDuration: `${animation.translate}ms`, - "& > span": { - marginBottom: constants.generalUnit * 2 - }, - [breakpoints.up("md")]: { - height: 0 - }, - [breakpoints.down("md")]: { - transitionDuration: `${animation.translate}ms`, - color: palette.additional["gray"][3], - "&.active": {} - } - }, - navItem: { - textDecoration: "none", - display: "flex", - flexDirection: "row", - alignItems: "center", - cursor: "pointer", - padding: `${constants.generalUnit * 1.5}px 0`, - transitionDuration: `${animation.transform}ms`, - "& span": { - transitionDuration: `${animation.transform}ms`, - [breakpoints.up("md")]: { - color: constants.nav.itemColor - }, - [breakpoints.down("md")]: { - color: constants.nav.itemColorHover - } - }, - "& svg": { - transitionDuration: `${animation.transform}ms`, - width: Number(constants.svgWidth), - marginRight: constants.generalUnit * 2, - [breakpoints.up("md")]: { - fill: constants.nav.itemIconColor - }, - [breakpoints.down("md")]: { - fill: constants.nav.itemIconColorHover - } - }, - "&:hover": { - "& span": { - color: constants.nav.itemColorHover - }, - "& svg": { - fill: constants.nav.itemIconColorHover - } - }, - [breakpoints.down("md")]: { - minWidth: Number(constants.mobileNavWidth) - } - }, - navItemText: { - [breakpoints.down("md")]: { - color: palette.additional["gray"][3] - } - }, - menuItem: { - width: 100, - display: "flex", - flexDirection: "row", - alignItems: "center", - "& svg": { - width: constants.generalUnit * 2, - height: constants.generalUnit * 2, - marginRight: constants.generalUnit - } - }, - spaceUsedMargin: { - marginBottom: constants.generalUnit - }, - betaCaption: { - marginBottom: constants.generalUnit * 0.5 - } - }) - } -) - -interface IAppNav { - navOpen: boolean - setNavOpen: (state: boolean) => void -} - -const AppNav: React.FC = ({ navOpen, setNavOpen }: IAppNav) => { - const { desktop } = useThemeSwitcher() - const classes = useStyles() - - const { isLoggedIn, logout } = useGamingApi() - - const signOut = useCallback(() => { - logout() - }, [logout]) - - const handleOnClick = useCallback(() => { - if (!desktop && navOpen) { - setNavOpen(false) - } - }, [desktop, navOpen, setNavOpen]) - - return ( -
- {isLoggedIn && ( - <> - {desktop && ( -
- - - - Gaming - - -
- )} -
- -
-
- {!desktop && ( -
{ - handleOnClick() - signOut() - }} - > - - - Sign Out - -
- )} -
- {!desktop && ( -
setNavOpen(false)} - className={clsx(classes.blocker, { - active: navOpen - })} - >
- )} - - )} -
- ) -} - -export default AppNav \ No newline at end of file diff --git a/packages/gaming-ui/src/Components/Layouts/AppWrapper.tsx b/packages/gaming-ui/src/Components/Layouts/AppWrapper.tsx deleted file mode 100644 index e09654b091..0000000000 --- a/packages/gaming-ui/src/Components/Layouts/AppWrapper.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { createStyles, ITheme, makeStyles } from "@chainsafe/common-theme" -import React, { useState } from "react" -import { ReactNode } from "react" -import clsx from "clsx" -import { useGamingApi } from "../../Contexts/GamingApiContext" -import { CssBaseline } from "@chainsafe/common-components" -import AppHeader from "./AppHeader" -import AppNav from "./AppNav" - -interface IAppWrapper { - children: ReactNode | ReactNode[] -} - -const useStyles = makeStyles( - ({ animation, breakpoints, constants }: ITheme) => { - return createStyles({ - root: { - minHeight: "100vh" - }, - bodyWrapper: { - transitionDuration: `${animation.translate}ms`, - [breakpoints.up("md")]: { - padding: "0", - "&.active": { - // This moves the content areas based on the size of the nav bar - - padding: `${0}px ${constants.contentPadding}px ${0}px ${ - Number(constants.navWidth) + - Number(constants.contentPadding) - }px` - } - }, - [breakpoints.down("md")]: {} - }, - content: { - minHeight: "100vh", - [breakpoints.up("md")]: { - height: "100%", - transitionDuration: `${animation.translate}ms`, - padding: 0, - "&.active": { - height: "initial", - padding: `${constants.contentTopPadding}px 0 0` - } - }, - [breakpoints.down("md")]: { - "&.active": { - height: "initial", - padding: `${constants.mobileHeaderHeight}px 0 0` - } - } - } - }) - } -) - -const AppWrapper: React.FC = ({ children }: IAppWrapper) => { - const classes = useStyles() - const [navOpen, setNavOpen] = useState(false) - const { isLoggedIn } = useGamingApi() - - return ( -
- - -
- -
- {children} -
-
-
- ) -} - -export default AppWrapper diff --git a/packages/gaming-ui/src/Components/Modules/DashboardModule.tsx b/packages/gaming-ui/src/Components/Modules/DashboardModule.tsx deleted file mode 100644 index 7d75feb1b8..0000000000 --- a/packages/gaming-ui/src/Components/Modules/DashboardModule.tsx +++ /dev/null @@ -1,263 +0,0 @@ -import { Button, CopyIcon, Modal, PlusIcon, Typography } from "@chainsafe/common-components" -import { createStyles, debounce, makeStyles } from "@chainsafe/common-theme" -import { AccessKey } from "@chainsafe/files-api-client" -import { Trans } from "@lingui/macro" -import React, { useCallback, useEffect, useState } from "react" -import { useGamingApi } from "../../Contexts/GamingApiContext" -import { CSGTheme } from "../../Themes/types" -import ApiKeyCard from "../Elements/ApiKeyCard" - -const useStyles = makeStyles(({ breakpoints, constants, palette, zIndex }: CSGTheme) => - createStyles({ - root: { - position: "relative", - margin: constants.generalUnit - }, - header: { - display: "flex", - flexDirection: "row", - justifyContent: "space-between", - alignItems: "center", - [breakpoints.down("md")]: { - marginTop: constants.generalUnit - } - }, - controls: { - display: "flex", - flexDirection: "row", - justifyContent: "space-between", - alignItems: "center", - "& > button": { - marginLeft: constants.generalUnit - } - }, - dataArea: { - marginTop: constants.generalUnit * 2, - display: "flex", - flexDirection: "row", - justifyContent: "space-between", - flexWrap: "wrap", - "& > *": { - margin: constants.generalUnit, - width:"100%", - [breakpoints.up("xs")]: { - maxWidth: `calc(100% - ${constants.generalUnit * 2}px)` - }, - [breakpoints.up("sm")]: { - maxWidth: `calc(50% - ${constants.generalUnit * 2}px)` - }, - [breakpoints.up("md")]: { - maxWidth: `calc(33% - ${constants.generalUnit * 2}px)` - }, - [breakpoints.up("lg")]: { - maxWidth: `calc(25% - ${constants.generalUnit * 2}px)` - }, - [breakpoints.up("xl")]: { - maxWidth: `calc(20% - ${constants.generalUnit * 2}px)` - } - } - }, - modalRoot: { - zIndex: zIndex?.blocker, - [breakpoints.down("md")]: {} - }, - modalInner: { - [breakpoints.down("md")]: { - bottom: - Number(constants?.mobileButtonHeight) + constants.generalUnit, - borderTopLeftRadius: `${constants.generalUnit * 1.5}px`, - borderTopRightRadius: `${constants.generalUnit * 1.5}px`, - maxWidth: `${breakpoints.width("md")}px !important` - } - }, - modalHeading: { - textAlign: "center", - marginBottom: constants.generalUnit * 4 - }, - modalContent: { - display: "flex", - flexDirection: "column", - padding: constants.generalUnit * 4 - }, - secretContainer: { - display: "flex", - justifyContent: "space-between", - marginBottom: constants.generalUnit * 0.5 - }, - copyBox: { - display: "flex", - justifyContent: "space-between", - alignItems: "center", - cursor: "pointer", - color: palette.text.secondary - }, - copyIcon: { - fontSize: "14px", - fill: constants.profile.icon, - [breakpoints.down("md")]: { - fontSize: "18px", - fill: palette.additional["gray"][9] - } - }, - secret: { - maxWidth: "95%", - overflowWrap: "anywhere" - }, - field: { - marginBottom: constants.generalUnit * 4 - } - }) -) - -const DashboardModule = () => { - const classes = useStyles() - const { gamingApiClient } = useGamingApi() - const [keys, setKeys] = useState([]) - const [newKey, setNewKey] = useState() - const [isNewKeyModalOpen, setIsNewKeyModalOpen] = useState(false) - const [copiedSecret, setCopiedSecret] = useState(false) - const debouncedCopiedSecret = - debounce(() => setCopiedSecret(false), 3000) - - const copySecret = async () => { - if (newKey?.secret) { - try { - await navigator.clipboard.writeText(newKey.secret) - setCopiedSecret(true) - debouncedCopiedSecret() - } catch (err) { - console.error(err) - } - } - } - - const fetchAccessKeys = useCallback(() => { - gamingApiClient.listAccessKeys() - .then(keys => setKeys(keys.filter(key => key.type === "gaming"))) - .catch(console.error) - }, [gamingApiClient]) - - const createGamingAccessKey = useCallback(() => { - gamingApiClient.createAccessKey({ type: "gaming" }) - .then((key) => { - setNewKey(key) - fetchAccessKeys() - setIsNewKeyModalOpen(true) - }) - .catch(console.error) - }, [fetchAccessKeys, gamingApiClient]) - - const deleteAccessKey = useCallback((id: string) => { - gamingApiClient.deleteAccessKey(id) - .then(fetchAccessKeys) - .catch(console.error) - }, [gamingApiClient, fetchAccessKeys]) - - useEffect(() => { - fetchAccessKeys() - }, [fetchAccessKeys]) - - return ( - <> -
-
- - - Dashboard - - -
- -
-
-
- { - keys.map((key: AccessKey, index: number) => ( - deleteAccessKey(key.id)} - apiKey={key} />)) - } -
-
- -
- - New Key - - - Key ID - - {newKey?.id} - - Secret - -
-
- - Make sure to save the secret, as it can only be displayed once. - - {copiedSecret && ( - - Copied! - - )} -
-
- - {newKey?.secret} - - -
-
- -
-
- - ) -} - -export default DashboardModule \ No newline at end of file diff --git a/packages/gaming-ui/src/Components/Modules/LoginModule.tsx b/packages/gaming-ui/src/Components/Modules/LoginModule.tsx deleted file mode 100644 index c4268a24c0..0000000000 --- a/packages/gaming-ui/src/Components/Modules/LoginModule.tsx +++ /dev/null @@ -1,435 +0,0 @@ -import React, { useState } from "react" -import { Button, GithubLogoIcon, GoogleLogoIcon, Loading, MailIcon, Typography } from "@chainsafe/common-components" -import { createStyles, makeStyles, useThemeSwitcher } from "@chainsafe/common-theme" -import { CSGTheme } from "../../Themes/types" -import { t, Trans } from "@lingui/macro" -import { useGamingApi } from "../../Contexts/GamingApiContext" -import { useWeb3 } from "@chainsafe/web3-context" -import { ROUTE_LINKS } from "../GamingRoutes" -import clsx from "clsx" -import { IdentityProvider } from "@chainsafe/files-api-client" -import PasswordlessEmail from "./LoginModule/PasswordlessEmail" - -const useStyles = makeStyles( - ({ constants, palette, breakpoints, typography }: CSGTheme) => - createStyles({ - root: { - backgroundColor: constants.loginModule.background, - border: `1px solid ${constants.landing.border}`, - boxShadow: constants.landing.boxShadow, - alignItems: "center", - borderRadius: 6, - [breakpoints.up("md")]:{ - minHeight: "64vh", - justifyContent: "space-between", - width: 440 - }, - [breakpoints.down("md")]: { - padding: `${constants.generalUnit * 4}px ${constants.generalUnit * 2}px`, - justifyContent: "center", - width: `calc(100vw - ${constants.generalUnit * 2}px)` - } - }, - buttonSection: { - [breakpoints.up("md")]: { - position: "absolute", - top: "50%", - left: "50%", - transform: "translate(-50%, -50%)" - }, - [breakpoints.down("md")]: { - display: "flex", - flexDirection: "column", - justifyContent: "space-evenly" - } - }, - connectingWallet: { - textAlign: "center", - alignItems: "center", - display: "flex", - flexDirection: "column", - "& > *": { - fontWeight: 400 - }, - [breakpoints.up("md")]: { - padding: `${constants.generalUnit * 20}px ${constants.generalUnit * 8}px`, - "& > *": { - paddingBottom: `${constants.generalUnit * 5}px` - } - }, - [breakpoints.down("md")]: { - justifyContent: "space-evenly" - } - }, - button: { - width: 240, - fontWeight: typography.fontWeight.medium, - marginBottom: constants.generalUnit * 2, - "& .icon" : { - fontSize: 25 - }, - "&:last-child": { - marginBottom: 0 - } - }, - error: { - color: palette.error.main, - paddingBottom: constants.generalUnit * 2, - maxWidth: 240 - }, - headerText: { - [breakpoints.up("md")]: { - paddingTop: constants.generalUnit * 4, - paddingBottom: constants.generalUnit * 8 - }, - [breakpoints.down("md")]: { - paddingTop: constants.generalUnit * 3, - paddingBottom: constants.generalUnit * 3, - textAlign: "center" - } - }, - footer: { - backgroundColor: constants.landing.footerBg, - color: constants.landing.footerText, - padding: `${constants.generalUnit * 2.5}px ${constants.generalUnit * 1.5}px`, - width: "100%", - "& > *": { - marginRight: constants.generalUnit * 3.5 - }, - [breakpoints.down("md")]: { - display: "none" - } - }, - connectWalletFooter: { - backgroundColor: constants.landing.background, - color: constants.landing.footerText, - padding: `${constants.generalUnit * 4.375}px ${constants.generalUnit * 7}px`, - width: "100%", - textAlign: "center", - "& > *": { - fontWeight: 400 - }, - [breakpoints.down("md")]: { - display: "none" - } - }, - loader: { - marginTop: constants.generalUnit, - padding: 0 - }, - buttonLink: { - color: palette.additional["gray"][10], - outline: "none", - textDecoration: "underline", - cursor: "pointer", - textAlign: "center" - }, - web3Button: { - minHeight: 41 - } - }) -) - -interface IInitialScreen { - className?: string -} - -const LoginModule = ({ className }: IInitialScreen) => { - const { selectWallet, resetAndSelectWallet, login, resetStatus, status } = useGamingApi() - const { desktop } = useThemeSwitcher() - const { wallet } = useWeb3() - const classes = useStyles() - const [loginMode, setLoginMode] = useState() - const [error, setError] = useState() - const maintenanceMode = process.env.REACT_APP_MAINTENANCE_MODE === "true" - const [isConnecting, setIsConnecting] = useState(false) - - const handleSelectWalletAndConnect = async () => { - setError(undefined) - try { - await selectWallet() - } catch (error) { - setError(t`There was an error connecting your wallet`) - } - } - - const handleResetAndSelectWallet = async () => { - setError(undefined) - try { - await resetAndSelectWallet() - } catch (error) { - setError(t`There was an error connecting your wallet`) - } - } - - const resetLogin = async () => { - setError(undefined) - setLoginMode(undefined) - resetStatus() - } - - const handleLogin = async (loginType: IdentityProvider) => { - setError("") - setIsConnecting(true) - setLoginMode(loginType) - try { - await login(loginType) - } catch (error: any) { - let errorMessage = t`There was an error authenticating` - - // Invalid signature, or contract wallet not deployed - if (error?.error?.code === 403 && error?.error?.message?.includes("Invalid signature")) { - errorMessage = t`Failed to validate signature. - If you are using a contract wallet, please make - sure you have activated your wallet.` - } - - // User rejected the signature request (WalletConnect be sassy) - if (error?.message === "Just nope" || error?.code === 4001) { - errorMessage = t`Failed to get signature` - } - - // DirectAuth popup was closed - if (error?.message === "user closed popup") { - errorMessage = t`The authentication popup was closed` - } - setError(errorMessage) - } - setIsConnecting(false) - } - - const ConnectWallet = () => { - if (!wallet) { - console.error("No wallet found") - return null - } - - return ( -
-
- - -
- - Go back - -
-
-
-
- )} - - const WalletConnection = () => { - return ( -
- Connect Wallet to Gaming - {status === "awaiting confirmation" && - - You will need to sign a message in your wallet to complete sign in. - } - {status === "logging in" && <> - - Hold on, we are logging you in… - - - } -
- ) - } - - const WalletSelection = () => { - return ( - <> -
- - -
-