PWA Example with Next.js, React, TypeScript, Tailwind CSS, Radix UI, and OneSignal

 

 

This project is a Progressive Web App (PWA) built with Next.js, React, and TypeScript. It uses Tailwind CSS for styling, Radix UI for accessible components, OneSignal for push notifications, and demonstrates access to the file system and webcam.

Installation

 

To get started with this project, clone the repository and install the dependencies:

git clone https://github.com/UbyXsofT/my-pwa-app.git
cd my-pwa-app
npm install

Development

 

To start the development server, run:

npm run dev

This will start the application in development mode at http://localhost:3000.

Build

 

o build the application for production, run:

npm run build

Features

 

  • Progressive Web App (PWA): Offline support and installable on devices.
  • Next.js: Server-side rendering and static site generation.
  • React & TypeScript: Modern – JavaScript framework with static typing.
  • Tailwind CSS: Utility-first CSS framework for rapid UI development.
  • Radix UI: Accessible, unstyled UI component library.
  • OneSignal: Push notifications.
  • File System Access: Demonstrates access to the file system.
  • Webcam Access: Demonstrates access to the webcam.

Usage

 

OneSignal Push Notifications

 

To set up OneSignal for push notifications, follow these steps:

1 – Download and unzip the OneSignal SDK: OneSignalSDK-v16-ServiceWorker.zip

2 – Add the unzipped files to the public directory of your project.

3 – Modify the _document.tsx to include OneSignalSDK:

//_document.tsx
import { Html, Head, Main, NextScript } from "next/document";

export default function Document() {
	return (
		<Html lang='en'>
			<Head>
				<link
					rel='manifest'
					href='/manifest.json'
				/>
				<link
					rel='apple-touch-icon'
					href='/icon.png'
				/>
				<meta
					name='theme-color'
					content='#fff'
				/>
				<script
					src='https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.page.js'
					async
				></script>
			</Head>
			<body>
				<Main />
				<NextScript />
			</body>
		</Html>
	);
}

4 – Initialize OneSignal in src/functions/onesignal.js:

//src/functions/onesignal.js
import OneSignal from "react-onesignal";

export default async function runOneSignal() {
	console.log("Inizializzazione OneSignal");
	try {
		await OneSignal.init({
			appId: "YOUR-ONESIGNAL-APP-ID",
			allowLocalhostAsSecureOrigin: true,
			serviceWorkerParam: {
				scope: "/",
				path: "/OneSignalSDKWorker.js",
			},
		});
		console.log("OneSignal inizializzato");
		OneSignal.Slidedown.promptPush();
		console.log("Prompt mostrato");
	} catch (error) {
		console.log("ONESIGNAL ERROR: ", error);
	}
}

5 – Call runOneSignal in src/pages/_app.tsx:

import "../src/styles/globals.css";
import { AppProps } from "next/app";
import { useEffect } from "react";
import runOneSignal from "../src/functions/onesignal";

function MyApp({ Component, pageProps }: AppProps) {
  useEffect(() => {
    runOneSignal();
  }, []);

  return <Component {...pageProps} />;
}

export default MyApp;

File System Access

 

To use the File System Access API, you can create a component that allows users to pick a file and read its content. Here’s an example of a file picker component:

import { ReactNode, useState } from "react";

const FileSystemComponent = () => {
	const [fileContent, setFileContent] = useState<string | ArrayBuffer | null>("");
	const handleFilePick = async () => {
		const [fileHandle] = await (window as any).showOpenFilePicker();
		const file = await fileHandle.getFile();
		const text = await file.text();
		setFileContent(text);
	};

	return (
		<div>
			<button
				style={{ margin: "20px" }}
				onClick={handleFilePick}
			>
				Pick a file
			</button>
			<pre>{fileContent as ReactNode}</pre>
		</div>
	);
};

export default FileSystemComponent;

Webcam Access

 

To access the webcam, you can create a component that uses the MediaDevices API. Here’s an example of a webcam component:

import React, { useRef, useEffect } from "react";

const CameraComponent: React.FC = () => {
	const videoRef = useRef<HTMLVideoElement>(null);

	useEffect(() => {
		const startCamera = async () => {
			if (videoRef.current) {
				try {
					const stream: MediaStream = await navigator.mediaDevices.getUserMedia({ video: true });
					if (videoRef.current) {
						videoRef.current.srcObject = stream;
					}
				} catch (err) {
					console.error("Error accessing camera: ", err);
				}
			}
		};

		startCamera();
	}, []);

	return (
		<video
			ref={videoRef}
			autoPlay
			style={{ width: "100%", height: "200px" }}
		/>
	);
};

export default CameraComponent;

Contributing

 

Contributions are always welcome!

See contributing.md for ways to get started.

Please adhere to this project’s code of conduct, please feel free to submit a pull request.

License

 

This project is licensed under the MIT License. See the LICENSE file for details.

Here is the source code project on GitHub

 

Kontakt Library Fix X1 edition

cross platform for windows, macOs, and Linux!

Kontakt Library Fix is an Free Utility created by me Ubaldo Formichetti which helps importing non-native libraries, in kontakt. That creates the configuration file of the non-native Kontakt library, with a random id or insert id, to avoid duplication problems when registering in the registry, allows the creation of the appropriate library wallpaper, adapting .jpg and .png files. in this new version, there is included a good image editor that gives us the possibility to import an image as a background and then change it by entering text and other graphic elements, you don’t need any other graphic software, to create your banner. – Resolves the problem of the “no library found kontakt” error during the import. In an easy and creative way. Works with full versions of Kontakt (No Kontakt player) from ver. 5.5.8 +

Kontakt Library Fix è un’utilità gratuita creata da me, Ubaldo Formichetti, che aiuta nell’importazione di librerie non native in Kontakt. Questo programma crea il file di configurazione della libreria non nativa di Kontakt, assegnando un ID casuale o personalizzato per evitare problemi di duplicazione durante la registrazione nel registro. Consente anche di creare lo sfondo appropriato per la libreria, adattando file .jpg e .png. In questa nuova versione è incluso un ottimo editor di immagini che ci permette di importare un’immagine come sfondo e successivamente modificarla aggiungendo testo e altri elementi grafici; non è necessario alcun altro software grafico per creare il proprio banner. Risolve in modo semplice e creativo il problema dell’errore “nessuna libreria trovata in Kontakt” durante l’importazione. Funziona con le versioni complete di Kontakt (non con Kontakt Player) dalla versione 5.5.8 in poi.

To unlock the KLF app (red lock icon), registration in our forum of vivo-vivendo-musica.com is required, if you are an already registered user click on the lock icon and enter your username and email , with which you registered on the VVM forum, and the KLF app will be unlocked forever (beware you don’t have an infinite number of devices on which to install this app, so please don’t give your credentials to other people). Register in: vivo-vivendo-musica.com

Per sbloccare l’app KLF (icona lucchetto rosso), è necessaria la registrazione nel nostro forum su vivo-vivendo-musica.com. Se sei già registrato, clicca sull’icona del lucchetto e inserisci il tuo nome utente e indirizzo email con cui ti sei registrato sul forum di VVM. L’app KLF verrà sbloccata per sempre. Tieni presente che non hai un numero infinito di dispositivi su cui installare questa app, quindi per favore non condividere le tue credenziali con altre persone. Registrati su: vivo-vivendo-musica.com.

Click here to download Kontakt Library Fix x1 edition

If you like it Kontakt Library Fix X1 Edition, consider offering a coffee, it will be highly appreciated, THANK YOU!

Konnakol: sillabe comuni

La scelta delle sillabe può variare leggermente a seconda dello stile regionale e delle preferenze personali dell’artista, ma ci sono alcune sillabe di base che sono comunemente utilizzate nel Konnakol. Ecco una lista di alcune delle sillabe più comuni:

Colpi di Mano (Sillabe di base):

  • Ta: Colpo di mano.
  • Tha: Colpo di mano più accentuato.
  • Dhi: Colpo di dita.
  • Dha: Colpo di dita più accentuato.

Colpi su Tamburo Piccolo/Medio:

  • Ka: Colpo su tamburo piccolo o medio.
  • Kha: Colpo su tamburo piccolo o medio più accentuato.

Colpi su Tamburo Basso:

  • Ge: Colpo su tamburo basso.
  • Ghe: Colpo su tamburo basso più accentuato.

Altri Suoni:

  • Di: Suono di dita o click.
  • Ni: Colpo su tamburo piccolo o medio.
  • Ju: Colpo basso.
  • No: Suono di rullante o colpo continuo.
  • Da: Colpo di mano o suono simile a un clapping.
  • Dum: Colpo su tamburo basso o suono grave.

Queste sono solo alcune delle sillabe comuni, e ci possono essere variazioni regionali o personali. La chiave è praticare regolarmente con queste sillabe, sperimentare diverse combinazioni e applicarle a diversi taalam (cicli ritmici) per sviluppare la tua abilità nel Konnakol.

Konnakol: introduzione di base

Introduzione di base al Konnakol, alcuni esempi ritmici per iniziare. Tieni presente che l’apprendimento del Konnakol richiede pratica costante e guidata, preferibilmente sotto la guida di un insegnante qualificato. Cominciamo con alcune sillabe di base utilizzate nel Konnakol:

  1. Ta – rappresenta un colpo di mano (come un colpo sulla pelle di un tamburo).
  2. Dhi – rappresenta un colpo di dita (come il tocco su un bordo di un tamburo).
  3. Tom – rappresenta un colpo basso (come il battito su un tamburo basso).

Ora, considera un ciclo ritmico di base chiamato Adi Talam, che è uno dei taalam (cicli ritmici) più comuni nella musica carnatica. Adi Talam ha otto tempi e la sua struttura ritmica può essere rappresentata utilizzando le sillabe del Konnakol. Ecco un esempio:

12345678
Ta KaDhiNaTaKaDhiNa
Adi Talam

Puoi cominciare a praticare questa sequenza pronunciando le sillabe ritmiche ad alta voce e cercando di mantenere la precisione nel ritmo. Concentrati sulla suddivisione dei tempi e sulla chiarezza delle sillabe.

Oltre a questo esempio di Adi Talam, ci sono molti altri taalam e pattern ritmici più complessi nel Konnakol. Sono sette le strutture di base Sapta Thala e poi ci sono i loro derivati. (Per semplificarlo, ‘thala’ equivale alla firma del tempo occidentale o al ciclo temporale).

Questi modelli sono una struttura elaborata di battiti, onde e conteggi delle dita che segnano il ciclo temporale in modo rigoroso e metronomico. I cicli temporali sono divisi in sezioni, ognuna rappresentata dai rispettivi battiti, onde e gesti. I movimenti non devono essere forti ma devono essere chiari per l’osservatore in modo che possano vedere in quale battuta si trovano in un dato momento. Ogni singolo battito è chiamato akshara.

Possiamo integrare questi movimenti nella pratica delle sillabe nel ciclo ritmico della Adi Talam vista in precedenza:

12345678
Ta KaDhiNaTaKaDhiNa
Adi Talam – LAGHU

Abbiamo già un aspetto importante della costruzione carnatica del thalum. Il suo nome tecnico è chiamato ‘LAGHU’ ed è la pietra angolare delle sette thala di base ‘SAPTA’. Per riassumere, un ‘LAGHU’ è un’unità di misure equidistanti segnate da un battito seguito da un numero prefissato di conteggi delle dita. Questo numero di conteggi delle dita è dettato dal nome di un particolare thala che indica quanti conteggi ci sono in ogni Laghu all’interno di quel thala.

Ci sono due elementi semplici da aggiungere per ottenere tutti i componenti della costruzione del thalum, un’unità composta da un singolo battito e un’unità composta da un battito e un’onda. I termini tecnici per questi sono ‘DRUTHAM’ (battito + onda) e ‘ANU-DRUTHAM (battito). Tutte le thala di base Sapta derivano da combinazioni di DRUTHAM, ANU-DRUTHAM e LAGHU. (Queste unità sono chiamate angams).

Ci sono sette combinazioni comunemente usate di questi elementi attualmente in uso nel Sud dell’India. Ogni forma di struttura ha un nome che compone parte del nome finale del thala. (Ad esempio, questa parte del nome identifica la costruzione complessiva, mentre un’altra parte del nome identifica altri elementi del thala, come la lunghezza delle sezioni di conteggio delle dita, ecc.)

Konnakol: solfeggio musicale indiano

Il Konnakol è una forma di percussione vocale dell’India del Sud, che si basa sull’uso della voce per creare ritmi complessi e intricati. È una parte integrante della tradizione musicale carnatica, una delle due principali tradizioni musicali dell’India, l’altra essendo la tradizione musicale induista del nord, chiamata musica classica indiana o hindustani.

Ecco alcuni punti chiave sul Konnakol:

  1. Percussione Vocale: Il termine “Konnakol” deriva dalle parole tamil “Konj” (che significa “parlare”) e “Kol” (che significa “giochi”). In pratica, Konnakol coinvolge la pronuncia di sillabe ritmiche in modi complessi per creare pattern ritmici.
  2. Sillabe Ritmiche: Nel Konnakol, vengono utilizzate specifiche sillabe ritmiche per rappresentare diversi suoni della batteria e percussioni. Queste sillabe sono pronunciate con precisione per esprimere ritmi complessi e sfumature ritmiche.
  3. Allenamento Orale: Il Konnakol è insegnato principalmente oralmente, con maestri che insegnano agli studenti i pattern ritmici utilizzando la voce. Gli studenti imparano a riprodurre complessi cicli ritmici e a sviluppare un senso acuto del tempo.
  4. Integrazione con la Musica Carnatica: Il Konnakol è spesso insegnato insieme alla teoria musicale e agli altri aspetti della musica carnatica. Viene utilizzato come uno strumento per comprendere e comunicare i concetti ritmici all’interno di una composizione musicale.
  5. Esibizioni Soliste e Accompagnamento: Molti percussionisti vocali specializzati in Konnakol diventano parte integrante di ensemble musicali e spesso svolgono il ruolo di accompagnamento ritmico, integrandosi con altri strumenti musicali.

Il Konnakol è una forma d’arte molto apprezzata e richiede una grande abilità tecnica e una profonda comprensione della struttura ritmica della musica. È un elemento affascinante e distintivo della tradizione musicale dell’India del Sud.

Lista di alcuni dei codici di stato HTTP comuni e il loro significato:

Di seguito è riportata una lista di alcuni dei codici di stato HTTP comuni e il loro significato:

  1. 1xx – Informational
    • 100: Continue
    • 101: Switching Protocols
  2. 2xx – Success
    • 200: OK
    • 201: Created
    • 204: No Content (nessun corpo dati nella risposta)
  3. 3xx – Redirection
    • 301: Moved Permanently
    • 302: Found / Temporary Redirect
    • 304: Not Modified
    • 307: Temporary Redirect
    • 308: Permanent Redirect
  4. 4xx – Client Errors
    • 400: Bad Request
    • 401: Unauthorized
    • 403: Forbidden
    • 404: Not Found
    • 409: Conflict
    • 429: Too Many Requests
  5. 5xx – Server Errors
    • 500: Internal Server Error
    • 501: Not Implemented
    • 502: Bad Gateway
    • 503: Service Unavailable
    • 504: Gateway Timeout

L’operatore modulo %

L’operatore % è chiamato operatore modulo. È un operatore matematico che restituisce il resto di una divisione.

Per esempio, se dividiamo 10 per 3, il risultato è 3 con un resto di 1. Quindi, 10 % 3 restituirà 1.

Quando usiamo l’operatore modulo con 2 (numero % 2), stiamo essenzialmente controllando se un numero è pari o dispari. Questo perché quando un numero è diviso per 2, il resto sarà 0 se il numero è pari (perché i numeri pari possono essere divisi in modo uniforme per 2) e 1 se il numero è dispari.

Quindi, index % 2 === 0 è un modo per controllare se l’indice è un numero pari. Se l’indice è pari, l’espressione restituirà true, altrimenti restituirà false.

React dichiarazione di un componente

Le dichiarazioni di un componente in React possono essere fatte in diverse forme, ma le principali sono le seguenti:

  1. Dichiarazione di funzione (Function Component):React
function MyComponent(props) {
  // Il tuo codice JSX e logica qui...
  return <div>Contenuto del componente</div>;
}

// Oppure usando la sintassi delle frecce (Arrow Function Component):
const MyComponent = (props) => {
  // Il tuo codice JSX e logica qui...
  return <div>Contenuto del componente</div>;
};

// Quando vuoi esportare il componente:
export function MyComponent(props) {
  // ...
}

// Oppure con la sintassi delle frecce:
export const MyComponent = (props) => {
  // ...
};
  1. Class Component:
import React, { Component } from 'react';

class MyComponent extends Component {
  render() {
    // Il tuo codice JSX e logica qui...
    return <div>Contenuto del componente</div>;
  }
}

export default MyComponent;
  1. Componente con la sintassi di classe e hooks:
import React, { useState, useEffect } from 'react';

const MyComponent = (props) => {
  // Utilizzo degli hooks per lo stato e gli effetti
  const [count, setCount] = useState(0);

  useEffect(() => {
    // Effetto eseguito dopo il render
    document.title = `Hai cliccato ${count} volte`;
  }, [count]);

  // Il tuo codice JSX e logica qui...
  return (
    <div>
      <p>Hai cliccato {count} volte</p>
      <button onClick={() => setCount(count + 1)}>Cliccami</button>
    </div>
  );
};

export default MyComponent;

In tutte queste forme, il componente renderizza l’output usando il codice JSX. Puoi utilizzare il tipo di dichiarazione che preferisci, ma i componenti con la sintassi delle funzioni sono più comuni grazie alla loro sintassi concisa e alla facilità di lettura. Con l’introduzione degli hooks, le classi stanno diventando sempre meno utilizzate per definire i componenti.

React-Redux in pillole! (1)

React Redux
  1. Store: Il punto centrale di Redux è lo store, che rappresenta lo stato globale dell’applicazione. Contiene tutti i dati dell’applicazione e offre metodi per accedere, aggiornare e gestire tali dati.
  2. Actions: Le azioni sono oggetti che descrivono un cambiamento nello stato dell’applicazione. Sono l’unico modo per modificare lo stato nello store. Un’azione ha un tipo che indica il tipo di cambiamento e può includere anche dati aggiuntivi necessari per effettuare il cambiamento.
  3. Reducers: I reducer sono delle funzioni pure che specificano come lo stato dell’applicazione viene modificato in risposta a un’azione. Ogni reducer gestisce un aspetto specifico dello stato e restituisce un nuovo stato basato sull’azione ricevuta. I reducer combinati vengono utilizzati per creare il riduttore radice che gestisce l’intero stato dell’applicazione.
  4. Dispatch: Dispatch è un metodo dello store che viene utilizzato per inviare un’azione al riduttore. Quando viene chiamato, lo store inoltra l’azione a tutti i riduttori registrati. I riduttori determinano se e come lo stato deve essere modificato in base all’azione.
  5. Subscribe: È possibile registrare funzioni di callback per essere avvisati ogni volta che lo stato dello store viene modificato. Questo può essere utile per aggiornare l’interfaccia utente in risposta a un cambiamento di stato.
  6. Connect: Il componente React può essere connesso allo store utilizzando il metodo connect di react-redux. Ciò consente al componente di accedere allo stato e alle azioni definite nello store e di essere automaticamente aggiornato quando lo stato cambia.

In sintesi, Redux offre un flusso unidirezionale dei dati, dove le azioni vengono inviate agli store, i riduttori elaborano le azioni per modificare lo stato e i componenti vengono aggiornati automaticamente quando lo stato cambia.