useEvents.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. export interface EventMedia {
  2. id: number
  3. name: string | null
  4. url: string | null
  5. }
  6. export interface CompanyEvent {
  7. id: number
  8. title: string
  9. description: string | null
  10. date: string | null
  11. time: string | null
  12. type: 'cultura' | 'esporte'
  13. cover_url: string | null
  14. order: number
  15. media: EventMedia[]
  16. }
  17. interface ApiResponse<T> {
  18. payload: T
  19. }
  20. export const useEvents = () => {
  21. const { apiUrl } = useRuntimeConfig().public
  22. const { data: eventsData } = useAsyncData('company-events', () =>
  23. $fetch<ApiResponse<CompanyEvent[]>>(`${apiUrl}/api/company-events`).catch(() => null),
  24. )
  25. const events = computed<CompanyEvent[]>(() => {
  26. const payload = eventsData.value?.payload
  27. if (!Array.isArray(payload)) return []
  28. return payload
  29. })
  30. return { events }
  31. }
  32. const MONTHS = [
  33. 'janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho',
  34. 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro',
  35. ]
  36. export const formatEventDateTime = (event: Pick<CompanyEvent, 'date' | 'time'>): string => {
  37. const parts: string[] = []
  38. if (event.date) {
  39. const [year, month, day] = event.date.split('-')
  40. const monthName = MONTHS[Number(month) - 1]
  41. if (monthName && day && year) parts.push(`${Number(day)} de ${monthName} de ${year}`)
  42. }
  43. if (event.time) parts.push(`${event.time}h`)
  44. return parts.join(' · ')
  45. }
  46. export const eventTypeLabel = (type: CompanyEvent['type']): string =>
  47. type === 'esporte' ? 'Esporte' : 'Cultura'