diff --git a/src/lib/stores/project-services.ts b/src/lib/stores/project-services.ts
new file mode 100644
index 000000000..6f4a8cb0d
--- /dev/null
+++ b/src/lib/stores/project-services.ts
@@ -0,0 +1,117 @@
+import { writable } from 'svelte/store';
+import type { Models } from '@aw-labs/appwrite-console';
+
+export type Service = {
+ label: string;
+ method: string;
+ value: boolean | null;
+};
+
+function createServices() {
+ const { subscribe, set } = writable({
+ list: [
+ {
+ label: 'Account',
+ method: 'account',
+ value: null
+ },
+ {
+ label: 'Avatars',
+ method: 'avatars',
+ value: null
+ },
+ {
+ label: 'Databases',
+ method: 'databases',
+ value: null
+ },
+ {
+ label: 'Functions',
+ method: 'functions',
+ value: null
+ },
+ {
+ label: 'Health',
+ method: 'health',
+ value: null
+ },
+ {
+ label: 'Locale',
+ method: 'locale',
+ value: null
+ },
+ {
+ label: 'Storage',
+ method: 'storage',
+ value: null
+ },
+ {
+ label: 'Teams',
+ method: 'teams',
+ value: null
+ },
+ {
+ label: 'Users',
+ method: 'users',
+ value: null
+ }
+ ]
+ });
+
+ return {
+ subscribe,
+ set,
+ load: (project: Models.Project) => {
+ const list = [
+ {
+ label: 'Account',
+ method: 'account',
+ value: project.serviceStatusForAccount
+ },
+ {
+ label: 'Avatars',
+ method: 'avatars',
+ value: project.serviceStatusForAvatars
+ },
+ {
+ label: 'Databases',
+ method: 'databases',
+ value: project.serviceStatusForDatabases
+ },
+ {
+ label: 'Functions',
+ method: 'functions',
+ value: project.serviceStatusForFunctions
+ },
+ {
+ label: 'Health',
+ method: 'health',
+ value: project.serviceStatusForHealth
+ },
+ {
+ label: 'Locale',
+ method: 'locale',
+ value: project.serviceStatusForLocale
+ },
+ {
+ label: 'Storage',
+ method: 'storage',
+ value: project.serviceStatusForStorage
+ },
+ {
+ label: 'Teams',
+ method: 'teams',
+ value: project.serviceStatusForTeams
+ },
+ {
+ label: 'Users',
+ method: 'users',
+ value: project.serviceStatusForUsers
+ }
+ ];
+ set({ list });
+ }
+ };
+}
+
+export const services = createServices();
diff --git a/src/lib/stores/user.ts b/src/lib/stores/user.ts
index fe9993066..12a84121b 100644
--- a/src/lib/stores/user.ts
+++ b/src/lib/stores/user.ts
@@ -10,6 +10,9 @@ function createUserStore() {
set,
fetchUser: async () => {
set(await sdkForConsole.account.get());
+ },
+ logout: async () => {
+ await sdkForConsole.account.deleteSession('current');
}
};
}
diff --git a/src/routes/__layout.svelte b/src/routes/__layout.svelte
index 71975c517..2b2f30128 100644
--- a/src/routes/__layout.svelte
+++ b/src/routes/__layout.svelte
@@ -23,6 +23,8 @@
window.GOOGLE_ANALYTICS = import.meta.env.VITE_GOOGLE_ANALYTICS?.toString() ?? false;
}
+ const acceptedRoutes = ['/login', '/register', '/recover', '/invite'];
+
onMount(async () => {
try {
if (!$user) {
@@ -33,7 +35,9 @@
await redirectTo();
}
} catch (error) {
- await goto(`${base}/login`);
+ if (acceptedRoutes.includes($page.url.pathname)) {
+ await goto(`${base}${$page.url.pathname}${$page.url.search}`);
+ } else await goto(`${base}/login`);
} finally {
loaded = true;
}
diff --git a/src/routes/console/$me.svelte b/src/routes/console/$me.svelte
deleted file mode 100644
index 732f4edb7..000000000
--- a/src/routes/console/$me.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
hey
-
toggle Theme
-
Logout
diff --git a/src/routes/console/__layout.svelte b/src/routes/console/__layout.svelte
index e772abdce..d31f50a6b 100644
--- a/src/routes/console/__layout.svelte
+++ b/src/routes/console/__layout.svelte
@@ -36,7 +36,10 @@
Appwrite - Console
-
+
diff --git a/src/routes/console/account/__layout.svelte b/src/routes/console/account/__layout.svelte
new file mode 100644
index 000000000..d6b6d2ab4
--- /dev/null
+++ b/src/routes/console/account/__layout.svelte
@@ -0,0 +1,51 @@
+
+
+
+ Appwrite - User
+
+
+
diff --git a/src/routes/console/account/_delete.svelte b/src/routes/console/account/_delete.svelte
new file mode 100644
index 000000000..f64b36636
--- /dev/null
+++ b/src/routes/console/account/_delete.svelte
@@ -0,0 +1,36 @@
+
+
+
diff --git a/src/routes/console/account/activity.svelte b/src/routes/console/account/activity.svelte
new file mode 100644
index 000000000..5f00d11e2
--- /dev/null
+++ b/src/routes/console/account/activity.svelte
@@ -0,0 +1,106 @@
+
+
+
+ {#await request}
+
+ {:then response}
+ {#if response.total}
+
+
+ Date
+ Event
+ Client
+ Location
+ IP
+
+
+ {#each response.logs as log}
+
+ {toLocaleDateTime(log.time)}
+ {log.event}
+
+
+ {#if log.clientName}
+
+
+
+
+
+ {log.clientName}
+ {log.clientVersion}
+ on {log.osName}
+ {log.osVersion}
+
+
+ {:else}
+
+ {/if}
+
+
+
+ {#if log.countryCode !== '--'}
+ {log.countryName}
+ {:else}
+ Unknown
+ {/if}
+
+ {log.ip}
+
+ {/each}
+
+
+ {:else}
+
+
+
+ {/if}
+
+
Total results: {response.total}
+
+
+ {/await}
+
diff --git a/src/routes/console/account/index.svelte b/src/routes/console/account/index.svelte
new file mode 100644
index 000000000..df6fadaa2
--- /dev/null
+++ b/src/routes/console/account/index.svelte
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
Delete Account
+
+
+ Your account will be permanently deleted and access will be lost to any of your teams
+ and data. This action is irreversible.
+
+
+
+
+
+
+
+ {$user.name}
+
+
+
+
+
+ (showDelete = true)}>Delete
+
+
+
+
+
diff --git a/src/routes/console/account/organizations.svelte b/src/routes/console/account/organizations.svelte
new file mode 100644
index 000000000..3005a8d47
--- /dev/null
+++ b/src/routes/console/account/organizations.svelte
@@ -0,0 +1,110 @@
+
+
+
+
+
Organizations
+
+ {
+ addOrganization = true;
+ }}>
+
+ Create organization
+
+
+
+ {#if $organizationList?.teams?.length}
+ 3 ? '22rem' : '25rem'
+ };`}>
+ {#each $organizationList.teams as organization, index}
+ {@const avatarList = getMemberships(organization.$id)}
+ {#if index >= offset && index < limit + offset}
+
+ {organization?.total ? organization?.total : 'No'} projects
+
+ {organization.name}
+
+ {#await avatarList}
+
+ {:then avatars}
+
+ {/await}
+
+ {/if}
+ {/each}
+ {#if $organizationList?.total < limit + offset && ($organizationList?.total % 2 !== 0 || $organizationList?.total % 4 === 0)}
+ (addOrganization = true)}>
+
+
+
+
+
+
+
Create a new organization
+
+
+ {/if}
+
+
+
+
Total results: {$organizationList?.total}
+
+
+ {:else}
+
+
+
+
+ (addOrganization = true)}>
+
+
+
+
+
Create a new organization
+
+
+
+
+
+
Total results: {$organizationList?.total}
+
+
+ {/if}
+
+
+
diff --git a/src/routes/console/account/sessions.svelte b/src/routes/console/account/sessions.svelte
new file mode 100644
index 000000000..6bc5c6eca
--- /dev/null
+++ b/src/routes/console/account/sessions.svelte
@@ -0,0 +1,124 @@
+
+
+
+
+
Sessions
+
+
+ Logout all sessions
+
+
+ {#await request}
+
+ {:then response}
+ {#if response.total}
+
+
+ Client
+ Location
+ IP
+
+
+
+ {#each response.sessions as session}
+
+
+
+
+ {#if session.clientName}
+
+
+
+
+ {session.clientName}
+ {session.clientVersion}
+ on {session.osName}
+ {session.osVersion}
+
+ {:else}
+
+
Unknown
+ {/if}
+
+
+
{session.provider}
+ {#if session.current}
+
current session
+ {/if}
+
+
+
+ {#if session.countryCode !== '--'}
+ {session.countryName}
+ {:else}
+ Unknown
+ {/if}
+
+ {session.ip}
+
+ logout(session)}>Logout
+
+
+ {/each}
+
+
+ {:else}
+
+
+
+
No sessions available
+
+
+ Documentation
+
+
+
+ {/if}
+
+
Total results: {response.total}
+
+
+ {/await}
+
diff --git a/src/routes/console/organization-[organization]/_createMember.svelte b/src/routes/console/organization-[organization]/_createMember.svelte
index 237c167ca..b3b2f67c5 100644
--- a/src/routes/console/organization-[organization]/_createMember.svelte
+++ b/src/routes/console/organization-[organization]/_createMember.svelte
@@ -14,7 +14,7 @@
const dispatch = createEventDispatcher();
let email: string, name: string, error: string;
- const url = `${$page.url.origin}/console/`;
+ const url = `${$page.url.origin}/invite`;
const create = async () => {
try {
diff --git a/src/routes/console/organization-[organization]/_deleteMember.svelte b/src/routes/console/organization-[organization]/_deleteMember.svelte
index 215cee0a8..8a7ba31f5 100644
--- a/src/routes/console/organization-[organization]/_deleteMember.svelte
+++ b/src/routes/console/organization-[organization]/_deleteMember.svelte
@@ -1,4 +1,6 @@
+
+
diff --git a/src/routes/console/project-[project]/settings/index.svelte b/src/routes/console/project-[project]/settings/index.svelte
index d2fb3e02f..663857030 100644
--- a/src/routes/console/project-[project]/settings/index.svelte
+++ b/src/routes/console/project-[project]/settings/index.svelte
@@ -1,15 +1,34 @@
- Overview
{#if $project}
-
-
-
+
+
+
+ API Credentials
+
+ Access Appwrite services using your API Endpoint and Project ID. You can connect
+ Appwrite to your applications and server-side code by integrating a new platform
+ or
+ creating an API key .
+
+
+
+
+
+
+
+
+
+
+ Services
+ Choose services you wish to enable or disable.
+
+
+
+
+
+
+
+
+
+
Delete Project
+
+
+ The project will be permanently deleted, including all the metadata, resources and
+ stats within it. This action is irreversible.
+
+
+
+
+ {$project.name}
+
+ Last update: {toLocaleDateTime($project.$updatedAt)}
+
+
+
+
+ (showDelete = true)}>Delete
+
+
{/if}
+
+
diff --git a/src/routes/console/project-[project]/settings/members.svelte b/src/routes/console/project-[project]/settings/members.svelte
deleted file mode 100644
index da6770b55..000000000
--- a/src/routes/console/project-[project]/settings/members.svelte
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
- Members
- {#await request}
-
- {:then response}
- {#if response}
-
- {#each response.memberships as membership}
-
-
-
-
- {membership.userName}
-
-
- {#each membership.roles as role}
- {role}
- {/each}
- {#if !membership.confirm}
- Pending Approval
- {/if}
-
-
- {membership.userEmail}
-
-
- Remove
-
-
- {:else}
- No sessions available.
- {/each}
-
- {/if}
- {/await}
-
diff --git a/src/routes/invite.svelte b/src/routes/invite.svelte
new file mode 100644
index 000000000..374ebc914
--- /dev/null
+++ b/src/routes/invite.svelte
@@ -0,0 +1,76 @@
+
+
+
+ Appwrite - Accept invite
+
+
+
+ Invite
+
+ {#if !userId || !secret || !membershipId || !teamId}
+ Invalid invite link.
+ {:else}
+ You have been invited to join a team project on Appwrite
+
+ {/if}
+
+