import {OOElement} from '../oo-element' import {html, render} from '../../lib/html' import getProject from '../../lib/oo-api-get-project' import toMap from '../../lib/extensions-to-map' import define from '../../lib/define' import markdown from '../oo-markdown' import projectEditor from '../oo-project-editor' import message from '../_atoms/oo-atoms-message' import users from '../_molecules/oo-molecules-project-users' import datetime from '../_atoms/oo-atoms-datetime' import modal from '../oo-modal' import projectStatus from '../oo-project-status' import weakMap from '../../lib/weak-map' import store from '../../lib/local-storage' import {template as tagsTemplate} from '../../lib/tags' define('oo-markdown', markdown) define('oo-atoms-message', message) define('oo-molecules-project-users', users) define('oo-atoms-datetime', datetime) define('oo-project-status', projectStatus) define('oo-project-editor', projectEditor) define('oo-modal', modal) const ATTR = { DATA_UID: 'data-uid' } const projectUid = weakMap() const projectTitle = weakMap() const projectBody = weakMap() const projectTags = weakMap>() const projectAuthor = weakMap() const projectAssignee = weakMap() const projectCreated = weakMap() const stateProjectUpdated = weakMap() const stateOpenEditor = weakMap() export default class extends OOElement { static get observedAttributes() { return [ATTR.DATA_UID] } attributeChangedCallback(attr, prev, next) { if (prev === next || !next) { return } projectUid.set(this, next) this.fetchProject(projectUid.get(this)) } connectedCallback() { super.connectedCallback(false) } render() { const uid = projectUid.get(this) const created = projectCreated.get(this) const title = projectTitle.get(this) const body = projectBody.get(this) const tags = projectTags.get(this) const author = projectAuthor.get(this) const assignee = projectAssignee.get(this) const editor = stateOpenEditor.get(this) const projectUpdated = stateProjectUpdated.get(this) const isPostOwner = store.uid === author const reloadButton = (show: boolean) => { // This is a plan to delete. No need for testing. if (show) { return html`` } return html`` } const editButton = (show: boolean) => { if (show) { return html`` } return html`` } const modalBody = (show: boolean) => { if (show) { return html`` } return html`` } return html`
${(() => { if (title) { return html`

${title}

` } return html`` })()} ${body}

Edit post

${modalBody(editor)}
` } placeholder() { const template = html`
` render(template, this) } openEditor() { stateOpenEditor.set(this, true) this.update() } closedEditor() { stateOpenEditor.delete(this) this.update() } onProjectUpdated() { this.closedEditor() stateProjectUpdated.set(this, true) this.update() } async fetchProject(uid: string) { this.placeholder() const api = await getProject(uid) const {response} = api if (Array.isArray(response)) { const [item] = response const mapedExtensions = toMap(item) projectCreated.set(this, item.created) projectTitle.set(this, mapedExtensions.get('title')) projectBody.set(this, mapedExtensions.get('body')) projectTags.set(this, mapedExtensions.get('tags') || []) projectAuthor.set(this, mapedExtensions.get('author')) projectAssignee.set(this, mapedExtensions.get('assignee')) stateProjectUpdated.delete(this) } else { projectBody.delete(this) projectAuthor.delete(this) } this.update() } }