From 02879cefd11cd1b777dcfc672d94bc09a35a2eae Mon Sep 17 00:00:00 2001 From: echo Date: Thu, 18 Dec 2025 19:59:20 +0100 Subject: [PATCH] gym selection via profile screen --- apps/admin/data/fitai.db | Bin 77824 -> 77824 bytes apps/admin/src/app/api/users/gym/route.ts | 2 +- apps/mobile/src/app/(tabs)/profile.tsx | 74 +++++++++++++++++++++- 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/apps/admin/data/fitai.db b/apps/admin/data/fitai.db index c1d83da80d18a71abcec195de7f32038875a837c..eda26cc368f4574d54d9afdcf70379e4671fd133 100644 GIT binary patch delta 1361 zcma)6&ube;6qaNqb&}fa5XdEI^h^)7KvHDcu3bYR#Kxu&lRyYbPt9oeX*JR8j65@I zb=!afrG?&7bnL;)XrQ#nw;vzYk`qaBA+OnRzolyKr&-Z1ALT^XjF_+}z^m$I5o#(th#W{`8=H zsy_Pth(n-gq_G6b;{49uJ-M^@B+e2%?u}j??V|BbA^1CZGd_RouV86zrc(U3 zrS$GhKYwf5Wiiml0qZzGkgcCk5pPd=r_QHCpW6DfwiFK4(p+lwz z_^UZ1=}1sVXfK?XA$6p6o}A}?gYI^v;=FIkG6_$<%hcvrY7M*^@gducTq2Yr5qfDf zwNt4gH!19xR7b*h^5c%Nq>PU1o^3)d4MTRWK{wbhIlK&0N2m&ob`q1duTdhjh*`8T zzi&-!QBU4X@uy6j7m3t@oanI1Mn6Aa84jfHn$&}u)H#Q|t3fMOx^AWG(Osc>SbU3G z%{p3B&osbM&P-5WK$Ah2!4!lk6qz#$MJ zW{#Gah^_Ek%as&SMpy;Za^V}aiiJ#+4OqrqPqz!plQXEr~x==AF-eQaQ!z35pfd+KQCt?#vnmOXAMnYo6cw)sW80mU0H;1X0 zhfI;ka@UZB0dudh`__`SQ2EXgB`nm$flkWmKPeJAf}j1qv7Uw}jHcct@Ua2qS@b%H z))w6qK1ZSD^=3?w&8pKq+ib0bZp$mpW?ZEl5T=I4^m8p>zGtbaZw62lkx6yf-J(4! zmBLzKSB5=C?l8s;JwO0ntrKqZA};&C26^p&u!2SV$F7o zt_u_+RVsn%Z}A*t@mK=ho0E`3HiJd6lI#WrXb(Uct~Kwcvi7$c375FtSs zb+afB$VnMOqrkvZtG-G~;xm~fVSow?U#v;vNwV`V5MDJzAHp1RBzJb3_&rY@+fPS- q9$kKCde9vEXOGLccAgf3r@<@SS3d;R<(WIh|8sSe#;<-`zW)#84bAib delta 160 zcmZp8z|!!5Wr8%L?nD`9M%|4Gi}*R}8CZF3nfVkpa|wv?am6xn`RYr{^YSWA-XQNh zd9NIwK&H*7DE?&(NzURxVR06g$v*lDle1)vSTbGA_%=V3Q!Zp<%rBg6kz ""); + console.error("Failed to fetch gyms: non-OK response", { + status: res.status, + body: text?.slice(0, 200), + }); + setGyms([]); + return; + } + if (!contentType.includes("application/json")) { + const text = await res.text().catch(() => ""); + console.error("Failed to fetch gyms: expected JSON", { + contentType, + body: text?.slice(0, 200), + }); + setGyms([]); + return; + } + let data: any = null; + try { + data = await res.json(); + } catch (e) { + const text = await res.text().catch(() => ""); + console.error( + "Failed to parse gyms JSON:", + e, + "body:", + text?.slice(0, 200), + ); + setGyms([]); + return; + } setGyms(Array.isArray(data) ? data : []); } catch (err) { console.error("Failed to fetch gyms:", err); + setGyms([]); } finally { setGymsLoading(false); } @@ -63,7 +100,14 @@ export default function ProfileScreen() { const handleApplyGym = async () => { try { const token = await getToken(); - await fetch("/api/users/gym", { + const url = `${API_BASE_URL}${API_ENDPOINTS.USERS}/gym`; + console.log( + "Profile.handleApplyGym PATCH:", + url, + "gymId:", + selectedGymId, + ); + const res = await fetch(url, { method: "PATCH", headers: { "Content-Type": "application/json", @@ -71,6 +115,30 @@ export default function ProfileScreen() { }, body: JSON.stringify({ gymId: selectedGymId }), }); + const contentType = res.headers.get("content-type") || ""; + if (!res.ok) { + const text = await res.text().catch(() => ""); + console.error("Failed to update gym selection: non-OK response", { + status: res.status, + body: text?.slice(0, 200), + }); + Alert.alert("Error", "Failed to update gym selection"); + return; + } + if (contentType.includes("application/json")) { + try { + const data = await res.json(); + console.log("Gym selection updated:", data); + } catch (e) { + const text = await res.text().catch(() => ""); + console.error( + "Failed to parse update response JSON:", + e, + "body:", + text?.slice(0, 200), + ); + } + } Alert.alert( "Success", selectedGymId ? "Gym selected successfully" : "Proceeding without gym",