plxnner
Version:
An elegant open-source planner for Instagram
142 lines (117 loc) • 3.33 kB
text/typescript
import { required, minLength, maxLength, url } from "@vuelidate/validators"
import useVuelidate from "@vuelidate/core"
import { usePlatformStructure } from "../composables/composablePlatformStructure";
export const useUserEditorStore = defineStore("user/editor", () => {
const userStore = useUserStore()
const platform: Ref<IUserPlatform> = ref("" as IUserPlatform)
const fields: any = {}
const fieldsData: any = {}
const rules: any = {}
let $v = ref()
const platformStructureUser = computed(() => {
return usePlatformStructure(platform.value).user
})
/**
* Prepare fields for user editor form
*
* @param platformKey
* @param user
*/
function generateFields(platformKey: IUserPlatform, user?: any) {
platform.value = platformKey
for (const [fieldKey, field] of Object.entries(
platformStructureUser.value.profile.fields,
)) {
let fieldInitialValue =
user && user.profile.hasOwnProperty(fieldKey)
? user.profile[fieldKey]
: ""
// prevent avatar issues
if (field.type === "file") {
fieldInitialValue = undefined
}
switch(fieldKey) {
case 'website':
fields[fieldKey] = ref(fieldInitialValue?.href)
break;
default:
fields[fieldKey] = ref(fieldInitialValue)
break;
}
fieldsData[fieldKey] = field
rules[fieldKey] = {}
if (field.validation) {
if (field.validation.required) {
rules[fieldKey].required = required
}
if (field.validation.minLength) {
rules[fieldKey].minLength = minLength(field.validation.minLength)
}
if (field.validation.maxLength) {
rules[fieldKey].maxLength = maxLength(field.validation.maxLength)
}
}
}
$v.value = useVuelidate(rules, fields, {
$lazy: true,
})
}
/**
* Reset form user fields
*/
function reset() {
for (const [fieldKey, field] of Object.entries(
platformStructureUser.value.profile.fields,
)) {
fields[fieldKey].value = ""
}
}
/**
* Create raw user from user fields
*/
async function create() {
const rawUser: any = {
profile: {},
media: {},
}
for (const [fieldKey, field] of Object.entries(
platformStructureUser.value.profile.fields,
)) {
rawUser.profile[fieldKey] = fields[fieldKey].value
}
for (const [fieldKey, field] of Object.entries(
platformStructureUser.value.media.collections,
)) {
rawUser.media[fieldKey] = []
}
// slugify username
rawUser.profile.username = slugify(rawUser.profile.username, "_")
rawUser.platform = platform.value
await userStore.createUser(rawUser, platform.value)
setTimeout(() => reset(), 1000)
return true
}
/**
* Update user profile from user fields
*
* @param user
*/
async function update(user: IUser) {
const rawUserProfile: any = {}
for (const [fieldKey, field] of Object.entries(
platformStructureUser.value.profile.fields,
)) {
rawUserProfile[fieldKey] = fields[fieldKey].value
}
await userStore.updateUser(user, rawUserProfile)
}
return {
$v,
fields,
fieldsData,
rules,
create,
update,
generateFields,
}
})