File size: 3,950 Bytes
73d7323
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import { parseISO, isValid } from 'date-fns';
import { zonedTimeToUtc, utcToZonedTime } from 'date-fns-tz';

export const getDeadlineInLocalTime = (deadline: string | undefined, timezone: string | undefined): Date | null => {
  if (!deadline || deadline === 'TBD') {
    console.log('Early return - deadline is null or TBD:', { deadline, timezone });
    return null;
  }
  
  try {
    console.log('Processing conference deadline:', {
      conferenceName: 'Unknown', // We could pass this as a parameter if helpful
      deadline,
      timezone,
      deadlineType: typeof deadline,
      timezoneType: typeof timezone
    });

    // Parse the deadline string to a Date object
    const deadlineDate = parseISO(deadline);
    console.log('Parsed deadline date:', {
      original: deadline,
      parsed: deadlineDate,
      isValid: isValid(deadlineDate),
      timestamp: deadlineDate.getTime(),
      toISOString: deadlineDate.toISOString()
    });

    if (!isValid(deadlineDate)) {
      console.error('Invalid date parsed from deadline:', deadline);
      return null;
    }
    
    // Handle AoE (Anywhere on Earth) timezone
    if (timezone === 'AoE') {
      console.log('Converting AoE to UTC-12');
      return new Date(deadlineDate.getTime() - 12 * 60 * 60 * 1000);
    }
    
    // Handle UTC offset timezones (e.g., "UTC-12", "UTC+01", "UTC+0")
    const normalizeTimezone = (tz: string | undefined): string => {
      if (!tz) {
        console.log('No timezone provided, using UTC');
        return 'UTC';
      }
      
      console.log('Normalizing timezone:', tz);
      
      // If it's already an IANA timezone, return as is
      if (!tz.toUpperCase().startsWith('UTC')) {
        console.log('Using IANA timezone:', tz);
        return tz;
      }
      
      // Convert UTC±XX to proper format
      const match = tz.match(/^UTC([+-])(\d+)$/);
      if (match) {
        const [, sign, hours] = match;
        const paddedHours = hours.padStart(2, '0');
        const normalized = `${sign}${paddedHours}:00`;
        console.log('Normalized UTC offset:', { original: tz, normalized });
        return normalized;
      }
      
      // Handle special case of UTC+0/UTC-0
      if (tz === 'UTC+0' || tz === 'UTC-0' || tz === 'UTC+00' || tz === 'UTC-00') {
        console.log('Handling UTC+0/-0 case:', tz);
        return 'UTC';
      }
      
      console.log('Falling back to UTC for timezone:', tz);
      return 'UTC';
    };

    const normalizedTimezone = normalizeTimezone(timezone);
    console.log('Using timezone:', { original: timezone, normalized: normalizedTimezone });

    try {
      // Create date in the conference's timezone
      const dateInConfTimezone = utcToZonedTime(deadlineDate, normalizedTimezone);
      console.log('Conference timezone date:', {
        date: dateInConfTimezone,
        isValid: isValid(dateInConfTimezone),
        timezone: normalizedTimezone
      });

      // Get user's local timezone
      const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
      
      // Convert to user's local timezone
      const localDate = utcToZonedTime(dateInConfTimezone, userTimezone);
      console.log('Local timezone date:', {
        date: localDate,
        isValid: isValid(localDate),
        timezone: userTimezone
      });
      
      if (!isValid(localDate)) {
        console.error('Invalid date after timezone conversion:', {
          original: deadline,
          timezone,
          normalizedTimezone,
          localDate
        });
        return null;
      }
      
      return localDate;
    } catch (tzError) {
      console.error('Timezone conversion error:', {
        error: tzError,
        deadline,
        timezone,
        normalizedTimezone
      });
      return deadlineDate;
    }
  } catch (error) {
    console.error('Error parsing deadline:', {
      error,
      deadline,
      timezone
    });
    return null;
  }
};