refactor: ♻️ Rewrite state system to use Pinia for composer and auth

This commit is contained in:
Jesse Wierzbinski 2025-08-28 07:41:51 +02:00
parent a6db9e059d
commit b510782a30
No known key found for this signature in database
80 changed files with 999 additions and 1011 deletions

View file

@ -30,14 +30,14 @@ const { emojis } = defineProps<{
emojis: z.infer<typeof CustomEmoji>[];
}>();
const permissions = usePermissions();
const authStore = useAuthStore();
const canEdit =
(!emojis.some((e) => e.global) &&
permissions.value.includes(RolePermission.ManageOwnEmojis)) ||
permissions.value.includes(RolePermission.ManageEmojis);
authStore.permissions.includes(RolePermission.ManageOwnEmojis)) ||
authStore.permissions.includes(RolePermission.ManageEmojis);
const deleteAll = async () => {
if (!identity.value) {
if (!authStore.isSignedIn) {
return;
}
@ -57,14 +57,16 @@ const deleteAll = async () => {
);
try {
await Promise.all(
emojis.map((emoji) => client.value.deleteEmoji(emoji.id)),
emojis.map((emoji) => authStore.client.deleteEmoji(emoji.id)),
);
toast.dismiss(id);
toast.success("Emojis deleted");
identity.value.emojis = identity.value.emojis.filter(
(e) => !emojis.some((emoji) => e.id === emoji.id),
);
authStore.updateActiveIdentity({
emojis: authStore.emojis.filter(
(e) => !emojis.some((emoji) => e.id === emoji.id),
),
});
} catch {
toast.dismiss(id);
}

View file

@ -42,14 +42,10 @@ const { emoji } = defineProps<{
emoji: z.infer<typeof CustomEmoji>;
}>();
const permissions = usePermissions();
const canEdit =
(!emoji.global &&
permissions.value.includes(RolePermission.ManageOwnEmojis)) ||
permissions.value.includes(RolePermission.ManageEmojis);
const authStore = useAuthStore();
const editName = async () => {
if (!identity.value) {
if (!authStore.isSignedIn) {
return;
}
@ -63,16 +59,18 @@ const editName = async () => {
if (result.confirmed) {
const id = toast.loading(m.teary_tame_gull_bless());
try {
const { data } = await client.value.updateEmoji(emoji.id, {
const { data } = await authStore.client.updateEmoji(emoji.id, {
shortcode: result.value,
});
toast.dismiss(id);
toast.success(m.gaudy_lime_bison_adore());
identity.value.emojis = identity.value.emojis.map((e) =>
e.id === emoji.id ? data : e,
);
authStore.updateActiveIdentity({
emojis: authStore.emojis.map((e) =>
e.id === emoji.id ? data : e,
),
});
} catch {
toast.dismiss(id);
}
@ -80,7 +78,7 @@ const editName = async () => {
};
const _delete = async () => {
if (!identity.value) {
if (!authStore.isSignedIn) {
return;
}
@ -93,13 +91,13 @@ const _delete = async () => {
if (confirmed) {
const id = toast.loading(m.weary_away_liger_zip());
try {
await client.value.deleteEmoji(emoji.id);
await authStore.client.deleteEmoji(emoji.id);
toast.dismiss(id);
toast.success(m.crisp_whole_canary_tear());
identity.value.emojis = identity.value.emojis.filter(
(e) => e.id !== emoji.id,
);
authStore.updateActiveIdentity({
emojis: authStore.emojis.filter((e) => e.id !== emoji.id),
});
} catch {
toast.dismiss(id);
}

View file

@ -1,6 +1,6 @@
<template>
<div v-if="emojis.length > 0" class="grow">
<Table :emojis="emojis" :can-upload="canUpload" />
<div v-if="authStore.emojis.length > 0" class="grow">
<Table :emojis="authStore.emojis" :can-upload="canUpload" />
</div>
</template>
@ -8,12 +8,10 @@
import { RolePermission } from "@versia/client/schemas";
import Table from "./table.vue";
const permissions = usePermissions();
const authStore = useAuthStore();
const canUpload = computed(
() =>
permissions.value.includes(RolePermission.ManageOwnEmojis) ||
permissions.value.includes(RolePermission.ManageEmojis),
authStore.permissions.includes(RolePermission.ManageOwnEmojis) ||
authStore.permissions.includes(RolePermission.ManageEmojis),
);
const emojis = computed(() => identity.value?.emojis ?? []);
</script>

View file

@ -189,8 +189,10 @@ import { Textarea } from "~/components/ui/textarea";
import * as m from "~~/paraglide/messages.js";
const open = ref(false);
const permissions = usePermissions();
const hasEmojiAdmin = permissions.value.includes(RolePermission.ManageEmojis);
const authStore = useAuthStore();
const hasEmojiAdmin = authStore.permissions.includes(
RolePermission.ManageEmojis,
);
const createObjectURL = URL.createObjectURL;
const formSchema = toTypedSchema(
@ -202,11 +204,11 @@ const formSchema = toTypedSchema(
.refine(
(v) =>
v.size <=
(identity.value?.instance.configuration.emojis
(authStore.instance?.configuration.emojis
.emoji_size_limit ?? Number.POSITIVE_INFINITY),
m.orange_weird_parakeet_hug({
count:
identity.value?.instance.configuration.emojis
authStore.instance?.configuration.emojis
.emoji_size_limit ?? Number.POSITIVE_INFINITY,
}),
),
@ -214,11 +216,11 @@ const formSchema = toTypedSchema(
.string()
.min(1)
.max(
identity.value?.instance.configuration.emojis
authStore.instance?.configuration.emojis
.max_shortcode_characters ?? Number.POSITIVE_INFINITY,
m.solid_inclusive_owl_hug({
count:
identity.value?.instance.configuration.emojis
authStore.instance?.configuration.emojis
.max_shortcode_characters ??
Number.POSITIVE_INFINITY,
}),
@ -237,11 +239,11 @@ const formSchema = toTypedSchema(
alt: z
.string()
.max(
identity.value?.instance.configuration.emojis
authStore.instance?.configuration.emojis
.max_description_characters ?? Number.POSITIVE_INFINITY,
m.key_ago_hound_emerge({
count:
identity.value?.instance.configuration.emojis
authStore.instance?.configuration.emojis
.max_description_characters ??
Number.POSITIVE_INFINITY,
}),
@ -254,14 +256,14 @@ const { isSubmitting, handleSubmit, values, setFieldValue } = useForm({
});
const submit = handleSubmit(async (values) => {
if (!identity.value) {
if (!authStore.isSignedIn) {
return;
}
const id = toast.loading(m.factual_gray_mouse_believe());
try {
const { data } = await client.value.uploadEmoji(
const { data } = await authStore.client.uploadEmoji(
values.shortcode,
values.image,
{
@ -274,7 +276,10 @@ const submit = handleSubmit(async (values) => {
toast.dismiss(id);
toast.success(m.cool_trite_gull_quiz());
identity.value.emojis = [...identity.value.emojis, data];
authStore.updateActiveIdentity({
emojis: [...authStore.emojis, data],
});
open.value = false;
} catch {
toast.dismiss(id);