thedesk/app/js/post/status.js
2019-11-16 03:42:23 +09:00

650 lines
19 KiB
JavaScript

//お気に入り登録やブースト等、フォローやブロック等
//お気に入り登録
function fav(id, acct_id, remote) {
if ($('#pub_' + id).hasClass('faved')) {
var flag = 'unfavourite'
} else {
var flag = 'favourite'
}
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/statuses/' + id + '/' + flag
var httpreq = new XMLHttpRequest()
httpreq.open('POST', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
httpreq.responseType = 'json'
httpreq.send()
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response
if (this.status !== 200) {
setLog(start, this.status, json)
}
if (json.reblog) {
json = json.reblog
}
if (remote != 'remote') {
//APIのふぁぼカウントがおかしい
if ($('[unique-id=' + id + '] .fav_ct').text() == json.favourites_count) {
if (flag == 'unfavourite') {
var fav = json.favourites_count - 1
if (fav * 1 < 0) {
fav = 0
}
} else {
var fav = json.favourites_count
//var fav = json.favourites_count;
}
} else {
var fav = json.favourites_count
}
$('[unique-id=' + id + '] .fav_ct').text(fav)
$('[unique-id=' + id + '] .rt_ct').text(json.reblogs_count)
if ($('[unique-id=' + id + ']').hasClass('faved')) {
$('[unique-id=' + id + ']').removeClass('faved')
$('.fav_' + id).removeClass('yellow-text')
} else {
$('[unique-id=' + id + ']').addClass('faved')
$('.fav_' + id).addClass('yellow-text')
}
} else {
M.toast({ html: lang.lang_status_favWarn, displayLength: 1000 })
}
}
}
}
//ブースト
function rt(id, acct_id, remote, vis) {
if ($('#pub_' + id).hasClass('rted')) {
var flag = 'unreblog'
} else {
var flag = 'reblog'
}
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/statuses/' + id + '/' + flag
var httpreq = new XMLHttpRequest()
httpreq.open('POST', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
httpreq.responseType = 'json'
if (vis) {
httpreq.send(JSON.stringify({ visibility: vis }))
} else {
httpreq.send()
}
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response
if (this.status !== 200) {
setLog(start, this.status, json)
}
if (json.reblog) {
json = json.reblog
}
console.log(['Success: boost', json])
$('[unique-id=' + id + '] .fav_ct').text(json.favourites_count)
if (!json.reblog) {
if (flag == 'unreblog') {
var rt = json.reblogs_count - 1
if (rt * 1 < 0) {
rt = 0
}
} else {
var rt = json.reblogs_count
}
$('[unique-id=' + id + '] .rt_ct').text(rt)
} else {
$('[unique-id=' + id + '] .rt_ct').text(json.reblogs_count)
}
if ($('[unique-id=' + id + ']').hasClass('rted')) {
$('[unique-id=' + id + ']').removeClass('rted')
$('.rt_' + id).removeClass('light-blue-text')
} else {
$('[unique-id=' + id + ']').addClass('rted')
$('.rt_' + id).addClass('light-blue-text')
}
}
}
}
function boostWith(vis) {
var id = $('#tootmodal').attr('data-id')
var acct_id = $('#tootmodal').attr('data-acct')
rt(id, acct_id, false, vis)
}
//ブックマーク
function bkm(id, acct_id, remote) {
if ($('#pub_' + id).hasClass('bkmed')) {
var flag = 'unbookmark'
} else {
var flag = 'bookmark'
}
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/statuses/' + id + '/' + flag
var httpreq = new XMLHttpRequest()
httpreq.open('POST', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
httpreq.responseType = 'json'
httpreq.send()
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response
if (this.status !== 200) {
setLog(start, this.status, json)
}
if (json.reblog) {
json = json.reblog
}
if (remote != 'remote') {
var fav = json.favourites_count
$('[toot-id=' + id + '] .fav_ct').text(fav)
$('[toot-id=' + id + '] .rt_ct').text(json.reblogs_count)
if (flag == 'unbookmark') {
$('.bkmStr_' + id).text(lang.lang_parse_bookmark)
$('.bkm_' + id).removeClass('red-text')
$('[toot-id=' + id + ']').removeClass('bkmed')
} else {
$('.bkmStr_' + id).text(lang.lang_parse_unbookmark)
$('.bkm_' + id).addClass('red-text')
$('[toot-id=' + id + ']').addClass('bkmed')
}
} else {
M.toast({ html: lang.lang_status_favWarn, displayLength: 1000 })
}
}
}
}
//フォロー
async function follow(acct_id, resolve) {
if (!acct_id && acct_id != 'selector') {
var acct_id = $('#his-data').attr('use-acct')
} else if (acct_id == 'selector') {
var acct_id = $('#user-acct-sel').val()
}
if (!resolve && $('#his-data').hasClass('following')) {
var flag = 'unfollow'
var flagm = 'delete'
} else {
var flag = 'follow'
var flagm = 'create'
}
var id = $('#his-data').attr('user-id')
if (resolve == 'selector') {
var fullacct = $('#his-acct').attr('fullname')
var id = await acctResolve(acct_id, fullacct)
console.log(id)
}
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/accounts/' + id + '/' + flag
if (localStorage.getItem('mode_' + domain) == 'misskey') {
var start = 'https://' + domain + '/api/following/' + flagm
var ent = { i: at, userId: id }
} else if (flag == 'follow') {
var ent = {}
}
var httpreq = new XMLHttpRequest()
httpreq.open('POST', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
httpreq.responseType = 'json'
httpreq.send(JSON.stringify(ent))
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response
if (this.status !== 200) {
setLog(start, this.status, json)
}
console.log(['Success: folllow', json])
if ($('#his-data').hasClass('following')) {
$('#his-data').removeClass('following')
$('#his-follow-btn-text').text(lang.lang_status_follow)
} else {
$('#his-data').addClass('following')
$('#his-follow-btn-text').text(lang.lang_status_unfollow)
}
}
}
}
async function acctResolve(acct_id, user) {
console.log('Get user data of ' + user)
var domain = localStorage.getItem('domain_' + acct_id)
if (localStorage.getItem('mode_' + domain) == 'misskey') {
return false
}
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v2/search?resolve=true&q=' + user
let promise = await fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
Authorization: 'Bearer ' + at
}
})
var idJson = await promise.json()
if (idJson.accounts[0]) {
var id = idJson.accounts[0].id
} else {
M.toast({ html: lang.lang_fatalerroroccured, displayLength: 2000 })
}
return id
}
//ブロック
function block(acct_id) {
if ($('#his-data').hasClass('blocking')) {
var flag = 'unblock'
var txt = lang.lang_status_unmute
} else {
var flag = 'block'
var txt = lang.lang_status_block
}
Swal.fire({
title: txt,
text: '',
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: lang.lang_yesno,
cancelButtonText: lang.lang_no
}).then(result => {
if (result.value) {
if (!acct_id) {
var acct_id = $('#his-data').attr('use-acct')
}
var id = $('#his-data').attr('user-id')
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/accounts/' + id + '/' + flag
var httpreq = new XMLHttpRequest()
httpreq.open('POST', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
httpreq.responseType = 'json'
httpreq.send()
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
if (this.status !== 200) {
setLog(start, this.status, this.response)
}
if ($('#his-data').hasClass('blocking')) {
$('#his-data').removeClass('blocking')
$('#his-block-btn-text').text(lang.lang_status_block)
} else {
$('#his-data').addClass('blocking')
$('#his-block-btn-text').text(lang.lang_status_unblock)
}
}
}
}
})
}
//ミュート
function muteDo(acct_id) {
if ($('#his-data').hasClass('muting')) {
var flag = 'unmute'
var flagm = 'delete'
var txt = lang.lang_status_unmute
} else {
var flag = 'mute'
var flagm = 'create'
var txt = lang.lang_status_mute
}
Swal.fire({
title: txt,
text: '',
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: lang.lang_yesno,
cancelButtonText: lang.lang_no
}).then(result => {
if (result.value) {
if (!acct_id) {
var acct_id = $('#his-data').attr('use-acct')
}
var id = $('#his-data').attr('user-id')
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
if (localStorage.getItem('mode_' + domain) == 'misskey') {
var start = 'https://' + domain + '/api/mute/' + flagm
var ent = { i: at, userId: id }
var rq = JSON.stringify(ent)
} else {
var start = 'https://' + domain + '/api/v1/accounts/' + id + '/' + flag
var rq = ''
}
var httpreq = new XMLHttpRequest()
httpreq.open('POST', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
httpreq.responseType = 'json'
httpreq.send(rq)
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
if (this.status !== 200) {
setLog(start, this.status, this.response)
}
if ($('#his-data').hasClass('muting')) {
$('#his-data').removeClass('muting')
$('#his-mute-btn-text').text(lang.lang_status_mute)
} else {
$('#his-data').addClass('muting')
$('#his-mute-btn-text').text(lang.lang_status_unmute)
}
}
}
}
})
}
//投稿削除
function del(id, acct_id) {
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
if (localStorage.getItem('mode_' + domain) == 'misskey') {
var start = 'https://' + domain + '/api/notes/delete'
var httpreq = new XMLHttpRequest()
httpreq.open('POST', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.responseType = 'json'
httpreq.send(JSON.stringify({ i: at, noteId: id }))
$('[toot-id=' + id + ']').hide()
$('[toot-id=' + id + ']').remove()
} else {
var start = 'https://' + domain + '/api/v1/statuses/' + id
var httpreq = new XMLHttpRequest()
httpreq.open('DELETE', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
httpreq.responseType = 'json'
httpreq.send()
}
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
if (this.status !== 200) {
setLog(start, this.status, this.response)
}
}
}
}
//redraft
function redraft(id, acct_id) {
Swal.fire({
title: lang.lang_status_redraftTitle,
text: lang.lang_status_redraft,
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: lang.lang_yesno,
cancelButtonText: lang.lang_no
}).then(result => {
if (result.value) {
show()
del(id, acct_id)
$('#post-acct-sel').prop('disabled', true)
$('#post-acct-sel').val(acct_id)
$('select').formSelect()
mdCheck()
var medias = $('[toot-id=' + id + ']').attr('data-medias')
var vismode = $('[toot-id=' + id + '] .vis-data').attr('data-vis')
vis(vismode)
$('#media').val(medias)
var ct = medias.split(',').length
$('[toot-id=' + id + '] img.toot-img').each(function(i, elem) {
if (i < ct) {
var url = $(elem).attr('src')
console.log('Play back image data:' + url)
$('#preview').append('<img src="' + url + '" style="width:50px; max-height:100px;">')
}
})
var html = $('[toot-id=' + id + '] .toot').html()
html = html.replace(/^<p>(.+)<\/p>$/, '$1')
html = html.replace(/<br\s?\/?>/, '\n')
html = html.replace(/<p>/, '\n')
html = html.replace(/<\/p>/, '\n')
html = html.replace(/<img[\s\S]*alt="(.+?)"[\s\S]*?>/g, '$1')
html = $.strip_tags(html)
localStorage.setItem('nohide', true)
show()
$('#textarea').val(html)
var cwtxt = $('[toot-id=' + id + '] .cw_text').html()
if (cwtxt != '') {
cwtxt = $.strip_tags(cwtxt)
cw()
$('#cw-text').val(cwtxt)
}
}
})
}
//ピン留め
function pin(id, acct_id) {
if ($('#pub_' + id).hasClass('pined')) {
var flag = 'unpin'
} else {
var flag = 'pin'
}
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/statuses/' + id + '/' + flag
var httpreq = new XMLHttpRequest()
httpreq.open('POST', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
httpreq.responseType = 'json'
httpreq.send()
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response
if (this.status !== 200) {
setLog(start, this.status, this.response)
}
console.log(['Success: pinned', json])
if (flag == 'unpin') {
$('[toot-id=' + id + ']').removeClass('pined')
$('.pin_' + id).removeClass('blue-text')
$('.pinStr_' + id).text(lang.lang_parse_pin)
} else {
$('[toot-id=' + id + ']').addClass('pined')
$('.pin_' + id).addClass('blue-text')
$('.pinStr_' + id).text(lang.lang_parse_unpin)
}
}
}
}
//フォロリク
function request(id, flag, acct_id) {
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/follow_requests/' + id + '/' + flag
var httpreq = new XMLHttpRequest()
httpreq.open('POST', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
httpreq.responseType = 'json'
httpreq.send()
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response
if (this.status !== 200) {
setLog(start, this.status, this.response)
}
console.log(['Success: request', 'type:' + flag, json])
showReq()
}
}
}
//ドメインブロック(未実装)
function domainblock(add, flag, acct_id) {
if (!acct_id) {
var acct_id = $('#his-data').attr('use-acct')
}
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/domain_blocks'
var httpreq = new XMLHttpRequest()
httpreq.open('POST', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
httpreq.responseType = 'json'
httpreq.send()
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response
if (this.status !== 200) {
setLog(start, this.status, this.response)
}
console.log(['Success: domain block', json])
showDom()
}
}
}
function addDomainblock() {
var domain = $('#domainblock').val()
domainblock(domain, 'POST')
}
//ユーザー強調
function empUser() {
var usr = localStorage.getItem('user_emp')
var obj = JSON.parse(usr)
var id = $('#his-acct').attr('fullname')
if (!obj) {
var obj = []
obj.push(id)
M.toast({ html: id + lang.lang_status_emphas, displayLength: 4000 })
} else {
var can
Object.keys(obj).forEach(function(key) {
var usT = obj[key]
if (usT != id && !can) {
can = false
} else {
can = true
obj.splice(key, 1)
M.toast({ html: id + lang.lang_status_unemphas, displayLength: 4000 })
}
})
}
var json = JSON.stringify(obj)
localStorage.setItem('user_emp', json)
}
//Endorse
function pinUser() {
var id = $('#his-data').attr('user-id')
var acct_id = $('#his-data').attr('use-acct')
if ($('#his-end-btn').hasClass('endorsed')) {
var flag = 'unpin'
} else {
var flag = 'pin'
}
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/accounts/' + id + '/' + flag
var httpreq = new XMLHttpRequest()
httpreq.open('POST', start, true)
httpreq.setRequestHeader('Content-Type', 'application/json')
httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
httpreq.responseType = 'json'
httpreq.send()
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response
if (this.status !== 200) {
setLog(start, this.status, this.response)
}
if ($('#his-end-btn').hasClass('endorsed')) {
$('#his-end-btn').removeClass('endorsed')
$('#his-end-btn').text(lang.lang_status_endorse)
} else {
$('#his-end-btn').addClass('endorsed')
$('#his-end-btn').text(lang.lang_status_unendorse)
}
}
}
}
//URLコピー
function tootUriCopy(url) {
execCopy(url)
M.toast({ html: lang.lang_details_url, displayLength: 1500 })
}
//他のアカウントで…
function staEx(mode) {
var url = $('#tootmodal').attr('data-url')
var acct_id = $('#status-acct-sel').val()
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v2/search?resolve=true&q=' + url
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
Authorization: 'Bearer ' + at
}
})
.then(function(response) {
if (!response.ok) {
response.text().then(function(text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function(error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function(json) {
var id = json.statuses[0].id
if (mode == 'rt') {
rt(id, acct_id, 'remote')
} else if (mode == 'fav') {
fav(id, acct_id, 'remote')
} else if (mode == 'reply') {
reEx(id)
}
})
return
}
function toggleAction(elem, height) {
var cont = elem.parents('.cvo').find('.contextMenu')
if (cont.hasClass('hide')) {
$('#contextWrap').removeClass('hide')
var left = elem.offset().left + 60
var top = elem.offset().top - height
if (top < 75) {
top = elem.offset().top + 45
cont.removeClass('bottom')
cont.addClass('top')
} else {
cont.removeClass('top')
cont.addClass('bottom')
}
cont.css('top', top + 'px')
cont.css('right', `calc(100vw - ${left}px)`)
cont.removeClass('hide')
elem
.parents('.cvo')
.find('.act-icon')
.text('expand_less')
} else {
$('#contextWrap').addClass('hide')
$('.contextMenu').addClass('hide')
$('.act-icon').text('expand_more')
}
}