mirror of
https://git.joinsharkey.org/Sharkey/Sharkey.git
synced 2024-11-10 10:13:09 +02:00
wip
This commit is contained in:
parent
e8378c2bb8
commit
8fd6f24ee6
10 changed files with 231 additions and 207 deletions
|
@ -108,41 +108,43 @@
|
|||
<script>
|
||||
this.draw = () => {
|
||||
const now = new Date();
|
||||
nd = now.getDate()
|
||||
nm = now.getMonth()
|
||||
ny = now.getFullYear()
|
||||
const nd = now.getDate();
|
||||
const nm = now.getMonth();
|
||||
const ny = now.getFullYear();
|
||||
|
||||
this.year = ny
|
||||
this.month = nm + 1
|
||||
this.day = nd
|
||||
this.week-day = [\日 '月' \火 '水' \木 '金' \土][now.get-day!]
|
||||
this.year = ny;
|
||||
this.month = nm + 1;
|
||||
this.day = nd;
|
||||
this.weekDay = ['日', '月', '火', '水' '木', '金', '土'][now.getDay()];
|
||||
|
||||
@day-numer = (now - (new Date ny, nm, nd))
|
||||
@day-denom = 1000ms * 60s * 60m * 24h
|
||||
this.month-numer = (now - (new Date ny, nm, 1))
|
||||
this.month-denom = (new Date ny, nm + 1, 1) - (new Date ny, nm, 1)
|
||||
@year-numer = (now - (new Date ny, 0, 1))
|
||||
@year-denom = (new Date ny + 1, 0, 1) - (new Date ny, 0, 1)
|
||||
this.dayNumer = now - new Date(ny, nm, nd);
|
||||
this.dayDenom = 1000/*ms*/ * 60/*s*/ * 60/*m*/ * 24/*h*/;
|
||||
this.monthNumer = now - new Date(ny, nm, 1);
|
||||
this.monthDenom = new Date(ny, nm + 1, 1) - new Date(ny, nm, 1);
|
||||
this.yearNumer = now - new Date(ny, 0, 1);
|
||||
this.yearDenom = new Date(ny + 1, 0, 1) - new Date(ny, 0, 1);
|
||||
|
||||
@day-p = @day-numer / @day-denom * 100
|
||||
this.month-p = @month-numer / @month-denom * 100
|
||||
@year-p = @year-numer / @year-denom * 100
|
||||
this.dayP = this.dayNumer / this.dayDenom * 100;
|
||||
this.monthP = this.monthNumer / this.monthDenom * 100;
|
||||
this.yearP = this.yearNumer / this.yearDenom * 100;
|
||||
|
||||
this.is-holiday =
|
||||
(now.get-day! == 0 or now.get-day! == 6)
|
||||
this.isHoliday = now.getDay() == 0 || now.getDay() == 6;
|
||||
|
||||
this.special =
|
||||
| nm == 0 and nd == 1 => 'on-new-years-day'
|
||||
| _ => false
|
||||
nm == 0 && nd == 1 ? 'on-new-years-day' :
|
||||
false;
|
||||
|
||||
this.update();
|
||||
};
|
||||
|
||||
@draw!
|
||||
this.draw();
|
||||
|
||||
this.on('mount', () => {
|
||||
this.clock = setInterval @draw, 1000ms
|
||||
this.clock = setInterval(this.draw, 1000);
|
||||
});
|
||||
|
||||
this.on('unmount', () => {
|
||||
clearInterval @clock
|
||||
clearInterval(this.clock);
|
||||
});
|
||||
</script>
|
||||
</mk-calendar-home-widget>
|
||||
|
|
|
@ -49,64 +49,70 @@
|
|||
this.mixin('i');
|
||||
this.mixin('api');
|
||||
|
||||
this.is-loading = true
|
||||
this.is-empty = false
|
||||
this.more-loading = false
|
||||
this.mode = 'all'
|
||||
this.isLoading = true;
|
||||
this.isEmpty = false;
|
||||
this.moreLoading = false;
|
||||
this.mode = 'all';
|
||||
|
||||
this.on('mount', () => {
|
||||
document.addEventListener 'keydown' this.on-document-keydown
|
||||
window.addEventListener 'scroll' this.on-scroll
|
||||
document.addEventListener('keydown', this.onDocumentKeydown);
|
||||
window.addEventListener('scroll', this.onScroll);
|
||||
|
||||
@fetch =>
|
||||
this.trigger('loaded');
|
||||
this.fetch(() => this.trigger('loaded'));
|
||||
});
|
||||
|
||||
this.on('unmount', () => {
|
||||
document.removeEventListener 'keydown' this.on-document-keydown
|
||||
window.removeEventListener 'scroll' this.on-scroll
|
||||
document.removeEventListener('keydown', this.onDocumentKeydown);
|
||||
window.removeEventListener('scroll', this.onScroll);
|
||||
});
|
||||
|
||||
this.on-document-keydown = (e) => {
|
||||
tag = e.target.tag-name.to-lower-case!
|
||||
if tag != 'input' and tag != 'textarea'
|
||||
if e.which == 84 // t
|
||||
this.onDocumentKeydown = e => {
|
||||
if (e.target.tagName != 'INPUT' && tag != 'TEXTAREA') {
|
||||
if (e.which == 84) { // t
|
||||
this.refs.timeline.focus();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.fetch = (cb) => {
|
||||
this.fetch = cb => {
|
||||
this.api('posts/mentions', {
|
||||
following: this.mode == 'following'
|
||||
}).then((posts) => {
|
||||
this.is-loading = false
|
||||
this.is-empty = posts.length == 0
|
||||
this.update();
|
||||
this.refs.timeline.set-posts posts
|
||||
if cb? then cb!
|
||||
.catch (err) =>
|
||||
console.error err
|
||||
if cb? then cb!
|
||||
following: this.mode == 'following'
|
||||
}).then(posts => {
|
||||
this.update({
|
||||
isLoading: false,
|
||||
isEmpty: posts.length == 0
|
||||
});
|
||||
this.refs.timeline.setPosts(posts);
|
||||
if (cb) cb();
|
||||
});
|
||||
};
|
||||
|
||||
this.more = () => {
|
||||
if @more-loading or @is-loading or this.refs.timeline.posts.length == 0
|
||||
return
|
||||
this.more-loading = true
|
||||
this.update();
|
||||
if (this.moreLoading || this.isLoading || this.refs.timeline.posts.length == 0) return;
|
||||
this.update({
|
||||
moreLoading: true
|
||||
});
|
||||
this.api('posts/mentions', {
|
||||
following: this.mode == 'following'
|
||||
max_id: this.refs.timeline.tail!.id
|
||||
}).then((posts) => {
|
||||
this.more-loading = false
|
||||
this.update();
|
||||
this.refs.timeline.prepend-posts posts
|
||||
.catch (err) =>
|
||||
console.error err
|
||||
following: this.mode == 'following',
|
||||
max_id: this.refs.timeline.tail().id
|
||||
}).then(posts => {
|
||||
this.update({
|
||||
moreLoading: false
|
||||
});
|
||||
this.refs.timeline.prependPosts(posts);
|
||||
});
|
||||
};
|
||||
|
||||
this.on-scroll = () => {
|
||||
current = window.scrollY + window.inner-height
|
||||
if current > document.body.offset-height - 8
|
||||
@more!
|
||||
this.onScroll = () => {
|
||||
const current = window.scrollY + window.innerHeight;
|
||||
if (current > document.body.offsetHeight - 8) this.more();
|
||||
};
|
||||
|
||||
this.set-mode = (mode) => {
|
||||
@update do
|
||||
this.setMode = mode => {
|
||||
this.update({
|
||||
mode: mode
|
||||
@fetch!
|
||||
});
|
||||
this.fetch();
|
||||
};
|
||||
</script>
|
||||
</mk-mentions-home-widget>
|
||||
|
|
|
@ -13,9 +13,5 @@
|
|||
i
|
||||
color #ccc
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</style>
|
||||
</mk-nav-home-widget>
|
||||
|
|
|
@ -44,7 +44,8 @@
|
|||
</style>
|
||||
<script>
|
||||
this.settings = () => {
|
||||
w = riot.mount document.body.appendChild document.createElement 'mk-settings-window' .0
|
||||
w.switch 'notification'
|
||||
const w = riot.mount(document.body.appendChild(document.createElement('mk-settings-window')[0];
|
||||
w.switch('notification');
|
||||
};
|
||||
</script>
|
||||
</mk-notifications-home-widget>
|
||||
|
|
|
@ -60,28 +60,33 @@
|
|||
this.mixin('api');
|
||||
this.mixin('stream');
|
||||
|
||||
this.images = []
|
||||
this.initializing = true
|
||||
this.images = [];
|
||||
this.initializing = true;
|
||||
|
||||
this.on('mount', () => {
|
||||
this.stream.on 'drive_file_created' this.onStreamDriveFileCreated
|
||||
this.stream.on('drive_file_created', this.onStreamDriveFileCreated);
|
||||
|
||||
this.api('drive/stream', {
|
||||
type: 'image/*'
|
||||
limit: 9images
|
||||
}).then((images) => {
|
||||
this.initializing = false
|
||||
this.images = images
|
||||
this.update();
|
||||
type: 'image/*',
|
||||
limit: 9
|
||||
}).then(images => {
|
||||
this.update({
|
||||
initializing: false,
|
||||
images: images
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
this.on('unmount', () => {
|
||||
this.stream.off 'drive_file_created' this.onStreamDriveFileCreated
|
||||
this.stream.off('drive_file_created', this.onStreamDriveFileCreated);
|
||||
});
|
||||
|
||||
this.onStreamDriveFileCreated = (file) => {
|
||||
if /^image\/.+$/.test file.type
|
||||
@images.unshift file
|
||||
if @images.length > 9
|
||||
@images.pop!
|
||||
this.onStreamDriveFileCreated = file => {
|
||||
if (/^image\/.+$/.test(file.type)) {
|
||||
this.images.unshift(file);
|
||||
if (this.images.length > 9) this.images.pop();
|
||||
this.update();
|
||||
}
|
||||
};
|
||||
</script>
|
||||
</mk-photo-stream-home-widget>
|
||||
|
|
|
@ -46,10 +46,12 @@
|
|||
this.mixin('update-avatar');
|
||||
this.mixin('update-banner');
|
||||
|
||||
this.set-avatar = () => {
|
||||
@update-avatar this.I
|
||||
this.setAvatar = () => {
|
||||
this.updateAvatar(this.I);
|
||||
};
|
||||
|
||||
this.set-banner = () => {
|
||||
@update-banner this.I
|
||||
this.setBanner = () => {
|
||||
this.updateBanner(this.I);
|
||||
};
|
||||
</script>
|
||||
</mk-profile-home-widget>
|
||||
|
|
|
@ -67,28 +67,32 @@
|
|||
this.mixin('api');
|
||||
this.mixin('NotImplementedException');
|
||||
|
||||
this.url = 'http://news.yahoo.co.jp/pickup/rss.xml'
|
||||
this.items = []
|
||||
this.initializing = true
|
||||
this.url = 'http://news.yahoo.co.jp/pickup/rss.xml';
|
||||
this.items = [];
|
||||
this.initializing = true;
|
||||
|
||||
this.on('mount', () => {
|
||||
@fetch!
|
||||
this.clock = setInterval @fetch, 60000ms
|
||||
this.fetch();
|
||||
this.clock = setInterval(this.fetch, 60000);
|
||||
});
|
||||
|
||||
this.on('unmount', () => {
|
||||
clearInterval @clock
|
||||
clearInterval(this.clock);
|
||||
});
|
||||
|
||||
this.fetch = () => {
|
||||
this.api CONFIG.url + '/api:rss' do
|
||||
url: @url
|
||||
}).then((feed) => {
|
||||
this.items = feed.rss.channel.item
|
||||
this.initializing = false
|
||||
this.update();
|
||||
.catch (err) ->
|
||||
console.error err
|
||||
this.api(CONFIG.url + '/api:rss', {
|
||||
url: this.url
|
||||
}).then(feed => {
|
||||
this.update({
|
||||
initializing: false,
|
||||
items: feed.rss.channel.item
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
this.settings = () => {
|
||||
@NotImplementedException!
|
||||
this.NotImplementedException();
|
||||
};
|
||||
</script>
|
||||
</mk-rss-reader-home-widget>
|
||||
|
|
|
@ -36,76 +36,83 @@
|
|||
this.mixin('api');
|
||||
this.mixin('stream');
|
||||
|
||||
this.is-loading = true
|
||||
this.is-empty = false
|
||||
this.more-loading = false
|
||||
this.no-following = this.I.following_count == 0
|
||||
this.isLoading = true;
|
||||
this.isEmpty = false;
|
||||
this.moreLoading = false;
|
||||
this.noFollowing = this.I.following_count == 0;
|
||||
|
||||
this.on('mount', () => {
|
||||
this.stream.on 'post' this.on-stream-post
|
||||
this.stream.on 'follow' this.on-stream-follow
|
||||
this.stream.on 'unfollow' this.on-stream-unfollow
|
||||
this.stream.on('post', this.onStreamPost);
|
||||
this.stream.on('follow', this.onStreamFollow);
|
||||
this.stream.on('unfollow', this.onStreamUnfollow);
|
||||
|
||||
document.addEventListener 'keydown' this.on-document-keydown
|
||||
window.addEventListener 'scroll' this.on-scroll
|
||||
document.addEventListener('keydown', this.onDocumentKeydown);
|
||||
window.addEventListener('scroll', this.onScroll);
|
||||
|
||||
@load =>
|
||||
this.trigger('loaded');
|
||||
this.load(() => this.trigger('loaded'));
|
||||
});
|
||||
|
||||
this.on('unmount', () => {
|
||||
this.stream.off 'post' this.on-stream-post
|
||||
this.stream.off 'follow' this.on-stream-follow
|
||||
this.stream.off 'unfollow' this.on-stream-unfollow
|
||||
this.stream.off('post', this.onStreamPost);
|
||||
this.stream.off('follow', this.onStreamFollow);
|
||||
this.stream.off('unfollow', this.onStreamUnfollow);
|
||||
|
||||
document.removeEventListener 'keydown' this.on-document-keydown
|
||||
window.removeEventListener 'scroll' this.on-scroll
|
||||
document.removeEventListener('keydown', this.onDocumentKeydown);
|
||||
window.removeEventListener('scroll', this.onScroll);
|
||||
});
|
||||
|
||||
this.on-document-keydown = (e) => {
|
||||
tag = e.target.tag-name.to-lower-case!
|
||||
if tag != 'input' and tag != 'textarea'
|
||||
if e.which == 84 // t
|
||||
this.onDocumentKeydown = e => {
|
||||
if (e.target.tagName != 'INPUT' && tag != 'TEXTAREA') {
|
||||
if (e.which == 84) { // t
|
||||
this.refs.timeline.focus();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.load = (cb) => {
|
||||
this.api 'posts/timeline'
|
||||
}).then((posts) => {
|
||||
this.is-loading = false
|
||||
this.is-empty = posts.length == 0
|
||||
this.update();
|
||||
this.refs.timeline.set-posts posts
|
||||
if cb? then cb!
|
||||
.catch (err) =>
|
||||
console.error err
|
||||
if cb? then cb!
|
||||
this.api('posts/timeline').then(posts => {
|
||||
this.update({
|
||||
isLoading: false,
|
||||
isEmpty: posts.length == 0
|
||||
});
|
||||
this.refs.timeline.setPosts(posts);
|
||||
if (cb) cb();
|
||||
});
|
||||
};
|
||||
|
||||
this.more = () => {
|
||||
if @more-loading or @is-loading or this.refs.timeline.posts.length == 0
|
||||
return
|
||||
this.more-loading = true
|
||||
this.update();
|
||||
if (this.moreLoading || this.isLoading || this.refs.timeline.posts.length == 0) return;
|
||||
this.update({
|
||||
moreLoading: true
|
||||
});
|
||||
this.api('posts/timeline', {
|
||||
max_id: this.refs.timeline.tail!.id
|
||||
}).then((posts) => {
|
||||
this.more-loading = false
|
||||
this.update();
|
||||
this.refs.timeline.prepend-posts posts
|
||||
.catch (err) =>
|
||||
console.error err
|
||||
max_id: this.refs.timeline.tail().id
|
||||
}).then(posts => {
|
||||
this.update({
|
||||
moreLoading: false
|
||||
});
|
||||
this.refs.timeline.prependPosts(posts);
|
||||
});
|
||||
};
|
||||
|
||||
this.on-stream-post = (post) => {
|
||||
this.is-empty = false
|
||||
this.update();
|
||||
this.refs.timeline.add-post post
|
||||
this.onStreamPost = post => {
|
||||
this.update({
|
||||
isEmpty: false
|
||||
});
|
||||
this.refs.timeline.addPost(post);
|
||||
};
|
||||
|
||||
this.on-stream-follow = () => {
|
||||
this.onStreamFollow = () => {
|
||||
this.load();
|
||||
};
|
||||
|
||||
this.on-stream-unfollow = () => {
|
||||
this.onStreamUnfollow = () => {
|
||||
this.load();
|
||||
};
|
||||
|
||||
this.on-scroll = () => {
|
||||
current = window.scrollY + window.inner-height
|
||||
if current > document.body.offset-height - 8
|
||||
@more!
|
||||
this.onScroll = () => {
|
||||
const current = window.scrollY + window.innerHeight;
|
||||
if (current > document.body.offsetHeight - 8) this.more();
|
||||
};
|
||||
</script>
|
||||
</mk-timeline-home-widget>
|
||||
|
|
|
@ -30,42 +30,45 @@
|
|||
</style>
|
||||
<script>
|
||||
this.tips = [
|
||||
'<kbd>t</kbd>でタイムラインにフォーカスできます'
|
||||
'<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます'
|
||||
'投稿フォームにはファイルをドラッグ&ドロップできます'
|
||||
'投稿フォームにクリップボードにある画像データをペーストできます'
|
||||
'ドライブにファイルをドラッグ&ドロップしてアップロードできます'
|
||||
'ドライブでファイルをドラッグしてフォルダ移動できます'
|
||||
'ドライブでフォルダをドラッグしてフォルダ移動できます'
|
||||
'ホームをカスタマイズできます(準備中)'
|
||||
'<kbd>t</kbd>でタイムラインにフォーカスできます',
|
||||
'<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます',
|
||||
'投稿フォームにはファイルをドラッグ&ドロップできます',
|
||||
'投稿フォームにクリップボードにある画像データをペーストできます',
|
||||
'ドライブにファイルをドラッグ&ドロップしてアップロードできます',
|
||||
'ドライブでファイルをドラッグしてフォルダ移動できます',
|
||||
'ドライブでフォルダをドラッグしてフォルダ移動できます',
|
||||
'ホームをカスタマイズできます(準備中)',
|
||||
'MisskeyはMIT Licenseです'
|
||||
]
|
||||
|
||||
this.on('mount', () => {
|
||||
@set!
|
||||
this.clock = setInterval @change, 20000ms
|
||||
this.set();
|
||||
this.clock = setInterval(this.change, 20000);
|
||||
});
|
||||
|
||||
this.on('unmount', () => {
|
||||
clearInterval @clock
|
||||
clearInterval(this.clock);
|
||||
});
|
||||
|
||||
this.set = () => {
|
||||
this.refs.text.innerHTML = @tips[Math.floor Math.random! * @tips.length]
|
||||
this.update();
|
||||
this.refs.text.innerHTML = this.tips[Math.floor(Math.random() * this.tips.length)];
|
||||
};
|
||||
|
||||
this.change = () => {
|
||||
Velocity(this.refs.tip, {
|
||||
opacity: 0
|
||||
}, {
|
||||
duration: 500ms
|
||||
easing: 'linear'
|
||||
complete: @set
|
||||
}
|
||||
duration: 500,
|
||||
easing: 'linear',
|
||||
complete: this.set
|
||||
});
|
||||
|
||||
Velocity(this.refs.tip, {
|
||||
opacity: 1
|
||||
}, {
|
||||
duration: 500ms
|
||||
easing: 'linear'
|
||||
}
|
||||
duration: 500,
|
||||
easing: 'linear'
|
||||
});
|
||||
};
|
||||
</script>
|
||||
</mk-tips-home-widget>
|
||||
|
|
|
@ -112,41 +112,39 @@
|
|||
this.mixin('api');
|
||||
this.mixin('user-preview');
|
||||
|
||||
this.users = null
|
||||
this.loading = true
|
||||
this.users = null;
|
||||
this.loading = true;
|
||||
|
||||
this.limit = 3users
|
||||
this.page = 0
|
||||
this.limit = 3;
|
||||
this.page = 0;
|
||||
|
||||
this.on('mount', () => {
|
||||
@fetch!
|
||||
this.clock = setInterval =>
|
||||
if this.users.length < @limit
|
||||
@fetch true
|
||||
, 60000ms
|
||||
this.fetch();
|
||||
});
|
||||
|
||||
this.on('unmount', () => {
|
||||
clearInterval @clock
|
||||
|
||||
this.fetch = (quiet = false) => {
|
||||
this.loading = true
|
||||
this.users = null
|
||||
if not quiet then this.update();
|
||||
this.fetch = () => {
|
||||
this.update({
|
||||
loading: true,
|
||||
users: null
|
||||
});
|
||||
this.api('users/recommendation', {
|
||||
limit: @limit
|
||||
offset: @limit * this.page
|
||||
}).then((users) => {
|
||||
this.loading = false
|
||||
this.users = users
|
||||
this.update();
|
||||
.catch (err, text-status) ->
|
||||
console.error err
|
||||
limit: this.limit,
|
||||
offset: this.limit * this.page
|
||||
}).then(users => {
|
||||
this.update({
|
||||
loading: false,
|
||||
users: users
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
this.refresh = () => {
|
||||
if this.users.length < @limit
|
||||
this.page = 0
|
||||
else
|
||||
this.page++
|
||||
@fetch!
|
||||
if (this.users.length < this.limit) {
|
||||
this.page = 0;
|
||||
} else {
|
||||
this.page++;
|
||||
}
|
||||
this.fetch();
|
||||
};
|
||||
</script>
|
||||
</mk-user-recommendation-home-widget>
|
||||
|
|
Loading…
Reference in a new issue