feat: Add DDD Perth App download page and announcements management#88
Conversation
JakeGinnivan
commented
Sep 15, 2025
- Created a new route for the DDD Perth App download page with relevant content and links to app stores.
- Updated the main layout to include venue information.
- Enhanced admin settings to manage app announcements, including creating, updating, and clearing announcements.
- Implemented a loader for fetching active announcements for the app.
- Added SVG and PNG images for app download buttons.
- Updated type definitions to include new routes for the app.
- Created a new route for the DDD Perth App download page with relevant content and links to app stores. - Updated the main layout to include venue information. - Enhanced admin settings to manage app announcements, including creating, updating, and clearing announcements. - Implemented a loader for fetching active announcements for the app. - Added SVG and PNG images for app download buttons. - Updated type definitions to include new routes for the app.
There was a problem hiding this comment.
Pull Request Overview
This PR adds comprehensive mobile app support infrastructure including a download page for the DDD Perth app and an admin system for managing announcements. The implementation replaces the previous Google Forms-based announcement system with a database-backed solution that provides better control and reliability.
- Created a new app download page with links to iOS and Android app stores
- Implemented a complete announcements management system for administrators
- Enhanced the header navigation to conditionally show venue information
Reviewed Changes
Copilot reviewed 7 out of 10 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| website/app/routes/app-announcements.tsx | Replaces Google Forms integration with database-backed announcement retrieval |
| website/app/routes/admin.settings.tsx | Adds announcement creation, updating, and clearing functionality to admin interface |
| website/app/routes/_layout.tsx | Updates header component to pass venue information |
| website/app/routes/_layout.app.tsx | Creates new app download page with store links and user guidance |
| website/app/lib/announcements.server.ts | Implements server-side announcement management using Azure Table Storage |
| website/app/components/header/header.tsx | Adds conditional venue navigation link and removes team link |
| website-content/pages/about.mdx | Adds team section reference to about page |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
| {announcement.message} | ||
| </styled.p> | ||
| <styled.p color="green.600" fontSize="xs"> | ||
| Last updated: {DateTime.fromISO(announcement.updatedTime || announcement.createdTime).toLocaleString(DateTime.DATETIME_SHORT, { locale: 'en-AU' })} |
There was a problem hiding this comment.
This line is complex and hard to read. Consider extracting the date formatting logic into a helper function or variable for better readability and reusability.
| } catch (error: any) { | ||
| if (error.statusCode !== 409) { | ||
| throw error |
There was a problem hiding this comment.
Using 'any' type defeats TypeScript's type safety. Consider using 'unknown' or a more specific error type that matches the expected Azure Table Storage error structure.
| } catch (error: any) { | |
| if (error.statusCode !== 409) { | |
| throw error | |
| } catch (error: unknown) { | |
| if ( | |
| typeof error === "object" && | |
| error !== null && | |
| "statusCode" in error && | |
| typeof (error as { statusCode?: unknown }).statusCode === "number" | |
| ) { | |
| if ((error as { statusCode: number }).statusCode !== 409) { | |
| throw error; | |
| } | |
| } else { | |
| throw error; |