diff --git a/README.md b/README.md
index 76f82ba16..16063cf7e 100644
--- a/README.md
+++ b/README.md
@@ -147,7 +147,7 @@ Adding a new dependency should have vital value on the product with minimum poss
│ │ │ │ ├── _create.svelte // Component to Create collections
│ │ │ │ └── index.svelte // Entrypoint for "/console/[PROJECT_ID]/database"
│ │ │ ├── storage // Storage Service "/console/[PROJECT]/storage"
-│ │ │ └── authentication // Users Service "/console/[PROJECT]/authentication"
+│ │ │ └── auth // Users Service "/console/[PROJECT]/auth"
│ │ └──...
│ ├── login.svelte // Component for Login "/console/login"
│ └── register.svelte // Component for Register "/console/register"
diff --git a/package-lock.json b/package-lock.json
index c0272c726..d7a077f1e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,11 +8,12 @@
"name": "@appwrite/console",
"version": "0.0.1",
"dependencies": {
- "@aw-labs/appwrite-console": "^6.0.0",
- "@aw-labs/icons": "0.0.0-66",
- "@aw-labs/ui": "0.0.0-66",
+ "@aw-labs/appwrite-console": "^10.0.0",
+ "@aw-labs/icons": "0.0.0-72",
+ "@aw-labs/ui": "0.0.0-72",
"@popperjs/core": "^2.11.6",
"echarts": "^5.4.0",
+ "pretty-bytes": "^6.0.0",
"prismjs": "^1.29.0",
"tippy.js": "^6.3.7",
"web-vitals": "^3.0.3"
@@ -71,23 +72,23 @@
}
},
"node_modules/@aw-labs/appwrite-console": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@aw-labs/appwrite-console/-/appwrite-console-6.0.0.tgz",
- "integrity": "sha512-g4sCMGiIptDUyKhJSfiKsG/gzqMIt3MQCdqod6bNWMunbXUqN7DeA0BT4MuTeVGdQuoOKuSmgHeExatlu0Dh9Q==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@aw-labs/appwrite-console/-/appwrite-console-10.0.0.tgz",
+ "integrity": "sha512-YyEQ5SIhkvI/Axt/EOkAqKcMTkfEpQt7W1q91lWKQ+Hm9woMzYUcf8KThBnMvEFbphWQRaJKLtfpr8EJjCjm4w==",
"dependencies": {
"cross-fetch": "3.1.5",
"isomorphic-form-data": "2.0.0"
}
},
"node_modules/@aw-labs/icons": {
- "version": "0.0.0-66",
- "resolved": "https://registry.npmjs.org/@aw-labs/icons/-/icons-0.0.0-66.tgz",
- "integrity": "sha512-3r6pxixYZ6Bn9QTUbFk8XYwds+CHz1baRkOVsQ5HoFz6XgvzTWn3/+pvZZ56Ht2Ek//wr4wwI30pdCXaX4QIsA=="
+ "version": "0.0.0-72",
+ "resolved": "https://registry.npmjs.org/@aw-labs/icons/-/icons-0.0.0-72.tgz",
+ "integrity": "sha512-z3k9ex4oKdE/VUPeqc6lpo2HuhC39Dov2NEXv/1v6YBw2l20LavNA6m7NU/DFkq+m286un/dp6w7ORbgpZlIvw=="
},
"node_modules/@aw-labs/ui": {
- "version": "0.0.0-66",
- "resolved": "https://registry.npmjs.org/@aw-labs/ui/-/ui-0.0.0-66.tgz",
- "integrity": "sha512-5qFISwKzOyZq7Ix5FG/BhVKEcIMXd2/Y8Ioba+ejTQ8B9hzj6FlwxUw7hLT49ZDhU+kxpjJQV51hRpbHGvmEag==",
+ "version": "0.0.0-72",
+ "resolved": "https://registry.npmjs.org/@aw-labs/ui/-/ui-0.0.0-72.tgz",
+ "integrity": "sha512-+NR8p3fRMVj/RMPmyVJPcdaRwYkWNw7jJ/wxT4zjYxa7QeeMJwILYfYIFYnnu0GG9SN9nOc2z+yISqL0p0HgfA==",
"dependencies": {
"@aw-labs/icons": "*",
"normalize.css": "^8.0.1",
@@ -721,38 +722,6 @@
"dev": true,
"peer": true
},
- "node_modules/@esbuild/android-arm": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz",
- "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz",
- "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/@eslint/eslintrc": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
@@ -2899,54 +2868,6 @@
"esbuild-windows-arm64": "0.15.10"
}
},
- "node_modules/esbuild-android-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz",
- "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-android-arm64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz",
- "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-darwin-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz",
- "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/esbuild-darwin-arm64": {
"version": "0.15.10",
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz",
@@ -2963,262 +2884,6 @@
"node": ">=12"
}
},
- "node_modules/esbuild-freebsd-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz",
- "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-freebsd-arm64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz",
- "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-32": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz",
- "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz",
- "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-arm": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz",
- "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-arm64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz",
- "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-mips64le": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz",
- "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-ppc64le": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz",
- "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-riscv64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz",
- "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-s390x": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz",
- "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-netbsd-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz",
- "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-openbsd-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz",
- "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-sunos-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz",
- "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-32": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz",
- "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz",
- "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-arm64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz",
- "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -6278,6 +5943,17 @@
"svelte": "^3.2.0"
}
},
+ "node_modules/pretty-bytes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz",
+ "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==",
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/pretty-format": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
@@ -7782,23 +7458,23 @@
}
},
"@aw-labs/appwrite-console": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@aw-labs/appwrite-console/-/appwrite-console-6.0.0.tgz",
- "integrity": "sha512-g4sCMGiIptDUyKhJSfiKsG/gzqMIt3MQCdqod6bNWMunbXUqN7DeA0BT4MuTeVGdQuoOKuSmgHeExatlu0Dh9Q==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@aw-labs/appwrite-console/-/appwrite-console-10.0.0.tgz",
+ "integrity": "sha512-YyEQ5SIhkvI/Axt/EOkAqKcMTkfEpQt7W1q91lWKQ+Hm9woMzYUcf8KThBnMvEFbphWQRaJKLtfpr8EJjCjm4w==",
"requires": {
"cross-fetch": "3.1.5",
"isomorphic-form-data": "2.0.0"
}
},
"@aw-labs/icons": {
- "version": "0.0.0-66",
- "resolved": "https://registry.npmjs.org/@aw-labs/icons/-/icons-0.0.0-66.tgz",
- "integrity": "sha512-3r6pxixYZ6Bn9QTUbFk8XYwds+CHz1baRkOVsQ5HoFz6XgvzTWn3/+pvZZ56Ht2Ek//wr4wwI30pdCXaX4QIsA=="
+ "version": "0.0.0-72",
+ "resolved": "https://registry.npmjs.org/@aw-labs/icons/-/icons-0.0.0-72.tgz",
+ "integrity": "sha512-z3k9ex4oKdE/VUPeqc6lpo2HuhC39Dov2NEXv/1v6YBw2l20LavNA6m7NU/DFkq+m286un/dp6w7ORbgpZlIvw=="
},
"@aw-labs/ui": {
- "version": "0.0.0-66",
- "resolved": "https://registry.npmjs.org/@aw-labs/ui/-/ui-0.0.0-66.tgz",
- "integrity": "sha512-5qFISwKzOyZq7Ix5FG/BhVKEcIMXd2/Y8Ioba+ejTQ8B9hzj6FlwxUw7hLT49ZDhU+kxpjJQV51hRpbHGvmEag==",
+ "version": "0.0.0-72",
+ "resolved": "https://registry.npmjs.org/@aw-labs/ui/-/ui-0.0.0-72.tgz",
+ "integrity": "sha512-+NR8p3fRMVj/RMPmyVJPcdaRwYkWNw7jJ/wxT4zjYxa7QeeMJwILYfYIFYnnu0GG9SN9nOc2z+yISqL0p0HgfA==",
"requires": {
"@aw-labs/icons": "*",
"normalize.css": "^8.0.1",
@@ -8291,20 +7967,6 @@
"dev": true,
"peer": true
},
- "@esbuild/android-arm": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz",
- "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-loong64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz",
- "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==",
- "dev": true,
- "optional": true
- },
"@eslint/eslintrc": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
@@ -9991,27 +9653,6 @@
"esbuild-windows-arm64": "0.15.10"
}
},
- "esbuild-android-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz",
- "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==",
- "dev": true,
- "optional": true
- },
- "esbuild-android-arm64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz",
- "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==",
- "dev": true,
- "optional": true
- },
- "esbuild-darwin-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz",
- "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==",
- "dev": true,
- "optional": true
- },
"esbuild-darwin-arm64": {
"version": "0.15.10",
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz",
@@ -10019,118 +9660,6 @@
"dev": true,
"optional": true
},
- "esbuild-freebsd-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz",
- "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==",
- "dev": true,
- "optional": true
- },
- "esbuild-freebsd-arm64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz",
- "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-32": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz",
- "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz",
- "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-arm": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz",
- "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-arm64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz",
- "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-mips64le": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz",
- "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-ppc64le": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz",
- "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-riscv64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz",
- "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-s390x": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz",
- "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==",
- "dev": true,
- "optional": true
- },
- "esbuild-netbsd-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz",
- "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==",
- "dev": true,
- "optional": true
- },
- "esbuild-openbsd-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz",
- "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==",
- "dev": true,
- "optional": true
- },
- "esbuild-sunos-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz",
- "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==",
- "dev": true,
- "optional": true
- },
- "esbuild-windows-32": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz",
- "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==",
- "dev": true,
- "optional": true
- },
- "esbuild-windows-64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz",
- "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==",
- "dev": true,
- "optional": true
- },
- "esbuild-windows-arm64": {
- "version": "0.15.10",
- "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz",
- "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==",
- "dev": true,
- "optional": true
- },
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -12460,6 +11989,11 @@
"dev": true,
"requires": {}
},
+ "pretty-bytes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz",
+ "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg=="
+ },
"pretty-format": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
diff --git a/package.json b/package.json
index ec0f46155..93c13d4a4 100644
--- a/package.json
+++ b/package.json
@@ -19,11 +19,12 @@
"e2e": "playwright test tests/e2e"
},
"dependencies": {
- "@aw-labs/appwrite-console": "^6.0.0",
- "@aw-labs/icons": "0.0.0-66",
- "@aw-labs/ui": "0.0.0-66",
+ "@aw-labs/appwrite-console": "^10.0.0",
+ "@aw-labs/icons": "0.0.0-72",
+ "@aw-labs/ui": "0.0.0-72",
"@popperjs/core": "^2.11.6",
"echarts": "^5.4.0",
+ "pretty-bytes": "^6.0.0",
"prismjs": "^1.29.0",
"tippy.js": "^6.3.7",
"web-vitals": "^3.0.3"
diff --git a/src/lib/charts/bar.svelte b/src/lib/charts/bar.svelte
index 71377d401..d7658dfa6 100644
--- a/src/lib/charts/bar.svelte
+++ b/src/lib/charts/bar.svelte
@@ -1,11 +1,14 @@
{
s.type = 'bar';
s.stack = 'total';
diff --git a/src/lib/charts/base.json b/src/lib/charts/base.json
index 29d166045..0cbfc0897 100644
--- a/src/lib/charts/base.json
+++ b/src/lib/charts/base.json
@@ -6,7 +6,7 @@
"borderWidth": 1
},
"lineStyle": {
- "width": 2
+ "width": 1
},
"symbolSize": 4,
"symbol": "emptyCircle",
diff --git a/src/lib/charts/base.svelte b/src/lib/charts/base.svelte
index 54d8e2907..09f5b5ee2 100644
--- a/src/lib/charts/base.svelte
+++ b/src/lib/charts/base.svelte
@@ -8,10 +8,12 @@
import dark from './dark.json';
import type { ECharts } from 'echarts/core';
import type { BarSeriesOption, LineSeriesOption } from 'echarts/charts';
+ import type { EChartsOption } from 'echarts';
registerTheme('light', { ...base, ...light });
registerTheme('dark', { ...base, ...dark });
+ export let options: EChartsOption;
export let series: (BarSeriesOption | LineSeriesOption)[];
let chart: ECharts;
@@ -19,6 +21,7 @@
$: option = {
...defaultConfig,
+ ...options,
series
};
@@ -39,7 +42,7 @@
(await import('echarts/components')).TransformComponent,
(await import('echarts/components')).LegendComponent,
(await import('echarts/features')).LabelLayout,
- (await import('echarts/renderers')).CanvasRenderer
+ (await import('echarts/renderers')).SVGRenderer
]);
makeChart();
});
@@ -85,6 +88,7 @@
diff --git a/src/lib/charts/config.ts b/src/lib/charts/config.ts
index 541b51e30..c43f04c63 100644
--- a/src/lib/charts/config.ts
+++ b/src/lib/charts/config.ts
@@ -17,8 +17,8 @@ export const defaultConfig: EChartsOption = {
containLabel: true,
left: 0,
right: 0,
- bottom: 15,
- top: 15
+ bottom: 0,
+ top: 45
},
xAxis: {
type: 'time',
@@ -27,6 +27,11 @@ export const defaultConfig: EChartsOption = {
yAxis: {
type: 'value',
splitNumber: 3,
- minInterval: 1
+ minInterval: 1,
+ splitLine: {
+ lineStyle: {
+ width: 1
+ }
+ }
}
};
diff --git a/src/lib/charts/dark.json b/src/lib/charts/dark.json
index 0bc23c3cf..94a660131 100644
--- a/src/lib/charts/dark.json
+++ b/src/lib/charts/dark.json
@@ -45,11 +45,11 @@
}
},
"axisLabel": {
- "color": "#666666"
+ "color": "#868EA3"
},
"splitLine": {
"lineStyle": {
- "color": ["#333333"]
+ "color": ["#4F5769"]
}
},
"splitArea": {
diff --git a/src/lib/charts/light.json b/src/lib/charts/light.json
index d94378d63..e6ddb057a 100644
--- a/src/lib/charts/light.json
+++ b/src/lib/charts/light.json
@@ -34,7 +34,7 @@
},
"splitLine": {
"lineStyle": {
- "color": ["#E0E6F1"]
+ "color": ["#E8E9F0"]
}
}
},
diff --git a/src/lib/charts/line.svelte b/src/lib/charts/line.svelte
index 4cebee6f9..3879c07dc 100644
--- a/src/lib/charts/line.svelte
+++ b/src/lib/charts/line.svelte
@@ -1,14 +1,24 @@
{
s.type = 'line';
s.stack = 'total';
+ s.lineStyle = {
+ shadowBlur: 38,
+ shadowColor: Colors.Primary,
+ shadowOffsetY: 15,
+ shadowOffsetX: 0
+ };
s.showSymbol = false;
return s;
diff --git a/src/lib/components/card.svelte b/src/lib/components/card.svelte
index a9d12f9bc..cac926f54 100644
--- a/src/lib/components/card.svelte
+++ b/src/lib/components/card.svelte
@@ -1,7 +1,8 @@
-
+
diff --git a/src/lib/components/cardContainer.svelte b/src/lib/components/cardContainer.svelte
index 5ba3ee68b..126e61c97 100644
--- a/src/lib/components/cardContainer.svelte
+++ b/src/lib/components/cardContainer.svelte
@@ -12,8 +12,8 @@
style={`--grid-gap:1.5rem; --grid-item-size:${total > 3 ? '22rem' : '25rem'};`}>
- {#if limit + offset > total && (total % 2 !== 0 || total % 4 === 0)}
-
+ {#if total > 3 ? total < limit + offset : total % 2 !== 0}
+
{/if}
diff --git a/src/lib/components/code.svelte b/src/lib/components/code.svelte
index f8ac3d894..24debe415 100644
--- a/src/lib/components/code.svelte
+++ b/src/lib/components/code.svelte
@@ -10,7 +10,6 @@
import 'prismjs/plugins/autoloader/prism-autoloader';
import 'prismjs/plugins/custom-class/prism-custom-class';
import 'prismjs/plugins/line-numbers/prism-line-numbers';
- import 'prismjs/plugins/line-numbers/prism-line-numbers.css';
import { afterUpdate } from 'svelte';
import { Copy } from '.';
@@ -49,16 +48,16 @@
{/if}
-
- {code}
-
+ {code}
diff --git a/src/lib/layout/unauthenticated.svelte b/src/lib/layout/unauthenticated.svelte
index be86d9b83..62d9e923b 100644
--- a/src/lib/layout/unauthenticated.svelte
+++ b/src/lib/layout/unauthenticated.svelte
@@ -82,7 +82,7 @@
- version 0.15.2.402
+
diff --git a/src/lib/layout/usage.svelte b/src/lib/layout/usage.svelte
index 9ce00d5e0..f90dd5cb6 100644
--- a/src/lib/layout/usage.svelte
+++ b/src/lib/layout/usage.svelte
@@ -42,12 +42,17 @@
{title}
- 24h
- 30d
- 90d
+
+ 24h
+
+
+ 30d
+
+
+ 90d
+
@@ -70,14 +75,16 @@
{total(created)}
{createdMetadata.title}
- [e.date, e.value])],
- color: Colors.Secondary
- }
- ]} />
+
+ [e.date, e.value])],
+ color: Colors.Secondary
+ }
+ ]} />
+
{/if}
@@ -85,14 +92,16 @@
{total(read)}
{readMetadata.title}
- [e.date, e.value])],
- color: Colors.Tertiary
- }
- ]} />
+
+ [e.date, e.value])],
+ color: Colors.Tertiary
+ }
+ ]} />
+
{/if}
@@ -100,14 +109,16 @@
{total(updated)}
{updatedMetadata.title}
- [e.date, e.value])],
- color: Colors.Quaternary
- }
- ]} />
+
+ [e.date, e.value])],
+ color: Colors.Quaternary
+ }
+ ]} />
+
{/if}
@@ -115,14 +126,16 @@
{total(deleted)}
{deletedMetadata.title}
- [e.date, e.value])],
- color: Colors.Quinary
- }
- ]} />
+
+ [e.date, e.value])],
+ color: Colors.Quinary
+ }
+ ]} />
+
{/if}
diff --git a/src/lib/layout/wizard.svelte b/src/lib/layout/wizard.svelte
index 40b8e2f23..6ca867e00 100644
--- a/src/lib/layout/wizard.svelte
+++ b/src/lib/layout/wizard.svelte
@@ -28,7 +28,8 @@
let showExitModal = false;
function handleKeydown(event: KeyboardEvent) {
- if (event.key === 'Escape' && !showExitModal) {
+ const openDialog = document.querySelectorAll('dialog[open]');
+ if (event.key === 'Escape' && !showExitModal && !openDialog?.length) {
event.preventDefault();
dispatch('exit');
wizard.hide();
diff --git a/src/lib/stores/oauth-providers.ts b/src/lib/stores/oauth-providers.ts
index 7b3f87d5f..997641024 100644
--- a/src/lib/stores/oauth-providers.ts
+++ b/src/lib/stores/oauth-providers.ts
@@ -1,18 +1,14 @@
import { writable } from 'svelte/store';
import type { Models } from '@aw-labs/appwrite-console';
import type { SvelteComponent } from 'svelte';
-import Apple from '../../routes/console/project-[project]/authentication/_appleOAuth.svelte';
-import Microsoft from '../../routes/console/project-[project]/authentication/_microsoftOAuth.svelte';
-import Okta from '../../routes/console/project-[project]/authentication/_oktaOAuth.svelte';
-import Auth0 from '../../routes/console/project-[project]/authentication/_auth0OAuth.svelte';
-import Main from '../../routes/console/project-[project]/authentication/_mainOAuth.svelte';
+import Apple from '../../routes/console/project-[project]/auth/_appleOAuth.svelte';
+import Microsoft from '../../routes/console/project-[project]/auth/_microsoftOAuth.svelte';
+import Okta from '../../routes/console/project-[project]/auth/_oktaOAuth.svelte';
+import Auth0 from '../../routes/console/project-[project]/auth/_auth0OAuth.svelte';
+import Main from '../../routes/console/project-[project]/auth/_mainOAuth.svelte';
-export type Provider = {
- name: string;
+export type Provider = Models.Provider & {
icon: string;
- active: boolean;
- id: string | null;
- secret: string | null;
docs?: string;
component?: typeof SvelteComponent;
};
@@ -22,279 +18,122 @@ export type Providers = {
};
const setProviders = (project: Models.Project): Provider[] => {
- return [
- {
- name: 'Amazon',
- icon: 'amazon',
- active: false,
- id: project?.providerAmazonAppid,
- secret: project?.providerAmazonSecret,
- docs: 'https://developer.amazon.com/apps-and-games/services-and-apis',
- component: Main
- },
- {
- name: 'Apple',
- icon: 'apple',
- active: false,
- id: project?.providerAppleAppid,
- secret: project?.providerAppleSecret,
- docs: 'https://developer.apple.com/',
- component: Apple
- },
- {
- name: 'Auth0',
- icon: 'auth0',
- active: false,
- id: project?.providerAuth0Appid,
- secret: project?.providerAuth0Secret,
- docs: 'https://auth0.com/developers',
- component: Auth0
- },
- {
- name: 'Bitbucket',
- icon: 'bitBucket',
- active: false,
- id: project?.providerBitbucketAppid,
- secret: project?.providerBitbucketSecret,
- docs: 'https://developer.atlassian.com/bitbucket',
- component: Main
- },
- {
- name: 'Bitly',
- icon: 'bitly',
- active: false,
- id: project?.providerBitlyAppid,
- secret: project?.providerBitlySecret,
- docs: 'https://dev.bitly.com/v4_documentation.html',
- component: Main
- },
- {
- name: 'Box',
- icon: 'box',
- active: false,
- id: project?.providerBoxAppid,
- secret: project?.providerBoxSecret,
- docs: 'https://developer.box.com/reference/',
- component: Main
- },
- {
- name: 'Discord',
- icon: 'discord',
- active: false,
- id: project?.providerDiscordAppid,
- secret: project?.providerDiscordSecret,
- docs: 'https://discordapp.com/developers/docs/topics/oauth2',
- component: Main
- },
- {
- name: 'Dropbox',
- icon: 'dropbox',
- active: false,
- id: project?.providerDropboxAppid,
- secret: project?.providerDropboxSecret,
- docs: 'https://www.dropbox.com/developers/documentation',
- component: Main
- },
- {
- name: 'Facebook',
- icon: 'facebook',
- active: false,
- id: project?.providerFacebookAppid,
- secret: project?.providerFacebookSecret,
- docs: 'https://developers.facebook.com/',
- component: Main
- },
- {
- name: 'Github',
- icon: 'github',
- active: false,
- id: project?.providerGithubAppid,
- secret: project?.providerGithubSecret,
- docs: 'https://developer.github.com/',
- component: Main
- },
- {
- name: 'Gitlab',
- icon: 'gitlab',
- active: false,
- id: project?.providerGitlabAppid,
- secret: project?.providerGitlabSecret,
- docs: 'https://docs.gitlab.com/ee/api/',
- component: Main
- },
- {
- name: 'Google',
- icon: 'google',
- active: false,
- id: project?.providerGoogleAppid,
- secret: project?.providerGoogleSecret,
- docs: 'https://support.google.com/googleapi/answer/6158849',
- component: Main
- },
- {
- name: 'Linkedin',
- icon: 'linkedin',
- active: false,
- id: project?.providerLinkedinAppid,
- secret: project?.providerLinkedinSecret,
- docs: 'https://developer.linkedin.com/',
- component: Main
- },
- {
- name: 'Microsoft',
- icon: 'microsoft',
- active: false,
- id: project?.providerMicrosoftAppid,
- secret: project?.providerMicrosoftSecret,
- docs: 'https://developer.microsoft.com/en-us/',
- component: Microsoft
- },
- {
- name: 'Notion',
- icon: 'notion',
- active: false,
- id: project?.providerNotionAppid,
- secret: project?.providerNotionSecret,
- docs: 'https://developers.notion.com/docs',
- component: Main
- },
- {
- name: 'Okta',
- icon: 'okta',
- active: false,
- id: project?.providerOktaAppid,
- secret: project?.providerOktaSecret,
- docs: 'https://developer.okta.com/',
- component: Okta
- },
- {
- name: 'Paypal',
- icon: 'paypal',
- active: false,
- id: project?.providerPaypalAppid,
- secret: project?.providerPaypalSecret,
- docs: 'https://developer.paypal.com/docs/api/overview/',
- component: Main
- },
- {
- name: 'Paypal (sandbox)',
- icon: 'paypal',
- active: false,
- id: project?.providerPaypalSandboxAppid,
- secret: project?.providerPaypalSandboxSecret,
- docs: 'https://developer.paypal.com/docs/api/overview/',
- component: Main
- },
- {
- name: 'Salesforce',
- icon: 'salesforce',
- active: false,
- id: project?.providerSalesforceAppid,
- secret: project?.providerSalesforceSecret,
- docs: 'https://developer.salesforce.com/docs/',
- component: Main
- },
- {
- name: 'Slack',
- icon: 'slack',
- active: false,
- id: project?.providerSlackAppid,
- secret: project?.providerSlackSecret,
- docs: 'https://api.slack.com/',
- component: Main
- },
- {
- name: 'Spotify',
- icon: 'spotify',
- active: false,
- id: project?.providerSpotifyAppid,
- secret: project?.providerSpotifySecret,
- docs: 'https://developer.spotify.com/documentation/general/guides/authorization-guide/',
- component: Main
- },
- {
- name: 'Stripe',
- icon: 'stripe',
- active: false,
- id: project?.providerStripeAppid,
- secret: project?.providerStripeSecret,
- docs: 'https://stripe.com/docs/api',
- component: Main
- },
- {
- name: 'Tradeshift',
- icon: 'tradeshift',
- active: false,
- id: project?.providerTradeshiftAppid,
- secret: project?.providerTradeshiftSecret,
- docs: 'https://developers.tradeshift.com/docs/api',
- component: Main
- },
- {
- name: 'Tradeshift(sandbox)',
- icon: 'tradeshift',
- active: false,
- id: project?.providerTradeshiftBoxAppid,
- secret: project?.providerTradeshiftBoxSecret,
- docs: 'https://developers.tradeshift.com/docs/api',
- component: Main
- },
- {
- name: 'Twitch',
- icon: 'twitch',
- active: false,
- id: project?.providerTwitchAppid,
- secret: project?.providerTwitchSecret,
- docs: 'https://dev.twitch.tv/docs/authentication',
- component: Main
- },
+ return (
+ project?.providers.map((n) => {
+ let docs: Provider['docs'];
+ let icon: Provider['icon'] = n.name.toLowerCase();
+ let component: Provider['component'] = Main;
- {
- name: 'Wordpress',
- icon: 'wordpress',
- active: false,
- id: project?.providerWordpressAppid,
- secret: project?.providerWordpressSecret,
- docs: 'https://developer.wordpress.com/docs/oauth2/',
- component: Main
- },
- {
- name: 'Yahoo',
- icon: 'yahoo',
- active: false,
- id: project?.providerYahooAppid,
- secret: project?.providerYahooSecret,
- docs: 'https://developer.yahoo.com/oauth2/guide/flows_authcode/',
- component: Main
- },
- {
- name: 'Yammer',
- icon: 'ms_yammer',
- active: false,
- id: project?.providerYammerAppid,
- secret: project?.providerYammerSecret,
- docs: 'https://developer.yammer.com/docs/oauth-2',
- component: Main
- },
- {
- name: 'Yandex',
- icon: 'yandex',
- active: false,
- id: project?.providerYandexAppid,
- secret: project?.providerYandexSecret,
- docs: 'https://tech.yandex.com/oauth/',
- component: Main
- },
- {
- name: 'Zoom',
- icon: 'zoom',
- active: false,
- id: project?.providerZoomAppid,
- secret: project?.providerZoomSecret,
- docs: 'https://marketplace.zoom.us/docs/guides/auth/oauth/',
- component: Main
- }
- ];
+ switch (n.name.toLowerCase()) {
+ case 'amazon':
+ docs = 'https://developer.amazon.com/apps-and-games/services-and-apis';
+ break;
+ case 'apple':
+ docs = 'https://developer.apple.com/';
+ component = Apple;
+ break;
+ case 'auth0':
+ docs = 'https://auth0.com/developers';
+ component = Auth0;
+ break;
+ case 'bitbucket':
+ docs = 'https://developer.atlassian.com/bitbucket';
+ break;
+ case 'bitly':
+ docs = 'https://dev.bitly.com/v4_documentation.html';
+ break;
+ case 'box':
+ docs = 'https://developer.box.com/reference/';
+ break;
+ case 'discord':
+ docs = 'https://discordapp.com/developers/docs/topics/oauth2';
+ break;
+ case 'dropbox':
+ docs = 'https://www.dropbox.com/developers/documentation';
+ break;
+ case 'facebook':
+ docs = 'https://developers.facebook.com/';
+ break;
+ case 'github':
+ docs = 'https://developer.github.com';
+ break;
+ case 'gitlab':
+ docs = 'https://docs.gitlab.com/ee/api/';
+ break;
+ case 'google':
+ docs = 'https://support.google.com/googleapi/answer/6158849';
+ break;
+ case 'linkedin':
+ docs = 'https://developer.linkedin.com/';
+ break;
+ case 'microsoft':
+ docs = 'https://developer.microsoft.com/en-us/';
+ component = Microsoft;
+ break;
+ case 'notion':
+ docs = 'https://developers.notion.com/docs';
+ break;
+ case 'okta':
+ docs = 'https://developer.okta.com';
+ component = Okta;
+ break;
+ case 'paypal':
+ docs = 'https://developer.paypal.com/docs/api/overview/';
+ break;
+ case 'paypalsandbox':
+ icon = 'paypal';
+ docs = 'https://developer.paypal.com/docs/api/overview/';
+ break;
+ case 'salesforce':
+ docs = 'https://developer.salesforce.com/docs/';
+ break;
+ case 'slack':
+ docs = 'https://api.slack.com/';
+ break;
+ case 'spotify':
+ docs =
+ 'https://developer.spotify.com/documentation/general/guides/authorization-guide/';
+ break;
+ case 'stripe':
+ docs = 'https://stripe.com/docs/api';
+ break;
+ case 'tradeshift':
+ docs = 'https://developers.tradeshift.com/docs/api';
+ break;
+ case 'tradeshiftbox':
+ icon = 'tradeshift';
+ docs = 'https://developers.tradeshift.com/docs/api';
+ break;
+ case 'twitch':
+ docs = 'https://dev.twitch.tv/docs/auth';
+ break;
+ case 'wordpress':
+ docs = 'https://developer.wordpress.com/docs/oauth2/';
+ break;
+ case 'yahoo':
+ docs = 'https://developer.yahoo.com/oauth2/guide/flows_authcode/';
+ break;
+ case 'yammer':
+ docs = 'https://developer.yammer.com/docs/oauth-2';
+ break;
+ case 'yandex':
+ docs = 'https://tech.yandex.com/oauth/';
+ break;
+ case 'zoom':
+ docs = 'https://marketplace.zoom.us/docs/guides/auth/oauth/';
+ break;
+ default:
+ break;
+ }
+
+ return {
+ ...n,
+ icon,
+ docs,
+ component
+ };
+ }) ?? []
+ );
};
function createOAuthProviders() {
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 95e06dab7..790b7efa1 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -8,9 +8,9 @@
import { base } from '$app/paths';
import { browser, dev } from '$app/environment';
import { app } from '$lib/stores/app';
- import Notifications from '$lib/layout/notifications.svelte';
- import Loading from './loading.svelte';
+ import { Progress, Notifications } from '$lib/layout';
import { loading } from './store';
+ import Loading from './loading.svelte';
if (browser) {
window.VERCEL_ANALYTICS_ID = import.meta.env.VERCEL_ANALYTICS_ID?.toString() ?? false;
@@ -95,6 +95,8 @@
{/if}
+
+
diff --git a/src/routes/console/project-[project]/overview/bandwith.svelte b/src/routes/console/project-[project]/overview/bandwith.svelte
new file mode 100644
index 000000000..7e040eb61
--- /dev/null
+++ b/src/routes/console/project-[project]/overview/bandwith.svelte
@@ -0,0 +1,77 @@
+
+
+
+
+
+ {bandwith.value}
+ {bandwith.unit}
+
+
Bandwidth
+
+
+ (showPeriod = !showPeriod)}>
+ {period}
+
+
+
+ dispatch('change', '24h')}>24h
+ dispatch('change', '30d')}>30d
+ dispatch('change', '90d')}>90d
+
+
+
+{#if bandwith.value !== '0'}
+
+
+ value
+ ? `${humanFileSize(+value).value} ${humanFileSize(+value).unit}`
+ : '0'
+ }
+ }
+ }}
+ series={[
+ {
+ name: 'Bandwidth',
+ data: [...network.map((e) => [e.date, e.value])],
+ tooltip: {
+ valueFormatter: (value) =>
+ `${humanFileSize(+value).value} ${humanFileSize(+value).unit}`
+ }
+ }
+ ]} />
+
+{:else}
+
+
+
+{/if}
diff --git a/src/routes/console/project-[project]/overview/keys/+page.svelte b/src/routes/console/project-[project]/overview/keys/+page.svelte
index 1709372d0..1c08f5b5f 100644
--- a/src/routes/console/project-[project]/overview/keys/+page.svelte
+++ b/src/routes/console/project-[project]/overview/keys/+page.svelte
@@ -1,5 +1,5 @@
API Keys
- (show = true)}>
+
Create API Key
-
-
- Name
- last accessed
- expiration date
- clients
-
-
- {#each data.keys.keys as key}
-
-
- {key.name}
-
-
- {key.accessedAt ? toLocaleDateTime(key.accessedAt) : 'never'}
-
-
- {toLocaleDateTime(key.$updatedAt)}
-
-
-
- {/each}
-
-
-
-
+{#if data.keys.total}
+
+
+ Name
+ last accessed
+ expiration date
+ scopes
+
+
+ {#each data.keys.keys as key}
+
+
+ {key.name}
+
+
+ {key.accessedAt ? toLocaleDateTime(key.accessedAt) : 'never'}
+
+
+ {key.expire ? toLocaleDateTime(key.expire) : 'never'}
+
+
+ {key.scopes.length} Scopes
+
+
+ {/each}
+
+
+{:else}
+
+{/if}
diff --git a/src/routes/console/project-[project]/overview/keys/[key]/+page.ts b/src/routes/console/project-[project]/overview/keys/[key]/+page.ts
index 11847cc4a..62c8a4fdb 100644
--- a/src/routes/console/project-[project]/overview/keys/[key]/+page.ts
+++ b/src/routes/console/project-[project]/overview/keys/[key]/+page.ts
@@ -7,9 +7,14 @@ import type { PageLoad } from './$types';
export const load: PageLoad = async ({ params, depends }) => {
depends(Dependencies.KEY);
+ const key = await sdkForConsole.projects.getKey(params.project, params.key);
+ if (key.expire) {
+ key.expire = new Date(key.expire).toISOString().slice(0, 23);
+ }
+
return {
header: Header,
breadcrumbs: Breadcrumbs,
- key: await sdkForConsole.projects.getKey(params.project, params.key)
+ key
};
};
diff --git a/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte b/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte
index 1163b4902..154c9f288 100644
--- a/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte
+++ b/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte
@@ -3,7 +3,7 @@
import { CardGrid, Heading, Secret } from '$lib/components';
import { Dependencies } from '$lib/constants';
import { Button, Form, FormList, InputText, InputDateTime } from '$lib/elements/forms';
- import { difference } from '$lib/helpers/array';
+ import { symmetricDifference } from '$lib/helpers/array';
import { toLocaleDateTime } from '$lib/helpers/date';
import { Container } from '$lib/layout';
import { addNotification } from '$lib/stores/notifications';
@@ -18,7 +18,7 @@
let name: string = null;
let secret: string = null;
let expire: string = null;
- let scopes: string[] = [];
+ let scopes: string[] = null;
onMount(() => {
name ??= $key.name;
@@ -135,16 +135,17 @@
practice to allow only the permissions you need to meet your project goals.
-
+ {#if scopes !== null}
+
+ {/if}
Update
+ disabled={scopes &&
+ $key?.scopes &&
+ !symmetricDifference(scopes, $key.scopes).length}>Update
diff --git a/src/routes/console/project-[project]/overview/keys/create.svelte b/src/routes/console/project-[project]/overview/keys/create.svelte
deleted file mode 100644
index dea215fe2..000000000
--- a/src/routes/console/project-[project]/overview/keys/create.svelte
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
- Create API Key
-
-
-
-
-
- Register
- (show = false)}>Cancel
-
-
diff --git a/src/routes/console/project-[project]/overview/keys/scopes.svelte b/src/routes/console/project-[project]/overview/keys/scopes.svelte
index d60f14730..0d2e7a14f 100644
--- a/src/routes/console/project-[project]/overview/keys/scopes.svelte
+++ b/src/routes/console/project-[project]/overview/keys/scopes.svelte
@@ -3,10 +3,18 @@
import { Button, FormList, InputChoice } from '$lib/elements/forms';
import { scopes as allScopes } from '$lib/constants';
import { onMount } from 'svelte';
- import { difference } from '$lib/helpers/array';
+ import { symmetricDifference } from '$lib/helpers/array';
export let scopes: string[];
+ enum Category {
+ Auth = 'Auth',
+ Database = 'Database',
+ Functions = 'Functions',
+ Storage = 'Storage',
+ Other = 'Other'
+ }
+
let mounted = false;
onMount(() => {
@@ -28,6 +36,29 @@
}
}
+ function categoryState(category: string, s: string[]): boolean | null {
+ const scopesByCategory = allScopes.filter((n) => n.category === category);
+ const filtered = scopesByCategory.filter((n) => s.includes(n.scope));
+ if (filtered.length === 0) {
+ return false;
+ } else if (filtered.length === scopesByCategory.length) {
+ return true;
+ } else {
+ return null;
+ }
+ }
+
+ function onCategoryChange(
+ event: Event & { currentTarget: EventTarget & HTMLInputElement },
+ category: Category
+ ) {
+ allScopes.forEach((s) => {
+ if (s.category === category) {
+ activeScopes[s.scope] = event.currentTarget.checked;
+ }
+ });
+ }
+
const activeScopes = allScopes.reduce((prev, next) => {
prev[next.scope] = false;
@@ -39,10 +70,7 @@
const newScopes = allScopes
.filter((scope) => activeScopes[scope.scope])
.map(({ scope }) => scope);
- if (
- difference(scopes, newScopes).length !== 0 ||
- difference(newScopes, scopes).length !== 0
- ) {
+ if (symmetricDifference(scopes, newScopes).length) {
scopes = newScopes;
}
}
@@ -54,19 +82,35 @@
Select all
- {#each ['Authentication', 'Database', 'Functions', 'Storage', 'Other'] as category}
-
- {category}
-
- {#each allScopes.filter((s) => s.category === category) as scope}
-
- {scope.description}
-
- {/each}
-
+ {#each [Category.Auth, Category.Database, Category.Functions, Category.Storage, Category.Other] as category}
+ {@const checked = categoryState(category, scopes)}
+
+
+ onCategoryChange(e, category)} />
+
+
+ {category}
+
+
+ ({allScopes.filter((n) => n.category === category && scopes.includes(n.scope))
+ .length} Scopes)
+
+
+
+ {#each allScopes.filter((s) => s.category === category) as scope}
+
+ {scope.description}
+
+ {/each}
+
+
{/each}
diff --git a/src/routes/console/project-[project]/overview/keys/wizard.svelte b/src/routes/console/project-[project]/overview/keys/wizard.svelte
new file mode 100644
index 000000000..e1efc9ebb
--- /dev/null
+++ b/src/routes/console/project-[project]/overview/keys/wizard.svelte
@@ -0,0 +1,50 @@
+
+
+
diff --git a/src/routes/console/project-[project]/overview/keys/wizard/step1.svelte b/src/routes/console/project-[project]/overview/keys/wizard/step1.svelte
new file mode 100644
index 000000000..37fb03702
--- /dev/null
+++ b/src/routes/console/project-[project]/overview/keys/wizard/step1.svelte
@@ -0,0 +1,89 @@
+
+
+
+ Create an API Key
+ Let's create an API Key.
+
+
+
+ {#if preset === 'custom'}
+
+ {/if}
+
+
diff --git a/src/routes/console/project-[project]/overview/keys/wizard/step2.svelte b/src/routes/console/project-[project]/overview/keys/wizard/step2.svelte
new file mode 100644
index 000000000..56638e8a0
--- /dev/null
+++ b/src/routes/console/project-[project]/overview/keys/wizard/step2.svelte
@@ -0,0 +1,17 @@
+
+
+
+ Add Scopes
+
+ Choose which permission scopes to grant your application. It is best practice to allow only
+ the permissions you need to meet your project goals.
+
+
+
+
+
diff --git a/src/routes/console/project-[project]/overview/keys/wizard/store.ts b/src/routes/console/project-[project]/overview/keys/wizard/store.ts
new file mode 100644
index 000000000..148e58193
--- /dev/null
+++ b/src/routes/console/project-[project]/overview/keys/wizard/store.ts
@@ -0,0 +1,25 @@
+import { writable } from 'svelte/store';
+import type { Models } from '@aw-labs/appwrite-console';
+
+function createKeyStore() {
+ const { subscribe, update, set } = writable>({
+ name: null,
+ expire: null,
+ scopes: []
+ });
+
+ return {
+ subscribe,
+ update,
+ set,
+ reset() {
+ set({
+ name: null,
+ expire: null,
+ scopes: []
+ });
+ }
+ };
+}
+
+export const key = createKeyStore();
diff --git a/src/routes/console/project-[project]/overview/platforms/+page.svelte b/src/routes/console/project-[project]/overview/platforms/+page.svelte
index add972874..11bab105f 100644
--- a/src/routes/console/project-[project]/overview/platforms/+page.svelte
+++ b/src/routes/console/project-[project]/overview/platforms/+page.svelte
@@ -1,6 +1,6 @@
- Register your Flutter app
-
- Note: If you are building your Flutter application for multiple devices, you will have to
- follow this process for each different device.
-
+ Register your Apple app
diff --git a/src/routes/console/project-[project]/overview/platforms/wizard/web/step1.svelte b/src/routes/console/project-[project]/overview/platforms/wizard/web/step1.svelte
index b2a807690..69d7f4990 100644
--- a/src/routes/console/project-[project]/overview/platforms/wizard/web/step1.svelte
+++ b/src/routes/console/project-[project]/overview/platforms/wizard/web/step1.svelte
@@ -65,8 +65,13 @@
- Tip: Avoid using wildcard hostnames in production to keep your project secure. Check out
- our documentation for more info.
+ Using wildcard hostnames in production can become insecure. You can read about
+
+ Cross-Origin Resource Sharing (CORS) for more information.
diff --git a/src/routes/console/project-[project]/overview/realtime.svelte b/src/routes/console/project-[project]/overview/realtime.svelte
new file mode 100644
index 000000000..8bcd55239
--- /dev/null
+++ b/src/routes/console/project-[project]/overview/realtime.svelte
@@ -0,0 +1,45 @@
+
+
+
+ {format(current)}
+
+Realtime Connections
+{#if total}
+
+
+
+{:else}
+
+
+
+{/if}
diff --git a/src/routes/console/project-[project]/overview/requests.svelte b/src/routes/console/project-[project]/overview/requests.svelte
new file mode 100644
index 000000000..9866b89d0
--- /dev/null
+++ b/src/routes/console/project-[project]/overview/requests.svelte
@@ -0,0 +1,67 @@
+
+
+
+
+
+ {format(total($usage.requests))}
+
+
Requests
+
+
+ (showPeriod = !showPeriod)}>
+ {period}
+
+
+
+ dispatch('change', '24h')}>24h
+ dispatch('change', '30d')}>30d
+ dispatch('change', '90d')}>90d
+
+
+
+{#if total($usage.requests) !== 0}
+
+ [e.date, e.value])]
+ }
+ ]} />
+
+{:else}
+
+
+
+{/if}
diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte
index dc201d527..6ae5234c8 100644
--- a/src/routes/console/project-[project]/settings/+page.svelte
+++ b/src/routes/console/project-[project]/settings/+page.svelte
@@ -11,10 +11,13 @@
import { invalidate } from '$app/navigation';
import { Dependencies } from '$lib/constants';
import Delete from './deleteProject.svelte';
+ import { base } from '$app/paths';
+ import { page } from '$app/stores';
let name: string = null;
let showDelete = false;
const endpoint = sdkForConsole.client.config.endpoint;
+ const projectId = $page.params.project;
onMount(async () => {
name ??= $project.name;
@@ -64,6 +67,21 @@
{#if $project}
-
- API Credentials
-
- Access Appwrite services using your API Endpoint and Project ID. You can connect
- Appwrite to your applications and server-side code by integrating a new platform
- or
- creating an API key .
-
-
-
-
-
-
-
-
-
Services
Choose services you wish to enable or disable.
diff --git a/src/routes/console/project-[project]/settings/domains/[[page]]/+page.svelte b/src/routes/console/project-[project]/settings/domains/[[page]]/+page.svelte
index de3ef195a..2d539b040 100644
--- a/src/routes/console/project-[project]/settings/domains/[[page]]/+page.svelte
+++ b/src/routes/console/project-[project]/settings/domains/[[page]]/+page.svelte
@@ -139,17 +139,11 @@
{:else}
-
-
-
-
Create your first Domain to get started
-
-
- Documentation
- Create domain
-
-
-
+
{/if}
diff --git a/src/routes/console/project-[project]/settings/domains/create.svelte b/src/routes/console/project-[project]/settings/domains/create.svelte
index ddf0eb338..5279752ae 100644
--- a/src/routes/console/project-[project]/settings/domains/create.svelte
+++ b/src/routes/console/project-[project]/settings/domains/create.svelte
@@ -12,7 +12,7 @@
import { Dependencies } from '$lib/constants';
onDestroy(() => {
- domain.set({ id: '', name: '' });
+ domain.set({ $id: '', domain: '' });
});
beforeNavigate(() => {
diff --git a/src/routes/console/project-[project]/settings/domains/wizard/cnameTable.svelte b/src/routes/console/project-[project]/settings/domains/wizard/cnameTable.svelte
index 0c5d31bf0..316fef1b5 100644
--- a/src/routes/console/project-[project]/settings/domains/wizard/cnameTable.svelte
+++ b/src/routes/console/project-[project]/settings/domains/wizard/cnameTable.svelte
@@ -11,9 +11,9 @@
} from '$lib/elements/table';
import { domain } from './store';
- const parts = $domain.name.split('.');
+ const parts = $domain.domain.split('.');
const registerable = [parts[parts.length - 2], parts[parts.length - 1]].join('.');
- const cnameValue = $domain.name.replace('.' + registerable, '');
+ const cnameValue = $domain.domain.replace('.' + registerable, '');
@@ -28,8 +28,8 @@
{cnameValue}
- {$domain.name}
-
+ {$domain.domain}
+
diff --git a/src/routes/console/project-[project]/settings/domains/wizard/step1.svelte b/src/routes/console/project-[project]/settings/domains/wizard/step1.svelte
index 21ee2bbf6..76b46f176 100644
--- a/src/routes/console/project-[project]/settings/domains/wizard/step1.svelte
+++ b/src/routes/console/project-[project]/settings/domains/wizard/step1.svelte
@@ -5,30 +5,14 @@
import { project } from '../../../store';
import { domain } from './store';
- // Handle if user goes back to this step to update
- // the domain name after creating the domain
- const originalDomainName = $domain.name;
- const originalDomainId = $domain.id;
- const unsubscribe = domain.subscribe((newDomain) => {
- if (
- originalDomainName !== '' &&
- newDomain.id !== '' &&
- newDomain.name !== originalDomainName
- ) {
- $domain.id = '';
- }
- });
-
const projectId = $project.$id;
const createDomain = async () => {
- unsubscribe();
- if ($domain.name !== originalDomainName && originalDomainId) {
- await sdkForConsole.projects.deleteDomain(projectId, originalDomainId);
+ if ($domain.$id) {
+ await sdkForConsole.projects.deleteDomain(projectId, $domain.$id);
}
- if ($domain.id == '') {
- await sdkForConsole.projects.createDomain(projectId, $domain.name);
- }
+ const { $id } = await sdkForConsole.projects.createDomain(projectId, $domain.domain);
+ $domain.$id = $id;
};
@@ -45,7 +29,7 @@
placeholder="appwrite.example.com"
autocomplete={false}
required
- bind:value={$domain.name} />
+ bind:value={$domain.domain} />
diff --git a/src/routes/console/project-[project]/settings/domains/wizard/step4.svelte b/src/routes/console/project-[project]/settings/domains/wizard/step4.svelte
index eed0a85ac..0ab0e0b98 100644
--- a/src/routes/console/project-[project]/settings/domains/wizard/step4.svelte
+++ b/src/routes/console/project-[project]/settings/domains/wizard/step4.svelte
@@ -11,7 +11,7 @@
let certificate = false;
const checkCertificate = () => {
setTimeout(async () => {
- const result = await sdkForConsole.projects.getDomain(projectId, $domain.id);
+ const result = await sdkForConsole.projects.getDomain(projectId, $domain.$id);
if (!result.certificateId) {
checkCertificate();
return;
diff --git a/src/routes/console/project-[project]/settings/domains/wizard/store.ts b/src/routes/console/project-[project]/settings/domains/wizard/store.ts
index 88d0de932..9c2d5d8d4 100644
--- a/src/routes/console/project-[project]/settings/domains/wizard/store.ts
+++ b/src/routes/console/project-[project]/settings/domains/wizard/store.ts
@@ -1,3 +1,4 @@
+import type { Models } from '@aw-labs/appwrite-console';
import { writable } from 'svelte/store';
-export const domain = writable<{ id: string; name: string }>({ id: '', name: '' });
+export const domain = writable>({ $id: '', domain: '' });
diff --git a/src/routes/console/project-[project]/settings/domains/wizard/verificationBox.svelte b/src/routes/console/project-[project]/settings/domains/wizard/verificationBox.svelte
index 0cd32690f..e82bccf69 100644
--- a/src/routes/console/project-[project]/settings/domains/wizard/verificationBox.svelte
+++ b/src/routes/console/project-[project]/settings/domains/wizard/verificationBox.svelte
@@ -15,7 +15,7 @@
try {
const result = await sdkForConsole.projects.updateDomainVerification(
projectId,
- $domain.id
+ $domain.$id
);
isVerified = result.verification;
} catch (error) {
diff --git a/src/routes/console/project-[project]/settings/webhooks/+page.svelte b/src/routes/console/project-[project]/settings/webhooks/+page.svelte
index 9fb631f50..1349d09ed 100644
--- a/src/routes/console/project-[project]/settings/webhooks/+page.svelte
+++ b/src/routes/console/project-[project]/settings/webhooks/+page.svelte
@@ -71,17 +71,10 @@
{:else}
-
-
-
Create your first Webhook to get startedNeed a hand?
-
Check out our documentation.
-
-
- Documentation
-
- Create Webhook
-
-
-
+
{/if}
diff --git a/src/routes/console/project-[project]/settings/webhooks/[webhook]/+page.svelte b/src/routes/console/project-[project]/settings/webhooks/[webhook]/+page.svelte
index a71badf95..d669afca0 100644
--- a/src/routes/console/project-[project]/settings/webhooks/[webhook]/+page.svelte
+++ b/src/routes/console/project-[project]/settings/webhooks/[webhook]/+page.svelte
@@ -18,14 +18,17 @@
import { toLocaleDateTime } from '$lib/helpers/date';
import Delete from './delete.svelte';
import Regenerate from './regenerate.svelte';
- import { difference } from '$lib/helpers/array';
+ import { symmetricDifference } from '$lib/helpers/array';
import { invalidate } from '$app/navigation';
import { Dependencies } from '$lib/constants';
+ import { writable, type Writable } from 'svelte/store';
const projectId = $page.params.project;
let name: string = null;
let url: string = null;
- let events = [];
+
+ const eventSet: Writable> = writable(new Set());
+
let httpUser: string = null;
let httpPass: string = null;
let security = false;
@@ -37,7 +40,7 @@
onMount(async () => {
name ??= $webhook.name;
url ??= $webhook.url;
- events = $webhook.events;
+ $eventSet = new Set($webhook.events);
httpUser ??= $webhook.httpUser;
httpPass ??= $webhook.httpPass;
security = $webhook.security;
@@ -93,7 +96,7 @@
projectId,
$webhook.$id,
$webhook.name,
- events,
+ Array.from($eventSet),
$webhook.url,
$webhook.security
);
@@ -110,6 +113,7 @@
});
}
}
+
async function updateSecurity() {
try {
await sdkForConsole.projects.updateWebhook(
@@ -135,15 +139,28 @@
}
}
- $: if (difference(events, $webhook.events).length > 0) {
- areEventsDisabled = false;
+ function handleEvent(event: CustomEvent) {
+ eventSet.set($eventSet.add(event.detail));
+ }
+
+ $: if ($eventSet) {
+ if (symmetricDifference(Array.from($eventSet), $webhook.events).length) {
+ areEventsDisabled = false;
+ } else areEventsDisabled = true;
}
Signature Key
- You can use the Signature Key to validate your webhooks.
+
+ Add the Signature Key to the X-Appwrite-Webhook-Signature header to validate your
+ webhooks. Learn more about webhook validation.
+
Key
@@ -200,24 +217,25 @@
{:else}
- (showCreate = true)}>
-
-
Create your first bucket to get started
-
Need a hand? Check out our documentation.
-
-
- Documentation
- Create bucket
-
-
+ (showCreate = true)} />
{/if}
diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.svelte
index 8afe06ef2..ad85f26b6 100644
--- a/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.svelte
+++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.svelte
@@ -76,7 +76,7 @@
(showCreate = true)}>
- Add File
+ Create file
{#if data.files.total}
@@ -187,20 +187,16 @@
Clear Search
+ href={`/console/project-${$page.params.project}/storage/bucket-${$page.params.bucket}`}>
+ Clear Search
+
{:else}
- (showCreate = true)}>
-
-
Upload some files to get started
-
Need a hand? Check out our documentation.
-
-
- Documentation
- Add file
-
-
+ (showCreate = true)} />
{/if}
diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteBucket.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteBucket.svelte
index 3952d0d5c..3a205bc74 100644
--- a/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteBucket.svelte
+++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteBucket.svelte
@@ -14,6 +14,10 @@
try {
await sdkForProject.storage.deleteBucket($bucket.$id);
showDelete = false;
+ addNotification({
+ type: 'success',
+ message: `${$bucket.name} has been deleted`
+ });
await goto(`${base}/console/project-${$page.params.project}/storage`);
} catch (error) {
addNotification({
diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteFile.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteFile.svelte
index c8f934069..1d5cf7604 100644
--- a/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteFile.svelte
+++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/_deleteFile.svelte
@@ -16,6 +16,10 @@
await sdkForProject.storage.deleteFile(file.bucketId, file.$id);
showDelete = false;
dispatch('deleted', file);
+ addNotification({
+ type: 'success',
+ message: `${file.name} has been deleted`
+ });
} catch (error) {
addNotification({
type: 'error',
diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/create.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/create.svelte
index 3a1fee89b..b881da675 100644
--- a/src/routes/console/project-[project]/storage/bucket-[bucket]/create.svelte
+++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/create.svelte
@@ -9,6 +9,7 @@
import { bucket } from './store';
import { calculateSize } from '$lib/helpers/sizeConvertion';
import { Permissions } from '$lib/components/permissions';
+ import { addNotification } from '$lib/stores/notifications';
export let showCreate = false;
@@ -34,6 +35,10 @@
showCustomId = false;
uploader.addFile(file);
dispatch('created');
+ addNotification({
+ type: 'success',
+ message: `${file.name} has been created`
+ });
} catch ({ message }) {
error = message;
}
@@ -46,7 +51,7 @@
- Upload File
+ Create File
@@ -69,6 +74,6 @@
(showCreate = false)}>Cancel
- Upload
+ Create
diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte
index b30a47db2..7b371d592 100644
--- a/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte
+++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte
@@ -9,7 +9,7 @@
import { addNotification } from '$lib/stores/notifications';
import { calculateSize } from '$lib/helpers/sizeConvertion';
import { onMount } from 'svelte';
- import { difference } from '$lib/helpers/array';
+ import { symmetricDifference } from '$lib/helpers/array';
import { Permissions } from '$lib/components/permissions';
import Delete from './deleteFile.svelte';
import { invalidate } from '$app/navigation';
@@ -30,7 +30,7 @@
sdkForProject.storage.getFileView($file.bucketId, fileId).toString() + '&mode=admin';
$: if (filePermissions) {
- if (difference(filePermissions, $file.$permissions).length) {
+ if (symmetricDifference(filePermissions, $file.$permissions).length) {
arePermsDisabled = false;
} else arePermsDisabled = true;
}
diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/deleteFile.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/deleteFile.svelte
index 3b8286a38..8ea385fa1 100644
--- a/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/deleteFile.svelte
+++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/file-[file]/deleteFile.svelte
@@ -17,6 +17,10 @@
await goto(
`${base}/console/project-${$page.params.project}/storage/bucket-${$file.bucketId}`
);
+ addNotification({
+ type: 'success',
+ message: `${$file.name} has been deleted`
+ });
} catch (error) {
addNotification({
type: 'error',
diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte
index a65a043eb..8db809bd6 100644
--- a/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte
+++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte
@@ -9,7 +9,8 @@
InputTags,
InputNumber,
InputSelect,
- InputSwitch
+ InputSwitch,
+ FormList
} from '$lib/elements/forms';
import { bucket } from '../store';
import { toLocaleDateTime } from '$lib/helpers/date';
@@ -17,7 +18,7 @@
import { sdkForProject } from '$lib/stores/sdk';
import { addNotification } from '$lib/stores/notifications';
import { onMount } from 'svelte';
- import { difference } from '$lib/helpers/array';
+ import { symmetricDifference } from '$lib/helpers/array';
import { Permissions } from '$lib/components/permissions';
import { invalidate } from '$app/navigation';
import { Dependencies } from '$lib/constants';
@@ -57,7 +58,7 @@
if (bucketFileSecurity !== $bucket.fileSecurity) {
arePermsDisabled = false;
} else if (bucketPermissions) {
- if (difference(bucketPermissions, $bucket.$permissions).length) {
+ if (symmetricDifference(bucketPermissions, $bucket.$permissions).length) {
arePermsDisabled = false;
} else arePermsDisabled = true;
}
@@ -208,14 +209,16 @@
{$bucket.name}
-
- Created: {toLocaleDateTime($bucket.$createdAt)}
- Last Updated: {toLocaleDateTime($bucket.$updatedAt)}
+
+
+
+
+
Created: {toLocaleDateTime($bucket.$createdAt)}
+
Last Updated: {toLocaleDateTime($bucket.$updatedAt)}
+
@@ -228,14 +231,14 @@
Update Name
-
+
@@ -296,7 +299,7 @@
and Antivirus scanning.
-