require_relative 'forms/login'
class LoginComponent < Roda::Component
comp_name :login
comp_html "../public/chat/login.html"
comp_setup do |dom|
tmpl :field_error, dom.at('.field-error')
dom.css('.signup, .forgot-password, .remember-me').remove
end
def display
return unless server?
session['display'] = 'login'
component(:layout, body_class: 'login') do
dom.find('body').html
end
end
def logout
super(TestApp::Models::User)
request.redirect 'login'
end
on :server do
def login_with params
signup = params.delete('signup')
form = Forms::Login.new params
if signup
if form.valid?
TestApp::Models::User.create form.slice(:first_name, :last_name, :email, :password)
login(TestApp::Models::User, form.email, form.password)
{success: true}
else
{success: false, errors: form.errors}
end
else
user = TestApp::Models::User.where(email: form.email).first
return {success: false, reason: 'Account doesn\'t exist.'} unless user
if login(TestApp::Models::User, form.email, form.password)
{success: true}
else
{success: false, errors: { email: ['Email and Password combination is incorrect.']}}
end
end
end
end
on :form, 'form.main-form', Forms::Login do |form, el, evt|
if form.valid?
login_with form.attributes do |res|
if res['success']
# redirect them to the chatroom
`window.location.replace("/")`
else
case res['reason']
when /doesn't exist/
# Add fields for them to signup with
container = el.find('.field-container')
container.prepend('')
container.prepend('')
container.prepend('')
container.find("[name='password']").after('')
else
# Show server errors
form.display_errors tmpl: tmpl(:field_error), errors: res['errors']
end
end
end
else
form.display_errors tmpl: tmpl(:field_error)
end
end
end