You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/architecture.md
+3-2Lines changed: 3 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -33,7 +33,7 @@ Navigation is a bottom tab navigator (`src/navigation/AppTabs.tsx` / `AppTabs.na
33
33
34
34
### Three independent deep-link/fallback systems into the same nav tree
35
35
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.
37
37
-**`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`.
38
38
-**`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).
39
39
@@ -73,6 +73,7 @@ One file per route, each wrapped in `ScreenContainer` (app chrome: title/subtitl
73
73
-**`NotificationsScreen`** — lists currently-scheduled OS notifications via `Notifications.getAllScheduledNotificationsAsync()`, normalized and sorted with the same `compareSessionsByStart`/`toSortableStartItem` helpers used for schedule sorting.
74
74
-**`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).
75
75
-**`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`).
76
77
77
78
## Components (`src/components/`)
78
79
@@ -103,7 +104,7 @@ One file per route, each wrapped in `ScreenContainer` (app chrome: title/subtitl
103
104
104
105
## Data & content (`src/data/`)
105
106
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).
Copy file name to clipboardExpand all lines: docs/configuration.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,7 +3,7 @@
3
3
## app.config.js
4
4
`app.config.js` (a dynamic config — there is no `app.json` in this repo) defines Expo runtime configuration:
5
5
- 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).
- `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.
9
9
-`newArchEnabled` is turned on for the project (there is no legacy-architecture code path to maintain).
0 commit comments