mirror of
https://github.com/appwrite/console.git
synced 2026-06-06 19:27:48 +00:00
Merge branch 'main' into fix-realtime-logic
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
name: Copilot Setup Steps
|
||||
|
||||
# Automatically run the setup steps when they are changed to allow for easy validation, and
|
||||
# allow manual testing through the repository's "Actions" tab
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- .github/workflows/copilot-setup-steps.yml
|
||||
pull_request:
|
||||
paths:
|
||||
- .github/workflows/copilot-setup-steps.yml
|
||||
|
||||
jobs:
|
||||
copilot-setup-steps:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 20
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
@@ -0,0 +1,15 @@
|
||||
<script lang="ts">
|
||||
import { Copy } from '.';
|
||||
import { Icon, Tag } from '@appwrite.io/pink-svelte';
|
||||
import { IconDuplicate } from '@appwrite.io/pink-icons-svelte';
|
||||
import { getProjectEndpoint } from '$lib/helpers/project';
|
||||
</script>
|
||||
|
||||
<Copy value={getProjectEndpoint()} copyText="Copy endpoint">
|
||||
<Tag size="xs" variant="code">
|
||||
<Icon icon={IconDuplicate} size="s" slot="start" />
|
||||
<span style:white-space="nowrap" style:overflow="hidden" style:word-break="break-all">
|
||||
API endpoint
|
||||
</span>
|
||||
</Tag>
|
||||
</Copy>
|
||||
@@ -57,6 +57,7 @@
|
||||
disabled={tooltipDisabled}
|
||||
portal={tooltipPortal}
|
||||
delay={tooltipDelay}
|
||||
maxWidth="500px"
|
||||
placement={tooltipPlacement}>
|
||||
<span
|
||||
data-private
|
||||
|
||||
@@ -95,10 +95,11 @@
|
||||
export let tooltipPortal = false;
|
||||
export let tooltipDelay: number = 0;
|
||||
export let tooltipPlacement: TooltipPlacement = undefined;
|
||||
export let copyText: string | undefined = undefined;
|
||||
</script>
|
||||
|
||||
{#key value}
|
||||
<Copy {value} {event} {tooltipPortal} {tooltipDelay} {tooltipPlacement}>
|
||||
<Copy {value} {event} {tooltipPortal} {tooltipDelay} {tooltipPlacement} {copyText}>
|
||||
<Tag size="xs" variant="code">
|
||||
<Icon icon={IconDuplicate} size="s" slot="start" />
|
||||
<span
|
||||
|
||||
@@ -82,6 +82,7 @@ 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 ApiEndpoint } from './apiEndpoint.svelte';
|
||||
export { default as RegionEndpoint } from './regionEndpoint.svelte';
|
||||
export { default as ExpirationInput } from './expirationInput.svelte';
|
||||
export { default as EstimatedCard } from './estimatedCard.svelte';
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<script lang="ts">
|
||||
import { Copy } from '.';
|
||||
import { sdk } from '$lib/stores/sdk';
|
||||
import { Layout, Tag } from '@appwrite.io/pink-svelte';
|
||||
import { Icon, Tag } from '@appwrite.io/pink-svelte';
|
||||
import { IconDuplicate } from '@appwrite.io/pink-icons-svelte';
|
||||
import { Flag, type Models } from '@appwrite.io/console';
|
||||
import { truncateText } from '$lib/components/id.svelte';
|
||||
import { isValueOfStringEnum } from '$lib/helpers/types';
|
||||
import { getProjectEndpoint } from '$lib/helpers/project';
|
||||
|
||||
@@ -21,28 +21,28 @@
|
||||
</script>
|
||||
|
||||
{#if region}
|
||||
<Copy value={getProjectEndpoint()} copyText="Copy endpoint">
|
||||
<Tag size="xs" variant="default">
|
||||
<Layout.Stack direction="row" gap="s" alignItems="center" inline>
|
||||
{#if flagSrc}
|
||||
<img
|
||||
width={16}
|
||||
height={12}
|
||||
src={flagSrc}
|
||||
alt={region?.name}
|
||||
style:border-radius="2.5px" />
|
||||
{/if}
|
||||
|
||||
<span
|
||||
style:white-space="nowrap"
|
||||
class="text u-line-height-1-5"
|
||||
style:overflow="hidden"
|
||||
style:word-break="break-all"
|
||||
use:truncateText
|
||||
style:font-family="unset">
|
||||
{region?.name}
|
||||
</span>
|
||||
</Layout.Stack>
|
||||
<Copy value={getProjectEndpoint()} copyText={`Copy endpoint (${region.name})`}>
|
||||
<Tag size="xs" variant="code">
|
||||
<Icon icon={IconDuplicate} size="s" slot="start" />
|
||||
<span class="endpoint-label"> API endpoint </span>
|
||||
{#if flagSrc}
|
||||
<img class="region-flag" src={flagSrc} alt={region?.name} />
|
||||
{/if}
|
||||
</Tag>
|
||||
</Copy>
|
||||
{/if}
|
||||
|
||||
<style>
|
||||
.endpoint-label {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.region-flag {
|
||||
width: 16px;
|
||||
height: 12px;
|
||||
border-radius: 2.5px;
|
||||
margin-inline-start: 6px;
|
||||
}
|
||||
</style>
|
||||
|
||||
+17
-2
@@ -15,6 +15,7 @@
|
||||
import { writable } from 'svelte/store';
|
||||
import Scopes from '../api-keys/scopes.svelte';
|
||||
import { page } from '$app/state';
|
||||
import { copy } from '$lib/helpers/copy';
|
||||
|
||||
const projectId = page.params.project;
|
||||
|
||||
@@ -28,7 +29,7 @@
|
||||
|
||||
async function create() {
|
||||
try {
|
||||
const { $id } = await sdk.forConsole.projects.createKey({
|
||||
const { $id, secret } = await sdk.forConsole.projects.createKey({
|
||||
projectId,
|
||||
name,
|
||||
scopes,
|
||||
@@ -45,7 +46,21 @@
|
||||
);
|
||||
addNotification({
|
||||
message: `API key has been created`,
|
||||
type: 'success'
|
||||
type: 'success',
|
||||
buttons: [
|
||||
{
|
||||
name: 'Copy API key',
|
||||
method: async () => {
|
||||
await copy(secret);
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'Copy endpoint',
|
||||
method: async () => {
|
||||
await copy(sdk.forConsole.client.config.endpoint);
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
} catch (error) {
|
||||
addNotification({
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
import { page } from '$app/state';
|
||||
import { Cover, CoverTitle } from '$lib/layout';
|
||||
import { key } from './store';
|
||||
import { RegionEndpoint, Copy } from '$lib/components';
|
||||
import { Layout, Tag, Icon } from '@appwrite.io/pink-svelte';
|
||||
import { IconDuplicate } from '@appwrite.io/pink-icons-svelte';
|
||||
import { projectRegion } from '../../../store';
|
||||
|
||||
const projectId = page.params.project;
|
||||
</script>
|
||||
@@ -12,5 +16,26 @@
|
||||
<CoverTitle href={`${base}/project-${page.params.region}-${projectId}/overview/api-keys`}>
|
||||
{$key?.name}
|
||||
</CoverTitle>
|
||||
<Layout.Stack direction="row" inline>
|
||||
{#if $key?.secret}
|
||||
<Copy value={$key.secret} copyText="Copy API secret">
|
||||
<Tag size="xs" variant="code">
|
||||
<Icon icon={IconDuplicate} size="s" slot="start" />
|
||||
<span class="api-secret-label"> API secret </span>
|
||||
</Tag>
|
||||
</Copy>
|
||||
{/if}
|
||||
{#if $projectRegion}
|
||||
<RegionEndpoint region={$projectRegion} />
|
||||
{/if}
|
||||
</Layout.Stack>
|
||||
</svelte:fragment>
|
||||
</Cover>
|
||||
|
||||
<style>
|
||||
.api-secret-label {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
word-break: break-all;
|
||||
}
|
||||
</style>
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 308 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
@@ -2,19 +2,24 @@
|
||||
import { page } from '$app/state';
|
||||
import { Id, RegionEndpoint } from '$lib/components';
|
||||
import { Cover } from '$lib/layout';
|
||||
import { project, projectRegion } from '../store';
|
||||
import { projectRegion } from '../store';
|
||||
import { hasOnboardingDismissed, setHasOnboardingDismissed } from '$lib/helpers/onboarding';
|
||||
import { goto } from '$app/navigation';
|
||||
import { base } from '$app/paths';
|
||||
import { resolve } from '$app/paths';
|
||||
import { Layout, Button, Typography } from '@appwrite.io/pink-svelte';
|
||||
import { user } from '$lib/stores/user';
|
||||
import { isSmallViewport } from '$lib/stores/viewport';
|
||||
import { trackEvent } from '$lib/actions/analytics';
|
||||
|
||||
function dismissOnboarding() {
|
||||
setHasOnboardingDismissed($project.$id, $user);
|
||||
setHasOnboardingDismissed(page.params.project, $user);
|
||||
trackEvent('onboarding_hub_platform_dismiss');
|
||||
goto(`${base}/project-${$project.region}-${$project.$id}/overview/platforms`);
|
||||
goto(
|
||||
resolve('/(console)/project-[region]-[project]/overview/platforms', {
|
||||
region: page.params.region,
|
||||
project: page.params.project
|
||||
})
|
||||
);
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -24,12 +29,15 @@
|
||||
<Layout.Stack alignItems="baseline" direction={$isSmallViewport ? 'column' : 'row'}>
|
||||
<Typography.Title color="--fgcolor-neutral-primary" size="xl" truncate>
|
||||
<span class="project-title">
|
||||
{$project?.name}
|
||||
{page.data.project?.name}
|
||||
</span>
|
||||
</Typography.Title>
|
||||
<Layout.Stack direction="row" inline>
|
||||
<Id value={$project.$id}>{$project.$id}</Id>
|
||||
<RegionEndpoint region={$projectRegion} />
|
||||
<Id value={page.params.project} copyText="Copy project ID"
|
||||
>{page.params.project}</Id>
|
||||
{#if $projectRegion}
|
||||
<RegionEndpoint region={$projectRegion} />
|
||||
{/if}
|
||||
</Layout.Stack>
|
||||
</Layout.Stack>
|
||||
</svelte:fragment>
|
||||
@@ -53,7 +61,7 @@
|
||||
>Follow a few quick steps to get started with Appwrite</Typography.Text>
|
||||
</Layout.Stack>
|
||||
<div class="dashboard-header-button">
|
||||
{#if !hasOnboardingDismissed($project.$id, $user)}
|
||||
{#if !hasOnboardingDismissed(page.params.project, $user)}
|
||||
<Button.Button size="s" variant="secondary" on:click={dismissOnboarding}>
|
||||
Dismiss this page
|
||||
</Button.Button>
|
||||
|
||||
@@ -14,12 +14,7 @@
|
||||
import { app } from '$lib/stores/app';
|
||||
import AuthPreview from './assets/auth-preview.svg';
|
||||
import AuthPreviewDark from './assets/auth-preview-dark.svg';
|
||||
import {
|
||||
IconArrowRight,
|
||||
IconNodeJs,
|
||||
IconPhp,
|
||||
IconPython
|
||||
} from '@appwrite.io/pink-icons-svelte';
|
||||
import { IconArrowRight } from '@appwrite.io/pink-icons-svelte';
|
||||
import DatabaseImgSource from './assets/database.png';
|
||||
import DatabaseImgSourceDark from './assets/database-dark.png';
|
||||
import DiscordImgSource from './assets/discord.png';
|
||||
@@ -31,9 +26,10 @@
|
||||
import PlatformAndroidImgSourceDark from './assets/platform-android-dark.svg';
|
||||
import PlatformFlutterImgSource from './assets/platform-flutter.svg';
|
||||
import PlatformFlutterImgSourceDark from './assets/platform-flutter-dark.svg';
|
||||
import PlatformSdkImgSource from './assets/platform-sdk.jpg';
|
||||
import PlatformSdkImgSourceDark from './assets/platform-sdk-dark.png';
|
||||
import { base } from '$app/paths';
|
||||
import { isSmallViewport } from '$lib/stores/viewport';
|
||||
import { AvatarGroup } from '$lib/components';
|
||||
import type { Models } from '@appwrite.io/console';
|
||||
import { getPlatformInfo } from '$lib/helpers/platform';
|
||||
import { Click, trackEvent } from '$lib/actions/analytics';
|
||||
@@ -103,7 +99,9 @@
|
||||
</Layout.Stack>
|
||||
</div>
|
||||
<Layout.Stack gap="l">
|
||||
<Layout.Stack gap="l" direction="row">
|
||||
<Layout.Stack
|
||||
gap="l"
|
||||
direction={$isSmallViewport ? 'column' : 'row'}>
|
||||
<Card.Button
|
||||
on:click={() => {
|
||||
openPlatformWizard(0, platformMap.get('Web'));
|
||||
@@ -341,17 +339,34 @@
|
||||
</Layout.Stack>
|
||||
</Card.Button>
|
||||
</Layout.Stack>
|
||||
<Layout.Stack direction="row" gap="xxs" alignItems="center">
|
||||
<Typography.Text>Or connect</Typography.Text>
|
||||
<Link.Button variant="muted" on:click={createKey}
|
||||
>server side</Link.Button>
|
||||
<div style:padding-inline-start="8px">
|
||||
<AvatarGroup
|
||||
icons={[IconPython, IconNodeJs, IconPhp]}
|
||||
total={7}
|
||||
size="s" />
|
||||
</div>
|
||||
</Layout.Stack>
|
||||
<span class="with-separators eyebrow-heading-3">or</span>
|
||||
|
||||
<Card.Button on:click={createKey} padding="none">
|
||||
<Layout.Stack gap="xl">
|
||||
<div
|
||||
class="card-top-image api-key-card-image"
|
||||
style:background-image={`url('${
|
||||
$app.themeInUse === 'dark'
|
||||
? PlatformSdkImgSourceDark
|
||||
: PlatformSdkImgSource
|
||||
}')`}>
|
||||
<Layout.Stack
|
||||
direction="row"
|
||||
alignItems="center"
|
||||
justifyContent="space-between">
|
||||
<Layout.Stack gap="xxs">
|
||||
<Typography.Title size="s"
|
||||
>Create API key</Typography.Title>
|
||||
<Typography.Text
|
||||
>Connect your server or backend to Appwrite</Typography.Text>
|
||||
</Layout.Stack>
|
||||
<div class="arrow-icon">
|
||||
<Icon icon={IconArrowRight} size="s" />
|
||||
</div>
|
||||
</Layout.Stack>
|
||||
</div>
|
||||
</Layout.Stack>
|
||||
</Card.Button>
|
||||
</Layout.Stack>
|
||||
</Layout.Stack></Step.Item>
|
||||
<Step.Item state="next"
|
||||
@@ -684,6 +699,24 @@
|
||||
background-position: bottom;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.api-key-card-image {
|
||||
background-size: cover;
|
||||
background-position: right center;
|
||||
background-repeat: no-repeat;
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
min-height: 160px;
|
||||
border-radius: var(--border-radius-m);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-end;
|
||||
align-items: flex-start;
|
||||
padding: var(--base-16, 16px);
|
||||
@media (min-width: 1200px) {
|
||||
min-height: 187px;
|
||||
}
|
||||
}
|
||||
.full-height-card {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user