From 2e479f225cedd16e185beff8f9b08d195b56c192 Mon Sep 17 00:00:00 2001 From: j0sep0z0 Date: Mon, 6 May 2024 03:05:31 +0200 Subject: [PATCH] add create post with click, refresh list and other details; wip; #129 --- .../socialcode/app/assets/EditIcon.png | Bin 0 -> 52364 bytes .../jose-pozo/socialcode/app/assets/Home.png | Bin 0 -> 2375 bytes .../socialcode/app/assets/SocialCode.png | Bin 0 -> 31548 bytes .../socialcode/app/components/Component.js | 5 +- .../socialcode/app/components/core/Button.css | 3 +- .../socialcode/app/components/core/Field.js | 4 +- .../socialcode/app/components/core/Input.css | 1 + .../socialcode/app/components/core/Input.js | 2 +- .../socialcode/app/components/core/Label.css | 0 .../socialcode/app/components/core/Label.js | 2 + .../app/components/core/SubmitButton.js | 2 +- .../components/library/FormWithFeedback.js | 8 +- staff/jose-pozo/socialcode/app/data.js | 73 +++++++++++ staff/jose-pozo/socialcode/app/errors.js | 24 ++++ staff/jose-pozo/socialcode/app/global.css | 18 +++ .../app/home/components/CreatePostForm.css | 21 +++ .../app/home/components/CreatePostForm.js | 43 +++++++ .../socialcode/app/home/components/Post.css | 63 +++++++++ .../socialcode/app/home/components/Post.js | 89 +++++++++++++ staff/jose-pozo/socialcode/app/home/index.css | 69 +++++++++- .../jose-pozo/socialcode/app/home/index.html | 18 +++ staff/jose-pozo/socialcode/app/home/index.js | 97 ++++++++++++++ staff/jose-pozo/socialcode/app/logic.js | 120 ++++++++++++++++++ .../socialcode/app/login/LoginForm.css | 9 ++ .../socialcode/app/login/LoginForm.js | 30 +++++ .../jose-pozo/socialcode/app/login/index.css | 42 ++++++ .../jose-pozo/socialcode/app/login/index.html | 48 +++++++ staff/jose-pozo/socialcode/app/login/index.js | 59 +++++++++ .../socialcode/app/register/RegisterForm.js | 71 +++++++++++ .../socialcode/app/register/index.css | 42 ++++++ .../socialcode/app/register/index.html | 47 +++++++ .../socialcode/app/register/index.js | 65 ++++++++++ 32 files changed, 1058 insertions(+), 17 deletions(-) create mode 100644 staff/jose-pozo/socialcode/app/assets/EditIcon.png create mode 100644 staff/jose-pozo/socialcode/app/assets/Home.png create mode 100644 staff/jose-pozo/socialcode/app/assets/SocialCode.png create mode 100644 staff/jose-pozo/socialcode/app/components/core/Label.css create mode 100644 staff/jose-pozo/socialcode/app/data.js create mode 100644 staff/jose-pozo/socialcode/app/errors.js create mode 100644 staff/jose-pozo/socialcode/app/global.css create mode 100644 staff/jose-pozo/socialcode/app/home/components/CreatePostForm.css create mode 100644 staff/jose-pozo/socialcode/app/home/components/CreatePostForm.js create mode 100644 staff/jose-pozo/socialcode/app/home/components/Post.css create mode 100644 staff/jose-pozo/socialcode/app/home/components/Post.js create mode 100644 staff/jose-pozo/socialcode/app/home/index.js create mode 100644 staff/jose-pozo/socialcode/app/logic.js create mode 100644 staff/jose-pozo/socialcode/app/login/LoginForm.css create mode 100644 staff/jose-pozo/socialcode/app/login/LoginForm.js create mode 100644 staff/jose-pozo/socialcode/app/login/index.css create mode 100644 staff/jose-pozo/socialcode/app/login/index.html create mode 100644 staff/jose-pozo/socialcode/app/login/index.js create mode 100644 staff/jose-pozo/socialcode/app/register/RegisterForm.js create mode 100644 staff/jose-pozo/socialcode/app/register/index.css create mode 100644 staff/jose-pozo/socialcode/app/register/index.html create mode 100644 staff/jose-pozo/socialcode/app/register/index.js diff --git a/staff/jose-pozo/socialcode/app/assets/EditIcon.png b/staff/jose-pozo/socialcode/app/assets/EditIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..74e8cbe3984b1e3db8dc37ee3e3f7950c3a4f4ea GIT binary patch literal 52364 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 >j^;N)o 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 literal 0 HcmV?d00001 diff --git a/staff/jose-pozo/socialcode/app/assets/SocialCode.png b/staff/jose-pozo/socialcode/app/assets/SocialCode.png new file mode 100644 index 0000000000000000000000000000000000000000..5b4156823b81a2240394a1a0f8c71705baebf2d8 GIT binary patch literal 31548 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 vG63-hPQm~Gga3<^Mg_v2!GbX0Mc;(C4a}d? -1) this.children.splice(index, 1) - this.container.removeChild(child.container) + if (this.container.contains(child.container)) + this.container.removeChild(child.container) } setText(text) { diff --git a/staff/jose-pozo/socialcode/app/components/core/Button.css b/staff/jose-pozo/socialcode/app/components/core/Button.css index d45aa1b0b..3b6f0aa9c 100644 --- a/staff/jose-pozo/socialcode/app/components/core/Button.css +++ b/staff/jose-pozo/socialcode/app/components/core/Button.css @@ -1,6 +1,7 @@ .Button { padding: .4rem; - background-color: transparent; + background-color: #17191e; font-size: 1rem; border: 1px solid var(--first-color); + border-radius: 0.3rem; } \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/components/core/Field.js b/staff/jose-pozo/socialcode/app/components/core/Field.js index 7c9df1451..201360e2f 100644 --- a/staff/jose-pozo/socialcode/app/components/core/Field.js +++ b/staff/jose-pozo/socialcode/app/components/core/Field.js @@ -4,11 +4,11 @@ class Field extends Component { this.addClass('Field') - const label = new label + const label = new Label label.setText(text) label.setFor(id) - const input = new input + const input = new Input input.setId(id) input.setType(type) diff --git a/staff/jose-pozo/socialcode/app/components/core/Input.css b/staff/jose-pozo/socialcode/app/components/core/Input.css index 6c09b66f6..085f7ab2b 100644 --- a/staff/jose-pozo/socialcode/app/components/core/Input.css +++ b/staff/jose-pozo/socialcode/app/components/core/Input.css @@ -3,4 +3,5 @@ background-color: transparent; font-size: 1rem; border: 1px solid var(--first-color); + border-radius: 0.3rem; } \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/components/core/Input.js b/staff/jose-pozo/socialcode/app/components/core/Input.js index 9fb423dc5..9b6509cd7 100644 --- a/staff/jose-pozo/socialcode/app/components/core/Input.js +++ b/staff/jose-pozo/socialcode/app/components/core/Input.js @@ -1,4 +1,4 @@ -class Input extends Compnent { +class Input extends Component { constructor() { super('input') diff --git a/staff/jose-pozo/socialcode/app/components/core/Label.css b/staff/jose-pozo/socialcode/app/components/core/Label.css new file mode 100644 index 000000000..e69de29bb diff --git a/staff/jose-pozo/socialcode/app/components/core/Label.js b/staff/jose-pozo/socialcode/app/components/core/Label.js index 4bbf3b03e..ec705d8d9 100644 --- a/staff/jose-pozo/socialcode/app/components/core/Label.js +++ b/staff/jose-pozo/socialcode/app/components/core/Label.js @@ -1,6 +1,8 @@ class Label extends Component { constructor() { super('label') + + this.addClass('Label') } setFor(id) { diff --git a/staff/jose-pozo/socialcode/app/components/core/SubmitButton.js b/staff/jose-pozo/socialcode/app/components/core/SubmitButton.js index 8db4cecc5..6cfc25781 100644 --- a/staff/jose-pozo/socialcode/app/components/core/SubmitButton.js +++ b/staff/jose-pozo/socialcode/app/components/core/SubmitButton.js @@ -2,7 +2,7 @@ class SubmitButton extends Button { constructor(text) { super() - this.addClass('submitButton') + this.addClass('SubmitButton') this.setType('submit') this.setText(text) diff --git a/staff/jose-pozo/socialcode/app/components/library/FormWithFeedback.js b/staff/jose-pozo/socialcode/app/components/library/FormWithFeedback.js index 796fee2d2..f36bb7f88 100644 --- a/staff/jose-pozo/socialcode/app/components/library/FormWithFeedback.js +++ b/staff/jose-pozo/socialcode/app/components/library/FormWithFeedback.js @@ -4,15 +4,15 @@ class FormWithFeedback extends Form { this.addClass('FormWithFeedback') - const feedbackPanel = new CompositionEvent('p') + const feedbackPanel = new Component('p') feedbackPanel.addClass('Feedback') this.feedbackPanel = feedbackPanel } setFeedback(message, level) { - if (level === 'succes') - this.feedbackPanel.addClass('succes') + if (level === 'success') + this.feedbackPanel.addClass('success') this.feedbackPanel.setText(message) @@ -23,7 +23,7 @@ class FormWithFeedback extends Form { super.clear() this.feedbackPanel.setText('') - this.feedbackPanel.removeClass('succes') + this.feedbackPanel.removeClass('success') this.remove(this.feedbackPanel) } diff --git a/staff/jose-pozo/socialcode/app/data.js b/staff/jose-pozo/socialcode/app/data.js new file mode 100644 index 000000000..02a1b5b6c --- /dev/null +++ b/staff/jose-pozo/socialcode/app/data.js @@ -0,0 +1,73 @@ +const data = {} + +data.findUser = callback => { + let usersJson = localStorage.users + + if (!usersJson) usersJson = '[]' + + const users = JSON.parse(usersJson) + + const user = users.find(callback) + + return user +} + +data.insertUser = user => { + let usersJson = localStorage.users + + if (!usersJson) usersJson = '[]' + + const users = JSON.parse(usersJson) + + users.push(user) + + usersJson = JSON.stringify(users) + + localStorage.users = usersJson +} + +data.findPosts = callback => { + let postsJson = localStorage.posts + + if (!postsJson) postsJson = '[]' + + const posts = JSON.parse(postsJson) + + const filtered = posts.filter(callback) + + return filtered +} + +data.insertPost = post => { + let postsJson = localStorage.posts + + if (!postsJson) postsJson = '[]' + + const posts = JSON.parse(postsJson) + + post.id = `${Math.random().toString().slice(2)}-${Date.now()}` + + posts.push(post) + + postsJson = JSON.stringify(posts) + + localStorage.posts = postsJson +} + +data.deletePost = callback => { + let postsJson = localStorage.posts + + if (!postsJson) postsJson = '[]' + + const posts = JSON.parse(postsJson) + + const index = posts.findIndex(callback) + + if (index > -1) { + posts.splice(index, 1) + + postsJson = JSON.stringify(posts) + + localStorage.posts = postsJson + } +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/errors.js b/staff/jose-pozo/socialcode/app/errors.js new file mode 100644 index 000000000..f7779d1c8 --- /dev/null +++ b/staff/jose-pozo/socialcode/app/errors.js @@ -0,0 +1,24 @@ +class ContentError extends Error { + constructor(messsage) { + super(message) + + //this.name = ContentError.name + this.name = this.constructor.name + } +} + +class MatchError extends Error { + constructor(message) { + super(message) + + this.name = this.constructor.name + } +} + +class DuplicityError extends Error { + constructor(message) { + super(message) + + this.name = this.constructor.name + } +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/global.css b/staff/jose-pozo/socialcode/app/global.css new file mode 100644 index 000000000..bbf75bf00 --- /dev/null +++ b/staff/jose-pozo/socialcode/app/global.css @@ -0,0 +1,18 @@ +@import url('https://fonts.googleapis.com/css2?family=Freeman&display=swap'); + +/* @import url('https://fonts.googleapis.com/css2?family=Workbench&display=swap'); */ + +:root { + --first-color: #7799E5; + --second-color: #17191e; +} + +* { + font-family: Freeman; + color: var(--first-color); +} + +body { + background-color: var(--second-color); + margin: 0; +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/home/components/CreatePostForm.css b/staff/jose-pozo/socialcode/app/home/components/CreatePostForm.css new file mode 100644 index 000000000..2ec9961a6 --- /dev/null +++ b/staff/jose-pozo/socialcode/app/home/components/CreatePostForm.css @@ -0,0 +1,21 @@ +.CreatePostForm { + width: 85%; + margin-top: 6rem; + position: fixed; + top: 6rem; + background: #17191e; + border: 1px solid #7799E5; + border-radius: 0.3rem; +} + +.Button.SubmitButton.create-post { + width: 100%; + margin-top: 2rem; + /*color: #ff6022;*/ + color: #00E8C4; +} + +.Button.SubmitButton.create-post:hover { + background-color: #f73a1c; + cursor: pointer; +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/home/components/CreatePostForm.js b/staff/jose-pozo/socialcode/app/home/components/CreatePostForm.js new file mode 100644 index 000000000..72e7161cd --- /dev/null +++ b/staff/jose-pozo/socialcode/app/home/components/CreatePostForm.js @@ -0,0 +1,43 @@ +class CreatePostForm extends FormWithFeedback { + constructor() { + super() + + this.addClass('CreatePostForm') + + const titleField = new Field('title', 'text', 'Title') + titleField.setPlaceholder('title') + + const imageField = new Field('image', 'text', 'Image') + imageField.setPlaceholder('image') + + const descriptionField = new Field('description', 'text', 'Desciption') + descriptionField.setPlaceholder('description') + + const submitButton = new SubmitButton('Create') + //submitButton.addClass('SubmitButton') + submitButton.addClass('create-post'); + + this.add(titleField) + this.add(imageField) + this.add(descriptionField) + this.add(submitButton) + } + + getTitle() { + const titleField = this.children[0] + + return titleField.getValue() + } + + getImage() { + const imageField = this.children[1] + + return imageField.getValue() + } + + getDescription() { + const descriptionField = this.children[2] + + return descriptionField.getValue() + } +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/home/components/Post.css b/staff/jose-pozo/socialcode/app/home/components/Post.css new file mode 100644 index 000000000..043cccb8d --- /dev/null +++ b/staff/jose-pozo/socialcode/app/home/components/Post.css @@ -0,0 +1,63 @@ +.Post {} + +.LoggedUser { + color: #70FACB; + margin-top: 2rem; + margin-bottom: 0; +} + +.PostHeader { + display: flex; + justify-content: space-between; + align-items: end; + margin-top: 2rem; + margin-bottom: 0; +} + +.AuthorTitle { + color: #2AC195; +} + +.edit-icon { + width: 1rem; +} + +.edit-icon:hover { + cursor: pointer; +} + +.edit-list { + list-style: none; + position: absolute; + right: 5%; + text-align: right; + font-size: 1.5rem; + background-color: #17191e; +} + +.item-list:hover { + cursor: pointer; +} + +.PostTitle { + color: #f4f4f4; + display: flex; + align-items: center; +} + +.PostImage { + width: 100%; + border-radius: 5px; +} + +.PostDescription { + color: #f4f4f4; +} + +.PostDate { + color: #8190BB; +} + +.StraightLine { + border-color: #7799E5; +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/home/components/Post.js b/staff/jose-pozo/socialcode/app/home/components/Post.js new file mode 100644 index 000000000..358d8f9fd --- /dev/null +++ b/staff/jose-pozo/socialcode/app/home/components/Post.js @@ -0,0 +1,89 @@ +class Post extends Component { + constructor(post) { + super('article') + + this.addClass('Post') + + const authorTitle = new Component('p') + authorTitle.setText(post.author) + + + + const editIcon = new Image + editIcon.setUrl('../assets/EditIcon.png') + editIcon.addClass('edit-icon') + + const postHeader = new Component('div') + postHeader.addClass('PostHeader') + + postHeader.add(authorTitle) + + + + logic.authorLogged = () => { + if (post.author === sessionStorage.username) { + authorTitle.addClass('LoggedUser') + postHeader.add(editIcon) + } else + authorTitle.addClass('AuthorTitle') + } + + logic.authorLogged() + + + const postTitle = new Component('h2') + postTitle.setText(post.title) + postTitle.addClass('PostTitle') + + const editList = new Component('ul') + editList.addClass('edit-list') + + const item1List = new Component('li') + item1List.setText('Edit') + item1List.addClass('item-list') + const item2List = new Component('li') + item2List.setText('Delete') + item2List.addClass('item-list') + + editList.add(item1List) + editList.add(item2List) + + let statusIcon = true + + editIcon.onClick(event => { + event.preventDefault() + + statusIcon = !statusIcon + + if (!statusIcon) + postTitle.add(editList) + + else + postTitle.remove(editList) + }) + + + const postImage = new Image + postImage.setUrl(post.image) + postImage.addClass('PostImage') + + const postDescription = new Component('p') + postDescription.setText(post.description) + postDescription.addClass('PostDescription') + + const postDate = new Component('time') + postDate.setText(post.date) + postDate.addClass('PostDate') + + const straightLine = new Component('hr') + straightLine.addClass('StraightLine') + + + this.add(postHeader) + this.add(postTitle) + this.add(postImage) + this.add(postDescription) + this.add(postDate) + this.add(straightLine) + } +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/home/index.css b/staff/jose-pozo/socialcode/app/home/index.css index c0f481f51..2c47e4c07 100644 --- a/staff/jose-pozo/socialcode/app/home/index.css +++ b/staff/jose-pozo/socialcode/app/home/index.css @@ -1,30 +1,87 @@ .View { display: flex; flex-direction: column; - align-items: center; - margin: 4rem 0; + margin: 0; } .Header { + width: 90%; display: flex; gap: 1rem; - width: 100%; + align-self: center; justify-content: right; + align-items: center; position: fixed; top: 0; - padding: .5rem; box-sizing: border-box; - border-bottom: 1px solid var(--first-color); + /*border-bottom: 1px solid var(--first-color);*/ background-color: var(--second-color); + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.Logo { + height: 50px; + margin-right: auto; +} + +.UsernameTitle { + color: #70FACB; +} + +.LogoutButton:hover { + cursor: pointer; + background-color: #f73a1c; +} + +.Main { + display: flex; + justify-content: center; +} + +.PostList { + width: 90%; + margin-top: 6rem; + margin-bottom: 5rem; + +} + +.Button.logout { + /*margin-right: 0.6rem;*/ } .Footer { width: 100%; + padding: 1rem; display: flex; justify-content: center; + align-items: center; position: fixed; bottom: 0; padding: .5rem 0; - border-top: 1px solid var(--first-color); + /*border-top: 1px solid var(--first-color);*/ background-color: var(--second-color); +} + +.HomeButton { + width: 2rem; + height: 2rem; + background-image: url(../assets/Home.png); + background-size: cover; + border: none; +} + +.PostButton { + width: 2rem; + height: 2rem; + margin: 0.5rem; + display: flex; + justify-content: center; + align-items: center; + font-size: 2rem; +} + +.PostButton:hover { + cursor: pointer; + background-color: #f73a1c; } \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/home/index.html b/staff/jose-pozo/socialcode/app/home/index.html index 9507167ae..826dd4328 100644 --- a/staff/jose-pozo/socialcode/app/home/index.html +++ b/staff/jose-pozo/socialcode/app/home/index.html @@ -8,13 +8,22 @@ + + + + + + + + + @@ -23,6 +32,15 @@ + + + + + + + + + diff --git a/staff/jose-pozo/socialcode/app/home/index.js b/staff/jose-pozo/socialcode/app/home/index.js new file mode 100644 index 000000000..ba017716e --- /dev/null +++ b/staff/jose-pozo/socialcode/app/home/index.js @@ -0,0 +1,97 @@ +if (!logic.isUserLoggedIn()) + location.href = '../login' + +const view = new Component(document.body) +view.addClass('View') + +const header = new Component('header') +header.addClass('Header') +view.add(header) + +const logo = new Image +logo.setUrl('../assets/SocialCode.png') +logo.addClass('Logo') + +header.add(logo) + +const userName = logic.getUserName() + +const usernameTitle = new Heading(3) +usernameTitle.setText(userName) +usernameTitle.addClass('UsernameTitle') +header.add(usernameTitle) + +const logoutButton = new Button +logoutButton.setText('Logout') +logoutButton.addClass('LogoutButton') + +logoutButton.onClick(() => { + logic.logoutUser() + + location.href = '../login' +}) + +header.add(logoutButton) + +const main = new Component('main') +main.addClass('Main') +view.add(main) + +const postList = new Component('section') +postList.addClass('PostList') +main.add(postList) + +const posts = logic.getAllPosts() + +posts.forEach(post => { + const post2 = new Post(post) + + postList.add(post2) +}); + +const createPostForm = new CreatePostForm + +createPostForm.onSubmit(event => { + event.preventDefault() + + const title = createPostForm.getTitle() + const image = createPostForm.getImage() + const description = createPostForm.getDescription() + + try { + logic.createPost(title, image, description) + + // TODO dismount create post form from main + // TODO refresh post list + location.reload() + + window.scrollTo(0, 0) + + } catch (error) { + if (error instanceof ContentError) + createPostForm.setFeedback(error.message + ', please, correct it') + else + createPostForm.setFeedback('sorry, thre was an error, please tr again later') + } +}) + +//TODO mount creat post form when clicing on plus button + +const footer = new Component('footer') +footer.addClass('Footer') +view.add(footer) + +const homeButton = new Button +//homeButton.setText('+') +homeButton.addClass('HomeButton') +//homeButton.setUrl('../assets/home.png') + +const addPostButton = new Button +addPostButton.setText('+') +addPostButton.addClass('PostButton') + +footer.add(homeButton) +footer.add(addPostButton) + +const statusButton = logic.statusButton() + diff --git a/staff/jose-pozo/socialcode/app/logic.js b/staff/jose-pozo/socialcode/app/logic.js new file mode 100644 index 000000000..055e2de8a --- /dev/null +++ b/staff/jose-pozo/socialcode/app/logic.js @@ -0,0 +1,120 @@ +const logic = {} + +const EMAIL_REGEX = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ +const USERNAME_REGEX = /^[\w-]+$/ +const PASSWORD_REGEX = /^[\w-$%&=\[\]\{\}\<\>\(\)]{4,}$/ + +const NAME_REGEX = /^[a-zA-Z=\[\]\{\}\<\>\(\)]{1,}$/ + +logic.registerUser = (name, surname, email, username, password, passwordRepeat) => { + if (!NAME_REGEX.test(name)) + throw new ContentError('name is not valid') + + if (!NAME_REGEX.test(surname)) + throw new ContentError('surname is not valid') + + if (!EMAIL_REGEX.test(email)) + throw new ContentError('email is not valid') + + if (!USERNAME_REGEX.test(username)) + throw new ContentError('username is not valid') + + if (!PASSWORD_REGEX.test(password)) + throw new ContentError('password is not valid') + + if (password !== passwordRepeat) + throw new MatchError('passwords don\'t match') + + let user = data.findUser(user => user.email === email || user.username === username) + + if (user) + throw new DuplicityError('user already exists') + + user = { + name: name, + surname: surname, + email: email, + username: username, + password: password + } + + data.insertUser(user) +} + +logic.loginUser = (username, password) => { + if (!USERNAME_REGEX.test(username)) + throw new ContentError('username is not valid') + + if (!PASSWORD_REGEX.test(password)) + throw new ContentError('password is not valid') + + let user = data.findUser(user => user.username === username) + + if (!user) + throw new MatchError('user not found') + + if (user.password !== password) + throw new MatchError('wrong password') + + sessionStorage.username = username +} + +logic.isUserLoggedIn = () => !!sessionStorage.username + +logic.logoutUser = () => delete sessionStorage.username + +logic.getUserName = () => { + const user = data.findUser(user => user.username === sessionStorage.username) + + return user.name +} + +logic.getAllPosts = () => { + const posts = data.findPosts(() => true) + + return posts.reverse() +} + +logic.statusButton = () => { + let statusButton = true + + addPostButton.onClick(event => { + event.preventDefault() + + statusButton = !statusButton + + if (!statusButton) + main.add(createPostForm) + + else + main.remove(createPostForm) + }) +} + + +logic.createPost = (title, image, description) => { + if (typeof title !== 'string' || !title.length || title.length > 50) throw new ContentError('title is not valid') + if (typeof image !== 'string' || !image.startsWith('http')) throw new ContentError('image is not valid') + if (typeof description !== 'string' || !description.length || description.length > 200) throw new ContentError('description is not valid') + + const currentDate = new Date() + + const day = currentDate.getDate() + const month = (currentDate.getMonth() + 1) + const year = currentDate.getFullYear() + const hours = currentDate.getHours() + const minutes = currentDate.getMinutes() + + const postDate = `${day}/${month}/${year}, ${hours}:${minutes}h.`; + + const post = { + author: sessionStorage.username, + title, + image, + description, + date: postDate + } + + data.insertPost(post) +} + diff --git a/staff/jose-pozo/socialcode/app/login/LoginForm.css b/staff/jose-pozo/socialcode/app/login/LoginForm.css new file mode 100644 index 000000000..15e72fe0d --- /dev/null +++ b/staff/jose-pozo/socialcode/app/login/LoginForm.css @@ -0,0 +1,9 @@ +.SubmitLogin { + width: 100%; + margin-top: 2rem; +} + +.SubmitLogin:hover { + background-color: #f73a1c; + cursor: pointer; +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/login/LoginForm.js b/staff/jose-pozo/socialcode/app/login/LoginForm.js new file mode 100644 index 000000000..a3a2f6213 --- /dev/null +++ b/staff/jose-pozo/socialcode/app/login/LoginForm.js @@ -0,0 +1,30 @@ +class LoginForm extends FormWithFeedback { + constructor() { + super() + + this.addClass('LoginForm') + + const usernameField = new Field('username', 'text', 'Username') + + const passwordField = new Field('password', 'password', 'Password') + + const submitButton = new SubmitButton('Login') + submitButton.addClass('SubmitLogin') + + this.add(usernameField) + this.add(passwordField) + this.add(submitButton) + } + + getUsername() { + const usernameField = this.children[0] + + return usernameField.getValue() + } + + getPassword() { + const passwordField = this.children[1] + + return passwordField.getValue() + } +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/login/index.css b/staff/jose-pozo/socialcode/app/login/index.css new file mode 100644 index 000000000..d1c26e12b --- /dev/null +++ b/staff/jose-pozo/socialcode/app/login/index.css @@ -0,0 +1,42 @@ +.View { + display: flex; + flex-direction: column; + align-items: center; +} + +.Header { + width: 90%; + display: flex; + gap: 1rem; + align-self: center; + justify-content: right; + align-items: center; + position: fixed; + top: 0; + box-sizing: border-box; + /*border-bottom: 1px solid var(--first-color);*/ + background-color: var(--second-color); + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.Logo { + height: 50px; + margin-right: auto; +} + +.RegisterLink { + border: 1px solid #7799E5; + border-radius: 0.3rem; + padding: .5rem; + text-decoration: none; +} + +.RegisterLink:hover { + cursor: pointer; + background-color: #f73a1c; +} + +.Title { + margin-top: 8rem; +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/login/index.html b/staff/jose-pozo/socialcode/app/login/index.html new file mode 100644 index 000000000..f02497c7e --- /dev/null +++ b/staff/jose-pozo/socialcode/app/login/index.html @@ -0,0 +1,48 @@ + + + + + + + Login + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/login/index.js b/staff/jose-pozo/socialcode/app/login/index.js new file mode 100644 index 000000000..e6e80e828 --- /dev/null +++ b/staff/jose-pozo/socialcode/app/login/index.js @@ -0,0 +1,59 @@ +if (logic.isUserLoggedIn()) + location.href = '../home' + +const view = new Component(document.body) +view.addClass('View') + +const header = new Component('header') +header.addClass('Header') +view.add(header) + +const logo = new Image +logo.setUrl('../assets/SocialCode.png') +logo.addClass('Logo') + +const registerLink = new Link +registerLink.addClass('RegisterLink') +registerLink.setText('Register') +registerLink.onClick(event => { + event.preventDefault() + + setTimeout(() => location.href = '../register', 500) +}) + +header.add(logo) +header.add(registerLink) + +const title = new Heading(1) +title.setText('Login') +title.addClass('Title') + +const loginForm = new LoginForm +loginForm.addClass('LoginForm') +loginForm.onSubmit(event => { + event.preventDefault() + + const username = loginForm.getUsername() + const password = loginForm.getPassword() + + try { + logic.loginUser(username, password) + + loginForm.clear() + + loginForm.setFeedback('user successfully logged in', 'success') + + setTimeout(() => location.href = '../home', 1000) + } catch (error) { + if (error instanceof ContentError) + loginForm.seFeedback(error.message + ', please, correct it') + else if (error instanceof MatchError) + loginForm.setFeedback('wrong credentials') + else + loginForm.setFeedback('sorry, there was an error, please try again later') + } +}) + +view.add(header) +view.add(title) +view.add(loginForm) \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/register/RegisterForm.js b/staff/jose-pozo/socialcode/app/register/RegisterForm.js new file mode 100644 index 000000000..ecf1b3a65 --- /dev/null +++ b/staff/jose-pozo/socialcode/app/register/RegisterForm.js @@ -0,0 +1,71 @@ +class RegisterForm extends FormWithFeedback { + constructor() { + super() + + this.addClass('RegisterForm') + + const nameField = new Field('name', 'text', 'Name') + nameField.setPlaceholder('name') + + const surnameField = new Field('surname', 'text', 'Surname') + surnameField.setPlaceholder('surname') + + const emailField = new Field('email', 'email', 'E-mail') + emailField.setPlaceholder('name@example.com') + + const usernameField = new Field('username', 'text', 'Username') + usernameField.setPlaceholder('username') + + const passwordField = new Field('password', 'password', 'Password') + passwordField.setPlaceholder('password') + + const passwordRepeatField = new Field('password', 'password', 'Password repeat') + passwordRepeatField.setPlaceholder('repeat password') + + const submitButton = new SubmitButton('Register') + + this.add(nameField) + this.add(surnameField) + this.add(emailField) + this.add(usernameField) + this.add(passwordField) + this.add(passwordRepeatField) + this.add(submitButton) + } + + getName() { + const nameField = this.children[0] + + return nameField.getValue() + } + + getSurname() { + const surnameField = this.children[1] + + return surnameField.getValue() + } + + getEmail() { + const emailField = this.children[2] + + return emailField.getValue() + } + + getUsername() { + const usernameField = this.children[3] + + return usernameField.getValue() + } + + getPassword() { + const passwordField = this.children[4] + + return passwordField.getValue() + } + + getPasswordRepeat() { + const passwordFieldRepeat = this.children[5] + + return passwordFieldRepeat.getValue() + } +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/register/index.css b/staff/jose-pozo/socialcode/app/register/index.css new file mode 100644 index 000000000..bc1b9da85 --- /dev/null +++ b/staff/jose-pozo/socialcode/app/register/index.css @@ -0,0 +1,42 @@ +.View { + display: flex; + flex-direction: column; + align-items: center; +} + +.Header { + width: 90%; + display: flex; + gap: 1rem; + align-self: center; + justify-content: right; + align-items: center; + position: fixed; + top: 0; + box-sizing: border-box; + /*border-bottom: 1px solid var(--first-color);*/ + background-color: var(--second-color); + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.Logo { + height: 50px; + margin-right: auto; +} + +.LoginLink { + border: 1px solid #7799E5; + border-radius: 0.3rem; + padding: .5rem; + text-decoration: none; +} + +.LoginLink:hover { + cursor: pointer; + background-color: #f73a1c; +} + +.Title { + margin-top: 8rem; +} \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/register/index.html b/staff/jose-pozo/socialcode/app/register/index.html new file mode 100644 index 000000000..033c3a8c0 --- /dev/null +++ b/staff/jose-pozo/socialcode/app/register/index.html @@ -0,0 +1,47 @@ + + + + + + + Register + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/staff/jose-pozo/socialcode/app/register/index.js b/staff/jose-pozo/socialcode/app/register/index.js new file mode 100644 index 000000000..f207c2e11 --- /dev/null +++ b/staff/jose-pozo/socialcode/app/register/index.js @@ -0,0 +1,65 @@ +if (logic.isUserLoggedIn()) + location.href = '../home' + +const view = new Component(document.body) +view.addClass('View') + +const header = new Component('header') +header.addClass('Header') +view.add(header) + +const logo = new Image +logo.setUrl('../assets/SocialCode.png') +logo.addClass('Logo') + +const loginLink = new Link +loginLink.addClass('LoginLink') +loginLink.setText('Login') +loginLink.onClick(event => { + event.preventDefault() + + setTimeout(() => location.href = '../login', 500) +}) + +header.add(logo) +header.add(loginLink) + +const title = new Heading(1) +title.addClass('Title') +title.setText('Register') +title.onClick(() => alert('By clicking on this title you wont get anything .P')) + +const registerForm = new RegisterForm +registerForm.onSubmit(event => { + event.preventDefault() + + const name = registerForm.getName() + const surname = registerForm.getSurname() + const email = registerForm.getEmail() + const username = registerForm.getUsername() + const password = registerForm.getPassword() + const passwordRepeat = registerForm.getPasswordRepeat() + + try { + logic.registerUser(name, surname, email, username, password, passwordRepeat) + + registerForm.clear() + + registerForm.setFeedback('user successfully registered', 'success') + + setTimeout(() => location.href = '../login', 1000) + } catch (error) { + if (error instanceof ContentError) + registerForm.setFeedback(error.message + ', please, correct it') + else if (error instanceof MatchError) + registerForm.setFeedback(error.message + ', please, retype them') + else if (error instanceof DuplicityError) + registerForm.setFeedback(error.message + ', please, enter new one') + else + registerForm.setFeedback('sorry, there was an error, please try again later') + } +}) + +view.add(header) +view.add(title) +view.add(registerForm)