Skip to content

Commit df5c7fc

Browse files
committed
chore(refactor): members use repository
1 parent 2c342f5 commit df5c7fc

File tree

4 files changed

+28
-65
lines changed

4 files changed

+28
-65
lines changed

app/components/admin/settings/members/AddAction.vue

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
import type { User } from '~~/server/db/schema';
33
import { watchDebounced } from '@vueuse/core';
44
5-
const { addMember, isSubmitting } = await useMembers();
5+
const { postData, changing } = await useMembersRepository();
66
77
const suggestedUsers = ref<User[]>();
88
99
const submit = async (id: string, closeFn: () => void) => {
1010
let success = false;
1111
if (id) {
12-
success = await addMember({ id });
12+
success = await postData({ id });
1313
}
1414
if (success) {
1515
closeFn();
@@ -53,7 +53,7 @@ watchDebounced(
5353
class="input-custom"
5454
placeholder="Start searching to add members"
5555
v-model="userSearchQuery"
56-
:disabled="isSubmitting"
56+
:disabled="changing"
5757
/>
5858
<div
5959
class="flex flex-col space-y-3 overflow-y-scroll no-scrollbar h-64 mt-3"
@@ -81,7 +81,7 @@ watchDebounced(
8181
size="sm"
8282
variant="outline"
8383
@click="submit(user.id, close)"
84-
:disabled="isSubmitting"
84+
:loading="changing"
8585
>Add</InputButton
8686
>
8787
</div>

app/components/admin/settings/members/Card.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ const props = defineProps<{
55
member: User;
66
}>();
77
8-
const { removeMember } = await useMembers();
8+
const { deleteData } = await useMembersRepository();
99
const { profile } = useAuth();
1010
1111
const onRemove = () => {
12-
removeMember({ id: props.member.id });
12+
deleteData({ id: props.member.id });
1313
};
1414
</script>
1515

app/components/admin/settings/members/Frame.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
const { members } = await useMembers();
2+
const { data } = await useMembersRepository();
33
</script>
44

55
<template>
@@ -10,7 +10,7 @@ const { members } = await useMembers();
1010
<template #content>
1111
<section class="grid grid-cols-12 gap-6 mt-4 px-4">
1212
<AdminSettingsMembersCard
13-
v-for="member in members"
13+
v-for="member in data"
1414
:key="member.id"
1515
:member="member"
1616
/>

app/composables/members.ts

+20-57
Original file line numberDiff line numberDiff line change
@@ -5,64 +5,27 @@ import type {
55
} from '~~/shared/schemas/setting';
66
import type { User } from '~~/server/db/schema';
77

8-
type AddOrRemoveMember =
9-
| z.infer<typeof addMemberSchema>
10-
| z.infer<typeof removeMemberSchema>;
8+
type CreateMember = z.infer<typeof addMemberSchema>;
9+
type RemoveMember = z.infer<typeof removeMemberSchema>;
1110

12-
const useMembersState = () => useState<User[]>('settings-members', () => []);
13-
const useMembersFetchedState = () =>
14-
useState<boolean>('settings-members-first-fetch', () => false);
15-
16-
export async function useMembers() {
17-
const members = useMembersState();
18-
const membersFetched = useMembersFetchedState();
11+
export function useMembersState() {
12+
return useObjectState('settings-members');
13+
}
1914

20-
const membersApiCall = useFetch<User[]>('/api/settings/members', {
21-
immediate: false,
22-
default: () => [],
15+
export async function useMembersRepository() {
16+
return useObjectRepository<
17+
User[],
18+
never,
19+
never,
20+
never,
21+
CreateMember,
22+
never,
23+
RemoveMember
24+
>({
25+
key: 'settings-members',
26+
fetchURL: '/api/settings/members',
27+
postURL: '/api/settings/members',
28+
deleteURL: '/api/settings/members',
29+
initFn: () => [],
2330
});
24-
25-
const setMembers = (m: User[]) => {
26-
members.value = [...m];
27-
};
28-
watch(membersApiCall.data, setMembers);
29-
30-
if (!membersFetched.value) {
31-
await membersApiCall
32-
.execute()
33-
.then(() => setMembers(membersApiCall.data.value));
34-
membersFetched.value = true;
35-
}
36-
37-
const refereshMembers = membersApiCall.refresh;
38-
39-
const isSubmitting = ref(false);
40-
41-
const makeAddOrRemoveMember =
42-
(method: 'POST' | 'DELETE') => async (body: AddOrRemoveMember) => {
43-
try {
44-
isSubmitting.value = true;
45-
await $fetch<User>('/api/settings/members', {
46-
method,
47-
body,
48-
});
49-
refereshMembers();
50-
return true;
51-
} catch (e) {
52-
console.error(e);
53-
return false;
54-
} finally {
55-
isSubmitting.value = false;
56-
}
57-
};
58-
const addMember = makeAddOrRemoveMember('POST');
59-
const removeMember = makeAddOrRemoveMember('DELETE');
60-
61-
return {
62-
members,
63-
isSubmitting,
64-
65-
addMember,
66-
removeMember,
67-
};
6831
}

0 commit comments

Comments
 (0)