feat: Update c3nav event from 38c3 to 39c3
- Add 39c3 to all valid event lists - Change default event ID from 38c3 to 39c3 - Update examples and placeholders throughout codebase - Maintain backwards compatibility with 38c3 and older events 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
003d3b0187
commit
8eed0deadf
|
|
@ -4,8 +4,8 @@
|
||||||
NODE_ENV=development
|
NODE_ENV=development
|
||||||
PORT=3000
|
PORT=3000
|
||||||
|
|
||||||
# c3nav Integration (optional - defaults to 38c3)
|
# c3nav Integration (optional - defaults to 39c3)
|
||||||
C3NAV_BASE_URL=https://38c3.c3nav.de
|
C3NAV_BASE_URL=https://39c3.c3nav.de
|
||||||
|
|
||||||
# WebSocket Sync Server (required for multi-user location sharing)
|
# WebSocket Sync Server (required for multi-user location sharing)
|
||||||
# For local development: ws://localhost:3001
|
# For local development: ws://localhost:3001
|
||||||
|
|
|
||||||
|
|
@ -268,7 +268,7 @@ export default function RoomPage() {
|
||||||
waypoints={waypoints}
|
waypoints={waypoints}
|
||||||
currentUserId={currentParticipantId || undefined}
|
currentUserId={currentParticipantId || undefined}
|
||||||
currentLocation={currentLocation}
|
currentLocation={currentLocation}
|
||||||
eventId="38c3"
|
eventId="39c3"
|
||||||
isSharing={isSharing}
|
isSharing={isSharing}
|
||||||
onToggleSharing={handleToggleSharing}
|
onToggleSharing={handleToggleSharing}
|
||||||
onParticipantClick={(p) => {
|
onParticipantClick={(p) => {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ interface RouteParams {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valid c3nav events
|
// Valid c3nav events
|
||||||
const VALID_EVENTS = ['38c3', '37c3', 'eh22', 'eh2025', 'camp2023'];
|
const VALID_EVENTS = ['39c3', '38c3', '37c3', 'eh22', 'eh2025', 'camp2023'];
|
||||||
|
|
||||||
// Allowed API endpoints (whitelist for security)
|
// Allowed API endpoints (whitelist for security)
|
||||||
const ALLOWED_ENDPOINTS = [
|
const ALLOWED_ENDPOINTS = [
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ interface RouteParams {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valid c3nav events
|
// Valid c3nav events
|
||||||
const VALID_EVENTS = ['38c3', '37c3', 'eh22', 'eh2025', 'camp2023'];
|
const VALID_EVENTS = ['39c3', '38c3', '37c3', 'eh22', 'eh2025', 'camp2023'];
|
||||||
|
|
||||||
export async function GET(request: NextRequest, { params }: RouteParams) {
|
export async function GET(request: NextRequest, { params }: RouteParams) {
|
||||||
const { event, level, z, x, y } = params;
|
const { event, level, z, x, y } = params;
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import type { RouteSegment, C3NavRouteRequest } from '@/types';
|
||||||
const OSRM_API = 'https://router.project-osrm.org';
|
const OSRM_API = 'https://router.project-osrm.org';
|
||||||
|
|
||||||
// c3nav routing API
|
// c3nav routing API
|
||||||
const C3NAV_EVENTS = ['38c3', '37c3', 'eh22', 'eh2025', 'camp2023'];
|
const C3NAV_EVENTS = ['39c3', '38c3', '37c3', 'eh22', 'eh2025', 'camp2023'];
|
||||||
|
|
||||||
interface RouteRequest {
|
interface RouteRequest {
|
||||||
origin: {
|
origin: {
|
||||||
|
|
@ -222,7 +222,7 @@ async function getIndoorRoute(
|
||||||
export async function POST(request: NextRequest) {
|
export async function POST(request: NextRequest) {
|
||||||
try {
|
try {
|
||||||
const body: RouteRequest = await request.json();
|
const body: RouteRequest = await request.json();
|
||||||
const { origin, destination, mode = 'walking', eventId = '38c3', options } = body;
|
const { origin, destination, mode = 'walking', eventId = '39c3', options } = body;
|
||||||
|
|
||||||
if (!origin || !destination) {
|
if (!origin || !destination) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import './globals.css';
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: 'rMaps - Find Your Friends',
|
title: 'rMaps - Find Your Friends',
|
||||||
description: 'Collaborative real-time friend-finding navigation for events',
|
description: 'Collaborative real-time friend-finding navigation for events',
|
||||||
keywords: ['maps', 'navigation', 'friends', 'realtime', 'CCC', '38c3'],
|
keywords: ['maps', 'navigation', 'friends', 'realtime', 'CCC', '39c3'],
|
||||||
authors: [{ name: 'Jeff Emmett' }],
|
authors: [{ name: 'Jeff Emmett' }],
|
||||||
openGraph: {
|
openGraph: {
|
||||||
title: 'rMaps - Find Your Friends',
|
title: 'rMaps - Find Your Friends',
|
||||||
|
|
|
||||||
|
|
@ -161,7 +161,7 @@ export default function HomePage() {
|
||||||
type="text"
|
type="text"
|
||||||
value={roomName}
|
value={roomName}
|
||||||
onChange={(e) => setRoomName(e.target.value)}
|
onChange={(e) => setRoomName(e.target.value)}
|
||||||
placeholder="e.g., 38c3-crew"
|
placeholder="e.g., 39c3-crew"
|
||||||
className="input flex-1"
|
className="input flex-1"
|
||||||
maxLength={20}
|
maxLength={20}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import { useState, useEffect, useRef } from 'react';
|
||||||
import type { Participant } from '@/types';
|
import type { Participant } from '@/types';
|
||||||
|
|
||||||
interface C3NavEmbedProps {
|
interface C3NavEmbedProps {
|
||||||
/** Event identifier (e.g., '38c3', 'eh2025') */
|
/** Event identifier (e.g., '39c3', 'eh2025') */
|
||||||
eventId?: string;
|
eventId?: string;
|
||||||
/** Initial location to show */
|
/** Initial location to show */
|
||||||
initialLocation?: string;
|
initialLocation?: string;
|
||||||
|
|
@ -22,6 +22,7 @@ interface C3NavEmbedProps {
|
||||||
|
|
||||||
// c3nav event URLs
|
// c3nav event URLs
|
||||||
const C3NAV_EVENTS: Record<string, string> = {
|
const C3NAV_EVENTS: Record<string, string> = {
|
||||||
|
'39c3': 'https://39c3.c3nav.de',
|
||||||
'38c3': 'https://38c3.c3nav.de',
|
'38c3': 'https://38c3.c3nav.de',
|
||||||
'37c3': 'https://37c3.c3nav.de',
|
'37c3': 'https://37c3.c3nav.de',
|
||||||
'eh2025': 'https://eh2025.c3nav.de',
|
'eh2025': 'https://eh2025.c3nav.de',
|
||||||
|
|
@ -30,7 +31,7 @@ const C3NAV_EVENTS: Record<string, string> = {
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function C3NavEmbed({
|
export default function C3NavEmbed({
|
||||||
eventId = '38c3',
|
eventId = '39c3',
|
||||||
initialLocation,
|
initialLocation,
|
||||||
participants = [],
|
participants = [],
|
||||||
currentUserId,
|
currentUserId,
|
||||||
|
|
@ -43,7 +44,7 @@ export default function C3NavEmbed({
|
||||||
const [error, setError] = useState<string | null>(null);
|
const [error, setError] = useState<string | null>(null);
|
||||||
|
|
||||||
// Get the c3nav base URL for the event
|
// Get the c3nav base URL for the event
|
||||||
const baseUrl = C3NAV_EVENTS[eventId] || C3NAV_EVENTS['38c3'];
|
const baseUrl = C3NAV_EVENTS[eventId] || C3NAV_EVENTS['39c3'];
|
||||||
|
|
||||||
// Build the embed URL
|
// Build the embed URL
|
||||||
const embedUrl = new URL(baseUrl);
|
const embedUrl = new URL(baseUrl);
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ export default function DualMapView({
|
||||||
waypoints = [],
|
waypoints = [],
|
||||||
currentUserId,
|
currentUserId,
|
||||||
currentLocation,
|
currentLocation,
|
||||||
eventId = '38c3',
|
eventId = '39c3',
|
||||||
initialMode = 'auto',
|
initialMode = 'auto',
|
||||||
onParticipantClick,
|
onParticipantClick,
|
||||||
onWaypointClick,
|
onWaypointClick,
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ import type {
|
||||||
C3NavRouteResponse,
|
C3NavRouteResponse,
|
||||||
} from '@/types';
|
} from '@/types';
|
||||||
|
|
||||||
// Default to 38c3, can be overridden per-room
|
// Default to 39c3, can be overridden per-room
|
||||||
const DEFAULT_C3NAV_BASE = 'https://38c3.c3nav.de';
|
const DEFAULT_C3NAV_BASE = 'https://39c3.c3nav.de';
|
||||||
|
|
||||||
export class C3NavClient {
|
export class C3NavClient {
|
||||||
private baseUrl: string;
|
private baseUrl: string;
|
||||||
|
|
|
||||||
|
|
@ -283,7 +283,7 @@ export const useRoomStore = create<RoomState>((set, get) => ({
|
||||||
},
|
},
|
||||||
destination: destLocation,
|
destination: destLocation,
|
||||||
mode: 'walking',
|
mode: 'walking',
|
||||||
eventId: room?.settings.eventId || '38c3',
|
eventId: room?.settings.eventId || '39c3',
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ export interface RoomSettings {
|
||||||
defaultPrecision: PrecisionLevel;
|
defaultPrecision: PrecisionLevel;
|
||||||
allowGuestJoin: boolean;
|
allowGuestJoin: boolean;
|
||||||
showC3NavIndoor: boolean; // enable c3nav integration
|
showC3NavIndoor: boolean; // enable c3nav integration
|
||||||
eventId?: string; // e.g., '38c3', 'eh2025'
|
eventId?: string; // e.g., '39c3', 'eh2025'
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue