mirror of
https://github.com/appwrite/console.git
synced 2026-06-06 19:27:48 +00:00
Add feature flag checks
This commit is contained in:
@@ -286,6 +286,7 @@ export type Plan = {
|
||||
supportsMockNumbers: boolean;
|
||||
backupsEnabled: boolean;
|
||||
backupPolicies: number;
|
||||
emailBranding: boolean;
|
||||
};
|
||||
|
||||
export type PlansInfo = {
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
import { Button, Form, FormList, InputNumber, InputSwitch } from '$lib/elements/forms';
|
||||
import { showUsageRatesModal, upgradeURL } from '$lib/stores/billing';
|
||||
import { addNotification } from '$lib/stores/notifications';
|
||||
import { organization } from '$lib/stores/organization';
|
||||
import { organization, currentPlan } from '$lib/stores/organization';
|
||||
import { sdk } from '$lib/stores/sdk';
|
||||
import { onMount } from 'svelte';
|
||||
|
||||
@@ -59,8 +59,7 @@
|
||||
class="link">Learn more about usage rates.</button>
|
||||
</p>
|
||||
<svelte:fragment slot="aside">
|
||||
<!-- TODO: show this based on the plan detail for budgetcap-->
|
||||
{#if $organization?.billingPlan === BillingPlan.FREE}
|
||||
{#if !$currentPlan.budgeting}
|
||||
<Alert type="info">
|
||||
<svelte:fragment slot="title">
|
||||
Budget caps are a Pro plan feature
|
||||
|
||||
@@ -7,9 +7,11 @@ import { failedInvoice } from '$lib/stores/billing';
|
||||
import { isCloud } from '$lib/system';
|
||||
import type { Organization } from '$lib/stores/organization';
|
||||
import { defaultRoles, defaultScopes } from '$lib/constants';
|
||||
import type { Plan } from '$lib/sdk/billing';
|
||||
|
||||
export const load: LayoutLoad = async ({ params, depends }) => {
|
||||
depends(Dependencies.PROJECT);
|
||||
let currentPlan: Plan = null;
|
||||
|
||||
try {
|
||||
const project = await sdk.forConsole.projects.get(params.project);
|
||||
@@ -27,6 +29,7 @@ export const load: LayoutLoad = async ({ params, depends }) => {
|
||||
let roles = isCloud ? [] : defaultRoles;
|
||||
let scopes = isCloud ? [] : defaultScopes;
|
||||
if (isCloud) {
|
||||
currentPlan = await sdk.forConsole.billing.getPlan(project.teamId);
|
||||
const res = await sdk.forConsole.billing.getRoles(project.teamId);
|
||||
roles = res.roles;
|
||||
scopes = res.scopes;
|
||||
@@ -39,7 +42,8 @@ export const load: LayoutLoad = async ({ params, depends }) => {
|
||||
project,
|
||||
organization,
|
||||
roles,
|
||||
scopes
|
||||
scopes,
|
||||
currentPlan
|
||||
};
|
||||
} catch (e) {
|
||||
error(e.code, e.message);
|
||||
|
||||
@@ -9,8 +9,7 @@
|
||||
import { addNotification } from '$lib/stores/notifications';
|
||||
import { invalidate } from '$app/navigation';
|
||||
import { Dependencies } from '$lib/constants';
|
||||
import { organization } from '$lib/stores/organization';
|
||||
import { BillingPlan } from '$lib/constants';
|
||||
import { currentPlan } from '$lib/stores/organization';
|
||||
import { isCloud, isSelfHosted } from '$lib/system';
|
||||
import MockNumbersLight from './mock-numbers-light.png';
|
||||
import MockNumbersDark from './mock-numbers-dark.png';
|
||||
@@ -26,9 +25,8 @@
|
||||
$: initialNumbers = $project?.authMockNumbers?.map((num) => ({ ...num })) ?? [];
|
||||
$: isSubmitDisabled = JSON.stringify(numbers) === JSON.stringify(initialNumbers);
|
||||
|
||||
//TODO check for plan details on if mocknumbers is allowed
|
||||
let isComponentDisabled: boolean =
|
||||
isSelfHosted || (isCloud && $organization?.billingPlan === BillingPlan.FREE);
|
||||
isSelfHosted || (isCloud && !$currentPlan.supportsMockNumbers);
|
||||
let emptyStateTitle: string = isSelfHosted
|
||||
? 'Available on Appwrite Cloud'
|
||||
: 'Upgrade to add mock phone numbers';
|
||||
|
||||
@@ -50,8 +50,7 @@
|
||||
// import { baseEmailTemplate, baseSmsTemplate, emailTemplate, smsTemplate } from './store';
|
||||
import { baseEmailTemplate, emailTemplate } from './store';
|
||||
import { Button } from '$lib/elements/forms';
|
||||
import { organization } from '$lib/stores/organization';
|
||||
import { BillingPlan } from '$lib/constants';
|
||||
import { currentPlan } from '$lib/stores/organization';
|
||||
import EmailSignature from './emailSignature.svelte';
|
||||
import { isCloud } from '$lib/system';
|
||||
import type {
|
||||
@@ -268,8 +267,7 @@
|
||||
</Collapsible>
|
||||
</svelte:fragment>
|
||||
</CardGrid>-->
|
||||
<!-- // TODO change check to plan details emailBranding property-->
|
||||
{#if isCloud && $organization?.billingPlan === BillingPlan.FREE}
|
||||
{#if isCloud && !$currentPlan.emailBranding}
|
||||
<EmailSignature />
|
||||
{/if}
|
||||
</Container>
|
||||
|
||||
+6
-11
@@ -11,9 +11,9 @@
|
||||
import { addNotification, dismissAllNotifications } from '$lib/stores/notifications';
|
||||
import { sdk } from '$lib/stores/sdk';
|
||||
import { invalidate } from '$app/navigation';
|
||||
import { BillingPlan, Dependencies } from '$lib/constants';
|
||||
import { Dependencies } from '$lib/constants';
|
||||
import { isCloud, isSelfHosted } from '$lib/system';
|
||||
import { organization } from '$lib/stores/organization';
|
||||
import { currentPlan } from '$lib/stores/organization';
|
||||
import { onMount } from 'svelte';
|
||||
import { feedback } from '$lib/stores/feedback';
|
||||
import { cronExpression, type UserBackupPolicy } from '$lib/helpers/backups';
|
||||
@@ -24,19 +24,12 @@
|
||||
|
||||
let policyCreateError: string;
|
||||
let totalPolicies: UserBackupPolicy[] = [];
|
||||
// TODO: check the plan to see if the custom policies are disabled
|
||||
let isDisabled = isSelfHosted || (isCloud && $organization?.billingPlan === BillingPlan.FREE);
|
||||
let isDisabled = isSelfHosted || (isCloud && !$currentPlan.backupsEnabled);
|
||||
|
||||
export let data: PageData;
|
||||
|
||||
$: hasPolicyCreationLimitations = () => {
|
||||
// allow when on Pro and no policy exists
|
||||
// TODO: check the plan to see if the custom policies are disabled and limitations
|
||||
if ($organization?.billingPlan === BillingPlan.PRO) {
|
||||
return data.policies.total > 0;
|
||||
} else if ($organization?.billingPlan === BillingPlan.SCALE) {
|
||||
return false;
|
||||
}
|
||||
return data.policies.total >= $currentPlan.backupPolicies;
|
||||
};
|
||||
|
||||
const showFeedbackNotification = () => {
|
||||
@@ -187,6 +180,8 @@
|
||||
buttonType="secondary"
|
||||
buttonDisabled={isDisabled}
|
||||
hasLimitations={hasPolicyCreationLimitations()}
|
||||
maxPolicies={$currentPlan.backupPolicies}
|
||||
policiesCreated={data.policies.total}
|
||||
buttonMethod={() => {
|
||||
$showCreatePolicy = true;
|
||||
trackEvent('click_policy_create');
|
||||
|
||||
+7
-12
@@ -4,14 +4,13 @@
|
||||
import { Pill } from '$lib/elements';
|
||||
import { wizard } from '$lib/stores/wizard';
|
||||
import SupportWizard from '$routes/(console)/supportWizard.svelte';
|
||||
import { BillingPlan } from '$lib/constants';
|
||||
import { organization } from '$lib/stores/organization';
|
||||
|
||||
export let isFlex = true;
|
||||
export let title: string;
|
||||
|
||||
export let buttonText: string = null;
|
||||
export let hasLimitations: boolean = true;
|
||||
export let policiesCreated: number = 0;
|
||||
export let maxPolicies: number = 0;
|
||||
export let buttonMethod: () => void = null;
|
||||
export let buttonEvent: string = buttonText?.toLocaleLowerCase();
|
||||
export let buttonDisabled = false;
|
||||
@@ -27,16 +26,16 @@
|
||||
<div class="u-flex u-cross-child-center u-cross-center u-gap-12">
|
||||
<div class="body-text-1 u-bold backups-title">{title}</div>
|
||||
|
||||
{#if hasLimitations && $organization.billingPlan === BillingPlan.PRO}
|
||||
{#if title === 'Policies' && policiesCreated >= maxPolicies}
|
||||
<div style="height: 40px; padding-block-start: 4px">
|
||||
<DropList bind:show={showDropdown} width="16">
|
||||
<Pill button on:click={() => (showDropdown = true)}>
|
||||
<span class="icon-info" />1/1 created
|
||||
<span class="icon-info" />{policiesCreated}/{maxPolicies} created
|
||||
</Pill>
|
||||
<svelte:fragment slot="list">
|
||||
<slot name="tooltip">
|
||||
<span>
|
||||
You are limited to one policy on Pro plan.
|
||||
You are limited to one policy on your plan.
|
||||
<button
|
||||
class="u-underline"
|
||||
on:click={() => {
|
||||
@@ -52,14 +51,10 @@
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
{#if !hasLimitations}
|
||||
{#if title === 'Backups' || policiesCreated < maxPolicies}
|
||||
<Button
|
||||
event={buttonEvent}
|
||||
on:click={hasLimitations
|
||||
? () => {
|
||||
showDropdown = true;
|
||||
}
|
||||
: buttonMethod}
|
||||
on:click={buttonMethod}
|
||||
disabled={buttonDisabled}
|
||||
text={buttonType === 'text'}
|
||||
secondary={buttonType === 'secondary'}>
|
||||
|
||||
Reference in New Issue
Block a user