jelhan/croodle

View on GitHub
app/models/option.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { isEmpty } from '@ember/utils';
import { DateTime } from 'luxon';

export default class Option {
  // Title of the option might be either:
  //
  // 1) ISO 8601 date string: `YYYY-MM-DD`
  // 2) ISO 8601 datetime string: `YYYY-MM-DDTHH:mm:ss.0000+01:00`
  // 3) Free text if poll type is MakeAPoll
  title: string;

  get datetime() {
    const { title } = this;

    if (isEmpty(title)) {
      return null;
    }

    const datetime = DateTime.fromISO(title);

    return datetime.isValid ? datetime : null;
  }

  get isDate() {
    const { datetime } = this;
    return datetime !== null;
  }

  get day() {
    if (this.datetime === null) {
      return null;
    }

    return this.datetime.toISODate();
  }

  get jsDate() {
    if (this.datetime === null) {
      return null;
    }

    return this.datetime.toJSDate();
  }

  get hasTime() {
    return this.isDate && this.title.length >= 'YYYY-MM-DDTHH:mm'.length;
  }

  get time() {
    if (!this.datetime || !this.hasTime) {
      return null;
    }

    return this.datetime.toISOTime()?.substring(0, 5);
  }

  constructor({ title }: { title: string }) {
    this.title = title;
  }
}