From e876d6e926d9a4f2ee53a06db2573fccc95ac5ee Mon Sep 17 00:00:00 2001 From: Jeff Casimir Date: Sat, 31 Jan 2026 13:45:07 -0700 Subject: [PATCH] Add navigation preference methods to auth store - Add updateMe() API method for PATCH requests to /me/ - Add getNavOrder() to retrieve saved navigation order - Add setNavOrder() to persist navigation order changes - Add updateUserPreferences() with optimistic updates and rollback Co-Authored-By: Claude Opus 4.5 --- frontend/src/api.js | 13 +++++++++++++ frontend/src/store/auth.jsx | 38 +++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/frontend/src/api.js b/frontend/src/api.js index 35233204..369336e8 100644 --- a/frontend/src/api.js +++ b/frontend/src/api.js @@ -2899,6 +2899,19 @@ export default class API { return await request(`${host}/api/accounts/users/me/`); } + static async updateMe(data) { + try { + const response = await request(`${host}/api/accounts/users/me/`, { + method: 'PATCH', + body: data, + }); + return response; + } catch (e) { + errorNotification('Failed to update user preferences', e); + throw e; + } + } + static async getUsers() { try { const response = await request(`${host}/api/accounts/users/`); diff --git a/frontend/src/store/auth.jsx b/frontend/src/store/auth.jsx index fb002db7..4486fae8 100644 --- a/frontend/src/store/auth.jsx +++ b/frontend/src/store/auth.jsx @@ -30,12 +30,50 @@ const useAuthStore = create((set, get) => ({ username: '', email: '', user_level: '', + custom_properties: {}, }, isLoading: false, error: null, setUser: (user) => set({ user }), + updateUserPreferences: async (preferences) => { + const currentUser = get().user; + const updatedCustomProperties = { + ...currentUser.custom_properties, + ...preferences, + }; + + // Optimistic update + set({ + user: { + ...currentUser, + custom_properties: updatedCustomProperties, + }, + }); + + try { + const response = await API.updateMe({ + custom_properties: updatedCustomProperties, + }); + set({ user: response }); + return response; + } catch (error) { + // Revert on failure + set({ user: currentUser }); + throw error; + } + }, + + getNavOrder: () => { + const user = get().user; + return user?.custom_properties?.navOrder || null; + }, + + setNavOrder: async (navOrder) => { + return await get().updateUserPreferences({ navOrder }); + }, + initData: async () => { // Prevent multiple simultaneous initData calls if (get().isInitializing || get().isInitialized) {