Skip to content

Switch to using turbo streams for settings #306

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 67 additions & 26 deletions app/controllers/users_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,29 +20,15 @@ def edit
end

def update
# Handle timezone leaderboard toggle
# Handle setting toggles
if params[:toggle_timezone_leaderboard] == "1"
if Flipper.enabled?(:timezone_leaderboard, @user)
Flipper.disable(:timezone_leaderboard, @user)
message = "Regional & Timezone Leaderboards disabled"
else
Flipper.enable(:timezone_leaderboard, @user)
message = "Regional & Timezone Leaderboards enabled"
end

respond_to do |format|
format.turbo_stream do
render turbo_stream: turbo_stream.replace(
"timezone_leaderboard_toggle",
partial: "timezone_leaderboard_toggle",
locals: { user: @user }
)
end
format.html do
redirect_to is_own_settings? ? my_settings_path : settings_user_path(@user),
notice: message
end
end
handle_timezone_leaderboard_toggle
return
elsif params[:toggle_public_stats] == "1"
handle_public_stats_toggle
return
elsif params[:toggle_slack_status] == "1"
handle_slack_status_toggle
return
end

Expand All @@ -52,11 +38,32 @@ def update
if @user.uses_slack_status?
@user.update_slack_status
end
redirect_to is_own_settings? ? my_settings_path : settings_user_path(@user),
notice: "Settings updated successfully"

respond_to do |format|
format.turbo_stream do
if params[:user][:hackatime_extension_text_type].present?
render turbo_stream: turbo_stream.replace(
"extension_settings",
partial: "extension_settings",
locals: { user: @user }
)
else
head :ok
end
end
format.html do
redirect_to is_own_settings? ? my_settings_path : settings_user_path(@user),
notice: "Settings updated successfully"
end
end
else
flash[:error] = "Failed to update settings"
render :settings, status: :unprocessable_entity
respond_to do |format|
format.turbo_stream { head :unprocessable_entity }
format.html do
flash[:error] = "Failed to update settings"
render :edit, status: :unprocessable_entity
end
end
end
else
redirect_to is_own_settings? ? my_settings_path : settings_user_path(@user),
Expand Down Expand Up @@ -105,6 +112,40 @@ def update_trust_level

private

def handle_timezone_leaderboard_toggle
if Flipper.enabled?(:timezone_leaderboard, @user)
Flipper.disable(:timezone_leaderboard, @user)
else
Flipper.enable(:timezone_leaderboard, @user)
end

render_setting_toggle("timezone_leaderboard")
end

def handle_public_stats_toggle
@user.update!(allow_public_stats_lookup: [email protected]_public_stats_lookup?)
render_setting_toggle("privacy_settings")
end

def handle_slack_status_toggle
@user.update!(uses_slack_status: [email protected]_slack_status?)
@user.update_slack_status if @user.uses_slack_status?
render_setting_toggle("slack_status")
end

def render_setting_toggle(partial_name)
respond_to do |format|
format.turbo_stream do
render turbo_stream: turbo_stream.replace(
"#{partial_name}_toggle",
partial: "#{partial_name}_toggle",
locals: { user: @user }
)
end
format.html { redirect_to is_own_settings? ? my_settings_path : settings_user_path(@user) }
end
end

def require_admin
unless current_user.admin?
redirect_to root_path, alert: "You are not authorized to access this page"
Expand Down
13 changes: 13 additions & 0 deletions app/views/users/_extension_settings.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<div id="extension_settings">
<%= form_with model: user,
url: (@is_own_settings ? my_settings_path : settings_user_path(user)),
method: :patch, local: false do |f| %>
<div class="form-group">
<%= f.label "Simple text" %>
<%= f.select :hackatime_extension_text_type,
User.hackatime_extension_text_types.keys.map { |type| [type.humanize, type] },
{ selected: user.hackatime_extension_text_type },
{ class: "form-select", onchange: "this.form.submit()" } %>
</div>
<% end %>
</div>
12 changes: 12 additions & 0 deletions app/views/users/_privacy_settings_toggle.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<div id="privacy_settings_toggle">
<p>
<strong>Public Stats API Access</strong><br>
<small>Allow others to look up your public coding stats via the API</small>
</p>
<%= form_with url: (@is_own_settings ? my_settings_path : settings_user_path(user)), method: :patch, local: false do |f| %>
<%= hidden_field_tag :toggle_public_stats, "1" %>
<%= f.submit user.allow_public_stats_lookup? ? "Disable API Access" : "Enable API Access",
role: "button",
class: user.allow_public_stats_lookup? ? "secondary" : "" %>
<% end %>
</div>
12 changes: 12 additions & 0 deletions app/views/users/_slack_status_toggle.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<div id="slack_status_toggle">
<p>
<strong>Slack Status Updates</strong><br>
<small>Update my Slack status with my current project</small>
</p>
<%= form_with url: (@is_own_settings ? my_settings_path : settings_user_path(user)), method: :patch, local: false do |f| %>
<%= hidden_field_tag :toggle_slack_status, "1" %>
<%= f.submit user.uses_slack_status? ? "Disable Status Updates" : "Enable Status Updates",
role: "button",
class: user.uses_slack_status? ? "secondary" : "" %>
<% end %>
</div>
36 changes: 3 additions & 33 deletions app/views/users/edit.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -49,17 +49,7 @@
<% unless @can_enable_slack_status %>
<%= link_to "Re-authorize with Slack to give permission to update your status", slack_auth_path, role: "button", class: "secondary" %>
<% end %>
<%= form_with model: @user,
url: @is_own_settings ? my_settings_path : settings_user_path(@user),
method: :patch do |f| %>
<fieldset>
<label>
<%= f.check_box :uses_slack_status, id: "user_uses_slack_status" %>
<%= f.label :uses_slack_status, "Update my Slack status with my current project" %>
</label>
</fieldset>
<%= f.submit "Save Settings", role: "button" %>
<% end %>
<%= render "slack_status_toggle", user: @user %>
</section>

<section>
Expand Down Expand Up @@ -145,17 +135,7 @@
<header>
<h2 id="user_hackatime_extension">⚙️ Extension Settings</h2>
</header>
<%= form_with model: @user,
url: @is_own_settings ? my_settings_path : settings_user_path(@user),
method: :patch do |f| %>
<div class="form-group">
<%= f.label "Simple text" %>
<%= f.select :hackatime_extension_text_type,
User.hackatime_extension_text_types.keys.map { |type| [type.humanize, type] },
selected: @user.hackatime_extension_text_type, class: "form-select" %>
</div>
<%= f.submit "Save Settings", role: "button" %>
<% end %>
<%= render "extension_settings", user: @user %>
</article>

<article>
Expand Down Expand Up @@ -255,17 +235,7 @@
<h2 id="user_privacy">🔒 Privacy Settings</h2>
</header>

<%= form_with model: @user,
url: @is_own_settings ? my_settings_path : settings_user_path(@user),
method: :patch do |f| %>
<fieldset>
<label for="user_allow_public_stats_lookup">
<%= f.check_box :allow_public_stats_lookup, id: "user_allow_public_stats_lookup" %>
<%= f.label :allow_public_stats_lookup, "Allow others to look up my public coding stats via the API" %>
</label>
</fieldset>
<%= f.submit "Save Settings", role: "button" %>
<% end %>
<%= render "privacy_settings_toggle", user: @user %>
</article>

<article>
Expand Down