Przeglądaj źródła

Consolidate submenus

jblanked 1 rok temu
rodzic
commit
e148e5adb0

+ 113 - 83
alloc/alloc.c

@@ -1,4 +1,5 @@
 #include <alloc/alloc.h>
+bool went_to_friends = false;
 void auth_headers_alloc(void)
 {
     if (!app_instance)
@@ -296,6 +297,8 @@ bool alloc_text_input(uint32_t view_id)
                 return false;
             }
             break;
+        default:
+            return false;
         }
     }
     return true;
@@ -319,36 +322,6 @@ bool about_widget_alloc(bool is_logged_in)
     }
     return true;
 }
-bool pre_saved_messages_alloc(void)
-{
-    if (!app_instance)
-    {
-        return false;
-    }
-    if (!app_instance->submenu_compose)
-    {
-        if (!easy_flipper_set_submenu(&app_instance->submenu_compose, FlipSocialViewLoggedInCompose, "Create A Post", flip_social_callback_to_submenu_logged_in, &app_instance->view_dispatcher))
-        {
-            return false;
-        }
-        submenu_reset(app_instance->submenu_compose);
-        submenu_add_item(app_instance->submenu_compose, "Add Pre-Save", FlipSocialSubmenuComposeIndexAddPreSave, flip_social_callback_submenu_choices, app_instance);
-
-        // Load the playlist
-        if (load_playlist(&app_instance->pre_saved_messages))
-        {
-            // Update the playlist submenu
-            for (uint32_t i = 0; i < app_instance->pre_saved_messages.count; i++)
-            {
-                if (app_instance->pre_saved_messages.messages[i][0] != '\0') // Check if the string is not empty
-                {
-                    submenu_add_item(app_instance->submenu_compose, app_instance->pre_saved_messages.messages[i], FlipSocialSubemnuComposeIndexStartIndex + i, flip_social_callback_submenu_choices, app_instance);
-                }
-            }
-        }
-    }
-    return true;
-}
 
 bool alloc_submenu(uint32_t view_id)
 {
@@ -369,6 +342,58 @@ bool alloc_submenu(uint32_t view_id)
             submenu_add_item(app_instance->submenu, "About", FlipSocialSubmenuLoggedInIndexAbout, flip_social_callback_submenu_choices, app_instance);
             submenu_add_item(app_instance->submenu, "WiFi", FlipSocialSubmenuLoggedInIndexWifiSettings, flip_social_callback_submenu_choices, app_instance);
             break;
+        case FlipSocialViewLoggedInCompose:
+            if (!easy_flipper_set_submenu(&app_instance->submenu, FlipSocialViewSubmenu, "Create A Post", flip_social_callback_to_submenu_logged_in, &app_instance->view_dispatcher))
+            {
+                return false;
+            }
+            submenu_reset(app_instance->submenu);
+            submenu_add_item(app_instance->submenu, "Add Pre-Save", FlipSocialSubmenuComposeIndexAddPreSave, flip_social_callback_submenu_choices, app_instance);
+
+            // Load the playlist
+            if (load_playlist(&app_instance->pre_saved_messages))
+            {
+                // Update the playlist submenu
+                for (uint32_t i = 0; i < app_instance->pre_saved_messages.count; i++)
+                {
+                    if (app_instance->pre_saved_messages.messages[i][0] != '\0') // Check if the string is not empty
+                    {
+                        submenu_add_item(app_instance->submenu, app_instance->pre_saved_messages.messages[i], FlipSocialSubemnuComposeIndexStartIndex + i, flip_social_callback_submenu_choices, app_instance);
+                    }
+                }
+            }
+            break;
+        case FlipSocialViewLoggedInFriendsSubmenu:
+            if (!easy_flipper_set_submenu(&app_instance->submenu, FlipSocialViewSubmenu, "Friends", flip_social_callback_to_profile_logged_in, &app_instance->view_dispatcher))
+            {
+                FURI_LOG_E(TAG, "Failed to set submenu for friends");
+                return false;
+            }
+            submenu_reset(app_instance->submenu);
+            went_to_friends = true;
+            break;
+        case FlipSocialViewLoggedInMessagesUserChoices:
+            if (!easy_flipper_set_submenu(&app_instance->submenu, FlipSocialViewSubmenu, "Users", flip_social_callback_to_messages_logged_in, &app_instance->view_dispatcher))
+            {
+                FURI_LOG_E(TAG, "Failed to set submenu for user choices");
+                return false;
+            }
+            submenu_reset(app_instance->submenu);
+            break;
+        case FlipSocialViewLoggedInMessagesSubmenu:
+            if (!easy_flipper_set_submenu(&app_instance->submenu, FlipSocialViewSubmenu, "Messages", flip_social_callback_to_submenu_logged_in, &app_instance->view_dispatcher))
+            {
+                return false;
+            }
+            submenu_reset(app_instance->submenu);
+            break;
+        case FlipSocialViewLoggedInExploreSubmenu:
+            if (!easy_flipper_set_submenu(&app_instance->submenu, FlipSocialViewSubmenu, "Explore", flip_social_callback_to_submenu_logged_in, &app_instance->view_dispatcher))
+            {
+                return false;
+            }
+            submenu_reset(app_instance->submenu);
+            break;
         }
     }
     return true;
@@ -380,63 +405,68 @@ bool alloc_variable_item_list(uint32_t view_id)
     {
         return false;
     }
-    switch (view_id)
+    if (!app_instance->variable_item_list)
     {
-    case FlipSocialViewLoggedOutWifiSettings:
-        if (!easy_flipper_set_variable_item_list(&app_instance->variable_item_list, FlipSocialViewVariableItemList, flip_social_text_input_logged_out_wifi_settings_item_selected, flip_social_callback_to_submenu_logged_out, &app_instance->view_dispatcher, app_instance))
-        {
-            return false;
-        }
-        app_instance->variable_item_logged_out_wifi_settings_ssid = variable_item_list_add(app_instance->variable_item_list, "SSID", 1, NULL, app_instance);
-        app_instance->variable_item_logged_out_wifi_settings_password = variable_item_list_add(app_instance->variable_item_list, "Password", 1, NULL, app_instance);
-        if (app_instance->wifi_ssid_logged_out)
-            variable_item_set_current_value_text(app_instance->variable_item_logged_out_wifi_settings_ssid, app_instance->wifi_ssid_logged_out);
-        return true;
-    case FlipSocialViewLoggedOutLogin:
-        if (!easy_flipper_set_variable_item_list(&app_instance->variable_item_list, FlipSocialViewVariableItemList, flip_social_text_input_logged_out_login_item_selected, flip_social_callback_to_submenu_logged_out, &app_instance->view_dispatcher, app_instance))
-        {
-            return false;
-        }
-        app_instance->variable_item_logged_out_login_username = variable_item_list_add(app_instance->variable_item_list, "Username", 1, NULL, app_instance);
-        app_instance->variable_item_logged_out_login_password = variable_item_list_add(app_instance->variable_item_list, "Password", 1, NULL, app_instance);
-        app_instance->variable_item_logged_out_login_button = variable_item_list_add(app_instance->variable_item_list, "Login", 0, NULL, app_instance);
-        if (app_instance->login_username_logged_out)
-            variable_item_set_current_value_text(app_instance->variable_item_logged_out_login_username, app_instance->login_username_logged_out);
-        return true;
-    case FlipSocialViewLoggedOutRegister:
-        if (!easy_flipper_set_variable_item_list(&app_instance->variable_item_list, FlipSocialViewVariableItemList, flip_social_text_input_logged_out_register_item_selected, flip_social_callback_to_submenu_logged_out, &app_instance->view_dispatcher, app_instance))
-        {
-            return false;
-        }
-        app_instance->variable_item_logged_out_register_username = variable_item_list_add(app_instance->variable_item_list, "Username", 1, NULL, app_instance);
-        app_instance->variable_item_logged_out_register_password = variable_item_list_add(app_instance->variable_item_list, "Password", 1, NULL, app_instance);
-        app_instance->variable_item_logged_out_register_password_2 = variable_item_list_add(app_instance->variable_item_list, "Confirm Password", 1, NULL, app_instance);
-        app_instance->variable_item_logged_out_register_button = variable_item_list_add(app_instance->variable_item_list, "Register", 0, NULL, app_instance);
-        return true;
-    case FlipSocialViewLoggedInProfile:
-        if (!easy_flipper_set_variable_item_list(&app_instance->variable_item_list, FlipSocialViewVariableItemList, flip_social_text_input_logged_in_profile_item_selected, flip_social_callback_to_submenu_logged_in, &app_instance->view_dispatcher, app_instance))
-        {
-            return false;
-        }
-        app_instance->variable_item_logged_in_profile_username = variable_item_list_add(app_instance->variable_item_list, "Username", 1, NULL, app_instance);
-        app_instance->variable_item_logged_in_profile_change_password = variable_item_list_add(app_instance->variable_item_list, "Password", 1, NULL, app_instance);
-        app_instance->variable_item_logged_in_profile_change_bio = variable_item_list_add(app_instance->variable_item_list, "Bio", 1, NULL, app_instance);
-        app_instance->variable_item_logged_in_profile_friends = variable_item_list_add(app_instance->variable_item_list, "Friends", 0, NULL, app_instance);
-        if (app_instance->login_username_logged_in)
-            variable_item_set_current_value_text(app_instance->variable_item_logged_in_profile_username, app_instance->login_username_logged_in);
-        if (app_instance->change_bio_logged_in)
-            variable_item_set_current_value_text(app_instance->variable_item_logged_in_profile_change_bio, app_instance->change_bio_logged_in);
-        return true;
-    case FlipSocialViewLoggedInSettingsWifi:
-        if (!easy_flipper_set_variable_item_list(&app_instance->variable_item_list, FlipSocialViewVariableItemList, flip_social_text_input_logged_in_wifi_settings_item_selected, flip_social_callback_to_settings_logged_in, &app_instance->view_dispatcher, app_instance))
+        switch (view_id)
         {
+        case FlipSocialViewLoggedOutWifiSettings:
+            if (!easy_flipper_set_variable_item_list(&app_instance->variable_item_list, FlipSocialViewVariableItemList, flip_social_text_input_logged_out_wifi_settings_item_selected, flip_social_callback_to_submenu_logged_out, &app_instance->view_dispatcher, app_instance))
+            {
+                return false;
+            }
+            app_instance->variable_item_logged_out_wifi_settings_ssid = variable_item_list_add(app_instance->variable_item_list, "SSID", 1, NULL, app_instance);
+            app_instance->variable_item_logged_out_wifi_settings_password = variable_item_list_add(app_instance->variable_item_list, "Password", 1, NULL, app_instance);
+            if (app_instance->wifi_ssid_logged_out)
+                variable_item_set_current_value_text(app_instance->variable_item_logged_out_wifi_settings_ssid, app_instance->wifi_ssid_logged_out);
+            return true;
+        case FlipSocialViewLoggedOutLogin:
+            if (!easy_flipper_set_variable_item_list(&app_instance->variable_item_list, FlipSocialViewVariableItemList, flip_social_text_input_logged_out_login_item_selected, flip_social_callback_to_submenu_logged_out, &app_instance->view_dispatcher, app_instance))
+            {
+                return false;
+            }
+            app_instance->variable_item_logged_out_login_username = variable_item_list_add(app_instance->variable_item_list, "Username", 1, NULL, app_instance);
+            app_instance->variable_item_logged_out_login_password = variable_item_list_add(app_instance->variable_item_list, "Password", 1, NULL, app_instance);
+            app_instance->variable_item_logged_out_login_button = variable_item_list_add(app_instance->variable_item_list, "Login", 0, NULL, app_instance);
+            if (app_instance->login_username_logged_out)
+                variable_item_set_current_value_text(app_instance->variable_item_logged_out_login_username, app_instance->login_username_logged_out);
+            return true;
+        case FlipSocialViewLoggedOutRegister:
+            if (!easy_flipper_set_variable_item_list(&app_instance->variable_item_list, FlipSocialViewVariableItemList, flip_social_text_input_logged_out_register_item_selected, flip_social_callback_to_submenu_logged_out, &app_instance->view_dispatcher, app_instance))
+            {
+                return false;
+            }
+            app_instance->variable_item_logged_out_register_username = variable_item_list_add(app_instance->variable_item_list, "Username", 1, NULL, app_instance);
+            app_instance->variable_item_logged_out_register_password = variable_item_list_add(app_instance->variable_item_list, "Password", 1, NULL, app_instance);
+            app_instance->variable_item_logged_out_register_password_2 = variable_item_list_add(app_instance->variable_item_list, "Confirm Password", 1, NULL, app_instance);
+            app_instance->variable_item_logged_out_register_button = variable_item_list_add(app_instance->variable_item_list, "Register", 0, NULL, app_instance);
+            return true;
+        case FlipSocialViewLoggedInProfile:
+            if (!easy_flipper_set_variable_item_list(&app_instance->variable_item_list, FlipSocialViewVariableItemList, flip_social_text_input_logged_in_profile_item_selected, flip_social_callback_to_submenu_logged_in, &app_instance->view_dispatcher, app_instance))
+            {
+                return false;
+            }
+            app_instance->variable_item_logged_in_profile_username = variable_item_list_add(app_instance->variable_item_list, "Username", 1, NULL, app_instance);
+            app_instance->variable_item_logged_in_profile_change_password = variable_item_list_add(app_instance->variable_item_list, "Password", 1, NULL, app_instance);
+            app_instance->variable_item_logged_in_profile_change_bio = variable_item_list_add(app_instance->variable_item_list, "Bio", 1, NULL, app_instance);
+            app_instance->variable_item_logged_in_profile_friends = variable_item_list_add(app_instance->variable_item_list, "Friends", 0, NULL, app_instance);
+            if (app_instance->login_username_logged_in)
+                variable_item_set_current_value_text(app_instance->variable_item_logged_in_profile_username, app_instance->login_username_logged_in);
+            if (app_instance->change_bio_logged_in)
+                variable_item_set_current_value_text(app_instance->variable_item_logged_in_profile_change_bio, app_instance->change_bio_logged_in);
+            return true;
+        case FlipSocialViewLoggedInSettingsWifi:
+            if (!easy_flipper_set_variable_item_list(&app_instance->variable_item_list, FlipSocialViewVariableItemList, flip_social_text_input_logged_in_wifi_settings_item_selected, flip_social_callback_to_settings_logged_in, &app_instance->view_dispatcher, app_instance))
+            {
+                return false;
+            }
+            app_instance->variable_item_logged_in_wifi_settings_ssid = variable_item_list_add(app_instance->variable_item_list, "SSID", 1, NULL, app_instance);
+            app_instance->variable_item_logged_in_wifi_settings_password = variable_item_list_add(app_instance->variable_item_list, "Password", 1, NULL, app_instance);
+            if (app_instance->wifi_ssid_logged_in)
+                variable_item_set_current_value_text(app_instance->variable_item_logged_in_wifi_settings_ssid, app_instance->wifi_ssid_logged_in);
+            return true;
+        default:
             return false;
         }
-        app_instance->variable_item_logged_in_wifi_settings_ssid = variable_item_list_add(app_instance->variable_item_list, "SSID", 1, NULL, app_instance);
-        app_instance->variable_item_logged_in_wifi_settings_password = variable_item_list_add(app_instance->variable_item_list, "Password", 1, NULL, app_instance);
-        if (app_instance->wifi_ssid_logged_in)
-            variable_item_set_current_value_text(app_instance->variable_item_logged_in_wifi_settings_ssid, app_instance->wifi_ssid_logged_in);
-        return true;
     }
     return false;
 }

+ 2 - 2
alloc/alloc.h

@@ -8,6 +8,6 @@ bool messages_dialog_alloc(bool free_first);
 bool feed_dialog_alloc();
 bool alloc_text_input(uint32_t view_id);
 bool about_widget_alloc(bool is_logged_in);
-bool pre_saved_messages_alloc(void);
 bool alloc_variable_item_list(uint32_t view_id);
-bool alloc_submenu(uint32_t view_id);
+bool alloc_submenu(uint32_t view_id);
+extern bool went_to_friends;

+ 0 - 5
alloc/flip_social_alloc.c

@@ -201,11 +201,6 @@ FlipSocialApp *flip_social_app_alloc()
         return NULL;
     }
 
-    if (!easy_flipper_set_submenu(&app->submenu_messages_user_choices, FlipSocialViewLoggedInMessagesUserChoices, "Users", flip_social_callback_to_messages_logged_in, &app->view_dispatcher))
-    {
-        return NULL;
-    }
-
     submenu_add_item(app->submenu_logged_out, "Login", FlipSocialSubmenuLoggedOutIndexLogin, flip_social_callback_submenu_choices, app);
     submenu_add_item(app->submenu_logged_out, "Register", FlipSocialSubmenuLoggedOutIndexRegister, flip_social_callback_submenu_choices, app);
     submenu_add_item(app->submenu_logged_out, "About", FlipSocialSubmenuLoggedOutIndexAbout, flip_social_callback_submenu_choices, app);

+ 16 - 22
alloc/free.c

@@ -1,23 +1,33 @@
 #include <alloc/free.h>
 void free_all(bool should_free_variable_item_list, bool should_free_submenu)
 {
+
+    if (should_free_submenu)
+    {
+        flip_social_free_explore();
+        free_submenu();
+    }
+    if (should_free_variable_item_list)
+    {
+        free_variable_item_list();
+    }
     free_text_input();
     flip_social_free_friends();
     flip_social_free_messages();
-    flip_social_free_explore();
     flip_social_free_feed_dialog();
     flip_social_free_compose_dialog();
     flip_social_free_explore_dialog();
     flip_social_free_friends_dialog();
     flip_social_free_messages_dialog();
     flip_feed_info_free();
-    free_pre_saved_messages();
     free_about_widget(true);
     free_about_widget(false);
-    if (should_free_variable_item_list)
-        free_variable_item_list();
-    if (should_free_submenu)
-        free_submenu();
+
+    if (went_to_friends)
+    {
+        flipper_http_deinit();
+        went_to_friends = false;
+    }
 }
 void free_text_input()
 {
@@ -91,16 +101,6 @@ void free_about_widget(bool is_logged_in)
     }
 }
 
-void free_pre_saved_messages(void)
-{
-    if (app_instance->submenu_compose)
-    {
-        submenu_free(app_instance->submenu_compose);
-        app_instance->submenu_compose = NULL;
-        view_dispatcher_remove_view(app_instance->view_dispatcher, FlipSocialViewLoggedInCompose);
-    }
-}
-
 void flip_social_free_friends(void)
 {
     if (!flip_social_friends)
@@ -109,12 +109,6 @@ void flip_social_free_friends(void)
     }
     free(flip_social_friends);
     flip_social_friends = NULL;
-    if (app_instance->submenu_friends)
-    {
-        submenu_free(app_instance->submenu_friends);
-        app_instance->submenu_friends = NULL;
-        view_dispatcher_remove_view(app_instance->view_dispatcher, FlipSocialViewLoggedInFriendsSubmenu);
-    }
 }
 
 void flip_feed_info_free(void)

+ 72 - 106
callback/flip_social_callback.c

@@ -317,7 +317,7 @@ uint32_t flip_social_callback_to_settings_logged_in(void *context)
 uint32_t flip_social_callback_to_compose_logged_in(void *context)
 {
     UNUSED(context);
-    return FlipSocialViewLoggedInCompose;
+    return FlipSocialViewSubmenu;
 }
 
 /**
@@ -334,7 +334,7 @@ uint32_t flip_social_callback_to_profile_logged_in(void *context)
 /**
  * @brief Navigation callback to bring the user back to the Explore submenu
  * @param context The context - unused
- * @return next view id (FlipSocialViewLoggedInExploreSubmenu)
+ * @return next view id (FlipSocialViewSubmenu)
  */
 uint32_t flip_social_callback_to_explore_logged_in(void *context)
 {
@@ -345,7 +345,7 @@ uint32_t flip_social_callback_to_explore_logged_in(void *context)
     {
         flip_social_explore->index = 0;
     }
-    return FlipSocialViewLoggedInExploreSubmenu;
+    return FlipSocialViewSubmenu;
 }
 
 /**
@@ -359,7 +359,7 @@ uint32_t flip_social_callback_to_friends_logged_in(void *context)
     flip_social_dialog_stop = false;
     flip_social_dialog_shown = false;
     flip_social_friends->index = 0;
-    return FlipSocialViewLoggedInFriendsSubmenu;
+    return FlipSocialViewSubmenu;
 }
 
 /**
@@ -370,7 +370,7 @@ uint32_t flip_social_callback_to_friends_logged_in(void *context)
 uint32_t flip_social_callback_to_messages_logged_in(void *context)
 {
     UNUSED(context);
-    return FlipSocialViewLoggedInMessagesSubmenu;
+    return FlipSocialViewSubmenu;
 }
 
 /**
@@ -381,7 +381,7 @@ uint32_t flip_social_callback_to_messages_logged_in(void *context)
 uint32_t flip_social_callback_to_messages_user_choices(void *context)
 {
     UNUSED(context);
-    return FlipSocialViewLoggedInMessagesUserChoices;
+    return FlipSocialViewSubmenu;
 }
 
 /**
@@ -410,7 +410,7 @@ static void explore_dialog_callback(DialogExResult result, void *context)
             snprintf(remove_payload, sizeof(remove_payload), "{\"username\":\"%s\",\"friend\":\"%s\"}", app_instance->login_username_logged_in, flip_social_explore->usernames[flip_social_explore->index]);
             auth_headers_alloc();
             flipper_http_post_request_with_headers("https://www.flipsocial.net/api/user/remove-friend/", auth_headers, remove_payload);
-            view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedInExploreSubmenu);
+            view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewSubmenu);
             flip_social_free_explore_dialog();
             furi_delay_ms(1000);
             flipper_http_deinit();
@@ -425,7 +425,7 @@ static void explore_dialog_callback(DialogExResult result, void *context)
             snprintf(add_payload, sizeof(add_payload), "{\"username\":\"%s\",\"friend\":\"%s\"}", app_instance->login_username_logged_in, flip_social_explore->usernames[flip_social_explore->index]);
             auth_headers_alloc();
             flipper_http_post_request_with_headers("https://www.flipsocial.net/api/user/add-friend/", auth_headers, add_payload);
-            view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedInExploreSubmenu);
+            view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewSubmenu);
             flip_social_free_explore_dialog();
             furi_delay_ms(1000);
             flipper_http_deinit();
@@ -445,7 +445,7 @@ static void friends_dialog_callback(DialogExResult result, void *context)
             snprintf(remove_payload, sizeof(remove_payload), "{\"username\":\"%s\",\"friend\":\"%s\"}", app_instance->login_username_logged_in, flip_social_friends->usernames[flip_social_friends->index]);
             auth_headers_alloc();
             flipper_http_post_request_with_headers("https://www.flipsocial.net/api/user/remove-friend/", auth_headers, remove_payload);
-            view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedInFriendsSubmenu);
+            view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewSubmenu);
             flip_social_free_friends_dialog();
             furi_delay_ms(1000);
             flipper_http_deinit();
@@ -536,12 +536,12 @@ static void compose_dialog_callback(DialogExResult result, void *context)
         app_instance->pre_saved_messages.count--;
 
         // Reset and rebuild the submenu
-        submenu_reset(app_instance->submenu_compose);
-        submenu_add_item(app_instance->submenu_compose, "Add Pre-Save", FlipSocialSubmenuComposeIndexAddPreSave, flip_social_callback_submenu_choices, app);
+        submenu_reset(app_instance->submenu);
+        submenu_add_item(app_instance->submenu, "Add Pre-Save", FlipSocialSubmenuComposeIndexAddPreSave, flip_social_callback_submenu_choices, app);
 
         for (size_t i = 0; i < app_instance->pre_saved_messages.count; i++)
         {
-            submenu_add_item(app_instance->submenu_compose,
+            submenu_add_item(app_instance->submenu,
                              app_instance->pre_saved_messages.messages[i],
                              FlipSocialSubemnuComposeIndexStartIndex + i,
                              flip_social_callback_submenu_choices,
@@ -552,7 +552,7 @@ static void compose_dialog_callback(DialogExResult result, void *context)
         save_playlist(&app_instance->pre_saved_messages);
 
         // Switch back to the compose view
-        view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedInCompose);
+        view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewSubmenu);
 
         // Free the dialog resources
         flip_social_free_compose_dialog();
@@ -846,12 +846,17 @@ void flip_social_callback_submenu_choices(void *context, uint32_t index)
         break;
     case FlipSocialSubmenuLoggedInIndexMessages:
         free_all(true, true);
+        if (!alloc_submenu(FlipSocialViewLoggedInMessagesSubmenu))
+        {
+            FURI_LOG_E(TAG, "Failed to allocate submenu");
+            return;
+        }
         flipper_http_loading_task(
-            flip_social_get_message_users,         // get the message users
-            flip_social_parse_json_message_users,  // parse the message users
-            FlipSocialViewLoggedInMessagesSubmenu, // switch to the messages submenu if successful
-            FlipSocialViewLoggedInSubmenu,         // switch back to the main submenu if failed
-            &app->view_dispatcher);                // view dispatcher
+            flip_social_get_message_users,        // get the message users
+            flip_social_parse_json_message_users, // parse the message users
+            FlipSocialViewSubmenu,                // switch to the messages submenu if successful
+            FlipSocialViewLoggedInSubmenu,        // switch back to the main submenu if failed
+            &app->view_dispatcher);               // view dispatcher
         break;
     case FlipSocialSubmenuLoggedInIndexMessagesNewMessage:
         // they need to search for the user to send a message
@@ -882,12 +887,12 @@ void flip_social_callback_submenu_choices(void *context, uint32_t index)
         break;
     case FlipSocialSubmenuLoggedInIndexCompose:
         free_all(true, true);
-        if (!pre_saved_messages_alloc())
+        if (!alloc_submenu(FlipSocialViewLoggedInCompose))
         {
-            FURI_LOG_E(TAG, "Failed to allocate pre-saved messages");
+            FURI_LOG_E(TAG, "Failed to allocate submenu");
             return;
         }
-        view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedInCompose);
+        view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewSubmenu);
         break;
     case FlipSocialSubmenuLoggedInIndexSettings:
         free_all(true, true);
@@ -1112,7 +1117,7 @@ void flip_social_callback_submenu_choices(void *context, uint32_t index)
             {
                 FURI_LOG_E(TAG, "Failed to allocate text input");
                 return;
-            }
+            } // switch to the text input view
             view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewTextInput);
         }
         else
@@ -1489,7 +1494,6 @@ void flip_social_text_input_logged_out_register_item_selected(void *context, uin
     switch (index)
     {
     case 0: // Input Username
-        // view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedOutRegisterUsernameInput);
         free_all(false, true);
         if (!alloc_text_input(FlipSocialViewLoggedOutRegisterUsernameInput))
         {
@@ -1499,7 +1503,6 @@ void flip_social_text_input_logged_out_register_item_selected(void *context, uin
         view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewTextInput);
         break;
     case 1: // Input Password
-        // view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedOutRegisterPasswordInput);
         free_all(false, true);
         if (!alloc_text_input(FlipSocialViewLoggedOutRegisterPasswordInput))
         {
@@ -1509,7 +1512,6 @@ void flip_social_text_input_logged_out_register_item_selected(void *context, uin
         view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewTextInput);
         break;
     case 2: // Input Password 2
-        // view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedOutRegisterPassword2Input);
         free_all(false, true);
         if (!alloc_text_input(FlipSocialViewLoggedOutRegisterPassword2Input))
         {
@@ -1693,7 +1695,7 @@ void flip_social_logged_in_compose_pre_save_updated(void *context)
     if (app->compose_pre_save_logged_in_temp_buffer_size == 0 || app->pre_saved_messages.count >= MAX_PRE_SAVED_MESSAGES)
     {
         FURI_LOG_E(TAG, "Message is empty or would exceed the maximum number of pre-saved messages");
-        view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedInCompose);
+        view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewSubmenu);
         return;
     }
 
@@ -1710,9 +1712,9 @@ void flip_social_logged_in_compose_pre_save_updated(void *context)
     app->pre_saved_messages.count++;
 
     // Rebuild the submenu
-    submenu_reset(app->submenu_compose);
+    submenu_reset(app->submenu);
     submenu_add_item(
-        app->submenu_compose,
+        app->submenu,
         "Add Pre-Save",
         FlipSocialSubmenuComposeIndexAddPreSave,
         flip_social_callback_submenu_choices,
@@ -1721,7 +1723,7 @@ void flip_social_logged_in_compose_pre_save_updated(void *context)
     for (size_t i = 0; i < app->pre_saved_messages.count; i++)
     {
         submenu_add_item(
-            app->submenu_compose,
+            app->submenu,
             app->pre_saved_messages.messages[i],
             FlipSocialSubemnuComposeIndexStartIndex + i,
             flip_social_callback_submenu_choices,
@@ -1732,7 +1734,7 @@ void flip_social_logged_in_compose_pre_save_updated(void *context)
     save_playlist(&app->pre_saved_messages);
 
     // Switch back to the compose view
-    view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedInCompose);
+    view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewSubmenu);
 }
 
 /**
@@ -1830,36 +1832,6 @@ void flip_social_logged_in_profile_change_bio_updated(void *context)
     easy_flipper_dialog("Success", "Bio updated successfully\n\n\nPress BACK to return :D");
 }
 
-static bool flip_social_fetch_friends(DataLoaderModel *model)
-{
-    UNUSED(model);
-    if (!flip_social_get_friends())
-    {
-        FURI_LOG_E(TAG, "Failed to get friends");
-        return false;
-    }
-    return true;
-}
-static char *flip_social_parse_friends(DataLoaderModel *model)
-{
-    UNUSED(model);
-    if (!flip_social_parse_json_friends())
-    {
-        FURI_LOG_E(TAG, "Failed to parse friends");
-        flipper_http_deinit(); // deinit the HTTP
-        return "Failed to parse friends";
-    }
-    view_dispatcher_switch_to_view(app_instance->view_dispatcher, FlipSocialViewLoggedInFriendsSubmenu);
-    flipper_http_deinit(); // deinit the HTTP
-    // for some reason the user sometimes sees the message below instead of the friends list
-    // so we return an error message to restart the Flipper
-    return "[ERROR] Restart your Flipper.";
-}
-static void flip_social_friends_switch_to_view(FlipSocialApp *app)
-{
-    flip_social_generic_switch_to_view(app, "Friends", flip_social_fetch_friends, flip_social_parse_friends, 1, flip_social_callback_to_profile_logged_in, FlipSocialViewLoader);
-}
-
 /**
  * @brief Callback when a user selects a menu item in the profile (logged in) screen.
  * @param context The context - FlipSocialApp object.
@@ -1901,20 +1873,22 @@ void flip_social_text_input_logged_in_profile_item_selected(void *context, uint3
         break;
     case 3: // Friends
         free_all(false, true);
-        if (!app->submenu_friends)
+        if (!alloc_submenu(FlipSocialViewLoggedInFriendsSubmenu))
         {
-            if (!easy_flipper_set_submenu(&app->submenu_friends, FlipSocialViewLoggedInFriendsSubmenu, "Friends", flip_social_callback_to_profile_logged_in, &app->view_dispatcher))
-            {
-                FURI_LOG_DEV(TAG, "Failed to set submenu for friends");
-                return;
-            }
+            FURI_LOG_E(TAG, "Failed to allocate submenu for friends");
+            return;
         }
         if (!flipper_http_init(flipper_http_rx_callback, app))
         {
             FURI_LOG_E(TAG, "Failed to initialize FlipperHTTP");
             return;
         }
-        flip_social_friends_switch_to_view(app);
+        flipper_http_loading_task(
+            flip_social_get_friends,
+            flip_social_parse_json_friends,
+            FlipSocialViewSubmenu,
+            FlipSocialViewVariableItemList,
+            &app->view_dispatcher);
         break;
     default:
         FURI_LOG_E(TAG, "Unknown configuration item index");
@@ -1940,7 +1914,7 @@ void flip_social_logged_in_messages_user_choice_message_updated(void *context)
     if (app->message_user_choice_logged_in_temp_buffer_size == 0)
     {
         FURI_LOG_E(TAG, "Message is empty");
-        view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedInMessagesNewMessageUserChoicesInput);
+        view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewTextInput);
         return;
     }
 
@@ -1962,24 +1936,12 @@ void flip_social_logged_in_messages_user_choice_message_updated(void *context)
     snprintf(url, sizeof(url), "https://www.flipsocial.net/api/messages/%s/post/", app->login_username_logged_in);
     snprintf(payload, sizeof(payload), "{\"receiver\":\"%s\",\"content\":\"%s\"}", flip_social_explore->usernames[flip_social_explore->index], app->message_user_choice_logged_in);
 
-    if (flipper_http_post_request_with_headers(url, auth_headers, payload)) // start the async request
-    {
-        furi_timer_start(fhttp.get_timeout_timer, TIMEOUT_DURATION_TICKS);
-        fhttp.state = RECEIVING;
-    }
-    else
+    if (!flipper_http_post_request_with_headers(url, auth_headers, payload)) // start the async request
     {
         FURI_LOG_E(TAG, "Failed to send post request to send message");
         FURI_LOG_E(TAG, "Make sure the Flipper is connected to the Wifi Dev Board");
-        fhttp.state = ISSUE;
-        return;
-    }
-    while (fhttp.state == RECEIVING && furi_timer_is_running(fhttp.get_timeout_timer) > 0)
-    {
-        // Wait for the request to be received
-        furi_delay_ms(100);
     }
-    furi_timer_stop(fhttp.get_timeout_timer);
+    furi_delay_ms(1000);
     flipper_http_deinit();
     // add user to the top of the list if not already there
     for (int i = 0; i < flip_social_message_users->count; i++)
@@ -2005,7 +1967,7 @@ void flip_social_logged_in_messages_user_choice_message_updated(void *context)
 
     // redraw submenu
     flip_social_update_messages_submenu();
-    view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedInMessagesSubmenu);
+    view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewSubmenu);
 }
 
 /**
@@ -2047,27 +2009,14 @@ void flip_social_logged_in_messages_new_message_updated(void *context)
     char payload[256];
     snprintf(url, sizeof(url), "https://www.flipsocial.net/api/messages/%s/post/", app->login_username_logged_in);
     snprintf(payload, sizeof(payload), "{\"receiver\":\"%s\",\"content\":\"%s\"}", flip_social_message_users->usernames[flip_social_message_users->index], app->messages_new_message_logged_in);
-
-    if (flipper_http_post_request_with_headers(url, auth_headers, payload)) // start the async request
-    {
-        furi_timer_start(fhttp.get_timeout_timer, TIMEOUT_DURATION_TICKS);
-        fhttp.state = RECEIVING;
-    }
-    else
+    if (!flipper_http_post_request_with_headers(url, auth_headers, payload))
     {
         FURI_LOG_E(TAG, "Failed to send post request to send message");
         FURI_LOG_E(TAG, "Make sure the Flipper is connected to the Wifi Dev Board");
-        fhttp.state = ISSUE;
-        return;
-    }
-    while (fhttp.state == RECEIVING && furi_timer_is_running(fhttp.get_timeout_timer) > 0)
-    {
-        // Wait for the request to be received
-        furi_delay_ms(10);
     }
-    furi_timer_stop(fhttp.get_timeout_timer);
+    furi_delay_ms(1000);
     flipper_http_deinit();
-    view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewLoggedInMessagesSubmenu);
+    view_dispatcher_switch_to_view(app->view_dispatcher, FlipSocialViewSubmenu);
 }
 
 void flip_social_logged_in_explore_updated(void *context)
@@ -2093,14 +2042,22 @@ void flip_social_logged_in_explore_updated(void *context)
 
     // Ensure null-termination
     app->explore_logged_in[app->explore_logged_in_temp_buffer_size - 1] = '\0';
+    free_submenu();
+
+    if (!alloc_submenu(FlipSocialViewLoggedInExploreSubmenu))
+    {
+        FURI_LOG_E(TAG, "Failed to allocate submenu for explore");
+        return;
+    }
 
     flipper_http_loading_task(
-        flip_social_get_explore,              // get the explore users
-        flip_social_parse_json_explore,       // parse the explore users
-        FlipSocialViewLoggedInExploreSubmenu, // switch to the explore submenu if successful
-        FlipSocialViewLoggedInSubmenu,        // switch back to the main submenu if failed
-        &app->view_dispatcher);               // view dispatcher
+        flip_social_get_explore,        // get the explore users
+        flip_social_parse_json_explore, // parse the explore users
+        FlipSocialViewSubmenu,          // switch to the explore submenu if successful
+        FlipSocialViewLoggedInSubmenu,  // switch back to the main submenu if failed
+        &app->view_dispatcher);         // view dispatcher
 }
+
 void flip_social_logged_in_message_users_updated(void *context)
 {
     FlipSocialApp *app = (FlipSocialApp *)context;
@@ -2111,7 +2068,7 @@ void flip_social_logged_in_message_users_updated(void *context)
     }
 
     // check if the message is empty
-    if (app->message_users_logged_in_temp_buffer_size == 0)
+    if (!app->message_users_logged_in_temp_buffer || app->message_users_logged_in_temp_buffer_size == 0)
     {
         FURI_LOG_E(TAG, "Message is empty");
         strncpy(app->message_users_logged_in, "a", 2);
@@ -2125,10 +2082,19 @@ void flip_social_logged_in_message_users_updated(void *context)
     // Ensure null-termination
     app->message_users_logged_in[app->message_users_logged_in_temp_buffer_size - 1] = '\0';
 
+    free_submenu();
+
+    if (!alloc_submenu(FlipSocialViewLoggedInExploreSubmenu))
+    {
+        FURI_LOG_E(TAG, "Failed to allocate submenu for explore");
+        return;
+    }
+
+    // get users
     flipper_http_loading_task(
         flip_social_get_explore_2,                   // get the explore users
         flip_social_parse_json_message_user_choices, // parse the explore users
-        FlipSocialViewLoggedInMessagesUserChoices,   // switch to the user choices if successful
+        FlipSocialViewSubmenu,                       // switch to the explore submenu if successful
         FlipSocialViewLoggedInSubmenu,               // switch back to the main submenu if failed
         &app->view_dispatcher);                      // view dispatcher
 }

+ 26 - 40
explore/flip_social_explore.c

@@ -2,19 +2,6 @@
 
 FlipSocialModel *flip_social_explore_alloc(void)
 {
-    if (!app_instance)
-    {
-        return NULL;
-    }
-
-    if (!app_instance->submenu_explore)
-    {
-        if (!easy_flipper_set_submenu(&app_instance->submenu_explore, FlipSocialViewLoggedInExploreSubmenu, "Explore", flip_social_callback_to_submenu_logged_in, &app_instance->view_dispatcher))
-        {
-            return NULL;
-        }
-    }
-
     // Allocate memory for each username only if not already allocated
     FlipSocialModel *explore = malloc(sizeof(FlipSocialModel));
     if (explore == NULL)
@@ -27,22 +14,11 @@ FlipSocialModel *flip_social_explore_alloc(void)
 
 void flip_social_free_explore(void)
 {
-    if (!app_instance)
-    {
-        return;
-    }
-    if (app_instance->submenu_explore)
-    {
-        submenu_free(app_instance->submenu_explore);
-        app_instance->submenu_explore = NULL;
-        view_dispatcher_remove_view(app_instance->view_dispatcher, FlipSocialViewLoggedInExploreSubmenu);
-    }
-    if (!flip_social_explore)
+    if (flip_social_explore)
     {
-        return;
+        free(flip_social_explore);
+        flip_social_explore = NULL;
     }
-    free(flip_social_explore);
-    flip_social_explore = NULL;
 }
 
 // for now we're just listing the current users
@@ -54,11 +30,17 @@ bool flip_social_get_explore(void)
         FURI_LOG_E(TAG, "Failed to initialize FlipperHTTP");
         return false;
     }
+    char directory[128];
+    snprintf(directory, sizeof(directory), STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/explore");
+
+    // Create the directory
+    Storage *storage = furi_record_open(RECORD_STORAGE);
+    storage_common_mkdir(storage, directory);
     char *keyword = !app_instance->explore_logged_in || strlen(app_instance->explore_logged_in) == 0 ? "a" : app_instance->explore_logged_in;
     snprintf(
         fhttp.file_path,
         sizeof(fhttp.file_path),
-        STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/%s.json",
+        STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/explore/%s.json",
         keyword);
 
     fhttp.save_received_data = true;
@@ -76,30 +58,33 @@ bool flip_social_get_explore(void)
 }
 bool flip_social_get_explore_2(void)
 {
+    if (!app_instance)
+    {
+        return false;
+    }
     if (!flipper_http_init(flipper_http_rx_callback, app_instance))
     {
         FURI_LOG_E(TAG, "Failed to initialize FlipperHTTP");
         return false;
     }
+    char directory[128];
+    snprintf(directory, sizeof(directory), STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/explore");
+
+    // Create the directory
+    Storage *storage = furi_record_open(RECORD_STORAGE);
+    storage_common_mkdir(storage, directory);
     char *keyword = !app_instance->message_users_logged_in || strlen(app_instance->message_users_logged_in) == 0 ? "a" : app_instance->message_users_logged_in;
     snprintf(
         fhttp.file_path,
         sizeof(fhttp.file_path),
-        STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/%s.json",
+        STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/explore/%s.json",
         keyword);
 
     fhttp.save_received_data = true;
     auth_headers_alloc();
     char url[256];
     snprintf(url, sizeof(url), "https://www.flipsocial.net/api/user/explore/%s/%d/", keyword, MAX_EXPLORE_USERS);
-    if (!flipper_http_get_request_with_headers(url, auth_headers))
-    {
-        FURI_LOG_E(TAG, "Failed to send HTTP request for explore");
-        fhttp.state = ISSUE;
-        return false;
-    }
-    fhttp.state = RECEIVING;
-    return true;
+    return flipper_http_get_request_with_headers(url, auth_headers);
 }
 
 bool flip_social_parse_json_explore()
@@ -109,6 +94,7 @@ bool flip_social_parse_json_explore()
     if (user_data == NULL)
     {
         FURI_LOG_E(TAG, "Failed to load received data from file.");
+        flipper_http_deinit();
         return false;
     }
 
@@ -127,8 +113,8 @@ bool flip_social_parse_json_explore()
     flip_social_explore->count = 0;
 
     // set submenu
-    submenu_reset(app_instance->submenu_explore);
-    submenu_set_header(app_instance->submenu_explore, "Explore");
+    submenu_reset(app_instance->submenu);
+    submenu_set_header(app_instance->submenu, "Explore");
     // Parse the JSON array of usernames
     for (size_t i = 0; i < MAX_EXPLORE_USERS; i++)
     {
@@ -138,7 +124,7 @@ bool flip_social_parse_json_explore()
             break;
         }
         snprintf(flip_social_explore->usernames[i], MAX_USER_LENGTH, "%s", furi_string_get_cstr(username));
-        submenu_add_item(app_instance->submenu_explore, flip_social_explore->usernames[i], FlipSocialSubmenuExploreIndexStartIndex + i, flip_social_callback_submenu_choices, app_instance);
+        submenu_add_item(app_instance->submenu, flip_social_explore->usernames[i], FlipSocialSubmenuExploreIndexStartIndex + i, flip_social_callback_submenu_choices, app_instance);
         flip_social_explore->count++;
         furi_string_free(username);
     }

+ 1 - 0
feed/flip_social_feed.c

@@ -44,6 +44,7 @@ FlipSocialFeedMini *flip_social_parse_json_feed()
     if (feed_data == NULL)
     {
         FURI_LOG_E(TAG, "Failed to load received data from file.");
+        flipper_http_deinit();
         return NULL;
     }
     flipper_http_deinit();

+ 0 - 5
flip_social.c

@@ -52,11 +52,6 @@ void flip_social_app_free(FlipSocialApp *app)
         submenu_free(app->submenu_logged_in);
     }
     //
-    if (app->submenu_messages_user_choices)
-    {
-        view_dispatcher_remove_view(app->view_dispatcher, FlipSocialViewLoggedInMessagesUserChoices);
-        submenu_free(app->submenu_messages_user_choices);
-    }
 
     // Free Widget(s)
     if (app->widget_result)

+ 3 - 9
flip_social.h

@@ -174,15 +174,9 @@ typedef struct
     View *view_loader;
     Widget *widget_result;
     //
-    ViewDispatcher *view_dispatcher;        // Switches between our views
-    Submenu *submenu_logged_out;            // The application submenu (logged out)
-    Submenu *submenu_logged_in;             // The application submenu (logged in)
-    Submenu *submenu_compose;               // The application submenu (compose)
-    Submenu *submenu_explore;               // The application submenu (explore)
-    Submenu *submenu_friends;               // The application submenu (friends)
-    Submenu *submenu_messages;              // The application submenu (messages)
-    Submenu *submenu_messages_user_choices; // The application submenu (messages user choices)
-    Submenu *submenu_logged_in_settings;    // The application submenu (settings)
+    ViewDispatcher *view_dispatcher; // Switches between our views
+    Submenu *submenu_logged_out;     // The application submenu (logged out)
+    Submenu *submenu_logged_in;      // The application submenu (logged in)
     //
     Submenu *submenu;
     //

+ 1 - 1
flipper_http/flipper_http.c

@@ -1591,5 +1591,5 @@ void flipper_http_loading_task_2(bool (*http_request)(void),
     // Switch to the success view
     view_dispatcher_switch_to_view(*view_dispatcher, success_view_id);
     view_dispatcher_remove_view(*view_dispatcher, loading_view_id);
-    loading_free(loading);
+    // loading_free(loading);
 }

+ 10 - 8
friends/flip_social_friends.c

@@ -43,7 +43,7 @@ bool flip_social_get_friends()
 
 bool flip_social_update_friends()
 {
-    if (!app_instance->submenu_friends)
+    if (!app_instance->submenu)
     {
         FURI_LOG_E(TAG, "Friends submenu is NULL");
         return false;
@@ -54,11 +54,11 @@ bool flip_social_update_friends()
         return false;
     }
     // Add submenu items for the users
-    submenu_reset(app_instance->submenu_friends);
-    submenu_set_header(app_instance->submenu_friends, "Friends");
+    submenu_reset(app_instance->submenu);
+    submenu_set_header(app_instance->submenu, "Friends");
     for (int i = 0; i < flip_social_friends->count; i++)
     {
-        submenu_add_item(app_instance->submenu_friends, flip_social_friends->usernames[i], FlipSocialSubmenuLoggedInIndexFriendsStart + i, flip_social_callback_submenu_choices, app_instance);
+        submenu_add_item(app_instance->submenu, flip_social_friends->usernames[i], FlipSocialSubmenuLoggedInIndexFriendsStart + i, flip_social_callback_submenu_choices, app_instance);
     }
     return true;
 }
@@ -70,10 +70,11 @@ bool flip_social_parse_json_friends()
     if (friend_data == NULL)
     {
         FURI_LOG_E(TAG, "Failed to load received data from file.");
+        flipper_http_deinit();
         return false;
     }
 
-    // Allocate memory for each username only if not already allocated
+    //  Allocate memory for each username only if not already allocated
     flip_social_friends = flip_social_friends_alloc();
     if (flip_social_friends == NULL)
     {
@@ -86,8 +87,8 @@ bool flip_social_parse_json_friends()
     flip_social_friends->count = 0;
 
     // Reset the friends submenu
-    submenu_reset(app_instance->submenu_friends);
-    submenu_set_header(app_instance->submenu_friends, "Friends");
+    submenu_reset(app_instance->submenu);
+    submenu_set_header(app_instance->submenu, "Friends");
 
     // Extract the users array from the JSON
     for (int i = 0; i < MAX_FRIENDS; i++)
@@ -100,10 +101,11 @@ bool flip_social_parse_json_friends()
             break;
         }
         snprintf(flip_social_friends->usernames[i], MAX_USER_LENGTH, "%s", furi_string_get_cstr(friend));
-        submenu_add_item(app_instance->submenu_friends, flip_social_friends->usernames[i], FlipSocialSubmenuLoggedInIndexFriendsStart + i, flip_social_callback_submenu_choices, app_instance);
+        submenu_add_item(app_instance->submenu, flip_social_friends->usernames[i], FlipSocialSubmenuLoggedInIndexFriendsStart + i, flip_social_callback_submenu_choices, app_instance);
         flip_social_friends->count++;
         furi_string_free(friend);
     }
     furi_string_free(friend_data);
+    // flipper_http_deinit();
     return true;
 }

+ 55 - 128
messages/flip_social_messages.c

@@ -2,13 +2,6 @@
 
 FlipSocialModel2 *flip_social_messages_alloc()
 {
-    if (!app_instance->submenu_messages)
-    {
-        if (!easy_flipper_set_submenu(&app_instance->submenu_messages, FlipSocialViewLoggedInMessagesSubmenu, "Messages", flip_social_callback_to_submenu_logged_in, &app_instance->view_dispatcher))
-        {
-            return NULL;
-        }
-    }
     // Allocate memory for each username only if not already allocated
     FlipSocialModel2 *users = malloc(sizeof(FlipSocialModel2));
     if (users == NULL)
@@ -43,12 +36,6 @@ void flip_social_free_message_users()
 
 void flip_social_free_messages()
 {
-    if (app_instance->submenu_messages)
-    {
-        submenu_free(app_instance->submenu_messages);
-        app_instance->submenu_messages = NULL;
-        view_dispatcher_remove_view(app_instance->view_dispatcher, FlipSocialViewLoggedInMessagesSubmenu);
-    }
     if (flip_social_messages == NULL)
     {
         return;
@@ -59,7 +46,12 @@ void flip_social_free_messages()
 
 bool flip_social_update_messages_submenu()
 {
-    if (app_instance->submenu_messages == NULL)
+    if (!app_instance)
+    {
+        FURI_LOG_E(TAG, "App instance is NULL");
+        return false;
+    }
+    if (app_instance->submenu == NULL)
     {
         FURI_LOG_E(TAG, "Submenu is NULL");
         return false;
@@ -69,19 +61,24 @@ bool flip_social_update_messages_submenu()
         FURI_LOG_E(TAG, "Message users model is NULL");
         return false;
     }
-    submenu_reset(app_instance->submenu_messages);
-    submenu_set_header(app_instance->submenu_messages, "Messages");
-    submenu_add_item(app_instance->submenu_messages, "[New Message]", FlipSocialSubmenuLoggedInIndexMessagesNewMessage, flip_social_callback_submenu_choices, app_instance);
+    submenu_reset(app_instance->submenu);
+    submenu_set_header(app_instance->submenu, "Messages");
+    submenu_add_item(app_instance->submenu, "[New Message]", FlipSocialSubmenuLoggedInIndexMessagesNewMessage, flip_social_callback_submenu_choices, app_instance);
     for (int i = 0; i < flip_social_message_users->count; i++)
     {
-        submenu_add_item(app_instance->submenu_messages, flip_social_message_users->usernames[i], FlipSocialSubmenuLoggedInIndexMessagesUsersStart + i, flip_social_callback_submenu_choices, app_instance);
+        submenu_add_item(app_instance->submenu, flip_social_message_users->usernames[i], FlipSocialSubmenuLoggedInIndexMessagesUsersStart + i, flip_social_callback_submenu_choices, app_instance);
     }
     return true;
 }
 
 bool flip_social_update_submenu_user_choices()
 {
-    if (app_instance->submenu_messages_user_choices == NULL)
+    if (app_instance == NULL)
+    {
+        FURI_LOG_E(TAG, "App instance is NULL");
+        return false;
+    }
+    if (app_instance->submenu == NULL)
     {
         FURI_LOG_E(TAG, "Submenu is NULL");
         return false;
@@ -91,11 +88,11 @@ bool flip_social_update_submenu_user_choices()
         FURI_LOG_E(TAG, "Explore model is NULL");
         return false;
     }
-    submenu_reset(app_instance->submenu_messages_user_choices);
-    submenu_set_header(app_instance->submenu_messages_user_choices, "Users");
+    submenu_reset(app_instance->submenu);
+    submenu_set_header(app_instance->submenu, "Users");
     for (int i = 0; i < flip_social_explore->count; i++)
     {
-        submenu_add_item(app_instance->submenu_messages_user_choices, flip_social_explore->usernames[i], FlipSocialSubmenuLoggedInIndexMessagesUserChoicesIndexStart + i, flip_social_callback_submenu_choices, app_instance);
+        submenu_add_item(app_instance->submenu, flip_social_explore->usernames[i], FlipSocialSubmenuLoggedInIndexMessagesUserChoicesIndexStart + i, flip_social_callback_submenu_choices, app_instance);
     }
     return true;
 }
@@ -113,11 +110,17 @@ bool flip_social_get_message_users()
         FURI_LOG_E(TAG, "Failed to initialize FlipperHTTP");
         return false;
     }
+    char directory[128];
+    snprintf(directory, sizeof(directory), STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/messages");
+
+    // Create the directory
+    Storage *storage = furi_record_open(RECORD_STORAGE);
+    storage_common_mkdir(storage, directory);
     char command[128];
     snprintf(
         fhttp.file_path,
         sizeof(fhttp.file_path),
-        STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/message_users.json");
+        STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/messages/message_users.json");
 
     fhttp.save_received_data = true;
     auth_headers_alloc();
@@ -126,6 +129,7 @@ bool flip_social_get_message_users()
     {
         FURI_LOG_E(TAG, "Failed to send HTTP request for messages");
         fhttp.state = ISSUE;
+        flipper_http_deinit();
         return false;
     }
     fhttp.state = RECEIVING;
@@ -150,11 +154,18 @@ bool flip_social_get_messages_with_user()
         FURI_LOG_E(TAG, "Username is NULL");
         return false;
     }
+    char directory[128];
+    snprintf(directory, sizeof(directory), STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/messages");
+
+    // Create the directory
+    Storage *storage = furi_record_open(RECORD_STORAGE);
+    storage_common_mkdir(storage, directory);
+
     char command[256];
     snprintf(
         fhttp.file_path,
         sizeof(fhttp.file_path),
-        STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/%s_messages.json",
+        STORAGE_EXT_PATH_PREFIX "/apps_data/flip_social/messages/%s_messages.json",
         flip_social_message_users->usernames[flip_social_message_users->index]);
 
     fhttp.save_received_data = true;
@@ -178,16 +189,10 @@ bool flip_social_parse_json_message_users()
     if (message_data == NULL)
     {
         FURI_LOG_E(TAG, "Failed to load received data from file.");
+        flipper_http_deinit();
         return false;
     }
     flipper_http_deinit();
-    char *data_cstr = (char *)furi_string_get_cstr(message_data);
-    if (data_cstr == NULL)
-    {
-        FURI_LOG_E(TAG, "Failed to get C-string from FuriString.");
-        furi_string_free(message_data);
-        return false;
-    }
 
     // Allocate memory for each username only if not already allocated
     flip_social_message_users = flip_social_messages_alloc();
@@ -195,65 +200,29 @@ bool flip_social_parse_json_message_users()
     {
         FURI_LOG_E(TAG, "Failed to allocate memory for message users.");
         furi_string_free(message_data);
-        free(data_cstr);
         return false;
     }
 
     // Initialize message users count
     flip_social_message_users->count = 0;
 
-    // Extract the users array from the JSON
-    char *json_users = get_json_value("users", data_cstr);
-    if (json_users == NULL)
+    for (int i = 0; i < MAX_MESSAGE_USERS; i++)
     {
-        FURI_LOG_E(TAG, "Failed to parse users array.");
-        furi_string_free(message_data);
-        free(data_cstr);
-        return false;
-    }
-
-    // Manual tokenization for comma-separated values
-    char *start = json_users + 1; // Skip the opening bracket
-    char *end;
-    while ((end = strchr(start, ',')) != NULL && flip_social_message_users->count < MAX_MESSAGE_USERS)
-    {
-        *end = '\0'; // Null-terminate the current token
-
-        // Remove quotes
-        if (*start == '"')
-            start++;
-        if (*(end - 1) == '"')
-            *(end - 1) = '\0';
-
-        // Copy username to pre-allocated memory
-        snprintf(flip_social_message_users->usernames[flip_social_message_users->count], MAX_USER_LENGTH, "%s", start);
-        flip_social_message_users->count++;
-        start = end + 1;
-    }
-
-    // Handle the last token
-    if (*start != '\0' && flip_social_message_users->count < MAX_MESSAGE_USERS)
-    {
-        if (*start == '"')
-            start++;
-        if (*(start + strlen(start) - 1) == ']')
-            *(start + strlen(start) - 1) = '\0';
-        if (*(start + strlen(start) - 1) == '"')
-            *(start + strlen(start) - 1) = '\0';
-
-        snprintf(flip_social_message_users->usernames[flip_social_message_users->count], MAX_USER_LENGTH, "%s", start);
+        FuriString *user = get_json_array_value_furi("users", i, message_data);
+        if (user == NULL)
+        {
+            break;
+        }
+        snprintf(flip_social_message_users->usernames[i], MAX_USER_LENGTH, "%s", furi_string_get_cstr(user));
         flip_social_message_users->count++;
+        furi_string_free(user);
     }
 
     // Add submenu items for the users
     flip_social_update_messages_submenu();
 
     // Free the JSON data
-    free(json_users);
-    free(start);
-    free(end);
     furi_string_free(message_data);
-    free(data_cstr);
     return true;
 }
 
@@ -265,85 +234,42 @@ bool flip_social_parse_json_message_user_choices()
     if (user_data == NULL)
     {
         FURI_LOG_E(TAG, "Failed to load received data from file.");
+        flipper_http_deinit();
         return false;
     }
 
     flipper_http_deinit();
 
-    char *data_cstr = (char *)furi_string_get_cstr(user_data);
-    if (data_cstr == NULL)
-    {
-        FURI_LOG_E(TAG, "Failed to get C-string from FuriString.");
-        furi_string_free(user_data);
-        return false;
-    }
-
     // Allocate memory for each username only if not already allocated
     flip_social_explore = flip_social_explore_alloc();
     if (flip_social_explore == NULL)
     {
         FURI_LOG_E(TAG, "Failed to allocate memory for explore usernames.");
         furi_string_free(user_data);
-        free(data_cstr);
         return false;
     }
 
     // Initialize explore count
     flip_social_explore->count = 0;
 
-    // Extract the users array from the JSON
-    char *json_users = get_json_value("users", data_cstr);
-    if (json_users == NULL)
-    {
-        FURI_LOG_E(TAG, "Failed to parse users array.");
-        furi_string_free(user_data);
-        free(data_cstr);
-        return false;
-    }
-
-    // Manual tokenization for comma-separated values
-    char *start = json_users + 1; // Skip the opening bracket
-    char *end;
-    while ((end = strchr(start, ',')) != NULL && flip_social_explore->count < MAX_EXPLORE_USERS)
+    for (int i = 0; i < MAX_MESSAGE_USERS; i++)
     {
-        *end = '\0'; // Null-terminate the current token
-
-        // Remove quotes
-        if (*start == '"')
-            start++;
-        if (*(end - 1) == '"')
-            *(end - 1) = '\0';
-
-        // Copy username to pre-allocated memory
-        snprintf(flip_social_explore->usernames[flip_social_explore->count], MAX_USER_LENGTH, "%s", start);
-        flip_social_explore->count++;
-        start = end + 1;
-    }
-
-    // Handle the last token
-    if (*start != '\0' && flip_social_explore->count < MAX_EXPLORE_USERS)
-    {
-        if (*start == '"')
-            start++;
-        if (*(start + strlen(start) - 1) == ']')
-            *(start + strlen(start) - 1) = '\0';
-        if (*(start + strlen(start) - 1) == '"')
-            *(start + strlen(start) - 1) = '\0';
-
-        snprintf(flip_social_explore->usernames[flip_social_explore->count], MAX_USER_LENGTH, "%s", start);
+        FuriString *user = get_json_array_value_furi("users", i, user_data);
+        if (user == NULL)
+        {
+            break;
+        }
+        snprintf(flip_social_explore->usernames[i], MAX_USER_LENGTH, "%s", furi_string_get_cstr(user));
         flip_social_explore->count++;
+        furi_string_free(user);
     }
 
     // Add submenu items for the users
     flip_social_update_submenu_user_choices();
 
     // Free the JSON data
-    free(json_users);
-    free(start);
-    free(end);
     furi_string_free(user_data);
-    free(data_cstr);
-    return true;
+    return flip_social_explore->count > 0;
 }
 
 // parse messages between the logged in user and the selected user
@@ -354,6 +280,7 @@ bool flip_social_parse_json_messages()
     if (message_data == NULL)
     {
         FURI_LOG_E(TAG, "Failed to load received data from file.");
+        flipper_http_deinit();
         return false;
     }
     flipper_http_deinit();