Skip to content

Commit 0713ce5

Browse files
authored
Merge branch 'main' into fix-1997-bring-back-the-current-version-in-the-footer
2 parents c70e115 + 8b5b8d1 commit 0713ce5

File tree

98 files changed

+1184
-541
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+1184
-541
lines changed

.github/workflows/publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ jobs:
9999
password: ${{ secrets.DOCKERHUB_TOKEN }}
100100
- name: Extract metadata (tags, labels) for Docker
101101
id: meta
102-
uses: docker/metadata-action@v5
102+
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
103103
with:
104104
images: appwrite/console
105105
tags: |

e2e/steps/pro-project.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,15 @@ export async function enterCreditCard(page: Page) {
1414
state: 'visible'
1515
});
1616
await page.getByPlaceholder('cardholder').fill('Test User');
17-
const stripe = page.frameLocator('[title="Secure payment input frame"]');
17+
const stripe = page.locator('[title="Secure payment input frame"]').nth(0).contentFrame();
1818
await stripe.locator('id=Field-numberInput').fill('4242424242424242');
1919
await stripe.locator('id=Field-expiryInput').fill('1250');
2020
await stripe.locator('id=Field-cvcInput').fill('123');
2121
await stripe.locator('id=Field-countryInput').selectOption('DE');
2222
await dialog.getByRole('button', { name: 'Add', exact: true }).click();
23+
await page.locator('id=state-picker').click(); // open dropdown
24+
await page.getByRole('option', { name: 'Alabama' }).click();
25+
await dialog.getByRole('button', { name: 'Add', exact: true }).click();
2326
await dialog.waitFor({
2427
state: 'hidden'
2528
});

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222
},
2323
"dependencies": {
2424
"@ai-sdk/svelte": "^1.1.24",
25-
"@appwrite.io/console": "https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@2289",
25+
"@appwrite.io/console": "^1.10.0",
2626
"@appwrite.io/pink-icons": "0.25.0",
27-
"@appwrite.io/pink-icons-svelte": "^2.0.0-RC.1",
27+
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@d93a5e9",
2828
"@appwrite.io/pink-legacy": "^1.0.3",
29-
"@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@95bdb79",
29+
"@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@d93a5e9",
3030
"@popperjs/core": "^2.11.8",
3131
"@sentry/sveltekit": "^8.38.0",
3232
"@stripe/stripe-js": "^3.5.0",

pnpm-lock.yaml

Lines changed: 15 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/app.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
<meta
66
name="description"
77
content="Appwrite is an open-source platform for building applications at any scale, using your preferred programming languages and tools." />
8-
<link rel="icon" type="image/svg+xml" href="/console/logos/appwrite-icon.svg" />
9-
<link rel="mask-icon" type="image/png" href="/console/logos/appwrite-icon.png" />
10-
<link rel="stylesheet" href="/console/css/loading.css" />
8+
<link rel="icon" type="image/svg+xml" href="%sveltekit.assets%/logos/appwrite-icon.svg" />
9+
<link rel="mask-icon" type="image/png" href="%sveltekit.assets%/logos/appwrite-icon.png" />
10+
<link rel="stylesheet" href="%sveltekit.assets%/css/loading.css" />
1111
<meta name="viewport" content="width=device-width, initial-scale=1" />
1212
%sveltekit.head%
1313
</head>
@@ -40,13 +40,13 @@
4040
<div></div>
4141
</div>
4242
<img
43-
src="/console/images/appwrite-logo-light.svg"
43+
src="%sveltekit.assets%/images/appwrite-logo-light.svg"
4444
width="120"
4545
height="22"
4646
class="logo-light"
4747
alt="Appwrite Logo" />
4848
<img
49-
src="/console/images/appwrite-logo-dark.svg"
49+
src="%sveltekit.assets%/images/appwrite-logo-dark.svg"
5050
width="120"
5151
height="22"
5252
class="logo-dark"

src/lib/components/billing/alerts/selectProjectCloud.svelte

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
let error = $state<string | null>(null);
2525
2626
onMount(() => {
27-
projects = page.data.projects?.projects || [];
27+
const currentOrgId = page.data.organization?.$id;
28+
projects =
29+
page.data.currentOrgId === currentOrgId ? page.data.allProjects?.projects || [] : [];
2830
});
2931
3032
let projectsToArchive = $derived(
@@ -71,7 +73,8 @@
7173

7274
<Modal bind:show={showSelectProject} title={'Manage projects'} onSubmit={updateSelected}>
7375
<svelte:fragment slot="description">
74-
Choose which two projects to keep. Projects over the limit will be blocked after this date.
76+
Choose which {$currentPlan?.projects || 2} projects to keep. Projects over the limit will be
77+
blocked after this date.
7578
</svelte:fragment>
7679
{#if error}
7780
<Alert.Inline status="error" title="Error">{error}</Alert.Inline>

src/lib/components/billing/paymentBoxes.svelte

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import { initializeStripe, unmountPaymentElement } from '$lib/stores/stripe';
66
import { Badge, Card, Layout } from '@appwrite.io/pink-svelte';
77
import type { PaymentMethodData } from '$lib/sdk/billing';
8+
import type { PaymentMethod } from '@stripe/stripe-js';
9+
import StatePicker from './statePicker.svelte';
810
911
export let methods: PaymentMethodData[];
1012
export let group: string;
@@ -14,6 +16,9 @@
1416
export let disabledCondition: string = null;
1517
export let setAsDefault = false;
1618
export let showSetAsDefault = false;
19+
export let showState = false;
20+
export let paymentMethod: PaymentMethod | null = null;
21+
export let state: string = '';
1722
1823
let element: HTMLDivElement;
1924
let loader: HTMLDivElement;
@@ -79,25 +84,29 @@
7984
{/each}
8085
<Card.Selector title="Add new payment method" name="$new" bind:group value="$new" />
8186
{#if group === '$new'}
82-
<InputText
83-
id="name"
84-
label="Cardholder name"
85-
placeholder="Cardholder name"
86-
bind:value={name}
87-
required
88-
autofocus={true} />
87+
{#if showState}
88+
<StatePicker card={paymentMethod} bind:state />
89+
{:else}
90+
<InputText
91+
id="name"
92+
label="Cardholder name"
93+
placeholder="Cardholder name"
94+
bind:value={name}
95+
required
96+
autofocus={true} />
8997

90-
<div class="aw-stripe-container" data-private>
91-
<div class="loader-container" bind:this={loader}>
92-
<div class="loader"></div>
98+
<div class="aw-stripe-container" data-private>
99+
<div class="loader-container" bind:this={loader}>
100+
<div class="loader"></div>
101+
</div>
102+
<div bind:this={element}></div>
93103
</div>
94-
<div bind:this={element}></div>
95-
</div>
96-
{#if showSetAsDefault}
97-
<InputChoice
98-
bind:value={setAsDefault}
99-
id="default"
100-
label="Set as default payment method for this organization" />
104+
{#if showSetAsDefault}
105+
<InputChoice
106+
bind:value={setAsDefault}
107+
id="default"
108+
label="Set as default payment method for this organization" />
109+
{/if}
101110
{/if}
102111
{/if}
103112
</Layout.Stack>

src/lib/components/billing/paymentModal.svelte

Lines changed: 51 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
import { FakeModal } from '$lib/components';
33
import { InputText, Button } from '$lib/elements/forms';
44
import { createEventDispatcher, onMount } from 'svelte';
5-
import { initializeStripe, submitStripeCard } from '$lib/stores/stripe';
5+
import { initializeStripe, setPaymentMethod, submitStripeCard } from '$lib/stores/stripe';
66
import { invalidate } from '$app/navigation';
77
import { Dependencies } from '$lib/constants';
88
import { addNotification } from '$lib/stores/notifications';
99
import { page } from '$app/state';
1010
import { Spinner } from '@appwrite.io/pink-svelte';
11+
import type { PaymentMethod } from '@stripe/stripe-js';
12+
import StatePicker from './statePicker.svelte';
1113
1214
export let show = false;
1315
@@ -16,10 +18,36 @@
1618
let name: string;
1719
let error: string;
1820
let modal: FakeModal;
21+
let showState: boolean = false;
22+
let state: string = '';
23+
let paymentMethod: PaymentMethod | null = null;
1924
2025
async function handleSubmit() {
2126
try {
27+
if (showState && !state) {
28+
throw Error('Please select a state');
29+
}
30+
31+
if (showState) {
32+
const card = await setPaymentMethod(paymentMethod.id, name, state);
33+
modal.closeModal();
34+
await invalidate(Dependencies.PAYMENT_METHODS);
35+
dispatch('submit', card);
36+
addNotification({
37+
type: 'success',
38+
message: 'A new payment method has been added to your account'
39+
});
40+
return;
41+
}
42+
2243
const card = await submitStripeCard(name, page?.params?.organization ?? null);
44+
if (card && Object.hasOwn(card, 'id')) {
45+
if ((card as PaymentMethod).card.country === 'US') {
46+
paymentMethod = card as PaymentMethod;
47+
showState = true;
48+
return;
49+
}
50+
}
2351
modal.closeModal();
2452
await invalidate(Dependencies.PAYMENT_METHODS);
2553
dispatch('submit', card);
@@ -73,28 +101,30 @@
73101
bind:error
74102
onSubmit={handleSubmit}>
75103
<slot />
76-
<InputText
77-
id="name"
78-
required
79-
autofocus={true}
80-
bind:value={name}
81-
label="Cardholder name"
82-
placeholder="Cardholder name" />
83-
84-
<div class="aw-stripe-container" data-private>
85-
{#if isLoading}
86-
<div class="loader-element">
87-
<Spinner />
104+
{#if showState}
105+
<StatePicker card={paymentMethod} bind:state />
106+
{:else}
107+
<InputText
108+
id="name"
109+
required
110+
autofocus={true}
111+
bind:value={name}
112+
label="Cardholder name"
113+
placeholder="Cardholder name" />
114+
<div class="aw-stripe-container" data-private>
115+
{#if isLoading}
116+
<div class="loader-element">
117+
<Spinner />
118+
</div>
119+
{/if}
120+
<div
121+
style:display={isLoading ? 'none' : 'initial'}
122+
class="stripe-element"
123+
bind:this={element}>
124+
<!-- Stripe will create form elements here -->
88125
</div>
89-
{/if}
90-
91-
<div
92-
style:display={isLoading ? 'none' : 'initial'}
93-
class="stripe-element"
94-
bind:this={element}>
95-
<!-- Stripe will create form elements here -->
96126
</div>
97-
</div>
127+
{/if}
98128
<slot name="end"></slot>
99129
<svelte:fragment slot="footer">
100130
<Button secondary on:click={() => (show = false)}>Cancel</Button>

0 commit comments

Comments
 (0)