<!DOCTYPE html>
<html lang="en">
<head>
<script>
var isLoggedIn = false;
</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jaycuba owner kin.top
Professional Tantra Masseur / Energy healer having done over 1000 sessions with women.
spiritually awakening through mooji.
full-time vanlifer now 26 months (mostly portugal, spain, france)
english (very good)
czech (spoken pretty good)
german (very good)
french (medium)
spanish (very good)
italian (understand a lot can speak a little)
portuguese (getting better basically medium beginner understand a lot)</title>
<!--<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css">-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css" integrity="sha512-SnH5WK+bZxgPHs44uWIX+LLJAJ9/2PkPKZ5QiAj6Ta86w+fsb2TkcmfRyVX3pBnMFcV7oQPJkl9QevSCWr3W6A==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-48x48.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" id="favicon">
<link rel="manifest" href="/site.webmanifest?v=1">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<link rel="apple-touch-icon" href="/android-chrome-192x192.png">
<!-- Twitter Card data -->
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@kinglobal">
<meta name="twitter:title" content="jaycuba owner kin.top
Professional Tantra Masseur / Energy healer having done over 1000 sessions with women.
spiritually awakening through mooji.
full-time vanlifer now 26 months (mostly portugal, spain, france)
english (very good)
czech (spoken pretty good)
german (very good)
french (medium)
spanish (very good)
italian (understand a lot can speak a little)
portuguese (getting better basically medium beginner understand a lot)">
<meta name="twitter:description" content="Join Kin.top to earn rewards by inviting friends and participating in our communities.">
<meta name="twitter:image" content="https://kin.top/hugecat.png"><meta property="og:image" content="https://kin.top/thecat.png" />
<!-- Open Graph data -->
<meta property="og:title" content="jaycuba owner kin.top
Professional Tantra Masseur / Energy healer having done over 1000 sessions with women.
spiritually awakening through mooji.
full-time vanlifer now 26 months (mostly portugal, spain, france)
english (very good)
czech (spoken pretty good)
german (very good)
french (medium)
spanish (very good)
italian (understand a lot can speak a little)
portuguese (getting better basically medium beginner understand a lot)" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://kin.top/user/jaycuba" />
<meta property="og:description" content="Join Kin.top to earn rewards by inviting friends and participating in our communities." />
<meta property="og:site_name" content="Kin.top" />
<style>
body {
overflow-y: scroll; /* Ensures the vertical scrollbar is always active */
background-color: #DAE0E6;
padding-top: 60px; /* Adjust this value based on your navbar height */
}
html{
padding:0px;
margin:0px;
}
/* Ensure .reddit-post is centered on mobile screens */
@media (max-width: 768px) {
.reddit-post {
margin: 0 auto;
}
.comment-text{
display:none;
}
.navbar-collapse {
max-height: 600px; /* Adjust this value as needed */
overflow-y: auto;
}
}
.superboostcounter {
color: #1C1C1C;
font-size:12px;
}
.slurp {
color: #1C1C1C;
font-weight: bold;
}
.slurp a {
color: #1C1C1C;
text-decoration: none;
}
.reddit-post {
display: flex;
align-items: flex-start; /* Changed from center to flex-start */
border: 1px solid #e1e4e8;
border-radius: 6px;
padding: 12px;
background-color: #ffffff;
margin-bottom: 6px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
}
.comment {
border: 1px solid #e1e4e8;
border-radius: 6px;
padding: 12px;
background-color: #ffffff;
margin-bottom: 12px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
}
.post-content {
flex-grow: 1;
}
.post-title {
font-size: 18px;
font-weight: 500;
margin-bottom: 5px;
}
.post-title a {
color: #0079d3;
text-decoration: none;
}
.post-title a:hover {
text-decoration: underline;
}
.post-meta {
font-size: 12px;
color: #787c7e;
margin-bottom:0px;
}
.post-actions {
display: flex;
align-items: center;
color: #747474;
}
.post-actions a{
color: #747474;
}
.post-actions .btn-link {
color: #747474;
text-decoration: none;
font-family: Arial, Helvetica, sans-serif;
font-size: 14px;
padding: 0;
margin: 0;
}
.post-actions .btn-link:hover {
text-decoration: underline;
}
.post-actions .several-comments{
color: #454545;
}
.post-actions .no-comments{
color: #c5c5c5;
}
.img-preview{
border-radius:3px;
-webkit-box-shadow: 0px 2px 3px -1px rgba(0,0,0,0.35);
box-shadow: 0px 2px 3px -1px rgba(0,0,0,0.35);
}
.post-actions .superboost-btn {
font-family: Arial, Helvetica, sans-serif;
font-size: 14px;
}
.comment {
border-left: 2px solid #007bff;
padding-left: 15px;
margin-bottom: 15px;
}
.comment-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 5px;
}
.comment-actions {
display: flex;
gap: 10px;
}
.comment-content {
margin-bottom: 10px;
}
.edit-form {
display: none;
margin-top: 10px;
}
.spinner-border-custom {
display: inline-block;
width: 1rem;
height: 1rem;
vertical-align: text-bottom;
border: 0.25em solid currentColor;
border-right-color: transparent;
border-radius: 50%;
animation: spinner-border 0.75s linear infinite;
}
@keyframes spinner-border {
100% {
transform: rotate(360deg);
}
}
.page-load-status {
display: none; /* hidden by default */
padding-top: 20px;
border-top: 1px solid #DDD;
text-align: center;
color: #777;
}
/* loader ellips */
.loader-ellips {
font-size: 20px;
position: relative;
width: 4em;
height: 1em;
margin: 10px auto;
}
.loader-ellips__dot {
display: block;
width: 1em;
height: 1em;
border-radius: 0.5em;
background: #555;
position: absolute;
animation-duration: 0.5s;
animation-timing-function: ease;
animation-iteration-count: infinite;
}
.loader-ellips__dot:nth-child(1),
.loader-ellips__dot:nth-child(2) {
left: 0;
}
.loader-ellips__dot:nth-child(3) { left: 1.5em; }
.loader-ellips__dot:nth-child(4) { left: 3em; }
@keyframes reveal {
from { transform: scale(0.001); }
to { transform: scale(1); }
}
@keyframes slide {
to { transform: translateX(1.5em) }
}
.loader-ellips__dot:nth-child(1) {
animation-name: reveal;
}
.loader-ellips__dot:nth-child(2),
.loader-ellips__dot:nth-child(3) {
animation-name: slide;
}
.loader-ellips__dot:nth-child(4) {
animation-name: reveal;
animation-direction: reverse;
}
.whitepost {
border: 1px solid #e1e4e8;
border-radius: 6px;
padding: 12px;
background-color: #ffffff;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
}
.url-wrap {
word-break: break-word; /* Ensures words will break properly at the word boundary */
overflow-wrap: break-word; /* Allows the browser to break long words if needed */
white-space: normal; /* Ensures text will wrap within the container */
}
..vote-and-boost {
display: flex;
align-items: center;
justify-content: center;
border-radius: 12px; /* Rounded corners */
padding: 8px 20px; /* Adjust padding as needed */
font-size: 14px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12); /* Subtle shadow */
}
.vote-and-boost button {
border: none;
background: none;
cursor: pointer;
font-size: 20px; /* Adjust the size to match the image */
line-height: 1;
color: #b4afa5; /* Default color */
}
.vote-and-boost .downvote {
}
.vote-and-boost .vote-count {
margin: 0 10px;
font-weight: bold;
color: #333;
font-size: 16px; /* Adjust size to match the image */
}
.vote-and-boost .upvote.active {
color: #ff4500; /* Reddit's upvote orange when active */
}
.vote-and-boost .downvote.active {
color: #7193ff; /* Reddit's downvote blue when active */
}
.main-vote-container{
display:inline-block;
width:300px;
border-radius: 30px;
padding:0px 10px 5px 10px;
text-align:left;
}
.main-vote-container{
display:block;
width:40px;
border-radius: 30px;
padding:0px 10px 5px 10px;
text-align:center;
}
.main-orientation-left {
display: inline-flex;
flex-direction: column;
width:40px;
border-radius: 15px;
padding: 0px 0px;
text-align: center;
margin: 0px 3px 6px 0px;
border: 0px;
}
..vote-and-boost {
display: flex;
align-items: center;
justify-content: center;
border-radius: 12px; /* Rounded corners */
padding: 0px 20px; /* Adjust padding as needed */
font-size: 14px;
box-shadow:none;
}
.several-comments-text strong{
color:#7b9848;
}
.vote-orientation-left {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 12px;
padding: 0px;
font-size: 14px;
box-shadow: none;
margin-top:0px;
}
#nsfwToggle:not(:checked) {
background-color: #edece9;
border:1px solid #8a8a8a;
}
</style>
</head>
<body>
<script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js?v=6688a0dd5b93d')
.then((reg) => console.log('Service worker registered.', reg))
.catch((err) => console.log('Service worker registration failed:', err));
});
}
let deferredPrompt;
window.addEventListener('beforeinstallprompt', (e) => {
// Prevent the mini-infobar from appearing on mobile
e.preventDefault();
// Stash the event so it can be triggered later.
deferredPrompt = e;
// Update UI to notify the user they can add to home screen
showInstallPromotion(); // Implement this function to show a custom install button
});
const showInstallPromotion = () => {
const installButton = document.getElementById('installButton'); // Assumes you have a button with this ID
installButton.style.display = 'block';
installButton.addEventListener('click', (e) => {
// Hide the button
installButton.style.display = 'none';
// Show the install prompt
deferredPrompt.prompt();
// Wait for the user to respond to the prompt
deferredPrompt.userChoice.then((choiceResult) => {
if (choiceResult.outcome === 'accepted') {
console.log('User accepted the A2HS prompt');
} else {
console.log('User dismissed the A2HS prompt');
}
deferredPrompt = null;
});
});
};
window.addEventListener('appinstalled', (event) => {
console.log('a2hs', 'installed');
});
Notification.requestPermission().then((permission) => {
if (permission === 'granted') {
console.log('Notification permission granted.');
// Assuming you have a function to check for updates
checkForUpdates();
} else {
console.log('Notification permission denied.');
}
});
function checkForUpdates() {
/*
console.log('set badge');
// Simulate checking for updates
const hasUpdates = true; // Replace with actual update check logic
if (hasUpdates) {
// Show notification
console.log('setting badge');
new Notification('New updates available');
// Set app badge
if ('setAppBadge' in navigator) {
console.log('set badge enabled');
if ('setAppBadge' in navigator) {
navigator.setAppBadge(3).catch((error) => {
console.error('Error setting app badge:', error);
});
} else {
console.warn('Badging API not supported');
}
}
}
*/
}
</script>
<style>
.newitem{
color: #61574e
}
textarea {
overflow: hidden;
resize: none;
min-height: 50px;
box-sizing: border-box;
padding: 5px;
transition: height 0.1s ease-out;
}
/* styles.css */
.rotating-image {
display: block;
margin: 0 auto; /* Center the image horizontally */
width: 30px; /* Adjust the size as needed */
height: 30px; /* Adjust the size as needed */
animation: rotate 10s linear infinite; /* 10s is the duration, you can change it to make it slower or faster */
}
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@keyframes shake {
0% { transform: translate(1px, 1px) rotate(0deg); }
10% { transform: translate(-1px, -2px) rotate(-1deg); }
20% { transform: translate(-3px, 0px) rotate(1deg); }
30% { transform: translate(3px, 2px) rotate(0deg); }
40% { transform: translate(1px, -1px) rotate(1deg); }
50% { transform: translate(-1px, 2px) rotate(-1deg); }
60% { transform: translate(-3px, 1px) rotate(0deg); }
70% { transform: translate(3px, 1px) rotate(-1deg); }
80% { transform: translate(-1px, -1px) rotate(1deg); }
90% { transform: translate(1px, 2px) rotate(0deg); }
100% { transform: translate(1px, -2px) rotate(-1deg); }
}
#notification-bell {
position: relative;
color: #8aa00e;
}
#notification-bell i{
font-size:16px;
}
#messages-icon i{
font-size:16px;
color: #555555;
}
#notification-bell.has-notifications i {
color: #198754;
font-weight: 900;
}
#notification-count {
position: absolute;
top: -8px;
right: -8px;
background-color: #ff0000;
color: #ffffff;
border-radius: 50%;
padding: 2px 5px;
font-size: 0.7em;
}
.navbar-light .navbar-nav .nav-link {
color: #333333; /* Darker color for navbar links */
}
.navbar-light .navbar-nav .nav-link:hover,
.navbar-light .navbar-nav .nav-link:focus {
color: #000000; /* Even darker color for hover and focus states */
}
.badge.rounded-pill {
font-size:11px;
font-weight:normal;
}
.nsfw-post{
display:none !important;
}
.custombar{
background-color: rgba(255, 255, 255) !important;
border-top:2px solid #80c13e;
background: rgb(237,240,228);
background: linear-gradient(180deg, rgba(237,240,228,1) 0%, rgba(250,250,250,1) 24%, rgba(255,255,255,1) 82%);
}
.customnoticon{
background-color: #ebe9e7;
width:36px;
margin-right:4px;
background: rgb(255,255,255);
background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(235,235,235,0.7394795564710259) 100%);
border-bottom: 1px solid #981073;
}
.customnoticonnew{
border-bottom: 1px solid #981073;
background-color: #ebe9e7;
width:46px;
height:32px;
margin-right:4px;
font-size:13px;
text-align:center;
background: rgb(255,255,255);
background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(235,235,235,0.7394795564710259) 100%);
}
.custom-toggler {
text-decoration:none;
border: none; /* Remove border */
outline: none; /* Remove outline */
padding: 0; /* Remove padding */
background: transparent; /* Remove background */
font-size:13px;
}
.custom-toggler-icon {
display: block;
width: 30px;
height: 22px;
position: relative;
background-color: transparent;
cursor: pointer;
}
.custom-toggler-icon::before,
.custom-toggler-icon::after,
.custom-toggler-icon div {
content: '';
display: block;
width: 100%;
height: 4px;
background-color: #333; /* Change this color to your preferred color */
position: absolute;
left: 0;
transition: all 0.3s;
}
.custom-toggler-icon::before {
top: 0;
}
.custom-toggler-icon div {
top: 50%;
transform: translateY(-50%);
}
.custom-toggler-icon::after {
bottom: 0;
}
.btn-primary{
background-color: #6d993f;
border:0px;
font-size:14px;
padding:5px 11px 5px 11px;
}
.bg-danger{
background-color: rgb(217 53 220) !important;
}
</style>
<style id="base-theme">
/* styles.css */
:root {
--background-color: #ffffff;
--text-color: #000000;
--link-color: #0079d3;
--border-color: #e1e4e8;
--post-background: #ffffff;
}
body {
background-color: var(--background-color);
color: var(--text-color);
}
a {
color: var(--link-color);
}
.reddit-post {
background-color: var(--post-background);
border-color: var(--border-color);
}
/* Add more styles using CSS variables */</style>
<nav class="navbar navbar-expand-lg navbar-light fixed-top custombar">
<div class="container">
<div class="d-flex align-items-center">
<a class="navbar-brand" href="/">
<img src="/kincat.gif" height="30" style="margin-top:-4px;" class="rotating-image"> </a>
<a class="btn btn-light nav-link position-relative customnoticonnew d-flex align-items-center" href="/?sort=new"><div class="mx-auto">New</div></a>
<a class="btn btn-light nav-link position-relative customnoticonnew d-flex align-items-center" href="/feed"><div class="mx-auto">Feed</div></a>
</div>
<a class="navbar-toggler custom-toggler" type="" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
menu
</a>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link" href="/communities.php">Communities</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/all_members.php">Users</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/photos">Photos</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="datingDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Dating
</a>
<ul class="dropdown-menu" aria-labelledby="datingDropdown">
<li><a class="dropdown-item" href="/dating">Dating</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="exploreDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Explore
</a>
<ul class="dropdown-menu" aria-labelledby="exploreDropdown">
<li><a class="dropdown-item" href="/tags.php">Tags</a></li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link" href="/login.php">Login</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/register.php">Register</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/faq">Help</a>
</li>
</ul>
</div>
</div>
</nav>
<nav class="navbar navbar-expand-lg navbar-light ">
<div class="container">
<!-- Your existing navbar content -->
<form class="d-flex w-100" id="search-form">
<div class="input-group">
<input class="form-control search-bar" type="search" placeholder="Search" aria-label="Search" id="search-input" autocomplete="off">
<button class="btn btn-success" type="submit">Search</button>
</div>
</form>
</div>
</nav>
<div id="search-results" class="container mt-0" style="display: none;"></div>
<script>
$(document).ready(function() {
const $searchForm = $('#search-form');
const $searchInput = $('#search-input');
const $searchResults = $('#search-results');
const $navbarCollapse = $('#navbarNav');
const $navbarToggler = $('.navbar-toggler');
// Function to hide search results
function hideSearchResults() {
$searchResults.hide();
$searchResults.empty();
}
// Show search results when form is submitted
$searchForm.on('submit', function(event) {
event.preventDefault();
// Your search logic here
// Show search results for demonstration
$searchResults.show();
$searchResults.html('<p>Search results go here...</p>');
});
// Hide search results when clicking outside of them
$(document).on('click', function(event) {
if (!$searchForm.is(event.target) && $searchForm.has(event.target).length === 0 &&
!$searchResults.is(event.target) && $searchResults.has(event.target).length === 0) {
hideSearchResults();
}
// Close navbar collapse when clicking outside
if (!$navbarCollapse.is(event.target) &&
$navbarCollapse.has(event.target).length === 0 &&
!$navbarToggler.is(event.target)) {
$navbarCollapse.collapse('hide');
}
});
// Prevent hiding search results when clicking inside the search form or results
$searchForm.on('click', function(event) {
event.stopPropagation();
});
$searchResults.on('click', function(event) {
event.stopPropagation();
});
function closeNavbarCollapse() {
if ($navbarCollapse.hasClass('show')) {
$navbarToggler.click();
}
$navbarCollapse.on('click', function(event) {
event.stopPropagation();
});
}
});
</script>
<style>
.search-bar, .search-bar:active{
border-color: #198754;
background-color: blanchedalmond;
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2);
border-radius: 4px; border-color: #198754;
border:1px solid #8f8f8f;
}
#search-results {
position: absolute;
left: 0;
right: 0;
z-index: 1000; /* Ensure it's above other content */
background-color: white;
max-height: 80vh; /* Limit the height to 80% of the viewport height */
overflow-y: auto; /* Add scrollbar if content exceeds max-height */
}
/* Your existing styles */
@media (min-width: 992px) {
#search-form {
max-width: 50%;
margin-right: auto;
}
}
#search-form .input-group {
width: 100%;
}
.search-results-container {
background-color: #ffffff;
border: 1px solid #e1e4e8;
border-radius: 6px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
padding: 0px 16px;
margin-top: 10px;
}
.search-results-container h6 {
color: #24292e;
font-size: 14px;
font-weight: 600;
margin-bottom: 10px;
}
.search-results-container .list-group {
margin-bottom: 15px;
}
.search-results-container .list-group-item {
border: none;
border-radius: 4px;
padding: 2px 12px;
margin-bottom: 0px;
transition: background-color 0.2s ease;
}
.search-results-container .list-group-item:hover {
background-color: #f6f8fa;
}
.search-results-container .list-group-item:last-child {
margin-bottom: 0;
}
.search-results-container .fas {
margin-right: 8px;
color: #586069;
}
.search-results-container .alert-info {
background-color: #f1f8ff;
border-color: #c8e1ff;
color: #0366d6;
}
</style>
<script>
let searchTimeout;
const searchInput = $('#search-input');
const searchForm = $('#search-form');
searchInput.on('input focus', function() {
clearTimeout(searchTimeout);
const query = $(this).val();
if (query.length >= 0) {
searchTimeout = setTimeout(function() {
$.ajax({
url: '/search.php?v=6688a0dd5ba64',
method: 'GET',
data: { query: query },
dataType: 'html',
success: function(data) {
$('#search-results').html(data).show();
},
error: function(jqXHR, textStatus, errorThrown) {
console.error('Search error:', textStatus, errorThrown);
}
});
}, 300);
} else {
$('#search-results').hide();
}
});
searchForm.on('submit', function(e) {
e.preventDefault();
const query = searchInput.val();
if (query.length >= 0) {
window.location.href = '/search_results.php?v=6688a0dd5ba65&query=' + encodeURIComponent(query);
}
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function() {
if (isLoggedIn) {
const notificationBell = document.getElementById('notification-bell');
const messagesIcon = document.getElementById('messages-icon');
const notificationCount = 0;
const messageCount = 0;
if (notificationCount > 0) {
notificationBell.classList.add('has-notifications');
playSound();
}
if (messageCount > 0) {
messagesIcon.classList.add('has-messages');
playSound();
}
function playSound() {
const audio = new Audio('/cat.mp3');
audio.play();
}
}
});
</script>
<div class="container"><div class="alert alert-danger" role="alert">
Set your profile image <a href="/edit_profile.php" target="_blank" class="alert-link">edit your profile</a>
</div></div>
<main class="container mt-1">
<button id="installButton" class="btn btn-sm btn-primary mb-2" style="display: none;">Install KinTop</button>
<div class="container mt-4">
<div class="row">
<div class="col-md-8 mx-auto">
<div class="card mb-4"> <button class="btn btn-sm btn-link text-muted position-absolute top-0 end-0 mt-2 me-2" data-bs-toggle="modal" data-bs-target="#reportUserModal">
<i class="fas fa-flag"></i> Report User
</button>
<div class="card-body text-center">
<img src="https://kintop.b-cdn.net/images/profiles/profile_2_4.jpg" alt="jaycuba" class="rounded-circle img-fluid mb-3" style="max-width: 150px;">
<h3>jaycuba</h3>
<p class="text-muted">Karma: 26</p>
<p class="text-muted">Member since: June 22, 2024</p>
<p>owner kin.top<br />
Professional Tantra Masseur / Energy healer having done over 1000 sessions with women.<br />
spiritually awakening through mooji.<br />
full-time vanlifer now 26 months (mostly portugal, spain, france)<br />
<br />
english (very good)<br />
czech (spoken pretty good)<br />
german (very good)<br />
french (medium)<br />
spanish (very good)<br />
italian (understand a lot can speak a little)<br />
portuguese (getting better basically medium beginner understand a lot)</p>
<p class="text-muted">
Zaragoza, Spain </p>
<div class="mt-3">
</div>
</div>
</div>
<div class="card mb-4">
<div class="card-body">
<h4>Photos</h4>
<div class="row" id="userPhotos">
<!-- Photos will be loaded here -->
</div>
<button id="loadMorePhotos" class="btn btn-primary mt-3">Load More Photos</button>
</div>
</div>
<div class="card mb-4">
<div class="card-body">
<h4>Friends</h4>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<a href="/user/DrPoofAloof">DrPoofAloof</a>
</li>
<li class="list-group-item">
<a href="/user/%C3%A9tienne">étienne</a>
</li>
<li class="list-group-item">
<a href="/user/Caro">Caro</a>
</li>
<li class="list-group-item">
<a href="/user/tomaspecinka">tomaspecinka</a>
</li>
<li class="list-group-item">
<a href="/user/Nkybaby">Nkybaby</a>
</li>
</ul>
<a href="/friends.php?user_id=2" class="btn btn-link mt-2">View All Friends</a>
</div>
</div>
<div class="card mb-4">
<div class="card-body">
<h4>Posts</h4>
<div class="reddit-post mb-2
">
<div class="main-vote-container main-orientation-left">
<div class="vote-and-boost vote-orientation-left" data-post-id="448">
<button class="upvote " data-vote-type="upvote">
â–²
</button>
<span class="vote-count">2</span>
<button class="downvote " data-vote-type="downvote">
â–¼
</button>
</div>
</div>
<div class="post-content url-wrap ">
<h2 class="post-title">
<a href="/post/448/leaving-the-kin-community-is-good-for-mental-health">
leaving the kin community is good for mental health </a>
</h2>
<p class="post-meta">
<span class="slurp"><a href="/c/mentalhealth">c/mentalhealth</a></span>
posted by
<span class="slurp"><a href="/user/jaycuba">jaycuba</a></span>
16 hours ago </p>
<div class="mb-1"></div>
<div class="post-actions vote-and-boost" data-post-id="448">
<a href="/post/448/leaving-the-kin-community-is-good-for-mental-health" class=" btn-sm btn-link several-comments-text">
<strong><i class="fa-solid fa-comments"></i> 1 comments</strong>
</a>
·
<a href="#" class=" btn-sm btn-link superboost-btn" data-bs-toggle="modal" data-bs-target="#superboostModal" data-post-id="448">boost</a>
·
· <a class="dropdown d-inline-block">
<a class=" btn-sm btn-link dropdown-toggle" type="button" id="shareDropdown448" data-bs-toggle="dropdown" aria-expanded="false">
share
</a>
<ul class="dropdown-menu" aria-labelledby="shareDropdown448">
<li><a class="dropdown-item" href="https://twitter.com/intent/tweet?hashtags=solana&url=http%3A%2F%2Fkin.top%2Fpost%2F448%2Fleaving-the-kin-community-is-good-for-mental-health&text=leaving+the+kin+community+is+good+for+mental+health+%24kin+@getcode+" target="_blank">Twitter / X</a></li>
<li><a class="dropdown-item" href="https://t.me/share/url?url=http%3A%2F%2Fkin.top%2Fpost%2F448%2Fleaving-the-kin-community-is-good-for-mental-health" target="_blank">Telegram</a></li>
<li><a class="dropdown-item" href="https://api.whatsapp.com/send?text=http%3A%2F%2Fkin.top%2Fpost%2F448%2Fleaving-the-kin-community-is-good-for-mental-health" target="_blank">WhatsApp</a></li>
<li><a class="dropdown-item copy-link" href="#" data-url="http://kin.top/post/448/leaving-the-kin-community-is-good-for-mental-health">Copy Link</a></li>
</ul>
</a>
</div>
</div>
</div>
<div class="reddit-post mb-2
">
<div class="main-vote-container main-orientation-left">
<div class="vote-and-boost vote-orientation-left" data-post-id="447">
<button class="upvote " data-vote-type="upvote">
â–²
</button>
<span class="vote-count">2</span>
<button class="downvote " data-vote-type="downvote">
â–¼
</button>
</div>
</div>
<div class="post-content url-wrap ">
<h2 class="post-title">
<a href="/post/447/refusing-to-date-women">
refusing to date women </a>
</h2>
<p class="post-meta">
<span class="slurp"><a href="/c/mgtow">c/mgtow</a></span>
posted by
<span class="slurp"><a href="/user/jaycuba">jaycuba</a></span>
16 hours ago </p>
<div class="mb-1"></div>
<div class="post-actions vote-and-boost" data-post-id="447">
<a href="/post/447/refusing-to-date-women" class=" btn-sm btn-link no-comments-text">
<!--<i class="fa-solid fa-message no-comments"></i>-->
comment
</a>
·
<a href="#" class=" btn-sm btn-link superboost-btn" data-bs-toggle="modal" data-bs-target="#superboostModal" data-post-id="447">boost</a>
·
· <a class="dropdown d-inline-block">
<a class=" btn-sm btn-link dropdown-toggle" type="button" id="shareDropdown447" data-bs-toggle="dropdown" aria-expanded="false">
share
</a>
<ul class="dropdown-menu" aria-labelledby="shareDropdown447">
<li><a class="dropdown-item" href="https://twitter.com/intent/tweet?hashtags=solana&url=http%3A%2F%2Fkin.top%2Fpost%2F447%2Frefusing-to-date-women&text=refusing+to+date+women+%24kin+@getcode+" target="_blank">Twitter / X</a></li>
<li><a class="dropdown-item" href="https://t.me/share/url?url=http%3A%2F%2Fkin.top%2Fpost%2F447%2Frefusing-to-date-women" target="_blank">Telegram</a></li>
<li><a class="dropdown-item" href="https://api.whatsapp.com/send?text=http%3A%2F%2Fkin.top%2Fpost%2F447%2Frefusing-to-date-women" target="_blank">WhatsApp</a></li>
<li><a class="dropdown-item copy-link" href="#" data-url="http://kin.top/post/447/refusing-to-date-women">Copy Link</a></li>
</ul>
</a>
</div>
</div>
</div>
<div class="reddit-post mb-2
">
<div class="main-vote-container main-orientation-left">
<div class="vote-and-boost vote-orientation-left" data-post-id="446">
<button class="upvote " data-vote-type="upvote">
â–²
</button>
<span class="vote-count">2</span>
<button class="downvote " data-vote-type="downvote">
â–¼
</button>
</div>
</div>
<div class="post-content url-wrap ">
<h2 class="post-title">
<a href="/post/446/refusing-to-date-women">
refusing to date women </a>
</h2>
<p class="post-meta">
<span class="slurp"><a href="/c/dating">c/dating</a></span>
posted by
<span class="slurp"><a href="/user/jaycuba">jaycuba</a></span>
16 hours ago </p>
<div class="mb-1"></div>
<div class="post-actions vote-and-boost" data-post-id="446">
<a href="/post/446/refusing-to-date-women" class=" btn-sm btn-link no-comments-text">
<!--<i class="fa-solid fa-message no-comments"></i>-->
comment
</a>
·
<a href="#" class=" btn-sm btn-link superboost-btn" data-bs-toggle="modal" data-bs-target="#superboostModal" data-post-id="446">boost</a>
·
· <a class="dropdown d-inline-block">
<a class=" btn-sm btn-link dropdown-toggle" type="button" id="shareDropdown446" data-bs-toggle="dropdown" aria-expanded="false">
share
</a>
<ul class="dropdown-menu" aria-labelledby="shareDropdown446">
<li><a class="dropdown-item" href="https://twitter.com/intent/tweet?hashtags=solana&url=http%3A%2F%2Fkin.top%2Fpost%2F446%2Frefusing-to-date-women&text=refusing+to+date+women+%24kin+@getcode+" target="_blank">Twitter / X</a></li>
<li><a class="dropdown-item" href="https://t.me/share/url?url=http%3A%2F%2Fkin.top%2Fpost%2F446%2Frefusing-to-date-women" target="_blank">Telegram</a></li>
<li><a class="dropdown-item" href="https://api.whatsapp.com/send?text=http%3A%2F%2Fkin.top%2Fpost%2F446%2Frefusing-to-date-women" target="_blank">WhatsApp</a></li>
<li><a class="dropdown-item copy-link" href="#" data-url="http://kin.top/post/446/refusing-to-date-women">Copy Link</a></li>
</ul>
</a>
</div>
</div>
</div>
<div class="reddit-post mb-2
">
<div class="main-vote-container main-orientation-left">
<div class="vote-and-boost vote-orientation-left" data-post-id="445">
<button class="upvote " data-vote-type="upvote">
â–²
</button>
<span class="vote-count">1</span>
<button class="downvote " data-vote-type="downvote">
â–¼
</button>
</div>
</div>
<div class="post-content url-wrap ">
<h2 class="post-title">
<a href="/post/445/people-are-so-insanely-stupid">
people are so INSANELY stupid </a>
</h2>
<p class="post-meta">
<span class="slurp"><a href="/c/kin">c/kin</a></span>
posted by
<span class="slurp"><a href="/user/jaycuba">jaycuba</a></span>
16 hours ago </p>
<div class="post-image">
<a href="/post/445/people-are-so-insanely-stupid">
<img src="https://i.imgur.com/Fgx8HE8.png" alt="Image preview" class="mb-2 mt-2 img-preview" height="100" style="max-width:100%;">
</a>
</div>
<div class="post-actions vote-and-boost" data-post-id="445">
<a href="/post/445/people-are-so-insanely-stupid" class=" btn-sm btn-link no-comments-text">
<!--<i class="fa-solid fa-message no-comments"></i>-->
comment
</a>
·
<a href="#" class=" btn-sm btn-link superboost-btn" data-bs-toggle="modal" data-bs-target="#superboostModal" data-post-id="445">boost</a>
·
· <a class="dropdown d-inline-block">
<a class=" btn-sm btn-link dropdown-toggle" type="button" id="shareDropdown445" data-bs-toggle="dropdown" aria-expanded="false">
share
</a>
<ul class="dropdown-menu" aria-labelledby="shareDropdown445">
<li><a class="dropdown-item" href="https://twitter.com/intent/tweet?hashtags=solana&url=http%3A%2F%2Fkin.top%2Fpost%2F445%2Fpeople-are-so-insanely-stupid&text=people+are+so+insanely+stupid+%24kin+@getcode+" target="_blank">Twitter / X</a></li>
<li><a class="dropdown-item" href="https://t.me/share/url?url=http%3A%2F%2Fkin.top%2Fpost%2F445%2Fpeople-are-so-insanely-stupid" target="_blank">Telegram</a></li>
<li><a class="dropdown-item" href="https://api.whatsapp.com/send?text=http%3A%2F%2Fkin.top%2Fpost%2F445%2Fpeople-are-so-insanely-stupid" target="_blank">WhatsApp</a></li>
<li><a class="dropdown-item copy-link" href="#" data-url="http://kin.top/post/445/people-are-so-insanely-stupid">Copy Link</a></li>
</ul>
</a>
</div>
</div>
</div>
<div class="reddit-post mb-2
">
<div class="main-vote-container main-orientation-left">
<div class="vote-and-boost vote-orientation-left" data-post-id="444">
<button class="upvote " data-vote-type="upvote">
â–²
</button>
<span class="vote-count">1</span>
<button class="downvote " data-vote-type="downvote">
â–¼
</button>
</div>
</div>
<div class="post-content url-wrap ">
<h2 class="post-title">
<a href="/post/444/people-are-so-insanely-stupid">
people are so INSANELY stupid </a>
</h2>
<p class="post-meta">
<span class="slurp"><a href="/c/code-wallet">c/code-wallet</a></span>
posted by
<span class="slurp"><a href="/user/jaycuba">jaycuba</a></span>
16 hours ago </p>
<div class="post-image">
<a href="/post/444/people-are-so-insanely-stupid">
<img src="https://i.imgur.com/Fgx8HE8.png" alt="Image preview" class="mb-2 mt-2 img-preview" height="100" style="max-width:100%;">
</a>
</div>
<div class="post-actions vote-and-boost" data-post-id="444">
<a href="/post/444/people-are-so-insanely-stupid" class=" btn-sm btn-link no-comments-text">
<!--<i class="fa-solid fa-message no-comments"></i>-->
comment
</a>
·
<a href="#" class=" btn-sm btn-link superboost-btn" data-bs-toggle="modal" data-bs-target="#superboostModal" data-post-id="444">boost</a>
·
· <a class="dropdown d-inline-block">
<a class=" btn-sm btn-link dropdown-toggle" type="button" id="shareDropdown444" data-bs-toggle="dropdown" aria-expanded="false">
share
</a>
<ul class="dropdown-menu" aria-labelledby="shareDropdown444">
<li><a class="dropdown-item" href="https://twitter.com/intent/tweet?hashtags=solana&url=http%3A%2F%2Fkin.top%2Fpost%2F444%2Fpeople-are-so-insanely-stupid&text=people+are+so+insanely+stupid+%24kin+@getcode+" target="_blank">Twitter / X</a></li>
<li><a class="dropdown-item" href="https://t.me/share/url?url=http%3A%2F%2Fkin.top%2Fpost%2F444%2Fpeople-are-so-insanely-stupid" target="_blank">Telegram</a></li>
<li><a class="dropdown-item" href="https://api.whatsapp.com/send?text=http%3A%2F%2Fkin.top%2Fpost%2F444%2Fpeople-are-so-insanely-stupid" target="_blank">WhatsApp</a></li>
<li><a class="dropdown-item copy-link" href="#" data-url="http://kin.top/post/444/people-are-so-insanely-stupid">Copy Link</a></li>
</ul>
</a>
</div>
</div>
</div>
<div class="reddit-post mb-2
">
<div class="main-vote-container main-orientation-left">
<div class="vote-and-boost vote-orientation-left" data-post-id="443">
<button class="upvote " data-vote-type="upvote">
â–²
</button>
<span class="vote-count">1</span>
<button class="downvote " data-vote-type="downvote">
â–¼
</button>
</div>
</div>
<div class="post-content url-wrap ">
<h2 class="post-title">
<a href="/post/443/ftx-unloading-kin">
FTX unloading KIN </a>
</h2>
<p class="post-meta">
<span class="slurp"><a href="/c/kin">c/kin</a></span>
posted by
<span class="slurp"><a href="/user/jaycuba">jaycuba</a></span>
16 hours ago </p>
<div class="mb-1"></div>
<div class="post-actions vote-and-boost" data-post-id="443">
<a href="/post/443/ftx-unloading-kin" class=" btn-sm btn-link no-comments-text">
<!--<i class="fa-solid fa-message no-comments"></i>-->
comment
</a>
·
<a href="#" class=" btn-sm btn-link superboost-btn" data-bs-toggle="modal" data-bs-target="#superboostModal" data-post-id="443">boost</a>
·
· <a class="dropdown d-inline-block">
<a class=" btn-sm btn-link dropdown-toggle" type="button" id="shareDropdown443" data-bs-toggle="dropdown" aria-expanded="false">
share
</a>
<ul class="dropdown-menu" aria-labelledby="shareDropdown443">
<li><a class="dropdown-item" href="https://twitter.com/intent/tweet?hashtags=solana&url=http%3A%2F%2Fkin.top%2Fpost%2F443%2Fftx-unloading-kin&text=ftx+unloading+kin+%24kin+@getcode+" target="_blank">Twitter / X</a></li>
<li><a class="dropdown-item" href="https://t.me/share/url?url=http%3A%2F%2Fkin.top%2Fpost%2F443%2Fftx-unloading-kin" target="_blank">Telegram</a></li>
<li><a class="dropdown-item" href="https://api.whatsapp.com/send?text=http%3A%2F%2Fkin.top%2Fpost%2F443%2Fftx-unloading-kin" target="_blank">WhatsApp</a></li>
<li><a class="dropdown-item copy-link" href="#" data-url="http://kin.top/post/443/ftx-unloading-kin">Copy Link</a></li>
</ul>
</a>
</div>
</div>
</div>
<div class="reddit-post mb-2
">
<div class="main-vote-container main-orientation-left">
<div class="vote-and-boost vote-orientation-left" data-post-id="442">
<button class="upvote " data-vote-type="upvote">
â–²
</button>
<span class="vote-count">1</span>
<button class="downvote " data-vote-type="downvote">
â–¼
</button>
</div>
</div>
<div class="post-content url-wrap ">
<h2 class="post-title">
<a href="/post/442/ftx-unloading-kin">
FTX unloading KIN </a>
</h2>
<p class="post-meta">
<span class="slurp"><a href="/c/kin">c/kin</a></span>
posted by
<span class="slurp"><a href="/user/jaycuba">jaycuba</a></span>
16 hours ago </p>
<div class="mb-1"></div>
<div class="post-actions vote-and-boost" data-post-id="442">
<a href="/post/442/ftx-unloading-kin" class=" btn-sm btn-link no-comments-text">
<!--<i class="fa-solid fa-message no-comments"></i>-->
comment
</a>
·
<a href="#" class=" btn-sm btn-link superboost-btn" data-bs-toggle="modal" data-bs-target="#superboostModal" data-post-id="442">boost</a>
·
· <a class="dropdown d-inline-block">
<a class=" btn-sm btn-link dropdown-toggle" type="button" id="shareDropdown442" data-bs-toggle="dropdown" aria-expanded="false">
share
</a>
<ul class="dropdown-menu" aria-labelledby="shareDropdown442">
<li><a class="dropdown-item" href="https://twitter.com/intent/tweet?hashtags=solana&url=http%3A%2F%2Fkin.top%2Fpost%2F442%2Fftx-unloading-kin&text=ftx+unloading+kin+%24kin+@getcode+" target="_blank">Twitter / X</a></li>
<li><a class="dropdown-item" href="https://t.me/share/url?url=http%3A%2F%2Fkin.top%2Fpost%2F442%2Fftx-unloading-kin" target="_blank">Telegram</a></li>
<li><a class="dropdown-item" href="https://api.whatsapp.com/send?text=http%3A%2F%2Fkin.top%2Fpost%2F442%2Fftx-unloading-kin" target="_blank">WhatsApp</a></li>
<li><a class="dropdown-item copy-link" href="#" data-url="http://kin.top/post/442/ftx-unloading-kin">Copy Link</a></li>
</ul>
</a>
</div>
</div>
</div>
<div class="reddit-post mb-2
">
<div class="main-vote-container main-orientation-left">
<div class="vote-and-boost vote-orientation-left" data-post-id="441">
<button class="upvote " data-vote-type="upvote">
â–²
</button>
<span class="vote-count">1</span>
<button class="downvote " data-vote-type="downvote">
â–¼
</button>
</div>
</div>
<div class="post-content url-wrap ">
<h2 class="post-title">
<a href="/post/441/best-vanlife-spots-spain">
best vanlife spots spain </a>
</h2>
<p class="post-meta">
<span class="slurp"><a href="/c/vanlife">c/vanlife</a></span>
posted by
<span class="slurp"><a href="/user/jaycuba">jaycuba</a></span>
17 hours ago </p>
<div class="post-image">
<a href="/post/441/best-vanlife-spots-spain">
<img src="https://i.imgur.com/3dw1o49.png" alt="Image preview" class="mb-2 mt-2 img-preview" height="100" style="max-width:100%;">
</a>
</div>
<div class="post-actions vote-and-boost" data-post-id="441">
<a href="/post/441/best-vanlife-spots-spain" class=" btn-sm btn-link no-comments-text">
<!--<i class="fa-solid fa-message no-comments"></i>-->
comment
</a>
·
<a href="#" class=" btn-sm btn-link superboost-btn" data-bs-toggle="modal" data-bs-target="#superboostModal" data-post-id="441">boost</a>
·
· <a class="dropdown d-inline-block">
<a class=" btn-sm btn-link dropdown-toggle" type="button" id="shareDropdown441" data-bs-toggle="dropdown" aria-expanded="false">
share
</a>
<ul class="dropdown-menu" aria-labelledby="shareDropdown441">
<li><a class="dropdown-item" href="https://twitter.com/intent/tweet?hashtags=solana&url=http%3A%2F%2Fkin.top%2Fpost%2F441%2Fbest-vanlife-spots-spain&text=best+vanlife+spots+spain+%24kin+@getcode+" target="_blank">Twitter / X</a></li>
<li><a class="dropdown-item" href="https://t.me/share/url?url=http%3A%2F%2Fkin.top%2Fpost%2F441%2Fbest-vanlife-spots-spain" target="_blank">Telegram</a></li>
<li><a class="dropdown-item" href="https://api.whatsapp.com/send?text=http%3A%2F%2Fkin.top%2Fpost%2F441%2Fbest-vanlife-spots-spain" target="_blank">WhatsApp</a></li>
<li><a class="dropdown-item copy-link" href="#" data-url="http://kin.top/post/441/best-vanlife-spots-spain">Copy Link</a></li>
</ul>
</a>
</div>
</div>
</div>
<div class="reddit-post mb-2
">
<div class="main-vote-container main-orientation-left">
<div class="vote-and-boost vote-orientation-left" data-post-id="440">
<button class="upvote " data-vote-type="upvote">
â–²
</button>
<span class="vote-count">2</span>
<button class="downvote " data-vote-type="downvote">
â–¼
</button>
</div>
</div>
<div class="post-content url-wrap ">
<h2 class="post-title">
<a href="/post/440/miwa-make-internet-wholesome-again">
MIWA "Make Internet Wholesome Again" </a>
</h2>
<p class="post-meta">
<span class="slurp"><a href="/c/social-networks">c/social-networks</a></span>
posted by
<span class="slurp"><a href="/user/jaycuba">jaycuba</a></span>
17 hours ago </p>
<div class="mb-1"></div>
<div class="post-actions vote-and-boost" data-post-id="440">
<a href="/post/440/miwa-make-internet-wholesome-again" class=" btn-sm btn-link no-comments-text">
<!--<i class="fa-solid fa-message no-comments"></i>-->
comment
</a>
·
<a href="#" class=" btn-sm btn-link superboost-btn" data-bs-toggle="modal" data-bs-target="#superboostModal" data-post-id="440">boost</a>
·
· <a class="dropdown d-inline-block">
<a class=" btn-sm btn-link dropdown-toggle" type="button" id="shareDropdown440" data-bs-toggle="dropdown" aria-expanded="false">
share
</a>
<ul class="dropdown-menu" aria-labelledby="shareDropdown440">
<li><a class="dropdown-item" href="https://twitter.com/intent/tweet?hashtags=solana&url=http%3A%2F%2Fkin.top%2Fpost%2F440%2Fmiwa-make-internet-wholesome-again&text=miwa+%22make+internet+wholesome+again%22+%24kin+@getcode+" target="_blank">Twitter / X</a></li>
<li><a class="dropdown-item" href="https://t.me/share/url?url=http%3A%2F%2Fkin.top%2Fpost%2F440%2Fmiwa-make-internet-wholesome-again" target="_blank">Telegram</a></li>
<li><a class="dropdown-item" href="https://api.whatsapp.com/send?text=http%3A%2F%2Fkin.top%2Fpost%2F440%2Fmiwa-make-internet-wholesome-again" target="_blank">WhatsApp</a></li>
<li><a class="dropdown-item copy-link" href="#" data-url="http://kin.top/post/440/miwa-make-internet-wholesome-again">Copy Link</a></li>
</ul>
</a>
</div>
</div>
</div>
<div class="reddit-post mb-2
">
<div class="main-vote-container main-orientation-left">
<div class="vote-and-boost vote-orientation-left" data-post-id="439">
<button class="upvote " data-vote-type="upvote">
â–²
</button>
<span class="vote-count">1</span>
<button class="downvote " data-vote-type="downvote">
â–¼
</button>
</div>
</div>
<div class="post-content url-wrap ">
<h2 class="post-title">
<a href="/post/439/miwa-make-internet-wholesome-again">
MIWA "Make Internet Wholesome Again" </a>
</h2>
<p class="post-meta">
<span class="slurp"><a href="/c/kintop">c/kintop</a></span>
posted by
<span class="slurp"><a href="/user/jaycuba">jaycuba</a></span>
17 hours ago </p>
<div class="mb-1"></div>
<div class="post-actions vote-and-boost" data-post-id="439">
<a href="/post/439/miwa-make-internet-wholesome-again" class=" btn-sm btn-link no-comments-text">
<!--<i class="fa-solid fa-message no-comments"></i>-->
comment
</a>
·
<a href="#" class=" btn-sm btn-link superboost-btn" data-bs-toggle="modal" data-bs-target="#superboostModal" data-post-id="439">boost</a>
·
· <a class="dropdown d-inline-block">
<a class=" btn-sm btn-link dropdown-toggle" type="button" id="shareDropdown439" data-bs-toggle="dropdown" aria-expanded="false">
share
</a>
<ul class="dropdown-menu" aria-labelledby="shareDropdown439">
<li><a class="dropdown-item" href="https://twitter.com/intent/tweet?hashtags=solana&url=http%3A%2F%2Fkin.top%2Fpost%2F439%2Fmiwa-make-internet-wholesome-again&text=miwa+%22make+internet+wholesome+again%22+%24kin+@getcode+" target="_blank">Twitter / X</a></li>
<li><a class="dropdown-item" href="https://t.me/share/url?url=http%3A%2F%2Fkin.top%2Fpost%2F439%2Fmiwa-make-internet-wholesome-again" target="_blank">Telegram</a></li>
<li><a class="dropdown-item" href="https://api.whatsapp.com/send?text=http%3A%2F%2Fkin.top%2Fpost%2F439%2Fmiwa-make-internet-wholesome-again" target="_blank">WhatsApp</a></li>
<li><a class="dropdown-item copy-link" href="#" data-url="http://kin.top/post/439/miwa-make-internet-wholesome-again">Copy Link</a></li>
</ul>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="reportUserModal" tabindex="-1" aria-labelledby="reportUserModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="reportUserModalLabel">Report User</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="reportUserForm">
<div class="mb-3">
<label for="reportReason" class="form-label">Reason for reporting</label>
<select class="form-select" id="reportReason" name="reason" required>
<option value="">Select a reason</option>
<option value="Scammer">Scammer</option>
<option value="harassment">Harassment</option>
</select>
</div>
<input type="hidden" name="reported_user_id" value="2">
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" id="submitReportBtn">Submit Report</button>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function() {
$('#submitReportBtn').click(function() {
var reason = $('#reportReason').val();
var reportedUserId = $('input[name="reported_user_id"]').val();
if (!reason) {
alert('Please select a reason for reporting.');
return;
}
$.ajax({
url: '/report_user.php',
type: 'POST',
data: {
reported_user_id: reportedUserId,
reason: reason
},
dataType: 'json',
success: function(response) {
if (response.success) {
alert(response.message);
$('#reportUserModal').modal('hide');
} else {
alert(response.message);
}
},
error: function() {
alert('An error occurred. Please try again.');
}
});
});
$('#sendMessageBtn').click(function() {
var username = 'jaycuba';
var isFriend = false;
var isFollowedBy = false;
if (!isFriend && !isFollowedBy) {
alert("You can only send messages to friends or users who follow you.");
return;
}
$.ajax({
url: '/messages/create_conversation.php',
type: 'POST',
data: { username: username },
dataType: 'json',
success: function(response) {
if (response.success) {
window.location.href = '/messages/index.php?conversation_id=' + response.conversation_id;
} else {
alert(response.message);
}
},
error: function() {
alert('An error occurred. Please try again.');
}
});
});
$('.vote-buttons button').click(function() {
var $this = $(this);
var postId = $this.parent().data('post-id');
var voteType = $this.hasClass('upvote') ? 'upvote' : 'downvote';
$.ajax({
url: '/vote.php',
type: 'POST',
data: { post_id: postId, vote_type: voteType },
dataType: 'json',
success: function(response) {
if (response.success) {
$this.siblings('.vote-count').text(response.vote_count);
} else {
alert(response.message);
}
},
error: function() {
alert('An error occurred. Please try again.');
}
});
});
$('#friendRequestBtn').click(function() {
$.ajax({
url: '/friend_request.php',
type: 'POST',
data: { receiver_id: 2 },
dataType: 'json',
success: function(response) {
if (response.success) {
$('#friendRequestBtn').prop('disabled', true).text('Request Sent');
} else {
alert(response.message);
}
},
error: function() {
alert('An error occurred. Please try again.');
}
});
});
$('#followBtn').click(function() {
$.ajax({
url: '/follow.php',
type: 'POST',
data: { followed_id: 2 },
dataType: 'json',
success: function(response) {
if (response.success) {
$('#followBtn').prop('disabled', true).text('Following');
} else {
alert('Error: ' + response.message);
}
},
error: function(jqXHR, textStatus, errorThrown) {
alert('AJAX error: ' + textStatus + '\n' + errorThrown + '\n' + jqXHR.responseText);
}
});
});
});
</script>
</main>
<footer class="bg-light text-center text-lg-start mt-4">
<div class="container p-4">
<p>© 2024 Kin.top. All rights reserved.</p>
</div>
</footer>
<div class="modal fade" id="loginModal" tabindex="-1" aria-labelledby="loginModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="loginModalLabel">Login Required</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>You need to be logged in to vote. Please log in or sign up to continue.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<a href="/login.php" class="btn btn-primary">Log In</a>
<a href="/register.php" class="btn btn-success">Sign Up</a>
</div>
</div>
</div>
</div>
<script src="/voting.js?id=6688a0dd5c60c"></script>
<div class="modal fade" id="superboostModal" tabindex="-1" aria-labelledby="superboostModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="superboostModalLabel">Increase visibility with Tip & Boost</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body" data-post-id="">
Buying a Tip & Boost sends a tip to the poster & increases visibility of the post<br><br>
<p>Select an amount to superboost this post. each 10 cents is equal to 1 vote. the tip goes 50% to the poster and 50% to kin.top. if a user has been invited by another user
earnings are split 50% poster, 30% kin.top, 20% inviter<br></p>
<div class="btn-group mb-3" role="group" aria-label="Superboost amount">
<button type="button" class="btn btn-outline-primary amount-btn active" data-amount="0.10">$0.10</button>
<button type="button" class="btn btn-outline-primary amount-btn" data-amount="0.50">$0.50</button>
<button type="button" class="btn btn-outline-primary amount-btn" data-amount="1.00">$1.00</button>
<button type="button" class="btn btn-outline-primary amount-btn" data-amount="2.00">$2.00</button>
<button type="button" class="btn btn-outline-primary amount-btn" data-amount="5.00">$5.00</button>
</div>
<div id="button-container" style="height: 3.75rem;"></div>
<br>
<div id="kinAddressStatus" class="mt-0"></div>
<p class="mt-1 text-xs text-muted">Don't have the Code Wallet app yet?
<a href="https://www.getcode.com/#Download" target="_blank" class="text-primary">Download It Now</a> and get your first $1 free</p>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
$('.superboost-btn').click(function() {
var postId = $(this).closest('.vote-and-boost').data('post-id');
loadSuperboostButton(postId);
});
});
</script>
<script type="module">
import code from 'https://js.getcode.com/v1';
let superboostButton;
const defaultAmount = 0.10;
const defaultDestination = 'CtVDfDHknkhnwMooPwNBnzZQdiJzS1XK4qohVUtnygPn'; // Replace with a valid default Solana address
const feeDestination = 'CtVDfDHknkhnwMooPwNBnzZQdiJzS1XK4qohVUtnygPn'; // Fixed fee destination
let currentPostId;
let currentDestination = defaultDestination; // Initialize with default value
let currentAmount = 0.10; // Initialize with the default amount
function setupAmountButtons(postId) {
console.log('Setting up amount buttons');
const modalBody = document.querySelector('#superboostModal .modal-body');
const amountBtns = modalBody.querySelectorAll('.amount-btn');
amountBtns.forEach(btn => {
btn.addEventListener('click', () => {
console.log('Amount button clicked:', btn.dataset.amount);
const selectedAmount = parseFloat(btn.dataset.amount);
currentAmount = parseFloat(btn.dataset.amount);
amountBtns.forEach(b => b.classList.remove('active'));
btn.classList.add('active');
const newConfig = createButtonConfig(currentDestination || defaultDestination, currentAmount, postId);
console.log('Updating button with new config:', newConfig);
superboostButton.update(newConfig);
});
});
}
window.setupAmountButtons = setupAmountButtons;
function createButtonConfig(destination, amount, postId, inviterKinAddress) {
const config = {
currency: 'usd',
amount: amount,
destination: destination,
confirmParams: {
success: {
url: `/superboost_success.php?amount=${amount}&post_id=${postId}&intent_id={{INTENT_ID}}`,
},
cancel: {
url: `/superboost_cancel.php?post_id=${postId}`,
},
},
};
const usedAddresses = new Set([destination]);
if (destination !== feeDestination && !usedAddresses.has(feeDestination)) {
if (inviterKinAddress && !usedAddresses.has(inviterKinAddress)) {
config.fees = [
{
destination: feeDestination,
basisPoints: 3000, // 30% fee
},
{
destination: inviterKinAddress,
basisPoints: 2000, // 20% fee
}
];
usedAddresses.add(feeDestination);
usedAddresses.add(inviterKinAddress);
} else if (!usedAddresses.has(feeDestination)) {
config.fees = [
{
destination: feeDestination,
basisPoints: 5000, // 50% fee
}
];
usedAddresses.add(feeDestination);
}
}
return config;
}
window.createButtonConfig = createButtonConfig;
// ... (previous code remains the same)
function loadSuperboostButton(postId) {
console.log('Loading superboost button for post:', postId);
currentPostId = postId;
fetch(`/get_kinaddress.php?post_id=${postId}`)
.then(response => response.json())
.then(data => {
if (data.success) {
console.log('New destination loaded:', data.kinaddress);
currentDestination = data.kinaddress || defaultDestination;
const config = createButtonConfig(currentDestination, currentAmount, postId, data.inviterKinAddress);
superboostButton.update(config);
console.log('Button config updated:', config);
// Update modal content based on Kin address status
const modalBody = document.querySelector('#superboostModal .modal-body');
const statusMessage = modalBody.querySelector('#kinAddressStatus');
if (!statusMessage) {
const statusElement = document.createElement('p');
statusElement.id = 'kinAddressStatus';
modalBody.insertBefore(statusElement, modalBody.firstChild);
}
if (data.kinaddress) {
document.getElementById('kinAddressStatus').textContent = 'The poster has Code Wallet enabled. Your superboost will be sent directly to them.';
document.getElementById('kinAddressStatus').className = 'text-success';
} else {
document.getElementById('kinAddressStatus').textContent = 'The poster has Code Wallet not enabled. The superboost will help them though. the money goes to kin.top.';
document.getElementById('kinAddressStatus').className = 'text-warning';
}
// Reset active state on amount buttons
document.querySelectorAll('.amount-btn').forEach(btn => btn.classList.remove('active'));
document.querySelector('.amount-btn[data-amount="0.10"]').classList.add('active');
} else {
console.error('Error loading Kin address:', data.message || 'Invalid or missing Kin address for this post.');
alert('Error: ' + (data.message || 'Invalid or missing Kin address for this post.'));
}
})
.catch(error => {
console.error('Error:', error);
alert('An error occurred while loading the superboost button.');
});
}
// ... (rest of the code remains the same)
window.loadSuperboostButton = loadSuperboostButton;
function initializeSuperboostButton(postId) {
console.log('Initializing Superboost Button for post:', postId);
currentPostId = postId;
currentDestination = defaultDestination; // Set initial currentDestination
console.log('current amount'+currentAmount);
const config = createButtonConfig(currentDestination, currentAmount, postId);
console.log('Initial button config:', config);
const { button } = code.elements.create('button', config);
/*
button.on('invoke', async () => {
console.log('Invoke event triggered');
try {
console.log('Attempting to create intent');
const res = await fetch('/create-intent.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: config.amount,
destination: config.destination,
post_id: postId
})
});
console.log('Fetch response status:', res.status);
if (res.status === 401) {
console.log('User not logged in');
alert('You need to be logged in to superboost. Please log in and try again.');
return true; // Cancel the payment intent
}
if (!res.ok) {
console.error('Fetch response not OK:', res.status, res.statusText);
throw new Error('Failed to create intent');
}
const data = await res.json();
console.log('Response data:', data);
if (data.success) {
console.log('Updating button with client secret');
button.update({ clientSecret: data.clientSecret });
console.log('Payment intent created with ID:', data.id);
return false; // Don't cancel the payment intent
} else {
throw new Error(data.error || 'Unknown error occurred');
}
} catch (error) {
console.error('Error in invoke event:', error);
alert('An error occurred while preparing the superboost. Please try again.');
return true; // Cancel the payment intent
}
});
*/
superboostButton = button;
console.log('Mounting button to container');
button.mount('#button-container');
console.log('Button mounted successfully');
// Set up amount buttons
setupAmountButtons(postId);
}
function updatePostVotes(postId, newVoteCount) {
const voteCountElement = document.querySelector(`.vote-count[data-post-id="${postId}"]`);
if (voteCountElement) {
voteCountElement.textContent = newVoteCount;
}
}
$(document).ready(function() {
$('.superboost-btn').click(function() {
console.log('Superboost button clicked');
var postId = $(this).closest('.vote-and-boost').data('post-id');
console.log('Post ID:', postId);
initializeSuperboostButton(postId);
loadSuperboostButton(postId);
});
$('#superboostModal').on('hidden.bs.modal', function () {
console.log('Modal hidden, resetting button');
// Reset the button to its default state
currentDestination = defaultDestination;
const postId = $(this).find('.modal-body').attr('data-post-id');
const config = createButtonConfig(currentDestination, currentAmount, postId);
superboostButton.update(config);
console.log('Button reset to default config:', config);
// Reset active state on amount buttons
const modalBody = $(this).find('.modal-body');
modalBody.find('.amount-btn').removeClass('active');
modalBody.find('.amount-btn[data-amount="0.10"]').addClass('active');
});
});
</script>
<script>
$(document).ready(function(){
$('#nsfwToggle').change(function() {
var showNsfw = $(this).is(':checked') ? 1 : 0;
updateNsfwVisibility(showNsfw);
$.ajax({
url: 'update_nsfw_settings.php',
method: 'POST',
data: { show_nsfw: showNsfw },
dataType: 'json',
success: function(response) {
if (response.success) {
console.log('NSFW settings updated successfully');
// location.reload();
} else {
console.error('Failed to update NSFW settings:', response.message);
// Revert the toggle if the update failed
$('#nsfwToggle').prop('checked', !showNsfw);
}
},
error: function(xhr, status, error) {
console.error('AJAX error:', error);
// Revert the toggle on AJAX error
$('#nsfwToggle').prop('checked', !showNsfw);
}
});
});
function updateNsfwVisibility(showNsfw) {
if(showNsfw) {
$('.nsfw-post').removeClass('hide-nsfw');
} else {
$('.nsfw-post').addClass('hide-nsfw');
}
}
$('.bookmark-btn').click(function() {
var postId = $(this).data('post-id');
var $button = $(this);
console.log('book postid:' + postId);
$.ajax({
url: '/toggle_bookmark.php?v=6688a0dd5c612',
method: 'POST',
data: { post_id: postId },
success: function(response) {
console.log('book response:', response);
if (response.success) {
if (response.bookmarked) {
$button.html('<i class="fas fa-bookmark"></i> Bookmarked');
} else {
$button.html('<i class="far fa-bookmark"></i> Bookmark');
}
} else {
alert('Error: ' + response.message);
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.error('Error details:', textStatus, errorThrown, jqXHR.responseText);
alert('An error occurred. Please try again.');
}
});
});
});
!function(e,t){if("function"==typeof define&&define.amd)define(["exports","module"],t);else if("undefined"!=typeof exports&&"undefined"!=typeof module)t(exports,module);else{var n={exports:{}};t(n.exports,n),e.autosize=n.exports}}(this,function(e,t){"use strict";function n(e){function t(){var t=window.getComputedStyle(e,null);v=t.overflowY,"vertical"===t.resize?e.style.resize="none":"both"===t.resize&&(e.style.resize="horizontal"),p="content-box"===t.boxSizing?-(parseFloat(t.paddingTop)+parseFloat(t.paddingBottom)):parseFloat(t.borderTopWidth)+parseFloat(t.borderBottomWidth),isNaN(p)&&(p=0),s()}function n(t){var n=e.style.width;e.style.width="0px",e.offsetWidth,e.style.width=n,v=t,f&&(e.style.overflowY=t),r()}function o(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push({node:e.parentNode,scrollTop:e.parentNode.scrollTop}),e=e.parentNode;return t}function r(){var t=e.style.height,n=o(e),r=document.documentElement&&document.documentElement.scrollTop;e.style.height="auto";var i=e.scrollHeight+p;return 0===e.scrollHeight?void(e.style.height=t):(e.style.height=i+"px",h=e.clientWidth,n.forEach(function(e){e.node.scrollTop=e.scrollTop}),void(r&&(document.documentElement.scrollTop=r)))}function s(){var t=e.style.height;r();var o=window.getComputedStyle(e,null);if(o.height!==e.style.height?"visible"!==v&&n("visible"):"hidden"!==v&&n("hidden"),t!==e.style.height){var i=d("autosize:resized");e.dispatchEvent(i)}}var l=void 0===arguments[1]?{}:arguments[1],a=l.setOverflowX,u=void 0===a?!0:a,c=l.setOverflowY,f=void 0===c?!0:c;if(e&&e.nodeName&&"TEXTAREA"===e.nodeName&&!i.has(e)){var p=null,v=null,h=e.clientWidth,y=function(){e.clientWidth!==h&&s()},m=function(t){window.removeEventListener("resize",y,!1),e.removeEventListener("input",s,!1),e.removeEventListener("keyup",s,!1),e.removeEventListener("autosize:destroy",m,!1),e.removeEventListener("autosize:update",s,!1),i["delete"](e),Object.keys(t).forEach(function(n){e.style[n]=t[n]})}.bind(e,{height:e.style.height,resize:e.style.resize,overflowY:e.style.overflowY,overflowX:e.style.overflowX,wordWrap:e.style.wordWrap});e.addEventListener("autosize:destroy",m,!1),"onpropertychange"in e&&"oninput"in e&&e.addEventListener("keyup",s,!1),window.addEventListener("resize",y,!1),e.addEventListener("input",s,!1),e.addEventListener("autosize:update",s,!1),i.add(e),u&&(e.style.overflowX="hidden",e.style.wordWrap="break-word"),t()}}function o(e){if(e&&e.nodeName&&"TEXTAREA"===e.nodeName){var t=d("autosize:destroy");e.dispatchEvent(t)}}function r(e){if(e&&e.nodeName&&"TEXTAREA"===e.nodeName){var t=d("autosize:update");e.dispatchEvent(t)}}var i="function"==typeof Set?new Set:function(){var e=[];return{has:function(t){return Boolean(e.indexOf(t)>-1)},add:function(t){e.push(t)},"delete":function(t){e.splice(e.indexOf(t),1)}}}(),d=function(e){return new Event(e)};try{new Event("test")}catch(s){d=function(e){var t=document.createEvent("Event");return t.initEvent(e,!0,!1),t}}var l=null;"undefined"==typeof window||"function"!=typeof window.getComputedStyle?(l=function(e){return e},l.destroy=function(e){return e},l.update=function(e){return e}):(l=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],function(e){return n(e,t)}),e},l.destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],o),e},l.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],r),e}),t.exports=l});
document.addEventListener('DOMContentLoaded', function() {
autosize(document.querySelectorAll('textarea'));
});
</script>
<div class="toast-container position-fixed bottom-0 end-0 p-3"></div>
<footer class="footer mt-auto py-2 bg-dark fixed-bottom customfooter" id=mainFooter>
<div class="container">
<div class="d-flex justify-content-between">
<div class="d-flex justify-content-between">
<a href="/feed" class="footer-btn"><i class="fas fa-zap"></i><span>Feed</span></a>
<a href="/photos" class="footer-btn"><i class="fas fa-photo-film"></i><span>Photos</span></a>
<a href="/messages/" class="footer-btn"><i class="fas fa-comment"></i><span>Chat</span></a>
<a href="/dating/" class="footer-btn"><i class="fas fa-heart"></i><span>Dating</span></a>
</div>
<div class="d-flex justify-content-between">
<a href="/register.php" class="footer-btn"><i class="fas fa-user-plus"></i><span>Signup</span></a>
<a href="/login.php" class="footer-btn"><i class="fas fa-sign-in-alt"></i><span>Login</span></a>
</div>
</div>
</div>
</footer>
<script>
document.addEventListener('DOMContentLoaded', function() {
let lastScrollTop = 0;
const footer = document.getElementById('mainFooter');
window.addEventListener('scroll', function() {
let scrollTop = window.pageYOffset || document.documentElement.scrollTop;
if (scrollTop > lastScrollTop) {
// Scroll down - hide footer
footer.style.transform = 'translateY(100%)';
} else {
// Scroll up - show footer
footer.style.transform = 'translateY(0)';
}
lastScrollTop = scrollTop;
});
});
</script>
<style>
.customfooter{
background-color:#333333;
background: rgb(134,66,255);
background: linear-gradient(0deg, rgba(134,66,255,1) 0%, rgba(173,0,255,1) 100%);
border:0px !important;
padding-bottom:2px !important;
}
.modal.bottom-modal .modal-dialog {
position: fixed;
bottom: 0;
left: 0;
right: 0;
margin: 0;
}
.modal.bottom-modal .modal-content {
border-radius: 0;
}
.footer {
background-color: #000;
border-top: 1px solid #333;
}
.footer-btn {
display: flex;
flex-direction: column;
align-items: center;
color: #fff;
text-decoration: none;
font-size: 0.8rem;
transition: color 0.3s ease;
border: none;
background: none;
cursor: pointer;
padding: 5px;
}
.footer-btn:hover, .footer-btn:focus {
color: #1da1f2;
}
.footer-btn i {
font-size: 1.5rem;
margin-bottom: 0px;
}
.footer-btn span {
display: block;
text-align: center;
}
@media (max-width: 576px) {
.customfooter{
padding-bottom:6px !important;
}
.footer-btn span {
display: none;
}
.footer-btn i {
font-size: 1.2rem;
}
}
.footer-btn:hover, .footer-btn:focus {
color: #ffffcc;
}
.loader {
border: 5px solid #f3f3f3;
border-top: 5px solid #3498db;
border-radius: 50%;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
display: none;
margin: 20px auto;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<!-- Photo confirmation modal -->
<div class="modal fade bottom-modal" id="photoUploadModal" tabindex="-1" aria-labelledby="photoUploadModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="photoUploadModalLabel">Upload Photo</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<button id="takePhotoBtn" class="btn btn-primary me-2"><i class="fas fa-camera"></i> Take Photo</button>
<button id="chooseFromGalleryBtn" class="btn btn-primary"><i class="fas fa-images"></i> Choose from Gallery</button>
<input type="file" id="photoUpload" style="display: none;" accept="image/*">
<div class="loader" id="photoLoader"></div>
</div>
</div>
</div>
</div>
<div class="modal fade bottom-modal" id="photoConfirmModal" tabindex="-1" aria-labelledby="photoConfirmModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="photoConfirmModalLabel">Confirm Photo Upload</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<img id="photoPreview" src="" alt="Photo preview" style="max-width: 100%; height: auto;">
<textarea id="photoCaption" class="form-control mt-3" rows="3" placeholder="Add a caption..."></textarea>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-primary" id="confirmUpload">Upload</button>
</div>
</div>
</div>
</div>
<script>
// Photo upload button click handler
$('#photoUploadBtn').click(function() {
$('#photoUploadModal').modal('show');
});
// Take photo button click handler
$('#takePhotoBtn').click(function() {
$('#photoUpload').attr('capture', 'camera');
$('#photoUpload').click();
});
// Choose from gallery button click handler
$('#chooseFromGalleryBtn').click(function() {
$('#photoUpload').removeAttr('capture');
$('#photoUpload').click();
});
// File input change handler
$('#photoUpload').change(function(event) {
var file = event.target.files[0];
if (file) {
$('#photoLoader').show();
$('#photoUploadModal').modal('hide');
processAndUploadFile(file);
}
});
// Process and upload file
function processAndUploadFile(file) {
if (file.size > 1024 * 1024) {
compressImage(file, uploadAndPreview);
} else {
uploadAndPreview(file);
}
}
// Compress image
function compressImage(file, callback) {
var reader = new FileReader();
reader.onload = function(e) {
var img = new Image();
img.onload = function() {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var width = img.width;
var height = img.height;
if (width > height) {
if (width > 1920) {
height *= 1920 / width;
width = 1920;
}
} else {
if (height > 1920) {
width *= 1920 / height;
height = 1920;
}
}
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0, width, height);
canvas.toBlob(function(blob) {
callback(new File([blob], file.name, {
type: 'image/jpeg',
lastModified: Date.now()
}));
}, 'image/jpeg', 0.7);
};
img.onerror = function() {
$('#photoLoader').hide();
alert('Error loading image. Please try another file.');
};
img.src = e.target.result;
};
reader.onerror = function() {
$('#photoLoader').hide();
alert('Error reading file. Please try again.');
};
reader.readAsDataURL(file);
}
// Upload and preview image
function uploadAndPreview(file) {
var formData = new FormData();
formData.append('photo', file);
$.ajax({
url: '/upload_photo.php',
type: 'POST',
data: formData,
processData: false,
contentType: false,
success: function(response) {
$('#photoLoader').hide();
try {
var data = JSON.parse(response);
if (data.success) {
$('#photoPreview').attr('src', data.image_url);
$('#photoPreview').data('photo-id', data.photo_id);
$('#photoConfirmModal').modal('show');
} else {
alert('Error uploading photo: ' + data.message);
}
} catch (e) {
console.error('Error parsing server response:', e);
alert('An unexpected error occurred while uploading the photo.');
}
},
error: function(jqXHR, textStatus, errorThrown) {
$('#photoLoader').hide();
console.error('AJAX error:', textStatus, errorThrown);
alert('An error occurred while uploading the photo: ' + textStatus);
}
});
}
// Confirm upload button click handler
$('#confirmUpload').click(function() {
var captionText = $('#photoCaption').val();
var photoId = $('#photoPreview').data('photo-id');
$.ajax({
url: '/upload_photo_caption.php',
type: 'POST',
data: {
photo_id: photoId,
caption: captionText
},
success: function(response) {
var data = JSON.parse(response);
if (data.success) {
$('#photoConfirmModal').modal('hide');
window.location.href = '/photos';
} else {
alert('Error saving caption: ' + data.error);
}
},
error: function() {
alert('An error occurred while saving the caption.');
}
});
});
</script>
</body>
</html>