Skip to content

Commit 46f8cbc

Browse files
committed
add venue map page
1 parent cf1a6ab commit 46f8cbc

43 files changed

Lines changed: 2260 additions & 831 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.gitignore‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,12 @@ yarn-error.*
4646
# example data from programapi
4747
# static.europython.eu/programme/{year}/releases/current/{speakers|sessions|schedule}.json
4848
example_data/
49+
50+
# EAS Local Build Outputs
51+
*.apk
52+
*.aab
53+
*.ipa
54+
*.tar.gz
55+
56+
# EAS Local Build Directories
57+
.eas/

‎App.tsx‎

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { NavigationContainer } from "@react-navigation/native";
33
import type { Theme as NavTheme } from "@react-navigation/native";
44
import { PaperProvider, MD3Theme } from "react-native-paper";
55
import { SafeAreaProvider } from "react-native-safe-area-context";
6+
import { GestureHandlerRootView } from "react-native-gesture-handler";
67
import * as Notifications from "expo-notifications";
78

89
import "@utils/webAlertPolyfill";
@@ -92,12 +93,14 @@ function AppScaffold({
9293
onNavReady: () => void;
9394
}) {
9495
return (
95-
<PaperProvider theme={theme}>
96-
<SafeAreaProvider>
97-
<NavigationContainer theme={navTheme} ref={navigationRef} onReady={onNavReady}>
98-
{children}
99-
</NavigationContainer>
100-
</SafeAreaProvider>
101-
</PaperProvider>
96+
<GestureHandlerRootView style={{ flex: 1 }}>
97+
<PaperProvider theme={theme}>
98+
<SafeAreaProvider>
99+
<NavigationContainer theme={navTheme} ref={navigationRef} onReady={onNavReady}>
100+
{children}
101+
</NavigationContainer>
102+
</SafeAreaProvider>
103+
</PaperProvider>
104+
</GestureHandlerRootView>
102105
);
103106
}

‎app.config.js‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// Build-time only: read by the Expo CLI/Node while resolving config, never
2-
// shipped into src/ or the client bundle. Defaults to root; deploy-web.yaml
31
// sets WEB_BASE_URL=/europython-companion for the GitHub Pages build.
42
const baseUrl = process.env.WEB_BASE_URL ?? "";
53

@@ -11,17 +9,24 @@ module.exports = {
119
expo: {
1210
name: "EuroPython",
1311
slug: "europython-companion",
12+
owner: "europython",
1413
version: "1.0.0",
1514
orientation: "portrait",
1615
icon: "./assets/icon.png",
1716
userInterfaceStyle: "automatic",
17+
extra: {
18+
"eas": {
19+
"projectId": "65eee084-4cf7-40f1-93d0-994fdbc62b28"
20+
}
21+
},
1822
ios: {
1923
icon: "./assets/icon-ios.png",
2024
supportsTablet: true,
2125
bundleIdentifier: "eu.europython.companion",
2226
infoPlist: {
2327
NSCalendarsUsageDescription:
2428
"Allow EuroPython Companion to add sessions to your calendar.",
29+
ITSAppUsesNonExemptEncryption: false,
2530
},
2631
associatedDomains: deepLinkHosts.map((host) => `applinks:${host}`),
2732
},
@@ -49,7 +54,7 @@ module.exports = {
4954
web: {
5055
favicon: "./assets/icon.png",
5156
name: "EuroPython",
52-
description: "Your companion for the EuroPython in your pocket.",
57+
description: "Conference companion app for EuroPython",
5358
themeColor: "#001B31",
5459
},
5560
experiments: {

‎assets/venue/main-entrance.webp‎

115 KB
Loading
56.3 KB
Loading

‎assets/venue/quiet-room-s4-12.webp‎

13.5 KB
Loading
54.4 KB
Loading

‎deep-link-assets/.well-known/assetlinks.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
"package_name": "eu.europython.companion",
77
"sha256_cert_fingerprints": [
88
"12:61:6C:BC:9E:6F:53:29:B8:A8:92:57:51:17:67:0D:FB:A7:0B:A6:7F:1E:2B:FC:D3:AB:86:AE:A8:7C:26:36",
9-
"2F:A3:E5:98:A9:15:4E:DB:1A:15:BD:74:BB:90:DA:06:B1:83:35:5E:CE:0C:35:B2:B9:94:6D:86:DC:A9:CF:CA"
9+
"2F:A3:E5:98:A9:15:4E:DB:1A:15:BD:74:BB:90:DA:06:B1:83:35:5E:CE:0C:35:B2:B9:94:6D:86:DC:A9:CF:CA",
10+
"3E:66:79:C2:67:29:28:86:EC:42:A6:CB:79:66:B1:94:F0:28:04:F5:36:37:92:83:2B:5B:B4:88:40:36:38:B0"
1011
]
1112
}
1213
}

‎docs/architecture.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Navigation is a bottom tab navigator (`src/navigation/AppTabs.tsx` / `AppTabs.na
3333

3434
### Three independent deep-link/fallback systems into the same nav tree
3535

36-
- **`src/hooks/useAppNavigation.ts`** (`useAppNavigation` / default export) is what screens call for everyday navigation: `goToScheduleTab`, `goToSpeakersTab`, `goToHomeTab`, `goToSettingsTab`, `goToAgendaTab`, `openSession(id)`, `openSpeaker(id)`, `openNotificationsList`, `openCoC`, `openCoCContacts`. Detail-opening helpers use a 3-tier fallback: (1) if the current stack already has the target route, navigate directly within it; (2) else if a parent tab navigator exists, navigate it with a nested `{ screen, params }`; (3) else fall back to `navigationRef` directly (e.g. called before any navigator has mounted). `openCoC`/`openCoCContacts` use a `try/catch` around `navigation.navigate` instead of the route-inspection check the other helpers use — an inconsistency, not a bug, worth knowing about if you're adding a similar helper.
36+
- **`src/hooks/useAppNavigation.ts`** (`useAppNavigation` / default export) is what screens call for everyday navigation: `goToScheduleTab`, `goToSpeakersTab`, `goToHomeTab`, `goToSettingsTab`, `goToAgendaTab`, `openSession(id)`, `openSpeaker(id)`, `openNotificationsList`, `openCoC`, `openCoCContacts`, `openVenue`. Detail-opening helpers use a 3-tier fallback: (1) if the current stack already has the target route, navigate directly within it; (2) else if a parent tab navigator exists, navigate it with a nested `{ screen, params }`; (3) else fall back to `navigationRef` directly (e.g. called before any navigator has mounted). `openCoC`/`openCoCContacts` use a `try/catch` around `navigation.navigate` instead of the route-inspection check the other helpers use — an inconsistency, not a bug, worth knowing about if you're adding a similar helper.
3737
- **`src/hooks/useNotificationDeepLink.ts`** is a separate, independent mechanism that reacts to OS notification taps (see [Notifications](#notifications)) and drives `navigationRef` directly rather than going through `useAppNavigation`.
3838
- **`src/hooks/useUrlDeepLink.ts`** reacts to incoming `https://ep{year}.europython.eu/{session,speaker}/{slug}` and `.../schedule` universal links (native only) and also drives `navigationRef` directly. Unlike the other two, it resolves against `useConferenceData()` (URLs carry a `slug`, routes are keyed by `id`) and buffers on data-readiness rather than nav-readiness: a pending target is retried whenever the loaded conference data or `conferenceYear` changes, switching the year first via `setConferenceYear` if the link's year doesn't match what's currently loaded. This needs `apple-app-site-association`/`assetlinks.json` hosted on `europython.eu` to actually fire — see [Configuration](configuration.md#appconfigjs) — and has no web equivalent (a different-origin PWA can't intercept another site's URLs).
3939

@@ -73,6 +73,7 @@ One file per route, each wrapped in `ScreenContainer` (app chrome: title/subtitl
7373
- **`NotificationsScreen`** — lists currently-scheduled OS notifications via `Notifications.getAllScheduledNotificationsAsync()`, normalized and sorted with the same `compareSessionsByStart`/`toSortableStartItem` helpers used for schedule sorting.
7474
- **`CoCScreen`** — Code of Conduct in a `WebView` with injected JS to hide the site's header/nav chrome; `onShouldStartLoadWithRequest` only allows the first same-origin load (blocks in-page navigation away from the CoC URL).
7575
- **`CoCContactsScreen`** — a hardcoded primary contact card plus `@data/coc_contacts.json`, loaded through `loadJsonData` (a `require()` wrapper, see [Utilities](#utilities)).
76+
- **`VenueMapScreen`** — interior wayfinding for ICE Kraków Congress Centre. A `Chip` row switches between `@data/venue.ts`'s `venueViews` (Rooms/Entrances/Quiet room/Accessibility); text views render through `InfoCard`, image views through `ZoomableImage` (`src/components/venue/ZoomableImage.tsx`), which wraps a bundled `expo-image` in `react-native-zoom-toolkit`'s `SnapbackZoom` for pinch-zoom (real multi-touch only) plus a hand-wired double-tap-to-zoom toggle (via `onDoubleTap` + a `react-native-reanimated` shared value) since `SnapbackZoom` doesn't zoom on double-tap itself and pinch is unusable with a desktop mouse. Reachable from Home via a `NeedToKnow` card action (`openVenue` in `useAppNavigation.ts`).
7677

7778
## Components (`src/components/`)
7879

@@ -103,7 +104,7 @@ One file per route, each wrapped in `ScreenContainer` (app chrome: title/subtitl
103104

104105
## Data & content (`src/data/`)
105106

106-
Static, declarative content bundled with the app: `homeInfo.ts` ("Need to know" cards, with an `actions` array of `{ key, label }` resolved dynamically against `useAppNavigation()`'s returned functions by key), `onboarding.ts` (slide copy + Discord link), `sessionTypes.ts` (accent color map + legend entries), `coc.ts` (CoC URL), `coc_contacts.json` (CoC team contact list).
107+
Static, declarative content bundled with the app: `homeInfo.ts` ("Need to know" cards, with an `actions` array of `{ key, label }` resolved dynamically against `useAppNavigation()`'s returned functions by key), `onboarding.ts` (slide copy + Discord link), `sessionTypes.ts` (accent color map + legend entries), `coc.ts` (CoC URL), `coc_contacts.json` (CoC team contact list), `venue.ts` (`venueViews` — ICE Kraków room/floor guide, entrance/quiet-room images from `assets/venue/`, and accessibility info for `VenueMapScreen`; EuroPython hasn't published an official interior floor plan, so this is designed to take a future per-floor plan as one more `VenueView` entry).
107108

108109
## Config (`src/config/`)
109110

‎docs/configuration.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
## app.config.js
44
`app.config.js` (a dynamic config — there is no `app.json` in this repo) defines Expo runtime configuration:
55
- App identity: name (`EuroPython`), slug, orientation, icon, and splash screen.
6-
- Platform settings: iOS bundle ID (`eu.europython.companion`), Android package (same id), calendar permissions (`NSCalendarsUsageDescription` on iOS, `READ_CALENDAR`/`WRITE_CALENDAR` on Android), web manifest basics (favicon, name, description, theme color).
6+
- Platform settings: iOS bundle ID (`eu.europython.companion`), Android package (same id), calendar permissions (`NSCalendarsUsageDescription` on iOS, `READ_CALENDAR`/`WRITE_CALENDAR` on Android), web manifest basics (favicon, name, description, theme color), `ITSAppUsesNonExemptEncryption: false` on iOS (the app only uses standard HTTPS, so this skips the App Store/TestFlight export-compliance prompt on each submission).
77
- Plugins: `expo-notifications`, `expo-font`, `expo-calendar`, `expo-system-ui`, `expo-status-bar`, `expo-image`, `expo-splash-screen`.
88
- `ios.associatedDomains`/`android.intentFilters` — declare `ep{year}.europython.eu` (one host per year in `CONFERENCE_YEARS`, duplicated as a plain array here since this file runs in a Node context and can't import `src/config/conference.ts`) as universal-link/app-link domains for `src/hooks/useUrlDeepLink.ts`. **This config alone does not make deep links work**: iOS/Android only route these URLs to the app once EuroPython hosts `apple-app-site-association`/`assetlinks.json` at `https://ep{year}.europython.eu/.well-known/`, referencing this app's bundle ID/package and signing cert — that's outside this repo, coordinate with EuroPython's web/infra team. `deep-link-assets/` at the repo root has ready-to-fill templates for both files plus a README with exactly what to hand them and how. Until those files are live, tapping these links just opens the browser. Web can't participate at all: `ep{year}.europython.eu` is the conference site's own origin, not wherever this PWA is deployed, and a browser can never intercept navigation to a different origin.
99
- `newArchEnabled` is turned on for the project (there is no legacy-architecture code path to maintain).

0 commit comments

Comments
 (0)