Skip to content
Snippets Groups Projects
Select Git revision
  • f3af9b44d4e904ebbacb4b63fa564e13e4843a24
  • test default protected
  • master protected
  • feat/custom-css
  • feat/redesign-improvements-10
  • feat/redesign-improvements-8
  • feat/redesign-fixes-3
  • feat/pirstan-changes
  • feat/separate-import-thread
  • feat/dary-improvements
  • features/add-pdf-page
  • features/add-typed-table
  • features/fix-broken-calendar-categories
  • features/add-embed-to-articles
  • features/create-mastodon-feed-block
  • features/add-custom-numbering-for-candidates
  • features/add-timeline
  • features/create-wordcloud-from-article-page
  • features/create-collapsible-extra-legal-info
  • features/extend-hero-banner
  • features/add-link-to-images
21 results

feeds.py

Blame
  • GoogleProvider.vue 3.15 KiB
    <script>
      const pageSize = 10;
    
      export default {
        props: {
          calendarId: {
            type: String,
            required: true,
          },
          apiKey: {
            type: String,
            required: true,
          }
        },
        data() {
          return {
            events: [],
            toShow: 7,
          };
        },
        computed: {
          displayedEvents() {
            return this.events.slice(0, this.toShow);
          },
          hasMore() {
            return this.toShow < this.events.length;
          },
        },
        methods: {
          onShowMore() {
            this.toShow += pageSize;
          },
          loadEventsFromStorage() {
            if (window.sessionStorage && window.sessionStorage['__pircal_' + this.calendarId]) {
              return JSON.parse(window.sessionStorage['__pircal_' + this.calendarId]);
            }
          },
    
          // Store events to sessionStorage if possible to save requests.
          storeEventsToStorage() {
            if (window.sessionStorage) {
              window.sessionStorage['__pircal_' + this.calendarId] = JSON.stringify(this.events);
            }
          }
        },
        mounted() {
          const ev = this.loadEventsFromStorage();
    
          if (! ev) {
            const toIso = now => now.toISOString().split('.')[0]+"Z";
            const now = new Date();
            const timeMin = now.toISOString();
            const timeMax = new Date(+now + (1000 * 60 * 60 * 24 * 90)).toISOString(); // 90 days ahead
            const reqUrl = `https://www.googleapis.com/calendar/v3/calendars/${this.calendarId}/events?key=${encodeURIComponent(this.apiKey)}&maxResults=150&timeMin=${encodeURIComponent(timeMin)}&timeMax=${encodeURIComponent(timeMax)}&sanitizeHtml=true&singleEvents=true&maxAtendees=1`;
    
            let counter = 0;
    
            fetch(reqUrl)
              .then(response => {
                if (!response.ok) {
                  throw new Error("Problem loading events from google");
                }
                return response.json()
              })
              .then(resp => {
                this.events = resp.items
                  .map(e => {
                    const start = new Date(e.start.dateTime || e.start.date);
                    const end = new Date(e.end.dateTime || e.end.date);
    
                    const startDateVerbose = start.toLocaleDateString('cs-CZ', {weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'});
                    const startTimeVerbose = start.getHours() + ':' + start.getMinutes().toString().padStart(2, '0');
    
                    const allDay = ! e.start.dateTime;
    
                    return {
                      id: counter++,
                      start: start,
                      startTimestamp: start.getTime(),
                      startDateVerbose,
                      startTimeVerbose,
                      allDay,
                      end: end,
                      title: e.summary,
                      description: e.description,
                      link: e.htmlLink
                    };
                  })
                  .sort((e1, e2) => e1.start < e2.start ? -1 : 1);
    
                this.storeEventsToStorage();
            });
          } else {
            this.events = ev;
          }
        },
        render() {
          return this.$scopedSlots.default({
            events: this.displayedEvents,
            hasMore: this.hasMore,
            onShowMore: this.onShowMore,
          });
        }
      };
    </script>