File Extension Image for user.js user.js
1627 Chars | 65 Lines | 1.63 kb | Text File Parent Directory
import { create } from 'zustand'
import {
	addNewPack as addNewPackCloud,
	deletePack as deletePackCloud,
	getMyPacks as getMyPacksCloud,
	getUser,
} from '@/lib/firebase'
import {
	addNewPack as addNewPackLocal,
	deletePack as deletePackLocal,
	getMyPacks as getMyPacksLocal,
} from '@/lib/localstore'

function userDefined(user) {
	if (user?.displayName === undefined) {
		return false
	}
	return true
}

async function addUsername(user) {
	if (user?.displayName == undefined) {
		return {}
	} else {
		return { username: await getUser(user.uid) }
	}
}

export const useUser = create((set, get) => ({
	user: {},
	setUser: async (newUser) => set({ user: { ...newUser, ...(await addUsername(newUser)) } }),
	// Utility functions
	newPack: async (id, newPack, forceLocal = false) => {
		if (userDefined(get().user) && !forceLocal) {
			await addNewPackCloud(id, newPack, get().user.username)
		} else {
			await addNewPackLocal(id, newPack)
		}
	},
	deletePack: async (id, forceLocal = false) => {
		if (userDefined(get().user) && !forceLocal) {
			await deletePackCloud(id, get().user.username)
		} else {
			await deletePackLocal(id)
		}
	},
	// TODO: Implement forceLocal in this for consistency
	getMyPacks: async () => {
		if (userDefined(get().user)) {
			return await getMyPacksCloud(get().user.username, get().user.uid)
		} else {
			return await getMyPacksLocal()
		}
	},
	getMyOfflinePacks: async () => {
		return await getMyPacksLocal()
	},
	authenticated: () => {
		if (userDefined(get().user)) {
			return true
		} else {
			return false
		}
	},
}))