From c44db203856844fdc223becba6c6822e3067b0a5 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Sun, 11 Aug 2024 19:39:56 -0500 Subject: [PATCH] Create /downloads-legacy, and update /downloads for the 3 clients --- web/Gemfile.lock | 2 +- .../content/button_download_windows.png | Bin 12415 -> 17781 bytes web/app/assets/javascripts/web/downloads.js | 64 ++++++++++++------ web/app/assets/javascripts/web/web.js | 1 + web/app/assets/stylesheets/web/downloads.scss | 28 ++++++-- web/app/controllers/users_controller.rb | 8 +++ .../views/users/_download_templates.html.slim | 61 +++++++++++------ web/app/views/users/_downloads.html.slim | 9 +-- web/config/routes.rb | 1 + wordpress/plugins/jamkazam/README.txt | 2 +- 10 files changed, 118 insertions(+), 58 deletions(-) diff --git a/web/Gemfile.lock b/web/Gemfile.lock index 03fcf0042..ec30059e5 100644 --- a/web/Gemfile.lock +++ b/web/Gemfile.lock @@ -936,7 +936,7 @@ DEPENDENCIES zip-codes RUBY VERSION - ruby 2.4.1p111 + ruby 2.3.1p112 BUNDLED WITH 1.17.3 diff --git a/web/app/assets/images/content/button_download_windows.png b/web/app/assets/images/content/button_download_windows.png index fd240ee35f82a30486fbd11c67ff96a819364c3e..b55ccdc13b1aed5b4a79cffbe67876cb6b375cd2 100644 GIT binary patch literal 17781 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 whx76ZzW*&>LQ(4VvmG3lsS$p8d5Z?Oy@~ diff --git a/web/app/assets/javascripts/web/downloads.js b/web/app/assets/javascripts/web/downloads.js index 598c8edde..8487c63e0 100644 --- a/web/app/assets/javascripts/web/downloads.js +++ b/web/app/assets/javascripts/web/downloads.js @@ -9,6 +9,18 @@ var downloadUris = {}; // map of platform > uri var rest = context.JK.Rest(); + + // We use this method to detect M1 macs and set appropriate API values to prevent sites from detecting fingerprinting protections + function isAppleSilicon () { + var canvas = document.createElement('canvas'); + var gl = canvas.getContext('webgl'); + + // Best guess if the device is an Apple Silicon + // https://stackoverflow.com/a/65412357 + // @ts-expect-error - Object is possibly 'null' + return gl.getSupportedExtensions().indexOf('WEBGL_compressed_texture_etc') !== -1 + } + function selectPlatform(selectedPlatform) { //console.log("selectedPlatform", selectedPlatform); var platformName; // mac, windows, linux @@ -18,33 +30,34 @@ var uri = downloadUris[selectedPlatform]; // prepare template varaibles - if (selectedPlatform == "Unix") { - platformName = "linux"; - platformDisplay = "Linux" - platformName1 = "mac"; - platformDisplay1 = "Mac"; + if (selectedPlatform == "MacOSX_MX") { + platformName = "mac_mx"; + platformDisplay = "Mac/M1,M2...MX"; + platformName1 = "mac_intel"; + platformDisplay1 = "Mac/Intel"; platformName2 = "windows"; platformDisplay2 = "Windows"; - platform1 = "MacOSX"; + platform1 = "MacOSX_Intel"; platform2 = "Win32" } else if(selectedPlatform == "Win32") { platformName = "windows"; platformDisplay = "Windows"; - platformName1 = "mac"; - platformDisplay1 = "Mac"; - platformName2 = "linux" - platformDisplay2 = "Linux"; - platform1 = "MacOSX"; - platform2 = "Unix"; - } else if(selectedPlatform == "MacOSX") { - platformName = "mac"; - platformDisplay = "Mac"; + platformName1 = "mac_intel"; + platformDisplay1 = "Mac/Intel"; + platformName2 = "mac_mx" + platformDisplay2 = "Mac/M1,M2...MX"; + platform1 = "MacOSX_Intel"; + platform2 = "MacOSX_MX"; + } else if(selectedPlatform == "MacOSX_Intel") { + console.log("IM MACOSXINTEL"); + platformName = "mac_intel"; + platformDisplay = "Mac/Intel"; platformName1 = "windows"; platformDisplay1 = "Windows"; - platformName2 = "linux"; - platformDisplay2 = "Linux"; + platformName2 = "mac_mx"; + platformDisplay2 = "Mac/M1,M2...MX"; platform1 = "Win32"; - platform2 = "Unix"; + platform2 = "MacOSX_MX"; } else { alert("unknown platform: " + selectedPlatform); @@ -75,7 +88,6 @@ $('div.hidden-images img[data-purpose=' + platformName1 + ']', selectOthers).remove().appendTo($('a[data-order=1]', selectOthers)); $('div.hidden-images img[data-purpose=' + platformName2 + ']', selectOthers).remove().appendTo($('a[data-order=2]', selectOthers)); - // install click handler for change selection $('a', selectOthers).click(function() { var platform = $(this).attr('data-platform'); @@ -104,6 +116,8 @@ // update blurb $('body.web .downloads-blurb').empty().append(blurb); + context.JK.popExternalLinks(blurb); + // update the 'download other platforms' buttons $('body.web .downloads-container').empty().append(selectOthers); // update system requirements @@ -144,6 +158,18 @@ var currentOS = context.JK.detectOS(); var downloads = $('.downloads'); + if(currentOS == "MacOSX") { + var silicon = isAppleSilicon(); + if(silicon == true) { + currentOS = "MacOSX_MX"; + } + else { + currentOS = "MacOSX_Intel"; + } + } + console.log("CURRENT OS ", currentOS) + + rest.getClientDownloads() .done(function(data) { //console.log('getClientDownloads', data); diff --git a/web/app/assets/javascripts/web/web.js b/web/app/assets/javascripts/web/web.js index 241f5fd8f..b0c3d3711 100644 --- a/web/app/assets/javascripts/web/web.js +++ b/web/app/assets/javascripts/web/web.js @@ -69,6 +69,7 @@ //= require landing/signup //= require recordingModel //= require web/downloads +//= require web/downloads_legacy //= require web/congratulations //= require web/sessions //= require web/session_info diff --git a/web/app/assets/stylesheets/web/downloads.scss b/web/app/assets/stylesheets/web/downloads.scss index 68b180b83..ccf024030 100644 --- a/web/app/assets/stylesheets/web/downloads.scss +++ b/web/app/assets/stylesheets/web/downloads.scss @@ -13,8 +13,18 @@ body.downloads { .badge-number { display:none; } + .download-container.legacy { + .downloads-blurb { + margin-top:20px; + } + .download-others { + p { + margin:0; + } + } + } .download-app { - left:22.5%; + left:20%; float:none; position:relative; } @@ -33,7 +43,6 @@ body.downloads { color:#CCC; font-size:14px; line-height:125%; - text-indent:-5px; margin-left:40px; &:before @@ -52,7 +61,7 @@ body.downloads { .download-app { padding-top:20px; - width:55%; + width:60%; float:left; @include border_box_sizing; } @@ -97,9 +106,9 @@ body.downloads { } .download-entreaty { - + margin-bottom:25px; p.click-to-download { - margin-bottom:5px; + } } @@ -120,7 +129,7 @@ body.downloads { } ul li { - font-size:12px; + font-size:14px; margin-left:15px; } @@ -134,7 +143,12 @@ body.downloads { .download-box { color:#fff; - text-align:center; + text-align:left; + line-height:135%; + } + + .download-legacy-backup { + margin-top:20px; } .go-jamtrack-shopping { diff --git a/web/app/controllers/users_controller.rb b/web/app/controllers/users_controller.rb index 6847087d8..d4f5109d2 100644 --- a/web/app/controllers/users_controller.rb +++ b/web/app/controllers/users_controller.rb @@ -232,6 +232,14 @@ class UsersController < ApplicationController render rend[:template], :layout => rend[:layout] end + def downloads_legacy + @no_user_dropdown = true + @page_context = 'standalone' + render :layout => 'web' + # rend = _render('downloads_legacy') + #render rend[:template], :layout => rend[:layout] + end + def downloads2021 render :downloads2021, layout: 'jk2021' end diff --git a/web/app/views/users/_download_templates.html.slim b/web/app/views/users/_download_templates.html.slim index 828738a10..0368dc5a0 100644 --- a/web/app/views/users/_download_templates.html.slim +++ b/web/app/views/users/_download_templates.html.slim @@ -8,40 +8,57 @@ script type="text/template" id="client-download-blurb-contents" h5 SYSTEM REQUIREMENTS: | {% if(data.platform == "Win32") { %} ul.windows-requirements - li Windows 7, 8, or 10 - 64-bit (32-bit not supported) + li Windows 10 or 11 - 64-bit (32-bit not supported) li Dual core processor or higher li 75MB hard disk space for app - li External audio interface recommended (but you can start with built-in mic and & headphone jack) - li USB 2.0, USB 3.0, Thunderbolt, or Firewire (not USB 1.1) for external audio interfaces - li Ethernet port for real-time online sessions (WiFi not recommended) - li Broadband Internet service with 1Mbps uplink bandwidth for real-time online sessions - | {% } else if(data.platform == "MacOSX") { %} + li + span External audio interface for audio processing ( + a rel="external" href="https://jamkazam.freshdesk.com/support/solutions/articles/66000122514-audio-interfaces-for-windows-computers" see recommendations if you don't have one + span ) + li USB 2.0, USB 3.0, or USB-C (not USB 1.1) for audio interface + li Ethernet port and Ethernet cable to connect directly to home router (WiFi not recommended) + li Broadband Internet service with 1Mbps upload bandwidth (3-5Mbps preferred) + | {% } else if(data.platform == "MacOSX_Intel") { %} ul.mac-requirements - li Mac OS X 10.8 or higher, 64-bit - li Dual-core processor or higher + li macOS 10.15 (Catalina) or higher, 64-bit li 75MB hard disk space for app - li External audio interface recommended (but you can start with built-in mic and & headphone jack) - li USB 2.0, USB 3.0, Thunderbolt, or Firewire (not USB 1.1) for external audio interfaces - li Ethernet port for real-time online sessions (WiFi not recommended) - li Broadband Internet service with 1Mbps uplink bandwidth for real-time online sessions + li + span External audio interface for audio processing ( + a rel="external" href="https://jamkazam.freshdesk.com/support/solutions/articles/66000122513-audio-interfaces-for-mac-computers" see recommendations if you don't have one + span ) + li USB 2.0, USB 3.0, or USB-C (not USB 1.1) for audio interface + li Ethernet port and Ethernet cable to connect directly to home router (WiFi not recommended) + li Broadband Internet service with 1Mbps upload bandwidth (3-5Mbps preferred) | {% } else { %} - ul.linux-requirements - li Linux is not yet supported + ul.mac-requirements + li macOS 10.15 (Catalina) or higher, 64-bit + li 75MB hard disk space for app + li + span External audio interface for audio processing ( + a rel="external" href="https://jamkazam.freshdesk.com/support/solutions/articles/66000122513-audio-interfaces-for-mac-computers" see recommendations if you don't have one + span ) + li USB 2.0, USB 3.0, or USB-C (not USB 1.1) for audio interface + li Ethernet port and Ethernet cable to connect directly to home router (WiFi not recommended) + li Broadband Internet service with 1Mbps upload bandwidth (3-5Mbps preferred) | {% } %} - + p.download-legacy-backup + | If you have trouble with the new JamKazam app and cannot get things worked out with the help of our support team, you can  + a href="/downloads-legacy" go here + |  to download and re-install the legacy JamKazam app for now. .hidden.hidden-images - = image_tag("content/button_download_mac.png", :alt => "download mac", :size => "348x92", "data-purpose" => "mac") + = image_tag("content/button_download_mac_intel.png", :alt => "download mac (intel)", :size => "348x92", "data-purpose" => "mac_intel") = image_tag("content/button_download_windows.png", :alt => "download windows", :size => "348x92", "data-purpose" => "windows") - = image_tag("content/button_download_linux.png", :alt => "download linux", :size => "348x92", "data-purpose" => "linux") + = image_tag("content/button_download_mac_mx.png", :alt => "download mac (mx)", :size => "348x92", "data-purpose" => "mac_mx") script type="text/template" id="client-download-select-others" .download-box .download-others + span Need a different version? + br a.choose-other-platform href="#" data-order="1" data-platform="{{data.platform1}}" - | Need a different version? - br - | Click here for to get JamKazam - br - | for {{data.platformDisplay1}} ' '' \ No newline at end of file + | JamKazam for {{data.platformDisplay1}} + br + a.choose-other-platform href="#" data-order="2" data-platform="{{data.platform2}}" + | JamKazam for {{data.platformDisplay2}} \ No newline at end of file diff --git a/web/app/views/users/_downloads.html.slim b/web/app/views/users/_downloads.html.slim index 934fa1b05..371ea5597 100644 --- a/web/app/views/users/_downloads.html.slim +++ b/web/app/views/users/_downloads.html.slim @@ -12,15 +12,8 @@ .download-content .download-entreaty - p You need the JamKazam application to: - ul - li Play music with others in real time on the JamKazam platform - li Make audio recordings and share them via Facebook or URL - li Make video recordings and share them via YouTube or URL - li Live broadcast your sessions to family, friends, and fans - li Play and control your JamTracks multi-track recordings + p You must use the JamKazam app to get into online sessions with other musicions. Click the button below to download the JamKazam app installer. Then double click the installer to run it. - p.click-to-download Click the button below to download the JamKazam application installer. .downloads-blurb .jamtracks diff --git a/web/config/routes.rb b/web/config/routes.rb index ff2f89a41..48e8b47d7 100644 --- a/web/config/routes.rb +++ b/web/config/routes.rb @@ -25,6 +25,7 @@ Rails.application.routes.draw do get '/congratulations_musician', to: 'users#congratulations_musician', as: :congratulations_musician get '/congratulations_fan', to: 'users#congratulations_fan' get '/downloads', to: 'users#downloads' + get '/downloads-legacy', to: 'users#downloads_legacy' get '/signin', to: 'sessions#signin' post '/signin', to: 'sessions#create' diff --git a/wordpress/plugins/jamkazam/README.txt b/wordpress/plugins/jamkazam/README.txt index da9059944..f96c78cc6 100644 --- a/wordpress/plugins/jamkazam/README.txt +++ b/wordpress/plugins/jamkazam/README.txt @@ -111,4 +111,4 @@ Titles are optional, naturally. Markdown uses email style notation for blockquotes and I've been told: > Asterisks for *emphasis*. Double it up for **strong**. -`` \ No newline at end of file +``