Merge branch 'main' of github.com:appwrite/console into billing

This commit is contained in:
Arman
2023-03-17 14:45:29 +01:00
50 changed files with 141 additions and 96 deletions
+15 -1
View File
@@ -33,7 +33,21 @@ If you are worried about or dont know where to start, check out the next sect
## Development
Once you've created a project and installed dependencies with `npm install`, create a `.env` file using `.env.example` as a template.
### 1. Clone the repository with git
```bash
git clone https://github.com/appwrite/console.git appwrite-console
```
### 2. Install dependencies with npm
```bash
npm install
```
### 3. Setup environment variables
Add a `.env` file by copying the `.env.example` file as a template in the project's root directory.
Finally, start a development server:
+6
View File
@@ -17,6 +17,7 @@
"@stripe/stripe-js": "^1.47.0",
"analytics": "^0.8.1",
"echarts": "^5.4.1",
"logrocket": "^3.0.1",
"pretty-bytes": "^6.1.0",
"prismjs": "^1.29.0",
"tippy.js": "^6.3.7",
@@ -6267,6 +6268,11 @@
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"node_modules/logrocket": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/logrocket/-/logrocket-3.0.1.tgz",
"integrity": "sha512-jOWG+jEzobKVxGytzZ+4KGm2kiMQMRTHab2uDWQyVZcHfEF38BlCH1yjQVY4LCmuQUwZitP9biMzJZnyUQ0dtQ=="
},
"node_modules/loupe": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+1
View File
@@ -28,6 +28,7 @@
"@stripe/stripe-js": "^1.47.0",
"analytics": "^0.8.1",
"echarts": "^5.4.1",
"logrocket": "^3.0.1",
"pretty-bytes": "^6.1.0",
"prismjs": "^1.29.0",
"tippy.js": "^6.3.7",
+2 -2
View File
@@ -10,7 +10,7 @@ const analytics = Analytics({
app: 'appwrite',
plugins: [
googleAnalytics({
measurementIds: [VARS.GOOGLE_ANALYTICS ?? 'G-R4YJ9JN8L4']
measurementIds: [VARS.GOOGLE_ANALYTICS || 'G-R4YJ9JN8L4']
})
]
});
@@ -88,7 +88,7 @@ function sendEventToGrowth(event: string, path: string, data: object = null): vo
});
}
function isTrackingAllowed() {
export function isTrackingAllowed() {
if (ENV.TEST) {
return;
}
+1 -1
View File
@@ -32,7 +32,7 @@
class:icon-exclamation={type === 'warning'}
class:icon-exclamation-circle={type === 'error'}
aria-hidden="true" />
<div class="alert-content">
<div class="alert-content" data-private>
{#if $$slots.title}
<h6 class="alert-title">
<slot name="title" />
+2 -1
View File
@@ -10,7 +10,8 @@
<ul
class="grid-box common-section u-margin-block-start-32"
style={`--grid-gap:1.5rem; --grid-item-size:${total > 3 ? '22rem' : '25rem'};`}>
style={`--grid-gap:1.5rem; --grid-item-size:${total > 3 ? '22rem' : '25rem'};`}
data-private>
<slot />
{#if total > 3 ? total < limit + offset : total % 2 !== 0}
+1 -1
View File
@@ -81,7 +81,7 @@
<form class="modal-form" role="form" on:submit|preventDefault>
<header class="modal-header">
{#if warning}
<div class="avatar is-color-orange is-medium">
<div class="avatar is-warning is-medium">
<span class="icon-exclamation" aria-hidden="true" />
</div>
{/if}
+1 -1
View File
@@ -8,7 +8,7 @@
export let copyEvent: string = null;
</script>
<div class="interactive-text-output" class:is-textarea={show}>
<div class="interactive-text-output" class:is-textarea={show} data-private>
{#if show}
<span class="text u-line-height-1-5 u-break-all">{value}</span>
{:else}
+1 -1
View File
@@ -1,3 +1,3 @@
<ul class="grid-box common-section" style="--grid-item-size:25rem;">
<ul class="grid-box common-section" style="--grid-item-size:25rem;" data-private>
<slot />
</ul>
+1 -1
View File
@@ -3,6 +3,6 @@
export let title: string;
</script>
<div class="table-col" data-title={title} role="cell">
<div class="table-col" data-title={title} role="cell" data-private>
<a role="button" tabindex="0" class="link" {href}><slot /></a>
</div>
+2 -1
View File
@@ -10,6 +10,7 @@
class:is-only-desktop={onlyDesktop}
class:u-overflow-visible={showOverflow}
data-title={title}
role="cell">
role="cell"
data-private>
<Trim><slot /></Trim>
</div>
+2 -1
View File
@@ -7,6 +7,7 @@
class="table is-selected-columns-mobile"
class:u-margin-block-start-32={!noMargin}
class:is-remove-outer-styles={noStyles}
role="table">
role="table"
data-private>
<slot />
</div>
+1 -1
View File
@@ -1,5 +1,5 @@
<!-- TODO: is 100% height needed? -->
<div class="table-with-scroll">
<div class="table-with-scroll" data-private>
<div class="table-wrapper">
<div class="table is-remove-outer-styles">
<ul class="table-thead">
+1 -1
View File
@@ -2,7 +2,7 @@
export let isSticky = false;
</script>
<div class="table-with-scroll u-margin-block-start-32">
<div class="table-with-scroll u-margin-block-start-32" data-private>
<div class="table-wrapper">
<table class="table" class:is-sticky-scroll={isSticky}>
<slot />
+1 -1
View File
@@ -18,7 +18,7 @@
<nav class="breadcrumbs is-only-desktop" aria-label="breadcrumb">
<ol class="breadcrumbs-list">
{#each breadcrumbs as breadcrumb}
<li class="breadcrumbs-item">
<li class="breadcrumbs-item" data-private>
{#if breadcrumb.href}
<a href={breadcrumb.href} title={breadcrumb.title} on:click={track}>
{breadcrumb.title}
+1 -1
View File
@@ -10,7 +10,7 @@
<span class="icon-cheveron-left" aria-hidden="true" />
</a>
{/if}
<span class="text u-trim-1">
<span class="text u-trim-1" data-private>
<slot />
</span>
</Heading>
+1 -1
View File
@@ -43,7 +43,7 @@
<span class="text">ⓒ {currentYear} Appwrite. All rights reserved.</span>
</li>
<li class="inline-links-item u-flex u-gap-8">
<a href="https://github.com/appwrite/console" target="_blank" rel="noreferrer">
<a href="https://github.com/appwrite/appwrite" target="_blank" rel="noreferrer">
<span class="icon-github" aria-hidden="true" aria-label="Appwrite on Github" />
</a>
<a href="https://appwrite.io/discord" target="_blank" rel="noreferrer">
+1 -1
View File
@@ -47,7 +47,7 @@
<svelte:window on:keydown={handleKeydown} />
{#if $log.data}
<section class="cover-frame">
<section class="cover-frame" data-private>
<header class="cover-frame-header u-flex u-gap-16 u-main-space-between u-cross-center">
<h1 class="body-text-1">Function ID: {$log.func.$id}</h1>
<button
+20 -7
View File
@@ -1,14 +1,16 @@
<script lang="ts">
import { browser, dev } from '$app/environment';
import { browser } from '$app/environment';
import { afterNavigate, goto } from '$app/navigation';
import { base } from '$app/paths';
import { page } from '$app/stores';
import { trackPageView } from '$lib/actions/analytics';
import { isTrackingAllowed, trackPageView } from '$lib/actions/analytics';
import { reportWebVitals } from '$lib/helpers/vitals';
import { Notifications, Progress } from '$lib/layout';
import { app } from '$lib/stores/app';
import { user } from '$lib/stores/user';
import { ENV, isCloud } from '$lib/system';
import * as Sentry from '@sentry/svelte';
import LogRocket from 'logrocket';
import { BrowserTracing } from '@sentry/tracing';
import { onMount } from 'svelte';
import { onCLS, onFCP, onFID, onINP, onLCP, onTTFB } from 'web-vitals';
@@ -23,7 +25,7 @@
/**
* Reporting Web Vitals.
*/
if (!dev && window.VERCEL_ANALYTICS_ID) {
if (ENV.PROD && window.VERCEL_ANALYTICS_ID) {
onCLS(reportWebVitals);
onFID(reportWebVitals);
onLCP(reportWebVitals);
@@ -32,15 +34,26 @@
onTTFB(reportWebVitals);
}
/**
* Sentry Error Logging
*/
if (!dev) {
if (ENV.PROD) {
/**
* Sentry Error Logging
*/
Sentry.init({
dsn: 'https://c7ce178bdedd486480317b72f282fd39@o1063647.ingest.sentry.io/4504158071422976',
integrations: [new BrowserTracing()],
tracesSampleRate: 1.0
});
/**
* LogRocket
*/
if (isCloud && isTrackingAllowed()) {
LogRocket.init('rgthvf/appwrite', {
dom: {
inputSanitizer: true
}
});
}
}
/**
+6
View File
@@ -1,6 +1,7 @@
import '@appwrite.io/pink';
import '@appwrite.io/pink-icons';
import 'tippy.js/dist/tippy.css';
import LogRocket from 'logrocket';
import { sdkForConsole } from '$lib/stores/sdk';
import { redirect } from '@sveltejs/kit';
import { Dependencies } from '$lib/constants';
@@ -13,6 +14,11 @@ export const load: LayoutLoad = async ({ depends, url }) => {
try {
const account = await sdkForConsole.account.get();
LogRocket.identify(account.$id, {
name: account.name,
email: account.email
});
return {
account,
organizations: sdkForConsole.teams.list()
@@ -47,7 +47,7 @@
<svelte:fragment slot="header">
{isUser ? 'Leave Organization' : 'Delete Member'}
</svelte:fragment>
<p>
<p data-private>
{isUser
? `Are you sure you want to leave '${selectedMember?.teamName}'?`
: `Are you sure you want to delete ${selectedMember?.userName} from '${selectedMember?.teamName}'?`}
@@ -39,7 +39,7 @@
<Modal bind:show={showDelete} on:submit={deleteMembership} warning>
<svelte:fragment slot="header">Delete Member</svelte:fragment>
<p>
<p data-private>
Are you sure you want to delete <b>{selectedMembership.userName}</b> from '{selectedMembership.teamName}'?
</p>
<svelte:fragment slot="footer">
@@ -30,8 +30,7 @@
<Modal bind:show={showDelete} on:submit={deleteTeam} warning>
<svelte:fragment slot="header">Delete Team</svelte:fragment>
<p>
<p data-private>
Are you sure you want to delete <b>{team.name}</b>?
</p>
<svelte:fragment slot="footer">
@@ -33,11 +33,11 @@
{/if}
</svelte:fragment>
<svelte:fragment slot="title">
<h6 class="u-bold u-trim-1">
<h6 class="u-bold u-trim-1" data-private>
{$user.name || $user.email || $user.phone || 'Anonymous'}
</h6>
</svelte:fragment>
<p class="u-trim-1">
<p class="u-trim-1" data-private>
{$user.email && $user.phone
? [$user.email, $user.phone].join(',')
: $user.email || $user.phone}
@@ -33,7 +33,7 @@
<Modal bind:show={showDeleteAll} on:submit={deleteAllSessions} warning>
<svelte:fragment slot="header">Delete All Sessions</svelte:fragment>
<p>
<p data-private>
Are you sure you want to delete <b>all of {$user.name}'s sessions?</b>
</p>
<svelte:fragment slot="footer">
@@ -43,7 +43,7 @@
<Modal bind:show={showDelete} on:submit={deleteMembership} warning>
<svelte:fragment slot="header">Delete Member</svelte:fragment>
{#if selectedMembership}
<p>
<p data-private>
Are you sure you want to delete <b>{selectedMembership.userName}</b> from '{selectedMembership.teamName}'?
</p>
{/if}
@@ -34,7 +34,7 @@
<Modal bind:show={showDelete} on:submit={deleteUser} warning>
<svelte:fragment slot="header">Delete User</svelte:fragment>
<p>Are you sure you want to delete <b>{$user.name}</b> from '{$project.name}'?</p>
<p data-private>Are you sure you want to delete <b>{$user.name}</b> from '{$project.name}'?</p>
<svelte:fragment slot="footer">
<Button text on:click={() => (showDelete = false)}>Cancel</Button>
<Button secondary submit>Delete</Button>
@@ -1,7 +1,7 @@
<script lang="ts">
import { page } from '$app/stores';
import { base } from '$app/paths';
import { Empty, AvatarInitials } from '$lib/components';
import { AvatarInitials, EmptySearch } from '$lib/components';
import {
Table,
TableHeader,
@@ -41,7 +41,7 @@
<TableRowLink
href={`${base}/console/project-${project}/auth/teams/team-${membership.teamId}`}>
<TableCellText title="Name">
<div class="u-flex u-gap-12">
<div class="u-flex u-cross-center u-gap-12">
<AvatarInitials size={32} name={membership.teamName} />
<span>{membership.teamName ? membership.teamName : 'n/a'}</span>
</div>
@@ -67,19 +67,15 @@
</TableBody>
</Table>
{:else}
<Empty single>
<p>No memberships available</p>
<Button
external
secondary
href="https://appwrite.io/docs/server/users?sdk=nodejs-default#usersListMemberships">
Documentation
</Button>
</Empty>
<EmptySearch>
<div class="u-flex u-flex-vertical u-cross-center u-gap-24">
<p class="text u-line-height-1-5">No memberships available</p>
<Button external secondary href="https://appwrite.io/docs/client/teams">
Documentation
</Button>
</div>
</EmptySearch>
{/if}
<div class="u-flex u-margin-block-start-32 u-main-space-between">
<p class="text">Total results: {data.memberships.total}</p>
</div>
</Container>
<DeleteMembership {selectedMembership} bind:showDelete />
@@ -1,5 +1,5 @@
<script lang="ts">
import { Empty } from '$lib/components';
import { EmptySearch } from '$lib/components';
import {
Table,
TableBody,
@@ -84,19 +84,18 @@
</TableBody>
</Table>
{:else}
<Empty single>
<p>No sessions available</p>
<Button
external
secondary
href="https://appwrite.io/docs/server/auth?sdk=nodejs-default#usersGetSessions">
Documentation
</Button>
</Empty>
<EmptySearch>
<div class="u-flex u-flex-vertical u-cross-center u-gap-24">
<p class="text u-line-height-1-5">No sessions available</p>
<Button
external
secondary
href="https://appwrite.io/docs/server/auth?sdk=nodejs-default#usersGetSessions">
Documentation
</Button>
</div>
</EmptySearch>
{/if}
<div class="u-flex u-margin-block-start-32 u-main-space-between">
<p class="text">Total results: {data.sessions.total}</p>
</div>
</Container>
<DeleteSessions {selectedSessionId} bind:showDelete />
@@ -38,7 +38,7 @@
<Heading tag="h6" size="7">Update Name</Heading>
<svelte:fragment slot="aside">
<ul>
<ul data-private>
<InputText
id="name"
label="Name"
@@ -74,7 +74,7 @@
</script>
<CardGrid>
<div class="grid-1-2-col-1 u-flex u-cross-center u-gap-16">
<div class="grid-1-2-col-1 u-flex u-cross-center u-gap-16" data-private>
{#if $user.email || $user.phone}
{#if $user.name}
<AvatarInitials size={48} name={$user.name} />
@@ -92,7 +92,7 @@
</div>
<svelte:fragment slot="aside">
<div class="u-flex u-main-space-between">
<div>
<div data-private>
{#if $user.email}
<p class="title">{$user.email}</p>
{/if}
@@ -44,7 +44,7 @@
<Modal warning={true} bind:show={showDelete} on:submit={handleDelete}>
<svelte:fragment slot="header">Delete Attribute</svelte:fragment>
<p>
<p data-private>
Are you sure you want to delete <b>'{selectedAttribute?.key}' from {$collection?.name}</b>?
</p>
<svelte:fragment slot="footer">
@@ -54,6 +54,11 @@
key = null;
selectedOption = null;
$option = null;
data = {
required: false,
array: false,
default: null
};
}
</script>
@@ -42,7 +42,7 @@
<Modal warning={true} on:submit={handleDelete} bind:show={showDelete}>
<svelte:fragment slot="header">Delete Document</svelte:fragment>
<p>
<p data-private>
Are you sure you want to delete <b>the document from {$collection.name}</b>?
</p>
<svelte:fragment slot="footer">
@@ -42,7 +42,7 @@
<Modal warning={true} on:submit={handleDelete} bind:show={showDelete}>
<svelte:fragment slot="header">Delete Index</svelte:fragment>
<p>
<p data-private>
Are you sure you want to delete <b>'{selectedIndex.key}' from {$collection.name}</b>?
</p>
<svelte:fragment slot="footer">
@@ -38,7 +38,7 @@
<Modal warning={true} bind:show={showDelete} on:submit={handleDelete}>
<svelte:fragment slot="header">Delete Collection</svelte:fragment>
<p>
<p data-private>
Are you sure you want to delete <b>{$collection.name}</b>?
</p>
<svelte:fragment slot="footer">
@@ -34,7 +34,7 @@
<Modal warning={true} bind:show={showDelete} on:submit={handleDelete}>
<svelte:fragment slot="header">Delete Database</svelte:fragment>
<p class="text">
<p class="text" data-private>
Are you sure you want to delete <b>{$database.name}</b>?
</p>
<svelte:fragment slot="footer">
@@ -1,17 +1,17 @@
<script lang="ts">
import { page } from '$app/stores';
import { Card, CardGrid, Box, Heading, AvatarInitials } from '$lib/components';
import { Container } from '$lib/layout';
import { Button, InputText, Helper } from '$lib/elements/forms';
import { sdkForProject } from '$lib/stores/sdk';
import { addNotification } from '$lib/stores/notifications';
import { database } from '../store';
import { onMount } from 'svelte';
import { toLocaleDateTime } from '$lib/helpers/date';
import { invalidate } from '$app/navigation';
import { page } from '$app/stores';
import { Submit, trackError, trackEvent } from '$lib/actions/analytics';
import { Box, Card, CardGrid, Heading } from '$lib/components';
import { Dependencies } from '$lib/constants';
import { Button, Helper, InputText } from '$lib/elements/forms';
import { toLocaleDateTime } from '$lib/helpers/date';
import { Container } from '$lib/layout';
import { addNotification } from '$lib/stores/notifications';
import { sdkForProject } from '$lib/stores/sdk';
import { onMount } from 'svelte';
import Delete from '../delete.svelte';
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
import { database } from '../store';
let showDelete = false;
let showError: false | 'name' | 'email' | 'password' = false;
@@ -51,7 +51,6 @@
<div class="common-section grid-1-2">
<div class="grid-1-2-col-1">
<div class="grid-1-2-col-1 u-flex u-cross-center u-gap-16">
<AvatarInitials size={48} name={$database.name} />
<Heading tag="h6" size="7">{$database.name}</Heading>
</div>
</div>
@@ -99,9 +98,6 @@
</p>
<svelte:fragment slot="aside">
<Box>
<svelte:fragment slot="image">
<AvatarInitials size={48} name={$database.name} />
</svelte:fragment>
<svelte:fragment slot="title">
<h6 class="u-bold u-trim-1">{$database.name}</h6>
<span>Last Updated: {toLocaleDateTime($database.$updatedAt)}</span>
@@ -36,7 +36,7 @@
<Modal bind:show={showDelete} on:submit={handleSubmit} warning>
<svelte:fragment slot="header">Delete Deployment</svelte:fragment>
<p>Are you sure you want to delete this deployment?</p>
<p data-private>Are you sure you want to delete this deployment?</p>
<svelte:fragment slot="footer">
<Button text on:click={() => (showDelete = false)}>Cancel</Button>
<Button secondary submit>Delete</Button>
@@ -33,7 +33,7 @@
<Modal bind:show={showDelete} on:submit={handleSubmit} warning>
<svelte:fragment slot="header">Delete Function</svelte:fragment>
<p>
<p data-private>
Are you sure you want to delete this function and all associated deployments from your
project?
</p>
@@ -81,5 +81,5 @@
</svelte:fragment>
</InputSelect>
{#if expirationSelect === 'custom'}
<InputDateTime id="expire" label="" bind:value={expirationCustom} showLabel={false} />
<InputDateTime required id="expire" label="" bind:value={expirationCustom} showLabel={false} />
{/if}
@@ -97,7 +97,8 @@
{#if data.platforms.platforms.length}
<div
class="grid-box u-margin-block-start-32"
style="--grid-gap:1.5rem; --grid-item-size:20rem;">
style="--grid-gap:1.5rem; --grid-item-size:20rem;"
data-private>
{#each data.platforms.platforms as platform}
<a class="card" href={`${path}/${platform.$id}`}>
<div class="grid-item-1" style="min-block-size: calc(182 / 16 * 1rem)">
@@ -35,7 +35,7 @@
<Modal bind:show={showDelete} on:submit={deleteDomain} warning>
<svelte:fragment slot="header">Delete Domain</svelte:fragment>
{#if selectedDomain}
<p>
<p data-private>
Are you sure you want to delete <b>{selectedDomain.domain}</b> from '{$project.name}'?
</p>
{/if}
@@ -35,7 +35,9 @@
<Modal bind:show={showDelete} on:submit={handleDelete} warning>
<svelte:fragment slot="header">Delete Webhook</svelte:fragment>
<p>Are you sure you want to delete <b>{$webhook.name}</b> from '{$project.name}'?</p>
<p data-private>
Are you sure you want to delete <b>{$webhook.name}</b> from '{$project.name}'?
</p>
<svelte:fragment slot="footer">
<Button text on:click={() => (showDelete = false)}>Cancel</Button>
<Button secondary submit>Delete</Button>
@@ -97,7 +97,7 @@
{#if file.chunksTotal / file.chunksUploaded !== 1}
<TableRow>
<TableCell title="Name">
<div class="u-flex u-gap-12 u-main-space-between">
<div class="u-flex u-gap-12 u-main-space-between u-cross-center">
<span class="avatar is-size-small is-color-empty" />
<span class="text u-trim">{file.name}</span>
@@ -136,7 +136,7 @@
<TableRowLink
href={`${base}/console/project-${projectId}/storage/bucket-${bucketId}/file-${file.$id}`}>
<TableCell title="Name">
<div class="u-flex u-gap-12">
<div class="u-flex u-gap-12 u-cross-center">
<Avatar size={32} src={getPreview(file.$id)} name={file.name} />
<span class="text u-trim">{file.name}</span>
</div>
@@ -33,7 +33,7 @@
<Modal bind:show={showDelete} on:submit={deleteUser} warning>
<svelte:fragment slot="header">Delete Bucket</svelte:fragment>
<p>Are you sure you want to delete <b>{$bucket.name}</b>?</p>
<p data-private>Are you sure you want to delete <b>{$bucket.name}</b>?</p>
<svelte:fragment slot="footer">
<Button text on:click={() => (showDelete = false)}>Cancel</Button>
<Button secondary submit>Delete</Button>
@@ -34,7 +34,7 @@
<Modal bind:show={showDelete} on:submit={deleteFile} warning>
<svelte:fragment slot="header">Delete File</svelte:fragment>
<p>Are you sure you want to delete <b>{file.name}</b>?</p>
<p data-private>Are you sure you want to delete <b>{file.name}</b>?</p>
<svelte:fragment slot="footer">
<Button text on:click={() => (showDelete = false)}>Cancel</Button>
<Button secondary submit>Delete</Button>
@@ -68,7 +68,7 @@
<Container>
{#if $file}
<CardGrid>
<div class="u-flex u-gap-16">
<div class="u-flex u-gap-16" data-private>
<a
href={getView($file.$id)}
class="file-preview is-with-image"
@@ -157,7 +157,7 @@
<svelte:fragment slot="aside">
<Box>
<svelte:fragment slot="title">
<h6 class="u-bold u-trim-1">{$file.name}</h6>
<h6 class="u-bold u-trim-1" data-private>{$file.name}</h6>
</svelte:fragment>
<p>
Last Updated: {toLocaleDateTime($file.$updatedAt)}
@@ -35,7 +35,7 @@
<Modal bind:show={showDelete} on:submit={deleteFile} warning>
<svelte:fragment slot="header">Delete File</svelte:fragment>
<p>Are you sure you want to delete <b>{$file.name}</b>?</p>
<p data-private>Are you sure you want to delete <b>{$file.name}</b>?</p>
<svelte:fragment slot="footer">
<Button text on:click={() => (showDelete = false)}>Cancel</Button>
<Button secondary submit>Delete</Button>
@@ -28,6 +28,7 @@
onMount(async () => {
if (isCloud) {
code = slug;
switch (slug) {
case 'mlh':
imgDark = (await import('./mlh-dark.svg')).default;
@@ -38,8 +39,11 @@
imgDark = (await import('$lib/images/appwrite.svg')).default;
imgLight = (await import('$lib/images/appwrite.svg')).default;
title = 'Welcome Appwriters!';
break;
case 'cloud_beta':
break;
default:
code = '';
}
}
});