Enhance content management and user interaction features

- Introduced a new content source toggle in the profile and app header to switch between IndeeHub and TopDoc films.
- Updated the content fetching logic to dynamically load content based on the selected source.
- Enhanced the seeding process to include a combined catalog of IndeeHub and TopDoc films, ensuring diverse content availability.
- Improved user interaction by preventing duplicate reactions and ensuring a smoother voting experience across comments and content.
- Added support for Amber login (NIP-55) for Android users, integrating it into the existing authentication flow.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Dorian
2026-02-12 14:24:52 +00:00
parent ab0560de00
commit 35bc78b890
38 changed files with 1107 additions and 185 deletions

View File

@@ -91,7 +91,7 @@
</div>
</div>
<!-- Nostr Login Button -->
<!-- Nostr Login Button (NIP-07 Browser Extension) -->
<button
@click="handleNostrLogin"
:disabled="isLoading"
@@ -100,7 +100,21 @@
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z" />
</svg>
Sign in with Nostr
Sign in with Nostr Extension
</button>
<!-- Amber Login Button (NIP-55 Android Signer) -->
<button
@click="handleAmberLogin"
:disabled="isLoading"
class="amber-login-button w-full flex items-center justify-center gap-2 mt-3"
>
<!-- Amber shield icon -->
<svg class="w-5 h-5" viewBox="0 0 24 24" fill="none">
<path d="M12 2L3 7v6c0 5.25 3.75 10.15 9 11.25C17.25 23.15 21 18.25 21 13V7l-9-5z" fill="#F7931A" opacity="0.2" stroke="#F7931A" stroke-width="1.5" stroke-linejoin="round"/>
<path d="M12 8v4m0 0v4m0-4h4m-4 0H8" stroke="#F7931A" stroke-width="2" stroke-linecap="round"/>
</svg>
Sign in with Amber
</button>
<!-- Toggle Mode -->
@@ -141,7 +155,7 @@ const props = withDefaults(defineProps<Props>(), {
const emit = defineEmits<Emits>()
const { login, loginWithNostr, register, isLoading: authLoading } = useAuth()
const { loginWithExtension } = useAccounts()
const { loginWithExtension, loginWithAmber, isAmberSupported } = useAccounts()
const mode = ref<'login' | 'register' | 'forgot'>(props.defaultMode)
const formData = ref({
@@ -226,6 +240,47 @@ async function handleNostrLogin() {
}
}
/**
* Login with Amber (NIP-55 Android Signer)
* Uses the AmberClipboardSigner from applesauce-signers which
* handles the Android intent flow and clipboard-based result reading.
* Amber copies the pubkey to clipboard, and when the user returns
* to the browser the signer reads it automatically.
*/
async function handleAmberLogin() {
errorMessage.value = null
try {
// Get the pubkey from Amber (opens intent, reads clipboard on return)
const pubkey = await loginWithAmber()
// Create auth session with the pubkey from Amber
await loginWithNostr(pubkey, 'amber-nip55', {
kind: 27235,
created_at: Math.floor(Date.now() / 1000),
tags: [
['u', window.location.origin],
['method', 'POST'],
],
content: '',
pubkey,
})
emit('success')
closeModal()
} catch (error: any) {
console.error('Amber login failed:', error)
if (error.message?.includes('non-Android')) {
errorMessage.value = 'Amber is only available on Android devices. Please use a Nostr browser extension instead.'
} else if (error.message?.includes('clipboard') || error.message?.includes('Empty')) {
errorMessage.value = 'Could not read from clipboard. Please ensure Amber is installed and clipboard permissions are granted.'
} else {
errorMessage.value = error.message || 'Amber login failed. Please try again.'
}
}
}
// Declare window.nostr for TypeScript
declare global {
interface Window {
@@ -312,4 +367,28 @@ declare global {
transform: scale(0.95);
opacity: 0;
}
/* Amber Login Button */
.amber-login-button {
padding: 12px 24px;
border-radius: 12px;
font-weight: 600;
font-size: 14px;
color: #F7931A;
background: rgba(247, 147, 26, 0.08);
border: 1px solid rgba(247, 147, 26, 0.25);
cursor: pointer;
transition: all 0.3s ease;
}
.amber-login-button:hover {
background: rgba(247, 147, 26, 0.15);
border-color: rgba(247, 147, 26, 0.4);
box-shadow: 0 0 20px rgba(247, 147, 26, 0.1);
}
.amber-login-button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
</style>