flip_social_draw.h 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809
  1. #ifndef FLIP_SOCIAL_DRAW_H
  2. #define FLIP_SOCIAL_DRAW_H
  3. bool flip_social_sent_login_request = false;
  4. bool flip_social_sent_register_request = false;
  5. bool flip_social_login_success = false;
  6. bool flip_social_register_success = false;
  7. bool flip_social_dialog_shown = false;
  8. bool flip_social_dialog_stop = false;
  9. char *last_explore_response = "";
  10. static void flip_social_update_friends();
  11. bool flip_social_board_is_active(Canvas *canvas)
  12. {
  13. if (fhttp.state == INACTIVE)
  14. {
  15. canvas_draw_str(canvas, 0, 7, "Wifi Dev Board disconnected.");
  16. canvas_draw_str(canvas, 0, 17, "Please connect to the board.");
  17. canvas_draw_str(canvas, 0, 32, "If your board is connected,");
  18. canvas_draw_str(canvas, 0, 42, "make sure you have flashed");
  19. canvas_draw_str(canvas, 0, 52, "your WiFi Devboard with the");
  20. canvas_draw_str(canvas, 0, 62, "latest FlipperHTTP flash.");
  21. return false;
  22. }
  23. return true;
  24. }
  25. void flip_social_handle_error(Canvas *canvas)
  26. {
  27. if (fhttp.received_data != NULL)
  28. {
  29. if (strstr(fhttp.received_data, "[ERROR] Not connected to Wifi. Failed to reconnect.") != NULL)
  30. {
  31. canvas_clear(canvas);
  32. canvas_draw_str(canvas, 0, 10, "[ERROR] Not connected to Wifi.");
  33. canvas_draw_str(canvas, 0, 50, "Update your WiFi settings.");
  34. canvas_draw_str(canvas, 0, 60, "Press BACK to return.");
  35. }
  36. else if (strstr(fhttp.received_data, "[ERROR] Failed to connect to Wifi.") != NULL)
  37. {
  38. canvas_clear(canvas);
  39. canvas_draw_str(canvas, 0, 10, "[ERROR] Not connected to Wifi.");
  40. canvas_draw_str(canvas, 0, 50, "Update your WiFi settings.");
  41. canvas_draw_str(canvas, 0, 60, "Press BACK to return.");
  42. }
  43. else
  44. {
  45. canvas_draw_str(canvas, 0, 42, "Failed...");
  46. canvas_draw_str(canvas, 0, 52, "Update your credentials.");
  47. canvas_draw_str(canvas, 0, 62, "Press BACK to return.");
  48. }
  49. }
  50. else
  51. {
  52. canvas_draw_str(canvas, 0, 42, "Failed...");
  53. canvas_draw_str(canvas, 0, 52, "Update your credentials.");
  54. canvas_draw_str(canvas, 0, 62, "Press BACK to return.");
  55. }
  56. }
  57. static void on_input(const void *event, void *ctx)
  58. {
  59. UNUSED(ctx);
  60. InputKey key = ((InputEvent *)event)->key;
  61. InputType type = ((InputEvent *)event)->type;
  62. if (type != InputTypeRelease)
  63. {
  64. return;
  65. }
  66. switch (key)
  67. {
  68. case InputKeyOk:
  69. action = ActionFlip;
  70. break;
  71. case InputKeyBack:
  72. action = ActionBack;
  73. break;
  74. case InputKeyRight:
  75. action = ActionNext;
  76. break;
  77. case InputKeyLeft:
  78. action = ActionPrev;
  79. break;
  80. case InputKeyUp:
  81. action = ActionPrev;
  82. break;
  83. case InputKeyDown:
  84. action = ActionNext;
  85. break;
  86. default:
  87. action = ActionNone;
  88. break;
  89. }
  90. }
  91. // Function to draw the message on the canvas with word wrapping
  92. void draw_user_message(Canvas *canvas, const char *user_message, int x)
  93. {
  94. if (user_message == NULL)
  95. {
  96. FURI_LOG_E(TAG, "User message is NULL.");
  97. return;
  98. }
  99. size_t msg_length = strlen(user_message);
  100. size_t start = 0;
  101. int line_num = 0;
  102. char line[MAX_LINE_LENGTH + 1]; // Buffer for the current line (+1 for null terminator)
  103. while (start < msg_length && line_num < 4)
  104. {
  105. size_t remaining = msg_length - start;
  106. size_t len = (remaining > MAX_LINE_LENGTH) ? MAX_LINE_LENGTH : remaining;
  107. if (remaining > MAX_LINE_LENGTH)
  108. {
  109. // Find the last space within the first 'len' characters
  110. size_t last_space = len;
  111. while (last_space > 0 && user_message[start + last_space - 1] != ' ')
  112. {
  113. last_space--;
  114. }
  115. if (last_space > 0)
  116. {
  117. len = last_space; // Adjust len to the position of the last space
  118. }
  119. }
  120. // Copy the substring to 'line' and null-terminate it
  121. memcpy(line, user_message + start, len);
  122. line[len] = '\0'; // Ensure the string is null-terminated
  123. // Draw the string on the canvas
  124. // Adjust the y-coordinate based on the line number
  125. canvas_draw_str_aligned(canvas, 0, x + line_num * 10, AlignLeft, AlignTop, line);
  126. // Update the start position for the next line
  127. start += len;
  128. // Skip any spaces to avoid leading spaces on the next line
  129. while (start < msg_length && user_message[start] == ' ')
  130. {
  131. start++;
  132. }
  133. // Increment the line number
  134. line_num++;
  135. }
  136. }
  137. static void flip_social_callback_draw_compose(Canvas *canvas, void *model)
  138. {
  139. UNUSED(model);
  140. if (!canvas)
  141. {
  142. FURI_LOG_E(TAG, "Canvas is NULL");
  143. return;
  144. }
  145. if (!app_instance)
  146. {
  147. FURI_LOG_E(TAG, "FlipSocialApp is NULL");
  148. return;
  149. }
  150. char *message = app_instance->pre_saved_messages.messages[flip_social_feed.index];
  151. if (!flip_social_dialog_shown)
  152. {
  153. flip_social_dialog_shown = true;
  154. app_instance->input_event_queue = furi_record_open(RECORD_INPUT_EVENTS);
  155. app_instance->input_event = furi_pubsub_subscribe(app_instance->input_event_queue, on_input, NULL);
  156. }
  157. draw_user_message(canvas, message, 2);
  158. canvas_draw_icon(canvas, 0, 53, &I_ButtonLeft_4x7);
  159. canvas_draw_str_aligned(canvas, 7, 54, AlignLeft, AlignTop, "Delete");
  160. canvas_draw_icon(canvas, 52, 53, &I_ButtonBACK_10x8);
  161. canvas_draw_str_aligned(canvas, 64, 54, AlignLeft, AlignTop, "Back");
  162. canvas_draw_icon(canvas, 100, 53, &I_ButtonRight_4x7);
  163. canvas_draw_str_aligned(canvas, 107, 54, AlignLeft, AlignTop, "Post");
  164. // handle action
  165. switch (action)
  166. {
  167. case ActionNone:
  168. break;
  169. case ActionBack:
  170. flip_social_dialog_stop = true;
  171. break;
  172. case ActionNext:
  173. // send message
  174. if (message && app_instance->login_username_logged_in)
  175. {
  176. // Send the message
  177. char command[128];
  178. snprintf(command, sizeof(command), "{\"username\":\"%s\",\"content\":\"%s\"}",
  179. app_instance->login_username_logged_in, message);
  180. bool success = flipper_http_post_request_with_headers(
  181. "https://www.flipsocial.net/api/feed/post/",
  182. "{\"Content-Type\":\"application/json\"}",
  183. command);
  184. if (!success)
  185. {
  186. FURI_LOG_E(TAG, "Failed to send HTTP request for feed");
  187. furi_check(success); // Log the error with furi_check
  188. return; // Exit early to avoid further errors
  189. }
  190. fhttp.state = RECEIVING;
  191. furi_timer_start(fhttp.get_timeout_timer, TIMEOUT_DURATION_TICKS);
  192. }
  193. else
  194. {
  195. FURI_LOG_E(TAG, "Message or username is NULL");
  196. furi_check(false); // Log as an error and return
  197. return;
  198. }
  199. int i = 0;
  200. while (fhttp.state == RECEIVING && furi_timer_is_running(fhttp.get_timeout_timer) > 0)
  201. {
  202. // Wait for the feed to be received
  203. furi_delay_ms(100);
  204. char dots_str[64] = "Receiving";
  205. // Append dots to the string based on the value of i
  206. int dot_count = i % 4;
  207. int len = strlen(dots_str);
  208. snprintf(dots_str + len, sizeof(dots_str) - len, "%.*s", dot_count, "....");
  209. // Draw the resulting string on the canvas
  210. canvas_draw_str(canvas, 0, 30, dots_str);
  211. i++;
  212. }
  213. flip_social_dialog_stop = true;
  214. furi_timer_stop(fhttp.get_timeout_timer);
  215. break;
  216. case ActionPrev:
  217. // delete message
  218. // remove the message from app_instance->pre_saved_messages
  219. app_instance->pre_saved_messages.messages[flip_social_feed.index] = NULL;
  220. for (uint32_t i = flip_social_feed.index; i < app_instance->pre_saved_messages.count - 1; i++)
  221. {
  222. app_instance->pre_saved_messages.messages[i] = app_instance->pre_saved_messages.messages[i + 1];
  223. }
  224. app_instance->pre_saved_messages.count--;
  225. // add the item to the submenu
  226. submenu_reset(app_instance->submenu_compose);
  227. submenu_add_item(app_instance->submenu_compose, "Add Pre-Save", FlipSocialSubmenuComposeIndexAddPreSave, flip_social_callback_submenu_choices, app_instance);
  228. for (uint32_t i = 0; i < app_instance->pre_saved_messages.count; i++)
  229. {
  230. submenu_add_item(app_instance->submenu_compose, app_instance->pre_saved_messages.messages[i], FlipSocialSubemnuComposeIndexStartIndex + i, flip_social_callback_submenu_choices, app_instance);
  231. }
  232. // save playlist
  233. save_playlist(&app_instance->pre_saved_messages);
  234. flip_social_dialog_stop = true;
  235. break;
  236. default:
  237. action = ActionNone;
  238. break;
  239. }
  240. if (flip_social_dialog_stop)
  241. {
  242. furi_pubsub_unsubscribe(app_instance->input_event_queue, app_instance->input_event);
  243. flip_social_dialog_shown = false;
  244. flip_social_dialog_stop = false;
  245. if (action == ActionBack || action == ActionNext)
  246. {
  247. action = ActionNone;
  248. view_dispatcher_switch_to_view(app_instance->view_dispatcher, FlipSocialViewLoggedInSubmenu);
  249. }
  250. else
  251. {
  252. action = ActionNone;
  253. view_dispatcher_switch_to_view(app_instance->view_dispatcher, FlipSocialViewLoggedInCompose);
  254. }
  255. }
  256. }
  257. // function to draw the dialog canvas
  258. static void flip_social_canvas_draw_message(Canvas *canvas, char *user_username, char *user_message, bool is_flipped, bool show_prev, bool show_next)
  259. {
  260. canvas_set_color(canvas, ColorBlack);
  261. canvas_set_font(canvas, FontPrimary);
  262. canvas_draw_str_aligned(canvas, 64, 5, AlignCenter, AlignCenter, user_username);
  263. canvas_set_font(canvas, FontSecondary);
  264. draw_user_message(canvas, user_message, 12);
  265. canvas_set_font(canvas, FontSecondary);
  266. if (show_prev)
  267. {
  268. canvas_draw_icon(canvas, 0, 53, &I_ButtonLeft_4x7);
  269. canvas_draw_str_aligned(canvas, 9, 54, AlignLeft, AlignTop, "Prev");
  270. }
  271. if (!is_flipped)
  272. {
  273. canvas_draw_icon(canvas, 52, 53, &I_ButtonOK_7x7);
  274. canvas_draw_str_aligned(canvas, 61, 54, AlignLeft, AlignTop, "Flip");
  275. }
  276. else
  277. {
  278. canvas_draw_icon(canvas, 47, 53, &I_ButtonOK_7x7);
  279. canvas_draw_str_aligned(canvas, 56, 54, AlignLeft, AlignTop, "UnFlip");
  280. }
  281. if (show_next)
  282. {
  283. canvas_draw_icon(canvas, 98, 53, &I_ButtonRight_4x7);
  284. canvas_draw_str_aligned(canvas, 107, 54, AlignLeft, AlignTop, "Next");
  285. }
  286. }
  287. // Callback function to handle the feed dialog
  288. static void flip_social_callback_draw_feed(Canvas *canvas, void *model)
  289. {
  290. UNUSED(model);
  291. if (!canvas)
  292. {
  293. FURI_LOG_E(TAG, "Canvas is NULL");
  294. return;
  295. }
  296. if (!app_instance)
  297. {
  298. FURI_LOG_E(TAG, "FlipSocialApp is NULL");
  299. return;
  300. }
  301. if (!flip_social_dialog_shown)
  302. {
  303. flip_social_dialog_shown = true;
  304. app_instance->input_event_queue = furi_record_open(RECORD_INPUT_EVENTS);
  305. app_instance->input_event = furi_pubsub_subscribe(app_instance->input_event_queue, on_input, NULL);
  306. }
  307. // handle action
  308. switch (action)
  309. {
  310. case ActionNone:
  311. flip_social_canvas_draw_message(canvas, flip_social_feed.usernames[flip_social_feed.index], flip_social_feed.messages[flip_social_feed.index], flip_social_feed.is_flipped[flip_social_feed.index], flip_social_feed.index > 0, flip_social_feed.index < flip_social_feed.count - 1);
  312. break;
  313. case ActionNext:
  314. canvas_clear(canvas);
  315. if (flip_social_feed.index < flip_social_feed.count - 1)
  316. {
  317. flip_social_feed.index++;
  318. }
  319. flip_social_canvas_draw_message(canvas, flip_social_feed.usernames[flip_social_feed.index], flip_social_feed.messages[flip_social_feed.index], flip_social_feed.is_flipped[flip_social_feed.index], flip_social_feed.index > 0, flip_social_feed.index < flip_social_feed.count - 1);
  320. action = ActionNone;
  321. break;
  322. case ActionPrev:
  323. canvas_clear(canvas);
  324. if (flip_social_feed.index > 0)
  325. {
  326. flip_social_feed.index--;
  327. }
  328. flip_social_canvas_draw_message(canvas, flip_social_feed.usernames[flip_social_feed.index], flip_social_feed.messages[flip_social_feed.index], flip_social_feed.is_flipped[flip_social_feed.index], flip_social_feed.index > 0, flip_social_feed.index < flip_social_feed.count - 1);
  329. action = ActionNone;
  330. break;
  331. case ActionFlip:
  332. canvas_clear(canvas);
  333. flip_social_feed.is_flipped[flip_social_feed.index] = !flip_social_feed.is_flipped[flip_social_feed.index];
  334. flip_social_canvas_draw_message(canvas, flip_social_feed.usernames[flip_social_feed.index], flip_social_feed.messages[flip_social_feed.index], flip_social_feed.is_flipped[flip_social_feed.index], flip_social_feed.index > 0, flip_social_feed.index < flip_social_feed.count - 1);
  335. action = ActionNone;
  336. // send post request to flip the message
  337. if (app_instance->login_username_logged_in == NULL)
  338. {
  339. FURI_LOG_E(TAG, "Username is NULL");
  340. return;
  341. }
  342. char payload[256];
  343. snprintf(payload, sizeof(payload), "{\"username\":\"%s\",\"post_id\":\"%lu\"}", app_instance->login_username_logged_in, flip_social_feed.ids[flip_social_feed.index]);
  344. flipper_http_post_request_with_headers("https://www.flipsocial.net/api/feed/flip/", "{\"Content-Type\":\"application/json\"}", payload);
  345. break;
  346. case ActionBack:
  347. canvas_clear(canvas);
  348. flip_social_dialog_stop = true;
  349. flip_social_feed.index = 0;
  350. action = ActionNone;
  351. break;
  352. default:
  353. break;
  354. }
  355. if (flip_social_dialog_stop)
  356. {
  357. furi_pubsub_unsubscribe(app_instance->input_event_queue, app_instance->input_event);
  358. flip_social_dialog_shown = false;
  359. flip_social_dialog_stop = false;
  360. action = ActionNone;
  361. }
  362. }
  363. /**
  364. * @brief Navigation callback for asynchonously handling the login process.
  365. * @param canvas The canvas to draw on.
  366. * @param model The model - unused
  367. * @return void
  368. */
  369. static void flip_social_callback_draw_login(Canvas *canvas, void *model)
  370. {
  371. UNUSED(model);
  372. if (!canvas)
  373. {
  374. FURI_LOG_E(TAG, "Canvas is NULL");
  375. return;
  376. }
  377. canvas_set_font(canvas, FontSecondary);
  378. if (!flip_social_board_is_active(canvas))
  379. {
  380. return;
  381. }
  382. canvas_draw_str(canvas, 0, 7, "Logging in...");
  383. // Perform login request
  384. if (!flip_social_sent_login_request)
  385. {
  386. if (!app_instance->login_username_logged_out || !app_instance->login_password_logged_out || strlen(app_instance->login_username_logged_out) == 0 || strlen(app_instance->login_password_logged_out) == 0)
  387. {
  388. canvas_clear(canvas);
  389. canvas_draw_str(canvas, 0, 10, "Please enter your credentials.");
  390. canvas_draw_str(canvas, 0, 60, "Press BACK to return.");
  391. return;
  392. }
  393. flip_social_sent_login_request = true;
  394. char buffer[256];
  395. snprintf(buffer, sizeof(buffer), "{\"username\":\"%s\",\"password\":\"%s\"}", app_instance->login_username_logged_out, app_instance->login_password_logged_out);
  396. flip_social_login_success = flipper_http_post_request_with_headers("https://www.flipsocial.net/api/user/login/", "{\"Content-Type\":\"application/json\"}", buffer);
  397. if (flip_social_login_success)
  398. {
  399. fhttp.state = RECEIVING;
  400. return;
  401. }
  402. else
  403. {
  404. fhttp.state = ISSUE;
  405. return;
  406. }
  407. }
  408. // handle response
  409. if (flip_social_sent_login_request && flip_social_login_success)
  410. {
  411. canvas_set_font(canvas, FontSecondary);
  412. canvas_draw_str(canvas, 0, 17, "Request Sent!");
  413. canvas_draw_str(canvas, 0, 32, "Awaiting reponse...");
  414. if (fhttp.state == IDLE && fhttp.received_data != NULL)
  415. {
  416. // read response
  417. if (strstr(fhttp.received_data, "[SUCCESS]") != NULL || strstr(fhttp.received_data, "User found") != NULL)
  418. {
  419. canvas_draw_str(canvas, 0, 42, "Login successful!");
  420. canvas_draw_str(canvas, 0, 62, "Welcome back!");
  421. app_instance->is_logged_in = "true";
  422. save_settings(app_instance->wifi_ssid_logged_out, app_instance->wifi_password_logged_out, app_instance->login_username_logged_out, app_instance->login_username_logged_in, app_instance->login_password_logged_out, app_instance->change_password_logged_in, app_instance->is_logged_in);
  423. // send user to the logged in submenu
  424. view_dispatcher_switch_to_view(app_instance->view_dispatcher, FlipSocialViewLoggedInSubmenu);
  425. }
  426. else if (strstr(fhttp.received_data, "User not found") != NULL)
  427. {
  428. canvas_clear(canvas);
  429. canvas_draw_str(canvas, 0, 10, "Account not found...");
  430. canvas_draw_str(canvas, 0, 60, "Press BACK to return.");
  431. }
  432. else
  433. {
  434. flip_social_handle_error(canvas);
  435. }
  436. }
  437. else if ((fhttp.state == ISSUE || fhttp.state == INACTIVE) && fhttp.received_data != NULL)
  438. {
  439. flip_social_handle_error(canvas);
  440. }
  441. else if (fhttp.state == IDLE && fhttp.received_data == NULL)
  442. {
  443. flip_social_handle_error(canvas);
  444. }
  445. }
  446. else if (flip_social_sent_login_request && !flip_social_login_success)
  447. {
  448. canvas_clear(canvas);
  449. canvas_draw_str(canvas, 0, 10, "Failed sending request.");
  450. canvas_draw_str(canvas, 0, 50, "Update your WiFi settings.");
  451. canvas_draw_str(canvas, 0, 62, "Press BACK to return.");
  452. }
  453. }
  454. /**
  455. * @brief Navigation callback for asynchonously handling the register process.
  456. * @param canvas The canvas to draw on.
  457. * @param model The model - unused
  458. * @return void
  459. */
  460. static void flip_social_callback_draw_register(Canvas *canvas, void *model)
  461. {
  462. UNUSED(model);
  463. if (!canvas)
  464. {
  465. FURI_LOG_E(TAG, "Canvas is NULL");
  466. return;
  467. }
  468. canvas_set_font(canvas, FontSecondary);
  469. if (!flip_social_board_is_active(canvas))
  470. {
  471. return;
  472. }
  473. canvas_draw_str(canvas, 0, 7, "Registering...");
  474. // Perform login request
  475. if (!flip_social_sent_register_request)
  476. {
  477. // check if the username and password are valid
  478. if (!app_instance->register_username_logged_out || !app_instance->register_password_logged_out || strlen(app_instance->register_username_logged_out) == 0 || strlen(app_instance->register_password_logged_out) == 0)
  479. {
  480. canvas_clear(canvas);
  481. canvas_draw_str(canvas, 0, 10, "Please enter your credentials.");
  482. canvas_draw_str(canvas, 0, 60, "Press BACK to return.");
  483. return;
  484. }
  485. // check if both passwords match
  486. if (strcmp(app_instance->register_password_logged_out, app_instance->register_password_2_logged_out) != 0)
  487. {
  488. canvas_clear(canvas);
  489. canvas_draw_str(canvas, 0, 10, "Passwords do not match.");
  490. canvas_draw_str(canvas, 0, 60, "Press BACK to return.");
  491. return;
  492. }
  493. char buffer[128];
  494. snprintf(buffer, sizeof(buffer), "{\"username\":\"%s\",\"password\":\"%s\"}", app_instance->register_username_logged_out, app_instance->register_password_logged_out);
  495. flip_social_register_success = flipper_http_post_request_with_headers("https://www.flipsocial.net/api/user/register/", "{\"Content-Type\":\"application/json\"}", buffer);
  496. flip_social_sent_register_request = true;
  497. if (flip_social_register_success)
  498. {
  499. // Set the state to RECEIVING to ensure we continue to see the receiving message
  500. fhttp.state = RECEIVING;
  501. }
  502. else
  503. {
  504. fhttp.state = ISSUE;
  505. }
  506. }
  507. // handle response
  508. if (flip_social_sent_register_request && flip_social_register_success)
  509. {
  510. canvas_set_font(canvas, FontSecondary);
  511. canvas_draw_str(canvas, 0, 17, "Request Sent!");
  512. canvas_draw_str(canvas, 0, 32, "Awaiting reponse...");
  513. if (fhttp.state == IDLE)
  514. {
  515. // read response
  516. if (fhttp.received_data != NULL && (strstr(fhttp.received_data, "[SUCCESS]") != NULL || strstr(fhttp.received_data, "User created") != NULL))
  517. {
  518. canvas_draw_str(canvas, 0, 42, "Registeration successful!");
  519. canvas_draw_str(canvas, 0, 62, "Welcome to FlipSocial!");
  520. // set the login credentials
  521. if (app_instance->login_username_logged_out)
  522. {
  523. app_instance->login_username_logged_out = app_instance->register_username_logged_out;
  524. }
  525. if (app_instance->login_password_logged_out)
  526. {
  527. app_instance->login_password_logged_out = app_instance->register_password_logged_out;
  528. app_instance->change_password_logged_in = app_instance->register_password_logged_out;
  529. }
  530. if (app_instance->login_username_logged_in)
  531. {
  532. app_instance->login_username_logged_in = app_instance->register_username_logged_out;
  533. }
  534. app_instance->is_logged_in = "true";
  535. // save the credentials
  536. save_settings(app_instance->wifi_ssid_logged_out, app_instance->wifi_password_logged_out, app_instance->login_username_logged_out, app_instance->login_username_logged_in, app_instance->login_password_logged_out, app_instance->change_password_logged_in, app_instance->is_logged_in);
  537. // send user to the logged in submenu
  538. view_dispatcher_switch_to_view(app_instance->view_dispatcher, FlipSocialViewLoggedInSubmenu);
  539. }
  540. else if (strstr(fhttp.received_data, "Username or password not provided") != NULL)
  541. {
  542. canvas_clear(canvas);
  543. canvas_draw_str(canvas, 0, 10, "Please enter your credentials.");
  544. canvas_draw_str(canvas, 0, 60, "Press BACK to return.");
  545. }
  546. else if (strstr(fhttp.received_data, "User already exists") != NULL || strstr(fhttp.received_data, "Multiple users found") != NULL)
  547. {
  548. canvas_draw_str(canvas, 0, 42, "Registration failed...");
  549. canvas_draw_str(canvas, 0, 52, "Username already exists.");
  550. canvas_draw_str(canvas, 0, 62, "Press BACK to return.");
  551. }
  552. else
  553. {
  554. canvas_draw_str(canvas, 0, 42, "Registration failed...");
  555. canvas_draw_str(canvas, 0, 52, "Update your credentials.");
  556. canvas_draw_str(canvas, 0, 62, "Press BACK to return.");
  557. }
  558. }
  559. else if (fhttp.state == ISSUE || fhttp.state == INACTIVE)
  560. {
  561. flip_social_handle_error(canvas);
  562. }
  563. }
  564. else if (flip_social_sent_register_request && !flip_social_register_success)
  565. {
  566. canvas_clear(canvas);
  567. canvas_draw_str(canvas, 0, 10, "Failed sending request.");
  568. canvas_draw_str(canvas, 0, 50, "Update your WiFi settings.");
  569. canvas_draw_str(canvas, 0, 62, "Press BACK to return.");
  570. }
  571. }
  572. // function to draw the dialog canvas
  573. static void flip_social_canvas_draw_explore(Canvas *canvas, char *user_username, char *content)
  574. {
  575. canvas_set_color(canvas, ColorBlack);
  576. canvas_set_font(canvas, FontPrimary);
  577. canvas_draw_str_aligned(canvas, 64, 5, AlignCenter, AlignCenter, user_username);
  578. canvas_set_font(canvas, FontSecondary);
  579. draw_user_message(canvas, content, 12);
  580. canvas_set_font(canvas, FontSecondary);
  581. canvas_draw_icon(canvas, 0, 53, &I_ButtonLeft_4x7);
  582. canvas_draw_str_aligned(canvas, 9, 54, AlignLeft, AlignTop, "Remove");
  583. canvas_draw_icon(canvas, 98, 53, &I_ButtonRight_4x7);
  584. canvas_draw_str_aligned(canvas, 107, 54, AlignLeft, AlignTop, "Add");
  585. if (strlen(content) > 0)
  586. {
  587. last_explore_response = content;
  588. }
  589. }
  590. // Callback function to handle the explore dialog
  591. static void flip_social_callback_draw_explore(Canvas *canvas, void *model)
  592. {
  593. UNUSED(model);
  594. if (!canvas)
  595. {
  596. FURI_LOG_E(TAG, "Canvas is NULL");
  597. return;
  598. }
  599. if (!app_instance)
  600. {
  601. FURI_LOG_E(TAG, "FlipSocialApp is NULL");
  602. return;
  603. }
  604. if (!flip_social_dialog_shown)
  605. {
  606. flip_social_dialog_shown = true;
  607. app_instance->input_event_queue = furi_record_open(RECORD_INPUT_EVENTS);
  608. app_instance->input_event = furi_pubsub_subscribe(app_instance->input_event_queue, on_input, NULL);
  609. }
  610. flip_social_canvas_draw_explore(canvas, flip_social_explore.usernames[flip_social_explore.index], last_explore_response);
  611. // handle action
  612. switch (action)
  613. {
  614. case ActionNext:
  615. // add friend
  616. char add_payload[128];
  617. snprintf(add_payload, sizeof(add_payload), "{\"username\":\"%s\",\"friend\":\"%s\"}", app_instance->login_username_logged_in, flip_social_explore.usernames[flip_social_explore.index]);
  618. flipper_http_post_request_with_headers("https://www.flipsocial.net/api/user/add-friend/", "{\"Content-Type\":\"application/json\"}", add_payload);
  619. canvas_clear(canvas);
  620. flip_social_canvas_draw_explore(canvas, flip_social_explore.usernames[flip_social_explore.index], "Added!");
  621. action = ActionNone;
  622. break;
  623. case ActionPrev:
  624. // remove friend
  625. char remove_payload[128];
  626. snprintf(remove_payload, sizeof(remove_payload), "{\"username\":\"%s\",\"friend\":\"%s\"}", app_instance->login_username_logged_in, flip_social_explore.usernames[flip_social_explore.index]);
  627. flipper_http_post_request_with_headers("https://www.flipsocial.net/api/user/remove-friend/", "{\"Content-Type\":\"application/json\"}", remove_payload);
  628. canvas_clear(canvas);
  629. flip_social_canvas_draw_explore(canvas, flip_social_explore.usernames[flip_social_explore.index], "Removed!");
  630. action = ActionNone;
  631. break;
  632. case ActionBack:
  633. canvas_clear(canvas);
  634. flip_social_dialog_stop = true;
  635. last_explore_response = "";
  636. flip_social_dialog_shown = false;
  637. flip_social_explore.index = 0;
  638. action = ActionNone;
  639. break;
  640. default:
  641. break;
  642. }
  643. if (flip_social_dialog_stop)
  644. {
  645. furi_pubsub_unsubscribe(app_instance->input_event_queue, app_instance->input_event);
  646. flip_social_dialog_shown = false;
  647. flip_social_dialog_stop = false;
  648. action = ActionNone;
  649. }
  650. }
  651. // Callback function to handle the friends dialog
  652. static void flip_social_callback_draw_friends(Canvas *canvas, void *model)
  653. {
  654. UNUSED(model);
  655. if (!canvas)
  656. {
  657. FURI_LOG_E(TAG, "Canvas is NULL");
  658. return;
  659. }
  660. if (!app_instance)
  661. {
  662. FURI_LOG_E(TAG, "FlipSocialApp is NULL");
  663. return;
  664. }
  665. if (!flip_social_dialog_shown)
  666. {
  667. flip_social_dialog_shown = true;
  668. app_instance->input_event_queue = furi_record_open(RECORD_INPUT_EVENTS);
  669. app_instance->input_event = furi_pubsub_subscribe(app_instance->input_event_queue, on_input, NULL);
  670. }
  671. flip_social_canvas_draw_explore(canvas, flip_social_friends.usernames[flip_social_friends.index], last_explore_response);
  672. // handle action
  673. switch (action)
  674. {
  675. case ActionNext:
  676. // add friend
  677. char add_payload[128];
  678. snprintf(add_payload, sizeof(add_payload), "{\"username\":\"%s\",\"friend\":\"%s\"}", app_instance->login_username_logged_in, flip_social_friends.usernames[flip_social_friends.index]);
  679. if (flipper_http_post_request_with_headers("https://www.flipsocial.net/api/user/add-friend/", "{\"Content-Type\":\"application/json\"}", add_payload))
  680. {
  681. canvas_clear(canvas);
  682. flip_social_canvas_draw_explore(canvas, flip_social_friends.usernames[flip_social_friends.index], "Added!");
  683. // add the friend to the friends list
  684. flip_social_friends.usernames[flip_social_friends.count] = flip_social_friends.usernames[flip_social_friends.index];
  685. flip_social_friends.count++;
  686. flip_social_update_friends();
  687. }
  688. action = ActionNone;
  689. break;
  690. case ActionPrev:
  691. // remove friend
  692. char remove_payload[128];
  693. snprintf(remove_payload, sizeof(remove_payload), "{\"username\":\"%s\",\"friend\":\"%s\"}", app_instance->login_username_logged_in, flip_social_friends.usernames[flip_social_friends.index]);
  694. if (flipper_http_post_request_with_headers("https://www.flipsocial.net/api/user/remove-friend/", "{\"Content-Type\":\"application/json\"}", remove_payload))
  695. {
  696. canvas_clear(canvas);
  697. flip_social_canvas_draw_explore(canvas, flip_social_friends.usernames[flip_social_friends.index], "Removed!");
  698. // remove the friend from the friends list
  699. for (uint32_t i = flip_social_friends.index; i < flip_social_friends.count - 1; i++)
  700. {
  701. flip_social_friends.usernames[i] = flip_social_friends.usernames[i + 1];
  702. }
  703. flip_social_friends.count--;
  704. flip_social_update_friends();
  705. }
  706. action = ActionNone;
  707. break;
  708. case ActionBack:
  709. canvas_clear(canvas);
  710. flip_social_dialog_stop = true;
  711. last_explore_response = "";
  712. flip_social_dialog_shown = false;
  713. flip_social_friends.index = 0;
  714. action = ActionNone;
  715. break;
  716. default:
  717. break;
  718. }
  719. if (flip_social_dialog_stop)
  720. {
  721. furi_pubsub_unsubscribe(app_instance->input_event_queue, app_instance->input_event);
  722. flip_social_dialog_shown = false;
  723. flip_social_dialog_stop = false;
  724. action = ActionNone;
  725. }
  726. }
  727. #endif // FLIP_SOCIAL_DRAW_H