Enhance deployment script and update package dependencies

- Added detailed labels to the deployment script for IndeedHub, including title, version, description, license, icon, and repository URL.
- Updated package dependencies in package.json and package-lock.json, including upgrading 'nostr-tools' to version 2.23.0 and adding 'axios' and '@tanstack/vue-query'.
- Improved README with a modern description of the platform and updated project structure details.

This commit enhances the clarity of the deployment process and ensures the project is using the latest dependencies for better performance and features.
This commit is contained in:
Dorian
2026-02-12 10:30:47 +00:00
parent dacfa7a822
commit c970f5b29f
43 changed files with 6906 additions and 603 deletions

View File

@@ -2,6 +2,10 @@ import { defineStore } from 'pinia'
import { ref } from 'vue'
import type { Content } from '../types/content'
import { indeeHubFilms, bitcoinFilms, documentaries, dramas } from '../data/indeeHubFilms'
import { contentService } from '../services/content.service'
import { mapApiProjectsToContents } from '../utils/mappers'
const USE_MOCK_DATA = import.meta.env.VITE_USE_MOCK_DATA === 'true' || import.meta.env.DEV
export const useContentStore = defineStore('content', () => {
const featuredContent = ref<Content | null>(null)
@@ -17,40 +21,102 @@ export const useContentStore = defineStore('content', () => {
const loading = ref(false)
const error = ref<string | null>(null)
/**
* Fetch content from API
*/
async function fetchContentFromApi() {
try {
// Fetch all published projects
const projects = await contentService.getProjects({ status: 'published' })
if (projects.length === 0) {
throw new Error('No content available')
}
// Map API data to content format
const allContent = mapApiProjectsToContents(projects)
// Set featured content (first film project or first project)
const featuredFilm = allContent.find(c => c.type === 'film') || allContent[0]
featuredContent.value = featuredFilm
// Organize into rows
const films = allContent.filter(c => c.type === 'film')
const bitcoinContent = allContent.filter(c =>
c.categories?.some(cat => cat.toLowerCase().includes('bitcoin'))
)
const docs = allContent.filter(c =>
c.categories?.some(cat => cat.toLowerCase().includes('documentary'))
)
const dramaContent = allContent.filter(c =>
c.categories?.some(cat => cat.toLowerCase().includes('drama'))
)
contentRows.value = {
featured: allContent.slice(0, 10),
newReleases: films.slice(0, 8),
bitcoin: bitcoinContent.length > 0 ? bitcoinContent : films.slice(0, 6),
documentaries: docs.length > 0 ? docs : films.slice(0, 6),
dramas: dramaContent.length > 0 ? dramaContent : films.slice(0, 6),
independent: films.slice(0, 10)
}
} catch (err) {
console.error('API fetch failed:', err)
throw err
}
}
/**
* Fetch content from mock data
*/
function fetchContentFromMock() {
// Set featured content immediately - God Bless Bitcoin
const godBlessBitcoin = bitcoinFilms.find(f => f.title === 'God Bless Bitcoin') || bitcoinFilms[0]
if (godBlessBitcoin) {
featuredContent.value = {
...godBlessBitcoin,
backdrop: '/images/god-bless-bitcoin-backdrop.jpg'
}
} else {
featuredContent.value = indeeHubFilms[0]
}
// Organize content into rows
contentRows.value = {
featured: indeeHubFilms.slice(0, 10),
newReleases: indeeHubFilms.slice(0, 8).reverse(),
bitcoin: bitcoinFilms,
documentaries: documentaries.slice(0, 10),
dramas: dramas.slice(0, 10),
independent: indeeHubFilms.filter(f =>
!f.categories.includes('Bitcoin') && !f.categories.includes('Documentary')
).slice(0, 10)
}
}
/**
* Main fetch content method
*/
async function fetchContent() {
loading.value = true
error.value = null
try {
// Set featured content immediately - God Bless Bitcoin
const godBlessBitcoin = bitcoinFilms.find(f => f.title === 'God Bless Bitcoin') || bitcoinFilms[0]
if (godBlessBitcoin) {
// Override backdrop to use the public folder image
featuredContent.value = {
...godBlessBitcoin,
backdrop: '/images/god-bless-bitcoin-backdrop.jpg'
}
if (USE_MOCK_DATA) {
// Use mock data in development or when flag is set
await new Promise(resolve => setTimeout(resolve, 100))
fetchContentFromMock()
} else {
featuredContent.value = indeeHubFilms[0]
// Fetch from API
await fetchContentFromApi()
}
} catch (e: any) {
error.value = e.message || 'Failed to load content'
console.error('Content fetch error:', e)
// Small delay for content rows only
await new Promise(resolve => setTimeout(resolve, 100))
// Organize content into rows
contentRows.value = {
featured: indeeHubFilms.slice(0, 10),
newReleases: indeeHubFilms.slice(0, 8).reverse(),
bitcoin: bitcoinFilms,
documentaries: documentaries.slice(0, 10),
dramas: dramas.slice(0, 10),
independent: indeeHubFilms.filter(f =>
!f.categories.includes('Bitcoin') && !f.categories.includes('Documentary')
).slice(0, 10)
}
} catch (e) {
error.value = 'Failed to load content'
console.error(e)
// Fallback to mock data on error
console.log('Falling back to mock data...')
fetchContentFromMock()
} finally {
loading.value = false
}