Hello. So this is my new Solidus frontend work-in-...
# general
t
Hello. So this is my new Solidus frontend work-in-progress. Eventually I'll release it along with a properly cleaned up admin:
Copy code
#!/usr/bin/env zsh
set -e # Stop script on first error

#
# MYAPP SETUP 2.0
#

# Check Rails Installation
if ! gem list -i rails; then
  echo "Rails is not installed, installing Rails..."
  gem install rails --version "~> 7.1.3"
else
  echo "Rails is already installed."
fi

# Create New Rails Application
echo "Creating new Rails application with PostgreSQL, esbuild, and I18n support..."
rails new myapp --database=postgresql --javascript=esbuild --css=sass --skip-turbo-links
cd brgen

# Add Necessary Gems
echo "Adding necessary gems..."
bundle add esbuild-rails hotwire-rails stimulus_reflex devise

# Install Frameworks
echo "Installing Hotwire, StimulusReflex, and configuring Propshaft..."
bin/rails hotwire:install
bin/rails stimulus_reflex:install
bin/rails propshaft:install

# Initial Git Setup
git init
git add .
git commit -m "Initial setup: Generate Rails app with frontend gems"

# Configure Falcon as the Web Server

echo "Configuring Falcon as the default web server..."
cat <<RUBY > config/falcon.rb
#!/usr/bin/env falcon-host
# frozen_string_literal: true

ENV["RAILS_ENV"] ||= "production"
require_relative "./config/environment"
require "async/websocket/adapters/rack"

load :rack, :supervisor

Async do
  hostname = "brgen"

  rails = Rack::Builder.new do
    map "/cable" do
      run ActionCable.server
    end

    run Rails.application
  end

  rack hostname do
    endpoint Async::HTTP::Endpoint.parse("<http://0.0.0.0:74823>")
    app rails
  end

  supervisor
end
RUBY

git add .
git commit -m "Configured Falcon as the web server for production environment."

# Configure Rails as a Progressive Web App (PWA)
echo "Configuring Rails as a Progressive Web App (PWA)..."
bin/rails generate pwa:install
git add .
git commit -m "Configured Rails to run as a Progressive Web App (PWA)"

# Setting Up Devise for User Authentication
echo "Setting up Devise for user authentication..."
bundle add devise
bin/rails generate devise:install
bin/rails generate devise User
bin/rails generate migration Add_Details_To_Users username:string karma:integer avatar:string
bin/rails db:migrate

git add .
git commit -m "Added Devise gem, enhanced User model with Avatar, Username, and Karma attributes."

# --

# Solidus ecommerce framework

# Install necessary gems and dependencies
echo "Adding required gems..."
bundle add solidus solidus_auth_devise
bundle install

# Set up Solidus and default configurations
echo "Installing Solidus with default configurations..."
bin/rails generate solidus:install --auto-accept
bin/rails db:migrate

git add .
git commit -m "Install Solidus ecommerce framework."

# Setup SearchReflex for dynamic product search
echo "Creating SearchReflex for live product search..."
cat <<RUBY > app/reflexes/search_reflex.rb
class SearchReflex < ApplicationReflex
  def perform
    term = element[:value]
    @products = Spree::Product.where("name ILIKE ?", "%#{term}%")
    morph '#products_list', render(partial: 'spree/products/product_list', locals: { products: @products })
  end
end
RUBY
git add .
git commit -m "Add Stimulus Reflex dynamic search functionality."

# Enhance product index view
echo "Enhancing product index view with modern standards..."
cat <<ERB > app/views/spree/products/index.html.erb
<%= form_with url: spree.products_path, method: :get, local: true, class: "search_form", data: { reflex: "keyup->Search#perform" } do |form| %>
  <%= form.text_field :query, placeholder: t('search.products'), class: 'search_input', data: { action: "keyup->search#perform" } %>
<% end %>
<%= tag.div id: "products_index", class: "products_index", itemscope: true, itemtype: "<http://schema.org/ItemList>" do %>
  <%= render partial: 'spree/products/product_card', collection: @products, as: :product %>
<% end %>
ERB

# Create product card partial
echo "Creating product card partial with SEO improvements..."
cat <<ERB > app/views/spree/products/_product_card.html.erb
<%= tag.div class: "product_card", itemprop: "itemListElement", itemscope: true, itemtype: "<http://schema.org/Product>" do %>
  <%= link_to spree.product_path(product), itemprop: "url", class: "product_link" do %>
    <%= image_tag product.display_image, itemprop: "image", class: "product_image", alt: product.name %>
    <%= tag.div class: "product_details" do %>
      <%= tag.h2 product.name, itemprop: "name", class: "product_name" %>
      <%= tag.p product.description, itemprop: "description", class: "product_description" %>
      <%= tag.span number_to_currency(product.price), itemprop: "price", class: "product_price" %>
    <% end %>
  <% end %>
<% end %>
ERB

# Update CSS for product views
echo "Updating CSS for modernized views..."
cat <<SCSS > app/assets/stylesheets/spree/frontend/products.scss
.products_index {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 20px;
}

.product_card {
  background: white;
  border: 1px solid #ccc;
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
  &:hover {
    transform: translateY(-5px);
  }
}

.product_image {
  width: 100%;
  height: auto;
}

.product_details {
  margin-top: 10px;
}

.product_name, .product_description, .product_price {
  margin-bottom: 10px;
}
SCSS

git add .
git commit -m "Modernized product views and implemented <http://Schema.org|Schema.org> SEO improvements."

***** END *****
Constructive criticism welcome!
j
link?!