Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
378e0ce
feat: start nativewind v5 migration and token cleanup
Mar 23, 2026
44f8afa
fix: add asset module declarations for nativewind branch
Mar 23, 2026
72e5dcd
feat: nativewind v5 theme tokens, streamlined spacing/radius/colors i…
Mar 23, 2026
4d4f118
Migrate NativeWind styling system and harden calendar sync
Mar 23, 2026
78523e2
Reduce layout animation overhead in feed surfaces
Mar 23, 2026
c17cecc
Use debugOptimized for Android dev-client installs
Mar 23, 2026
bb5429a
Optimize map tab startup and polish map UI
Mar 23, 2026
cbdbf3b
Reduce map tab JS cold-start work
Mar 23, 2026
d622f5b
Stabilize profile sheet registration and Android tab icons
Mar 23, 2026
7c2719a
Fix profile sheet transition path and map sheet spacing
Mar 23, 2026
5c5c0b4
Use native Android tab icons
Mar 23, 2026
33fb34f
Refine MapLibre basemap styling
Mar 23, 2026
8ee60ee
Tighten map overlay spacing and collapsed sheet
Mar 23, 2026
109059c
feat(jobs,map): add archive sheet and studio markers
Mar 23, 2026
d7bec3d
refine archive sheet and overlay spacing
Mar 23, 2026
aa8e575
Polish map markers and archive sheet chrome
Mar 24, 2026
0a8238d
Refine archive sheet details and floating controls
Mar 24, 2026
e7f130a
Adjust studio map pin visibility and shape
Mar 24, 2026
e855529
Stabilize studio map pin anchoring
Mar 24, 2026
0570e3c
Use view annotations for studio map pins
Mar 24, 2026
f4bb69b
Refine studio pin tail geometry
Mar 24, 2026
86cad83
Use SVG silhouette for studio map pins
Mar 24, 2026
f8a416b
Layer studio pins above zones and frame images
Mar 24, 2026
6fdc2f6
Mask studio photos inside map pins
Mar 24, 2026
547f109
Restore stable studio pin annotation anchoring
Mar 24, 2026
5323ddb
Refine studio pin opening and zone outlines
Mar 24, 2026
ff00366
Polish studio pin layering and zoom scaling
Mar 24, 2026
2e045f8
Fix studio pin photo mask and zoom sizing
Mar 24, 2026
a48e290
Fix studio map pins and retune marker accent
Mar 24, 2026
78e1091
Stabilize studio pins on annotation path
Mar 24, 2026
c505f5d
Render studio pins with symbol layer
Mar 24, 2026
8c09ea5
Split studio pin shell and photo symbol layers
Mar 24, 2026
898baa7
feat(instructor-profile): structured address fields + simplified loca…
Mar 24, 2026
500587a
Scale studio map pins with clusters and shell asset
Mar 24, 2026
c19a4f0
Simplify studio map pins and add tint support
Mar 24, 2026
b3970cd
Fix studio pin shell transparency
Mar 24, 2026
6e473fd
Refine map styling and pin thresholds
Mar 24, 2026
549fdac
Normalize map fonts and neutralize basemap tones
Mar 24, 2026
101e038
Fix map glyph loading and dark road styling
Mar 24, 2026
ec47bcb
Tune map road hierarchy and smoothness
Mar 24, 2026
03b2dca
Polish jobs header motion and loading screen
Mar 24, 2026
674dc18
feat(home): instructor job carousel + studio review carousel with acc…
Mar 24, 2026
6c89c18
refactor(profile,layout): clean up profile index and top sheet
Mar 24, 2026
cd514ab
fix: silent catch in review carousel, loading-screen animation cleanu…
Mar 24, 2026
7c1f464
Merge branch 'master' into feat/nativewind-styling
DerpcatMusic Mar 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions app.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
"ExpoLocalization_supportsRTL": true,
"CFBundleLocalizations": ["en", "he", "en", "he"],
"NFCReaderUsageDescription": "NFC is used to read passport and identity document chips during verification.",
"com.apple.developer.nfc.readersession.iso7816.select-identifiers": [
"A0000002471001"
]
"com.apple.developer.nfc.readersession.iso7816.select-identifiers": ["A0000002471001"]
},
"bundleIdentifier": "com.derpcat.queue",
"privacyManifests": {
Expand Down
Binary file added assets/images/map/studio-pin-shell-cyan.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/map/studio-pin-shell-sdf.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,13 @@
"formatter": {
"trailingCommas": "none"
}
},
"css": {
"parser": {
"tailwindDirectives": true
},
"formatter": {
"enabled": true
}
}
}
111 changes: 97 additions & 14 deletions bun.lock

Large diffs are not rendered by default.

14 changes: 13 additions & 1 deletion convex/calendarNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ type GoogleIntegrationRecord = {
agendaSyncToken?: string;
};

const GOOGLE_REFRESH_CREDENTIALS_MISSING_ERROR =
"Google Calendar integration is missing refresh credentials";

type CalendarOwnerProfile = {
role: CalendarOwnerRole;
calendarProvider: "none" | "google" | "apple";
Expand Down Expand Up @@ -345,7 +348,7 @@ async function getGoogleAccessToken(ctx: any, integration: GoogleIntegrationReco
if (!accessToken || accessTokenExpiresAt < now + 60_000) {
const refreshToken = decryptCalendarToken(integration.refreshToken);
if (!refreshToken || !integration.oauthClientId) {
throw new ConvexError("Google Calendar integration is missing refresh credentials");
throw new ConvexError(GOOGLE_REFRESH_CREDENTIALS_MISSING_ERROR);
}
const refreshed = await refreshGoogleAccessToken({
refreshToken,
Expand Down Expand Up @@ -599,6 +602,15 @@ async function runGoogleCalendarSync(
integrationId: integration._id,
lastError: message,
});
if (message === GOOGLE_REFRESH_CREDENTIALS_MISSING_ERROR) {
return {
ok: true,
syncedCount: 0,
removedCount: 0,
importedCount: 0,
importedRemovedCount: 0,
};
}
throw error;
}
}
Expand Down
18 changes: 18 additions & 0 deletions convex/jobs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -981,6 +981,7 @@ export const getMyApplications = query({
applicationId: v.id("jobApplications"),
jobId: v.id("jobs"),
instructorId: v.id("instructorProfiles"),
studioId: v.id("studioProfiles"),
status: v.union(
v.literal("pending"),
v.literal("accepted"),
Expand All @@ -990,6 +991,7 @@ export const getMyApplications = query({
appliedAt: v.number(),
message: v.optional(v.string()),
studioName: v.string(),
studioImageUrl: v.optional(v.string()),
sport: v.string(),
zone: v.string(),
startTime: v.number(),
Expand All @@ -1010,6 +1012,9 @@ export const getMyApplications = query({
v.literal("cancelled"),
v.literal("completed"),
),
closureReason: v.optional(
v.union(v.literal("expired"), v.literal("studio_cancelled"), v.literal("filled")),
),
}),
),
handler: async (ctx, args) => {
Expand Down Expand Up @@ -1041,13 +1046,23 @@ export const getMyApplications = query({
const studios = await Promise.all(
studioIds.map((studioId) => ctx.db.get("studioProfiles", studioId)),
);
const studioImageUrls = await Promise.all(
studios.map((studio) =>
studio?.logoStorageId ? ctx.storage.getUrl(studio.logoStorageId) : null,
),
);
const studioById = new Map<string, Doc<"studioProfiles">>();
const studioImageUrlById = new Map<string, string>();
for (let i = 0; i < studioIds.length; i += 1) {
const studioId = studioIds[i];
const studio = studios[i];
if (studio) {
studioById.set(String(studioId), studio);
}
const studioImageUrl = studioImageUrls[i];
if (studioImageUrl) {
studioImageUrlById.set(String(studioId), studioImageUrl);
}
}

const paymentDetailsByJobId = await loadLatestPaymentDetailsByJobId(ctx, {
Expand All @@ -1070,6 +1085,7 @@ export const getMyApplications = query({
applicationId: application._id,
jobId: application.jobId,
instructorId: application.instructorId,
studioId: job.studioId,
status: application.status,
appliedAt: application.appliedAt,
studioName: studio?.studioName ?? "Unknown studio",
Expand All @@ -1081,9 +1097,11 @@ export const getMyApplications = query({
jobStatus: job.status,
...omitUndefined({
message: application.message,
studioImageUrl: studioImageUrlById.get(String(job.studioId)),
timeZone: job.timeZone,
note: job.note,
paymentDetails: paymentDetailsByJobId.get(String(job._id)),
closureReason: job.closureReason,
}),
});
}
Expand Down
11 changes: 11 additions & 0 deletions convex/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,11 @@ export default defineSchema({
bio: v.optional(v.string()),
socialLinks: v.optional(socialLinksValidator),
address: v.optional(v.string()),
addressCity: v.optional(v.string()),
addressStreet: v.optional(v.string()),
addressNumber: v.optional(v.string()),
addressFloor: v.optional(v.string()),
addressPostalCode: v.optional(v.string()),
latitude: v.optional(v.number()),
longitude: v.optional(v.number()),
expoPushToken: v.optional(v.string()),
Expand Down Expand Up @@ -236,10 +241,16 @@ export default defineSchema({
bio: v.optional(v.string()),
socialLinks: v.optional(socialLinksValidator),
address: v.string(),
addressCity: v.optional(v.string()),
addressStreet: v.optional(v.string()),
addressNumber: v.optional(v.string()),
addressFloor: v.optional(v.string()),
addressPostalCode: v.optional(v.string()),
zone: v.string(),
latitude: v.optional(v.number()),
longitude: v.optional(v.number()),
contactPhone: v.optional(v.string()),
mapMarkerColor: v.optional(v.string()),
expoPushToken: v.optional(v.string()),
notificationsEnabled: v.optional(v.boolean()),
logoStorageId: v.optional(v.id("_storage")),
Expand Down
Loading
Loading