Compare commits

...

10 Commits

Author SHA1 Message Date
cedric 288d771075 Merge pull request 'feat: rendre le dépôt configurable via variables d'env' (#2) from feat/improve-custom into master
Déploiement FRONT BETA / check (push) Successful in 2m6s
Déploiement FRONT PROD / check (push) Successful in 2m2s
Déploiement FRONT BETA / deploy (push) Successful in 21s
Déploiement FRONT PROD / deploy (push) Successful in 22s
Reviewed-on: #2
2026-06-26 05:14:10 +00:00
cedric cd5ebb8058 ci: deploy beta on all branches including master
Déploiement FRONT BETA / check (push) Successful in 2m6s
Vérification PR / check (pull_request) Successful in 2m8s
Déploiement FRONT BETA / deploy (push) Successful in 20s
Vérification PR / deploy-beta (pull_request) Successful in 19s
2026-06-26 07:26:30 +04:00
cedric aa3032d25e ci: checkout correct branch before deploy
Déploiement FRONT BETA / check (push) Successful in 2m2s
Vérification PR / check (pull_request) Successful in 2m16s
Déploiement FRONT BETA / deploy (push) Successful in 43s
Vérification PR / deploy-beta (pull_request) Successful in 22s
2026-06-26 07:14:44 +04:00
cedric cd24d90b67 ci: deploy beta on any branch except master 2026-06-26 07:13:02 +04:00
cedric 5c16f126a7 docs: update .env.sample with new variables
Vérification PR / check (pull_request) Successful in 2m11s
Vérification PR / deploy-beta (pull_request) Successful in 27s
2026-06-26 00:34:20 +04:00
cedric 69535aa3f4 refactor: rename isOKIAwtis to isExclusiveArtist 2026-06-26 00:34:14 +04:00
cedric ce8053a3f6 feat: redirect to PDF when NEXT_PUBLIC_CGU_DOWNLOAD_LINK is set 2026-06-26 00:34:09 +04:00
cedric 9cbb5e3d23 feat: extract hardcoded branding values to env vars 2026-06-26 00:34:04 +04:00
cedric f2d03ebec6 feat: parse image domains from NEXT_PUBLIC_DOMAINS_IMAGE 2026-06-26 00:33:54 +04:00
cedric 2232cd7360 feat: replace static manifest.json with dynamic app/manifest.js 2026-06-26 00:33:50 +04:00
22 changed files with 230 additions and 205 deletions
+24 -1
View File
@@ -6,6 +6,16 @@ SITE_URL=http://localhost:3001
NEXT_PUBLIC_READ_TOKEN= NEXT_PUBLIC_READ_TOKEN=
NEXT_PUBLIC_ADMIN_JWT_SECRET= NEXT_PUBLIC_ADMIN_JWT_SECRET=
# IDENTITÉ DU SITE (branding)
NEXT_PUBLIC_SITE_NAME=PAWÒL-NU. Paroles et traductions.
NEXT_PUBLIC_SITE_SHORT_NAME=PAWÒL-NU
NEXT_PUBLIC_SITE_DESCRIPTION=PAWÒL-NU a pour but de promouvoir le Medukam (ou Wanni Wannan) et les productions afro-diasporiques.
NEXT_PUBLIC_ORG_NAME=OKI
NEXT_PUBLIC_ORG_FULL_NAME=ORGANISATION KA INTERNATIONALE
NEXT_PUBLIC_ORG_EMAIL=kontak@o-k-i.net
NEXT_PUBLIC_ORG_LOCATION=Guadeloupe
NEXT_PUBLIC_EXCLUSIVE_ARTIST_LABEL=OKI Exclusif
# FUNKWHALE VARIABLE # FUNKWHALE VARIABLE
NEXT_PUBLIC_OKI_MIZIK_URL=https://funkwhale-server.com NEXT_PUBLIC_OKI_MIZIK_URL=https://funkwhale-server.com
NEXT_PUBLIC_MIZIK_API_USER=user NEXT_PUBLIC_MIZIK_API_USER=user
@@ -14,9 +24,11 @@ NEXT_PUBLIC_MIZIK_API_PASSWORD=password
NEXT_PUBLIC_AWTIS_POU_CHAK_PAJ=6 NEXT_PUBLIC_AWTIS_POU_CHAK_PAJ=6
NEXT_PUBLIC_SITE_URL=$SITE_URL NEXT_PUBLIC_SITE_URL=$SITE_URL
# NEXT AUTH # Auth
NEXTAUTH_URL=http://localhost:3000 NEXTAUTH_URL=http://localhost:3000
BETTER_AUTH_URL=http://localhost:3000
BETTER_AUTH_SECRET=
# TWITTER VARIABLE # TWITTER VARIABLE
@@ -32,6 +44,12 @@ GOOGLE_CLIENT_SECRET=
NEXT_PUBLIC_CGU_DOWNLOAD_LINK= NEXT_PUBLIC_CGU_DOWNLOAD_LINK=
# Debug (mettre YES pour afficher les emails dans les logs en développement)
SHOW_EMAILS=
# Analytique (Plausible — laisser vide pour désactiver)
NEXT_PUBLIC_PLAUSIBLE_URL=
# Menu # Menu
NEXT_PUBLIC_PROD_DOMAIN= NEXT_PUBLIC_PROD_DOMAIN=
@@ -62,6 +80,8 @@ NEXT_PUBLIC_YOUTUBE_USERNAME=
NEXT_PUBLIC_TELEGRAM_GROUP= NEXT_PUBLIC_TELEGRAM_GROUP=
NEXT_PUBLIC_XMPP= NEXT_PUBLIC_XMPP=
NEXT_PUBLIC_GIT= NEXT_PUBLIC_GIT=
NEXT_PUBLIC_CODEBERG=
NEXT_PUBLIC_BLUESKY_URL=
# DOMAIN IMAGE # DOMAIN IMAGE
NEXT_PUBLIC_DOMAINS_IMAGE="localhost:1337 strapi.mondomaine.com" NEXT_PUBLIC_DOMAINS_IMAGE="localhost:1337 strapi.mondomaine.com"
@@ -85,8 +105,11 @@ SMTP_PASSWORD=
SMTP_FROM= SMTP_FROM=
SMTP_REPLY_TO= SMTP_REPLY_TO=
SMTP_SEND_TO= SMTP_SEND_TO=
SMTP_BCC=
SMTP_SECURE=
# Twitter Authentification # Twitter Authentification
NEXT_PUBLIC_TWITTER_API_KEY= NEXT_PUBLIC_TWITTER_API_KEY=
NEXT_PUBLIC_TWITTER_API_KEY_SECRET= NEXT_PUBLIC_TWITTER_API_KEY_SECRET=
NEXT_PUBLIC_TWITTER_BEARER_TOKEN=
+2 -3
View File
@@ -2,8 +2,6 @@ name: Déploiement FRONT BETA
run-name: ${{ gitea.actor }} déploie FRONT BETA run-name: ${{ gitea.actor }} déploie FRONT BETA
on: on:
push: push:
branches:
- dev
jobs: jobs:
check: check:
@@ -36,7 +34,8 @@ jobs:
export NVM_DIR="$HOME/.nvm" export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
cd ${{ secrets.FRONT_DEPLOY_PATH }} cd ${{ secrets.FRONT_DEPLOY_PATH }}
git pull --ff-only origin dev git fetch origin
git checkout -B ${{ gitea.ref_name }} origin/${{ gitea.ref_name }}
corepack enable corepack enable
yarn install --frozen-lockfile yarn install --frozen-lockfile
yarn build yarn build
+2 -2
View File
@@ -50,11 +50,11 @@ export async function generateMetadata(props) {
type: 'website' type: 'website'
}, },
twitter: { twitter: {
site: '@OrganisationKA', site: `@${process.env.NEXT_PUBLIC_TWITTER_USERNAME || 'OrganisationKA'}`,
card: 'summary_large_image', card: 'summary_large_image',
title, title,
description, description,
creator: '@OrganisationKA', creator: `@${process.env.NEXT_PUBLIC_TWITTER_USERNAME || 'OrganisationKA'}`,
images: { images: {
url: `${apiUrl}${kuvetiFormat?.url}`, url: `${apiUrl}${kuvetiFormat?.url}`,
alt: `Photo de ${anAwtis.alias}`, alt: `Photo de ${anAwtis.alias}`,
+14 -10
View File
@@ -10,17 +10,21 @@ import Pajinasyon from '../../components/awtis/pajinasyon'
import {jwennAwtisPajinasyon} from '../../lib/oki-api' import {jwennAwtisPajinasyon} from '../../lib/oki-api'
import Footer from '../../components/footer' import Footer from '../../components/footer'
const siteName = process.env.NEXT_PUBLIC_SITE_NAME || 'PAWÒL-NU. Paroles et traductions.'
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://pawol.nu'
const twitterHandle = `@${process.env.NEXT_PUBLIC_TWITTER_USERNAME || 'OrganisationKA'}`
export const metadata = { export const metadata = {
title: 'PAWÒL-NU | Artistes', title: `${siteName} | Artistes`,
description: 'Liste des artistes ayant une ou plusieurs œuvres présentes sur le site.', description: 'Liste des artistes ayant une ou plusieurs œuvres présentes sur le site.',
openGraph: { openGraph: {
title: 'PAWÒL-NU | Artistes', title: `${siteName} | Artistes`,
description: 'Liste des artistes ayant une ou plusieurs œuvres présentes sur le site.', description: 'Liste des artistes ayant une ou plusieurs œuvres présentes sur le site.',
url: 'https://pawol.nu/sipote', url: `${siteUrl}/awtis`,
siteName: 'PAWÒL-NU. Paroles et traductions.', siteName,
images: [ images: [
{ {
url: 'https://pawol.nu/logo-512x512.png', url: `${siteUrl}/logo-512x512.png`,
width: 512, width: 512,
height: 512 height: 512
} }
@@ -29,14 +33,14 @@ export const metadata = {
type: 'website' type: 'website'
}, },
twitter: { twitter: {
site: '@OrganisationKA', site: twitterHandle,
card: 'summary_large_image', card: 'summary_large_image',
title: 'PAWÒL-NU | Artistes', title: `${siteName} | Artistes`,
description: 'Liste des artistes ayant une ou plusieurs œuvres présentes sur le site.', description: 'Liste des artistes ayant une ou plusieurs œuvres présentes sur le site.',
creator: '@OrganisationKA', creator: twitterHandle,
images: { images: {
url: 'https://pawol.nu/logo-512x512.png', url: `${siteUrl}/logo-512x512.png`,
alt: 'OKI Logo', alt: `${siteName} Logo`,
} }
} }
} }
+44 -29
View File
@@ -3,24 +3,33 @@ import TopLoader from '../components/top-loader'
import Navigasyon from '../components/navigasyon' import Navigasyon from '../components/navigasyon'
import ThemeRegistry from './theme-registy' import ThemeRegistry from './theme-registy'
const siteName = process.env.NEXT_PUBLIC_SITE_NAME || 'PAWÒL-NU. Paroles et traductions.'
const siteDescription = process.env.NEXT_PUBLIC_SITE_DESCRIPTION || 'PAWÒL-NU a pour but de promouvoir le Medukam (ou Wanni Wannan) et les productions afro-diasporiques.'
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://pawol.nu'
const orgName = process.env.NEXT_PUBLIC_ORG_NAME || 'OKI'
const orgEmail = process.env.NEXT_PUBLIC_ORG_EMAIL || 'kontak@o-k-i.net'
const orgLocation = process.env.NEXT_PUBLIC_ORG_LOCATION || 'Guadeloupe'
const twitterHandle = `@${process.env.NEXT_PUBLIC_TWITTER_USERNAME || 'OrganisationKA'}`
const plausibleUrl = process.env.NEXT_PUBLIC_PLAUSIBLE_URL || null
export const metadata = { export const metadata = {
metadataBase: new URL('https://pawol.nu'), metadataBase: new URL(siteUrl),
manifest: '/manifest.json', manifest: '/manifest.webmanifest',
title: 'PAWÒL-NU. Paroles et traductions.', title: siteName,
description: 'PAWÒL-NU a pour but de promouvoir le Medukam (ou Wanni Wannan) et les productions afro-diasporiques.', description: siteDescription,
author: 'OKI', author: orgName,
category: 'music', category: 'music',
creator: 'OKI', creator: orgName,
publisher: 'OKI', publisher: orgName,
applicationName: 'PAWÒL-NU. Paroles et traductions.', applicationName: siteName,
openGraph: { openGraph: {
title: 'PAWÒL-NU. Paroles et traductions.', title: siteName,
description: 'PAWÒL-NU a pour but de promouvoir le Medukam (ou Wanni Wannan) et les productions afro-diasporiques.', description: siteDescription,
url: 'https://pawol.nu', url: siteUrl,
siteName: 'PAWÒL-NU. Paroles et traductions.', siteName,
images: [ images: [
{ {
url: 'https://pawol.nu/logo-512x512.png', url: `${siteUrl}/logo-512x512.png`,
width: 512, width: 512,
height: 512 height: 512
} }
@@ -29,14 +38,14 @@ export const metadata = {
type: 'website' type: 'website'
}, },
twitter: { twitter: {
site: '@OrganisationKA', site: twitterHandle,
card: 'summary_large_image', card: 'summary_large_image',
title: 'PAWÒL-NU. Paroles et traductions.', title: siteName,
description: 'PAWÒL-NU a pour but de promouvoir le Medukam (ou Wanni Wannan) et les productions afro-diasporiques.', description: siteDescription,
creator: '@OrganisationKA', creator: twitterHandle,
images: { images: {
url: 'https://pawol.nu/logo-512x512.png', url: `${siteUrl}/logo-512x512.png`,
alt: 'PAWÒL-NU Logo', alt: `${siteName} Logo`,
}, },
} }
} }
@@ -44,18 +53,16 @@ export const metadata = {
const jsonLd = { const jsonLd = {
'@context': 'https://schema.org', '@context': 'https://schema.org',
'@type': 'Organization', '@type': 'Organization',
url: 'https://pawol.nu', url: siteUrl,
email: 'kontak@o-k-i.net', email: orgEmail,
keywords: ['OKI', 'PAWÒL-NU', 'Paroles', 'Pawol', 'Medukam', 'Wanni Wannan'], keywords: [orgName, siteName, 'Paroles', 'Pawol'],
legalName: 'PAWÒL-NU', legalName: siteName,
location: 'Guadeloupe' location: orgLocation,
} }
export default async function RootLayout({children}) { export default async function RootLayout({children}) {
return ( const inner = (
<html lang='fr' suppressHydrationWarning> <>
<body>
<PlausibleProvider src='https://plausible.io/js/pa-3sQidCSfiSOXQUh-4La0T.js'>
<TopLoader color='#ffeb3b' /> <TopLoader color='#ffeb3b' />
<ThemeRegistry> <ThemeRegistry>
<Navigasyon /> <Navigasyon />
@@ -67,7 +74,15 @@ export default async function RootLayout({children}) {
dangerouslySetInnerHTML={{__html: JSON.stringify(jsonLd)}} dangerouslySetInnerHTML={{__html: JSON.stringify(jsonLd)}}
/> />
</section> </section>
</PlausibleProvider> </>
)
return (
<html lang='fr' suppressHydrationWarning>
<body>
{plausibleUrl
? <PlausibleProvider src={plausibleUrl}>{inner}</PlausibleProvider>
: inner}
</body> </body>
</html> </html>
) )
+25
View File
@@ -0,0 +1,25 @@
export default function manifest() {
return {
name: process.env.NEXT_PUBLIC_SITE_NAME || 'PAWÒL-NU',
short_name: process.env.NEXT_PUBLIC_SITE_SHORT_NAME || 'PAWÒL-NU',
description: process.env.NEXT_PUBLIC_SITE_DESCRIPTION || 'PAWÒL-NU a pour but de promouvoir le Medukam (ou Wanni Wannan) et les productions afro-diasporiques.',
scope: '/',
start_url: '/',
display: 'standalone',
background_color: '#303030',
theme_color: '#303030',
orientation: 'portrait-primary',
icons: [
{src: '/logo-72x72.png', type: 'image/png', sizes: '72x72'},
{src: '/logo-96x96.png', type: 'image/png', sizes: '96x96'},
{src: '/logo-128x128.png', type: 'image/png', sizes: '128x128'},
{src: '/logo-144x144.png', type: 'image/png', sizes: '144x144'},
{src: '/logo-152x152.png', type: 'image/png', sizes: '152x152'},
{src: '/logo-192x192.png', type: 'image/png', sizes: '192x192'},
{src: '/logo-256x256.png', type: 'image/png', sizes: '256x256'},
{src: '/logo-384x384.png', type: 'image/png', sizes: '384x384'},
{src: '/logo-512x512.png', type: 'image/png', sizes: '512x512'},
{src: '/maskable.png', type: 'image/png', sizes: '192x192', purpose: 'maskable'},
],
}
}
+2 -2
View File
@@ -53,11 +53,11 @@ export async function generateMetadata(props) {
type: 'website' type: 'website'
}, },
twitter: { twitter: {
site: '@OrganisationKA', site: `@${process.env.NEXT_PUBLIC_TWITTER_USERNAME || 'OrganisationKA'}`,
card: 'summary_large_image', card: 'summary_large_image',
title, title,
description, description,
creator: '@OrganisationKA', creator: `@${process.env.NEXT_PUBLIC_TWITTER_USERNAME || 'OrganisationKA'}`,
images: { images: {
url: `${apiUrl}${kuvetiFormat?.url}`, url: `${apiUrl}${kuvetiFormat?.url}`,
alt: `Couverture ${title}`, alt: `Couverture ${title}`,
+14 -10
View File
@@ -4,17 +4,21 @@ import {jwennTeks} from '../../lib/oki-api'
import TeksDrawer from '../../components/teks/teks-drawer' import TeksDrawer from '../../components/teks/teks-drawer'
import Loading from './loading' import Loading from './loading'
const siteName = process.env.NEXT_PUBLIC_SITE_NAME || 'PAWÒL-NU. Paroles et traductions.'
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://pawol.nu'
const twitterHandle = `@${process.env.NEXT_PUBLIC_TWITTER_USERNAME || 'OrganisationKA'}`
export const metadata = { export const metadata = {
title: 'PAWÒL-NU. Paroles et traductions.', title: siteName,
description: 'Retrouvez les paroles et les traductions de vos chansons préférées.', description: 'Retrouvez les paroles et les traductions de vos chansons préférées.',
openGraph: { openGraph: {
title: 'PAWÒL-NU. Paroles et traductions.', title: siteName,
description: 'Retrouvez les paroles et les traductions de vos chansons préférées.', description: 'Retrouvez les paroles et les traductions de vos chansons préférées.',
url: 'https://pawol.nu/paroles', url: `${siteUrl}/paroles`,
siteName: 'PAWÒL-NU. Paroles et traductions.', siteName,
images: [ images: [
{ {
url: 'https://pawol.nu/logo-512x512.png', url: `${siteUrl}/logo-512x512.png`,
width: 512, width: 512,
height: 512 height: 512
} }
@@ -23,14 +27,14 @@ export const metadata = {
type: 'website' type: 'website'
}, },
twitter: { twitter: {
site: '@OrganisationKA', site: twitterHandle,
card: 'summary_large_image', card: 'summary_large_image',
title: 'PAWÒL-NU. Paroles et traductions.', title: siteName,
description: 'Retrouvez les paroles et les traductions de vos chansons préférées.', description: 'Retrouvez les paroles et les traductions de vos chansons préférées.',
creator: '@OrganisationKA', creator: twitterHandle,
images: { images: {
url: 'https://pawol.nu/logo-512x512.png', url: `${siteUrl}/logo-512x512.png`,
alt: 'OKI Logo', alt: `${siteName} Logo`,
}, },
} }
} }
+8 -6
View File
@@ -8,6 +8,8 @@ import Footer from '../../components/footer'
const apiUrl = process.env.NEXT_PUBLIC_API_URL_ROOT || 'http://localhost:1337' const apiUrl = process.env.NEXT_PUBLIC_API_URL_ROOT || 'http://localhost:1337'
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000' const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000'
const siteName = process.env.NEXT_PUBLIC_SITE_NAME || 'PAWÒL-NU. Paroles et traductions.'
const twitterHandle = `@${process.env.NEXT_PUBLIC_TWITTER_USERNAME || 'OrganisationKA'}`
async function jwennDone() { async function jwennDone() {
const denyeTeks = await jwennDenyeTeks() const denyeTeks = await jwennDenyeTeks()
@@ -29,23 +31,23 @@ export async function generateMetadata() {
const description = `Derniers morceaux : ${songList}` const description = `Derniers morceaux : ${songList}`
return { return {
title: 'PAWÒL-NU | Derniers morceaux', title: `${siteName} | Derniers morceaux`,
description, description,
openGraph: { openGraph: {
title: 'PAWÒL-NU | Derniers morceaux', title: `${siteName} | Derniers morceaux`,
description, description,
url: `${siteUrl}/paroles`, url: `${siteUrl}/paroles`,
siteName: 'PAWÒL-NU. Paroles et traductions.', siteName,
images: [{url: imageUrl, width: imageWidth, height: imageHeight}], images: [{url: imageUrl, width: imageWidth, height: imageHeight}],
locale: 'fr_FR', locale: 'fr_FR',
type: 'website', type: 'website',
}, },
twitter: { twitter: {
site: '@OrganisationKA', site: twitterHandle,
card: 'summary_large_image', card: 'summary_large_image',
title: 'PAWÒL-NU | Derniers morceaux', title: `${siteName} | Derniers morceaux`,
description, description,
creator: '@OrganisationKA', creator: twitterHandle,
images: {url: imageUrl, alt: 'Couverture du dernier morceau publié'}, images: {url: imageUrl, alt: 'Couverture du dernier morceau publié'},
}, },
} }
+1 -1
View File
@@ -15,6 +15,6 @@ export default function robots() {
userAgent: '*', userAgent: '*',
allow: '/', allow: '/',
}, },
sitemap: 'https://pawol.nu/sitemap.xml', sitemap: `${process.env.NEXT_PUBLIC_SITE_URL || 'https://pawol.nu'}/sitemap.xml`,
} }
} }
+16 -10
View File
@@ -1,14 +1,20 @@
const siteName = process.env.NEXT_PUBLIC_SITE_NAME || 'PAWÒL-NU. Paroles et traductions.'
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://pawol.nu'
const orgFullName = process.env.NEXT_PUBLIC_ORG_FULL_NAME || process.env.NEXT_PUBLIC_ORG_NAME || 'ORGANISATION KA INTERNATIONALE'
const twitterHandle = `@${process.env.NEXT_PUBLIC_TWITTER_USERNAME || 'OrganisationKA'}`
const sipoteTitle = `${siteName} | Soutenir ${orgFullName} !`
export const metadata = { export const metadata = {
title: 'PAWÒL-NU | Soutenir ORGANISATION KA INTERNATIONALE !', title: sipoteTitle,
description: 'Vous pouvez nous soutenir via Liberapay ou PayPal', description: 'Vous pouvez nous soutenir via Liberapay ou PayPal',
openGraph: { openGraph: {
title: 'PAWÒL-NU | Soutenir ORGANISATION KA INTERNATIONALE !', title: sipoteTitle,
description: 'Vous pouvez nous soutenir via Liberapay ou PayPal.', description: 'Vous pouvez nous soutenir via Liberapay ou PayPal.',
url: 'https://pawol.nu/sipote', url: `${siteUrl}/sipote`,
siteName: 'PAWÒL-NU | Paroles et traductions.', siteName,
images: [ images: [
{ {
url: 'https://pawol.nu/sipote.png', url: `${siteUrl}/sipote.png`,
width: 500, width: 500,
height: 500 height: 500
} }
@@ -17,14 +23,14 @@ export const metadata = {
type: 'website' type: 'website'
}, },
twitter: { twitter: {
site: '@OrganisationKA', site: twitterHandle,
card: 'summary_large_image', card: 'summary_large_image',
title: 'PAWÒL-NU | Soutenir ORGANISATION KA INTERNATIONALE !', title: sipoteTitle,
description: 'Vous pouvez nous soutenir via Liberapay ou PayPal.', description: 'Vous pouvez nous soutenir via Liberapay ou PayPal.',
creator: '@OrganisationKA', creator: twitterHandle,
images: { images: {
url: 'https://pawol.nu/sipote.png', url: `${siteUrl}/sipote.png`,
alt: 'Sipòte OKI', alt: `Sipòte ${process.env.NEXT_PUBLIC_ORG_NAME || 'OKI'}`,
}, },
} }
} }
+5 -4
View File
@@ -28,18 +28,19 @@ import AwtisBiyografi from './awtis-biyografi'
import MizikLyen from './mizik-lyen' import MizikLyen from './mizik-lyen'
const IMAGE_URL = process.env.NEXT_PUBLIC_API_URL_ROOT || 'http://localhost:1337' const IMAGE_URL = process.env.NEXT_PUBLIC_API_URL_ROOT || 'http://localhost:1337'
const EXCLUSIVE_LABEL = process.env.NEXT_PUBLIC_EXCLUSIVE_ARTIST_LABEL || 'OKI Exclusif'
const BLUR_DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNsYAAAAAYAAjCB0C8AAAAASUVORK5CYII=' const BLUR_DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNsYAAAAAYAAjCB0C8AAAAASUVORK5CYII='
const sortTeks = paroles => paroles.sort((a, b) => a.titre.localeCompare(b.titre, 'fr', {sensitivity: 'base'})) const sortTeks = paroles => paroles.sort((a, b) => a.titre.localeCompare(b.titre, 'fr', {sensitivity: 'base'}))
export default function AwtisDetay({anAwtis}) { export default function AwtisDetay({anAwtis}) {
const [esByografiOuve, meteEsByografiOuve] = useState(false) const [esByografiOuve, meteEsByografiOuve] = useState(false)
const {alias, biographie, paroles, photo, isOKIAwtis, titrePhare} = anAwtis const {alias, biographie, paroles, photo, isExclusiveArtist, titrePhare} = anAwtis
const sortedTeks = sortTeks(paroles) const sortedTeks = sortTeks(paroles)
const gwanBiyo = biographie && biographie.length > 100 const gwanBiyo = biographie && biographie.length > 100
const biyo = gwanBiyo ? `${biographie.slice(0, 100)}...` : biographie const biyo = gwanBiyo ? `${biographie.slice(0, 100)}...` : biographie
const hasStreaming = isOKIAwtis && titrePhare?.streamAudio?.length > 0 const hasStreaming = isExclusiveArtist && titrePhare?.streamAudio?.length > 0
const coverUrl = titrePhare?.couverture const coverUrl = titrePhare?.couverture
? `${IMAGE_URL}${titrePhare.couverture.formats?.small?.url || titrePhare.couverture.formats?.thumbnail?.url || titrePhare.couverture.url}` ? `${IMAGE_URL}${titrePhare.couverture.formats?.small?.url || titrePhare.couverture.formats?.thumbnail?.url || titrePhare.couverture.url}`
: null : null
@@ -81,11 +82,11 @@ export default function AwtisDetay({anAwtis}) {
</Box> </Box>
</Box> </Box>
{isOKIAwtis && ( {isExclusiveArtist && (
<Box sx={{display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 0.75, mb: 2}}> <Box sx={{display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 0.75, mb: 2}}>
<Chip <Chip
icon={<VerifiedIcon sx={{fontSize: 16}} />} icon={<VerifiedIcon sx={{fontSize: 16}} />}
label='Artiste OKI Exclusif' label={`Artiste ${EXCLUSIVE_LABEL}`}
size='small' size='small'
sx={{bgcolor: '#FFD700', color: '#000', fontWeight: 700, '& .MuiChip-icon': {color: '#000'}}} sx={{bgcolor: '#FFD700', color: '#000', fontWeight: 700, '& .MuiChip-icon': {color: '#000'}}}
/> />
+5 -4
View File
@@ -20,6 +20,7 @@ import AwtisBiyografi from './awtis-biyografi'
const PREFIX = 'awtis-kat' const PREFIX = 'awtis-kat'
const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3001' const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3001'
const IMAGE_URL = process.env.NEXT_PUBLIC_API_URL_ROOT || 'http://localhost:1337' const IMAGE_URL = process.env.NEXT_PUBLIC_API_URL_ROOT || 'http://localhost:1337'
const EXCLUSIVE_LABEL = process.env.NEXT_PUBLIC_EXCLUSIVE_ARTIST_LABEL || 'OKI Exclusif'
const classes = { const classes = {
root: `${PREFIX}-root`, root: `${PREFIX}-root`,
@@ -57,16 +58,16 @@ export default function AwtisKat({artiste}) {
const router = useRouter() const router = useRouter()
const [esByografiOuve, meteEsByografiOuve] = useState(false) const [esByografiOuve, meteEsByografiOuve] = useState(false)
const {alias, biographie, paroles, photo, slug, isOKIAwtis} = artiste const {alias, biographie, paroles, photo, slug, isExclusiveArtist} = artiste
return ( return (
<Grid size={{xs: 12, sm: 6, md: 4}}> <Grid size={{xs: 12, sm: 6, md: 4}}>
<Kat> <Kat>
<Card sx={{maxWidth: 340, position: 'relative', ...(isOKIAwtis && {outline: '2px solid #FFD700'})}}> <Card sx={{maxWidth: 340, position: 'relative', ...(isExclusiveArtist && {outline: '2px solid #FFD700'})}}>
{isOKIAwtis && ( {isExclusiveArtist && (
<Chip <Chip
icon={<VerifiedIcon sx={{fontSize: 14}} />} icon={<VerifiedIcon sx={{fontSize: 14}} />}
label='OKI Exclusif' label={EXCLUSIVE_LABEL}
size='small' size='small'
sx={{ sx={{
position: 'absolute', top: 8, left: 8, zIndex: 1, position: 'absolute', top: 8, left: 8, zIndex: 1,
+17 -7
View File
@@ -2,7 +2,6 @@ import {useRef, useEffect} from 'react'
import {styled, useTheme} from '@mui/material/styles' import {styled, useTheme} from '@mui/material/styles'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import {Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography} from '@mui/material' import {Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography} from '@mui/material'
import {useRouter} from 'next/navigation'
import useMediaQuery from '@mui/material/useMediaQuery' import useMediaQuery from '@mui/material/useMediaQuery'
import Cgu from '.' import Cgu from '.'
@@ -23,17 +22,11 @@ const CGU_DOWNLOAD_LINK = process.env.NEXT_PUBLIC_CGU_DOWNLOAD_LINK
export default function CGUDialog({open, setOpen}) { export default function CGUDialog({open, setOpen}) {
const theme = useTheme() const theme = useTheme()
const fullScreen = useMediaQuery(theme.breakpoints.down('md')) const fullScreen = useMediaQuery(theme.breakpoints.down('md'))
const router = useRouter()
const handleClose = () => { const handleClose = () => {
setOpen(false) setOpen(false)
} }
const handleClick = event => {
event.preventDefault()
router.push(CGU_DOWNLOAD_LINK)
}
const descriptionElementRef = useRef(null) const descriptionElementRef = useRef(null)
useEffect(() => { useEffect(() => {
if (open) { if (open) {
@@ -64,7 +57,24 @@ export default function CGUDialog({open, setOpen}) {
id='scroll-dialog-description' id='scroll-dialog-description'
tabIndex={-1} tabIndex={-1}
> >
{CGU_DOWNLOAD_LINK ? (
<div style={{textAlign: 'center', padding: '2rem'}}>
<Typography paragraph>
Consultez nos CGU et notre politique de confidentialité :
</Typography>
<Button
variant='contained'
component='a'
href={CGU_DOWNLOAD_LINK}
target='_blank'
rel='noopener noreferrer'
>
Consulter les CGU
</Button>
</div>
) : (
<Cgu /> <Cgu />
)}
</Typography> </Typography>
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>
+15 -12
View File
@@ -5,6 +5,9 @@ import Navigasyon from './navigasyon'
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000' const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000'
const apiUrl = process.env.NEXT_PUBLIC_API_URL_ROOT || 'http://localhost:1337' const apiUrl = process.env.NEXT_PUBLIC_API_URL_ROOT || 'http://localhost:1337'
const siteName = process.env.NEXT_PUBLIC_SITE_NAME || 'PAWÒL-NU. Paroles et traductions.'
const orgName = process.env.NEXT_PUBLIC_ORG_NAME || 'OKI'
const twitterHandle = `@${process.env.NEXT_PUBLIC_TWITTER_USERNAME || 'OrganisationKA'}`
export default function HeadLayout({ export default function HeadLayout({
children, children,
@@ -20,38 +23,38 @@ export default function HeadLayout({
return ( return (
<div> <div>
<Head prefix='website: https://ogp.me/ns/website#'> <Head prefix='website: https://ogp.me/ns/website#'>
<title>{`${title ? `PAWÒL-NU | ${title}` : 'PAWÒL-NU. Paroles et traductions.'}`}</title> <title>{`${title ? `${siteName} | ${title}` : siteName}`}</title>
<link rel='canonical' href={`${slug ? `${siteUrl}/${slug}` : siteUrl}`} /> <link rel='canonical' href={`${slug ? `${siteUrl}/${slug}` : siteUrl}`} />
<link rel='manifest' href='/manifest.json' /> <link rel='manifest' href='/manifest.json' />
<link rel='icon' type='image/x-icon' sizes='32x32' href='/favicon.ico' /> <link rel='icon' type='image/x-icon' sizes='32x32' href='/favicon.ico' />
<link rel='apple-touch-icon' href='/favicon.ico' /> <link rel='apple-touch-icon' href='/favicon.ico' />
<meta name='monetization' content='$ilp.uphold.com/q7MFmYWNpwnr' /> <meta name='monetization' content='$ilp.uphold.com/q7MFmYWNpwnr' />
<meta name='application-name' content='PAWÒL-NU. Paroles et traductions.' /> <meta name='application-name' content={siteName} />
<meta name='twitter:card' content='summary_large_image' /> <meta name='twitter:card' content='summary_large_image' />
<meta name='twitter:url' content={`${slug ? `${siteUrl}/${slug}` : siteUrl}`} /> <meta name='twitter:url' content={`${slug ? `${siteUrl}/${slug}` : siteUrl}`} />
<meta name='twitter:title' content={`${title ? title : 'PAWÒL-NU. Paroles et traductions.'}`} /> <meta name='twitter:title' content={`${title ? title : siteName}`} />
<meta name='twitter:description' content={`${summary ? summary : 'PAWÒL-NU a pour but de promouvoir les langues et les productions afro-diasporiques.'}`} /> <meta name='twitter:description' content={`${summary ? summary : process.env.NEXT_PUBLIC_SITE_DESCRIPTION || 'PAWÒL-NU a pour but de promouvoir les langues et les productions afro-diasporiques.'}`} />
<meta name='twitter:image' content={`${imageUrl ? `${apiUrl}${imageUrl}` : `${siteUrl}/logo-192x192.png`}`} /> <meta name='twitter:image' content={`${imageUrl ? `${apiUrl}${imageUrl}` : `${siteUrl}/logo-192x192.png`}`} />
<meta name='twitter:creator' content='@OrganisationKA' /> <meta name='twitter:creator' content={twitterHandle} />
<meta name='twitter:site' content='@OrganisationKA' /> <meta name='twitter:site' content={twitterHandle} />
<meta name='theme-color' content='#303030' /> <meta name='theme-color' content='#303030' />
<meta name='apple-mobile-web-app-status-bar' content='#303030' /> <meta name='apple-mobile-web-app-status-bar' content='#303030' />
<meta charSet='utf-8' /> <meta charSet='utf-8' />
<meta name='description' content={`${summary ? summary : 'PAWÒL-NU a pour but de promouvoir les langues et les productions afro-diasporiques.'}`} /> <meta name='description' content={`${summary ? summary : process.env.NEXT_PUBLIC_SITE_DESCRIPTION || 'PAWÒL-NU a pour but de promouvoir les langues et les productions afro-diasporiques.'}`} />
<meta name='author' content='OKI' /> <meta name='author' content={orgName} />
<meta name='viewport' content='minimum-scale=1, initial-scale=1, width=device-width' /> <meta name='viewport' content='minimum-scale=1, initial-scale=1, width=device-width' />
<meta property='og:url' content={`${slug ? `${siteUrl}/${slug}` : siteUrl}`} /> <meta property='og:url' content={`${slug ? `${siteUrl}/${slug}` : siteUrl}`} />
<meta property='og:type' content='website' /> <meta property='og:type' content='website' />
<meta property='og:site_name' content={`${title ? title : 'PAWÒL-NU. Paroles et traductions.'}`} /> <meta property='og:site_name' content={`${title ? title : siteName}`} />
<meta property='og:title' content={`${title ? title : 'PAWÒL-NU. Paroles et traductions.'}`} /> <meta property='og:title' content={`${title ? title : siteName}`} />
<meta property='og:description' content={`${summary ? summary : 'PAWÒL-NU a pour but de promouvoir les langues et les productions afro-diasporiques.'}`} /> <meta property='og:description' content={`${summary ? summary : process.env.NEXT_PUBLIC_SITE_DESCRIPTION || 'PAWÒL-NU a pour but de promouvoir les langues et les productions afro-diasporiques.'}`} />
<meta property='og:locale' content='fr_FR' /> <meta property='og:locale' content='fr_FR' />
<meta property='og:image' content={`${imageUrl ? `${apiUrl}${imageUrl}` : `${siteUrl}/logo-512x512.png`}`} /> <meta property='og:image' content={`${imageUrl ? `${apiUrl}${imageUrl}` : `${siteUrl}/logo-512x512.png`}`} />
<meta property='og:image:secure_url' content={`${imageUrl ? `${apiUrl}${imageUrl}` : `${siteUrl}/logo-512x512.png`}`} /> <meta property='og:image:secure_url' content={`${imageUrl ? `${apiUrl}${imageUrl}` : `${siteUrl}/logo-512x512.png`}`} />
<meta property='og:image:type' content={imageMime ? imageMime : 'image/png'} /> <meta property='og:image:type' content={imageMime ? imageMime : 'image/png'} />
<meta property='og:image:width' content={imageWidth ? imageWidth : '512'} /> <meta property='og:image:width' content={imageWidth ? imageWidth : '512'} />
<meta property='og:image:height' content={imageHeight ? imageHeight : '512'} /> <meta property='og:image:height' content={imageHeight ? imageHeight : '512'} />
<meta property='og:image:alt' content={`${title && imageUrl ? title : 'PAWÒL-NU Logo'} | PAWÒL-NU. Paroles et traductions.`} /> <meta property='og:image:alt' content={`${title && imageUrl ? title : `${siteName} Logo`} | ${siteName}`} />
</Head> </Head>
<Navigasyon selectedTab={tab} /> <Navigasyon selectedTab={tab} />
{children} {children}
+1 -1
View File
@@ -70,7 +70,7 @@ export default function RezoDialog() {
onClose={handleClose} onClose={handleClose}
> >
<BootstrapDialogTitle id='rézo-dialog' onClose={handleClose}> <BootstrapDialogTitle id='rézo-dialog' onClose={handleClose}>
OKI sur le <strong>Fédiverse</strong> {process.env.NEXT_PUBLIC_ORG_NAME || 'OKI'} sur le <strong>Fédiverse</strong>
</BootstrapDialogTitle> </BootstrapDialogTitle>
<DialogContent> <DialogContent>
<Box> <Box>
+1 -1
View File
@@ -56,7 +56,7 @@ export default function Presantasyon() {
</ListItem> </ListItem>
</List> </List>
<Typography paragraph='true' variant='subtitle1' component='div'> <Typography paragraph='true' variant='subtitle1' component='div'>
Pour toute question, nhésitez pas à nous contacter par courriel <Link href='mailto:kontak@o-k-i.net'><strong>kontak@o-k-i.net</strong></Link>. Pour toute question, nhésitez pas à nous contacter par courriel <Link href={`mailto:${process.env.NEXT_PUBLIC_ORG_EMAIL || 'kontak@o-k-i.net'}`}><strong>{process.env.NEXT_PUBLIC_ORG_EMAIL || 'kontak@o-k-i.net'}</strong></Link>.
</Typography> </Typography>
<Typography paragraph='true' variant='subtitle1' component='div'> <Typography paragraph='true' variant='subtitle1' component='div'>
<strong>Merci par avance pour votre soutien 🥰</strong> <strong>Merci par avance pour votre soutien 🥰</strong>
+7 -4
View File
@@ -1,5 +1,8 @@
const {template} = require('lodash') const {template} = require('lodash')
const ORG_NAME = process.env.NEXT_PUBLIC_ORG_NAME || 'OKI'
const SITE_URL = process.env.SITE_URL || process.env.NEXT_PUBLIC_SITE_URL || 'https://pawol.nu'
const bodyTemplate = template(` const bodyTemplate = template(`
<!DOCTYPE html> <!DOCTYPE html>
<html lang="fr"> <html lang="fr">
@@ -65,18 +68,18 @@ const bodyTemplate = template(`
<body> <body>
<div> <div>
<img src="https://pawol.nu/logo-72x72.png" alt="Logo OKI"> <img src="${SITE_URL}/logo-72x72.png" alt="Logo ${ORG_NAME}">
</div> </div>
<div class="title"> <div class="title">
<h2 style="margin:0; mso-line-height-rule:exactly;">Merci !</h2><br> <h2 style="margin:0; mso-line-height-rule:exactly;">Merci !</h2><br>
<h3 style="margin:0; mso-line-height-rule:exactly;">Votre soutien à OKI est important et nous vous en sommes très reconnaissant ❤️</h3> <h3 style="margin:0; mso-line-height-rule:exactly;">Votre soutien à ${ORG_NAME} est important et nous vous en sommes très reconnaissant ❤️</h3>
</div> </div>
<div class="container"> <div class="container">
<section> <section>
<h4>Une aide indispensable</h4> <h4>Une aide indispensable</h4>
<p> <p>
En effet, ce sont les dons qui nous permettent de maintenir tous les services liés à OKI. En effet, ce sont les dons qui nous permettent de maintenir tous les services liés à ${ORG_NAME}.
</p> </p>
<p> <p>
Toute contribution, aussi modeste soit-elle, nous permet daugmenter nos capacités.<br /> Toute contribution, aussi modeste soit-elle, nous permet daugmenter nos capacités.<br />
@@ -94,7 +97,7 @@ const bodyTemplate = template(`
<p>Pour toute question, nhésitez pas à nous contacter en répondant à ce courriel.</p> <p>Pour toute question, nhésitez pas à nous contacter en répondant à ce courriel.</p>
<p>Merci infiniment pour votre soutien.</p> <p>Merci infiniment pour votre soutien.</p>
<span><i><span class="forceWhiteLink"><button><a href="https://pawol.nu" target="blank">PAWÒL-NU</a></button></span></i></span> <span><i><span class="forceWhiteLink"><button><a href="${SITE_URL}" target="blank">${ORG_NAME}</a></button></span></i></span>
</footer> </footer>
</html> </html>
`) `)
+1 -1
View File
@@ -111,7 +111,7 @@ export async function jwennAwtisPajinasyon(paj) {
const start = AWTIS_POU_CHAK_PAJ * (paj - 1) const start = AWTIS_POU_CHAK_PAJ * (paj - 1)
const query = qs.stringify({ const query = qs.stringify({
populate: ['paroles', 'photo'], populate: ['paroles', 'photo'],
sort: ['isOKIAwtis:desc', 'createdAt:desc'], sort: ['isExclusiveArtist:desc', 'createdAt:desc'],
pagination: { pagination: {
start, start,
limit: AWTIS_POU_CHAK_PAJ limit: AWTIS_POU_CHAK_PAJ
+17 -24
View File
@@ -5,6 +5,22 @@ const withPWA = require('next-pwa')({
skipWaiting: true skipWaiting: true
}) })
function buildRemotePatterns() {
const raw = process.env.NEXT_PUBLIC_DOMAINS_IMAGE || ''
const patterns = raw.split(' ').filter(Boolean).map(entry => {
const [hostname, port] = entry.split(':')
const isLocal = hostname === 'localhost' || hostname === '127.0.0.1'
const pattern = {protocol: isLocal ? 'http' : 'https', hostname, pathname: '/uploads/**'}
if (port) pattern.port = port
return pattern
})
if (!raw.includes('localhost'))
patterns.push({protocol: 'http', hostname: 'localhost', port: '1337', pathname: '/uploads/**'})
if (!raw.includes('127.0.0.1'))
patterns.push({protocol: 'http', hostname: '127.0.0.1', port: '1337', pathname: '/uploads/**'})
return patterns
}
module.exports = (withPWA({ module.exports = (withPWA({
turbopack: {}, turbopack: {},
webpack: config => { webpack: config => {
@@ -16,29 +32,6 @@ module.exports = (withPWA({
return config return config
}, },
images: { images: {
remotePatterns: [ remotePatterns: buildRemotePatterns()
{
protocol: 'https',
hostname: 'api.pawol.nu',
pathname: '/uploads/**',
},
{
protocol: 'https',
hostname: 'pawol.nu',
},
{
protocol: 'http',
hostname: '127.0.0.1',
port: '1337',
pathname: '/uploads/**',
},
{
protocol: 'http',
hostname: 'localhost',
port: '1337',
pathname: '/uploads/**',
},
]
} }
})) }))
-64
View File
@@ -1,64 +0,0 @@
{
"name": "PAWÒL-NU",
"short_name": "PAWÒL-NU",
"description": "PAWÒL-NU a pour but de promouvoir le Medukam (ou Wanni Wannan) et les productions afro-diasporiques.",
"scope": "/",
"start_url": "/",
"display": "standalone",
"background_color": "#303030",
"theme_color": "#303030",
"orientation": "portrait-primary",
"icons": [
{
"src": "/logo-72x72.png",
"type": "image/png",
"sizes": "72x72"
},
{
"src": "/logo-96x96.png",
"type": "image/png",
"sizes": "96x96"
},
{
"src": "/logo-128x128.png",
"type": "image/png",
"sizes": "128x128"
},
{
"src": "/logo-144x144.png",
"type": "image/png",
"sizes": "144x144"
},
{
"src": "/logo-152x152.png",
"type": "image/png",
"sizes": "152x152"
},
{
"src": "/logo-192x192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "/logo-256x256.png",
"type": "image/png",
"sizes": "256x256"
},
{
"src": "/logo-384x384.png",
"type": "image/png",
"sizes": "384x384"
},
{
"src": "/logo-512x512.png",
"type": "image/png",
"sizes": "512x512"
},
{
"src": "maskable_oki.png",
"type": "image/png",
"sizes": "192x192",
"purpose": "maskable"
}
]
}

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB