Merge pull request #6704 from pixelfed/staging

Staging
copilot/review-old-issues
dansup 4 weeks ago committed by GitHub
commit 45abeb62e2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -17,14 +17,22 @@ class UserAvatarDelete extends Command implements PromptsForMissingInput
*
* @var string
*/
protected $signature = 'user:avatar-delete {username}';
protected $signature = 'user:avatar-delete {username} {--force : Delete without confirmation prompts}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Delete user avatar';
protected $description = 'Delete user avatar and reset to default';
/**
* @var array<int, string>
*/
protected array $defaultPaths = [
'public/avatars/default.jpg',
'public/avatars/default.png',
];
/**
* Prompt for missing input arguments using the returned questions.
@ -41,63 +49,93 @@ class UserAvatarDelete extends Command implements PromptsForMissingInput
/**
* Execute the console command.
*/
public function handle()
public function handle(): int
{
$user = User::whereUsername($this->argument('username'))->first();
if (! $user) {
$this->error('Could not find any user with that username');
exit;
return Command::FAILURE;
}
if (! $user->profile_id) {
$this->error('Could not find the profile with that username');
exit;
return Command::FAILURE;
}
$pid = $user->profile_id;
$avatarModel = Avatar::where('profile_id', $pid)->first();
$avatarModel = Avatar::whereProfileId($pid)->first();
if (! $avatarModel) {
$this->error('No avatar model found');
Cache::forget('avatar:'.$pid);
exit;
}
$this->forgetAvatarCaches($pid);
$defaultPaths = ['public/avatars/default.jpg', 'public/avatars/default.png'];
$mediaPath = $avatarModel->media_path;
return Command::FAILURE;
}
if (in_array($mediaPath, $defaultPaths)) {
if ($this->isDefaultAvatar($avatarModel->media_path)) {
$this->info('Default avatar already used, aborting...');
Cache::forget('avatar:'.$pid);
exit;
}
$this->forgetAvatarCaches($pid);
if (Storage::disk(config('filesystems.cloud'))->exists($mediaPath)) {
if ($this->confirm('Found a S3 avatar at '.$mediaPath.'! Are you sure you want to delete this?')) {
Storage::disk(config('filesystems.cloud'))->delete($mediaPath);
$this->info('Deleting S3 copy');
} else {
exit;
}
return Command::SUCCESS;
}
if (Storage::disk('local')->exists($mediaPath)) {
if ($this->confirm('Found a local avatar at '.$mediaPath.'! Are you sure you want to delete this?')) {
Storage::disk('local')->delete($mediaPath);
$this->info('Deleting local copy');
} else {
exit;
}
if (! $this->deleteStoredAvatar($avatarModel->media_path)) {
$this->info('Aborted, no changes were made.');
return Command::SUCCESS;
}
$avatarModel->media_path = 'public/avatars/default.jpg';
$avatarModel->cdn_url = null;
$avatarModel->change_count = $avatarModel->change_count + 1;
$avatarModel->save();
$this->forgetAvatarCaches($pid);
$this->info('Successfully deleted user avatar!');
return Command::SUCCESS;
}
protected function isDefaultAvatar(?string $path): bool
{
return in_array($path, $this->defaultPaths, true);
}
protected function forgetAvatarCaches($pid): void
{
Cache::forget('avatar:'.$pid);
AccountService::del($pid);
}
$this->info('Successfully deleted user avatar!');
protected function deleteStoredAvatar(string $path): bool
{
if ((bool) config_cache('pixelfed.cloud_storage')) {
$cloudDisk = Storage::disk(config('filesystems.cloud'));
if ($cloudDisk->exists($path)) {
if (! $this->option('force') && ! $this->confirm("Found a cloud avatar at {$path}! Are you sure you want to delete this?")) {
return false;
}
$cloudDisk->delete($path);
$this->info('Deleting cloud avatar copy');
}
}
if (Storage::disk('local')->exists($path)) {
if (! $this->option('force') && ! $this->confirm("Found a local avatar at {$path}! Are you sure you want to delete this?")) {
return false;
}
Storage::disk('local')->delete($path);
$this->info('Deleting local avatar copy');
}
return true;
}
}

@ -12,9 +12,4 @@ class ApiController extends BaseApiController
{
return response()->json(Config::get());
}
public function userRecommendations(Request $request)
{
return response()->json([]);
}
}

@ -16,7 +16,6 @@ class StatusEditController extends Controller
public function __construct()
{
$this->middleware('auth:api');
abort_if(! config('exp.pue'), 404, 'Post editing is not enabled on this server.');
}
public function store(StoreStatusEditRequest $request, $id)

@ -1,33 +0,0 @@
<?php
namespace App\Services;
use App\Status;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
class StatusLabelService
{
const CACHE_KEY = 'pf:services:status_label:_v0:';
public static function get(Status $status)
{
if (config('instance.label.covid.enabled') == false || ! $status) {
return [
'covid' => false,
];
}
return Cache::remember(self::CACHE_KEY.$status->id, now()->addDays(7), function () use ($status) {
if (! $status->caption) {
return [
'covid' => false,
];
}
return [
'covid' => Str::of(strtolower($status->caption))->contains(['covid', 'corona', 'coronavirus', 'vaccine', 'vaxx', 'vaccination', 'plandemic']),
];
});
}
}

@ -119,7 +119,6 @@ class StatusService
$status['comments_disabled'],
$status['content_text'],
$status['gid'],
$status['label'],
$status['liked_by'],
$status['local'],
$status['parent'],

@ -4,7 +4,7 @@ namespace App\Services;
use App\Models\UserDomainBlock;
use App\UserFilter;
use Cache;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Redis;
class UserFilterService
@ -15,74 +15,67 @@ class UserFilterService
const USER_DOMAIN_KEY = 'pf:services:domain-blocks:ids:';
const EMPTY_SENTINEL = '-1';
const FILTER_TTL = 2592000;
public static function mutes(int $profile_id)
{
$key = self::USER_MUTES_KEY.$profile_id;
$warm = Cache::has($key.':cached-v0');
if ($warm) {
return Redis::zrevrange($key, 0, -1) ?? [];
} else {
if (Redis::zrevrange($key, 0, -1)) {
return Redis::zrevrange($key, 0, -1);
}
$ids = UserFilter::whereFilterType('mute')
->whereUserId($profile_id)
->pluck('filterable_id')
->map(function ($id) {
$acct = AccountService::get($id, true);
if (! $acct) {
return false;
}
return $acct['id'];
})
->filter(function ($res) {
return $res;
})
->values()
->toArray();
foreach ($ids as $muted_id) {
Redis::zadd($key, (int) $muted_id, (int) $muted_id);
}
Cache::set($key.':cached-v0', 1, 7776000);
return $ids;
}
return self::getFilterIds($profile_id, 'mute', self::USER_MUTES_KEY);
}
public static function blocks(int $profile_id)
{
$key = self::USER_BLOCKS_KEY.$profile_id;
$warm = Cache::has($key.':cached-v0');
if ($warm) {
return Redis::zrevrange($key, 0, -1) ?? [];
return self::getFilterIds($profile_id, 'block', self::USER_BLOCKS_KEY);
}
protected static function getFilterIds(int $profile_id, string $type, string $keyPrefix)
{
$key = $keyPrefix.$profile_id;
$ids = Redis::zrevrange($key, 0, -1);
if (! empty($ids)) {
Redis::expire($key, self::FILTER_TTL);
return array_values(array_filter($ids, fn ($id) => $id !== self::EMPTY_SENTINEL));
}
Cache::forget($key.':cached-v0');
$ids = UserFilter::whereFilterType($type)
->whereUserId($profile_id)
->pluck('filterable_id')
->map(fn ($id) => AccountService::get($id, true)['id'] ?? false)
->filter()
->values()
->toArray();
if (empty($ids)) {
Redis::zadd($key, 0, self::EMPTY_SENTINEL);
} else {
if (Redis::zrevrange($key, 0, -1)) {
return Redis::zrevrange($key, 0, -1);
foreach ($ids as $id) {
Redis::zadd($key, (int) $id, (int) $id);
}
$ids = UserFilter::whereFilterType('block')
->whereUserId($profile_id)
->pluck('filterable_id')
->map(function ($id) {
$acct = AccountService::get($id, true);
if (! $acct) {
return false;
}
return $acct['id'];
})
->filter(function ($res) {
return $res;
})
->values()
->toArray();
foreach ($ids as $blocked_id) {
Redis::zadd($key, (int) $blocked_id, (int) $blocked_id);
}
Cache::set($key.':cached-v0', 1, 7776000);
}
Redis::expire($key, self::FILTER_TTL);
return $ids;
return $ids;
}
protected static function addToFilter(string $key, int $filterable_id)
{
Redis::zadd($key, $filterable_id, $filterable_id);
Redis::zrem($key, self::EMPTY_SENTINEL);
Redis::expire($key, self::FILTER_TTL);
}
protected static function removeFromFilter(string $key, $filterable_id)
{
Redis::zrem($key, $filterable_id);
if (Redis::zcard($key) === 0) {
Redis::zadd($key, 0, self::EMPTY_SENTINEL);
}
Redis::expire($key, self::FILTER_TTL);
}
public static function filters(int $profile_id)
@ -96,10 +89,9 @@ class UserFilterService
return false;
}
$key = self::USER_MUTES_KEY.$profile_id;
$mutes = self::mutes($profile_id);
$exists = in_array($muted_id, $mutes);
$exists = in_array($muted_id, self::mutes($profile_id));
if (! $exists) {
Redis::zadd($key, $muted_id, $muted_id);
self::addToFilter($key, $muted_id);
}
return true;
@ -111,10 +103,9 @@ class UserFilterService
return false;
}
$key = self::USER_MUTES_KEY.$profile_id;
$mutes = self::mutes($profile_id);
$exists = in_array($muted_id, $mutes);
$exists = in_array($muted_id, self::mutes($profile_id));
if ($exists) {
Redis::zrem($key, $muted_id);
self::removeFromFilter($key, $muted_id);
}
return true;
@ -128,7 +119,7 @@ class UserFilterService
$key = self::USER_BLOCKS_KEY.$profile_id;
$exists = in_array($blocked_id, self::blocks($profile_id));
if (! $exists) {
Redis::zadd($key, $blocked_id, $blocked_id);
self::addToFilter($key, $blocked_id);
}
return true;
@ -142,7 +133,7 @@ class UserFilterService
$key = self::USER_BLOCKS_KEY.$profile_id;
$exists = in_array($blocked_id, self::blocks($profile_id));
if ($exists) {
Redis::zrem($key, $blocked_id);
self::removeFromFilter($key, $blocked_id);
}
return $exists;
@ -150,12 +141,12 @@ class UserFilterService
public static function blockCount(int $profile_id)
{
return Redis::zcard(self::USER_BLOCKS_KEY.$profile_id);
return count(self::blocks($profile_id));
}
public static function muteCount(int $profile_id)
{
return Redis::zcard(self::USER_MUTES_KEY.$profile_id);
return count(self::mutes($profile_id));
}
public static function domainBlocks($pid, $purge = false)
@ -169,6 +160,7 @@ class UserFilterService
21600,
function () use ($pid) {
return UserDomainBlock::whereProfileId($pid)->pluck('domain')->toArray();
});
}
);
}
}

@ -10,7 +10,6 @@ use App\Services\MediaService;
use App\Services\MediaTagService;
use App\Services\PollService;
use App\Services\StatusHashtagService;
use App\Services\StatusLabelService;
use App\Services\StatusMentionService;
use App\Services\StatusService;
use App\Status;
@ -62,7 +61,6 @@ class StatusStatelessTransformer extends Fractal\TransformerAbstract
'place' => $status->place,
'local' => (bool) $status->local,
'taggedPeople' => $taggedPeople,
'label' => StatusLabelService::get($status),
'liked_by' => LikeService::likedBy($status),
'media_attachments' => MediaService::get($status->id),
'account' => AccountService::get($status->profile_id, true),

@ -11,7 +11,6 @@ use App\Services\MediaTagService;
use App\Services\PollService;
use App\Services\ProfileService;
use App\Services\StatusHashtagService;
use App\Services\StatusLabelService;
use App\Services\StatusMentionService;
use App\Services\StatusService;
use App\Status;
@ -63,7 +62,6 @@ class StatusTransformer extends Fractal\TransformerAbstract
'place' => $status->place,
'local' => (bool) $status->local,
'taggedPeople' => $taggedPeople,
'label' => StatusLabelService::get($status),
'liked_by' => LikeService::likedBy($status),
'media_attachments' => MediaService::get($status->id),
'account' => ProfileService::get($status->profile_id, true),

@ -92,13 +92,6 @@ class Config
'mastodon' => false,
'pixelfed' => false,
],
'label' => [
'covid' => [
'enabled' => (bool) config('instance.label.covid.enabled'),
'org' => config('instance.label.covid.org'),
'url' => config('instance.label.covid.url'),
],
],
'hls' => $hls,
'groups' => (bool) config('groups.enabled'),
],

@ -7,15 +7,6 @@
*/
return [
// Hidden like counts (deprecated)
'lc' => env('EXP_LC', false),
// Recommendations (deprecated)
'rec' => false,
// Loops feature (deprecated)
'loops' => false,
// Text only posts (alpha)
'top' => env('EXP_TOP', false),
@ -39,8 +30,5 @@ return [
// HLS Live Streaming
'hls' => env('HLS_LIVE', false),
// Post Update/Edits
'pue' => env('EXP_PUE', true),
'autolink' => env('EXP_AUTOLINK_V2', false),
];

@ -12,9 +12,6 @@ return [
'discover' => [
'public' => env('INSTANCE_DISCOVER_PUBLIC', false),
'loops' => [
'enabled' => env('EXP_LOOPS', false),
],
'tags' => [
'is_public' => env('INSTANCE_PUBLIC_HASHTAGS', false),
],
@ -83,14 +80,6 @@ return [
],
],
'label' => [
'covid' => [
'enabled' => env('ENABLE_COVID_LABEL', true),
'url' => env('COVID_LABEL_URL', 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/advice-for-public'),
'org' => env('COVID_LABEL_ORG', 'visit the WHO website'),
],
],
'enable_cc' => env('ENABLE_CONFIG_CACHE', true),
'has_legal_notice' => env('INSTANCE_LEGAL_NOTICE', false),

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +1 @@
(()=>{"use strict";var e,r,o,a={},t={};function n(e){var r=t[e];if(void 0!==r)return r.exports;var o=t[e]={id:e,loaded:!1,exports:{}};return a[e].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}n.m=a,e=[],n.O=(r,o,a,t)=>{if(!o){var c=1/0;for(f=0;f<e.length;f++){for(var[o,a,t]=e[f],d=!0,s=0;s<o.length;s++)(!1&t||c>=t)&&Object.keys(n.O).every(e=>n.O[e](o[s]))?o.splice(s--,1):(d=!1,t<c&&(c=t));if(d){e.splice(f--,1);var i=a();void 0!==i&&(r=i)}}return r}t=t||0;for(var f=e.length;f>0&&e[f-1][2]>t;f--)e[f]=e[f-1];e[f]=[o,a,t]},n.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return n.d(r,{a:r}),r},n.d=(e,r)=>{for(var o in r)n.o(r,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((r,o)=>(n.f[o](e,r),r),[])),n.u=e=>"js/"+{529:"groups-page",1179:"daci.chunk",1240:"discover~myhashtags.chunk",1645:"profile~following.bundle",2156:"dms.chunk",2822:"group.create",2966:"discover~hashtag.bundle",3688:"discover~serverfeed.chunk",4951:"home.chunk",6250:"discover~settings.chunk",6438:"groups-page-media",6535:"discover.chunk",6740:"discover~memories.chunk",6791:"groups-page-members",7206:"groups-page-topics",7342:"groups-post",7399:"dms~message.chunk",7413:"error404.bundle",7521:"discover~findfriends.chunk",7744:"notifications.chunk",8087:"profile.chunk",8119:"i18n.bundle",8257:"groups-page-about",8408:"post.chunk",8977:"profile~followers.bundle",9124:"compose.chunk",9231:"groups-profile",9919:"changelog.bundle"}[e]+"."+{529:"2826b7d8bc08bf22",1179:"4e7adc83fb3e6c26",1240:"b1170e28d46614b1",1645:"30a324bbbe437db7",2156:"13a1bf15db918fb7",2822:"82affc4a7b5983b0",2966:"43d7fefd51744728",3688:"b46e1b4180b850db",4951:"478a11db7f8bcc5b",6250:"a99d878b83352bea",6438:"f3be2d8b0ca59cdf",6535:"0a3c5b36cedbad42",6740:"3da68f4ee0598a4c",6791:"a2d12bc765ad0f38",7206:"7bee36f3edc0de92",7342:"aca9f85bd8b36f70",7399:"ca55c5d89171edc4",7413:"c408e3fce0f80bcb",7521:"271194c07b172af4",7744:"d2559e00a1a30220",8087:"0edce32375cf0e7a",8119:"9ffc0aacc1ff49e5",8257:"dfb2744b2a28d4c5",8408:"d974a3aee1468f5f",8977:"8381cac06885ce77",9124:"2c9141ff4969e238",9231:"924132e02f73d082",9919:"f97c6c2fdd203b90"}[e]+".js",n.miniCssF=e=>({2305:"css/portfolio",2540:"css/landing",3364:"css/admin",4370:"css/profile",6952:"css/appdark",8252:"css/app",8759:"css/spa"}[e]+".css"),n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},o="pixelfed:",n.l=(e,a,t,c)=>{if(r[e])r[e].push(a);else{var d,s;if(void 0!==t)for(var i=document.getElementsByTagName("script"),f=0;f<i.length;f++){var l=i[f];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==o+t){d=l;break}}d||(s=!0,(d=document.createElement("script")).charset="utf-8",n.nc&&d.setAttribute("nonce",n.nc),d.setAttribute("data-webpack",o+t),d.src=e),r[e]=[a];var u=(o,a)=>{d.onerror=d.onload=null,clearTimeout(b);var t=r[e];if(delete r[e],d.parentNode&&d.parentNode.removeChild(d),t&&t.forEach(e=>e(a)),o)return o(a)},b=setTimeout(u.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=u.bind(null,d.onerror),d.onload=u.bind(null,d.onload),s&&document.head.appendChild(d)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),n.p="/",(()=>{var e={461:0,6952:0,8252:0,2305:0,3364:0,2540:0,4370:0,8759:0};n.f.j=(r,o)=>{var a=n.o(e,r)?e[r]:void 0;if(0!==a)if(a)o.push(a[2]);else if(/^((69|82)52|2305|2540|3364|4370|461|8759)$/.test(r))e[r]=0;else{var t=new Promise((o,t)=>a=e[r]=[o,t]);o.push(a[2]=t);var c=n.p+n.u(r),d=new Error;n.l(c,o=>{if(n.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var t=o&&("load"===o.type?"missing":o.type),c=o&&o.target&&o.target.src;d.message="Loading chunk "+r+" failed.\n("+t+": "+c+")",d.name="ChunkLoadError",d.type=t,d.request=c,a[1](d)}},"chunk-"+r,r)}},n.O.j=r=>0===e[r];var r=(r,o)=>{var a,t,[c,d,s]=o,i=0;if(c.some(r=>0!==e[r])){for(a in d)n.o(d,a)&&(n.m[a]=d[a]);if(s)var f=s(n)}for(r&&r(o);i<c.length;i++)t=c[i],n.o(e,t)&&e[t]&&e[t][0](),e[t]=0;return n.O(f)},o=self.webpackChunkpixelfed=self.webpackChunkpixelfed||[];o.forEach(r.bind(null,0)),o.push=r.bind(null,o.push.bind(o))})(),n.nc=void 0})();
(()=>{"use strict";var e,r,o,a={},t={};function c(e){var r=t[e];if(void 0!==r)return r.exports;var o=t[e]={id:e,loaded:!1,exports:{}};return a[e].call(o.exports,o,o.exports,c),o.loaded=!0,o.exports}c.m=a,e=[],c.O=(r,o,a,t)=>{if(!o){var n=1/0;for(f=0;f<e.length;f++){for(var[o,a,t]=e[f],d=!0,s=0;s<o.length;s++)(!1&t||n>=t)&&Object.keys(c.O).every(e=>c.O[e](o[s]))?o.splice(s--,1):(d=!1,t<n&&(n=t));if(d){e.splice(f--,1);var i=a();void 0!==i&&(r=i)}}return r}t=t||0;for(var f=e.length;f>0&&e[f-1][2]>t;f--)e[f]=e[f-1];e[f]=[o,a,t]},c.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return c.d(r,{a:r}),r},c.d=(e,r)=>{for(var o in r)c.o(r,o)&&!c.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce((r,o)=>(c.f[o](e,r),r),[])),c.u=e=>"js/"+{529:"groups-page",1179:"daci.chunk",1240:"discover~myhashtags.chunk",1645:"profile~following.bundle",2156:"dms.chunk",2822:"group.create",2966:"discover~hashtag.bundle",3688:"discover~serverfeed.chunk",4951:"home.chunk",6250:"discover~settings.chunk",6438:"groups-page-media",6535:"discover.chunk",6740:"discover~memories.chunk",6791:"groups-page-members",7206:"groups-page-topics",7342:"groups-post",7399:"dms~message.chunk",7413:"error404.bundle",7521:"discover~findfriends.chunk",7744:"notifications.chunk",8087:"profile.chunk",8119:"i18n.bundle",8257:"groups-page-about",8408:"post.chunk",8977:"profile~followers.bundle",9124:"compose.chunk",9231:"groups-profile",9919:"changelog.bundle"}[e]+"."+{529:"2826b7d8bc08bf22",1179:"4e7adc83fb3e6c26",1240:"b1170e28d46614b1",1645:"30a324bbbe437db7",2156:"13a1bf15db918fb7",2822:"82affc4a7b5983b0",2966:"43d7fefd51744728",3688:"b46e1b4180b850db",4951:"478a11db7f8bcc5b",6250:"a99d878b83352bea",6438:"f3be2d8b0ca59cdf",6535:"0a3c5b36cedbad42",6740:"3da68f4ee0598a4c",6791:"a2d12bc765ad0f38",7206:"7bee36f3edc0de92",7342:"aca9f85bd8b36f70",7399:"ca55c5d89171edc4",7413:"c408e3fce0f80bcb",7521:"271194c07b172af4",7744:"d2559e00a1a30220",8087:"0edce32375cf0e7a",8119:"9ffc0aacc1ff49e5",8257:"dfb2744b2a28d4c5",8408:"57be46e07bc9aee6",8977:"8381cac06885ce77",9124:"2c9141ff4969e238",9231:"924132e02f73d082",9919:"f97c6c2fdd203b90"}[e]+".js",c.miniCssF=e=>({2305:"css/portfolio",2540:"css/landing",3364:"css/admin",4370:"css/profile",6952:"css/appdark",8252:"css/app",8759:"css/spa"}[e]+".css"),c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},o="pixelfed:",c.l=(e,a,t,n)=>{if(r[e])r[e].push(a);else{var d,s;if(void 0!==t)for(var i=document.getElementsByTagName("script"),f=0;f<i.length;f++){var l=i[f];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==o+t){d=l;break}}d||(s=!0,(d=document.createElement("script")).charset="utf-8",c.nc&&d.setAttribute("nonce",c.nc),d.setAttribute("data-webpack",o+t),d.src=e),r[e]=[a];var u=(o,a)=>{d.onerror=d.onload=null,clearTimeout(b);var t=r[e];if(delete r[e],d.parentNode&&d.parentNode.removeChild(d),t&&t.forEach(e=>e(a)),o)return o(a)},b=setTimeout(u.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=u.bind(null,d.onerror),d.onload=u.bind(null,d.onload),s&&document.head.appendChild(d)}},c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),c.p="/",(()=>{var e={461:0,6952:0,8252:0,2305:0,3364:0,2540:0,4370:0,8759:0};c.f.j=(r,o)=>{var a=c.o(e,r)?e[r]:void 0;if(0!==a)if(a)o.push(a[2]);else if(/^((69|82)52|2305|2540|3364|4370|461|8759)$/.test(r))e[r]=0;else{var t=new Promise((o,t)=>a=e[r]=[o,t]);o.push(a[2]=t);var n=c.p+c.u(r),d=new Error;c.l(n,o=>{if(c.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var t=o&&("load"===o.type?"missing":o.type),n=o&&o.target&&o.target.src;d.message="Loading chunk "+r+" failed.\n("+t+": "+n+")",d.name="ChunkLoadError",d.type=t,d.request=n,a[1](d)}},"chunk-"+r,r)}},c.O.j=r=>0===e[r];var r=(r,o)=>{var a,t,[n,d,s]=o,i=0;if(n.some(r=>0!==e[r])){for(a in d)c.o(d,a)&&(c.m[a]=d[a]);if(s)var f=s(c)}for(r&&r(o);i<n.length;i++)t=n[i],c.o(e,t)&&e[t]&&e[t][0](),e[t]=0;return c.O(f)},o=self.webpackChunkpixelfed=self.webpackChunkpixelfed||[];o.forEach(r.bind(null,0)),o.push=r.bind(null,o.push.bind(o))})(),c.nc=void 0})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/js/spa.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -3,9 +3,9 @@
"/js/activity.js": "/js/activity.js?id=5ff0d41f0c063205e2fd27b7d3a89d40",
"/js/components.js": "/js/components.js?id=6e1d1eba5b3a8d160ccd2b7203f29deb",
"/js/discover.js": "/js/discover.js?id=952469fb673a19bf07f5640d8c31d6a8",
"/js/profile.js": "/js/profile.js?id=b11d67911aecc9c55a5c6d3138bc5c80",
"/js/status.js": "/js/status.js?id=1e860329ca7143f91a6c5fb807ac9744",
"/js/timeline.js": "/js/timeline.js?id=d9407d6ced550261b583f0bba2c2676e",
"/js/profile.js": "/js/profile.js?id=4c2bbe95e260e637f77ec281cf4f0f74",
"/js/status.js": "/js/status.js?id=ffbaff443b0cc68ff0ca823227081506",
"/js/timeline.js": "/js/timeline.js?id=8b3ca8b9d5eb79f6d9fad28f00dda78e",
"/js/compose.js": "/js/compose.js?id=026f9f5ad4c97335697df06eb89458fc",
"/js/compose-classic.js": "/js/compose-classic.js?id=b335bd735825156da46bd75c881855fc",
"/js/search.js": "/js/search.js?id=9dfe84a2449a214a2b0e6dd5b327e07d",
@ -16,23 +16,23 @@
"/js/profile-directory.js": "/js/profile-directory.js?id=316f0746cc50f5e5bbb790f11494c6ec",
"/js/story-compose.js": "/js/story-compose.js?id=53bba3b9d435cbd7a1689fc07f15439c",
"/js/direct.js": "/js/direct.js?id=7d716b0453d4ad885cb600c0cef953aa",
"/js/admin.js": "/js/admin.js?id=9b720238c2e1d3903fc6021387e527e3",
"/js/spa.js": "/js/spa.js?id=e7c34b434a827c8b1f8ea871f9722046",
"/js/admin.js": "/js/admin.js?id=537063985d418757459aefaba92ac2a4",
"/js/spa.js": "/js/spa.js?id=c52cb6829db21946629de26497abbaaf",
"/js/stories.js": "/js/stories.js?id=8565c19bc915466ed5dd98076cfa3f04",
"/js/portfolio.js": "/js/portfolio.js?id=2dfd35982335ad4eca174b70bc0e9bb4",
"/js/account-import.js": "/js/account-import.js?id=fb9b306bcf2293dbb12c37e6629229db",
"/js/admin_invite.js": "/js/admin_invite.js?id=200302f8562e57371a89a533d8b06f46",
"/js/landing.js": "/js/landing.js?id=4cd020a2029a345c68204f8f783c16cc",
"/js/remote_auth.js": "/js/remote_auth.js?id=c3f3d3f486795671a8eb9074893f99b8",
"/js/groups.js": "/js/groups.js?id=a937eafec16e12848a15f1d5fa684b30",
"/js/group-status.js": "/js/group-status.js?id=53bd0f46607726d39535bfd37899d8b4",
"/js/group-topic-feed.js": "/js/group-topic-feed.js?id=027fb6d2ccd43c34cbae36d7e8646f08",
"/js/groups.js": "/js/groups.js?id=9db2af41cd4c03debe063e52406e1289",
"/js/group-status.js": "/js/group-status.js?id=6c4beadaba21b463c2d2c850c9ba1096",
"/js/group-topic-feed.js": "/js/group-topic-feed.js?id=49e74fc85311b0ca5b89ac66c55dd968",
"/js/custom_filters.js": "/js/custom_filters.js?id=f633fb6090aa4906678dc37b41f9f62d",
"/js/settings.js": "/js/settings.js?id=05d89311feefa503f2fa2272d1432b37",
"/js/manifest.js": "/js/manifest.js?id=aed20066772e76a11d05e1227556f2d8",
"/js/manifest.js": "/js/manifest.js?id=c436e293e8a60aab46b0c74b1a9ee76a",
"/js/home.chunk.478a11db7f8bcc5b.js": "/js/home.chunk.478a11db7f8bcc5b.js?id=68c89b7d50d55f19244c8a109f981296",
"/js/compose.chunk.2c9141ff4969e238.js": "/js/compose.chunk.2c9141ff4969e238.js?id=f7e545b714de63d674b717508145fdf7",
"/js/post.chunk.d974a3aee1468f5f.js": "/js/post.chunk.d974a3aee1468f5f.js?id=e4bf5fd215a4069d4c408851b718433f",
"/js/post.chunk.57be46e07bc9aee6.js": "/js/post.chunk.57be46e07bc9aee6.js?id=255205b18aa58394551d5b52660af3dc",
"/js/profile.chunk.0edce32375cf0e7a.js": "/js/profile.chunk.0edce32375cf0e7a.js?id=55cc5bc8db465abb11fd01955198621e",
"/js/discover~memories.chunk.3da68f4ee0598a4c.js": "/js/discover~memories.chunk.3da68f4ee0598a4c.js?id=0186c30f1919e36a687293027a0aa8fd",
"/js/discover~myhashtags.chunk.b1170e28d46614b1.js": "/js/discover~myhashtags.chunk.b1170e28d46614b1.js?id=a5ad22dc16ddd2e918e8a52c8f9fce42",
@ -65,5 +65,5 @@
"/css/landing.css": "/css/landing.css?id=fb78389492f56a927d3d9bbb3ebd8204",
"/css/profile.css": "/css/profile.css?id=ae4f5db9bb1a89db2ae293d6bde812e3",
"/css/spa.css": "/css/spa.css?id=041aed9a146db0e74b2cfe3ad8eaf96c",
"/js/vendor.js": "/js/vendor.js?id=5421cff048ac997d612c792e739191b3"
"/js/vendor.js": "/js/vendor.js?id=656e247c107358c2a154a3044dacd007"
}

@ -40,6 +40,7 @@
v-on:follow="follow()"
v-on:unfollow="unfollow()"
v-on:counter-change="counterChange"
v-on:comment-likes-modal="openCommentLikesModal"
/>
</div>
@ -93,7 +94,7 @@
<likes-modal
v-if="showLikesModal"
ref="likesModal"
:status="shadowStatus"
:status="likesModalPost"
:profile="user"
/>
@ -165,6 +166,7 @@
media: undefined,
mediaIndex: 0,
showLikesModal: false,
likesModalPost: {},
isReply: false,
reply: {},
showSharesModal: false,
@ -367,6 +369,7 @@
},
openLikesModal() {
this.likesModalPost = this.post.reblog ? this.post.reblog : this.post;
this.showLikesModal = true;
this.$nextTick(() => {
this.$refs.likesModal.open();
@ -460,6 +463,18 @@
handleUnpinned() {
this.post.pinned = false;
},
openCommentLikesModal(post) {
if(post.reblog != null) {
this.likesModalPost = post.reblog;
} else {
this.likesModalPost = post;
}
this.showLikesModal = true;
this.$nextTick(() => {
this.$refs.likesModal.open();
});
},
}
}
</script>

@ -225,18 +225,6 @@
</div>
<div v-if="config.features.label.covid.enabled && status.label && status.label.covid == true" class="card-body border-top border-bottom py-2 cursor-pointer pr-2" @click="labelRedirect()">
<p class="font-weight-bold d-flex justify-content-between align-items-center mb-0">
<span>
<i class="fas fa-info-circle mr-2"></i>
For information about COVID-19, {{config.features.label.covid.org}}
</span>
<span>
<i class="fas fa-chevron-right text-lighter"></i>
</span>
</p>
</div>
<div class="card-body">
<div v-if="reactionBar" class="reactions my-1 pb-2">
<h3 v-if="status.favourited" class="fas fa-heart text-danger pr-3 m-0 cursor-pointer" title="Like" v-on:click="likeStatus(status, $event);"></h3>
@ -708,11 +696,6 @@
window.location.href = status.media_attachments[0].url;
},
labelRedirect(type) {
let url = '/i/redirect?url=' + encodeURI(this.config.features.label.covid.url);
window.location.href = url;
},
likeStatus(status, event) {
event.currentTarget.blur();
let count = status.favourites_count;

@ -1,130 +0,0 @@
<template>
<div class="w-100 h-100">
<div v-if="loading" style="min-height: 400px;" class="d-flex justify-content-center align-items-center">
<img src="/img/pixelfed-icon-grey.svg" class="">
</div>
<div v-else>
<div class="mb-4">
<p class="text-center">
<!-- <a :class="[tab == 'popular'? 'btn font-weight-bold py-0 btn-success' : 'btn font-weight-bold py-0 btn-outline-success']" href="#" @click.prevent="setTab('popular')">Popular</a> -->
<a :class="[tab == 'new'? 'btn font-weight-bold py-0 btn-success' : 'btn font-weight-bold py-0 btn-outline-success']" href="#" @click.prevent="setTab('new')">New</a>
<!-- <a :class="[tab == 'random'? 'btn font-weight-bold py-0 btn-success' : 'btn font-weight-bold py-0 btn-outline-success']" href="#" @click.prevent="setTab('random')">Random</a> -->
<a :class="[tab == 'about'? 'btn font-weight-bold py-0 btn-success' : 'btn font-weight-bold py-0 btn-outline-success']" href="#" @click.prevent="setTab('about')">About</a>
</p>
</div>
<div v-if="tab != 'about'" class="row loops-container">
<div class="col-12 col-md-4 mb-3" v-for="(loop, index) in loops">
<div class="card border border-success">
<div class="embed-responsive embed-responsive-1by1">
<video class="embed-responsive-item" :src="videoSrc(loop)" preload="none" width="100%" height="100%" loop @click="toggleVideo(loop, $event)" :poster="posterSrc(loop)"></video>
</div>
<div class="card-body">
<p class="username font-weight-bolder lead d-flex justify-content-between">
<a :href="loop.account.url" :title="loop.account.acct">{{truncate(loop.account.acct)}}</a>
<a :href="loop.url">{{timestamp(loop)}}</a></p>
<p class="small text-muted text-truncate" v-html="getTitle(loop)"></p>
<div class="small text-muted d-flex justify-content-between mb-0">
<span>{{loop.favourites_count}} Likes</span>
<span>{{loop.reblogs_count}} Shares</span>
<span>{{loop.reply_count}} Comments</span>
</div>
</div>
</div>
</div>
</div>
<div v-else class="col-12">
<div class="card">
<div class="card-body">
<p class="lead text-center mb-0">Loops are an exciting new way to explore short videos on Pixelfed.</p>
</div>
</div>
</div>
</div>
</div>
</template>
<style type="text/css">
.loops-container .card {
box-shadow: none;
}
.loops-container .card .card-img-top{
border-radius: 0;
}
.loops-container a {
color: #343a40;
}
a.hashtag,
.loops-container .card-body a:hover {
color: #28a745 !important;
}
</style>
<script type="text/javascript">
Object.defineProperty(HTMLMediaElement.prototype, 'playing', {
get: function(){
return !!(this.currentTime > 0 && !this.paused && !this.ended && this.readyState > 2);
}
})
export default {
data() {
return {
loading: true,
version: 1,
loops: [],
tab: 'new'
}
},
mounted() {
axios.get('/api/v2/loops')
.then(res => {
this.loops = res.data;
this.loading = false;
})
},
methods: {
videoSrc(loop) {
return loop.media_attachments[0].url;
},
posterSrc(loop) {
return loop.media_attachments[0].preview_url;
},
setTab(tab) {
this.tab = tab;
},
toggleVideo(loop, $event) {
let el = $event.target;
$('video').each(function() {
if(el.src != $(this)[0].src) {
$(this)[0].pause();
}
});
if(!el.playing) {
el.play();
//this.incrementLoop(loop);
} else {
el.pause();
}
},
incrementLoop(loop) {
// axios.post('/api/v2/loops/watch', {
// id: loop.id
// }).then(res => {
// console.log(res.data);
// });
},
timestamp(loop) {
let ts = new Date(loop.created_at);
return ts.toLocaleDateString();
},
getTitle(loop) {
let content = loop.content ? loop.content : 'Untitled';
return content.trim();
},
truncate(str, len = 15) {
return _.truncate(str, {length: len});
}
}
}
</script>

@ -16,7 +16,7 @@
<div class="d-flex d-md-none align-items-center justify-content-between card-header bg-white w-100">
<div class="d-flex">
<div class="status-avatar mr-2" @click="redirect(statusProfileUrl)">
<img :src="statusAvatar" width="24px" height="24px" style="border-radius:12px;" class="cursor-pointer">
<img :src="statusAvatar" width="24px" height="24px" style="border-radius:12px;" class="cursor-pointer" :alt="`${statusUsername}'s avatar`">
</div>
<div class="username">
<span class="username-link font-weight-bold text-dark cursor-pointer" @click="redirect(statusProfileUrl)">{{ statusUsername }}</span>
@ -82,7 +82,7 @@
<div class="d-md-flex d-none align-items-center justify-content-between card-header py-3 bg-white">
<div class="d-flex align-items-center status-username text-truncate">
<div class="status-avatar mr-2" @click="redirect(statusProfileUrl)">
<img :src="statusAvatar" width="24px" height="24px" style="border-radius:12px;" class="cursor-pointer">
<img :src="statusAvatar" width="24px" height="24px" style="border-radius:12px;" class="cursor-pointer" :alt="`${statusUsername}'s avatar`">
</div>
<div class="username">
<span class="username-link font-weight-bold text-dark cursor-pointer" @click="redirect(statusProfileUrl)">{{ statusUsername }}</span>

@ -36,37 +36,6 @@
<announcements-card v-on:show-tips="showTips = $event"></announcements-card>
</div> -->
<!-- <div v-if="index == 2 && showSuggestions == true && suggestions.length" class="card status-card rounded-0 shadow-none border">
<div class="card-header d-flex align-items-center justify-content-between bg-white border-0 pb-0">
<h6 class="text-muted font-weight-bold mb-0">Suggestions For You</h6>
<span class="cursor-pointer text-muted" v-on:click="hideSuggestions"><i class="fas fa-times"></i></span>
</div>
<div class="card-body row mx-0">
<div class="col-12 col-md-4 mb-3" v-for="(rec, index) in suggestions">
<div class="card">
<div class="card-body text-center pt-3">
<p class="mb-0">
<a :href="'/'+rec.username">
<img :src="rec.avatar" class="img-fluid rounded-circle cursor-pointer" width="45px" height="45px" onerror="this.onerror=null;this.src='/storage/avatars/default.png?v=2'" alt="avatar">
</a>
</p>
<div class="py-3">
<p class="font-weight-bold text-dark cursor-pointer mb-0">
<a :href="'/'+rec.username" class="text-decoration-none text-dark">
{{rec.username}}
</a>
</p>
<p class="small text-muted mb-0">{{rec.message}}</p>
</div>
<p class="mb-0">
<a class="btn btn-primary btn-block font-weight-bold py-0" href="#" @click.prevent="expRecFollow(rec.id, index)">Follow</a>
</p>
</div>
</div>
</div>
</div>
</div> -->
<!-- <div v-if="index == 4 && showHashtagPosts && hashtagPosts.length" class="card status-card rounded-0 shadow-none border border-top-0">
<div class="card-header bg-white border-0 mb-0">
<div class="d-flex align-items-center justify-content-between pt-2">
@ -304,31 +273,6 @@
<notification-card></notification-card>
</div>
<div v-show="showSuggestions == true && suggestions.length && config.ab && config.ab.rec == true" class="mb-4">
<div class="card shadow-none border">
<div class="card-header bg-white d-flex align-items-center justify-content-between">
<a class="small text-muted cursor-pointer" href="#" @click.prevent="refreshSuggestions" ref="suggestionRefresh"><i class="fas fa-sync-alt"></i></a>
<div class="small text-dark text-uppercase font-weight-bold">Suggestions</div>
<div class="small text-muted cursor-pointer" v-on:click="hideSuggestions"><i class="fas fa-times"></i></div>
</div>
<div class="card-body pt-0">
<div v-for="(rec, index) in suggestions" class="media align-items-center mt-3">
<a :href="'/'+rec.username">
<img :src="rec.avatar" width="32px" height="32px" class="rounded-circle mr-3" onerror="this.onerror=null;this.src='/storage/avatars/default.png?v=2'" alt="avatar">
</a>
<div class="media-body">
<p class="mb-0 font-weight-bold small">
<a :href="'/'+rec.username" class="text-decoration-none text-dark">
{{rec.username}}
</a>
</p>
<p class="mb-0 small text-muted">{{rec.message}}</p>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="container px-0 pb-5">
<p class="mb-2 small text-justify">
@ -447,7 +391,6 @@
profile: {},
min_id: 0,
max_id: 0,
suggestions: {},
loading: true,
replies: [],
replyId: null,
@ -464,7 +407,6 @@
followingCursor: 1,
followingMore: true,
lightboxMedia: false,
showSuggestions: true,
showReadMore: true,
replyStatus: {},
replyText: '',
@ -551,12 +493,6 @@
this.showPromo = localStorage.getItem('pf_metro_ui.exp.spa' + new Date().getMonth()) == 'false' ? false : true;
}
if(localStorage.getItem('pf_metro_ui.exp.rec') == 'false') {
this.showSuggestions = false;
} else {
this.showSuggestions = true;
}
if(localStorage.getItem('pf_metro_ui.exp.rm') == 'false') {
this.showReadMore = false;
} else {
@ -748,18 +684,6 @@
return;
},
expRec() {
//return;
if(this.config.ab.rec == false) {
return;
}
axios.get('/api/local/exp/rec')
.then(res => {
this.suggestions = res.data;
})
},
owner(status) {
return this.profile.id === status.account.id;
},
@ -772,11 +696,6 @@
return this.owner(status) || this.admin();
},
hideSuggestions() {
localStorage.setItem('pf_metro_ui.exp.rec', false);
this.showSuggestions = false;
},
emojiReaction(status) {
let em = event.target.innerText;
if(this.replyText.length == 0) {
@ -788,41 +707,6 @@
}
},
refreshSuggestions() {
return;
let el = event.target.parentNode;
if(el.classList.contains('disabled') == true) {
return;
}
axios.get('/api/local/exp/rec', {
params: {
refresh: true
}
})
.then(res => {
this.suggestions = res.data;
if (el.classList) {
el.classList.add('disabled');
el.classList.add('text-light');
}
else {
el.className += ' ' + 'disabled text-light';
}
setTimeout(function() {
el.setAttribute('href', '#');
if (el.classList) {
el.classList.remove('disabled');
el.classList.remove('text-light');
}
else {
el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), 'disabled text-light');
}
}, 10000);
});
},
fetchHashtagPosts() {
axios.get('/api/local/discover/tag/list')
.then(res => {

@ -109,18 +109,6 @@
</div>
<div v-if="config.features.label.covid.enabled && status.label && status.label.covid == true" class="card-body border-top border-bottom py-2 cursor-pointer pr-2" @click="labelRedirect()">
<p class="font-weight-bold d-flex justify-content-between align-items-center mb-0">
<span>
<i class="fas fa-info-circle mr-2"></i>
For information about COVID-19, {{config.features.label.covid.org}}
</span>
<span>
<i class="fas fa-chevron-right text-lighter"></i>
</span>
</p>
</div>
<div class="card-body">
<div v-if="reactionBar" class="reactions my-1 pb-2">
<h3 v-if="status.favourited" class="fas fa-heart text-danger pr-3 m-0 cursor-pointer" title="Like" v-on:click="likeStatus(status, $event);"></h3>
@ -311,11 +299,6 @@
window.location.href = status.media_attachments[0].url;
},
labelRedirect(type) {
let url = '/i/redirect?url=' + encodeURI(this.config.features.label.covid.url);
window.location.href = url;
},
likeStatus(status, event) {
if($('body').hasClass('loggedIn') == false) {
return;

@ -1,4 +0,0 @@
Vue.component(
'loops-component',
require('./components/LoopComponent.vue').default
);

@ -296,11 +296,6 @@
<td><span>"{{config_cache('database.redis.client')}}"</span></td>
</tr>
<tr>
<td><span class="badge badge-primary">EXP</span></td>
<td><strong>EXP_LC</strong></td>
<td><span>{{config_cache('exp.lc') ? '✅ true' : '❌ false' }}</span></td>
</tr>
<tr>
<td><span class="badge badge-primary">EXP</span></td>
<td><strong>EXP_TOP</strong></td>
@ -502,11 +497,6 @@
<td><strong>INSTANCE_DISCOVER_PUBLIC</strong></td>
<td><span>{{config_cache('instance.discover.public') ? '✅ true' : '❌ false' }}</span></td>
</tr>
<tr>
<td><span class="badge badge-primary">INSTANCE</span></td>
<td><strong>EXP_LOOPS</strong></td>
<td><span>{{config_cache('instance.discover.loops.enabled') ? '✅ true' : '❌ false' }}</span></td>
</tr>
<tr>
<td><span class="badge badge-primary">INSTANCE</span></td>
<td><strong>INSTANCE_PUBLIC_HASHTAGS</strong></td>
@ -604,21 +594,6 @@
<td><strong>OAUTH_PAT_ID</strong></td>
<td><span>"{{config_cache('instance.oauth.pat.id')}}"</span></td>
</tr>
<tr>
<td><span class="badge badge-primary">INSTANCE</span></td>
<td><strong>ENABLE_COVID_LABEL</strong></td>
<td><span>{{config_cache('instance.label.covid.enabled') ? '✅ true' : '❌ false' }}</span></td>
</tr>
<tr>
<td><span class="badge badge-primary">INSTANCE</span></td>
<td><strong>COVID_LABEL_URL</strong></td>
<td><span>"{{config_cache('instance.label.covid.url')}}"</span></td>
</tr>
<tr>
<td><span class="badge badge-primary">INSTANCE</span></td>
<td><strong>COVID_LABEL_ORG</strong></td>
<td><span>"{{config_cache('instance.label.covid.org')}}"</span></td>
</tr>
<tr>
<td><span class="badge badge-primary">INSTANCE</span></td>
<td><strong>ENABLE_CONFIG_CACHE</strong></td>

@ -1,43 +0,0 @@
@extends('layouts.app')
@section('content')
<div class="bg-primary">
<p class="text-center text-white mb-0 py-3 font-weight-bold">
<i class="fas fa-exclamation-triangle fa-lg mr-2"></i> This feature has been deprecated and will be removed in a future version.
</p>
</div>
<div class="profile-header">
<div class="container pt-5">
<div class="profile-details text-center">
<div class="username-bar text-dark">
<p class="display-4 font-weight-bold mb-0"><span class="text-success">Loops</span> <sup class="lead">BETA</sup></p>
<p class="lead font-weight-lighter">Short looping videos</p>
</div>
</div>
</div>
</div>
<div class="loop-page container mt-5">
<section>
<loops-component></loops-component>
</section>
</div>
@endsection
@push('styles')
<style type="text/css">
@media (min-width: 1200px) {
.loop-page.container {
max-width: 1035px;
}
}
</style>
@endpush
@push('scripts')
<script type="text/javascript" src="{{ mix('js/loops.js') }}"></script>
<script type="text/javascript" src="{{ mix('js/compose.js') }}"></script>
<script type="text/javascript">
$(document).ready(function(){
new Vue({el: '#content'});
});
</script>
@endpush

@ -53,8 +53,6 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
Route::get('status/{id}/replies', 'InternalApiController@statusReplies');
Route::post('moderator/action', 'InternalApiController@modAction');
Route::get('discover/categories', 'InternalApiController@discoverCategories');
Route::get('loops', 'DiscoverController@loopsApi');
Route::post('loops/watch', 'DiscoverController@loopWatch');
Route::get('discover/tag', 'DiscoverController@getHashtags');
Route::get('statuses/{id}/replies', 'Api\ApiV1Controller@statusReplies');
Route::get('statuses/{id}/state', 'Api\ApiV1Controller@statusState');
@ -95,8 +93,6 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
Route::get('comments/{username}/status/{postId}', 'PublicApiController@statusComments');
Route::post('moderator/action', 'InternalApiController@modAction');
Route::get('discover/categories', 'InternalApiController@discoverCategories');
Route::get('loops', 'DiscoverController@loopsApi');
Route::post('loops/watch', 'DiscoverController@loopWatch');
Route::get('discover/tag', 'DiscoverController@getHashtags');
Route::get('discover/posts/trending', 'DiscoverController@trendingApi');
Route::get('discover/posts/hashtags', 'DiscoverController@trendingHashtags');
@ -124,7 +120,6 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
Route::group(['prefix' => 'local'], function () {
// Route::post('status/compose', 'InternalApiController@composePost')->middleware('throttle:maxPostsPerHour,60')->middleware('throttle:maxPostsPerDay,1440');
Route::get('exp/rec', 'ApiController@userRecommendations');
Route::post('discover/tag/subscribe', 'HashtagFollowController@store');
Route::get('discover/tag/list', 'HashtagFollowController@getTags');
// Route::get('profile/sponsor/{id}', 'ProfileSponsorController@get');

Loading…
Cancel
Save