Skip to content

Commit 6883e4e

Browse files
committed
List projects from accout service
1 parent e374a49 commit 6883e4e

9 files changed

+70
-31
lines changed

web/components/ProjectList.vue

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<script lang="ts" setup>
2+
const createNewProject = useCreateNewProject();
3+
4+
const { data: projects, isFetching } = useProjectListQuery();
5+
const filter = ref('');
6+
const filteredProjects = useArrayFilter(projects, (p) =>
7+
p.name.toLowerCase().includes(filter.value.toLowerCase()),
8+
);
9+
10+
const openProject = useOpenProject();
11+
const deleteProject = useDeleteProject();
12+
</script>
13+
14+
<template>
15+
<ul class="flex flex-col gap-2">
16+
<li>
17+
<UInput
18+
v-model="filter"
19+
placeholder="Filter projects..."
20+
icon="i-heroicons-magnifying-glass"
21+
/>
22+
</li>
23+
<ProjectListItem
24+
v-for="project of filteredProjects"
25+
:key="project.id"
26+
:project
27+
@open="openProject"
28+
@delete="deleteProject"
29+
/>
30+
<li v-if="isFetching" class="flex justify-center">
31+
<UButton
32+
class="pointer-events-none"
33+
loading
34+
variant="ghost"
35+
color="white"
36+
disabled
37+
>
38+
Loading...
39+
</UButton>
40+
</li>
41+
<li v-else-if="filteredProjects.length === 0" class="text-center py-16">
42+
No projects,
43+
<ULink variant="link" @click="createNewProject">add one</ULink>
44+
</li>
45+
<slot />
46+
</ul>
47+
</template>
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export default function () {
2+
const account = useAccountService();
3+
return computed(() => account.value.id);
4+
}
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { useQuery } from '@tanstack/vue-query';
2+
3+
export default function () {
4+
const account = useAccountService();
5+
const accountId = useAccountServiceId();
6+
const user = useCurrentUser();
7+
return useQuery({
8+
queryKey: ['projects', accountId],
9+
queryFn: () => account.value.listProjects(),
10+
initialData: [],
11+
});
12+
}

web/pages/account.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ async function syncProjects() {
4848
<div class="bg-gray-200 dark:bg-gray-800 h-full p-8 flex flex-col gap-4">
4949
<h2 class="text-2xl font-medium line-clamp-1 truncate">Account</h2>
5050
<template v-if="!currentUser">
51-
<p>Login to share settings and projects between devices</p>
51+
<p>Login to share settings and projects between devices.</p>
5252
<div ref="container" v-if="!currentUser" />
5353
</template>
5454
<template v-else>

web/pages/index.vue

+2-29
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,6 @@
22
import { version } from '~~/package.json';
33
44
const createNewProject = useCreateNewProject();
5-
6-
const projects = useProjects();
7-
const filter = ref('');
8-
const filteredProjects = useArrayFilter(projects, (p) =>
9-
p.name.toLowerCase().includes(filter.value.toLowerCase()),
10-
);
11-
12-
const openProject = useOpenProject();
13-
const deleteProject = useDeleteProject();
145
</script>
156

167
<template>
@@ -28,25 +19,7 @@ const deleteProject = useDeleteProject();
2819
>
2920
</div>
3021
<ClientOnly>
31-
<ul class="flex flex-col gap-2">
32-
<li v-if="projects.length">
33-
<UInput
34-
v-model="filter"
35-
placeholder="Filter projects..."
36-
icon="i-heroicons-magnifying-glass"
37-
/>
38-
</li>
39-
<ProjectListItem
40-
v-for="project of filteredProjects"
41-
:key="project.id"
42-
:project
43-
@open="openProject"
44-
@delete="deleteProject"
45-
/>
46-
<li v-if="filteredProjects.length === 0" class="text-center py-16">
47-
No projects,
48-
<ULink variant="link" @click="createNewProject">add one</ULink>
49-
</li>
22+
<ProjectList>
5023
<li class="text-center pt-16 opacity-50">
5124
<ULink
5225
class="hover:underline"
@@ -69,7 +42,7 @@ const deleteProject = useDeleteProject();
6942
>User Manual</ULink
7043
>
7144
</li>
72-
</ul>
45+
</ProjectList>
7346
</ClientOnly>
7447
</div>
7548
</div>

web/plugins/vue-query.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export default defineNuxtPlugin((nuxt) => {
1919
const queryClient = new QueryClient({
2020
defaultOptions: {
2121
queries: {
22-
refetchOnMount: false,
22+
refetchOnMount: true,
2323
refetchOnWindowFocus: false,
2424
retry: false,
2525
},

web/utils/accounts/AccountService.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { Project } from '../projects';
22

33
export interface AccountService {
4+
id: string;
45
getSettings(): Promise<AccountSettings>;
56
setSettings(changes: Partial<AccountSettings>): Promise<void>;
67
listProjects(): Promise<Project[]>;

web/utils/accounts/FirebaseAccountService.ts

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export function createFirebaseAccountService(): AccountService {
2121
const projectDoc = (id: string) => doc(usersRef, getUid(), 'projects', id);
2222

2323
return {
24+
id: 'firebase',
2425
async getSettings() {
2526
const res = await getDoc(settingsDoc());
2627
return {

web/utils/accounts/LocalAccountService.ts

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export function createLocalAccountService(): AccountService {
6565
};
6666

6767
return {
68+
id: 'local',
6869
async getSettings() {
6970
return getSettings();
7071
},

0 commit comments

Comments
 (0)