diff --git a/frontend/components/Domain/Recipe/RecipeCard.vue b/frontend/components/Domain/Recipe/RecipeCard.vue
index 1633527ec..dcb8f3dfe 100644
--- a/frontend/components/Domain/Recipe/RecipeCard.vue
+++ b/frontend/components/Domain/Recipe/RecipeCard.vue
@@ -55,12 +55,9 @@
/>
-
-
@@ -130,7 +128,7 @@
import RecipeFavoriteBadge from "./RecipeFavoriteBadge.vue";
import RecipeContextMenu from "./RecipeContextMenu.vue";
import RecipeCardImage from "./RecipeCardImage.vue";
-import RecipeRating from "./RecipeRating.vue";
+import RecipeCardRating from "./RecipeCardRating.vue";
import RecipeChips from "./RecipeChips.vue";
import { useLoggedInState } from "~/composables/use-logged-in-state";
diff --git a/frontend/components/Domain/Recipe/RecipeCardRating.vue b/frontend/components/Domain/Recipe/RecipeCardRating.vue
new file mode 100644
index 000000000..f41c4eced
--- /dev/null
+++ b/frontend/components/Domain/Recipe/RecipeCardRating.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+ ☆
+
+
+ ★
+
+
+
+
+
+
+
+
diff --git a/frontend/components/Domain/Recipe/RecipeFavoriteBadge.vue b/frontend/components/Domain/Recipe/RecipeFavoriteBadge.vue
index 54c2a0580..040f1d29c 100644
--- a/frontend/components/Domain/Recipe/RecipeFavoriteBadge.vue
+++ b/frontend/components/Domain/Recipe/RecipeFavoriteBadge.vue
@@ -43,8 +43,6 @@ const props = withDefaults(defineProps(), {
buttonStyle: false,
});
-const api = useUserApi();
-const $auth = useMealieAuth();
const { userRatings, refreshUserRatings } = useUserSelfRatings();
const isFavorite = computed(() => {
@@ -53,6 +51,9 @@ const isFavorite = computed(() => {
});
async function toggleFavorite() {
+ const api = useUserApi();
+ const $auth = useMealieAuth();
+
if (!$auth.user.value) return;
if (!isFavorite.value) {
await api.users.addFavorite($auth.user.value?.id, props.recipeId);
diff --git a/frontend/composables/api/api-client.ts b/frontend/composables/api/api-client.ts
index c130509fe..f0f61a9b5 100644
--- a/frontend/composables/api/api-client.ts
+++ b/frontend/composables/api/api-client.ts
@@ -3,6 +3,7 @@ import type { Composer } from "vue-i18n";
import type { ApiRequestInstance, RequestResponse } from "~/lib/api/types/non-generated";
import { AdminAPI, PublicApi, UserApi } from "~/lib/api";
import { PublicExploreApi } from "~/lib/api/client-public";
+import { useGlobalI18n } from "~/composables/use-global-i18n";
const request = {
async safe(
@@ -56,8 +57,7 @@ function getRequests(axiosInstance: AxiosInstance): ApiRequestInstance {
export const useRequests = function (i18n?: Composer): ApiRequestInstance {
const { $axios } = useNuxtApp();
if (!i18n) {
- // Only works in a setup block
- i18n = useI18n();
+ i18n = useGlobalI18n();
}
$axios.defaults.headers.common["Accept-Language"] = i18n.locale.value;
diff --git a/frontend/composables/use-global-i18n.ts b/frontend/composables/use-global-i18n.ts
new file mode 100644
index 000000000..678eecadd
--- /dev/null
+++ b/frontend/composables/use-global-i18n.ts
@@ -0,0 +1,10 @@
+import type { Composer } from "vue-i18n";
+
+let i18n: Composer | null = null;
+
+export function useGlobalI18n() {
+ if (!i18n) {
+ i18n = useI18n();
+ }
+ return i18n;
+}
diff --git a/frontend/composables/use-users/user-ratings.ts b/frontend/composables/use-users/user-ratings.ts
index d827e64c0..36cd03d2e 100644
--- a/frontend/composables/use-users/user-ratings.ts
+++ b/frontend/composables/use-users/user-ratings.ts
@@ -5,26 +5,31 @@ const userRatings = ref([]);
const loading = ref(false);
const ready = ref(false);
-export const useUserSelfRatings = function () {
- const $auth = useMealieAuth();
- const api = useUserApi();
+const $auth = useMealieAuth();
+export const useUserSelfRatings = function () {
async function refreshUserRatings() {
if (!$auth.user.value || loading.value) {
return;
}
loading.value = true;
+ const api = useUserApi();
+
const { data } = await api.users.getSelfRatings();
userRatings.value = data?.ratings || [];
+
loading.value = false;
ready.value = true;
}
async function setRating(slug: string, rating: number | null, isFavorite: boolean | null) {
loading.value = true;
+ const api = useUserApi();
+
const userId = $auth.user.value?.id || "";
await api.users.setRating(userId, slug, rating, isFavorite);
+
loading.value = false;
await refreshUserRatings();
}
diff --git a/frontend/layouts/admin.vue b/frontend/layouts/admin.vue
index 2c8bdca97..9beaffe79 100644
--- a/frontend/layouts/admin.vue
+++ b/frontend/layouts/admin.vue
@@ -36,8 +36,9 @@ import AppHeader from "@/components/Layout/LayoutParts/AppHeader.vue";
import AppSidebar from "@/components/Layout/LayoutParts/AppSidebar.vue";
import TheSnackbar from "~/components/Layout/LayoutParts/TheSnackbar.vue";
import type { SidebarLinks } from "~/types/application-types";
+import { useGlobalI18n } from "~/composables/use-global-i18n";
-const i18n = useI18n();
+const i18n = useGlobalI18n();
const display = useDisplay();
const { $globals } = useNuxtApp();
diff --git a/frontend/layouts/basic.vue b/frontend/layouts/basic.vue
index a74383f30..c33e32c89 100644
--- a/frontend/layouts/basic.vue
+++ b/frontend/layouts/basic.vue
@@ -13,11 +13,10 @@
-
diff --git a/frontend/layouts/blank.vue b/frontend/layouts/blank.vue
index b7a760679..e0d45f90b 100644
--- a/frontend/layouts/blank.vue
+++ b/frontend/layouts/blank.vue
@@ -24,6 +24,7 @@
diff --git a/frontend/layouts/error.vue b/frontend/layouts/error.vue
index 55c8a224e..9bfa2c728 100644
--- a/frontend/layouts/error.vue
+++ b/frontend/layouts/error.vue
@@ -46,6 +46,8 @@