Files
Rocketmc/apps/frontend/src/composables/user.js
Geometrically 2d416d491c Project, Search, User redesign (#1281)
* New project page

* fix silly icon tailwind classes

* Start new versions page, add new ButtonStyled component

* Pagination and finish mocking up versions page functionality

* green download button

* hover animation

* New Modal, Avatar refactor, subpages in NavTabs

* lint

* Download modal

* New user page + fix lint

* fix ui lint

* Download animation fix

* Versions filter + finish project page

* Improve consistency of buttons on home page

* Fix ButtonStyled breaking

* Fix margin on version summary

* finish search, new modals, user + project page mobile

* fix gallery image pages

* New project header

* Fix gallery tab showing improperly

* Use auto direction + position for all popouts

* Preliminary user page

* test to see if this fixes login stuff

* remove extra slash

* Add version actions, move download button on versions page

* Listed -> public

* Shorten download modal selector height

* Fix user menu open direction

* Change breakpoint for header collapse

* Only underline title

* Tighten padding on stats a little

* New nav

* Make mobile breakpoint more consistent

* fix header breakpoint regression

* Add sign in button

* Fix edit icon color

* Fix margin at top of screen

* Fix user bios and ad width

* Fix user nav showing when there's only one type of project

* Fix plural projects on user page & extract i18n

* Remove ads on mobile for now

* Fix overflow menu showing hidden items

* NavTabs on mobile

* Fix navbar z index

* Search filter overhaul + negative filters

* fix no-max-height

* port version filters, fix following/collections, lint

* hide promos

* ui lint

* Disable modal background animation to reduce reported motion sickness

* Hide install with modrinth app button on mobile

---------

Signed-off-by: Geometrically <18202329+Geometrically@users.noreply.github.com>
Co-authored-by: Prospector <prospectordev@gmail.com>
2024-08-20 23:03:16 -07:00

179 lines
4.3 KiB
JavaScript

export const useUser = async (force = false) => {
const user = useState("user", () => {});
if (!user.value || force || (user.value && Date.now() - user.value.lastUpdated > 300000)) {
user.value = await initUser();
}
return user;
};
export const initUser = async () => {
const auth = (await useAuth()).value;
const user = {
collections: [],
follows: [],
subscriptions: [],
lastUpdated: 0,
};
if (auth.user && auth.user.id) {
try {
const headers = {
Authorization: auth.token,
};
const [follows, collections, subscriptions] = await Promise.all([
useBaseFetch(`user/${auth.user.id}/follows`, { headers }, true),
useBaseFetch(`user/${auth.user.id}/collections`, { apiVersion: 3, headers }, true),
useBaseFetch(`billing/subscriptions`, { internal: true, headers }, true),
]);
user.collections = collections;
user.follows = follows;
user.subscriptions = subscriptions;
user.lastUpdated = Date.now();
} catch (err) {
console.error(err);
}
}
return user;
};
export const initUserCollections = async () => {
const auth = (await useAuth()).value;
const user = (await useUser()).value;
if (auth.user && auth.user.id) {
try {
user.collections = await useBaseFetch(`user/${auth.user.id}/collections`, { apiVersion: 3 });
} catch (err) {
console.error(err);
}
}
};
export const initUserFollows = async () => {
const auth = (await useAuth()).value;
const user = (await useUser()).value;
if (auth.user && auth.user.id) {
try {
user.follows = await useBaseFetch(`user/${auth.user.id}/follows`);
} catch (err) {
console.error(err);
}
}
};
export const initUserProjects = async () => {
const auth = (await useAuth()).value;
const user = (await useUser()).value;
if (auth.user && auth.user.id) {
try {
user.projects = await useBaseFetch(`user/${auth.user.id}/projects`);
} catch (err) {
console.error(err);
}
}
};
export const userCollectProject = async (collection, projectId) => {
const user = (await useUser()).value;
await initUserCollections();
const collectionId = collection.id;
const latestCollection = user.collections.find((x) => x.id === collectionId);
if (!latestCollection) {
throw new Error("This collection was not found. Has it been deleted?");
}
const add = !latestCollection.projects.includes(projectId);
const projects = add
? [...latestCollection.projects, projectId]
: [...latestCollection.projects].filter((x) => x !== projectId);
const idx = user.collections.findIndex((x) => x.id === latestCollection.id);
if (idx >= 0) {
user.collections[idx].projects = projects;
}
await useBaseFetch(`collection/${collection.id}`, {
method: "PATCH",
body: {
new_projects: projects,
},
apiVersion: 3,
});
};
export const userFollowProject = async (project) => {
const user = (await useUser()).value;
if (user.follows.find((x) => x.id === project.id)) {
user.follows = user.follows.filter((x) => x.id !== project.id);
project.followers--;
setTimeout(() => {
useBaseFetch(`project/${project.id}/follow`, {
method: "DELETE",
});
});
} else {
user.follows = user.follows.concat(project);
project.followers++;
setTimeout(() => {
useBaseFetch(`project/${project.id}/follow`, {
method: "POST",
});
});
}
};
export const resendVerifyEmail = async () => {
const app = useNuxtApp();
startLoading();
try {
await useBaseFetch("auth/email/resend_verify", {
method: "POST",
});
const auth = await useAuth();
app.$notify({
group: "main",
title: "Email sent",
text: `An email with a link to verify your account has been sent to ${auth.value.user.email}.`,
type: "success",
});
} catch (err) {
app.$notify({
group: "main",
title: "An error occurred",
text: err.data.description,
type: "error",
});
}
stopLoading();
};
export const logout = async () => {
startLoading();
const auth = await useAuth();
try {
await useBaseFetch(`session/${auth.value.token}`, {
method: "DELETE",
});
} catch {
/* empty */
}
await useAuth("none");
useCookie("auth-token").value = null;
stopLoading();
};