Parse user agent to discern the common platforms that UIs are tailored for. Expected that you'll inherit from this to specify native apps.
class ApplicationPlatform < PlatformAgent def ios_app? match? /BC3 iOS/ end def android_app? match? /BC3 Android/ end def mac_app? match?(/Electron/) && match?(/basecamp3/) && match?(/Macintosh/) end def windows_app? match?(/Electron/) && match?(/basecamp3/) && match?(/Windows/) end end module SetPlatform extend ActiveSupport::Concern included do helper_method :platform end private def platform @platform ||= ApplicationPlatform.new(request.user_agent) end end class ApplicationController < ActionController::Base include SetPlatform end <% if platform.phone? %> Do phone specific stuff! <% end %>
This library is an extraction from Basecamp that's been sufficient in almost unaltered form for years. While contributions are always welcome, do not expect a lot of feature evolution beyond the basics.
Platform Agent is released under the MIT License.