From 90f8fe7e538bb7e52d2558152a0390e693f39b11 Mon Sep 17 00:00:00 2001
From: Akihiko Odaki <nekomanma@pixiv.co.jp>
Date: Thu, 29 Mar 2018 01:20:40 +0900
Subject: Introduce processor

---
 src/server/web/app/dev/views/new-app.vue | 105 +++++++++++++++++++++++++++++++
 1 file changed, 105 insertions(+)
 create mode 100644 src/server/web/app/dev/views/new-app.vue

(limited to 'src/server/web/app/dev/views/new-app.vue')

diff --git a/src/server/web/app/dev/views/new-app.vue b/src/server/web/app/dev/views/new-app.vue
new file mode 100644
index 0000000000..344e8468f9
--- /dev/null
+++ b/src/server/web/app/dev/views/new-app.vue
@@ -0,0 +1,105 @@
+<template>
+<mk-ui>
+	<b-card header="アプリケーションの作成">
+		<b-form @submit.prevent="onSubmit" autocomplete="off">
+			<b-form-group label="アプリケーション名" description="あなたのアプリの名称。">
+				<b-form-input v-model="name" type="text" placeholder="ex) Misskey for iOS" autocomplete="off" required/>
+			</b-form-group>
+			<b-form-group label="ID" description="あなたのアプリのID。">
+				<b-input v-model="nid" type="text" pattern="^[a-zA-Z0-9-]{3,30}$" placeholder="ex) misskey-for-ios" autocomplete="off" required/>
+				<p class="info" v-if="nidState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%確認しています...</p>
+				<p class="info" v-if="nidState == 'ok'" style="color:#3CB7B5">%fa:fw check%利用できます</p>
+				<p class="info" v-if="nidState == 'unavailable'" style="color:#FF1161">%fa:fw exclamation-triangle%既に利用されています</p>
+				<p class="info" v-if="nidState == 'error'" style="color:#FF1161">%fa:fw exclamation-triangle%通信エラー</p>
+				<p class="info" v-if="nidState == 'invalid-format'" style="color:#FF1161">%fa:fw exclamation-triangle%a~z、A~Z、0~9、-(ハイフン)が使えます</p>
+				<p class="info" v-if="nidState == 'min-range'" style="color:#FF1161">%fa:fw exclamation-triangle%3文字以上でお願いします！</p>
+				<p class="info" v-if="nidState == 'max-range'" style="color:#FF1161">%fa:fw exclamation-triangle%30文字以内でお願いします</p>
+			</b-form-group>
+			<b-form-group label="アプリの概要" description="あなたのアプリの簡単な説明や紹介。">
+				<b-textarea v-model="description" placeholder="ex) Misskey iOSクライアント。" autocomplete="off" required></b-textarea>
+			</b-form-group>
+			<b-form-group label="コールバックURL (オプション)" description="ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。">
+				<b-input v-model="cb" type="url" placeholder="ex) https://your.app.example.com/callback.php" autocomplete="off"/>
+			</b-form-group>
+			<b-card header="権限">
+				<b-form-group description="ここで要求した機能だけがAPIからアクセスできます。">
+					<b-alert show variant="warning">%fa:exclamation-triangle%アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。</b-alert>
+					<b-form-checkbox-group v-model="permission" stacked>
+						<b-form-checkbox value="account-read">アカウントの情報を見る。</b-form-checkbox>
+						<b-form-checkbox value="account-write">アカウントの情報を操作する。</b-form-checkbox>
+						<b-form-checkbox value="post-write">投稿する。</b-form-checkbox>
+						<b-form-checkbox value="reaction-write">リアクションしたりリアクションをキャンセルする。</b-form-checkbox>
+						<b-form-checkbox value="following-write">フォローしたりフォロー解除する。</b-form-checkbox>
+						<b-form-checkbox value="drive-read">ドライブを見る。</b-form-checkbox>
+						<b-form-checkbox value="drive-write">ドライブを操作する。</b-form-checkbox>
+						<b-form-checkbox value="notification-read">通知を見る。</b-form-checkbox>
+						<b-form-checkbox value="notification-write">通知を操作する。</b-form-checkbox>
+					</b-form-checkbox-group>
+				</b-form-group>
+			</b-card>
+			<hr>
+			<b-button type="submit" variant="primary">アプリ作成</b-button>
+		</b-form>
+	</b-card>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({
+	data() {
+		return {
+			name: '',
+			nid: '',
+			description: '',
+			cb: '',
+			nidState: null,
+			permission: []
+		};
+	},
+	watch: {
+		nid() {
+			if (this.nid == null || this.nid == '') {
+				this.nidState = null;
+				return;
+			}
+
+			const err =
+				!this.nid.match(/^[a-zA-Z0-9\-]+$/) ? 'invalid-format' :
+				this.nid.length < 3                 ? 'min-range' :
+				this.nid.length > 30                ? 'max-range' :
+				null;
+
+			if (err) {
+				this.nidState = err;
+				return;
+			}
+
+			this.nidState = 'wait';
+
+			(this as any).api('app/name_id/available', {
+				name_id: this.nid
+			}).then(result => {
+				this.nidState = result.available ? 'ok' : 'unavailable';
+			}).catch(err => {
+				this.nidState = 'error';
+			});
+		}
+	},
+	methods: {
+		onSubmit() {
+			(this as any).api('app/create', {
+				name: this.name,
+				name_id: this.nid,
+				description: this.description,
+				callback_url: this.cb,
+				permission: this.permission
+			}).then(() => {
+				location.href = '/apps';
+			}).catch(() => {
+				alert('アプリの作成に失敗しました。再度お試しください。');
+			});
+		}
+	}
+});
+</script>
-- 
cgit v1.2.3-freya

