tissue/resources/assets/js/checkin.tsx

88 lines
2.5 KiB
TypeScript
Raw Normal View History

2019-06-01 00:40:35 +09:00
import Vue from 'vue';
import TagInput from './components/TagInput.vue';
import MetadataPreview from './components/MetadataPreview.vue';
2020-08-06 21:31:53 +09:00
import { fetchGet, ResponseError } from './fetch';
2020-05-17 17:11:35 +09:00
import * as React from 'react';
import * as ReactDOM from 'react-dom';
2020-08-13 01:57:09 +09:00
import { TagInput as TagInput2 } from './components/TagInput2';
export const bus = new Vue({ name: 'EventBus' });
export enum MetadataLoadState {
Inactive,
Loading,
Success,
Failed,
}
2020-08-13 00:38:26 +09:00
export type Metadata = {
url: string;
title: string;
description: string;
image: string;
expires_at: string | null;
tags: {
name: string;
}[];
};
2019-06-01 00:40:35 +09:00
new Vue({
el: '#app',
data: {
metadata: null,
metadataLoadState: MetadataLoadState.Inactive,
},
2019-06-01 00:40:35 +09:00
components: {
TagInput,
MetadataPreview,
},
mounted() {
// オカズリンクにURLがセットされている場合は、すぐにメタデータを取得する
const linkInput = this.$el.querySelector<HTMLInputElement>('#link');
if (linkInput && /^https?:\/\//.test(linkInput.value)) {
this.fetchMetadata(linkInput.value);
}
},
methods: {
// オカズリンクの変更時
onChangeLink(event: Event) {
if (event.target instanceof HTMLInputElement) {
const url = event.target.value;
if (url.trim() === '' || !/^https?:\/\//.test(url)) {
this.metadata = null;
this.metadataLoadState = MetadataLoadState.Inactive;
return;
}
this.fetchMetadata(url);
}
},
// メタデータの取得
fetchMetadata(url: string) {
this.metadataLoadState = MetadataLoadState.Loading;
2020-08-06 21:31:53 +09:00
fetchGet('/api/checkin/card', { url })
.then((response) => {
if (!response.ok) {
throw new ResponseError(response);
}
return response.json();
})
.then((data) => {
this.metadata = data;
this.metadataLoadState = MetadataLoadState.Success;
})
2020-08-06 21:31:53 +09:00
.catch(() => {
this.metadata = null;
this.metadataLoadState = MetadataLoadState.Failed;
});
},
},
});
2020-05-17 17:11:35 +09:00
ReactDOM.render(
2020-08-13 00:38:26 +09:00
<TagInput2 id={'tagInput2'} name={'tags2'} value={''} isInvalid={false} />,
2020-05-17 17:11:35 +09:00
document.querySelector('#tagInput2')
);