wip
This commit is contained in:
		
							parent
							
								
									e770cd6f55
								
							
						
					
					
						commit
						f37fb38640
					
				
					 25 changed files with 189 additions and 86 deletions
				
			
		|  | @ -25,6 +25,7 @@ Note that Misskey uses following subdomains: | ||||||
| * **api**.*{primary domain}* | * **api**.*{primary domain}* | ||||||
| * **auth**.*{primary domain}* | * **auth**.*{primary domain}* | ||||||
| * **about**.*{primary domain}* | * **about**.*{primary domain}* | ||||||
|  | * **ch**.*{primary domain}* | ||||||
| * **stats**.*{primary domain}* | * **stats**.*{primary domain}* | ||||||
| * **status**.*{primary domain}* | * **status**.*{primary domain}* | ||||||
| * **dev**.*{primary domain}* | * **dev**.*{primary domain}* | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ Misskeyは以下のサブドメインを使います: | ||||||
| * **api**.*{primary domain}* | * **api**.*{primary domain}* | ||||||
| * **auth**.*{primary domain}* | * **auth**.*{primary domain}* | ||||||
| * **about**.*{primary domain}* | * **about**.*{primary domain}* | ||||||
|  | * **ch**.*{primary domain}* | ||||||
| * **stats**.*{primary domain}* | * **stats**.*{primary domain}* | ||||||
| * **status**.*{primary domain}* | * **status**.*{primary domain}* | ||||||
| * **dev**.*{primary domain}* | * **dev**.*{primary domain}* | ||||||
|  |  | ||||||
|  | @ -164,6 +164,12 @@ common: | ||||||
|     mk-uploader: |     mk-uploader: | ||||||
|       waiting: "Waiting" |       waiting: "Waiting" | ||||||
| 
 | 
 | ||||||
|  | ch: | ||||||
|  |   tags: | ||||||
|  |     mk-index: | ||||||
|  |       new: "Create new channel" | ||||||
|  |       channel-title: "Channel title" | ||||||
|  | 
 | ||||||
| desktop: | desktop: | ||||||
|   tags: |   tags: | ||||||
|     mk-api-info: |     mk-api-info: | ||||||
|  | @ -241,7 +247,7 @@ desktop: | ||||||
|     mk-ui-header-nav: |     mk-ui-header-nav: | ||||||
|       home: "Home" |       home: "Home" | ||||||
|       messaging: "Messages" |       messaging: "Messages" | ||||||
|       channels: "Channels" |       ch: "Channels" | ||||||
|       info: "News" |       info: "News" | ||||||
| 
 | 
 | ||||||
|     mk-ui-header-search: |     mk-ui-header-search: | ||||||
|  | @ -352,10 +358,6 @@ desktop: | ||||||
|     mk-repost-form-window: |     mk-repost-form-window: | ||||||
|       title: "Are you sure you want to repost this post?" |       title: "Are you sure you want to repost this post?" | ||||||
| 
 | 
 | ||||||
|     mk-channels-page: |  | ||||||
|       new: "Create new channel" |  | ||||||
|       channel-title: "Channel title" |  | ||||||
| 
 |  | ||||||
| mobile: | mobile: | ||||||
|   tags: |   tags: | ||||||
|     mk-drive-file-viewer: |     mk-drive-file-viewer: | ||||||
|  | @ -496,6 +498,7 @@ mobile: | ||||||
|       home: "Home" |       home: "Home" | ||||||
|       notifications: "Notifications" |       notifications: "Notifications" | ||||||
|       messaging: "Messages" |       messaging: "Messages" | ||||||
|  |       ch: "Channels" | ||||||
|       drive: "Drive" |       drive: "Drive" | ||||||
|       settings: "Settings" |       settings: "Settings" | ||||||
|       about: "About Misskey" |       about: "About Misskey" | ||||||
|  |  | ||||||
|  | @ -164,6 +164,12 @@ common: | ||||||
|     mk-uploader: |     mk-uploader: | ||||||
|       waiting: "待機中" |       waiting: "待機中" | ||||||
| 
 | 
 | ||||||
|  | ch: | ||||||
|  |   tags: | ||||||
|  |     mk-index: | ||||||
|  |       new: "チャンネルを作成" | ||||||
|  |       channel-title: "チャンネルのタイトル" | ||||||
|  | 
 | ||||||
| desktop: | desktop: | ||||||
|   tags: |   tags: | ||||||
|     mk-api-info: |     mk-api-info: | ||||||
|  | @ -241,7 +247,7 @@ desktop: | ||||||
|     mk-ui-header-nav: |     mk-ui-header-nav: | ||||||
|       home: "ホーム" |       home: "ホーム" | ||||||
|       messaging: "メッセージ" |       messaging: "メッセージ" | ||||||
|       channels: "チャンネル" |       ch: "チャンネル" | ||||||
|       info: "お知らせ" |       info: "お知らせ" | ||||||
| 
 | 
 | ||||||
|     mk-ui-header-search: |     mk-ui-header-search: | ||||||
|  | @ -352,10 +358,6 @@ desktop: | ||||||
|     mk-repost-form-window: |     mk-repost-form-window: | ||||||
|       title: "この投稿をRepostしますか?" |       title: "この投稿をRepostしますか?" | ||||||
| 
 | 
 | ||||||
|     mk-channels-page: |  | ||||||
|       new: "チャンネルを作成" |  | ||||||
|       channel-title: "チャンネルのタイトル" |  | ||||||
| 
 |  | ||||||
| mobile: | mobile: | ||||||
|   tags: |   tags: | ||||||
|     mk-drive-file-viewer: |     mk-drive-file-viewer: | ||||||
|  | @ -496,6 +498,7 @@ mobile: | ||||||
|       home: "ホーム" |       home: "ホーム" | ||||||
|       notifications: "通知" |       notifications: "通知" | ||||||
|       messaging: "メッセージ" |       messaging: "メッセージ" | ||||||
|  |       ch: "チャンネル" | ||||||
|       search: "検索" |       search: "検索" | ||||||
|       drive: "ドライブ" |       drive: "ドライブ" | ||||||
|       settings: "設定" |       settings: "設定" | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ import Watching from '../../models/post-watching'; | ||||||
| import serialize from '../../serializers/post'; | import serialize from '../../serializers/post'; | ||||||
| import notify from '../../common/notify'; | import notify from '../../common/notify'; | ||||||
| import watch from '../../common/watch-post'; | import watch from '../../common/watch-post'; | ||||||
| import event from '../../event'; | import { default as event, publishChannelStream } from '../../event'; | ||||||
| import config from '../../../conf'; | import config from '../../../conf'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | @ -258,6 +258,11 @@ module.exports = (params, user: IUser, app) => new Promise(async (res, rej) => { | ||||||
| 	// Publish event to myself's stream
 | 	// Publish event to myself's stream
 | ||||||
| 	event(user._id, 'post', postObj); | 	event(user._id, 'post', postObj); | ||||||
| 
 | 
 | ||||||
|  | 	// Publish event to channel
 | ||||||
|  | 	if (channel) { | ||||||
|  | 		publishChannelStream(channel._id, 'post', postObj); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// Fetch all followers
 | 	// Fetch all followers
 | ||||||
| 	const followers = await Following | 	const followers = await Following | ||||||
| 		.find({ | 		.find({ | ||||||
|  |  | ||||||
|  | @ -25,6 +25,10 @@ class MisskeyEvent { | ||||||
| 		this.publish(`messaging-stream:${userId}-${otherpartyId}`, type, typeof value === 'undefined' ? null : value); | 		this.publish(`messaging-stream:${userId}-${otherpartyId}`, type, typeof value === 'undefined' ? null : value); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	public publishChannelStream(channelId: ID, type: string, value?: any): void { | ||||||
|  | 		this.publish(`channel-stream:${channelId}`, type, typeof value === 'undefined' ? null : value); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	private publish(channel: string, type: string, value?: any): void { | 	private publish(channel: string, type: string, value?: any): void { | ||||||
| 		const message = value == null ? | 		const message = value == null ? | ||||||
| 			{ type: type } : | 			{ type: type } : | ||||||
|  | @ -41,3 +45,5 @@ export default ev.publishUserStream.bind(ev); | ||||||
| export const publishPostStream = ev.publishPostStream.bind(ev); | export const publishPostStream = ev.publishPostStream.bind(ev); | ||||||
| 
 | 
 | ||||||
| export const publishMessagingStream = ev.publishMessagingStream.bind(ev); | export const publishMessagingStream = ev.publishMessagingStream.bind(ev); | ||||||
|  | 
 | ||||||
|  | export const publishChannelStream = ev.publishChannelStream.bind(ev); | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								src/api/stream/channel.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/api/stream/channel.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | ||||||
|  | import * as websocket from 'websocket'; | ||||||
|  | import * as redis from 'redis'; | ||||||
|  | 
 | ||||||
|  | export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient): void { | ||||||
|  | 	const channel = request.resourceURL.query.channel; | ||||||
|  | 
 | ||||||
|  | 	// Subscribe channel stream
 | ||||||
|  | 	subscriber.subscribe(`misskey:channel-stream:${channel}`); | ||||||
|  | 	subscriber.on('message', (_, data) => { | ||||||
|  | 		connection.send(data); | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | @ -9,6 +9,7 @@ import isNativeToken from './common/is-native-token'; | ||||||
| import homeStream from './stream/home'; | import homeStream from './stream/home'; | ||||||
| import messagingStream from './stream/messaging'; | import messagingStream from './stream/messaging'; | ||||||
| import serverStream from './stream/server'; | import serverStream from './stream/server'; | ||||||
|  | import channelStream from './stream/channel'; | ||||||
| 
 | 
 | ||||||
| module.exports = (server: http.Server) => { | module.exports = (server: http.Server) => { | ||||||
| 	/** | 	/** | ||||||
|  | @ -26,14 +27,6 @@ module.exports = (server: http.Server) => { | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		const user = await authenticate(request.resourceURL.query.i); |  | ||||||
| 
 |  | ||||||
| 		if (user == null) { |  | ||||||
| 			connection.send('authentication-failed'); |  | ||||||
| 			connection.close(); |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Connect to Redis
 | 		// Connect to Redis
 | ||||||
| 		const subscriber = redis.createClient( | 		const subscriber = redis.createClient( | ||||||
| 			config.redis.port, config.redis.host); | 			config.redis.port, config.redis.host); | ||||||
|  | @ -43,6 +36,19 @@ module.exports = (server: http.Server) => { | ||||||
| 			subscriber.quit(); | 			subscriber.quit(); | ||||||
| 		}); | 		}); | ||||||
| 
 | 
 | ||||||
|  | 		if (request.resourceURL.pathname === '/channel') { | ||||||
|  | 			channelStream(request, connection, subscriber); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		const user = await authenticate(request.resourceURL.query.i); | ||||||
|  | 
 | ||||||
|  | 		if (user == null) { | ||||||
|  | 			connection.send('authentication-failed'); | ||||||
|  | 			connection.close(); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		const channel = | 		const channel = | ||||||
| 			request.resourceURL.pathname === '/' ? homeStream : | 			request.resourceURL.pathname === '/' ? homeStream : | ||||||
| 			request.resourceURL.pathname === '/messaging' ? messagingStream : | 			request.resourceURL.pathname === '/messaging' ? messagingStream : | ||||||
|  |  | ||||||
|  | @ -88,6 +88,7 @@ type Mixin = { | ||||||
| 	api_url: string; | 	api_url: string; | ||||||
| 	auth_url: string; | 	auth_url: string; | ||||||
| 	about_url: string; | 	about_url: string; | ||||||
|  | 	ch_url: stirng; | ||||||
| 	stats_url: string; | 	stats_url: string; | ||||||
| 	status_url: string; | 	status_url: string; | ||||||
| 	dev_url: string; | 	dev_url: string; | ||||||
|  | @ -122,6 +123,7 @@ export default function load() { | ||||||
| 	mixin.secondary_scheme = config.secondary_url.substr(0, config.secondary_url.indexOf('://')); | 	mixin.secondary_scheme = config.secondary_url.substr(0, config.secondary_url.indexOf('://')); | ||||||
| 	mixin.api_url = `${mixin.scheme}://api.${mixin.host}`; | 	mixin.api_url = `${mixin.scheme}://api.${mixin.host}`; | ||||||
| 	mixin.auth_url = `${mixin.scheme}://auth.${mixin.host}`; | 	mixin.auth_url = `${mixin.scheme}://auth.${mixin.host}`; | ||||||
|  | 	mixin.ch_url = `${mixin.scheme}://ch.${mixin.host}`; | ||||||
| 	mixin.dev_url = `${mixin.scheme}://dev.${mixin.host}`; | 	mixin.dev_url = `${mixin.scheme}://dev.${mixin.host}`; | ||||||
| 	mixin.about_url = `${mixin.scheme}://about.${mixin.host}`; | 	mixin.about_url = `${mixin.scheme}://about.${mixin.host}`; | ||||||
| 	mixin.stats_url = `${mixin.scheme}://stats.${mixin.host}`; | 	mixin.stats_url = `${mixin.scheme}://stats.${mixin.host}`; | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								src/web/app/ch/router.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/web/app/ch/router.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | ||||||
|  | import * as riot from 'riot'; | ||||||
|  | const route = require('page'); | ||||||
|  | let page = null; | ||||||
|  | 
 | ||||||
|  | export default me => { | ||||||
|  | 	route('/',         index); | ||||||
|  | 	route('/:channel', channel); | ||||||
|  | 	route('*',         notFound); | ||||||
|  | 
 | ||||||
|  | 	function index() { | ||||||
|  | 		mount(document.createElement('mk-index')); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	function channel(ctx) { | ||||||
|  | 		const el = document.createElement('mk-channel'); | ||||||
|  | 		el.setAttribute('id', ctx.params.channel); | ||||||
|  | 		mount(el); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	function notFound() { | ||||||
|  | 		mount(document.createElement('mk-not-found')); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// EXEC
 | ||||||
|  | 	route(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | function mount(content) { | ||||||
|  | 	if (page) page.unmount(); | ||||||
|  | 	const body = document.getElementById('app'); | ||||||
|  | 	page = riot.mount(body.appendChild(content))[0]; | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								src/web/app/ch/script.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/web/app/ch/script.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | /** | ||||||
|  |  * Channels | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | // Style
 | ||||||
|  | import './style.styl'; | ||||||
|  | 
 | ||||||
|  | require('./tags'); | ||||||
|  | import init from '../init'; | ||||||
|  | import route from './router'; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * init | ||||||
|  |  */ | ||||||
|  | init(me => { | ||||||
|  | 	// Start routing
 | ||||||
|  | 	route(me); | ||||||
|  | }); | ||||||
							
								
								
									
										4
									
								
								src/web/app/ch/style.styl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/web/app/ch/style.styl
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,4 @@ | ||||||
|  | @import "../base" | ||||||
|  | 
 | ||||||
|  | html | ||||||
|  | 	background #efefef | ||||||
|  | @ -1,14 +1,19 @@ | ||||||
| <mk-channel-page> | <mk-channel> | ||||||
| 	<mk-ui ref="ui"> | 	<main if={ !fetching }> | ||||||
| 		<main if={ !parent.fetching }> | 		<h1>{ channel.title }</h1> | ||||||
| 			<h1>{ parent.channel.title }</h1> | 		<virtual if={ posts }> | ||||||
| 			<virtual if={ parent.posts }> | 			<mk-channel-post each={ posts.slice().reverse() } post={ this } form={ parent.refs.form }/> | ||||||
| 				<mk-channel-post each={ parent.posts.reverse() } post={ this } form={ parent.refs.form }/> |  | ||||||
| 		</virtual> | 		</virtual> | ||||||
| 		<hr> | 		<hr> | ||||||
| 			<mk-channel-form channel={ parent.channel } ref="form"/> | 		<mk-channel-form if={ SIGNIN } channel={ channel } ref="form"/> | ||||||
|  | 		<div if={ !SIGNIN }> | ||||||
|  | 			<p>参加するには<a href={ CONFIG.url }>ログインまたは新規登録</a>してください</p> | ||||||
|  | 		</div> | ||||||
|  | 		<hr> | ||||||
|  | 		<footer> | ||||||
|  | 			<small>Misskey ver { version } (葵 aoi)</small> | ||||||
|  | 		</footer> | ||||||
| 	</main> | 	</main> | ||||||
| 	</mk-ui> |  | ||||||
| 	<style> | 	<style> | ||||||
| 		:scope | 		:scope | ||||||
| 			display block | 			display block | ||||||
|  | @ -20,16 +25,18 @@ | ||||||
| 					color #f00 | 					color #f00 | ||||||
| 	</style> | 	</style> | ||||||
| 	<script> | 	<script> | ||||||
| 		import Progress from '../../../common/scripts/loading'; | 		import Progress from '../../common/scripts/loading'; | ||||||
| 		import ChannelStream from '../../../common/scripts/channel-stream'; | 		import ChannelStream from '../../common/scripts/channel-stream'; | ||||||
| 
 | 
 | ||||||
|  | 		this.mixin('i'); | ||||||
| 		this.mixin('api'); | 		this.mixin('api'); | ||||||
| 
 | 
 | ||||||
| 		this.id = this.opts.id; | 		this.id = this.opts.id; | ||||||
| 		this.fetching = true; | 		this.fetching = true; | ||||||
| 		this.channel = null; | 		this.channel = null; | ||||||
| 		this.posts = null; | 		this.posts = null; | ||||||
| 		this.connection = new ChannelStream(); | 		this.connection = new ChannelStream(this.id); | ||||||
|  | 		this.version = VERSION; | ||||||
| 
 | 
 | ||||||
| 		this.on('mount', () => { | 		this.on('mount', () => { | ||||||
| 			document.documentElement.style.background = '#efefef'; | 			document.documentElement.style.background = '#efefef'; | ||||||
|  | @ -56,9 +63,22 @@ | ||||||
| 					posts: posts | 					posts: posts | ||||||
| 				}); | 				}); | ||||||
| 			}); | 			}); | ||||||
|  | 
 | ||||||
|  | 			this.connection.on('post', this.onPost); | ||||||
| 		}); | 		}); | ||||||
|  | 
 | ||||||
|  | 		this.on('unmount', () => { | ||||||
|  | 			this.connection.off('post', this.onPost); | ||||||
|  | 			this.connection.close(); | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		this.onPost = post => { | ||||||
|  | 			this.posts.unshift(post); | ||||||
|  | 			this.update(); | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
| 	</script> | 	</script> | ||||||
| </mk-channel-page> | </mk-channel> | ||||||
| 
 | 
 | ||||||
| <mk-channel-post> | <mk-channel-post> | ||||||
| 	<header> | 	<header> | ||||||
|  | @ -127,7 +147,7 @@ | ||||||
| 
 | 
 | ||||||
| 	</style> | 	</style> | ||||||
| 	<script> | 	<script> | ||||||
| 		import CONFIG from '../../../common/scripts/config'; | 		import CONFIG from '../../common/scripts/config'; | ||||||
| 
 | 
 | ||||||
| 		this.mixin('api'); | 		this.mixin('api'); | ||||||
| 
 | 
 | ||||||
							
								
								
									
										2
									
								
								src/web/app/ch/tags/index.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								src/web/app/ch/tags/index.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | ||||||
|  | require('./index.tag'); | ||||||
|  | require('./channel.tag'); | ||||||
							
								
								
									
										24
									
								
								src/web/app/ch/tags/index.tag
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/web/app/ch/tags/index.tag
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | <mk-index> | ||||||
|  | 	<button onclick={ new }>%i18n:ch.tags.mk-index.new%</button> | ||||||
|  | 	<style> | ||||||
|  | 		:scope | ||||||
|  | 			display block | ||||||
|  | 
 | ||||||
|  | 	</style> | ||||||
|  | 	<script> | ||||||
|  | 		this.mixin('api'); | ||||||
|  | 
 | ||||||
|  | 		this.on('mount', () => { | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		this.new = () => { | ||||||
|  | 			const title = window.prompt('%i18n:ch.tags.mk-index.channel-title%'); | ||||||
|  | 
 | ||||||
|  | 			this.api('channels/create', { | ||||||
|  | 				title: title | ||||||
|  | 			}).then(channel => { | ||||||
|  | 				location.href = '/' + channel.id; | ||||||
|  | 			}); | ||||||
|  | 		}; | ||||||
|  | 	</script> | ||||||
|  | </mk-index> | ||||||
|  | @ -6,8 +6,10 @@ import Stream from './stream'; | ||||||
|  * Channel stream connection |  * Channel stream connection | ||||||
|  */ |  */ | ||||||
| class Connection extends Stream { | class Connection extends Stream { | ||||||
| 	constructor() { | 	constructor(channelId) { | ||||||
| 		super('channel'); | 		super('channel', { | ||||||
|  | 			channel: channelId | ||||||
|  | 		}); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ const host = isRoot ? Url.host : Url.host.substring(Url.host.indexOf('.') + 1, U | ||||||
| const scheme = Url.protocol; | const scheme = Url.protocol; | ||||||
| const url = `${scheme}//${host}`; | const url = `${scheme}//${host}`; | ||||||
| const apiUrl = `${scheme}//api.${host}`; | const apiUrl = `${scheme}//api.${host}`; | ||||||
|  | const chUrl = `${scheme}//ch.${host}`; | ||||||
| const devUrl = `${scheme}//dev.${host}`; | const devUrl = `${scheme}//dev.${host}`; | ||||||
| const aboutUrl = `${scheme}//about.${host}`; | const aboutUrl = `${scheme}//about.${host}`; | ||||||
| const statsUrl = `${scheme}//stats.${host}`; | const statsUrl = `${scheme}//stats.${host}`; | ||||||
|  | @ -16,6 +17,7 @@ export default { | ||||||
| 	scheme, | 	scheme, | ||||||
| 	url, | 	url, | ||||||
| 	apiUrl, | 	apiUrl, | ||||||
|  | 	chUrl, | ||||||
| 	devUrl, | 	devUrl, | ||||||
| 	aboutUrl, | 	aboutUrl, | ||||||
| 	statsUrl, | 	statsUrl, | ||||||
|  |  | ||||||
|  | @ -10,8 +10,6 @@ export default me => { | ||||||
| 	route('/',                 index); | 	route('/',                 index); | ||||||
| 	route('/selectdrive',      selectDrive); | 	route('/selectdrive',      selectDrive); | ||||||
| 	route('/i>mentions',       mentions); | 	route('/i>mentions',       mentions); | ||||||
| 	route('/channel',          channels); |  | ||||||
| 	route('/channel/:channel', channel); |  | ||||||
| 	route('/post::post',       post); | 	route('/post::post',       post); | ||||||
| 	route('/search::query',    search); | 	route('/search::query',    search); | ||||||
| 	route('/:user',            user.bind(null, 'home')); | 	route('/:user',            user.bind(null, 'home')); | ||||||
|  | @ -57,16 +55,6 @@ export default me => { | ||||||
| 		mount(el); | 		mount(el); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function channel(ctx) { |  | ||||||
| 		const el = document.createElement('mk-channel-page'); |  | ||||||
| 		el.setAttribute('id', ctx.params.channel); |  | ||||||
| 		mount(el); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function channels() { |  | ||||||
| 		mount(document.createElement('mk-channels-page')); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function selectDrive() { | 	function selectDrive() { | ||||||
| 		mount(document.createElement('mk-selectdrive-page')); | 		mount(document.createElement('mk-selectdrive-page')); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -61,8 +61,6 @@ require('./pages/user.tag'); | ||||||
| require('./pages/post.tag'); | require('./pages/post.tag'); | ||||||
| require('./pages/search.tag'); | require('./pages/search.tag'); | ||||||
| require('./pages/not-found.tag'); | require('./pages/not-found.tag'); | ||||||
| require('./pages/channel.tag'); |  | ||||||
| require('./pages/channels.tag'); |  | ||||||
| require('./pages/selectdrive.tag'); | require('./pages/selectdrive.tag'); | ||||||
| require('./autocomplete-suggestion.tag'); | require('./autocomplete-suggestion.tag'); | ||||||
| require('./progress-dialog.tag'); | require('./progress-dialog.tag'); | ||||||
|  |  | ||||||
|  | @ -1,28 +0,0 @@ | ||||||
| <mk-channels-page> |  | ||||||
| 	<mk-ui ref="ui"> |  | ||||||
| 		<main> |  | ||||||
| 			<button onclick={ parent.new }>%i18n:desktop.tags.mk-channels-page.new%</button> |  | ||||||
| 		</main> |  | ||||||
| 	</mk-ui> |  | ||||||
| 	<style> |  | ||||||
| 		:scope |  | ||||||
| 			display block |  | ||||||
| 
 |  | ||||||
| 	</style> |  | ||||||
| 	<script> |  | ||||||
| 		this.mixin('api'); |  | ||||||
| 
 |  | ||||||
| 		this.on('mount', () => { |  | ||||||
| 		}); |  | ||||||
| 
 |  | ||||||
| 		this.new = () => { |  | ||||||
| 			const title = window.prompt('%i18n:desktop.tags.mk-channels-page.channel-title%'); |  | ||||||
| 
 |  | ||||||
| 			this.api('channels/create', { |  | ||||||
| 				title: title |  | ||||||
| 			}).then(channel => { |  | ||||||
| 				location.href = '/channel/' + channel.id; |  | ||||||
| 			}); |  | ||||||
| 		}; |  | ||||||
| 	</script> |  | ||||||
| </mk-channels-page> |  | ||||||
|  | @ -112,7 +112,7 @@ | ||||||
| 			</header> | 			</header> | ||||||
| 			<div class="body"> | 			<div class="body"> | ||||||
| 				<div class="text" ref="text"> | 				<div class="text" ref="text"> | ||||||
| 					<p class="channel" if={ p.channel != null }><a href={ '/channel/' + p.channel.id }>{ p.channel.title }</a>:</p> | 					<p class="channel" if={ p.channel != null }><a href={ CONFIG.chUrl + '/' + p.channel.id } target="_blank">{ p.channel.title }</a>:</p> | ||||||
| 					<a class="reply" if={ p.reply_to }> | 					<a class="reply" if={ p.reply_to }> | ||||||
| 						<i class="fa fa-reply"></i> | 						<i class="fa fa-reply"></i> | ||||||
| 					</a> | 					</a> | ||||||
|  |  | ||||||
|  | @ -335,10 +335,10 @@ | ||||||
| 				</a> | 				</a> | ||||||
| 			</li> | 			</li> | ||||||
| 		</virtual> | 		</virtual> | ||||||
| 		<li class="channels"> | 		<li class="ch"> | ||||||
| 			<a href={ CONFIG.url + '/channel' }> | 			<a href={ CONFIG.chUrl } target="_blank"> | ||||||
| 				<i class="fa fa-television"></i> | 				<i class="fa fa-television"></i> | ||||||
| 				<p>%i18n:desktop.tags.mk-ui-header-nav.channels%</p> | 				<p>%i18n:desktop.tags.mk-ui-header-nav.ch%</p> | ||||||
| 			</a> | 			</a> | ||||||
| 		</li> | 		</li> | ||||||
| 		<li class="info"> | 		<li class="info"> | ||||||
|  |  | ||||||
|  | @ -164,7 +164,7 @@ | ||||||
| 			</header> | 			</header> | ||||||
| 			<div class="body"> | 			<div class="body"> | ||||||
| 				<div class="text" ref="text"> | 				<div class="text" ref="text"> | ||||||
| 					<p class="channel" if={ p.channel != null }><a href={ '/channel/' + p.channel.id }>{ p.channel.title }</a>:</p> | 					<p class="channel" if={ p.channel != null }><a href={ CONFIG.chUrl + '/' + p.channel.id } target="_blank">{ p.channel.title }</a>:</p> | ||||||
| 					<a class="reply" if={ p.reply_to }> | 					<a class="reply" if={ p.reply_to }> | ||||||
| 						<i class="fa fa-reply"></i> | 						<i class="fa fa-reply"></i> | ||||||
| 					</a> | 					</a> | ||||||
|  |  | ||||||
|  | @ -231,10 +231,11 @@ | ||||||
| 				<li><a href="/i/messaging"><i class="fa fa-comments-o"></i>%i18n:mobile.tags.mk-ui-nav.messaging%<i class="i fa fa-circle" if={ hasUnreadMessagingMessages }></i><i class="fa fa-angle-right"></i></a></li> | 				<li><a href="/i/messaging"><i class="fa fa-comments-o"></i>%i18n:mobile.tags.mk-ui-nav.messaging%<i class="i fa fa-circle" if={ hasUnreadMessagingMessages }></i><i class="fa fa-angle-right"></i></a></li> | ||||||
| 			</ul> | 			</ul> | ||||||
| 			<ul> | 			<ul> | ||||||
| 				<li><a onclick={ search }><i class="fa fa-search"></i>%i18n:mobile.tags.mk-ui-nav.search%<i class="fa fa-angle-right"></i></a></li> | 				<li><a href={ CONFIG.chUrl } target="_blank"><i class="fa fa-television"></i>%i18n:mobile.tags.mk-ui-nav.ch%<i class="fa fa-angle-right"></i></a></li> | ||||||
|  | 				<li><a href="/i/drive"><i class="fa fa-cloud"></i>%i18n:mobile.tags.mk-ui-nav.drive%<i class="fa fa-angle-right"></i></a></li> | ||||||
| 			</ul> | 			</ul> | ||||||
| 			<ul> | 			<ul> | ||||||
| 				<li><a href="/i/drive"><i class="fa fa-cloud"></i>%i18n:mobile.tags.mk-ui-nav.drive%<i class="fa fa-angle-right"></i></a></li> | 				<li><a onclick={ search }><i class="fa fa-search"></i>%i18n:mobile.tags.mk-ui-nav.search%<i class="fa fa-angle-right"></i></a></li> | ||||||
| 			</ul> | 			</ul> | ||||||
| 			<ul> | 			<ul> | ||||||
| 				<li><a href="/i/settings"><i class="fa fa-cog"></i>%i18n:mobile.tags.mk-ui-nav.settings%<i class="fa fa-angle-right"></i></a></li> | 				<li><a href="/i/settings"><i class="fa fa-cog"></i>%i18n:mobile.tags.mk-ui-nav.settings%<i class="fa fa-angle-right"></i></a></li> | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ module.exports = langs.map(([lang, locale]) => { | ||||||
| 	const entry = { | 	const entry = { | ||||||
| 		desktop: './src/web/app/desktop/script.js', | 		desktop: './src/web/app/desktop/script.js', | ||||||
| 		mobile: './src/web/app/mobile/script.js', | 		mobile: './src/web/app/mobile/script.js', | ||||||
|  | 		ch: './src/web/app/ch/script.js', | ||||||
| 		stats: './src/web/app/stats/script.js', | 		stats: './src/web/app/stats/script.js', | ||||||
| 		status: './src/web/app/status/script.js', | 		status: './src/web/app/status/script.js', | ||||||
| 		dev: './src/web/app/dev/script.js', | 		dev: './src/web/app/dev/script.js', | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue