diff --git a/.env.example b/.env.example index 138249fc1..ae9250596 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,6 @@ -PUBLIC_APPWRITE_ENDPOINT=https://localhost/v1 PUBLIC_CONSOLE_MODE=self-hosted +PUBLIC_APPWRITE_MULTI_REGION=false +PUBLIC_APPWRITE_ENDPOINT=http://localhost/v1 + PUBLIC_STRIPE_KEY= PUBLIC_GROWTH_ENDPOINT= \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 91c98b81f..2a37e81d1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -39,6 +39,7 @@ jobs: labels: ${{ steps.meta.outputs.labels }} build-args: | "PUBLIC_CONSOLE_MODE=cloud" + "PUBLIC_APPWRITE_MULTI_REGION=true" "PUBLIC_GROWTH_ENDPOINT=${{ secrets.PUBLIC_GROWTH_ENDPOINT }}" "PUBLIC_STRIPE_KEY=${{ secrets.PUBLIC_STRIPE_KEY }}" "SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}" @@ -77,6 +78,7 @@ jobs: labels: ${{ steps.meta.outputs.labels }} build-args: | "PUBLIC_CONSOLE_MODE=cloud" + "PUBLIC_APPWRITE_MULTI_REGION=true" "PUBLIC_GROWTH_ENDPOINT=${{ secrets.PUBLIC_GROWTH_ENDPOINT }}" "PUBLIC_STRIPE_KEY=${{ secrets.PUBLIC_STRIPE_KEY_STAGE }}" publish-self-hosted: @@ -113,4 +115,43 @@ jobs: labels: ${{ steps.meta.outputs.labels }} build-args: | "PUBLIC_CONSOLE_MODE=self-hosted" + "PUBLIC_APPWRITE_MULTI_REGION=false" + "PUBLIC_GROWTH_ENDPOINT=${{ secrets.PUBLIC_GROWTH_ENDPOINT }}" + + publish-cloud-no-regions: + runs-on: ubuntu-latest + steps: + - name: Checkout the repo + uses: actions/checkout@v2 + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ vars.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: appwrite/console-cloud-no-regions + tags: | + type=semver,pattern={{major}}.{{minor}}.{{patch}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + - name: Build and push Docker image + id: push + uses: docker/build-push-action@v6 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + "PUBLIC_CONSOLE_MODE=cloud" + "PUBLIC_APPWRITE_MULTI_REGION=false" + "PUBLIC_STRIPE_KEY=${{ secrets.PUBLIC_STRIPE_KEY_STAGE }}" "PUBLIC_GROWTH_ENDPOINT=${{ secrets.PUBLIC_GROWTH_ENDPOINT }}" diff --git a/Dockerfile b/Dockerfile index 45263f235..774fb6903 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,7 @@ ADD ./src /app/src ADD ./static /app/static ARG PUBLIC_CONSOLE_MODE +ARG PUBLIC_APPWRITE_MULTI_REGION ARG PUBLIC_APPWRITE_ENDPOINT ARG PUBLIC_GROWTH_ENDPOINT ARG PUBLIC_STRIPE_KEY @@ -30,6 +31,7 @@ ARG SENTRY_RELEASE ENV PUBLIC_APPWRITE_ENDPOINT=$PUBLIC_APPWRITE_ENDPOINT ENV PUBLIC_GROWTH_ENDPOINT=$PUBLIC_GROWTH_ENDPOINT ENV PUBLIC_CONSOLE_MODE=$PUBLIC_CONSOLE_MODE +ENV PUBLIC_APPWRITE_MULTI_REGION=$PUBLIC_APPWRITE_MULTI_REGION ENV PUBLIC_STRIPE_KEY=$PUBLIC_STRIPE_KEY ENV SENTRY_AUTH_TOKEN=$SENTRY_AUTH_TOKEN ENV SENTRY_RELEASE=$SENTRY_RELEASE @@ -37,7 +39,7 @@ ENV NODE_OPTIONS=--max_old_space_size=8192 RUN pnpm run build -FROM nginx:1.25-alpine +FROM nginx:1.26.3-alpine EXPOSE 80 diff --git a/build.js b/build.js index 9753d0378..f56506dae 100644 --- a/build.js +++ b/build.js @@ -24,6 +24,7 @@ async function main() { log(bold().magenta('APPWRITE CONSOLE')); log(); logEnv('CONSOLE MODE', env?.PUBLIC_CONSOLE_MODE); + logEnv('MULTI REGION', env?.PUBLIC_APPWRITE_MULTI_REGION); logEnv('APPWRITE ENDPOINT', env?.PUBLIC_APPWRITE_ENDPOINT, 'relative'); logEnv('GROWTH ENDPOINT', env?.PUBLIC_GROWTH_ENDPOINT); log(); diff --git a/compose.yml b/compose.yml index cfbb54934..6166d3776 100644 --- a/compose.yml +++ b/compose.yml @@ -5,6 +5,7 @@ services: context: . args: PUBLIC_CONSOLE_MODE: ${PUBLIC_CONSOLE_MODE} + PUBLIC_APPWRITE_MULTI_REGION: ${PUBLIC_APPWRITE_MULTI_REGION} PUBLIC_APPWRITE_ENDPOINT: ${PUBLIC_APPWRITE_ENDPOINT} PUBLIC_GROWTH_ENDPOINT: ${PUBLIC_GROWTH_ENDPOINT} PUBLIC_STRIPE_KEY: ${PUBLIC_STRIPE_KEY} @@ -20,6 +21,7 @@ services: - build/ environment: - PUBLIC_CONSOLE_MODE + - PUBLIC_APPWRITE_MULTI_REGION - PUBLIC_APPWRITE_ENDPOINT - PUBLIC_GROWTH_ENDPOINT - PUBLIC_STRIPE_KEY diff --git a/docker/nginx.conf b/docker/nginx.conf index 7f7313e00..38eb1d96a 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -1,35 +1,31 @@ -map $sent_http_content_type $expires { - # cache everything for 1 year - default 1y; - # html files shouldn't be cached for single-page applications - text/html off; -} - server { listen 80; server_name localhost; - # serve compressed file if filename.gz exists gzip_static on; - location /console { - root /usr/share/nginx/html; - index index.html index.htm; - try_files $uri /console/index.html; + # Set root for all locations + root /usr/share/nginx/html; - # Add cache headers - expires $expires; + # Security headers for all locations + add_header X-UA-Compatible "IE=Edge"; + add_header X-Frame-Options SAMEORIGIN; + add_header X-XSS-Protection "1; mode=block;"; + add_header X-Content-Type-Options nosniff; + + # Only cache files in /console/_app/immutable/ for 1 year + location /console/_app/immutable/ { + try_files $uri =404; + + expires 1y; add_header Pragma public; add_header Cache-Control "public"; + } - # Deny IE browsers from going into quirks mode - add_header X-UA-Compatible "IE=Edge"; - # X-Frame-Options is to prevent from clickJacking attack - add_header X-Frame-Options SAMEORIGIN; - # This header enables the Cross-site scripting (XSS) filter - add_header X-XSS-Protection "1; mode=block;"; - # disable content-type sniffing on some browsers. - add_header X-Content-Type-Options nosniff; + # All other /console requests (no cache) + location /console { + index index.html index.html; + try_files $uri /console/index.html; } location / { diff --git a/e2e/helpers/url.ts b/e2e/helpers/url.ts index 61c4c2425..a6fc879ac 100644 --- a/e2e/helpers/url.ts +++ b/e2e/helpers/url.ts @@ -12,7 +12,7 @@ export function getOrganizationIdFromUrl(pathname: string) { export function getProjectIdFromUrl(pathname: string) { // TODO: use base path from svelte here - const regex = /\/console\/project-([^/]+)(\/.*)?/; + const regex = /\/console\/project-(?:[a-z]{2,3}-)?([^/]+)(\/.*)?/; const match = pathname.match(regex); if (match) { diff --git a/e2e/journeys/upgrade-free-tier.spec.ts b/e2e/journeys/upgrade-free-tier.spec.ts index 024379820..76d5fafcd 100644 --- a/e2e/journeys/upgrade-free-tier.spec.ts +++ b/e2e/journeys/upgrade-free-tier.spec.ts @@ -8,12 +8,12 @@ test('upgrade - free tier', async ({ page }) => { await createFreeProject(page); await test.step('upgrade project', async () => { await page.getByRole('link', { name: 'Upgrade', exact: true }).click(); - await page.waitForURL('./organization-**/change-plan'); + await page.waitForURL(/\/organization-[^/]+\/change-plan/); await page.locator('input[value="tier-1"]').click(); await page.getByRole('button', { name: 'add' }).first().click(); await enterCreditCard(page); // skip members await page.getByRole('button', { name: 'change plan' }).click(); - await page.waitForURL('**/console/project-*/overview/platforms'); + await page.waitForURL(/\/console\/project-(?:[a-z0-9]+-)?([^/]+)\/get-started/); }); }); diff --git a/e2e/steps/account.ts b/e2e/steps/account.ts index a1eac5b57..5a74a736e 100644 --- a/e2e/steps/account.ts +++ b/e2e/steps/account.ts @@ -10,7 +10,6 @@ export function registerUserStep(page: Page): Promise { return test.step('register user', async () => { const seed = crypto.randomUUID(); await page.goto('./register'); - // await page.getByRole('button', { name: 'only required' }).click(); const inputs = { name: page.locator('id=name'), email: page.locator('id=email'), @@ -25,9 +24,9 @@ export function registerUserStep(page: Page): Promise { await inputs.name.fill(values.name); await inputs.email.fill(values.email); await inputs.password.fill(values.password); - await inputs.terms.check(); + await inputs.terms.check({ force: true }); await page.getByRole('button', { name: 'Sign up', exact: true }).click(); - await page.waitForURL('./onboarding'); + await page.waitForURL('./onboarding/create-project'); return values; }); diff --git a/e2e/steps/free-project.ts b/e2e/steps/free-project.ts index 6a51bf313..a8a3dadb9 100644 --- a/e2e/steps/free-project.ts +++ b/e2e/steps/free-project.ts @@ -9,23 +9,18 @@ type Metadata = { export async function createFreeProject(page: Page): Promise { const organizationId = await test.step('create organization', async () => { await page.goto('./'); - await page.waitForURL('./onboarding'); - await page.locator('id=name').fill('test org'); - await page.locator('id=plan').selectOption('tier-0'); - await page.getByRole('button', { name: 'get started' }).click(); - await page.waitForURL('./organization-**'); + await page.waitForURL(/\/organization-[^/]+/); return getOrganizationIdFromUrl(page.url()); }); const projectId = await test.step('create project', async () => { - await page.waitForURL('./organization-**'); + await page.waitForURL(/\/organization-[^/]+/); await page.getByRole('button', { name: 'create project' }).first().click(); - await page.locator('id=name').fill('test project'); - await page.getByRole('button', { name: 'next' }).click(); - await page.locator('label').filter({ hasText: 'Frankfurt' }).click(); - await page.getByRole('button', { name: 'create' }).click(); - await page.waitForURL('./project-**/overview/platforms'); - expect(page.url()).toContain('/console/project-'); + const dialog = page.locator('dialog[open]'); + await dialog.getByPlaceholder('Project name').fill('test project'); + await dialog.getByRole('button', { name: 'create' }).click(); + await page.waitForURL(/\/project-fra-[^/]+/); + expect(page.url()).toContain('/console/project-fra-'); return getProjectIdFromUrl(page.url()); }); diff --git a/e2e/steps/pro-project.ts b/e2e/steps/pro-project.ts index 566658aff..05c95895f 100644 --- a/e2e/steps/pro-project.ts +++ b/e2e/steps/pro-project.ts @@ -19,7 +19,7 @@ export async function enterCreditCard(page: Page) { await stripe.locator('id=Field-expiryInput').fill('1250'); await stripe.locator('id=Field-cvcInput').fill('123'); await stripe.locator('id=Field-countryInput').selectOption('DE'); - await page.getByRole('button', { name: 'Add', exact: true }).click(); + await dialog.getByRole('button', { name: 'Add', exact: true }).click(); await dialog.waitFor({ state: 'hidden' }); @@ -27,30 +27,28 @@ export async function enterCreditCard(page: Page) { export async function createProProject(page: Page): Promise { const organizationId = await test.step('create organization', async () => { - await page.goto('./'); - await page.waitForURL('./onboarding'); + await page.goto('./create-organization'); await page.locator('id=name').fill('test org'); - await page.locator('id=plan').selectOption('tier-1'); - await page.getByRole('button', { name: 'get started' }).click(); - await page.waitForURL('./create-organization**'); + await page.getByRole('radio', { name: /^Pro\b/ }).check(); + // `create organization` because there's already free created on start! + await page.getByRole('button', { name: 'create organization' }).click(); await page.getByRole('button', { name: 'add' }).first().click(); await enterCreditCard(page); // skip members await page.getByRole('button', { name: 'create organization' }).click(); - await page.waitForURL('./organization-**'); + await page.waitForURL(/\/organization-[^/]+/); return getOrganizationIdFromUrl(page.url()); }); const projectId = await test.step('create project', async () => { - await page.waitForURL('./organization-**'); + await page.waitForURL(/\/organization-[^/]+/); await page.getByRole('button', { name: 'create project' }).first().click(); - await page.getByPlaceholder('project name').fill('test project'); - await page.getByRole('button', { name: 'next' }).click(); - await page.locator('label').filter({ hasText: 'frankfurt' }).click(); - await page.getByRole('button', { name: 'create' }).click(); - await page.waitForURL('./project-**/overview/platforms'); - expect(page.url()).toContain('/project-'); + const dialog = page.locator('dialog[open]'); + await dialog.getByPlaceholder('Project name').fill('test project'); + await dialog.getByRole('button', { name: 'create' }).click(); + await page.waitForURL(/\/project-fra-[^/]+/); + expect(page.url()).toContain('/console/project-fra-'); return getProjectIdFromUrl(page.url()); }); diff --git a/package.json b/package.json index a52b0a0de..9614ac01b 100644 --- a/package.json +++ b/package.json @@ -21,18 +21,18 @@ "e2e:ui": "playwright test --ui" }, "dependencies": { - "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e", + "@ai-sdk/svelte": "^1.1.24", + "@appwrite.io/console": "https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19", "@appwrite.io/pink": "0.25.0", "@appwrite.io/pink-icons": "0.25.0", - "@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f", + "@appwrite.io/pink-icons-svelte": "^2.0.0-RC.1", "@appwrite.io/pink-legacy": "^1.0.3", - "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@cbf05a1", + "@appwrite.io/pink-svelte": "https://try-module.cloud/module/@appwrite/@appwrite.io/pink-svelte@90cb757", "@popperjs/core": "^2.11.8", "@sentry/sveltekit": "^8.38.0", "@stripe/stripe-js": "^3.5.0", "ai": "^2.2.37", "analytics": "^0.8.16", - "@ai-sdk/svelte": "^1.1.22", "cron-parser": "^4.9.0", "dayjs": "^1.11.13", "deep-equal": "^2.2.3", @@ -79,6 +79,7 @@ "svelte-check": "^4.1.5", "svelte-preprocess": "^6.0.3", "svelte-sequential-preprocessor": "^2.0.2", + "tldts": "^7.0.7", "tslib": "^2.8.1", "typescript": "^5.8.2", "typescript-eslint": "^8.30.1", diff --git a/playwright.config.ts b/playwright.config.ts index de119fa1f..fbd977757 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -15,6 +15,7 @@ const config: PlaywrightTestConfig = { env: { PUBLIC_APPWRITE_ENDPOINT: 'https://stage.cloud.appwrite.io/v1', PUBLIC_CONSOLE_MODE: 'cloud', + PUBLIC_APPWRITE_MULTI_REGION: 'true', PUBLIC_STRIPE_KEY: 'pk_test_51LT5nsGYD1ySxNCyd7b304wPD8Y1XKKWR6hqo6cu3GIRwgvcVNzoZv4vKt5DfYXL1gRGw4JOqE19afwkJYJq1g3K004eVfpdWn' }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5aefd5fd1..8effe5d54 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,11 +9,11 @@ importers: .: dependencies: '@ai-sdk/svelte': - specifier: ^1.1.22 - version: 1.1.22(svelte@5.25.3)(zod@3.24.3) + specifier: ^1.1.24 + version: 1.1.24(svelte@5.25.3)(zod@3.24.3) '@appwrite.io/console': - specifier: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e - version: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e + specifier: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19 + version: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19 '@appwrite.io/pink': specifier: 0.25.0 version: 0.25.0 @@ -21,14 +21,14 @@ importers: specifier: 0.25.0 version: 0.25.0 '@appwrite.io/pink-icons-svelte': - specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f(svelte@5.25.3) + specifier: ^2.0.0-RC.1 + version: https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-icons-svelte@12707b9(svelte@5.25.3) '@appwrite.io/pink-legacy': specifier: ^1.0.3 version: 1.0.3 '@appwrite.io/pink-svelte': - specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@cbf05a1 - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@cbf05a1(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3) + specifier: https://try-module.cloud/module/@appwrite/@appwrite.io/pink-svelte@90cb757 + version: https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-svelte@90cb757(svelte@5.25.3) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -177,6 +177,9 @@ importers: svelte-sequential-preprocessor: specifier: ^2.0.2 version: 2.0.2 + tldts: + specifier: ^7.0.7 + version: 7.0.7 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -198,8 +201,8 @@ packages: '@adobe/css-tools@4.4.2': resolution: {integrity: sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==} - '@ai-sdk/provider-utils@2.1.11': - resolution: {integrity: sha512-lMnXA5KaRJidzW7gQmlo/SnX6D+AKk5GxHFcQtOaGOSJNmu/qcNZc1rGaO7K5qW52OvCLXtnWudR4cc/FvMpVQ==} + '@ai-sdk/provider-utils@2.1.13': + resolution: {integrity: sha512-kLjqsfOdONr6DGcGEntFYM1niXz1H05vyZNf9OAzK+KKKc64izyP4/q/9HX7W4+6g8hm6BnmKxu8vkr6FSOqDg==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -207,12 +210,12 @@ packages: zod: optional: true - '@ai-sdk/provider@1.0.10': - resolution: {integrity: sha512-pco8Zl9U0xwXI+nCLc0woMtxbvjU8hRmGTseAUiPHFLYAAL8trRPCukg69IDeinOvIeo1SmXxAIdWWPZOLb4Cg==} + '@ai-sdk/provider@1.0.11': + resolution: {integrity: sha512-CPyImHGiT3svyfmvPvAFTianZzWFtm0qK82XjwlQIA1C3IQ2iku/PMQXi7aFyrX0TyMh3VTkJPB03tjU2VXVrw==} engines: {node: '>=18'} - '@ai-sdk/svelte@1.1.22': - resolution: {integrity: sha512-xtJjvEPHD8GDB1iODvsRLKplZ9CVUN/gT4U+nttuEvjV42qoPXKkrWwjTLEdWKnwTnoHuuI8mnQMje6RhFWtpA==} + '@ai-sdk/svelte@1.1.24': + resolution: {integrity: sha512-nlSSd4FirQyM10MQb9vCzF3e/R4id0od0/cKtB1JdtcIvT4ZaJzyltIK3Q72ceOjEbHXSGbucW6gVyExBzHCLQ==} engines: {node: '>=18'} peerDependencies: svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -220,8 +223,8 @@ packages: svelte: optional: true - '@ai-sdk/ui-utils@1.1.17': - resolution: {integrity: sha512-fCnp/wntZGqPf6tiCmhuQoSDLSBhXoI5DU2JX4As96EO870+jliE6ozvYUwYOZC6Ta2OKAjjWPcSP7HeHX0b+g==} + '@ai-sdk/ui-utils@1.1.19': + resolution: {integrity: sha512-rDHy2uxlPMt3jjS9L6mBrsfhEInZ5BVoWevmD13fsAt2s/XWy2OwwKmgmUQkdLlY4mn/eyeYAfDGK8+5CbOAgg==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -254,19 +257,18 @@ packages: '@analytics/type-utils@0.6.2': resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==} - '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e': - resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e} - version: 1.2.1 + '@appwrite.io/console@https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19': + resolution: {tarball: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19} + version: 1.8.0 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f} - version: 1.0.0-next.7 + '@appwrite.io/pink-icons-svelte@2.0.0-RC.1': + resolution: {integrity: sha512-iLFlV55hj8mGuAbmxJGenxN5RaZMmVT4GJb9dv/MP1xBAtYibFq7JvBcxm18qV2KU8c31Rntf+Ub4GL7HwqTYg==} peerDependencies: svelte: ^4.0.0 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@cbf05a106412315e451530f8384924da515b10c8': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@cbf05a106412315e451530f8384924da515b10c8} - version: 1.0.0-next.7 + '@appwrite.io/pink-icons-svelte@https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-icons-svelte@12707b9': + resolution: {tarball: https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-icons-svelte@12707b9} + version: 2.0.0-RC.1 peerDependencies: svelte: ^4.0.0 @@ -279,11 +281,10 @@ packages: '@appwrite.io/pink-legacy@1.0.3': resolution: {integrity: sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ==} - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@cbf05a1': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@cbf05a1} - version: 1.0.0-next.85 + '@appwrite.io/pink-svelte@https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-svelte@90cb757': + resolution: {tarball: https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-svelte@90cb757} + version: 2.0.0-RC.2 peerDependencies: - react-dom: ^18.0.0 svelte: ^4.0.0 '@appwrite.io/pink@0.25.0': @@ -1342,8 +1343,8 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/react@18.3.20': - resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} + '@types/react@18.3.22': + resolution: {integrity: sha512-vUhG0YmQZ7kL/tmKLrD3g5zXbXXreZXB3pmROW8bg3CnLnpjkRVwUlLne7Ufa2r9yJ8+/6B73RzhAek5TBKh2Q==} '@types/remarkable@2.0.8': resolution: {integrity: sha512-eKXqPZfpQl1kOADjdKchHrp2gwn9qMnGXhH/AtZe0UrklzhGJkawJo/Y/D0AlWcdWoWamFNIum8+/nkAISQVGg==} @@ -2854,8 +2855,8 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -2867,11 +2868,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -2970,9 +2966,6 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -3249,10 +3242,17 @@ packages: tldts-core@6.1.85: resolution: {integrity: sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA==} + tldts-core@7.0.7: + resolution: {integrity: sha512-ECqb8imSroX1UmUuhRBNPkkmtZ8mHEenieim80UVxG0M5wXVjY2Fp2tYXCPvk+nLy1geOhFpeD5YQhM/gF63Jg==} + tldts@6.1.85: resolution: {integrity: sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w==} hasBin: true + tldts@7.0.7: + resolution: {integrity: sha512-ETNXj36ql5BXDa4VVJk3wgqansg8TI1Yqo217twSAPjyDnh/b2T+XzrI0ftn6EnzVPbXpMTZHOWj5s3a8/uGPA==} + hasBin: true + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3556,32 +3556,32 @@ snapshots: '@adobe/css-tools@4.4.2': {} - '@ai-sdk/provider-utils@2.1.11(zod@3.24.3)': + '@ai-sdk/provider-utils@2.1.13(zod@3.24.3)': dependencies: - '@ai-sdk/provider': 1.0.10 + '@ai-sdk/provider': 1.0.11 eventsource-parser: 3.0.0 nanoid: 3.3.11 secure-json-parse: 2.7.0 optionalDependencies: zod: 3.24.3 - '@ai-sdk/provider@1.0.10': + '@ai-sdk/provider@1.0.11': dependencies: json-schema: 0.4.0 - '@ai-sdk/svelte@1.1.22(svelte@5.25.3)(zod@3.24.3)': + '@ai-sdk/svelte@1.1.24(svelte@5.25.3)(zod@3.24.3)': dependencies: - '@ai-sdk/provider-utils': 2.1.11(zod@3.24.3) - '@ai-sdk/ui-utils': 1.1.17(zod@3.24.3) + '@ai-sdk/provider-utils': 2.1.13(zod@3.24.3) + '@ai-sdk/ui-utils': 1.1.19(zod@3.24.3) optionalDependencies: svelte: 5.25.3 transitivePeerDependencies: - zod - '@ai-sdk/ui-utils@1.1.17(zod@3.24.3)': + '@ai-sdk/ui-utils@1.1.19(zod@3.24.3)': dependencies: - '@ai-sdk/provider': 1.0.10 - '@ai-sdk/provider-utils': 2.1.11(zod@3.24.3) + '@ai-sdk/provider': 1.0.11 + '@ai-sdk/provider-utils': 2.1.13(zod@3.24.3) zod-to-json-schema: 3.24.5(zod@3.24.3) optionalDependencies: zod: 3.24.3 @@ -3625,13 +3625,13 @@ snapshots: '@analytics/type-utils@0.6.2': {} - '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e': {} + '@appwrite.io/console@https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19': {} - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f(svelte@5.25.3)': + '@appwrite.io/pink-icons-svelte@2.0.0-RC.1(svelte@5.25.3)': dependencies: svelte: 5.25.3 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@cbf05a106412315e451530f8384924da515b10c8(svelte@5.25.3)': + '@appwrite.io/pink-icons-svelte@https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-icons-svelte@12707b9(svelte@5.25.3)': dependencies: svelte: 5.25.3 @@ -3644,9 +3644,9 @@ snapshots: '@appwrite.io/pink-icons': 1.0.0 the-new-css-reset: 1.11.3 - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@cbf05a1(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3)': + '@appwrite.io/pink-svelte@https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-svelte@90cb757(svelte@5.25.3)': dependencies: - '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@cbf05a106412315e451530f8384924da515b10c8(svelte@5.25.3) + '@appwrite.io/pink-icons-svelte': 2.0.0-RC.1(svelte@5.25.3) '@floating-ui/dom': 1.6.13 '@melt-ui/pp': 0.3.2(@melt-ui/svelte@0.86.6(svelte@5.25.3))(svelte@5.25.3) '@melt-ui/svelte': 0.86.6(svelte@5.25.3) @@ -3654,7 +3654,6 @@ snapshots: d3: 7.9.0 fuse.js: 7.1.0 pretty-bytes: 6.1.1 - react-dom: 18.3.1(react@18.3.1) shiki: 1.29.2 svelte: 5.25.3 svelte-motion: 0.12.2(svelte@5.25.3) @@ -4788,7 +4787,7 @@ snapshots: '@types/prop-types@15.7.14': {} - '@types/react@18.3.20': + '@types/react@18.3.22': dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 @@ -5890,7 +5889,7 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -6423,7 +6422,7 @@ snapshots: progress@2.0.3: {} - property-information@7.0.0: {} + property-information@7.1.0: {} proxy-from-env@1.1.0: {} @@ -6431,12 +6430,6 @@ snapshots: queue-microtask@1.2.3: {} - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - react-is@17.0.2: {} react@18.3.1: @@ -6567,10 +6560,6 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - secure-json-parse@2.7.0: {} semver@6.3.1: {} @@ -6746,7 +6735,7 @@ snapshots: svelte-motion@0.12.2(svelte@5.25.3): dependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.22 framesync: 6.1.2 popmotion: 11.0.5 style-value-types: 5.1.2 @@ -6855,10 +6844,16 @@ snapshots: tldts-core@6.1.85: {} + tldts-core@7.0.7: {} + tldts@6.1.85: dependencies: tldts-core: 6.1.85 + tldts@7.0.7: + dependencies: + tldts-core: 7.0.7 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 diff --git a/src/hooks.client.ts b/src/hooks.client.ts index 8f67377ef..5419792a0 100644 --- a/src/hooks.client.ts +++ b/src/hooks.client.ts @@ -1,7 +1,7 @@ import * as Sentry from '@sentry/sveltekit'; +import { isCloud, isProd } from '$lib/system'; import { AppwriteException } from '@appwrite.io/console'; import type { HandleClientError } from '@sveltejs/kit'; -import { isCloud, isProd } from '$lib/system'; Sentry.init({ enabled: isCloud && isProd, @@ -11,17 +11,15 @@ Sentry.init({ replaysOnErrorSampleRate: 0 }); -export const handleError: HandleClientError = Sentry.handleErrorWithSentry( - async ({ error, message, status }) => { - console.error(error); - if (error instanceof AppwriteException) { - status = error.code === 0 ? undefined : error.code; - message = error.message; - } - - return { - message, - status - }; +export const handleError: HandleClientError = ({ error, message, status }) => { + console.error(error); + if (error instanceof AppwriteException) { + status = error.code === 0 ? undefined : error.code; + message = error.message; } -); + + return { + message, + status + }; +}; diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index 78e7551b7..d9c86e0d9 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -152,6 +152,7 @@ export enum Click { DatabaseIndexDelete = 'click_index_delete', DatabaseCollectionDelete = 'click_collection_delete', DatabaseDatabaseDelete = 'click_database_delete', + DatabaseImportCsv = 'click_database_import_csv', DomainCreateClick = 'click_domain_create', DomainDeleteClick = 'click_domain_delete', DomainRetryDomainVerificationClick = 'click_domain_retry_domain_verification', @@ -161,6 +162,7 @@ export enum Click { FunctionsDeploymentDeleteClick = 'click_deployment_delete', FunctionsDeploymentCancelClick = 'click_deployment_cancel', KeyCreateClick = 'click_key_create', + DevKeyCreateClick = 'click_dev_key_create', MenuDropDownClick = 'click_menu_dropdown', MenuOverviewClick = 'click_menu_overview', ModalCloseClick = 'click_close_modal', @@ -270,6 +272,7 @@ export enum Submit { DatabaseCreate = 'submit_database_create', DatabaseDelete = 'submit_database_delete', DatabaseUpdateName = 'submit_database_update_name', + DatabaseImportCsv = 'submit_database_import_csv', AttributeCreate = 'submit_attribute_create', AttributeUpdate = 'submit_attribute_update', AttributeDelete = 'submit_attribute_delete', @@ -311,12 +314,19 @@ export enum Submit { VariableDelete = 'submit_variable_delete', VariableUpdate = 'submit_variable_update', VariableEditor = 'submit_variable_editor', + LogDelete = 'submit_log_delete', + KeyCreate = 'submit_key_create', KeyDelete = 'submit_key_delete', KeyUpdateName = 'submit_key_update_name', KeyUpdateScopes = 'submit_key_update_scopes', KeyUpdateExpire = 'submit_key_update_expire', + DevKeyCreate = 'submit_dev_key_create', + DevKeyDelete = 'submit_dev_key_delete', + DevKeyUpdateName = 'submit_dev_key_update_name', + DevKeyUpdateExpire = 'submit_dev_key_update_expire', + PlatformCreate = 'submit_platform_create', PlatformDelete = 'submit_platform_delete', PlatformUpdate = 'submit_platform_update', @@ -346,6 +356,9 @@ export enum Submit { FileCreate = 'submit_file_create', FileDelete = 'submit_file_delete', FileUpdatePermissions = 'submit_file_update_permissions', + FileTokenCreate = 'submit_file_token', + FileTokenDelete = 'submit_file_delete', + FileTokenUpdate = 'submit_file_update_expiry', BudgetCapUpdate = 'submit_budget_cap_update', BudgetAlertsUpdate = 'submit_budget_alert_conditions_update', CreditRedeem = 'submit_credit_redeem', diff --git a/src/lib/commandCenter/panels/createAttribute.svelte b/src/lib/commandCenter/panels/createAttribute.svelte index 950d4af72..98d312698 100644 --- a/src/lib/commandCenter/panels/createAttribute.svelte +++ b/src/lib/commandCenter/panels/createAttribute.svelte @@ -1,6 +1,6 @@ diff --git a/src/lib/components/billing/alerts/paymentFailed.svelte b/src/lib/components/billing/alerts/paymentFailed.svelte index 9646864a9..83b44dc2d 100644 --- a/src/lib/components/billing/alerts/paymentFailed.svelte +++ b/src/lib/components/billing/alerts/paymentFailed.svelte @@ -1,12 +1,12 @@ {#if $failedInvoice && $failedInvoice.teamId === $organization.$id && isOnProjects} diff --git a/src/lib/components/billing/selectPlan.svelte b/src/lib/components/billing/selectPlan.svelte index 8aae2f0ac..2b9d9498f 100644 --- a/src/lib/components/billing/selectPlan.svelte +++ b/src/lib/components/billing/selectPlan.svelte @@ -24,8 +24,7 @@ tooltipShow={plan.$id === BillingPlan.FREE && anyOrgFree} tooltipText={plan.$id === BillingPlan.FREE ? 'You are limited to 1 Free organization per account.' - : ''} - padding={1.5}> + : ''}>
{ + const getCorrectSeatsCountValue = (count: number): string | number => { // php int max is always larger than js const exceedsSafeLimit = count >= Number.MAX_SAFE_INTEGER; return exceedsSafeLimit ? 'Unlimited' : count || 0; diff --git a/src/lib/components/bottomModalAlert.svelte b/src/lib/components/bottomModalAlert.svelte index c1a57c300..406b40222 100644 --- a/src/lib/components/bottomModalAlert.svelte +++ b/src/lib/components/bottomModalAlert.svelte @@ -3,8 +3,9 @@ import { hideNotification, shouldShowNotification } from '$lib/helpers/notifications'; import { app } from '$lib/stores/app'; import { + type BottomModalAlertAction, type BottomModalAlertItem, - bottomModalAlerts, + bottomModalAlertsConfig, dismissBottomModalAlert, hideAllModalAlerts } from '$lib/stores/bottom-alerts'; @@ -13,15 +14,17 @@ import { BillingPlan } from '$lib/constants'; import { upgradeURL } from '$lib/stores/billing'; import { addBottomModalAlerts } from '$routes/(console)/bottomAlerts'; - import { project } from '$routes/(console)/project-[project]/store'; + import { project } from '$routes/(console)/project-[region]-[project]/store'; import { page } from '$app/state'; import { Click, trackEvent } from '$lib/actions/analytics'; + import { goto } from '$app/navigation'; + import { Typography } from '@appwrite.io/pink-svelte'; let currentIndex = 0; let openModalOnMobile = false; function getPageScope(pathname: string) { - const isProjectPage = pathname.includes('project-[project]'); + const isProjectPage = pathname.includes('project-[region]-[project]'); const isOrganizationPage = pathname.includes('organization-[organization]'); return { isProjectPage, isOrganizationPage }; @@ -33,23 +36,27 @@ return alerts .sort((a, b) => b.importance - a.importance) .filter((alert) => { - return ( - alert.show && - shouldShowNotification(alert.id) && - // if no scope > show in projects & org pages. - ((!alert.scope && (isProjectPage || isOrganizationPage)) || - // project scope, show only in project pages - (isProjectPage && alert.scope === 'project') || - // organization scope, show only in organization pages - (isOrganizationPage && alert.scope === 'organization')) - ); + if (!alert.show || !shouldShowNotification(alert.id)) return false; + + switch (alert.scope) { + case 'everywhere': + return true; + case 'project': + return isProjectPage; + case 'organization': + return isOrganizationPage; + default: + return false; + } }); } - $: filteredModalAlerts = filterModalAlerts($bottomModalAlerts, page.route.id); + $: filteredModalAlerts = filterModalAlerts($bottomModalAlertsConfig.alerts, page.route.id); $: currentModalAlert = filteredModalAlerts[currentIndex] as BottomModalAlertItem; + $: hasOnlyPrimaryCta = typeof currentModalAlert?.learnMore === 'undefined'; + function handleClose() { filteredModalAlerts.forEach((alert) => { const modalAlert = alert; @@ -67,9 +74,76 @@ currentIndex = (currentIndex - 1 + filteredModalAlerts.length) % filteredModalAlerts.length; } + function getMobileWindowConfig(): { + html: boolean; + cta: boolean; + title: string; + message: string; + } { + const config = $bottomModalAlertsConfig?.mobileSingleLayout; + const visibleAlerts = $bottomModalAlertsConfig.alerts.filter((a) => a.show); + + const fallback = { + title: 'New features available', + message: 'Explore new features to enhance your projects and improve security.' + }; + + const shouldApplyConfig = config?.enabled === true && visibleAlerts.length === 1; + + return { + cta: !!(shouldApplyConfig && config.cta), + html: !!(shouldApplyConfig && config.isHtml), + title: shouldApplyConfig && config.title ? config.title : fallback.title, + message: shouldApplyConfig && config.message ? config.message : fallback.message + }; + } + + function triggerMobileWindowLink() { + handleClose(); + + const url = $bottomModalAlertsConfig.mobileSingleLayout.cta.link({ + organization: $organization, + project: $project + }); + + if ($bottomModalAlertsConfig.mobileSingleLayout.cta.external) { + window.open(url, '_blank'); + } else { + goto(url); + } + } + + // the button component cannot have both href and on:click! + function triggerWindowLink(alertAction: BottomModalAlertAction, event?: string) { + const shouldShowUpgrade = showUpgrade(); + const url = shouldShowUpgrade + ? $upgradeURL + : alertAction.link({ + organization: $organization, + project: $project + }); + + if (!shouldShowUpgrade && alertAction.external) { + window.open(url, '_blank'); + } else { + goto(url); + } + + if (alertAction?.hideOnClick === true) { + // be careful of this one. + // once clicked, its gone! + handleClose(); + } + + trackEvent(Click.PromoClick, { + promo: currentModalAlert.id, + type: shouldShowUpgrade ? 'upgrade' : (event ?? `cta_click_${currentModalAlert.id}`) + }); + } + function showUpgrade() { const plan = currentModalAlert.plan; - const organizationPlan = $organization.billingPlan; + const organizationPlan = $organization?.billingPlan; switch (plan) { case 'free': return false; @@ -87,7 +161,7 @@ }); -{#if filteredModalAlerts.length > 0 && currentModalAlert} +{#if filteredModalAlerts.length > 0 && currentModalAlert && !page.url.pathname.includes('console/onboarding')} {@const shouldShowUpgrade = showUpgrade()}
@@ -150,7 +224,9 @@ {/if}
-

{currentModalAlert.title}

+ + {currentModalAlert.title} + {#if currentModalAlert.isHtml} @@ -164,34 +240,23 @@
{#if currentModalAlert.learnMore} + @@ -266,7 +331,9 @@ {/if}
-

{currentModalAlert.title}

+ + {currentModalAlert.title} + {#if currentModalAlert.isHtml} @@ -280,22 +347,12 @@
{#if currentModalAlert.learnMore} + @@ -322,20 +380,41 @@
{:else} -
- Explore new features to enhance your projects and improve security. + {#if mobileConfig.html} + {@html mobileConfig.message} + {:else} + {mobileConfig.message} + {/if}
- +
{/if}
{/if} @@ -364,6 +443,7 @@ top: 1rem; right: 1rem; + cursor: pointer; background: #fff; position: absolute; display: inline-flex; @@ -377,6 +457,22 @@ border: hsl(var(--color-neutral-80)) solid 1px; } + :global(.main-alert-wrapper .only-primary-cta) { + width: 100%; + text-align: center; + justify-content: center; + } + + .showcase-image.u-only-light { + border-radius: 8px; + border: 0.795px solid var(--border-neutral-strong, #d8d8db); + } + + .showcase-image.u-only-dark { + border-radius: 8px; + border: 0.795px solid var(--border-neutral-strong, #414146); + } + .u-gap-10 { gap: 0.625rem; } diff --git a/src/lib/components/box.svelte b/src/lib/components/box.svelte index 448f93c85..d129900a0 100644 --- a/src/lib/components/box.svelte +++ b/src/lib/components/box.svelte @@ -1,10 +1,9 @@ diff --git a/src/lib/components/breadcrumbs.svelte b/src/lib/components/breadcrumbs.svelte index 4acd8a6a4..7d9329f3c 100644 --- a/src/lib/components/breadcrumbs.svelte +++ b/src/lib/components/breadcrumbs.svelte @@ -19,6 +19,7 @@ name: string; $id: string; isSelected: boolean; + region: string; }; type Organization = { name: string; @@ -139,7 +140,7 @@ if (index < 4) { return { name: project.name, - href: `/console/project-${project.$id}/overview` + href: `/console/project-${project.region}-${project.$id}/overview` }; } else if (index === 4) { return { @@ -315,7 +316,8 @@ {#if index < 4}
- {project.name}
diff --git a/src/lib/components/card.svelte b/src/lib/components/card.svelte index 28af1975c..fd94436ab 100644 --- a/src/lib/components/card.svelte +++ b/src/lib/components/card.svelte @@ -1,7 +1,16 @@ + + diff --git a/src/lib/components/creditCardInfo.svelte b/src/lib/components/creditCardInfo.svelte index 7ab6ced30..849146456 100644 --- a/src/lib/components/creditCardInfo.svelte +++ b/src/lib/components/creditCardInfo.svelte @@ -2,9 +2,9 @@ import type { PaymentMethodData } from '$lib/sdk/billing'; import { Badge, Layout, Link, Popover, Table } from '@appwrite.io/pink-svelte'; import CreditCardBrandImage from './creditCardBrandImage.svelte'; - import type { RootProp } from '@appwrite.io/pink-svelte/dist/table'; + import type { TableRootProp } from '$lib/helpers/types'; - export let root: RootProp; + export let root: TableRootProp; export let paymentMethod: PaymentMethodData; export let isBackup: boolean = false; diff --git a/src/lib/components/csvImportBox.svelte b/src/lib/components/csvImportBox.svelte new file mode 100644 index 000000000..8c0e48b8a --- /dev/null +++ b/src/lib/components/csvImportBox.svelte @@ -0,0 +1,242 @@ + + +{#if showCsvImportBox} + +
+
+

+ + Importing documents ({$importItems.size}) + +

+ + +
+ + {#each [...$importItems.entries()] as [key, value] (key)} +
+
    +
  • +
    +
    + + {@html text(value.status, value.collection)} + +
    +
    +
    +
    +
  • +
+
+ {/each} +
+
+{/if} + + diff --git a/src/lib/components/domains/nameserverTable.svelte b/src/lib/components/domains/nameserverTable.svelte index da5375bce..f9cbcecfc 100644 --- a/src/lib/components/domains/nameserverTable.svelte +++ b/src/lib/components/domains/nameserverTable.svelte @@ -17,7 +17,7 @@ {domain} {#if verified} - + {:else if verified === false} {/if} diff --git a/src/lib/components/domains/recordTable.svelte b/src/lib/components/domains/recordTable.svelte index f39dea986..f099fa003 100644 --- a/src/lib/components/domains/recordTable.svelte +++ b/src/lib/components/domains/recordTable.svelte @@ -1,26 +1,28 @@ diff --git a/src/routes/(console)/project-[project]/overview/keys/expirationInput.svelte b/src/lib/components/expirationInput.svelte similarity index 50% rename from src/routes/(console)/project-[project]/overview/keys/expirationInput.svelte rename to src/lib/components/expirationInput.svelte index cafc292c6..554574913 100644 --- a/src/routes/(console)/project-[project]/overview/keys/expirationInput.svelte +++ b/src/lib/components/expirationInput.svelte @@ -1,5 +1,12 @@ + + - - - {#if expirationSelect !== 'custom' && expirationSelect !== null} - Your key will expire in {toLocaleDate(value)} - {/if} - - + + {#if expirationSelect === 'custom'} - + {/if} diff --git a/src/lib/components/feedback/feedback.svelte b/src/lib/components/feedback/feedback.svelte index 2d1a7623c..ed500aa15 100644 --- a/src/lib/components/feedback/feedback.svelte +++ b/src/lib/components/feedback/feedback.svelte @@ -11,7 +11,7 @@ import { addNotification } from '$lib/stores/notifications'; import { page } from '$app/state'; import { Typography } from '@appwrite.io/pink-svelte'; - import { project } from '$routes/(console)/project-[project]/store'; + import { project } from '$routes/(console)/project-[region]-[project]/store'; $: $selectedFeedback = feedbackOptions.find((option) => option.type === $feedback.type); diff --git a/src/lib/components/filePicker.svelte b/src/lib/components/filePicker.svelte index 9c16bb2e8..df2d78f78 100644 --- a/src/lib/components/filePicker.svelte +++ b/src/lib/components/filePicker.svelte @@ -1,36 +1,45 @@ -
+ - + + - - {#await buckets then response} - {#if response?.total} - {#if currentBucket} - - - {currentBucket?.name} - - {currentBucket?.$id} - - - - - - - - +
+ +
- {#if files} - {#await files} - - - Loading files... - - {:then response} - {#if response?.files?.length} - {#if view === 'grid'} - - {#each response?.files as file} - selectFile(file)} /> - {/each} - +
+ + {#if $isSmallViewport} + + {/if} + + {#await buckets then response} + {#if response?.total} + {#if currentBucket} + + {#if !$isSmallViewport} + {#key currentBucket?.$id} + + {currentBucket?.name} + + {currentBucket?.$id} + + + {/key} + {/if} + + + + {#if !$isSmallViewport} + {/if} - {#if view === 'list'} - - - - Filename - - - ID - - - Type - - - Size - - - Created - - - {#each response?.files as file} - selectFile(file)}> - -
- + + + {#if files} + {#await files} + + + Loading files... + + {:then response} + {#if response?.files?.length} + {#if view === 'grid'} + {#if $isSmallViewport} + + {#each response?.files as file} + selectFile(file)} /> + {/each} + + {:else} + + {#each response?.files as file} +
+ - {file.name} - - {file.name} - + on:click={() => + selectFile(file)} />
- - - {file.$id} - - - {file.mimeType} - - - {calculateSize(file.sizeOriginal)} - - - - - - {/each} - + {/each} +
+ {/if} + {/if} + {#if view === 'list'} + + + + Filename + + + ID + + + Type + + + Size + + + Created + + + {#each response?.files as file (file.$id)} + selectFile(file)}> + +
+ + +
+ {file.name} +
+ + + + {truncatedFilename( + file + )} + + + + {file.name} + + +
+
+ + {file.$id} + + + {file.mimeType} + + + {calculateSize(file.sizeOriginal)} + + + + +
+ {/each} +
+ {/if} + {:else if $search} + + + + {:else} + + + + + + + + {/if} - {:else if $search} - - - - {:else} - - - - {/if} - {/await} + {/await} + {/if} {/if} + {:else} + + + + + + + + + {/if} - {:else} - - - - {/if} - {/await} - - + {/await} + +
+ + >Select + + + diff --git a/src/lib/components/filters/customFilters.svelte b/src/lib/components/filters/customFilters.svelte index 09ff475fb..8fd765f27 100644 --- a/src/lib/components/filters/customFilters.svelte +++ b/src/lib/components/filters/customFilters.svelte @@ -12,7 +12,9 @@ { show = true; - }}>Custom filters + }}> + Custom filters + {#if show} diff --git a/src/lib/components/filters/filtersBottomSheet.svelte b/src/lib/components/filters/filtersBottomSheet.svelte index 3d61e8b6b..5d7137c1a 100644 --- a/src/lib/components/filters/filtersBottomSheet.svelte +++ b/src/lib/components/filters/filtersBottomSheet.svelte @@ -111,8 +111,6 @@ return arrayValue; } } - - $inspect(subSheets); diff --git a/src/lib/components/filters/filtersModal.svelte b/src/lib/components/filters/filtersModal.svelte index aebb86f76..07d410ad2 100644 --- a/src/lib/components/filters/filtersModal.svelte +++ b/src/lib/components/filters/filtersModal.svelte @@ -11,11 +11,12 @@ } from '$lib/elements/forms'; import type { Writable } from 'svelte/store'; import Modal from '../modal.svelte'; - import { addFilter, generateTag, operators, queries, type TagValue } from './store'; + import { generateTag, operators, ValidOperators, type TagValue } from './store'; import type { Column } from '$lib/helpers/types'; import { TagList } from '.'; import { Icon, Layout } from '@appwrite.io/pink-svelte'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; + import { addFilterAndApply } from './quickFilters'; export let show = false; export let columns: Writable; @@ -35,9 +36,17 @@ function apply() { localQueries.forEach((query) => { - addFilter($columns, query.id, query.operator, query.value, query.arrayValues); + addFilterAndApply( + query.id, + $columns.find((c) => c.id === query.id).title, + query.operator as ValidOperators, + query.value, + query.arrayValues, + $columns, + analyticsSource + ); }); - queries.apply(); + localTags = []; localQueries = []; trackEvent(Submit.FilterApply, { @@ -48,7 +57,7 @@ } function addCondition() { - const newTag = generateTag(selectedColumn, operatorKey, value, arrayValues); + const newTag = generateTag(selectedColumn, operatorKey, value || arrayValues); if (localTags.some((t) => t.tag === newTag.tag && t.value === newTag.value)) { return; } else { diff --git a/src/lib/components/filters/quickFilters.svelte b/src/lib/components/filters/quickFilters.svelte index 143fe5c73..76bbf90c5 100644 --- a/src/lib/components/filters/quickFilters.svelte +++ b/src/lib/components/filters/quickFilters.svelte @@ -1,107 +1,68 @@ -{#if $isSmallViewport} - {#if $parsedTags?.length} - - {:else} - - {/if} -{:else} - - {#if $parsedTags?.length} - - {:else} - - {/if} - - {#each filterCols as filter (filter.title + filter.id)} - {#if filter.options} - { - addFilterAndApply( - filter.id, - filter.title, - filter.operator, - e.detail.value, - filter?.array - ? (filter.options - .filter((opt) => opt.checked) - .map((opt) => opt.value) ?? []) - : [], - $columns, - analyticsSource - ); - }} - on:clear={() => { - addFilterAndApply( - filter.id, - filter.title, - filter.operator, - null, - [], - $columns, - analyticsSource - ); - }} /> - {/if} - {/each} - + + + + {#each filterCols.filter((f) => f?.options) as filter (filter.title + filter.id)} + {#if filter.options} + { + addFilterAndApply( + filter.id, + filter.title, + filter.operator, + e.detail.value, + filter?.array + ? (filter.options + .filter((opt) => opt.checked) + .map((opt) => opt.value) ?? []) + : [], + $columns, + analyticsSource + ); + }} + on:clear={() => { + addFilterAndApply( + filter.id, + filter.title, + filter.operator, + null, + [], + $columns, + analyticsSource + ); + }} /> + {/if} + {/each} + - - - - -{/if} - -{#if $isSmallViewport && openBottomSheet} - -{/if} + + + + diff --git a/src/lib/components/filters/quickfiltersSubMenu.svelte b/src/lib/components/filters/quickfiltersSubMenu.svelte index b49bef07e..9b4c3275c 100644 --- a/src/lib/components/filters/quickfiltersSubMenu.svelte +++ b/src/lib/components/filters/quickfiltersSubMenu.svelte @@ -34,9 +34,10 @@
- - {filter.title} + + + {filter.title} +
diff --git a/src/lib/components/filters/setFilters.ts b/src/lib/components/filters/setFilters.ts index 7c8d858d2..b7e0f18c3 100644 --- a/src/lib/components/filters/setFilters.ts +++ b/src/lib/components/filters/setFilters.ts @@ -9,17 +9,18 @@ export function setFilters(localTags: TagValue[], filterCols: FilterData[], $col if (!localTags?.length) { filterCols.forEach((filter) => { resetOptions(filter); - cleanOldTags(filter.title); + cleanOldTags(filter?.title); }); } else { filterCols.forEach((filter) => { - if (filter.id.toLowerCase().includes('duration')) { + const id = filter?.id?.toLowerCase(); + if (id?.includes('duration')) { setTimeFilter(filter, $columns); - } else if (filter.id.toLocaleLowerCase().includes('size')) { + } else if (id?.includes('size')) { setSizeFilter(filter, $columns); - } else if (filter.id.toLocaleLowerCase().includes('statuscode')) { + } else if (id?.includes('statuscode')) { setStatusCodeFilter(filter, $columns); - } else if (filter.id === '$createdAt' || filter.id === '$updatedAt') { + } else if (id === '$createdat' || id === '$updatedat') { setDateFilter(filter, $columns); } else { setFilterData(filter); @@ -40,7 +41,7 @@ export function setFilterData(filter: FilterData) { option.checked = values.includes(option.value); }); } - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: tagData.tag.replace(',', ' or '), value: tagData.value @@ -52,7 +53,7 @@ export function setFilterData(filter: FilterData) { }); } else { resetOptions(filter); - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -76,7 +77,7 @@ export function setTimeFilter(filter: FilterData, columns: Column[]) { value: timeTag.value }; - cleanOldTags(filter.title); + cleanOldTags(filter?.title); parsedTags.update((tags) => { tags.push(newTag); @@ -84,7 +85,7 @@ export function setTimeFilter(filter: FilterData, columns: Column[]) { }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -102,7 +103,7 @@ export function setSizeFilter(filter: FilterData, columns: Column[]) { return prev; }); if (sizeRange) { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: `**${filter.title}** is **${sizeRange.label}**`, @@ -114,7 +115,7 @@ export function setSizeFilter(filter: FilterData, columns: Column[]) { }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -127,19 +128,18 @@ export function setStatusCodeFilter(filter: FilterData, columns: Column[]) { const codeRange = ranges.find((c) => c?.value && c.value === statusCodeTag.value); if (codeRange) { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: `**${filter.title}** is **${codeRange.label}**`, value: statusCodeTag.value }; - console.log(codeRange); parsedTags.update((tags) => { tags.push(newTag); return tags; }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -158,7 +158,7 @@ export function setDateFilter(filter: FilterData, columns: Column[]) { return prev; }); if (dateRange) { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: `**${filter.title}** is **${dateRange.label}**`, value: dateTag.value @@ -169,11 +169,12 @@ export function setDateFilter(filter: FilterData, columns: Column[]) { }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } function cleanOldTags(title: string) { + if (!title) return; parsedTags.update((tags) => { tags = tags.filter((tag) => !tag.tag.includes(`**${title}**`)); return tags; @@ -181,6 +182,7 @@ function cleanOldTags(title: string) { } export function resetOptions(filter: FilterData) { + if (!filter?.options) return; filter.options.forEach((option) => { option.checked = false; }); diff --git a/src/lib/components/git/connectRepoModal.svelte b/src/lib/components/git/connectRepoModal.svelte index 17397c8f6..bf2685c65 100644 --- a/src/lib/components/git/connectRepoModal.svelte +++ b/src/lib/components/git/connectRepoModal.svelte @@ -12,6 +12,7 @@ import { addNotification } from '$lib/stores/notifications'; import { Click, trackEvent } from '$lib/actions/analytics'; import RepositoryBehaviour from '$lib/components/git/repositoryBehaviour.svelte'; + import { page } from '$app/state'; let { show = $bindable(false), @@ -38,12 +39,14 @@ let error = $state(''); onMount(async () => { - installations = await sdk.forProject.vcs.listInstallations(); + installations = await sdk + .forProject(page.params.region, page.params.project) + .vcs.listInstallations(); if (!$installation?.$id && installations?.total) { $installation = installations.installations[0]; } selectedInstallationId = installations.total ? installations.installations[0]?.$id : ''; - if (!!installations?.total) { + if (installations?.total) { repositoryBehaviour = 'existing'; } }); @@ -51,11 +54,9 @@ async function connectRepo() { try { if (repositoryBehaviour === 'new') { - const repo = await sdk.forProject.vcs.createRepository( - $installation.$id, - repositoryName, - repositoryPrivate - ); + const repo = await sdk + .forProject(page.params.region, page.params.project) + .vcs.createRepository($installation.$id, repositoryName, repositoryPrivate); repository.set(repo); selectedRepository = repo.id; } diff --git a/src/lib/components/git/deploymentDomains.svelte b/src/lib/components/git/deploymentDomains.svelte index bb6ed3942..f588cc57c 100644 --- a/src/lib/components/git/deploymentDomains.svelte +++ b/src/lib/components/git/deploymentDomains.svelte @@ -42,12 +42,12 @@ {#if sortedDomains.length > 1} - + +{sortedDomains.length - 1} - + {#each sortedDomains as rule, i} {#if i !== 0} - import { Button, InputSelect, InputText } from '$lib/elements/forms'; + import { Button, InputText } from '$lib/elements/forms'; import { Fieldset, Input, Layout, Selector, Skeleton } from '@appwrite.io/pink-svelte'; import SelectRootModal from './selectRootModal.svelte'; import { sdk } from '$lib/stores/sdk'; import { sortBranches } from '$lib/stores/vcs'; + import { page } from '$app/state'; export let branch = 'main'; export let rootDir: string; @@ -15,10 +16,9 @@ let show = false; async function loadBranches() { - const { branches } = await sdk.forProject.vcs.listRepositoryBranches( - installationId, - repositoryId - ); + const { branches } = await sdk + .forProject(page.params.region, page.params.project) + .vcs.listRepositoryBranches(installationId, repositoryId); const sorted = sortBranches(branches); branch = sorted[0]?.name ?? null; diff --git a/src/lib/components/git/repositories.svelte b/src/lib/components/git/repositories.svelte index 28091632c..c1c3eefca 100644 --- a/src/lib/components/git/repositories.svelte +++ b/src/lib/components/git/repositories.svelte @@ -3,7 +3,7 @@ import { Button, InputSearch, InputSelect } from '$lib/elements/forms'; import { timeFromNow } from '$lib/helpers/date'; import { sdk } from '$lib/stores/sdk'; - import { repositories } from '$routes/(console)/project-[project]/functions/function-[function]/store'; + import { repositories } from '$routes/(console)/project-[region]-[project]/functions/function-[function]/store'; import { installation, installations, repository } from '$lib/stores/vcs'; import { Layout, @@ -11,7 +11,6 @@ Typography, Icon, Avatar, - Skeleton, Button as PinkButton } from '@appwrite.io/pink-svelte'; import { IconLockClosed, IconPlus } from '@appwrite.io/pink-icons-svelte'; @@ -20,6 +19,10 @@ import { VCSDetectionType, type Models } from '@appwrite.io/console'; import { getFrameworkIcon } from '$lib/stores/sites'; import { connectGitHub } from '$lib/stores/git'; + import { page } from '$app/state'; + import Card from '../card.svelte'; + import SkeletonRepoList from './skeletonRepoList.svelte'; + import { untrack } from 'svelte'; let { action = $bindable('select'), @@ -41,11 +44,12 @@ let search = $state(''); let selectedInstallation = $state(null); + let isLoadingRepositories = $state(null); async function loadInstallations() { if (installationList) { if (installationList.installations.length) { - selectedInstallation = installationList.installations[0].$id; + untrack(() => (selectedInstallation = installationList.installations[0].$id)); installation.set( installationList.installations.find( (entry) => entry.$id === selectedInstallation @@ -54,9 +58,11 @@ } return installationList.installations; } else { - const { installations } = await sdk.forProject.vcs.listInstallations(); + const { installations } = await sdk + .forProject(page.params.region, page.params.project) + .vcs.listInstallations(); if (installations.length) { - selectedInstallation = installations[0].$id; + untrack(() => (selectedInstallation = installations[0].$id)); installation.set(installations.find((entry) => entry.$id === selectedInstallation)); } return installations; @@ -72,9 +78,6 @@ await fetchRepos(installationId, search); } - $repositories.search = search; - $repositories.installationId = installationId; - if ($repositories.repositories.length && action === 'select') { selectedRepository = $repositories.repositories[0].id; $repository = $repositories.repositories[0]; @@ -85,22 +88,31 @@ async function fetchRepos(installationId: string, search: string) { if (product === 'functions') { $repositories.repositories = ( - (await sdk.forProject.vcs.listRepositories( - installationId, - VCSDetectionType.Runtime, - search || undefined - )) as unknown as Models.ProviderRepositoryRuntimeList + (await sdk + .forProject(page.params.region, page.params.project) + .vcs.listRepositories( + installationId, + VCSDetectionType.Runtime, + search || undefined + )) as unknown as Models.ProviderRepositoryRuntimeList ).runtimeProviderRepositories; //TODO: remove forced cast after backend fixes } else { $repositories.repositories = ( - (await sdk.forProject.vcs.listRepositories( - installationId, - VCSDetectionType.Framework, - search || undefined - )) as unknown as Models.ProviderRepositoryFrameworkList + (await sdk + .forProject(page.params.region, page.params.project) + .vcs.listRepositories( + installationId, + VCSDetectionType.Framework, + search || undefined + )) as unknown as Models.ProviderRepositoryFrameworkList ).frameworkProviderRepositories; } + + $repositories.search = search; + $repositories.installationId = installationId; } + + selectedRepository; {#if hasInstallations} @@ -145,132 +157,145 @@ installation.set( installations.find((entry) => entry.$id === selectedInstallation) ); + + isLoadingRepositories = true; + loadRepositories(selectedInstallation, search).then(() => { + isLoadingRepositories = false; + }); }} bind:value={selectedInstallation} /> - +
{/await}
{#if selectedInstallation} - {#await loadRepositories(selectedInstallation, search)} - - {#each Array(4) as _} - - - - - - - - - - - - - {/each} - - {:then response} - {#if response?.length} - - {#snippet children( - paginatedItems: Models.ProviderRepositoryRuntime[] & - Models.ProviderRepositoryFramework[] - )} - - {#each paginatedItems as repo} - - - - {#if action === 'select'} - repository.set(repo)} - value={repo.id} /> - {/if} - {#if product === 'sites'} - {#if repo?.framework && repo.framework !== 'other'} - + + {#if isLoadingRepositories} + + {:else} + {#await loadRepositories(selectedInstallation, search)} + + {:then response} + {#if response?.length} + + {#snippet children( + paginatedItems: Models.ProviderRepositoryRuntime[] & + Models.ProviderRepositoryFramework[] + )} + + {#each paginatedItems as repo} + + + + {#if action === 'select'} + repository.set(repo)} + value={repo.id} /> + {/if} + {#if product === 'sites'} + {#if repo?.framework && repo.framework !== 'other'} + + + + {:else} + + {/if} + {:else} + {@const iconName = repo?.runtime + ? repo.runtime.split('-')[0] + : undefined} + - {:else} - {/if} - {:else} - {@const iconName = repo?.runtime - ? repo.runtime.split('-')[0] - : undefined} - - - - {/if} - - - {repo.name} - - {#if repo.private} - - {/if} - - - {#if action === 'button'} - connect(repo)}> - Connect - + alignItems="center"> + + {repo.name} + + {#if repo.private} + + {/if} + - {/if} - - - - {/each} - - {/snippet} - - {:else} - - - {#if search} - - {/if} - - - {/if} - {/await} + {#if action === 'button'} + + connect(repo)}> + Connect + + + {/if} + + + + {/each} + + {/snippet} + + {:else if search} + + + {#if search} + + {/if} + + + {:else} + + + + No repositories available + + + + {/if} + {/await} + {/if} {/if} {:else} diff --git a/src/lib/components/git/selectRootModal.svelte b/src/lib/components/git/selectRootModal.svelte index 90fc85aac..4972d58f7 100644 --- a/src/lib/components/git/selectRootModal.svelte +++ b/src/lib/components/git/selectRootModal.svelte @@ -1,4 +1,5 @@ + + + {#each Array(4) as _} + + + + + + + + + + + + + {/each} + diff --git a/src/lib/components/id.svelte b/src/lib/components/id.svelte index 1f0552bb3..e447eb905 100644 --- a/src/lib/components/id.svelte +++ b/src/lib/components/id.svelte @@ -1,12 +1,5 @@ - + + diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts index b20b38d1f..3f451a4bf 100644 --- a/src/lib/components/index.ts +++ b/src/lib/components/index.ts @@ -82,3 +82,5 @@ export { default as BottomSheet } from './bottom-sheet/index'; export { default as Confirm } from './confirm.svelte'; export { default as UsageCard } from './usageCard.svelte'; export { default as ViewToggle } from './viewToggle.svelte'; +export { default as RegionEndpoint } from './regionEndpoint.svelte'; +export { default as ExpirationInput } from './expirationInput.svelte'; diff --git a/src/lib/components/labelCard.svelte b/src/lib/components/labelCard.svelte index 052e2ddd3..366a3ccda 100644 --- a/src/lib/components/labelCard.svelte +++ b/src/lib/components/labelCard.svelte @@ -1,9 +1,24 @@
diff --git a/src/lib/components/menu/store.ts b/src/lib/components/menu/store.ts index 571b30b82..829d2b6e6 100644 --- a/src/lib/components/menu/store.ts +++ b/src/lib/components/menu/store.ts @@ -1,3 +1,17 @@ import { writable } from 'svelte/store'; +import type { createMenubar } from '@melt-ui/svelte'; export const menuOpen = writable(false); + +export const activeMenuId = writable(null); + +/** + * Full menu context passed to submenus — + * includes `builders` and shared `separator`. + */ +export type MenuContext = { + separator: ReturnType< + ReturnType['builders']['createMenu'] + >['elements']['separator']; + builders: ReturnType['builders']['createMenu']>['builders']; +}; diff --git a/src/lib/components/menu/subMenu.svelte b/src/lib/components/menu/subMenu.svelte index 4fa080832..e6e8e326d 100644 --- a/src/lib/components/menu/subMenu.svelte +++ b/src/lib/components/menu/subMenu.svelte @@ -1,15 +1,12 @@ diff --git a/src/lib/components/modalWrapper.svelte b/src/lib/components/modalWrapper.svelte index 73ae9566a..fcbcda6d0 100644 --- a/src/lib/components/modalWrapper.svelte +++ b/src/lib/components/modalWrapper.svelte @@ -6,6 +6,7 @@ export let show = false; export let size: 'small' | 'big' | 'huge' = null; export let closable = true; + export let closeByEscape = true; export let headerDivider = true; export let style = ''; @@ -48,7 +49,7 @@ } function handleKeydown(event: KeyboardEvent) { - if (event.key === 'Escape') { + if (event.key === 'Escape' && closeByEscape) { event.preventDefault(); trackEvent(Click.ModalCloseClick, { from: 'escape' diff --git a/src/lib/components/navbar.svelte b/src/lib/components/navbar.svelte index b5672af48..02ac75d28 100644 --- a/src/lib/components/navbar.svelte +++ b/src/lib/components/navbar.svelte @@ -2,10 +2,20 @@ export type NavbarProject = { name: string; $id: string; + region: string; isSelected: boolean; platformCount: number; pingCount: number; }; + + export type BaseNavbarProps = HTMLAttributes & { + logo: { + src: string; + alt: string; + }; + avatar: string; + sideBarIsOpen: boolean; + }; {#if !hidePages} - + {:else} ; } = $props(); let total = $derived(items.length); - let offset = $state(0); - let paginatedItems = $derived(items.slice(offset, offset + limit)); diff --git a/src/lib/components/permissions/actions.svelte b/src/lib/components/permissions/actions.svelte index 4319e3d74..4bdbb7637 100644 --- a/src/lib/components/permissions/actions.svelte +++ b/src/lib/components/permissions/actions.svelte @@ -12,6 +12,7 @@ export let showTeam: boolean; export let showLabel: boolean; export let showCustom: boolean; + export let hideOnClick: boolean = false; export let groups: Writable>; const dispatch = createEventDispatcher(); @@ -19,31 +20,52 @@ - + dispatch('create', ['any'])}> + on:click={(e) => { + if (hideOnClick) hide(e); + dispatch('create', ['any']); + }}> Any dispatch('create', ['guests'])}> + on:click={(e) => { + if (hideOnClick) hide(e); + dispatch('create', ['guests']); + }}> All guests dispatch('create', ['users'])}> + on:click={(e) => { + if (hideOnClick) hide(e); + dispatch('create', ['users']); + }}> All users - (showUser = true)} - >Select users - (showTeam = true)} - >Select teams - (showLabel = true)} - >Label - (showCustom = true)} - >Custom permission + { + showUser = true; + if (hideOnClick) hide(e); + }}>Select users + { + showTeam = true; + if (hideOnClick) hide(e); + }}>Select teams + { + showLabel = true; + if (hideOnClick) hide(e); + }}>Label + { + showCustom = true; + if (hideOnClick) hide(e); + }}>Custom permission diff --git a/src/lib/components/permissions/permissions.svelte b/src/lib/components/permissions/permissions.svelte index 1dabdb0ba..efefa7f1a 100644 --- a/src/lib/components/permissions/permissions.svelte +++ b/src/lib/components/permissions/permissions.svelte @@ -21,6 +21,7 @@ import type { PinkColumn } from '$lib/helpers/types'; export let withCreate = false; + export let hideOnClick = false; export let permissions: string[] = []; let showUser = false; @@ -127,11 +128,11 @@ } const columns: PinkColumn[] = [ - { id: 'role', width: { min: 100 } }, - { id: 'create', width: { min: 100 }, hide: !withCreate }, - { id: 'read', width: { min: 100 } }, - { id: 'update', width: { min: 100 } }, - { id: 'delete', width: { min: 100 } }, + { id: 'role', width: { min: 80 } }, + { id: 'create', width: { min: 80 }, hide: !withCreate }, + { id: 'read', width: { min: 80 } }, + { id: 'update', width: { min: 80 } }, + { id: 'delete', width: { min: 80 } }, { id: 'action', width: 40 } ]; @@ -195,6 +196,7 @@ bind:showTeam bind:showUser {groups} + {hideOnClick} on:create={create} let:toggle> - - - - Client - Location - IP - - - {#each data.sessions.sessions as session} - {@const browser = getBrowser(session.clientCode)} - - - - {#if session.clientName} -
- {#if browser} - {session.clientName} - {:else} - - {/if} -
-

- {session.clientName} - {session.clientVersion} on {session.osName} - {session.osVersion} -

- {:else} - -

Unknown

- {/if} - -
-
- - {#if session.countryCode !== '--'} - {session.countryName} - {:else} - Unknown - {/if} - - - {session.ip} - - - - -
- {/each} -
- {:else} - - - - - - - - {/if} - - - - diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/attributes/createAttributeDropdown.svelte b/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/attributes/createAttributeDropdown.svelte deleted file mode 100644 index 650da6140..000000000 --- a/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/attributes/createAttributeDropdown.svelte +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - {#each attributeOptions as attribute} - { - selectedOption = attribute.name; - showCreate = true; - }}> - {attribute.name} - - {/each} - - diff --git a/src/routes/(console)/project-[project]/functions/function-[function]/domains/add-domain/+page.ts b/src/routes/(console)/project-[project]/functions/function-[function]/domains/add-domain/+page.ts deleted file mode 100644 index e89c914b0..000000000 --- a/src/routes/(console)/project-[project]/functions/function-[function]/domains/add-domain/+page.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { sdk } from '$lib/stores/sdk'; -import { Query } from '@appwrite.io/console'; -import { RuleTrigger, RuleType } from '$lib/stores/sdk'; -import { Dependencies } from '$lib/constants'; - -export const load = async ({ parent, depends }) => { - const { function: func } = await parent(); - depends(Dependencies.DOMAINS, Dependencies.FUNCTION_DOMAINS); - - const [domains, installations] = await Promise.all([ - sdk.forProject.proxy.listRules([ - Query.equal('type', RuleType.DEPLOYMENT), - Query.equal('trigger', RuleTrigger.MANUAL) - ]), - sdk.forProject.vcs.listInstallations() - ]); - - return { - func, - domains, - installations, - branches: - func?.installationId && func?.providerRepositoryId - ? await sdk.forProject.vcs.listRepositoryBranches( - func.installationId, - func.providerRepositoryId - ) - : undefined - }; -}; diff --git a/src/routes/(console)/project-[project]/functions/function-[function]/domains/add-domain/verify-[domain]/+page.ts b/src/routes/(console)/project-[project]/functions/function-[function]/domains/add-domain/verify-[domain]/+page.ts deleted file mode 100644 index dfaaa1a60..000000000 --- a/src/routes/(console)/project-[project]/functions/function-[function]/domains/add-domain/verify-[domain]/+page.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { sdk } from '$lib/stores/sdk'; -import { Dependencies } from '$lib/constants.js'; -import { isCloud } from '$lib/system'; -import type { Domain, DomainsList } from '$lib/sdk/domains.js'; - -export const load = async ({ parent, depends, params }) => { - depends(Dependencies.DOMAINS); - - let domain: Domain; - let domainsList: DomainsList; - if (isCloud) { - [domain, domainsList] = await Promise.all([ - sdk.forConsole.domains.get(params.domain), - sdk.forConsole.domains.list() - ]); - } - - return { - domain, - domainsList - }; -}; diff --git a/src/routes/(console)/project-[project]/functions/function-[function]/executions/sheet.svelte b/src/routes/(console)/project-[project]/functions/function-[function]/executions/sheet.svelte deleted file mode 100644 index ee525786a..000000000 --- a/src/routes/(console)/project-[project]/functions/function-[function]/executions/sheet.svelte +++ /dev/null @@ -1,169 +0,0 @@ - - - (open = false)} /> - - -
- - - Execution ID - - {selectedLog?.$id} - - - - - - - -
- {#if selectedLog} - - - - - - - Method - - - {selectedLog.requestMethod} - - - - - Status code - - - = 400 - ? 'error' - : selectedLog.responseStatusCode === 0 - ? undefined - : 'success'} /> - - - - - Status - - - -
- - -
- - {`Scheduled to execute on ${toLocaleDateTime(selectedLog.scheduledAt)}`} - -
-
- - - - Triggered by - - - {capitalize(selectedLog.trigger)} - - - - - - Duration - - - {calculateTime(selectedLog.duration)} - - - - - - Created - - - {capitalize(timeFromNow(selectedLog.$createdAt))} - - -
- - - Path - -
- -
-
-
-
- - - - - - -
- {/if} -
diff --git a/src/routes/(console)/project-[project]/messaging/providers/create.svelte b/src/routes/(console)/project-[project]/messaging/providers/create.svelte deleted file mode 100644 index f5afa33bf..000000000 --- a/src/routes/(console)/project-[project]/messaging/providers/create.svelte +++ /dev/null @@ -1,168 +0,0 @@ - - - diff --git a/src/routes/(console)/project-[project]/messaging/providers/provider-[provider]/updateSettings.svelte b/src/routes/(console)/project-[project]/messaging/providers/provider-[provider]/updateSettings.svelte deleted file mode 100644 index 3968cf185..000000000 --- a/src/routes/(console)/project-[project]/messaging/providers/provider-[provider]/updateSettings.svelte +++ /dev/null @@ -1,242 +0,0 @@ - - -
- - Settings - Configure the settings to to send {message}, or to complete the provider - settings. - - - {#if ready} - - {/if} - - - -
- -
-
-
-
- - diff --git a/src/routes/(console)/project-[project]/messaging/providers/wizard/settings.svelte b/src/routes/(console)/project-[project]/messaging/providers/wizard/settings.svelte deleted file mode 100644 index c3743f027..000000000 --- a/src/routes/(console)/project-[project]/messaging/providers/wizard/settings.svelte +++ /dev/null @@ -1,181 +0,0 @@ - - - - Settings - - Set up the credentials below to enable {providers[$providerType].providers[$provider].title} - for sending - {providers[$providerType].text}. - - - - -
-

Need a hand?

- -
- {#if providers[$providerType].providers[$provider].needAHand} - {@const needAHand = providers[$providerType].providers[$provider].needAHand} -
- - - -
-
- -
- How to enable {getProviderText($provider)} - {#if $providerType == MessagingProviderType.Push}notifications{:else}{getProviderText( - $provider - )}{/if} service? -
-
-
- {#each needAHand as p} -

- {@html p} -

- {/each} -
-
-
-
-
- {/if} - - - -
-
-
- -
-

Read the full guide in the documentation

-
- -
-
- ($newMemberModal = true)}> -
-
-
- -
-

Invite a team member to complete this step

-
- -
-
-
-
-
-
- - - - diff --git a/src/routes/(console)/project-[project]/overview/keys/+page.svelte b/src/routes/(console)/project-[project]/overview/keys/+page.svelte deleted file mode 100644 index 561364ae7..000000000 --- a/src/routes/(console)/project-[project]/overview/keys/+page.svelte +++ /dev/null @@ -1,50 +0,0 @@ - - -{#if data.keys.total} - - - Name - Last accessed - Expiration date - Scopes - - {#each data.keys.keys as key} - - - {key.name} - - - {key.accessedAt ? toLocaleDate(key.accessedAt) : 'never'} - - - {key.expire ? toLocaleDateTime(key.expire) : 'never'} - - - {key.scopes.length} Scopes - - - {/each} - -{:else} - goto(`${base}/project-${page.params.project}/overview/keys/create`)} /> -{/if} 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 deleted file mode 100644 index b9dbf675e..000000000 --- a/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte +++ /dev/null @@ -1,165 +0,0 @@ - - - - API key - Appwrite - - - - {@const accessedAt = $key.accessedAt ? toLocaleDate($key.accessedAt) : 'never'} - - {$key.name} - -

- Last accessed: {accessedAt}
- Scopes granted: {$key.scopes.length} -

-
-
- - - API key secret - - - - - -
- - Name - Choose any name that will help you distinguish between API keys. - - - - - - - - -
-
- - Scopes - You can choose which permission scope to grant your application. It is a best practice to - allow only the permissions you need to meet your project goals. - - {#if scopes !== null} - - {/if} - - - - - - -
- - - - - Delete API key - The API key will be permanently deleted. This action is irreversible. - - -
-
-
{$key.name}
-

Last accessed: {accessedAt}

-
-
-
-
- - - - -
-
- - diff --git a/src/routes/(console)/project-[project]/overview/keys/[key]/updateExpirationDate.svelte b/src/routes/(console)/project-[project]/overview/keys/[key]/updateExpirationDate.svelte deleted file mode 100644 index 5595ea2b2..000000000 --- a/src/routes/(console)/project-[project]/overview/keys/[key]/updateExpirationDate.svelte +++ /dev/null @@ -1,75 +0,0 @@ - - -
- - Expiration date - Set a date after which your API key will expire. - - {#if isExpired} - (alertsDismissed = true)} - title="Your API key has expired"> - For security reasons, we recommend you delete your expired key and create a new - one. - - {:else if isExpiring} - (alertsDismissed = true)} - title="Your API key is about to expire"> - Update the expiration date to keep the key active - - {/if} - - - - - - - -
diff --git a/src/routes/(console)/project-[project]/overview/platforms/wizard/step4.svelte b/src/routes/(console)/project-[project]/overview/platforms/wizard/step4.svelte deleted file mode 100644 index 96821680e..000000000 --- a/src/routes/(console)/project-[project]/overview/platforms/wizard/step4.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - - - All set -

- {#if isFirstProject} - Congratulations on adding the first platform to your project! Start exploring by - creating users, adding a database to your project, or uploading files to a bucket. - {:else} - Congratulations on adding another platform to your project! Start building by adding a - database, uploading files to a bucket and more via your dashboard. - {/if} -

-
diff --git a/src/routes/(console)/project-[project]/overview/store.ts b/src/routes/(console)/project-[project]/overview/store.ts deleted file mode 100644 index 2c18cefa9..000000000 --- a/src/routes/(console)/project-[project]/overview/store.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { sdk } from '$lib/stores/sdk'; -import { cachedStore } from '$lib/helpers/cache'; -import { writable, type Writable } from 'svelte/store'; -import type { Models, ProjectUsageRange } from '@appwrite.io/console'; - -export const usage = cachedStore< - Models.UsageProject, - { - load: (start: string, end: string, period: ProjectUsageRange) => Promise; - } ->('projectUsage', function ({ set }) { - return { - load: async (start, end, period) => { - const usages = await sdk.forProject.project.getUsage(start, end, period); - set(usages); - } - }; -}); - -export const selectedTab: Writable<'platforms' | 'keys'> = writable('platforms'); diff --git a/src/routes/(console)/project-[project]/settings/domains/add-domain/+page.ts b/src/routes/(console)/project-[project]/settings/domains/add-domain/+page.ts deleted file mode 100644 index cd583fe6b..000000000 --- a/src/routes/(console)/project-[project]/settings/domains/add-domain/+page.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Query } from '@appwrite.io/console'; -import { sdk } from '$lib/stores/sdk'; -import { RuleTrigger, RuleType } from '$lib/stores/sdk'; -import { Dependencies } from '$lib/constants.js'; - -export const load = async ({ depends }) => { - depends(Dependencies.DOMAINS); - - const [rules] = await Promise.all([ - sdk.forProject.proxy.listRules([ - Query.equal('type', RuleType.API), - Query.equal('trigger', RuleTrigger.MANUAL) - ]) - ]); - - return { - rules - }; -}; diff --git a/src/routes/(console)/project-[project]/settings/domains/add-domain/verify-[domain]/+page.svelte b/src/routes/(console)/project-[project]/settings/domains/add-domain/verify-[domain]/+page.svelte deleted file mode 100644 index b70833e06..000000000 --- a/src/routes/(console)/project-[project]/settings/domains/add-domain/verify-[domain]/+page.svelte +++ /dev/null @@ -1,95 +0,0 @@ - - - -
- - - - - - - - {page.params.domain} - - - - - - - - - -
- -
-
-
-
-
-
diff --git a/src/routes/(console)/project-[project]/settings/domains/add-domain/verify-[domain]/+page.ts b/src/routes/(console)/project-[project]/settings/domains/add-domain/verify-[domain]/+page.ts deleted file mode 100644 index dfaaa1a60..000000000 --- a/src/routes/(console)/project-[project]/settings/domains/add-domain/verify-[domain]/+page.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { sdk } from '$lib/stores/sdk'; -import { Dependencies } from '$lib/constants.js'; -import { isCloud } from '$lib/system'; -import type { Domain, DomainsList } from '$lib/sdk/domains.js'; - -export const load = async ({ parent, depends, params }) => { - depends(Dependencies.DOMAINS); - - let domain: Domain; - let domainsList: DomainsList; - if (isCloud) { - [domain, domainsList] = await Promise.all([ - sdk.forConsole.domains.get(params.domain), - sdk.forConsole.domains.list() - ]); - } - - return { - domain, - domainsList - }; -}; diff --git a/src/routes/(console)/project-[project]/settings/domains/add-domain/verify-[domain]/verificationFieldset.svelte b/src/routes/(console)/project-[project]/settings/domains/add-domain/verify-[domain]/verificationFieldset.svelte deleted file mode 100644 index 5ec97049e..000000000 --- a/src/routes/(console)/project-[project]/settings/domains/add-domain/verify-[domain]/verificationFieldset.svelte +++ /dev/null @@ -1,45 +0,0 @@ - - -
- -
- - {#if isSubDomain} - (selectedTab = 'cname')} - active={selectedTab === 'cname'}> - CNAME - - {/if} - {#if isCloud} - (selectedTab = 'nameserver')} - active={selectedTab === 'nameserver'}> - Nameservers - - {/if} - - -
- {#if selectedTab === 'cname' && isSubDomain} - - {:else if isCloud} - - {/if} - -
-
diff --git a/src/routes/(console)/project-[project]/sites/create-site/+layout.ts b/src/routes/(console)/project-[project]/sites/create-site/+layout.ts deleted file mode 100644 index 30593d956..000000000 --- a/src/routes/(console)/project-[project]/sites/create-site/+layout.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { sdk } from '$lib/stores/sdk'; - -export const load = async () => { - const [installations, frameworks] = await Promise.all([ - sdk.forProject.vcs.listInstallations(), - sdk.forProject.sites.listFrameworks() - ]); - return { - installations, - frameworks - }; -}; diff --git a/src/routes/(console)/project-[project]/sites/create-site/finish/+page.ts b/src/routes/(console)/project-[project]/sites/create-site/finish/+page.ts deleted file mode 100644 index 3fff8af30..000000000 --- a/src/routes/(console)/project-[project]/sites/create-site/finish/+page.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { RuleType, sdk } from '$lib/stores/sdk'; -import { error } from '@sveltejs/kit'; -import { Query } from '@appwrite.io/console'; -import { Dependencies } from '$lib/constants'; -import { DeploymentResourceType } from '$lib/stores/sdk'; - -export const load = async ({ url, depends }) => { - depends(Dependencies.SITE); - if (!url.searchParams.has('site')) error(404, 'Deployment is not optional'); - const siteId = url.searchParams.get('site'); - const site = await sdk.forProject.sites.get(siteId); - const proxyRuleList = await sdk.forProject.proxy.listRules([ - Query.equal('type', RuleType.DEPLOYMENT), - Query.equal('deploymentResourceType', DeploymentResourceType.SITE), - Query.equal('deploymentResourceId', siteId), - Query.equal('deploymentId', site.deploymentId) - ]); - return { - site, - deployment: await sdk.forProject.sites.getDeployment(siteId, site.deploymentId), - proxyRuleList - }; -}; diff --git a/src/routes/(console)/project-[project]/sites/create-site/manual/+page.ts b/src/routes/(console)/project-[project]/sites/create-site/manual/+page.ts deleted file mode 100644 index d5a966f74..000000000 --- a/src/routes/(console)/project-[project]/sites/create-site/manual/+page.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { sdk } from '$lib/stores/sdk'; - -export const load = async ({ parent }) => { - const { frameworks } = await parent(); - - return { - frameworks, - template: await sdk.forProject.sites.getTemplate('starter-for-js') - }; -}; diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/+page.ts b/src/routes/(console)/project-[project]/sites/site-[site]/+page.ts deleted file mode 100644 index 1aebb9875..000000000 --- a/src/routes/(console)/project-[project]/sites/site-[site]/+page.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { sdk } from '$lib/stores/sdk'; -import { Dependencies } from '$lib/constants'; -import { Query } from '@appwrite.io/console'; -import { RuleType } from '$lib/stores/sdk'; -import { DeploymentResourceType } from '$lib/stores/sdk'; - -export const load = async ({ params, depends, parent }) => { - depends(Dependencies.SITE); - depends(Dependencies.SITES_DOMAINS); - const { site } = await parent(); - - const [deploymentList, prodReadyDeployments, proxyRuleList] = await Promise.all([ - sdk.forProject.sites.listDeployments(params.site, [Query.limit(4), Query.orderDesc('')]), - sdk.forProject.sites.listDeployments(params.site, [ - Query.equal('status', 'ready'), - Query.equal('activate', true), - Query.orderDesc('') - ]), - sdk.forProject.proxy.listRules([ - Query.equal('type', RuleType.DEPLOYMENT), - Query.equal('deploymentResourceType', DeploymentResourceType.SITE), - Query.equal('deploymentResourceId', site.$id), - Query.equal('deploymentId', site.deploymentId), - Query.orderDesc('') - ]) - ]); - - const deployment = deploymentList?.total - ? await sdk.forProject.sites.getDeployment(params.site, site.deploymentId) - : null; - return { - site, - deploymentList, - deployment, - proxyRuleList, - prodReadyDeployments, - hasProdReadyDeployments: - prodReadyDeployments?.deployments?.filter((d) => d?.$id !== deployment?.$id).length > 0 - }; -}; diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/domains/add-domain/+page.ts b/src/routes/(console)/project-[project]/sites/site-[site]/domains/add-domain/+page.ts deleted file mode 100644 index 76275be7a..000000000 --- a/src/routes/(console)/project-[project]/sites/site-[site]/domains/add-domain/+page.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Query } from '@appwrite.io/console'; -import { sdk } from '$lib/stores/sdk'; -import { RuleTrigger, RuleType } from '$lib/stores/sdk'; -import { Dependencies } from '$lib/constants.js'; - -export const load = async ({ parent, depends }) => { - const { site } = await parent(); - depends(Dependencies.DOMAINS, Dependencies.SITES_DOMAINS); - - const [rules, installations] = await Promise.all([ - sdk.forProject.proxy.listRules([ - Query.equal('type', RuleType.DEPLOYMENT), - Query.equal('trigger', RuleTrigger.MANUAL) - ]), - sdk.forProject.vcs.listInstallations() - ]); - - return { - site, - rules, - installations, - branches: - site?.installationId && site?.providerRepositoryId - ? await sdk.forProject.vcs.listRepositoryBranches( - site.installationId, - site.providerRepositoryId - ) - : undefined - }; -}; diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.ts b/src/routes/(console)/project-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.ts deleted file mode 100644 index db8caef3a..000000000 --- a/src/routes/(console)/project-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { sdk } from '$lib/stores/sdk'; -import { Dependencies } from '$lib/constants.js'; -import { isCloud } from '$lib/system'; -import type { Domain, DomainsList } from '$lib/sdk/domains.js'; - -export const load = async ({ parent, depends, params }) => { - const { site } = await parent(); - depends(Dependencies.DOMAINS); - - let domain: Domain; - let domainsList: DomainsList; - if (isCloud) { - [domain, domainsList] = await Promise.all([ - sdk.forConsole.domains.get(params.domain), - sdk.forConsole.domains.list() - ]); - } - - return { - site, - domain, - domainsList - }; -}; diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/logs/sheet.svelte b/src/routes/(console)/project-[project]/sites/site-[site]/logs/sheet.svelte deleted file mode 100644 index 7026fbd02..000000000 --- a/src/routes/(console)/project-[project]/sites/site-[site]/logs/sheet.svelte +++ /dev/null @@ -1,135 +0,0 @@ - - - (open = false)} /> - - -
- - - Log ID - - {selectedLog?.$id} - - - - - - - -
- {#if selectedLog} - - - - - - - - Method - - - {selectedLog.requestMethod} - - - - - Status code - - - = 400 - ? 'error' - : 'success'} /> - - - - - Duration - - - {calculateTime(selectedLog.duration)} - - - - - Created - - - {capitalize(timeFromNow(selectedLog.$createdAt))} - - - - - - - - Path - -
- -
-
-
-
- - - - - - -
- {/if} -
diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/logs/table.svelte b/src/routes/(console)/project-[project]/sites/site-[site]/logs/table.svelte deleted file mode 100644 index d87008b87..000000000 --- a/src/routes/(console)/project-[project]/sites/site-[site]/logs/table.svelte +++ /dev/null @@ -1,62 +0,0 @@ - - - - - {#each filteredColumns as { id, title }} - {title} - {/each} - - {#each logs.executions as log} - { - e.stopPropagation(); - openSheet = true; - selectedLogId = log.$id; - }}> - {#each filteredColumns as column} - - {#if column.id === '$id'} - {#key column.id} - {log.$id} - {/key} - {:else if column.id === 'requestMethod'} - - {log.requestMethod} - - {:else if column.id === 'responseStatusCode'} -
- = 400 ? 'error' : 'success'} - content={log.responseStatusCode.toString()} /> -
- {:else if column.id === 'requestPath'} - - {log.requestPath} - - {:else if column.id === '$createdAt'} - - {/if} -
- {/each} -
- {/each} -
- - 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 deleted file mode 100644 index 7e80dde84..000000000 --- a/src/routes/(console)/project-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte +++ /dev/null @@ -1,177 +0,0 @@ - - - - {#if $file} - - - -
-

Filename: {$file.name}

-

MIME type: {$file.mimeType}

-

Size: {calculateSize($file.sizeOriginal)}

-

Created: {toLocaleDate($file.$createdAt)}

-

- Last updated: - {toLocaleDate($file.$updatedAt)} -

-
- -
- - - - -
- - - Permissions - Assign read or write permissions at the bucket level or file level. If bucket level permissions - are enabled, file permissions will be ignored. - - {#if $bucket.fileSecurity} - {#if showFileAlert} - - - Users will be able to access this file if they have been granted either File or Bucket permissions. - - - - {/if} - - {:else} - - - If you want to assign document permissions. Go to Bucket settings and - enable file security. Otherwise, only Bucket permissions will be used. - - - {/if} - - - - - - - - - Delete file - The file will be permanently deleted. This action is irreversible. - - - -
{$file.name}
-
-

- Last updated: {toLocaleDateTime($file.$updatedAt)} -

-
-
- - - - -
- {/if} -
- - diff --git a/src/routes/(console)/project-[project]/+error.svelte b/src/routes/(console)/project-[region]-[project]/+error.svelte similarity index 100% rename from src/routes/(console)/project-[project]/+error.svelte rename to src/routes/(console)/project-[region]-[project]/+error.svelte diff --git a/src/routes/(console)/project-[project]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/+layout.svelte similarity index 70% rename from src/routes/(console)/project-[project]/+layout.svelte rename to src/routes/(console)/project-[region]-[project]/+layout.svelte index 8aa3c635a..0254a8cdc 100644 --- a/src/routes/(console)/project-[project]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/+layout.svelte @@ -1,6 +1,6 @@ @@ -75,7 +75,9 @@ {/each} {#each data.users.users as user} - + {#each $columns as { id } (id)} {#if id === '$id'} @@ -160,8 +162,10 @@ total={data.users.total} /> {:else if data.search} - + {:else} { +export const load: PageLoad = async ({ url, route, params }) => { const page = getPage(url); const search = getSearch(url); const limit = getLimit(url, route, PAGE_LIMIT); @@ -20,9 +20,8 @@ export const load: PageLoad = async ({ url, route }) => { limit, search, page, - users: await sdk.forProject.users.list( - [Query.limit(limit), Query.offset(offset), Query.orderDesc('')], - search - ) + users: await sdk + .forProject(params.region, params.project) + .users.list([Query.limit(limit), Query.offset(offset), Query.orderDesc('')], search) }; }; diff --git a/src/routes/(console)/project-[project]/auth/breadcrumbs.svelte b/src/routes/(console)/project-[region]-[project]/auth/breadcrumbs.svelte similarity index 76% rename from src/routes/(console)/project-[project]/auth/breadcrumbs.svelte rename to src/routes/(console)/project-[region]-[project]/auth/breadcrumbs.svelte index 7fe41fa7c..db806d038 100644 --- a/src/routes/(console)/project-[project]/auth/breadcrumbs.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/breadcrumbs.svelte @@ -10,11 +10,11 @@ title: $organization?.name }, { - href: `${base}/project-${$project?.$id}`, + href: `${base}/project-${$project.region}-${$project?.$id}`, title: $project?.name }, { - href: `${base}/project-${$project?.$id}/auth`, + href: `${base}/project-${$project.region}-${$project?.$id}/auth`, title: 'Auth' } ]; diff --git a/src/routes/(console)/project-[project]/auth/createTeam.svelte b/src/routes/(console)/project-[region]-[project]/auth/createTeam.svelte similarity index 91% rename from src/routes/(console)/project-[project]/auth/createTeam.svelte rename to src/routes/(console)/project-[region]-[project]/auth/createTeam.svelte index 0f3d87ad9..dc7bd0cdc 100644 --- a/src/routes/(console)/project-[project]/auth/createTeam.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/createTeam.svelte @@ -1,4 +1,5 @@ @@ -55,7 +55,7 @@ {#each data.teams.teams as team} + href={`${base}/project-${region}-${project}/auth/teams/team-${team.$id}`}> @@ -79,7 +79,7 @@ total={data.teams.total} /> {:else if data.search} - diff --git a/src/routes/(console)/project-[project]/auth/teams/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/teams/+page.ts similarity index 67% rename from src/routes/(console)/project-[project]/auth/teams/+page.ts rename to src/routes/(console)/project-[region]-[project]/auth/teams/+page.ts index 869168532..3f9e01793 100644 --- a/src/routes/(console)/project-[project]/auth/teams/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/auth/teams/+page.ts @@ -4,7 +4,7 @@ import { getLimit, getPage, getSearch, pageToOffset } from '$lib/helpers/load'; import { PAGE_LIMIT } from '$lib/constants'; import type { PageLoad } from './$types'; -export const load: PageLoad = async ({ url, route }) => { +export const load: PageLoad = async ({ url, route, params }) => { const page = getPage(url); const search = getSearch(url); const limit = getLimit(url, route, PAGE_LIMIT); @@ -15,9 +15,8 @@ export const load: PageLoad = async ({ url, route }) => { limit, search, page, - teams: await sdk.forProject.teams.list( - [Query.limit(limit), Query.offset(offset), Query.orderDesc('')], - search - ) + teams: await sdk + .forProject(params.region, params.project) + .teams.list([Query.limit(limit), Query.offset(offset), Query.orderDesc('')], search) }; }; diff --git a/src/routes/(console)/project-[project]/auth/teams/team-[team]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/+layout.svelte similarity index 100% rename from src/routes/(console)/project-[project]/auth/teams/team-[team]/+layout.svelte rename to src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/+layout.svelte diff --git a/src/routes/(console)/project-[project]/auth/teams/team-[team]/+layout.ts b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/+layout.ts similarity index 84% rename from src/routes/(console)/project-[project]/auth/teams/team-[team]/+layout.ts rename to src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/+layout.ts index 6aabf0760..1134e2cf8 100644 --- a/src/routes/(console)/project-[project]/auth/teams/team-[team]/+layout.ts +++ b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/+layout.ts @@ -11,7 +11,7 @@ export const load: LayoutLoad = async ({ params, depends }) => { return { header: Header, breadcrumbs: Breadcrumbs, - team: await sdk.forProject.teams.get(params.team) + team: await sdk.forProject(params.region, params.project).teams.get(params.team) }; } catch (e) { error(e.code, e.message); diff --git a/src/routes/(console)/project-[project]/auth/teams/team-[team]/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/+page.svelte similarity index 100% rename from src/routes/(console)/project-[project]/auth/teams/team-[team]/+page.svelte rename to src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/+page.svelte diff --git a/src/routes/(console)/project-[project]/auth/teams/team-[team]/activity/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/activity/+page.svelte similarity index 100% rename from src/routes/(console)/project-[project]/auth/teams/team-[team]/activity/+page.svelte rename to src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/activity/+page.svelte diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/activity/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/activity/+page.ts similarity index 75% rename from src/routes/(console)/project-[project]/auth/user-[user]/activity/+page.ts rename to src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/activity/+page.ts index 103be41a4..7b33b57e8 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/activity/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/activity/+page.ts @@ -8,12 +8,12 @@ export const load: PageLoad = async ({ params, url, route }) => { const page = getPage(url); const limit = getLimit(url, route, PAGE_LIMIT); const offset = pageToOffset(page, limit); + return { offset, limit, - logs: await sdk.forProject.users.listLogs(params.user, [ - Query.limit(limit), - Query.offset(offset) - ]) + logs: await sdk + .forProject(params.region, params.project) + .teams.listLogs(params.team, [Query.limit(limit), Query.offset(offset)]) }; }; diff --git a/src/routes/(console)/project-[project]/auth/teams/team-[team]/breadcrumbs.svelte b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/breadcrumbs.svelte similarity index 65% rename from src/routes/(console)/project-[project]/auth/teams/team-[team]/breadcrumbs.svelte rename to src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/breadcrumbs.svelte index 3a0eada37..3605cca75 100644 --- a/src/routes/(console)/project-[project]/auth/teams/team-[team]/breadcrumbs.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/breadcrumbs.svelte @@ -1,5 +1,6 @@ @@ -91,7 +92,7 @@ @@ -102,11 +103,13 @@ Email templates Use templates to send and process account management emails. - + Learn more - + - Send an email to users that sign in with a magic URL. - + + + Send an email to users that sign in with a magic URL. + + + - Send an email to users that sign in with a email OTP. - + + + Send an email to users that sign in with a email OTP. + + - Send a recovery email to users that forget their password. - + + + Send a recovery email to users that forget their password. + - Send an invitation email to become a member of your project. - + + + Send an invitation email to become a member of your project. + + - Send a two-factor authentication email to a user. - + + + Send a two-factor authentication email to a user. + - Send an email to users when a new session is created. - + + + Send an email to users when a new session is created. + - diff --git a/src/routes/(console)/project-[region]-[project]/auth/templates/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/templates/+page.ts new file mode 100644 index 000000000..e759c57b4 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/auth/templates/+page.ts @@ -0,0 +1,8 @@ +import { sdk } from '$lib/stores/sdk'; + +export const load = async ({ params }) => { + const codes = await sdk.forProject(params.region, params.project).locale.listCodes(); + return { + localeCodes: codes.localeCodes + }; +}; diff --git a/src/routes/(console)/project-[project]/auth/templates/email-footer-dark.png b/src/routes/(console)/project-[region]-[project]/auth/templates/email-footer-dark.png similarity index 100% rename from src/routes/(console)/project-[project]/auth/templates/email-footer-dark.png rename to src/routes/(console)/project-[region]-[project]/auth/templates/email-footer-dark.png diff --git a/src/routes/(console)/project-[project]/auth/templates/email-footer-light.png b/src/routes/(console)/project-[region]-[project]/auth/templates/email-footer-light.png similarity index 100% rename from src/routes/(console)/project-[project]/auth/templates/email-footer-light.png rename to src/routes/(console)/project-[region]-[project]/auth/templates/email-footer-light.png diff --git a/src/routes/(console)/project-[project]/auth/templates/email-footer-mobile-dark.png b/src/routes/(console)/project-[region]-[project]/auth/templates/email-footer-mobile-dark.png similarity index 100% rename from src/routes/(console)/project-[project]/auth/templates/email-footer-mobile-dark.png rename to src/routes/(console)/project-[region]-[project]/auth/templates/email-footer-mobile-dark.png diff --git a/src/routes/(console)/project-[project]/auth/templates/email-footer-mobile-light.png b/src/routes/(console)/project-[region]-[project]/auth/templates/email-footer-mobile-light.png similarity index 100% rename from src/routes/(console)/project-[project]/auth/templates/email-footer-mobile-light.png rename to src/routes/(console)/project-[region]-[project]/auth/templates/email-footer-mobile-light.png diff --git a/src/routes/(console)/project-[project]/auth/templates/email2FATemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/email2FATemplate.svelte similarity index 73% rename from src/routes/(console)/project-[project]/auth/templates/email2FATemplate.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/email2FATemplate.svelte index 8eaf565f4..225df1882 100644 --- a/src/routes/(console)/project-[project]/auth/templates/email2FATemplate.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/templates/email2FATemplate.svelte @@ -7,7 +7,7 @@ import { addNotification } from '$lib/stores/notifications'; import { Id } from '$lib/components'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { Layout } from '@appwrite.io/pink-svelte'; + import { Layout, Card } from '@appwrite.io/pink-svelte'; const projectId = page.params.project; let locale = 'en'; @@ -35,11 +35,13 @@ } - - - - {'{{user}}'} - {'{{project}}'} - {'{{otp}}'} - - + + + + + {'{{user}}'} + {'{{project}}'} + {'{{otp}}'} + + + diff --git a/src/routes/(console)/project-[project]/auth/templates/emailInviteTemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/emailInviteTemplate.svelte similarity index 71% rename from src/routes/(console)/project-[project]/auth/templates/emailInviteTemplate.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/emailInviteTemplate.svelte index ba8d478ee..d645ec80d 100644 --- a/src/routes/(console)/project-[project]/auth/templates/emailInviteTemplate.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/templates/emailInviteTemplate.svelte @@ -7,7 +7,7 @@ import { addNotification } from '$lib/stores/notifications'; import { Id } from '$lib/components'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { Layout } from '@appwrite.io/pink-svelte'; + import { Layout, Card } from '@appwrite.io/pink-svelte'; const projectId = page.params.project; let locale = 'en'; @@ -35,12 +35,14 @@ } - - - - {'{{team}}'} - {'{{user}}'} - {'{{project}}'} - {'{{redirect}}'} - - + + + + + {'{{team}}'} + {'{{user}}'} + {'{{project}}'} + {'{{redirect}}'} + + + diff --git a/src/routes/(console)/project-[project]/auth/templates/emailMagicUrlTemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/emailMagicUrlTemplate.svelte similarity index 73% rename from src/routes/(console)/project-[project]/auth/templates/emailMagicUrlTemplate.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/emailMagicUrlTemplate.svelte index 748304d14..56189ce42 100644 --- a/src/routes/(console)/project-[project]/auth/templates/emailMagicUrlTemplate.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/templates/emailMagicUrlTemplate.svelte @@ -7,7 +7,7 @@ import { addNotification } from '$lib/stores/notifications'; import { Id } from '$lib/components'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { Layout } from '@appwrite.io/pink-svelte'; + import { Layout, Card } from '@appwrite.io/pink-svelte'; const projectId = page.params.project; @@ -37,11 +37,13 @@ } - - - - {'{{user}}'} - {'{{project}}'} - {'{{redirect}}'} - - + + + + + {'{{user}}'} + {'{{project}}'} + {'{{redirect}}'} + + + diff --git a/src/routes/(console)/project-[project]/auth/templates/emailRecoveryTemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/emailRecoveryTemplate.svelte similarity index 73% rename from src/routes/(console)/project-[project]/auth/templates/emailRecoveryTemplate.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/emailRecoveryTemplate.svelte index 891d2e52f..44c8fae42 100644 --- a/src/routes/(console)/project-[project]/auth/templates/emailRecoveryTemplate.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/templates/emailRecoveryTemplate.svelte @@ -7,7 +7,7 @@ import { addNotification } from '$lib/stores/notifications'; import { Id } from '$lib/components'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { Layout } from '@appwrite.io/pink-svelte'; + import { Layout, Card } from '@appwrite.io/pink-svelte'; const projectId = page.params.project; @@ -36,11 +36,13 @@ } - - - - {'{{user}}'} - {'{{project}}'} - {'{{redirect}}'} - - + + + + + {'{{user}}'} + {'{{project}}'} + {'{{redirect}}'} + + + diff --git a/src/routes/(console)/project-[project]/auth/templates/emailSessionAlertTemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/emailSessionAlertTemplate.svelte similarity index 68% rename from src/routes/(console)/project-[project]/auth/templates/emailSessionAlertTemplate.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/emailSessionAlertTemplate.svelte index e9629ffc1..c474f1a74 100644 --- a/src/routes/(console)/project-[project]/auth/templates/emailSessionAlertTemplate.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/templates/emailSessionAlertTemplate.svelte @@ -7,7 +7,7 @@ import { addNotification } from '$lib/stores/notifications'; import { Id } from '$lib/components'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { Layout } from '@appwrite.io/pink-svelte'; + import { Layout, Card } from '@appwrite.io/pink-svelte'; const projectId = page.params.project; let locale = 'en'; @@ -35,13 +35,15 @@ } - - - - {'{{user}}'} - {'{{project}}'} - {'{{device}}'} - {'{{ipAddress}}'} - {'{{country}}'} - - + + + + + {'{{user}}'} + {'{{project}}'} + {'{{device}}'} + {'{{ipAddress}}'} + {'{{country}}'} + + + diff --git a/src/routes/(console)/project-[project]/auth/templates/emailSignature.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/emailSignature.svelte similarity index 99% rename from src/routes/(console)/project-[project]/auth/templates/emailSignature.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/emailSignature.svelte index e99af4250..4c463b0c6 100644 --- a/src/routes/(console)/project-[project]/auth/templates/emailSignature.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/templates/emailSignature.svelte @@ -15,7 +15,7 @@ Enable or disable Appwrite branding in your email template signature. - +
{#if $app.themeInUse === 'dark'} diff --git a/src/routes/(console)/project-[project]/auth/templates/emailTemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/emailTemplate.svelte similarity index 53% rename from src/routes/(console)/project-[project]/auth/templates/emailTemplate.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/emailTemplate.svelte index 90cac844c..d36351a95 100644 --- a/src/routes/(console)/project-[project]/auth/templates/emailTemplate.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/templates/emailTemplate.svelte @@ -8,7 +8,7 @@ import deepEqual from 'deep-equal'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; import type { EmailTemplateLocale, EmailTemplateType } from '@appwrite.io/console'; - import { Card, Icon, Layout, Tooltip, Typography } from '@appwrite.io/pink-svelte'; + import { Icon, Layout, Tooltip, Typography } from '@appwrite.io/pink-svelte'; import { IconInfo } from '@appwrite.io/pink-icons-svelte'; export let loading = false; @@ -83,74 +83,72 @@ $: isSmtpEnabled = $project?.smtpEnabled; - - {#if loading} -
-
-

Loading template...

-
- {/if} -
-
- - - - - {#if $$slots.default} -

- Click to copy variables for the fields below. Learn more here. -

- - - - {/if} - - - - - - - Set up an SMTP server to edit the message body - - - -
-
-
- - -
-
+{#if loading} +
+
+

Loading template...

- +{/if} +
+
+ + + + + {#if $$slots.default} +

+ Click to copy variables for the fields below. Learn more here. +

+ + + + {/if} + + + + + + + Set up an SMTP server to edit the message body + + + +
+
+
+ + +
+
+
diff --git a/src/routes/(console)/project-[project]/auth/templates/emailVerificationTemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/emailVerificationTemplate.svelte similarity index 73% rename from src/routes/(console)/project-[project]/auth/templates/emailVerificationTemplate.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/emailVerificationTemplate.svelte index 357e87bbb..0bc34c9b6 100644 --- a/src/routes/(console)/project-[project]/auth/templates/emailVerificationTemplate.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/templates/emailVerificationTemplate.svelte @@ -7,7 +7,7 @@ import { Id } from '$lib/components'; import { addNotification } from '$lib/stores/notifications'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { Layout } from '@appwrite.io/pink-svelte'; + import { Layout, Card } from '@appwrite.io/pink-svelte'; const projectId = page.params.project; @@ -36,11 +36,13 @@ } - - - - {'{{user}}'} - {'{{project}}'} - {'{{redirect}}'} - - + + + + + {'{{user}}'} + {'{{project}}'} + {'{{redirect}}'} + + + diff --git a/src/routes/(console)/project-[region]-[project]/auth/templates/localeOptions.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/localeOptions.svelte new file mode 100644 index 000000000..4c4c334ca --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/auth/templates/localeOptions.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/routes/(console)/project-[project]/auth/templates/resetEmail.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/resetEmail.svelte similarity index 72% rename from src/routes/(console)/project-[project]/auth/templates/resetEmail.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/resetEmail.svelte index d13aee6f8..347b081db 100644 --- a/src/routes/(console)/project-[project]/auth/templates/resetEmail.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/templates/resetEmail.svelte @@ -1,6 +1,5 @@ - + Reset email template? -

- Are you sure you want to reset the email template? - Default values will be set in all inputs. -

+ + +

+ Are you sure you want to reset the email template? + Default values will be set in all inputs. +

+ + {#if error} + {error} + {/if} +
- - + + + + -
+ diff --git a/src/routes/(console)/project-[project]/auth/templates/resetSms.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/resetSms.svelte similarity index 100% rename from src/routes/(console)/project-[project]/auth/templates/resetSms.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/resetSms.svelte diff --git a/src/routes/(console)/project-[project]/auth/templates/smsInvitationTemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/smsInvitationTemplate.svelte similarity index 100% rename from src/routes/(console)/project-[project]/auth/templates/smsInvitationTemplate.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/smsInvitationTemplate.svelte diff --git a/src/routes/(console)/project-[project]/auth/templates/smsLoginTemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/smsLoginTemplate.svelte similarity index 100% rename from src/routes/(console)/project-[project]/auth/templates/smsLoginTemplate.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/smsLoginTemplate.svelte diff --git a/src/routes/(console)/project-[project]/auth/templates/smsTemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/smsTemplate.svelte similarity index 100% rename from src/routes/(console)/project-[project]/auth/templates/smsTemplate.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/smsTemplate.svelte diff --git a/src/routes/(console)/project-[project]/auth/templates/smsVerificationTemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/smsVerificationTemplate.svelte similarity index 100% rename from src/routes/(console)/project-[project]/auth/templates/smsVerificationTemplate.svelte rename to src/routes/(console)/project-[region]-[project]/auth/templates/smsVerificationTemplate.svelte diff --git a/src/routes/(console)/project-[project]/auth/templates/store.ts b/src/routes/(console)/project-[region]-[project]/auth/templates/store.ts similarity index 100% rename from src/routes/(console)/project-[project]/auth/templates/store.ts rename to src/routes/(console)/project-[region]-[project]/auth/templates/store.ts diff --git a/src/routes/(console)/project-[project]/auth/updateOAuth.ts b/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts similarity index 100% rename from src/routes/(console)/project-[project]/auth/updateOAuth.ts rename to src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts diff --git a/src/routes/(console)/project-[project]/auth/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.svelte similarity index 73% rename from src/routes/(console)/project-[project]/auth/usage/[[period]]/+page.svelte rename to src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.svelte index a0832af6e..9879c54e4 100644 --- a/src/routes/(console)/project-[project]/auth/usage/[[period]]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.svelte @@ -2,16 +2,15 @@ import { base } from '$app/paths'; import { page } from '$app/state'; import { Container, Usage } from '$lib/layout'; - import type { PageData } from './$types'; - export let data: PageData; + export let data; $: total = data.usersTotal; $: count = data.users; { ? params.period : UserUsageRange.ThirtyDays; try { - return sdk.forProject.users.getUsage(period); + return sdk.forProject(params.region, params.project).users.getUsage(period); } catch (e) { error(e.code, e.message); } diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/+layout.svelte similarity index 100% rename from src/routes/(console)/project-[project]/auth/user-[user]/+layout.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/+layout.svelte diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/+layout.ts b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/+layout.ts similarity index 78% rename from src/routes/(console)/project-[project]/auth/user-[user]/+layout.ts rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/+layout.ts index 092bc2897..698ceaab5 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/+layout.ts +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/+layout.ts @@ -10,8 +10,8 @@ export const load: LayoutLoad = async ({ params, depends }) => { try { const [user, userFactors] = await Promise.all([ - sdk.forProject.users.get(params.user), - sdk.forProject.users.listMfaFactors(params.user) + sdk.forProject(params.region, params.project).users.get(params.user), + sdk.forProject(params.region, params.project).users.listMfaFactors(params.user) ]); return { diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/+page.svelte similarity index 100% rename from src/routes/(console)/project-[project]/auth/user-[user]/+page.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/+page.svelte diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/activity/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/activity/+page.svelte similarity index 100% rename from src/routes/(console)/project-[project]/auth/user-[user]/activity/+page.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/activity/+page.svelte diff --git a/src/routes/(console)/project-[project]/auth/teams/team-[team]/activity/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/activity/+page.ts similarity index 74% rename from src/routes/(console)/project-[project]/auth/teams/team-[team]/activity/+page.ts rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/activity/+page.ts index 4fb5bf0f9..29b004821 100644 --- a/src/routes/(console)/project-[project]/auth/teams/team-[team]/activity/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/activity/+page.ts @@ -8,13 +8,11 @@ export const load: PageLoad = async ({ params, url, route }) => { const page = getPage(url); const limit = getLimit(url, route, PAGE_LIMIT); const offset = pageToOffset(page, limit); - return { offset, limit, - logs: await sdk.forProject.teams.listLogs(params.team, [ - Query.limit(limit), - Query.offset(offset) - ]) + logs: await sdk + .forProject(params.region, params.project) + .users.listLogs(params.user, [Query.limit(limit), Query.offset(offset)]) }; }; diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/breadcrumbs.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/breadcrumbs.svelte similarity index 65% rename from src/routes/(console)/project-[project]/auth/user-[user]/breadcrumbs.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/breadcrumbs.svelte index a457244f1..be68f127e 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/breadcrumbs.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/breadcrumbs.svelte @@ -1,5 +1,6 @@ + + + + {#if data.sessions.total} + + {/if} + + {#if data.sessions.total} + + + Browser and device + Session + Location + IP + + + + {#each data.sessions.sessions as session} + {@const browser = getBrowser(session.clientCode)} + + +
+
+ {#if browser} + {session.clientName} + {:else} + + {/if} +
+

+ {session.clientName} + {session.clientVersion} on {session.osName} + {session.osVersion} +

+ {#if session.current} + current session + {/if} +
+
+ + {session.clientType} + {session.countryName} + {session.ip} + + + +
+ {/each} +
+
+ {:else} + +
+

No sessions available

+ +
+
+ {/if} +
+ + + diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/sessions/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/sessions/+page.ts similarity index 66% rename from src/routes/(console)/project-[project]/auth/user-[user]/sessions/+page.ts rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/sessions/+page.ts index 20a1e6f4e..9d69ecb88 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/sessions/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/sessions/+page.ts @@ -6,6 +6,8 @@ export const load: PageLoad = async ({ params, depends }) => { depends(Dependencies.SESSIONS); return { - sessions: await sdk.forProject.users.listSessions(params.user) + sessions: await sdk + .forProject(params.region, params.project) + .users.listSessions(params.user) }; }; diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/store.ts b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/store.ts similarity index 100% rename from src/routes/(console)/project-[project]/auth/user-[user]/store.ts rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/store.ts diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/targets/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/+page.svelte similarity index 97% rename from src/routes/(console)/project-[project]/auth/user-[user]/targets/+page.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/+page.svelte index 087596e67..28cdbeec4 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/targets/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/+page.svelte @@ -2,7 +2,6 @@ import { Button } from '$lib/elements/forms'; import { PaginationWithLimit, ViewSelector, EmptyFilter } from '$lib/components'; import { Container } from '$lib/layout'; - import type { PageData } from './$types'; import Table from './table.svelte'; import { Filters, hasPageQueries } from '$lib/components/filters'; import { columns } from './store'; @@ -11,7 +10,7 @@ import { Card, Empty, Icon, Popover, Tag } from '@appwrite.io/pink-svelte'; import { IconInfo } from '@appwrite.io/pink-icons-svelte'; - export let data: PageData; + export let data; let showAdd = false; diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/targets/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/+page.ts similarity index 75% rename from src/routes/(console)/project-[project]/auth/user-[user]/targets/+page.ts rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/+page.ts index bb0f4968c..c3dab9c6a 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/targets/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/+page.ts @@ -16,19 +16,21 @@ export const load: PageLoad = async ({ params, url, route, depends }) => { const parsedQueries = queryParamToMap(query || '[]'); queries.set(parsedQueries); - const targets = await sdk.forProject.users.listTargets(params.user, [ - Query.limit(limit), - Query.offset(offset), - Query.orderDesc(''), - ...parsedQueries.values() - ]); + const targets = await sdk + .forProject(params.region, params.project) + .users.listTargets(params.user, [ + Query.limit(limit), + Query.offset(offset), + Query.orderDesc(''), + ...parsedQueries.values() + ]); const promisesById: Record> = {}; targets.targets.forEach((target) => { if (target.providerId && !promisesById[target.providerId]) { - promisesById[target.providerId] = sdk.forProject.messaging.getProvider( - target.providerId - ); + promisesById[target.providerId] = sdk + .forProject(params.region, params.project) + .messaging.getProvider(target.providerId); } }); diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/targets/create.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/create.svelte similarity index 91% rename from src/routes/(console)/project-[project]/auth/user-[user]/targets/create.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/create.svelte index 2da0e4af7..90cd57c6e 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/targets/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/create.svelte @@ -28,14 +28,16 @@ const create = async () => { try { - await sdk.forProject.users.createTarget( - page.params.user, - id ? id : ID.unique(), - providerType, - identifier, - providerId ?? undefined, - name ?? undefined - ); + await sdk + .forProject(page.params.region, page.params.project) + .users.createTarget( + page.params.user, + id ? id : ID.unique(), + providerType, + identifier, + providerId ?? undefined, + name ?? undefined + ); show = false; addNotification({ type: 'success', diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/targets/store.ts b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/store.ts similarity index 100% rename from src/routes/(console)/project-[project]/auth/user-[user]/targets/store.ts rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/store.ts diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/targets/table.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/table.svelte similarity index 92% rename from src/routes/(console)/project-[project]/auth/user-[user]/targets/table.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/table.svelte index 9457616aa..fcff7933c 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/targets/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/table.svelte @@ -4,8 +4,8 @@ import type { PageData } from './$types'; import { columns } from './store'; import { toLocaleDateTime } from '$lib/helpers/date'; - import ProviderType from '$routes/(console)/project-[project]/messaging/providerType.svelte'; - import Provider from '$routes/(console)/project-[project]/messaging/provider.svelte'; + import ProviderType from '$routes/(console)/project-[region]-[project]/messaging/providerType.svelte'; + import Provider from '$routes/(console)/project-[region]-[project]/messaging/provider.svelte'; import { sdk } from '$lib/stores/sdk'; import { page } from '$app/state'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; @@ -25,7 +25,9 @@ showDelete = false; const promises = selectedIds.map((id) => - sdk.forProject.users.deleteTarget(page.params.user, id) + sdk + .forProject(page.params.region, page.params.project) + .users.deleteTarget(page.params.user, id) ); try { diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/updateEmail.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateEmail.svelte similarity index 89% rename from src/routes/(console)/project-[project]/auth/user-[user]/updateEmail.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateEmail.svelte index 3415c7a17..60be6fc0e 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/updateEmail.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateEmail.svelte @@ -8,15 +8,19 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { user } from './store'; + import { page } from '$app/state'; let userEmail: string = null; + onMount(async () => { userEmail ??= $user.email; }); async function updateEmail() { try { - await sdk.forProject.users.updateEmail($user.$id, userEmail); + await sdk + .forProject(page.params.region, page.params.project) + .users.updateEmail($user.$id, userEmail); await invalidate(Dependencies.USER); addNotification({ message: 'Email has been updated', diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/updateLabels.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateLabels.svelte similarity index 95% rename from src/routes/(console)/project-[project]/auth/user-[user]/updateLabels.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateLabels.svelte index dc50f44b5..7f9c2b2ab 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/updateLabels.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateLabels.svelte @@ -11,6 +11,7 @@ import { user } from './store'; import { Tag, Input, Layout, Icon } from '@appwrite.io/pink-svelte'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; + import { page } from '$app/state'; const alphaNumericRegExp = /^[a-zA-Z0-9]+$/; let suggestedLabels = ['admin', 'premium', 'mvp']; @@ -23,7 +24,9 @@ async function updateLabels() { try { - await sdk.forProject.users.updateLabels($user.$id, labels); + await sdk + .forProject(page.params.region, page.params.project) + .users.updateLabels($user.$id, labels); await invalidate(Dependencies.USER); isDisabled = true; diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/updateMfa.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateMfa.svelte similarity index 94% rename from src/routes/(console)/project-[project]/auth/user-[user]/updateMfa.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateMfa.svelte index 91611e90c..b94606987 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/updateMfa.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateMfa.svelte @@ -11,6 +11,7 @@ import { Dependencies } from '$lib/constants'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; import { Card, Empty, Table } from '@appwrite.io/pink-svelte'; + import { page } from '$app/state'; let showDelete = false; let userMfa: boolean = null; @@ -21,7 +22,9 @@ async function updateMfa() { try { - await sdk.forProject.users.updateMfa($user.$id, userMfa); + await sdk + .forProject(page.params.region, page.params.project) + .users.updateMfa($user.$id, userMfa); await invalidate(Dependencies.USER); addNotification({ message: `Multi-factor authentication has been ${userMfa ? 'enabled' : 'disabled'}`, diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/updateName.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateName.svelte similarity index 90% rename from src/routes/(console)/project-[project]/auth/user-[user]/updateName.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateName.svelte index 2df43c5bd..fdf428105 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/updateName.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateName.svelte @@ -8,6 +8,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { user } from './store'; + import { page } from '$app/state'; let userName: string = null; onMount(async () => { @@ -16,7 +17,9 @@ async function updateName() { try { - await sdk.forProject.users.updateName($user.$id, userName); + await sdk + .forProject(page.params.region, page.params.project) + .users.updateName($user.$id, userName); await invalidate(Dependencies.USER); addNotification({ message: 'Name has been updated', diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/updatePassword.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updatePassword.svelte similarity index 88% rename from src/routes/(console)/project-[project]/auth/user-[user]/updatePassword.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/updatePassword.svelte index d7a3f25d8..159c94186 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/updatePassword.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updatePassword.svelte @@ -5,12 +5,15 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { user } from './store'; + import { page } from '$app/state'; let newPassword: string = null; async function updatePassword() { try { - await sdk.forProject.users.updatePassword($user.$id, newPassword); + await sdk + .forProject(page.params.region, page.params.project) + .users.updatePassword($user.$id, newPassword); newPassword = null; addNotification({ message: 'Password has been updated', diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/updatePhone.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updatePhone.svelte similarity index 90% rename from src/routes/(console)/project-[project]/auth/user-[user]/updatePhone.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/updatePhone.svelte index 55bf616f6..567e1e9a3 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/updatePhone.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updatePhone.svelte @@ -8,6 +8,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { user } from './store'; + import { page } from '$app/state'; let userPhone: string = null; onMount(async () => { @@ -16,7 +17,9 @@ async function updatePhone() { try { - await sdk.forProject.users.updatePhone($user.$id, userPhone); + await sdk + .forProject(page.params.region, page.params.project) + .users.updatePhone($user.$id, userPhone); await invalidate(Dependencies.USER); addNotification({ message: 'Phone has been updated', diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/updatePrefs.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updatePrefs.svelte similarity index 95% rename from src/routes/(console)/project-[project]/auth/user-[user]/updatePrefs.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/updatePrefs.svelte index 999266ad2..09084666c 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/updatePrefs.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updatePrefs.svelte @@ -10,6 +10,7 @@ import { user } from './store'; import { Icon, Layout } from '@appwrite.io/pink-svelte'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; + import { page } from '$app/state'; $: if (prefs) { if (JSON.stringify(prefs) !== JSON.stringify(Object.entries($user.prefs))) { @@ -33,7 +34,9 @@ try { let updatedPrefs = Object.fromEntries(prefs); - await sdk.forProject.users.updatePrefs($user.$id, updatedPrefs); + await sdk + .forProject(page.params.region, page.params.project) + .users.updatePrefs($user.$id, updatedPrefs); await invalidate(Dependencies.USER); arePrefsDisabled = true; diff --git a/src/routes/(console)/project-[project]/auth/user-[user]/updateStatus.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateStatus.svelte similarity index 92% rename from src/routes/(console)/project-[project]/auth/user-[user]/updateStatus.svelte rename to src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateStatus.svelte index 21ef73f81..229109f94 100644 --- a/src/routes/(console)/project-[project]/auth/user-[user]/updateStatus.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/updateStatus.svelte @@ -1,5 +1,6 @@ diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/backups/+page.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/+page.ts similarity index 74% rename from src/routes/(console)/project-[project]/databases/database-[database]/backups/+page.ts rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/+page.ts index 0e59e5d0e..52d9e65c9 100644 --- a/src/routes/(console)/project-[project]/databases/database-[database]/backups/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/+page.ts @@ -23,19 +23,23 @@ export const load = async ({ params, url, route, depends, parent }) => { if (isCloud && backupsEnabled) { try { [backups, policies] = await Promise.all([ - sdk.forProject.backups.listArchives([ - Query.limit(limit), - Query.offset(offset), - Query.orderDesc('$createdAt'), - Query.equal('resourceType', 'database'), - Query.equal('resourceId', params.database) - ]), + sdk + .forProject(params.region, params.project) + .backups.listArchives([ + Query.limit(limit), + Query.offset(offset), + Query.orderDesc('$createdAt'), + Query.equal('resourceType', 'database'), + Query.equal('resourceId', params.database) + ]), - sdk.forProject.backups.listPolicies([ - Query.orderDesc('$createdAt'), - Query.equal('resourceType', 'database'), - Query.equal('resourceId', params.database) - ]) + sdk + .forProject(params.region, params.project) + .backups.listPolicies([ + Query.orderDesc('$createdAt'), + Query.equal('resourceType', 'database'), + Query.equal('resourceId', params.database) + ]) ]); } catch (e) { // ignore diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/backups/components/Ellipse.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/components/Ellipse.svelte similarity index 100% rename from src/routes/(console)/project-[project]/databases/database-[database]/backups/components/Ellipse.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/components/Ellipse.svelte diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/backups/containerHeader.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/containerHeader.svelte similarity index 100% rename from src/routes/(console)/project-[project]/databases/database-[database]/backups/containerHeader.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/containerHeader.svelte diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/createPolicy.svelte similarity index 99% rename from src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/createPolicy.svelte index 3e664bf31..ca4dc48a9 100644 --- a/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/createPolicy.svelte @@ -113,7 +113,7 @@ }); }; - $: customPolicyDescription = (policy: UserBackupPolicy) => { + const customPolicyDescription = (policy: UserBackupPolicy) => { return backupPolicyDescription( policy.plainTextFrequency, null, @@ -123,7 +123,7 @@ ); }; - $: formPolicyDescription = () => { + const formPolicyDescription = () => { return backupPolicyDescription( policyFrequency, selectedTime, @@ -324,7 +324,7 @@ variant="secondary" padding="s" --input-background-color="var(--bgcolor-neutral-primary)"> -