class ReactOnRails::PrerenderError
def build_troubleshooting_suggestions(component_name, err, console_messages)
def build_troubleshooting_suggestions(component_name, err, console_messages) suggestions = [] # Check for common error patterns if err&.message&.include?("window is not defined") || console_messages&.include?("window is not defined") suggestions << <<~SUGGESTION 1. Browser API used on server - wrap with client-side check: #{Rainbow("if (typeof window !== 'undefined') { ... }").cyan} SUGGESTION end if err&.message&.include?("document is not defined") || console_messages&.include?("document is not defined") suggestions << <<~SUGGESTION 1. DOM API used on server - use React refs or useEffect: #{Rainbow('useEffect(() => { /* DOM operations here */ }, [])').cyan} SUGGESTION end if err&.message&.include?("Cannot read") || err&.message&.include?("undefined") suggestions << <<~SUGGESTION 1. Check for null/undefined values in props 2. Add default props or use optional chaining: #{Rainbow("props.data?.value || 'default'").cyan} SUGGESTION end if err&.message&.include?("Hydration") || console_messages&.include?("Hydration") suggestions << <<~SUGGESTION 1. Server and client render mismatch - ensure consistent: - Random values (use seed from props) - Date/time values (pass from server) - User agent checks (avoid or use props) SUGGESTION end # Generic suggestions suggestions << <<~SUGGESTION • Temporarily disable SSR to isolate the issue: #{Rainbow('prerender: false').cyan} in your view helper • Check server logs for detailed errors: #{Rainbow('tail -f log/development.log').cyan} • Verify component registration: #{Rainbow("ReactOnRails.register({ #{component_name}: #{component_name} })").cyan} • Ensure server bundle is up to date: #{Rainbow('bin/shakapacker').cyan} or #{Rainbow('yarn run build:server').cyan} SUGGESTION suggestions.join("\n") # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity end