summaryrefslogtreecommitdiff
path: root/src/client/app/common/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/app/common/scripts')
-rw-r--r--src/client/app/common/scripts/search.ts64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/client/app/common/scripts/search.ts b/src/client/app/common/scripts/search.ts
new file mode 100644
index 0000000000..c44581817b
--- /dev/null
+++ b/src/client/app/common/scripts/search.ts
@@ -0,0 +1,64 @@
+import { faHistory } from '@fortawesome/free-solid-svg-icons';
+
+export async function search(v: any, q: string) {
+ q = q.trim();
+
+ if (q.startsWith('@')) {
+ v.$router.push(`/${q}`);
+ return;
+ }
+
+ if (q.startsWith('#')) {
+ v.$router.push(`/tags/${encodeURIComponent(q.substr(1))}`);
+ return;
+ }
+
+ // like 2018/03/12
+ if (/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}/.test(q.replace(/-/g, '/'))) {
+ const date = new Date(q.replace(/-/g, '/'));
+
+ // 日付しか指定されてない場合、例えば 2018/03/12 ならユーザーは
+ // 2018/03/12 のコンテンツを「含む」結果になることを期待するはずなので
+ // 23時間59分進める(そのままだと 2018/03/12 00:00:00 「まで」の
+ // 結果になってしまい、2018/03/12 のコンテンツは含まれない)
+ if (q.replace(/-/g, '/').match(/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$/)) {
+ date.setHours(23, 59, 59, 999);
+ }
+
+ v.$root.$emit('warp', date);
+ v.$root.dialog({
+ icon: faHistory,
+ splash: true,
+ });
+ return;
+ }
+
+ if (q.startsWith('https://')) {
+ const dialog = v.$root.dialog({
+ type: 'waiting',
+ text: v.$t('@.fetching-as-ap-object'),
+ showOkButton: false,
+ showCancelButton: false,
+ cancelableByBgClick: false
+ });
+
+ try {
+ const res = await v.$root.api('ap/show', {
+ uri: q
+ });
+ dialog.close();
+ if (res.type == 'User') {
+ v.$router.push(`/@${res.object.username}@${res.object.host}`);
+ } else if (res.type == 'Note') {
+ v.$router.push(`/notes/${res.object.id}`);
+ }
+ } catch (e) {
+ dialog.close();
+ // TODO: Show error
+ }
+
+ return;
+ }
+
+ v.$router.push(`/search?q=${encodeURIComponent(q)}`);
+}