11import createClient , { type Middleware } from 'openapi-fetch' ;
22import type { paths , components } from '../../fms/fms-api' ;
3- import { TournamentLevel } from '../../fms/fms-api' ;
3+ import { TournamentLevel , EventNoteIssueTypes , EventNoteResolutionTypes } from '../../fms/fms-api' ;
44import { settingsStore } from '$lib/settings-store' ;
55import { get } from 'svelte/store' ;
66
@@ -27,6 +27,37 @@ export type MatchNote = components['schemas']['MatchNoteModel'];
2727export type ScheduledMatch = components [ 'schemas' ] [ 'ScheduledMatchModel' ] ;
2828export type EventSchedule = components [ 'schemas' ] [ 'EventScheduleModel' ] ;
2929
30+ // Create/Modify model types
31+ export type EventNoteCreateRequest = components [ 'schemas' ] [ 'EventNoteCreateModifyModel' ] ;
32+ export type MatchNoteCreateRequest = components [ 'schemas' ] [ 'MatchNoteCreateModifyModel' ] ;
33+ export type TeamIssueCreateRequest = components [ 'schemas' ] [ 'TeamIssueCreateModifyModel' ] ;
34+
35+ // Additional type exports for note creation (legacy - keeping for backward compatibility)
36+ export type CreateEventNoteRequest = {
37+ note : string ;
38+ } ;
39+
40+ export type CreateMatchNoteRequest = {
41+ note : string ;
42+ tournamentLevel : string ;
43+ matchNumber : number ;
44+ playNumber ?: number ;
45+ teamNumber ?: number ;
46+ } ;
47+
48+ export type CreateTeamNoteRequest = {
49+ noteText : string ;
50+ teamNumber : number ;
51+ tournamentLevel ?: components [ 'schemas' ] [ 'TournamentLevel' ] ;
52+ matchNumber ?: number ;
53+ playNumber ?: number ;
54+ issueType : components [ 'schemas' ] [ 'EventNoteIssueTypes' ] ;
55+ resolutionStatus : components [ 'schemas' ] [ 'EventNoteResolutionTypes' ] ;
56+ } ;
57+
58+ // Export enums for use in components
59+ export { EventNoteIssueTypes , EventNoteResolutionTypes , TournamentLevel } ;
60+
3061// Team Issues/Notes API
3162export async function getTeamNotes (
3263 fetch : typeof globalThis . fetch ,
@@ -225,3 +256,176 @@ export function countTeamGeneralNotes(teamNotes: TeamIssue[], teamNumber: number
225256 ! note . isDeleted
226257 ) . length ;
227258}
259+
260+ export async function createEventNote (
261+ fetch : typeof globalThis . fetch ,
262+ noteData : CreateEventNoteRequest
263+ ) {
264+ const settings = get ( settingsStore ) ;
265+
266+ // Log the note data for debugging
267+ console . log ( 'Creating event note:' , {
268+ note : noteData . note ,
269+ eventCode : settings . eventCode ,
270+ username : settings . username ,
271+ realName : settings . realName
272+ } ) ;
273+
274+ const { data, error, response } = await fmsClient . POST (
275+ '/api/v1.0/FTA/{season}/{eventCode}/eventNotes' ,
276+ {
277+ params : {
278+ path : {
279+ season : season ,
280+ eventCode : settings . eventCode
281+ } ,
282+ header : {
283+ 'FMS-UsersRealName' : settings . realName || settings . username ,
284+ 'FMS-DeviceIdentification' : getDeviceName ( )
285+ }
286+ } ,
287+ body : { noteText : noteData . note } ,
288+ fetch
289+ }
290+ ) ;
291+
292+ return { data, error, response } ;
293+ }
294+
295+ export async function createMatchNote (
296+ fetch : typeof globalThis . fetch ,
297+ noteData : CreateMatchNoteRequest
298+ ) {
299+ const settings = get ( settingsStore ) ;
300+
301+ // Log the note data for debugging
302+ console . log ( 'Creating match note:' , {
303+ note : noteData . note ,
304+ tournamentLevel : noteData . tournamentLevel ,
305+ matchNumber : noteData . matchNumber ,
306+ playNumber : noteData . playNumber ,
307+ teamNumber : noteData . teamNumber ,
308+ eventCode : settings . eventCode ,
309+ username : settings . username ,
310+ realName : settings . realName
311+ } ) ;
312+
313+ const { data, error, response } = await fmsClient . POST (
314+ '/api/v1.0/FTA/{season}/{eventCode}/matchNotes' ,
315+ {
316+ params : {
317+ path : {
318+ season : season ,
319+ eventCode : settings . eventCode
320+ } ,
321+ header : {
322+ 'FMS-UsersRealName' : settings . realName || settings . username ,
323+ 'FMS-DeviceIdentification' : getDeviceName ( )
324+ }
325+ } ,
326+ body : {
327+ noteText : noteData . note ,
328+ tournamentLevel : noteData . tournamentLevel ,
329+ matchNumber : noteData . matchNumber ,
330+ playNumber : noteData . playNumber ,
331+ teamNumber : noteData . teamNumber
332+ } ,
333+ fetch
334+ }
335+ ) ;
336+
337+ return { data, error, response } ;
338+ }
339+
340+ export async function createTeamNote (
341+ fetch : typeof globalThis . fetch ,
342+ noteData : CreateTeamNoteRequest
343+ ) {
344+ const settings = get ( settingsStore ) ;
345+
346+ // Log the note data for debugging
347+ console . log ( 'Creating team note:' , {
348+ note : noteData . noteText ,
349+ teamNumber : noteData . teamNumber ,
350+ tournamentLevel : noteData . tournamentLevel ,
351+ matchNumber : noteData . matchNumber ,
352+ playNumber : noteData . playNumber ,
353+ issueType : noteData . issueType ,
354+ resolutionStatus : noteData . resolutionStatus ,
355+ eventCode : settings . eventCode ,
356+ username : settings . username ,
357+ realName : settings . realName
358+ } ) ;
359+
360+ const { data, error, response } = await fmsClient . POST (
361+ '/api/v1.0/FTA/{season}/{eventCode}/teamIssues' ,
362+ {
363+ params : {
364+ path : {
365+ season : season ,
366+ eventCode : settings . eventCode
367+ } ,
368+ header : {
369+ 'FMS-UsersRealName' : settings . realName || settings . username ,
370+ 'FMS-DeviceIdentification' : getDeviceName ( )
371+ }
372+ } ,
373+ body : {
374+ noteText : noteData . noteText ,
375+ teamNumber : noteData . teamNumber ,
376+ tournamentLevel : noteData . tournamentLevel ,
377+ matchNumber : noteData . matchNumber ,
378+ playNumber : noteData . playNumber ,
379+ issueType : noteData . issueType ,
380+ resolutionStatus : noteData . resolutionStatus
381+ } ,
382+ fetch
383+ }
384+ ) ;
385+
386+ return { data, error, response } ;
387+ }
388+
389+ // Helper to get current username
390+ export function getCurrentUsername ( ) : string {
391+ return get ( settingsStore ) . username || 'Unknown User' ;
392+ }
393+
394+ // Function to generate a device name using browser APIs
395+ export function getDeviceName ( ) : string {
396+ const userAgent = navigator . userAgent ;
397+ let browserName = 'Unknown Browser' ;
398+ let osName = 'Unknown OS' ;
399+
400+ // Detect browser
401+ if ( userAgent . includes ( 'Chrome' ) && ! userAgent . includes ( 'Edg' ) ) {
402+ browserName = 'Chrome' ;
403+ } else if ( userAgent . includes ( 'Firefox' ) ) {
404+ browserName = 'Firefox' ;
405+ } else if ( userAgent . includes ( 'Safari' ) && ! userAgent . includes ( 'Chrome' ) ) {
406+ browserName = 'Safari' ;
407+ } else if ( userAgent . includes ( 'Edg' ) ) {
408+ browserName = 'Edge' ;
409+ } else if ( userAgent . includes ( 'Opera' ) || userAgent . includes ( 'OPR' ) ) {
410+ browserName = 'Opera' ;
411+ }
412+
413+ // Detect OS
414+ if ( userAgent . includes ( 'Windows NT' ) ) {
415+ osName = 'Windows' ;
416+ } else if ( userAgent . includes ( 'Mac OS X' ) ) {
417+ osName = 'macOS' ;
418+ } else if ( userAgent . includes ( 'Linux' ) ) {
419+ osName = 'Linux' ;
420+ } else if ( userAgent . includes ( 'Android' ) ) {
421+ osName = 'Android' ;
422+ } else if ( userAgent . includes ( 'iOS' ) ) {
423+ osName = 'iOS' ;
424+ }
425+
426+ // Try to get hostname if available
427+ const hostname = window . location . hostname ;
428+ const deviceId = hostname !== 'localhost' && hostname !== '127.0.0.1' ? hostname : 'local-device' ;
429+
430+ return `${ browserName } on ${ osName } (${ deviceId } )` ;
431+ }
0 commit comments