Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions client/config.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns:tizen="http://tizen.org/ns/widgets" xmlns="http://www.w3.org/ns/widgets" id="https://tizenbrew.vercel.app" version="1.1.2" viewmodes="maximized">
<widget xmlns:tizen="http://tizen.org/ns/widgets" xmlns="http://www.w3.org/ns/widgets" id="https://tizenbrew.vercel.app" version="1.1.3" viewmodes="maximized">
<access origin="*" subdomains="true"></access>
<tizen:application id="xvvl3S1bTI.TizenBrewStandalone" package="xvvl3S1bTI" required_version="3.0"/>
<author href="https://tizenbrew.vercel.app">Reis Can</author>
Expand All @@ -20,4 +20,4 @@
<tizen:description>TizenBrewService</tizen:description>
</tizen:service>
<tizen:setting screen-orientation="landscape" context-menu="enable" background-support="enable" encryption="disable" install-location="auto" hwkey-event="enable"/>
</widget>
</widget>
10 changes: 5 additions & 5 deletions client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
"services/tizenbrew-installer-service/dist/**"
],
"targets": [
"node20-linux-x64",
"node20-win-x64",
"node20-macos-arm64",
"node20-macos-x64",
"node20-linux-arm64"
"node22-linux-x64",
"node22-win-x64",
"node22-macos-arm64",
"node22-macos-x64",
"node22-linux-arm64"
],
"outputPath": "dist"
}
Expand Down
242 changes: 132 additions & 110 deletions client/services/tizenbrew-installer-service/index.js

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ const Events = {
Error: 3,
InstallationStatus: 4,
DeleteConfiguration: 5,
ConnectToTV: 6
ConnectToTV: 6,
InstallFile: 7
};

module.exports = {
Expand Down
4 changes: 4 additions & 0 deletions client/ui/src/components/ClientContext.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { useReducer } from 'preact/hooks';

const initialState = {
sharedData: {
tizenBrewRepo: localStorage.getItem('tizenBrewRepo') || 'reisxd/TizenBrew',
state: null,
directory: [],
error: {
Expand Down Expand Up @@ -32,6 +33,9 @@ function reducer(state, action) {
return { ...state, sharedData: { ...state.sharedData, qrCodeShow: action.payload } };
case 'SET_CONNECTED_TO_TV':
return { ...state, sharedData: { ...state.sharedData, connectedToTV: action.payload } };
case 'SET_TIZENBREW_REPO':
localStorage.setItem('tizenBrewRepo', action.payload);
return { ...state, sharedData: { ...state.sharedData, tizenBrewRepo: action.payload } };
default:
return state;
}
Expand Down
3 changes: 2 additions & 1 deletion client/ui/src/components/WebSocketClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ const Events = {
Error: 3,
InstallationStatus: 4,
DeleteConfiguration: 5,
ConnectToTV: 6
ConnectToTV: 6,
InstallFile: 7
};

class Client {
Expand Down
6 changes: 5 additions & 1 deletion client/ui/src/components/i18nResources.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@ import FrenchLanguage from '../lang/fr.json';
import SerbianLanguage from '../lang/sr.json';
import TurkishLanguage from '../lang/tr.json';
import VietnameseLanguage from '../lang/vi.json';
import DutchLanguage from '../lang/nl.json';
import DutchLanguage from '../lang/nl.json';
import GermanLanguage from '../lang/de.json';

const resources = {
en: {
translation: EnglishLanguage
},
de: {
translation: GermanLanguage
},
fr: {
translation: FrenchLanguage
},
Expand Down
43 changes: 43 additions & 0 deletions client/ui/src/lang/de.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"service": {
"alreadyRunning": "Der Dienst läuft bereits.",
"started": "Dienst gestartet."
},
"errors": {
"debuggingNotEnabled": "Fehler: Verbindung zum SDB-Daemon konnte nicht hergestellt werden. Hast du die Host-PC-IP wirklich auf 127.0.0.1 geändert? Falls ja, halte den Einschaltknopf gedrückt, bis das Samsung-Logo erscheint."
},
"installStatus": {
"fetching": "Paket wird abgerufen",
"resigning": "Paket wird neu signiert",
"parsing": "Paket wird verarbeitet",
"installing": "Paket wird installiert",
"installed": "Paket installiert",
"installFailed": "Installation fehlgeschlagen: {{line}}"
},
"resigning": {
"resigningRequired": "Neu-Signierung erforderlich",
"resigningRequiredDesc": "Seit Tizen 7 müssen alle Pakete mit einem Samsung-Zertifikat neu signiert werden.\nBitte scanne den QR-Code, um dich bei deinem Samsung-Konto anzumelden, und kopiere anschließend die JSON-Antwort, die du nach der Anmeldung erhältst.",
"resigningRequiredPCDesc": "Seit Tizen 7 müssen alle Pakete mit einem Samsung-Zertifikat neu signiert werden.\nBitte klicke auf die Schaltfläche unten, um dich bei deinem Samsung-Konto anzumelden.",
"resigningRequiredOpenAuthButton": "Bei Samsung-Konto anmelden",
"resigningRequiredAccessInfo": "Nachdem du die JSON-Antwort kopiert hast, gehe zu http://{{ip}}:4794, füge sie in das Eingabefeld ein und drücke die Schaltfläche \"Submit\".",
"resigningDeviceSameNetwork": "Stelle sicher, dass sich dein Gerät im selben Netzwerk wie dein Fernseher befindet."
},
"installer": {
"installTB": "TizenBrew installieren",
"installTBI": "TizenBrew Installer installieren",
"connectToTV": "Mit Fernseher verbinden",
"updateTB": "TizenBrew aktualisieren",
"installFromUSB": "Von USB installieren",
"installFromGH": "Von GitHub installieren",
"selectToInstall": "Datei zur Installation auswählen",
"installingAgain": "TizenBrew Installer ist als USB-Demopaket installiert. Es wird jetzt als normales Paket neu installiert.",
"alreadyInstalled": "TizenBrew Installer ist als USB-Demopaket installiert. Du kannst es jetzt deinstallieren."
},
"installerDesktop": {
"sdbConnectionRefused": "Verbindung zum SDB-Daemon konnte nicht hergestellt werden. Stelle sicher, dass der Fernseher eingeschaltet ist und die IP korrekt ist.",
"sdbConnectionReset": "Verbindung zum SDB-Daemon konnte nicht hergestellt werden. Entweder wurde die Host-PC-IP nicht auf die IP dieses Geräts gesetzt, oder der Fernseher wurde nicht richtig neu gestartet. Halte den Einschaltknopf gedrückt, bis das Samsung-Logo erscheint, um den Fernseher neu zu starten."
},
"__contributors": [
"KrX3D"
]
}
1 change: 1 addition & 0 deletions client/ui/src/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
"updateTB": "Update TizenBrew",
"installFromUSB": "Install from USB",
"installFromGH": "Install from GitHub",
"selectToInstall": "Select file to install",
"installingAgain": "TizenBrew Installer is installed as an USB Demo Package. It will now be reinstalled as a normal package.",
"alreadyInstalled": "TizenBrew Installer as an USB Demo Package is installed. You can now uninstall it."
},
Expand Down
1 change: 1 addition & 0 deletions client/ui/src/lang/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"updateTB": "Mettre à jour TizenBrew",
"installFromUSB": "Installer à partir d'un périphérique USB",
"installFromGH": "Installer depuis GitHub",
"selectToInstall": "Sélectionner un fichier à installer",
"installingAgain": "TizenBrew Installer est installé en tant que Paquet Démo USB. Il va maintenant être réinstallé en tant que paquet normal.",
"alreadyInstalled": "Le Paquet Démo USB de TizenBrew Installer est installé. Vous pouvez maintenant le supprimer."
},
Expand Down
1 change: 1 addition & 0 deletions client/ui/src/lang/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"updateTB": "TizenBrew updaten",
"installFromUSB": "Installeren van USB",
"installFromGH": "Installeren van GitHub",
"selectToInstall": "Selecteer bestand om te installeren",
"installingAgain": "TizenBrew Installer is geinstalleerd als een USB Demo Package. Het zal nu worden geinstalleerd als een normaal pakket.",
"alreadyInstalled": "TizenBrew Installer als een USB Demo Package is geinstalleerd. U kunt het nu verwijderen."
},
Expand Down
1 change: 1 addition & 0 deletions client/ui/src/lang/sr.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"updateTB": "Ажурирање TizenBrew",
"installFromUSB": "Инсталација са USB флешке",
"installFromGH": "Инсталација са GitHub-а",
"selectToInstall": "Изабери фајл за инсталацију",
"installingAgain": "TizenBrew Installer је инсталиран као USB Demo пакет. Сада ће бити поново инсталиран као обичан пакет.",
"alreadyInstalled": "TizenBrew Installer као USB Demo пакет је инсталиран. Сада га можете деинсталирати."
},
Expand Down
1 change: 1 addition & 0 deletions client/ui/src/lang/tr.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
"updateTB": "TizenBrew'ı Güncelle",
"installFromUSB": "USB'den Kur",
"installFromGH": "GitHub'dan Kur",
"selectToInstall": "Kurmak için dosyas seç",
"installingAgain": "TizenBrew Installer, USB Demo paketi olarak yüklüdür. Şimdi normal paket olarak yeniden yüklenecektir.",
"alreadyInstalled": "TizenBrew Installer, USB Demo paketi olarak yüklüdür. Şimdi USB Demo paketini kaldırabilirsiniz."
},
Expand Down
1 change: 1 addition & 0 deletions client/ui/src/lang/vi.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"updateTB": "Cập nhật TizenBrew",
"installFromUSB": "Cài đặt app từ USB",
"installFromGH": "Cài đặt app từ GitHub",
"selectToInstall": "Chọn file để cài đặt",
"installingAgain": "TizenBrew Installer đã được cài đặt dưới dạng USB Demo Package. Bây giờ app sẽ tự cài lại như 1 app bình thường.",
"alreadyInstalled": "TizenBrew Installer dưới dạng USB Demo Package đang được cài đặt. Bây giờ bạn có thể gỡ cài đặt gói Demo này."
},
Expand Down
34 changes: 33 additions & 1 deletion client/ui/src/pages/Desktop.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,28 @@ export default function Desktop() {
}
}, [context.state.client, context.state.client?.socket?.readyState]);

function onInputChange(event) {
const file = event.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = (e) => {
const dataUrl = e.target.result;

const base64Data = dataUrl.split(',')[1];

context.state.client.send({
type: Events.InstallFile,
payload: base64Data
});
}

reader.readAsDataURL(file);
}
}

return (
<div className="relative isolate lg:px-8 xs:overflow-scroll xs:max-h-[90vh] lg:!overflow-visible lg:!max-h-[100%]">
<input onChange={onInputChange} type="file" id="realFileInput" style="display: none;" />
{context.state.sharedData.qrCodeShow && (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40">
<div className="p-8 rounded-2xl shadow-2xl max-w-full">
Expand All @@ -48,7 +68,7 @@ export default function Desktop() {
context.state.client.send({
type: Events.InstallPackage,
payload: {
url: 'reisxd/TizenBrew'
url: context.state.sharedData.tizenBrewRepo
}
})
}}>
Expand Down Expand Up @@ -84,6 +104,17 @@ export default function Desktop() {
</span>
</h3>
</Item>
<Item onClick={() => {
const realFileInput = document.getElementById('realFileInput');
realFileInput.click();
}}>
<h3 className='text-indigo-400 text-base/7 font-semibold'>
<span className='flex items-center gap-2'>
<ArrowDownIcon className='h-8 w-8 text-indigo-400' />
{t('installer.selectToInstall')}
</span>
</h3>
</Item>
</>
) : (
<Item>
Expand All @@ -100,6 +131,7 @@ export default function Desktop() {
className="w-full p-2 rounded-lg bg-gray-800 text-gray-200"
onChange={(e) => setIp(e.target.value)}
onKeyDown={(e) => {
if (e.keyCode === 37 || e.keyCode === 39) { e.stopPropagation(); return; }
if (e.keyCode === 13 || e.keyCode === 65376) {
ipInputRef.current.blur();
}
Expand Down
10 changes: 7 additions & 3 deletions client/ui/src/pages/Home.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@ export default function Home() {

// Check if TizenBrew is already installed.
let isTizenBrewInstalled = false;
let installedVersion = null;
try {
tizen.application.getAppInfo('xvvl3S1bvH.TizenBrewStandalone');
const appInfo = tizen.application.getAppInfo('xvvl3S1bvH.TizenBrewStandalone');
isTizenBrewInstalled = true;
installedVersion = appInfo.version;
} catch (e) { }


useEffect(() => {
if (
Expand Down Expand Up @@ -73,7 +75,7 @@ export default function Home() {
context.state.client.send({
type: Events.InstallPackage,
payload: {
url: 'reisxd/TizenBrew'
url: context.state.sharedData.tizenBrewRepo
}
})
}}>
Expand All @@ -90,6 +92,8 @@ export default function Home() {
</span>
)}
</h3>
<p className="mt-2 text-sm text-slate-300 break-all">Repo: {context.state.sharedData.tizenBrewRepo}</p>
{installedVersion && <p className="text-sm text-slate-300">Installed: {installedVersion}</p>}
</Item>
<Item onClick={() => {
loc.route('/ui/dist/index.html/install-from-usb');
Expand Down
20 changes: 13 additions & 7 deletions client/ui/src/pages/InstallFromGitHub.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import { Events } from '../components/WebSocketClient.js';
import Item from "../components/Item.jsx";

export default function InstallFromGitHub() {
const [name, setName] = useState('');
const { state, dispatch } = useContext(GlobalStateContext);
const [name, setName] = useState(state.sharedData.tizenBrewRepo || '');
const loc = useLocation();
const { state } = useContext(GlobalStateContext);
const ref = useRef(null);

useEffect(() => {
Expand All @@ -20,30 +20,36 @@ export default function InstallFromGitHub() {
<div className="mx-auto flex flex-wrap justify-center gap-4 top-4 relative">
<Item>
<input
type="text"
type="email"
ref={ref}
value={name}
className="w-full p-2 rounded-lg bg-gray-800 text-gray-200"
onChange={(e) => setName(e.target.value)}
onKeyDown={(e) => {
if (e.keyCode === 37 || e.keyCode === 39) { e.stopPropagation(); return; }
if (e.keyCode === 13 || e.keyCode === 65376) {
ref.current.blur();
}
}}
onBlur={(e) => {
if (name) {
onBlur={() => {
const repo = name.trim();
if (repo) {
dispatch({
type: 'SET_TIZENBREW_REPO',
payload: repo
});
state.client.send({
type: Events.InstallPackage,
payload: {
url: name
url: repo
}
});
}

loc.route('/ui/dist/index.html');
setFocus('sn:focusable-item-1');
}}
placeholder="reisxd/TizenBrew"
placeholder="owner/repo"
/>
</Item>
</div>
Expand Down