UNPKG

plxnner

Version:

An elegant open-source planner for Instagram

178 lines (147 loc) 3.73 kB
import UserStorage from "./userStorage.class" import { extractUsernameFromUserId } from "../../utils/utilsPlatform" export default class User implements IUser { public readonly raw: IRawUser public readonly origin: IUserOrigin = "" as IUserOrigin public platform: IUserPlatform = "" as IUserPlatform public id: string = "" public options: IUserOptions = {} public profile: IUserProfile = {} as IUserProfile public media: IUserMedia = {} as IUserMedia public storage: IUserStorage = {} as IUserStorage public status: IUserStatus = reactive({ unsavedChanges: false, localChanges: false, }) constructor(raw: IRawUser) { this.raw = raw } /** * Initialize user */ public async init() { // parse user profile from raw config await this.loadUserProfile() // parse user media this.loadUserMedia() // set user id (provided, or getted from profile username) this.setId(this.raw.id ?? this.raw.profile.username) return this } public setId(id: string) { this.id = id } public async loadUserClient() { // start user indexed db await this.loadUserStorage() // check for index db user changes await this.storage.isContentAvailable().then(async (available) => { if (available) { // override raw user data await this.storage.restore() } }) } public async unloadUserClient() { } /** * Initialize user storage */ public async loadUserStorage() { this.storage = new UserStorage(this) await this.storage.init() } // these functions are overridden // by specific platform methods public async loadUserProfile() {} public loadUserMedia() {} /** * Check if user has unsaved changes */ get hasLocalChanges() { return this.status.localChanges } /** * Check if user has local changes */ get hasUnsavedChanges() { return this.status.unsavedChanges } /** * Update changed status * * @param value */ public setUnsavedChanges(value: boolean) { this.status.unsavedChanges = value } /** * Update changed status * * @param value */ public setLocalChanges(value: boolean) { this.status.localChanges = value } /** * Is user removable? */ get isRemovable() { return this.origin === "storage" } /** * Get user route */ get route() { return "/" + this.platform + "/" + extractUsernameFromUserId(this.id) } /** * Prepare user data for export */ public async export(): Promise<IUserExported> { const exportedProfile = await this.profile.export() const exportedMedia = await this.media.export() return { id: this.id, profile: exportedProfile, media: exportedMedia, platform: this.platform } } /** * Save user to indexed db */ public async save() { await this.storage.save() } /** * Remove user. * * This only work for local users, * those are defined in config cannot be removed */ public async remove() { if (this.isRemovable || this.hasLocalChanges) { useUserStorageStore().removeUserFromStorageIndex({ platform: this.platform, username: this.id }) await this.storage.remove() useUserStore().unloadUser(this.id) } } /** * Reset user which has changes but its config is hard-coded */ public async reset() { if (!this.isRemovable || this.hasLocalChanges) { useUserStorageStore().removeUserFromStorageIndex({ username: this.id, platform: this.platform, }) await this.storage.remove() // original raw user config is not reachable from here location.reload() } } }