diff --git a/README.md b/README.md index 3f3835d561..ceb7b9fa5f 100644 --- a/README.md +++ b/README.md @@ -140,16 +140,21 @@ _Requires creating a free account._ - Node.js >= 20 (CI tested: 20 - 22) - A JavaScript package manager (npm, yarn, pnpm, or bun) -# Support +# 🆘 Get Help & Support -- [Click to join **React + Rails Slack**](https://join.slack.com/t/reactrails/shared_invite/zt-38oicm9d0-OO0V~bdg4aYNuZuUbRFSXg). +**Need immediate help?** Here are your options, ordered by response time: -- [**Subscribe**](https://app.mailerlite.com/webforms/landing/l1d9x5) for announcements of new releases of React on Rails and of our latest [blog articles](https://blog.shakacode.com) and tutorials. -- [Discussions](https://github.com/shakacode/react_on_rails/discussions): Post your questions regarding React on Rails -- **[forum.shakacode.com](https://forum.shakacode.com)**: Other discussions -- **[@railsonmaui on Twitter](https://twitter.com/railsonmaui)** -- _See [NEWS.md](https://github.com/shakacode/react_on_rails/tree/master/NEWS.md) for more notes over time._ -- See [Projects](https://github.com/shakacode/react_on_rails/tree/master/PROJECTS.md) using and [KUDOS](https://github.com/shakacode/react_on_rails/tree/master/KUDOS.md) for React on Rails. Please submit yours! Please edit either page or [email us](mailto:contact@shakacode.com) and we'll add your info. We also **love stars** as it helps us attract new users and contributors. +- 🚀 **Professional Support**: [react_on_rails@shakacode.com](mailto:react_on_rails@shakacode.com) - Fastest resolution for bugs, upgrades, and consulting +- 💬 **React + Rails Slack**: [Join our community](https://invite.reactrails.com) - Chat with other developers +- 🆓 **GitHub Issues**: [Report bugs](https://github.com/shakacode/react_on_rails/issues) - Community support +- 📖 **Discussions**: [Ask questions](https://github.com/shakacode/react_on_rails/discussions) - General help + +**Additional Resources:** + +- [**Subscribe**](https://app.mailerlite.com/webforms/landing/l1d9x5) for announcements of new releases and tutorials +- **[forum.shakacode.com](https://forum.shakacode.com)** - Development discussions +- **[@railsonmaui on Twitter](https://twitter.com/railsonmaui)** - Updates and tips +- [Projects using React on Rails](https://github.com/shakacode/react_on_rails/tree/master/PROJECTS.md) - Submit yours! ## Contributing @@ -163,6 +168,8 @@ ShakaCode is **[hiring passionate software engineers](http://www.shakacode.com/c The gem is available as open source under the terms of the [MIT License](https://github.com/shakacode/react_on_rails/tree/master/LICENSE.md). +Note, some features are available only with a React on Rails Pro subscription. See [React on Rails Pro](https://www.shakacode.com/react-on-rails-pro/) for more information. + # Supporters The following companies support our open-source projects, and ShakaCode uses their products! diff --git a/lib/react_on_rails/json_parse_error.rb b/lib/react_on_rails/json_parse_error.rb index dbdf9fa8ca..5902e02afe 100644 --- a/lib/react_on_rails/json_parse_error.rb +++ b/lib/react_on_rails/json_parse_error.rb @@ -7,7 +7,12 @@ class JsonParseError < ::ReactOnRails::Error def initialize(parse_error:, json:) @json = json @original_error = parse_error - super(parse_error.message) + message = <<~MSG + #{parse_error.message} + + #{Utils.default_troubleshooting_section} + MSG + super(message) end def to_honeybadger_context diff --git a/lib/react_on_rails/prerender_error.rb b/lib/react_on_rails/prerender_error.rb index 096fae6db6..5014923adc 100644 --- a/lib/react_on_rails/prerender_error.rb +++ b/lib/react_on_rails/prerender_error.rb @@ -83,6 +83,10 @@ def calc_message(component_name, console_messages, err, js_code, props) MSG end + + # Add help and support information + message << "\n#{Utils.default_troubleshooting_section}\n" + [backtrace, message] end end diff --git a/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb b/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb index bc7a7b8130..8c4fd1863c 100644 --- a/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +++ b/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb @@ -77,6 +77,7 @@ def exec_server_render_js(js_code, render_options, js_evaluator = nil) if err.message.include?("ReferenceError: self is not defined") msg << "\nError indicates that you may have code-splitting incorrectly enabled.\n" end + msg << "\n#{Utils.default_troubleshooting_section}\n" raise ReactOnRails::Error, msg, err.backtrace end @@ -122,7 +123,7 @@ def read_bundle_js_code rescue StandardError => e msg = "You specified server rendering JS file: #{server_js_file}, but it cannot be " \ "read. You may set the server_bundle_js_file in your configuration to be \"\" to " \ - "avoid this warning.\nError is: #{e}" + "avoid this warning.\nError is: #{e}\n\n#{Utils.default_troubleshooting_section}" raise ReactOnRails::Error, msg end @@ -149,7 +150,8 @@ def create_js_context msg = "ERROR when compiling base_js_code! " \ "See file #{file_name} to " \ "correlate line numbers of error. Error is\n\n#{e.message}" \ - "\n\n#{e.backtrace.join("\n")}" + "\n\n#{e.backtrace.join("\n")}" \ + "\n\n#{Utils.default_troubleshooting_section}" Rails.logger.error(msg) trace_js_code_used("Error when compiling JavaScript code for the context.", base_js_code, file_name, force: true) @@ -227,7 +229,7 @@ def file_url_to_string(url) encoding_type = match[:encoding] response.body.force_encoding(encoding_type) rescue StandardError => e - msg = "file_url_to_string #{url} failed\nError is: #{e}" + msg = "file_url_to_string #{url} failed\nError is: #{e}\n\n#{Utils.default_troubleshooting_section}" raise ReactOnRails::Error, msg end diff --git a/lib/react_on_rails/utils.rb b/lib/react_on_rails/utils.rb index 3243ab473d..c5fc87787d 100644 --- a/lib/react_on_rails/utils.rb +++ b/lib/react_on_rails/utils.rb @@ -57,6 +57,8 @@ def self.invoke_and_exit_if_failed(cmd, failure_message) MSG puts wrap_message(msg) + puts "" + puts default_troubleshooting_section # Rspec catches exit without! in the exit callbacks exit!(1) @@ -278,5 +280,15 @@ def self.prepend_to_file_if_text_not_present(file:, text_to_prepend:, regex:) puts "Prepended\n#{text_to_prepend}to #{file}." end + + def self.default_troubleshooting_section + <<~DEFAULT + 📞 Get Help & Support: + • 🚀 Professional Support: react_on_rails@shakacode.com (fastest resolution) + • 💬 React + Rails Slack: https://invite.reactrails.com + • 🆓 GitHub Issues: https://github.com/shakacode/react_on_rails/issues + • 📖 Discussions: https://github.com/shakacode/react_on_rails/discussions + DEFAULT + end end end diff --git a/lib/tasks/generate_packs.rake b/lib/tasks/generate_packs.rake index 355abb5565..555e72f5d8 100644 --- a/lib/tasks/generate_packs.rake +++ b/lib/tasks/generate_packs.rake @@ -123,6 +123,24 @@ namespace :react_on_rails do puts Rainbow("=" * 80).red end + def show_help_and_support + puts "" + troubleshooting_content = ReactOnRails::Utils.default_troubleshooting_section + # Display the troubleshooting content with color formatting + troubleshooting_content.split("\n").each do |line| + case line + when /^📞/ + puts Rainbow(line).magenta.bold + when /^\s*•\s*🚀/ + puts Rainbow(line).yellow + when /^\s*•/ + puts Rainbow(line).cyan + else + puts Rainbow(line).white unless line.strip.empty? + end + end + end + # rubocop:disable Metrics/AbcSize def handle_standard_error(error) puts "" @@ -142,11 +160,7 @@ namespace :react_on_rails do puts Rainbow(" 2. Check Rails logs: tail -f log/development.log").white puts Rainbow(" 3. Verify all dependencies are installed: bundle install && npm install").white puts Rainbow(" 4. Clear cache: rm -rf tmp/cache").white - puts "" - puts Rainbow("📞 GET HELP:").magenta.bold - puts Rainbow(" • Create an issue: https://github.com/shakacode/react_on_rails/issues").cyan - puts Rainbow(" • Community discussions: https://github.com/shakacode/react_on_rails/discussions").cyan - puts Rainbow(" • Professional support: https://www.shakacode.com/react-on-rails-pro").cyan + show_help_and_support puts Rainbow("=" * 80).red end # rubocop:enable Metrics/AbcSize