Firefish v1.0.5-dev20

This commit is contained in:
naskya 2023-10-29 20:09:26 +09:00
parent 28ecb4aa11
commit c98debc569
Signed by: naskya
GPG key ID: 164DFF24E2D40139
198 changed files with 1092 additions and 18003 deletions

View file

@ -171,6 +171,9 @@ reservedUsernames: [
# Proxy remote files (default: false)
#proxyRemoteFiles: true
# Use authorized fetch for outgoing requests
signToActivityPubGet: true
#allowedPrivateNetworks: [
# '127.0.0.1/32'
#]

View file

@ -1550,7 +1550,7 @@ troubleshooting: Resolució de problemes
learnMore: Més informació
misskeyUpdated: Firefish s'ha actualitzat!
translate: Tradueix
translatedFrom: Traduït desde {x}
translatedFrom: Traduït del {x}
aiChanMode: Ai-chan a la interfície d'usuari clàssica
keepCw: Mantenir els avisos de contingut
pubSub: Comptes Pub/Sub

View file

@ -1,4 +1,4 @@
_lang_: Inglés
_lang_: Galego
introFirefish: Benvida! Firefish é unha plataforma de medios sociais de código aberto,
descentralizada e gratuíta para sempre!🚀
monthAndDay: '{day}/{month}'

View file

@ -2181,3 +2181,14 @@ openServerInfo: Tampilkan informasi server dengan mengeklik ticker server di seb
kiriman
vibrate: Putar getaran
clickToShowPatterns: Klik untuk menampilkan pola modul
iconSet: Set ikon
_iconSets:
fill: Penuh
regular: Reguler
bold: Tebal
duotone: Duotone
light: Tipis
reactions: Reaksi
replies: Balasan
quotes: Kutipan
renotes: Postingan ulang

View file

@ -2169,3 +2169,14 @@ openServerInfo: Mostra informazioni sul server cliccando sul riquadro del server
un post
vibrate: Abilita la vibrazione
clickToShowPatterns: Clicca per vedere i pattern del modulo
iconSet: Set di icone
_iconSets:
fill: Con riempimento
regular: Regolare
bold: Grassetto
duotone: Con due toni
light: Sottile
reactions: Reazioni
replies: Risposte
quotes: Citazioni
renotes: Boost

View file

@ -1444,7 +1444,12 @@ _tutorial:
step4_1: 投稿しとーみ
step5_1: タイムライン! 文字と写真の宝石箱や~
step5_2: うちのサーバーでは{timelines}種類のタイムラインをご用意しとります。
step4_2: 最初は{introduction}に投稿したり、シンプルに「ここは賑やかどすなぁ。うちはそこまで喋れまへんが、どうぞよろしゅうに」などと投稿しはる方もいてます。
step4_2: 最初は{introduction}に投稿したり、シンプルに「ここは賑やかどすなぁ。ウチはそんなに喋れまへんが、どうぞよろしゅうに」などと投稿しはる方もいてます。
step5_7: グローバル{icon}タイムラインでは、接続しとるそこいらのサーバーからアレがガーッ流れてきてえらいこっちゃで。
step5_6: おすすめ{icon}タイムラインでは、うちの管理人がばりおすすめしとるサーバーの投稿を表示させとうよ。
step5_5: ソーシャル{icon}タイムラインでは、ホームタイムラインとローカルタイムラインの投稿が両方見られてホンマお得やわぁ。
step5_3: ホーム{icon}タイムラインでは、あんたはんがフォローしてはる兄ちゃんらの投稿が見られまんねん。
step5_4: ローカル{icon}タイムラインでは、このサーバーにおる人らの投稿を見られますわ。
_postForm:
_placeholders:
b: なんかおましたか?

View file

@ -1,6 +1,6 @@
_lang_: "Polski"
headlineFirefish: "Otwartoźródłowa, zdecentralizowana sieć społecznościowa, która zawsze
będzie darmowa! 🚀"
headlineFirefish: "Otwartoźródłowa, zdecentralizowana sieć społecznościowa, która
zawsze będzie darmowa! 🚀"
introFirefish: "Hej! Firefish to otwartoźródłowa oraz zdecentralizowana sieć społecznościowa,
która zawsze będzie darmowa! 🚀"
monthAndDay: "{month}-{day}"
@ -94,7 +94,7 @@ privacy: "Prywatność"
makeFollowManuallyApprove: "Prośby o możliwość obserwacji wymagają zatwierdzenia"
defaultNoteVisibility: "Domyślna widoczność"
follow: "Obserwuj"
followRequest: "Poproś o możliwość obserwacji"
followRequest: "Poproś o możliwość obserwowania"
followRequests: "Prośby o możliwość obserwacji"
unfollow: "Przestań obserwować"
followRequestPending: "Oczekująca prośba o możliwość obserwacji"
@ -147,9 +147,9 @@ cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ł
bezpośrednio ze zdalnego serwera. Wyłączenie tej opcji zmniejszy użycie powierzchni
dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane."
flagAsBot: "To konto jest botem"
flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw
tę opcję. Jeżeli włączona, będzie działać jako flaga informująca innych programistów,
aby zapobiegać nieskończonej interakcji z różnymi botami i dostosowywać wewnętrzne
flagAsBotDescription: "Ustaw tę opcję ten jeśli kanał kontrolowany jest przez jakiś
program. Po włączeniu, będzie działać jako flaga informująca innych programistów,
aby zapobiegać nieskończonej interakcji pomiędzy innymi botami i dostosowywać wewnętrzne
systemy Firefish, traktując konto jako bota."
flagAsCat: "Czy jesteś kotem? 😺"
flagAsCatDescription: "Dostaniesz kocie uszka, oraz będziesz mówić jak kot!"
@ -158,7 +158,7 @@ autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od
których obserwujesz"
addAccount: "Dodaj konto"
loginFailed: "Nie udało się zalogować"
showOnRemote: "Zobacz na zdalnym serwerze"
showOnRemote: "Zobacz oryginalną treść"
general: "Ogólne"
wallpaper: "Tapeta"
setWallpaper: "Ustaw tapetę"
@ -211,7 +211,7 @@ noUsers: "Brak użytkowników"
editProfile: "Edytuj profil"
noteDeleteConfirm: "Czy na pewno chcesz usunąć ten wpis?"
pinLimitExceeded: "Nie możesz przypiąć więcej wpisów"
intro: "Zakończono instalację Firefish! Utwórz konto administratora."
intro: "Zakończono instalację Firefish! Utwórz teraz konto administratora."
done: "Gotowe"
processing: "Przetwarzanie"
preview: "Podgląd"
@ -299,11 +299,11 @@ emptyDrive: "Dysk jest pusty"
emptyFolder: "Ten katalog jest pusty"
unableToDelete: "Nie można usunąć"
inputNewFileName: "Wprowadź nową nazwę pliku"
inputNewDescription: "Proszę wpisać nowy napis"
inputNewDescription: "Podaj nowy napis"
inputNewFolderName: "Wprowadź nową nazwę katalogu"
circularReferenceFolder: "Katalog docelowy jest podkatalogiem katalogu, który chcesz
przenieść."
hasChildFilesOrFolders: "Ponieważ ten katalog nie jest pusty, nie może być usunięty."
hasChildFilesOrFolders: "Katalog nie może być usunięty ponieważ nie jest pusty."
copyUrl: "Skopiuj adres URL"
rename: "Zmień nazwę"
avatar: "Awatar"
@ -578,8 +578,8 @@ disablePlayer: "Zamknij odtwarzacz wideo"
expandTweet: "Rozwiń tweet"
themeEditor: "Edytor motywu"
description: "Opis"
describeFile: "Dodaj podpis"
enterFileDescription: "Wprowadź napis"
describeFile: "Dodaj opis"
enterFileDescription: "Wprowadź opis"
author: "Autor"
leaveConfirm: "Są niezapisane zmiany. Czy chcesz je odrzucić?"
manage: "Zarządzanie"
@ -616,7 +616,7 @@ emptyToDisableSmtpAuth: "Pozostaw adres e-mail i hasło puste, aby wyłączyć w
SMTP"
smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS"
testEmail: "Przetestuj dostarczanie wiadomości e-mail"
wordMute: "Wyciszenie słowa"
wordMute: "Wyciszenie słów i języków"
instanceMute: "Wyciszenie serwera"
userSaysSomething: "{name} powiedział* coś"
makeActive: "Aktywuj"
@ -691,8 +691,7 @@ no: "Nie"
driveFilesCount: "Liczba plików na dysku"
driveUsage: "Użycie przestrzeni dyskowej"
noCrawle: "Odrzuć indeksowanie przez crawlery"
noCrawleDescription: "Proś wyszukiwarki internetowe, aby nie indeksowały Twojego profilu,
wpisów, stron itd."
noCrawleDescription: "Proś wyszukiwarki internetowe, aby nie indeksowały Twoich treści."
lockedAccountInfo: "Dopóki nie ustawisz widoczności wpisu na \"Obserwujący\", twoje
wpisy będą mogli widzieć wszyscy, nawet jeśli ustawisz manualne zatwierdzanie obserwujących."
alwaysMarkSensitive: "Oznacz domyślnie jako NSFW"
@ -759,7 +758,7 @@ useReactionPickerForContextMenu: "Otwórz wybornik reakcji prawym kliknięciem"
typingUsers: "{users} pisze/ą"
jumpToSpecifiedDate: "Przejdź do określonej daty"
showingPastTimeline: "Obecnie wyświetla starą oś czasu"
clear: "Wć"
clear: "Wyczyść"
markAllAsRead: "Oznacz wszystkie jako przeczytane"
goBack: "Wróć"
unlikeConfirm: "Na pewno chcesz usunąć polubienie?"
@ -800,7 +799,7 @@ gallery: "Galeria"
recentPosts: "Ostatnie wpisy"
popularPosts: "Popularne wpisy"
shareWithNote: "Udostępnij z wpisem"
ads: "Reklamy"
ads: "Banery"
expiration: "Ankieta kończy się"
memo: "Notatki"
priority: "Priorytet"
@ -852,7 +851,7 @@ ffVisibility: "Widoczność obserwowanych/obserwujących"
ffVisibilityDescription: "Pozwala skonfigurować, kto może zobaczyć, kogo obserwujesz
i kto Cię obserwuje."
continueThread: "Kontynuuj wątek"
deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie Twojego konta. Kontynuować?"
deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie tego konta. Kontynuować?"
incorrectPassword: "Nieprawidłowe hasło."
voteConfirm: "Potwierdzić swój głos na \"{choice}\"?"
hide: "Ukryj"
@ -1001,8 +1000,8 @@ _nsfw:
force: "Ukrywaj wszystkie media"
_mfm:
cheatSheet: "Ściąga MFM"
intro: "MFM jest językiem składniowym używanym przez m.in. Firefish, forki *key (w
tym Firefish), oraz Akkomę, który może być użyty w wielu miejscach. Tu znajdziesz
intro: "MFM jest językiem składniowym używanym przez m.in. Firefish, forki *key
(w tym Firefish), oraz Akkomę, który może być użyty w wielu miejscach. Tu znajdziesz
listę wszystkich możliwych elementów składni MFM."
dummy: "Firefish rozszerza świat Fediwersum"
mention: "Wspomnij"
@ -1250,7 +1249,7 @@ _tutorial:
innej połączonej instancji."
step6_1: "Więc, czym to jest to miejsce?"
step6_2: "Cóż, nie dołączył*ś po prostu do Firefish. Dołączył*ś do portalu do Fediverse,
połączonej sieci tysięcy serwerów, zwanych instancjami."
sieci tysięcy połączonych ze sobą serwerów, zwanych instancjami."
step6_3: "Każdy serwer działa w inny sposób, i nie wszystkie serwery używają Firefish.
Ten jednak używa! Jest to trochę skomplikowane, ale w krótkim czasie załapiesz
o co chodzi."
@ -1816,8 +1815,8 @@ instanceSecurity: Bezpieczeństwo serwera
privateMode: Tryb prywatny
allowedInstances: Dopuszczone serwery
recommended: Polecane
allowedInstancesDescription: Hosty serwerów, które mają być dopuszczone do federacji,
każdy oddzielony nowym wierszem (dotyczy tylko trybu prywatnego).
allowedInstancesDescription: Hosty serwerów, które mają być dopuszczone do federacji.
Każdy oddzielony nowym wierszem (dotyczy tylko trybu prywatnego).
seperateRenoteQuote: Oddziel przyciski podbicia i cytowania
refreshInterval: 'Częstotliwość aktualizacji '
slow: Wolna
@ -1916,14 +1915,14 @@ sendErrorReportsDescription: "Gdy ta opcja jest włączona, szczegółowe inform
błędach będą udostępnianie z Firefish gdy wystąpi problem, pomagając w ulepszaniu
Firefish.\nZawrze to informacje takie jak wersja twojego systemu operacyjnego, przeglądarki,
Twoja aktywność na Firefish itd."
privateModeInfo: Gdy ta opcja jest włączona, tylko serwery z białej listy mogą federować
się z twoim serwerem. Wszystkie posty będą ukryte publicznie.
privateModeInfo: Gdy ta opcja jest włączona, tylko serwery z listy serwerów dozwolonych
mogą federować się z twoim serwerem. Żadne posty nie będą publicznie dostępne.
oneHour: Godzina
oneDay: Dzień
oneWeek: Tydzień
recommendedInstances: Polecane serwery
recommendedInstancesDescription: Polecane serwery, mające pojawić się w odpowiedniej
osi czasu, oddzielane nowymi liniami. NIE dodawaj “https://”, TYLKO samą domenę.
osi czasu, oddzielane nowymi liniami.
rateLimitExceeded: Przekroczono ratelimit
cropImage: Kadruj zdjęcie
cropImageAsk: Czy chcesz skadrować to zdjęcie?
@ -1948,7 +1947,7 @@ activeEmailValidationDescription: Włącza ściślejszą walidację adresów e-m
obejmuje sprawdzanie adresów jednorazowych oraz tego, czy rzeczywiście można się
z nim komunikować. Jeśli wyłączone, walidowany jest tylko format wiadomości e-mail.
shuffle: Losuj
showAds: Pokazuj reklamy
showAds: Pokazuj banery
enterSendsMessage: Wciśnij Enter w komunikatorze, by wysłać wiadomość (domyślnie
Ctrl + Enter)
adminCustomCssWarn: To ustawienie powinno być używane tylko pod warunkiem, że wiesz
@ -2012,7 +2011,7 @@ silencedInstancesDescription: Wypisz nazwy hostów serwerów, które chcesz wyci
cannotUploadBecauseExceedsFileSizeLimit: Ten plik nie mógł być przesłany, ponieważ
jego wielkość przekracza dozwolony limit.
sendModMail: Wyślij Powiadomienie Moderacyjne
searchPlaceholder: Szukaj Firefish
searchPlaceholder: Szukaj w Firefish
jumpToPrevious: Przejdź do poprzedniej sekcji
listsDesc: Listy umożliwiają tworzenie osi czasu z określonymi użytkownikami. Dostęp
do nich można uzyskać na stronie osi czasu.
@ -2028,3 +2027,15 @@ newer: nowsze
older: starsze
cw: Ostrzeżenie zawartości
removeReaction: Usuń reakcję
reactions: Reakcje
clipsDesc: Spinki to skategoryzowane zakładki, które można udostępniać. Możesz utworzyć
spinkę dla każdego wpisu w menu wpisu.
swipeOnMobile: Pozwalaj na przeciąganie pomiędzy stronami
image: Obrazek
xl: XL
replies: Odpowiedzi
video: Film
quotes: Cytaty
clickToShowPatterns: Kliknij aby pokazać wzory modułów
renotes: Boosty
audio: Dźwięk

View file

@ -1,4 +1,4 @@
_lang_: "Português"
_lang_: "Português (Portugal)"
headlineFirefish: "Uma rede ligada por notas"
introFirefish: "Bem-vindo! Firefish é um serviço de microblogue descentralizado de
código aberto, gratuito para sempre! 🚀"

View file

@ -1,6 +1,6 @@
_lang_: Português (Brasil)
username: Nome de usuário
ok: OK
_lang_: Inglês
headlineFirefish: Uma plataforma de mídia social descentralizada e de código aberto
que é gratuita para sempre! 🚀
search: Pesquisar

View file

@ -1 +1 @@
0a44d0652244240aa50fbae3ea88c616c8e1c136
3b3320d5323648a5ad9a9c3e12561613e3b89a6c

View file

@ -1,6 +1,6 @@
{
"name": "firefish",
"version": "1.0.5-dev19",
"version": "1.0.5-dev20",
"codename": "aqua",
"repository": {
"type": "git",

View file

@ -47,6 +47,7 @@
"blurhash": "2.0.5",
"bull": "4.11.3",
"cacheable-lookup": "TheEssem/cacheable-lookup",
"cbor-x": "^1.5.4",
"chalk": "5.3.0",
"chalk-template": "0.4.0",
"chokidar": "^3.5.3",
@ -86,7 +87,7 @@
"meilisearch": "0.34.1",
"mfm-js": "0.23.3",
"mime-types": "2.1.35",
"msgpackr": "1.9.7",
"msgpackr": "^1.9.9",
"multer": "1.4.4-lts.1",
"native-utils": "link:native-utils",
"nested-property": "4.0.0",

View file

@ -1,5 +1,5 @@
/**
* Misskey Entry Point!
* Firefish Entry Point
*/
import { EventEmitter } from "node:events";

View file

@ -70,7 +70,7 @@ export function parseUri(value: string | IObject): UriParseResult {
export default class DbResolver {
/**
* AP Note => Misskey Note in DB
* AP Note => Firefish Note in DB
*/
public async getNoteFromApId(value: string | IObject): Promise<Note | null> {
const parsed = parseUri(value);
@ -114,7 +114,7 @@ export default class DbResolver {
}
/**
* AP Person => Misskey User in DB
* AP Person => Firefish User in DB
*/
public async getUserFromApId(
value: string | IObject,
@ -147,7 +147,7 @@ export default class DbResolver {
}
/**
* AP KeyId => Misskey User and Key
* AP KeyId => Firefish User and Key
*/
public async getAuthUserFromKeyId(keyId: string): Promise<{
user: CacheableRemoteUser;
@ -181,7 +181,7 @@ export default class DbResolver {
}
/**
* AP Actor id => Misskey User and Key
* AP Actor id => Firefish User and Key
*/
public async getAuthUserFromApId(uri: string): Promise<{
user: CacheableRemoteUser;

View file

@ -452,7 +452,7 @@ export async function updatePerson(
const emojiNames = emojis.map((emoji) => emoji.name);
const { fields } = analyzeAttachments(person.attachment || []);
const fields = analyzeAttachments(person.attachment || []);
const tags = extractApHashtags(person.tag)
.map((tag) => normalizeForSearch(tag))

View file

@ -1,4 +1,4 @@
import { decode } from "msgpackr";
import { decode } from "cbor-x";
import define from "../../../define.js";
import {
UserProfiles,
@ -62,7 +62,7 @@ export default define(meta, paramDef, async (ps, user) => {
const clientDataJSONHash = hash(Buffer.from(ps.clientDataJSON, "utf-8"));
const attestation = decode(Buffer.from(ps.attestationObject, "utf-8"));
const attestation = decode(Buffer.from(ps.attestationObject, "hex"));
const rpIdHash = attestation.authData.slice(0, 32);
if (!rpIdHashReal.equals(rpIdHash)) {
@ -79,7 +79,13 @@ export default define(meta, paramDef, async (ps, user) => {
const credentialIdLength = authData.readUInt16BE(53);
const credentialId = authData.slice(55, 55 + credentialIdLength);
const publicKeyData = authData.slice(55 + credentialIdLength);
const publicKey: Map<number, any> = decode(publicKeyData);
const publicKey: Map<Number, any> = new Map(
Object.entries(decode(publicKeyData)).map(([key, value]) => [
Number(key),
value,
]),
);
if (publicKey.get(3) !== -7) {
throw new Error("alg mismatch");
}

View file

@ -64,6 +64,7 @@ export default define(meta, paramDef, async (ps, user) => {
let targetLang = ps.targetLang;
if (targetLang.includes("-")) targetLang = targetLang.split("-")[0];
if (targetLang.includes("_")) targetLang = targetLang.split("_")[0];
if (instance.libreTranslateApiUrl != null) {
const jsonBody = {

View file

@ -89,9 +89,6 @@ const nodeinfo2 = async () => {
enableRecaptcha: meta.enableRecaptcha,
maxNoteTextLength: MAX_NOTE_TEXT_LENGTH,
maxCaptionTextLength: MAX_CAPTION_TEXT_LENGTH,
enableTwitterIntegration: meta.enableTwitterIntegration,
enableGithubIntegration: meta.enableGithubIntegration,
enableDiscordIntegration: meta.enableDiscordIntegration,
enableEmail: meta.enableEmail,
enableServiceWorker: meta.enableServiceWorker,
proxyAccountName: proxyAccount ? proxyAccount.username : null,

View file

@ -6,17 +6,11 @@ import { apiUrl } from "@/config";
import { alert, api, popup, popupMenu, waiting } from "@/os";
import { reloadChannel, unisonReload } from "@/scripts/unison-reload";
import icon from "@/scripts/icon";
import { $i } from "@/reactiveAccount";
// TODO: 他のタブと永続化されたstateを同期
type Account = firefish.entities.MeDetailed;
const accountData = localStorage.getItem("account");
// TODO: 外部からはreadonlyに
export const $i = accountData
? reactive(JSON.parse(accountData) as Account)
: null;
export type Account = firefish.entities.MeDetailed;
export const iAmModerator = $i != null && ($i.isAdmin || $i.isModerator);
export const iAmAdmin = $i?.isAdmin;
@ -101,7 +95,6 @@ function fetchAccount(token: string): Promise<Account> {
if (res.error.id === "a8c724b3-6e9c-4b46-b1a8-bc3ed6258370") {
showSuspendedDialog();
signout();
return;
} else {
alert({
type: "error",

View file

@ -66,7 +66,7 @@
import * as Acct from "firefish-js/built/acct";
import { i18n } from "@/i18n";
import { acct } from "@/filters/user";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
const getAcct = Acct.toString;

View file

@ -42,7 +42,7 @@ import Cropper from "cropperjs";
import tinycolor from "tinycolor2";
import XModalWindow from "@/components/MkModalWindow.vue";
import * as os from "@/os";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { defaultStore } from "@/store";
import { apiUrl, url } from "@/config";
import { query } from "@/scripts/url";

View file

@ -19,7 +19,10 @@
></i>
<i
v-else-if="type === 'error'"
:class="[$style.iconInner, iconClass('ph-circle-wavy-warning')]"
:class="[
$style.iconInner,
iconClass('ph-circle-wavy-warning'),
]"
></i>
<i
v-else-if="type === 'warning'"

View file

@ -45,7 +45,7 @@ import MkDriveFileThumbnail from "@/components/MkDriveFileThumbnail.vue";
import bytes from "@/filters/bytes";
import * as os from "@/os";
import { i18n } from "@/i18n";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import icon from "@/scripts/icon";
const props = withDefaults(

View file

@ -18,7 +18,7 @@
</button>
</header>
<transition
:name="defaultStore.state.animation ? 'folder-toggle' : ''"
:name="animation ? 'folder-toggle' : ''"
@enter="enter"
@after-enter="afterEnter"
@leave="leave"
@ -62,8 +62,8 @@ export default defineComponent({
localStoragePrefix + this.persistKey,
) === "t"
: this.expanded,
defaultStore,
icon,
animation: defaultStore.state.animation,
};
},
watch: {

View file

@ -66,7 +66,7 @@ import type * as firefish from "firefish-js";
import * as os from "@/os";
import { stream } from "@/stream";
import { i18n } from "@/i18n";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { getUserMenu } from "@/scripts/get-user-menu";
import { useRouter } from "@/router";
import { vibrate } from "@/scripts/vibrate";

View file

@ -15,7 +15,7 @@ import { defaultStore } from "@/store";
import { useChartTooltip } from "@/scripts/use-chart-tooltip";
import { alpha } from "@/scripts/color";
import { initChart } from "@/scripts/init-chart";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
initChart();

View file

@ -50,9 +50,9 @@ import XMedia from "@/components/MkMedia.vue";
import XModPlayer from "@/components/MkModPlayer.vue";
import * as os from "@/os";
import {
FILE_EXT_TRACKER_MODULES,
FILE_TYPE_BROWSERSAFE,
FILE_TYPE_TRACKER_MODULES,
FILE_EXT_TRACKER_MODULES,
} from "@/const";
const props = defineProps<{
@ -196,9 +196,7 @@ const previewable = (file: firefish.entities.DriveFile): boolean => {
const isModule = (file: firefish.entities.DriveFile): boolean => {
return (
FILE_TYPE_TRACKER_MODULES.some((type) => {
return file.type === type;
}) ||
FILE_TYPE_TRACKER_MODULES.includes(file.type) ||
FILE_EXT_TRACKER_MODULES.some((ext) => {
return file.name.toLowerCase().endsWith("." + ext);
})

View file

@ -37,7 +37,7 @@
import { toUnicode } from "punycode";
import {} from "vue";
import { host as localHost } from "@/config";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { defaultStore } from "@/store";
const props = defineProps<{

View file

@ -1,33 +1,33 @@
<template>
<div class="mod-player-disabled" v-if="!available">
<div v-if="!available" class="mod-player-disabled">
<MkLoading v-if="fetching" />
<MkError v-else-if="error" @retry="load()" />
</div>
<div class="mod-player-disabled" v-else-if="hide" @click="toggleVisible()">
<div v-else-if="hide" class="mod-player-disabled" @click="toggleVisible()">
<div>
<b><i class="ph-warning"></i> {{ i18n.ts.sensitive }}</b>
<span>{{ i18n.ts.clickToShow }}</span>
</div>
</div>
<div class="mod-player-enabled" v-else>
<div v-else class="mod-player-enabled">
<div class="pattern-display">
<div class="mod-pattern" ref="modPattern" v-if="patternShow">
<div v-if="patternShow" ref="modPattern" class="mod-pattern">
<span
v-for="(row, i) in patData[currentPattern]"
ref="initRow"
v-bind:class="{ modRowActive: isRowActive(i) }"
v-if="patData.length !== 0"
ref="initRow"
:class="{ modRowActive: isRowActive(i) }"
>
<span v-bind:class="{ modColQuarter: i % 4 === 0 }">{{
<span :class="{ modColQuarter: i % 4 === 0 }">{{
indexText(i)
}}</span>
<span class="mod-row-inner">{{ getRowText(row) }}</span>
</span>
<MkLoading v-else />
</div>
<div class="mod-pattern" v-else @click="showPattern()">
<span class="modRowActive" ref="initRow">
<div v-else class="mod-pattern" @click="showPattern()">
<span ref="initRow" class="modRowActive">
<span class="modColQuarter">00</span>
<span class="mod-row-inner">|F-12Ev10XEF</span>
</span>
@ -36,39 +36,39 @@
</div>
</div>
<div class="controls">
<button class="play" @click="playPause()" v-if="!loading">
<i class="ph-pause ph-fill" v-if="playing"></i>
<i class="ph-play ph-fill" v-else></i>
<button v-if="!loading" class="play" @click="playPause()">
<i v-if="playing" class="ph-pause ph-fill"></i>
<i v-else class="ph-play ph-fill"></i>
</button>
<MkLoading v-else :em="true" />
<button class="stop" @click="stop()">
<i class="ph-stop ph-fill"></i>
</button>
<button class="loop" @click="toggleLoop()">
<i class="ph-repeat ph-fill" v-if="loop === -1"></i>
<i class="ph-repeat-once ph-fill" v-else></i>
<i v-if="loop === -1" class="ph-repeat ph-fill"></i>
<i v-else class="ph-repeat-once ph-fill"></i>
</button>
<FormRange
ref="progress"
v-model="position"
class="progress"
:min="0"
:max="length"
v-model="position"
:step="0.1"
ref="progress"
:background="false"
:tooltips="false"
:instant="true"
@update:modelValue="performSeek()"
></FormRange>
<button class="mute" @click="toggleMute()">
<i class="ph-speaker-simple-x ph-fill" v-if="muted"></i>
<i class="ph-speaker-simple-high ph-fill" v-else></i>
<i v-if="muted" class="ph-speaker-simple-x ph-fill"></i>
<i v-else class="ph-speaker-simple-high ph-fill"></i>
</button>
<FormRange
v-model="player.context.gain.value"
class="volume"
:min="0"
:max="1"
v-model="player.context.gain.value"
:step="0.1"
:background="false"
:tooltips="false"
@ -106,13 +106,13 @@
</template>
<script lang="ts" setup>
import { ref, shallowRef, nextTick, onDeactivated, onMounted } from "vue";
import * as firefish from "firefish-js";
import { nextTick, onDeactivated, onMounted, ref, shallowRef } from "vue";
import type * as firefish from "firefish-js";
import FormRange from "./form/range.vue";
import { i18n } from "@/i18n";
import * as os from "@/os";
import { defaultStore } from "@/store";
import { ChiptuneJsPlayer, ChiptuneJsConfig } from "@/scripts/chiptune2";
import { ChiptuneJsConfig, ChiptuneJsPlayer } from "@/scripts/chiptune2";
import icon from "@/scripts/icon";
const props = defineProps<{
@ -130,25 +130,25 @@ interface ModRow {
const available = ref(false);
const initRow = shallowRef<HTMLSpanElement>();
const player = shallowRef(new ChiptuneJsPlayer(new ChiptuneJsConfig()));
let hide = ref(
const hide = ref(
defaultStore.state.nsfw === "force"
? true
: props.module.isSensitive && defaultStore.state.nsfw !== "ignore",
);
let playing = ref(false);
let patternShow = ref(false);
let modPattern = ref<HTMLDivElement>();
let progress = ref<typeof FormRange>();
let position = ref(0);
let patData = shallowRef([] as ModRow[][]);
let currentPattern = ref(0);
let nbChannels = ref(0);
let length = ref(1);
let muted = ref(false);
let loop = ref(0);
let fetching = ref(true);
let error = ref(false);
let loading = ref(false);
const playing = ref(false);
const patternShow = ref(false);
const modPattern = ref<HTMLDivElement>();
const progress = ref<typeof FormRange>();
const position = ref(0);
const patData = shallowRef([] as ModRow[][]);
const currentPattern = ref(0);
const nbChannels = ref(0);
const length = ref(1);
const muted = ref(false);
const loop = ref(0);
const fetching = ref(true);
const error = ref(false);
const loading = ref(false);
function load() {
player.value
@ -168,10 +168,10 @@ function load() {
onMounted(load);
let currentRow = 0;
let rowHeight = 0;
let buffer = null;
let isSeeking = false;
let currentRow = 0,
rowHeight = 0,
buffer = null,
isSeeking = false;
function captionPopup() {
os.alert({
@ -293,7 +293,6 @@ function isRowActive(i: number) {
}
return true;
}
return;
}
function indexText(i: number) {
@ -305,11 +304,11 @@ function indexText(i: number) {
}
function getRow(pattern: number, rowOffset: number) {
let notes: string[] = [],
insts: string[] = [],
vols: string[] = [],
fxs: string[] = [],
ops: string[] = [];
const notes: string[] = [];
const insts: string[] = [];
const vols: string[] = [];
const fxs: string[] = [];
const ops: string[] = [];
for (let channel = 0; channel < nbChannels.value; channel++) {
const part = player.value.getPatternRowChannel(

View file

@ -294,7 +294,7 @@ import { userPage } from "@/filters/user";
import * as os from "@/os";
import { defaultStore, noteViewInterruptors } from "@/store";
import { reactionPicker } from "@/scripts/reaction-picker";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { getNoteMenu } from "@/scripts/get-note-menu";
import { useNoteCapture } from "@/scripts/use-note-capture";

View file

@ -181,7 +181,7 @@ import { userPage } from "@/filters/user";
import * as os from "@/os";
import { defaultStore, noteViewInterruptors } from "@/store";
import { reactionPicker } from "@/scripts/reaction-picker";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { getNoteMenu } from "@/scripts/get-note-menu";
import { useNoteCapture } from "@/scripts/use-note-capture";

View file

@ -210,7 +210,7 @@ import { useRouter } from "@/router";
import { userPage } from "@/filters/user";
import * as os from "@/os";
import { reactionPicker } from "@/scripts/reaction-picker";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { useNoteCapture } from "@/scripts/use-note-capture";
import { defaultStore } from "@/store";

View file

@ -54,7 +54,7 @@ import XNotification from "@/components/MkNotification.vue";
import XList from "@/components/MkDateSeparatedList.vue";
import XNote from "@/components/MkNote.vue";
import { stream } from "@/stream";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
const props = defineProps<{

View file

@ -285,11 +285,8 @@ import { defaultStore, notePostInterruptors, postFormActions } from "@/store";
import MkInfo from "@/components/MkInfo.vue";
import { i18n } from "@/i18n";
import { instance } from "@/instance";
import {
$i,
getAccounts,
openAccountMenu as openAccountMenu_,
} from "@/account";
import { getAccounts, openAccountMenu as openAccountMenu_ } from "@/account";
import { $i } from "@/reactiveAccount";
import { uploadFile } from "@/scripts/upload";
import { deepClone } from "@/scripts/clone";
import preprocess from "@/scripts/preprocess";
@ -345,7 +342,7 @@ const poll = ref<{
expiredAfter: string | null;
} | null>(null);
const useCw = ref(false);
let showPreview = ref(defaultStore.state.showPreviewByDefault);
const showPreview = ref(defaultStore.state.showPreviewByDefault);
const cw = ref<string | null>(null);
const localOnly = ref<boolean>(
props.initialLocalOnly ?? defaultStore.state.rememberNoteVisibility

View file

@ -55,7 +55,8 @@
<script setup lang="ts">
import { ref } from "vue";
import { $i, getAccounts } from "@/account";
import { getAccounts } from "@/account";
import { $i } from "@/reactiveAccount";
import MkButton from "@/components/MkButton.vue";
import { instance } from "@/instance";
import { api, apiWithDialog, promiseDialog } from "@/os";

View file

@ -14,7 +14,7 @@ import { computed } from "vue";
import type { Note } from "firefish-js/built/entities";
import { pleaseLogin } from "@/scripts/please-login";
import * as os from "@/os";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { defaultStore } from "@/store";
import icon from "@/scripts/icon";

View file

@ -28,7 +28,7 @@ import XDetails from "@/components/MkReactionsViewer.details.vue";
import XReactionIcon from "@/components/MkReactionIcon.vue";
import * as os from "@/os";
import { useTooltip } from "@/scripts/use-tooltip";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
const props = defineProps<{
reaction: string;

View file

@ -19,7 +19,7 @@
<script lang="ts" setup>
import { computed, ref } from "vue";
import type * as firefish from "firefish-js";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import XReaction from "@/components/MkReactionsViewer.reaction.vue";
const props = defineProps<{

View file

@ -27,7 +27,7 @@ import Ripple from "@/components/MkRipple.vue";
import XDetails from "@/components/MkUsersTooltip.vue";
import { pleaseLogin } from "@/scripts/please-login";
import * as os from "@/os";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { useTooltip } from "@/scripts/use-tooltip";
import { i18n } from "@/i18n";
import { defaultStore } from "@/store";

View file

@ -33,7 +33,7 @@ import XNotes from "@/components/MkNotes.vue";
import MkInfo from "@/components/MkInfo.vue";
import { stream } from "@/stream";
import * as sound from "@/scripts/sound";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { defaultStore } from "@/store";
import icon from "@/scripts/icon";

View file

@ -208,7 +208,7 @@ import MkPushNotificationAllowButton from "@/components/MkPushNotificationAllowB
import FormSwitch from "@/components/form/switch.vue";
import { defaultStore } from "@/store";
import { i18n } from "@/i18n";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { instance } from "@/instance";
import icon from "@/scripts/icon";

View file

@ -20,8 +20,8 @@
></i>
<i
v-else-if="note.visibility === 'specified'"
v-tooltip="i18n.ts._visibility.private"
ref="specified"
v-tooltip="i18n.ts._visibility.private"
:class="icon('ph-eye-slash')"
></i>
</span>

View file

@ -31,7 +31,7 @@
<script lang="ts" setup>
import { shallowRef, watch } from "vue";
import MkModal from "@/components/MkModal.vue";
import iconClass from "@/scripts/icon"
import iconClass from "@/scripts/icon";
const modal = shallowRef<InstanceType<typeof MkModal>>();

View file

@ -1,5 +1,5 @@
<template>
<span class="mk-acct" v-if="show">
<span v-if="show" class="mk-acct">
<span class="name">@{{ user.username }}</span>
<span
v-if="user.host || detail || defaultStore.state.showFullAcct"
@ -14,7 +14,7 @@ import type * as firefish from "firefish-js";
import { toUnicode } from "punycode/";
import { host as hostRaw } from "@/config";
import { defaultStore } from "@/store";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
const props = defineProps<{
user: firefish.entities.UserDetailed;

View file

@ -49,7 +49,7 @@ import { extractAvgColorFromBlurhash } from "@/scripts/extract-avg-color-from-bl
import { acct, userPage } from "@/filters/user";
import MkUserOnlineIndicator from "@/components/MkUserOnlineIndicator.vue";
import { defaultStore } from "@/store";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
const props = withDefaults(
defineProps<{

View file

@ -43,7 +43,7 @@
<i
v-else-if="metadata.icon && !narrow"
class="icon"
:class="metadata.icon"
:class="icon(metadata.icon)"
></i>
<div class="title">
@ -138,7 +138,8 @@ import MkFollowButton from "@/components/MkFollowButton.vue";
import { popupMenu } from "@/os";
import { scrollToTop } from "@/scripts/scroll";
import { injectPageMetadata } from "@/scripts/page-metadata";
import { $i, openAccountMenu as openAccountMenu_ } from "@/account";
import { openAccountMenu as openAccountMenu_ } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import icon from "@/scripts/icon";

View file

@ -12,7 +12,7 @@
<script lang="ts" setup>
import type * as firefish from "firefish-js";
import { defaultStore } from "@/store";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
const props = withDefaults(
defineProps<{

View file

@ -264,7 +264,7 @@ export default defineComponent({
: token.props.args.y
? "perspective(128px) rotateY"
: "rotate";
const degrees = parseInt(token.props.args.deg) || "90";
const degrees = parseFloat(token.props.args.deg) ?? "90";
style = `transform: ${rotate}(${degrees}deg); transform-origin: center center;`;
break;
}

View file

@ -21,7 +21,7 @@ import { parse } from "@syuilo/aiscript";
import XBlock from "./page.block.vue";
import { Hpml } from "@/scripts/hpml/evaluator";
import { url } from "@/config";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { defaultStore } from "@/store";
export default defineComponent({

View file

@ -14,7 +14,6 @@ import "@phosphor-icons/web/light";
import "@phosphor-icons/web/duotone";
// #region account indexedDB migration
import { set } from "@/scripts/idb-proxy";
const accounts = localStorage.getItem("accounts");
if (accounts) {
@ -31,6 +30,7 @@ import {
version as vueVersion,
watch,
} from "vue";
import { set } from "@/scripts/idb-proxy";
import widgets from "@/widgets";
import directives from "@/directives";
@ -42,7 +42,8 @@ import { i18n } from "@/i18n";
import { alert, api, confirm, popup, post, toast } from "@/os";
import { stream } from "@/stream";
import * as sound from "@/scripts/sound";
import { $i, login, refreshAccount, signout, updateAccount } from "@/account";
import { login, refreshAccount, signout, updateAccount } from "@/account";
import { $i } from "@/reactiveAccount";
import { ColdDeviceStorage, defaultStore } from "@/store";
import { fetchInstance, instance } from "@/instance";
import { makeHotkey } from "@/scripts/hotkey";

View file

@ -1,5 +1,5 @@
import { computed, reactive } from "vue";
import { $i } from "./account";
import { $i } from "@/reactiveAccount";
import { search } from "@/scripts/search";
import * as os from "@/os";
import { i18n } from "@/i18n";

View file

@ -12,7 +12,7 @@ import MkWaitingDialog from "@/components/MkWaitingDialog.vue";
import MkToast from "@/components/MkToast.vue";
import MkDialog from "@/components/MkDialog.vue";
import type { MenuItem } from "@/types/menu";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
export const pendingApiRequestsCount = ref(0);
@ -24,7 +24,7 @@ export const api = ((
endpoint: string,
data: Record<string, any> = {},
token?: string | null | undefined,
useToken: boolean = true,
useToken = true,
) => {
pendingApiRequestsCount.value++;

View file

@ -64,7 +64,7 @@
><i :class="icon('ph-code')"></i
></template>
{{ i18n.ts._aboutFirefish.source }}
<template #suffix>GitLab</template>
<template #suffix>Repository</template>
</FormLink>
<FormLink
to="https://opencollective.com/firefish"

View file

@ -2,7 +2,11 @@
<div ref="el" class="fdidabkc" :style="{ background: bg }" @click="onClick">
<template v-if="metadata">
<div class="titleContainer" @click="showTabsPopup">
<i v-if="metadata.icon" class="icon" :class="metadata.icon"></i>
<i
v-if="metadata.icon"
class="icon"
:class="icon(metadata.icon)"
></i>
<div class="title">
<div class="title">{{ metadata.title }}</div>
@ -63,6 +67,7 @@ import { scrollToTop } from "@/scripts/scroll";
import MkButton from "@/components/MkButton.vue";
import { globalEvents } from "@/events";
import { injectPageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon";
interface Tab {
key?: string | null;

View file

@ -73,7 +73,7 @@ import MkSuperMenu from "@/components/MkSuperMenu.vue";
import MkInfo from "@/components/MkInfo.vue";
import { instance } from "@/instance";
import { version } from "@/config";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import * as os from "@/os";
import { lookupUser } from "@/scripts/lookup-user";
import { lookupFile } from "@/scripts/lookup-file";

View file

@ -51,7 +51,8 @@ import XForm from "./auth.form.vue";
import MkSignin from "@/components/MkSignin.vue";
import MkKeyValue from "@/components/MkKeyValue.vue";
import * as os from "@/os";
import { $i, login } from "@/account";
import { login } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
const props = defineProps<{

View file

@ -103,7 +103,7 @@ import XTimeline from "@/components/MkTimeline.vue";
import XChannelFollowButton from "@/components/MkChannelFollowButton.vue";
import * as os from "@/os";
import { useRouter } from "@/router";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon";

View file

@ -31,7 +31,7 @@
import { computed, provide, ref, watch } from "vue";
import type * as firefish from "firefish-js";
import XNotes from "@/components/MkNotes.vue";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import * as os from "@/os";
import { definePageMetadata } from "@/scripts/page-metadata";

View file

@ -146,7 +146,7 @@ import MkFolder from "@/components/MkFolder.vue";
import MkTab from "@/components/MkTab.vue";
import * as os from "@/os";
import { i18n } from "@/i18n";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import icon from "@/scripts/icon";
const props = defineProps<{

View file

@ -88,7 +88,7 @@ import { acct, userPage } from "@/filters/user";
import * as os from "@/os";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import icon from "@/scripts/icon";
const paginationComponent = ref<InstanceType<typeof MkPagination>>();

View file

@ -100,7 +100,7 @@ import { stream } from "@/stream";
import { useRouter } from "@/router";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { deviceKind } from "@/scripts/device-kind";
import { defaultStore } from "@/store";
import icon from "@/scripts/icon";

View file

@ -90,7 +90,7 @@ import XMediaList from "@/components/MkMediaList.vue";
import { extractUrlFromMfm } from "@/scripts/extract-url-from-mfm";
import MkUrlPreview from "@/components/MkUrlPreview.vue";
import * as os from "@/os";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import icon from "@/scripts/icon";

View file

@ -122,7 +122,7 @@ import { stream } from "@/stream";
import * as sound from "@/scripts/sound";
import { vibrate } from "@/scripts/vibrate";
import { i18n } from "@/i18n";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { defaultStore } from "@/store";
import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon";

View file

@ -82,7 +82,8 @@ import { ref } from "vue";
import MkSignin from "@/components/MkSignin.vue";
import MkButton from "@/components/MkButton.vue";
import * as os from "@/os";
import { $i, login } from "@/account";
import { login } from "@/account";
import { $i } from "@/reactiveAccount";
import { appendQuery, query } from "@/scripts/url";
import { i18n } from "@/i18n";
import icon from "@/scripts/icon";

View file

@ -79,7 +79,7 @@ import * as os from "@/os";
import { definePageMetadata } from "@/scripts/page-metadata";
import { i18n } from "@/i18n";
import { defaultStore } from "@/store";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import icon from "@/scripts/icon";
const props = defineProps<{

View file

@ -179,7 +179,7 @@ import { selectFile } from "@/scripts/select-file";
import { mainRouter } from "@/router";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import icon from "@/scripts/icon";
const props = defineProps<{

View file

@ -50,7 +50,7 @@ import MkContainer from "@/components/MkContainer.vue";
import MkButton from "@/components/MkButton.vue";
import { createAiScriptEnv } from "@/scripts/aiscript/api";
import * as os from "@/os";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon";

View file

@ -120,7 +120,7 @@ import MkSwitch from "@/components/form/switch.vue";
import FormSection from "@/components/form/section.vue";
import MkFolder from "@/components/MkFolder.vue";
import * as os from "@/os";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import icon from "@/scripts/icon";
@ -279,7 +279,7 @@ async function addSecurityKey() {
challenge: byteify(challenge.challenge, "base64"),
rp: {
id: hostname,
name: "Misskey",
name: "Firefish",
},
user: {
id: byteify($i!.id, "ascii"),

View file

@ -179,7 +179,7 @@ import MkKeyValue from "@/components/MkKeyValue.vue";
import * as os from "@/os";
import number from "@/filters/number";
import bytes from "@/filters/bytes";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon";

View file

@ -34,12 +34,12 @@ import FormSuspense from "@/components/form/suspense.vue";
import FormButton from "@/components/MkButton.vue";
import * as os from "@/os";
import {
$i,
removeAccount as _removeAccount,
addAccount as addAccounts,
getAccounts,
login,
} from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon";

View file

@ -70,7 +70,7 @@ import bytes from "@/filters/bytes";
import { defaultStore } from "@/store";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import icon from "@/scripts/icon";
const fetching = ref(true);

View file

@ -66,7 +66,7 @@ import FormSection from "@/components/form/section.vue";
import FormInput from "@/components/form/input.vue";
import FormSwitch from "@/components/form/switch.vue";
import * as os from "@/os";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon";

View file

@ -395,7 +395,7 @@
<script lang="ts" setup>
import { computed, ref, watch } from "vue";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import FormSwitch from "@/components/form/switch.vue";
import FormSelect from "@/components/form/select.vue";
import FormRadios from "@/components/form/radios.vue";

View file

@ -45,7 +45,8 @@ import { computed, onActivated, onMounted, onUnmounted, ref, watch } from "vue";
import { i18n } from "@/i18n";
import MkInfo from "@/components/MkInfo.vue";
import MkSuperMenu from "@/components/MkSuperMenu.vue";
import { $i, signout } from "@/account";
import { signout } from "@/account";
import { $i } from "@/reactiveAccount";
import { unisonReload } from "@/scripts/unison-reload";
import { instance } from "@/instance";
import { useRouter } from "@/router";

View file

@ -26,7 +26,7 @@ import FormTextarea from "@/components/form/textarea.vue";
import MkInfo from "@/components/MkInfo.vue";
import MkButton from "@/components/MkButton.vue";
import * as os from "@/os";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon";

View file

@ -60,7 +60,7 @@ import FormInfo from "@/components/MkInfo.vue";
import * as os from "@/os";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import icon from "@/scripts/icon";
const moveToAccount = ref("");

View file

@ -54,7 +54,7 @@ import { notificationTypes } from "firefish-js";
import FormButton from "@/components/MkButton.vue";
import FormSection from "@/components/form/section.vue";
import * as os from "@/os";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import MkPushNotificationAllowButton from "@/components/MkPushNotificationAllowButton.vue";

View file

@ -65,7 +65,7 @@ import * as os from "@/os";
import { ColdDeviceStorage, defaultStore } from "@/store";
import { unisonReload } from "@/scripts/unison-reload";
import { stream } from "@/stream";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { host, version } from "@/config";
import { definePageMetadata } from "@/scripts/page-metadata";

View file

@ -165,7 +165,7 @@ import FormFolder from "@/components/form/folder.vue";
import * as os from "@/os";
import { defaultStore } from "@/store";
import { i18n } from "@/i18n";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon";

View file

@ -170,7 +170,7 @@ import FormSlot from "@/components/form/slot.vue";
import { selectFile } from "@/scripts/select-file";
import * as os from "@/os";
import { i18n } from "@/i18n";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { langmap } from "@/scripts/langmap";
import { definePageMetadata } from "@/scripts/page-metadata";
import { host } from "@/config";

View file

@ -70,7 +70,7 @@ import MkTab from "@/components/MkTab.vue";
import * as os from "@/os";
import number from "@/filters/number";
import { defaultStore } from "@/store";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon";

View file

@ -151,7 +151,7 @@ import FormButton from "@/components/MkButton.vue";
import FormTextarea from "@/components/form/textarea.vue";
import FormFolder from "@/components/form/folder.vue";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import type { Theme } from "@/scripts/theme";
import { applyTheme } from "@/scripts/theme";
import lightTheme from "@/themes/_light.json5";

View file

@ -74,7 +74,7 @@ import * as os from "@/os";
import { defaultStore } from "@/store";
import { i18n } from "@/i18n";
import { instance } from "@/instance";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { definePageMetadata } from "@/scripts/page-metadata";
import { deviceKind } from "@/scripts/device-kind";
import icon from "@/scripts/icon";

View file

@ -214,7 +214,7 @@
:inline="true"
:transparent="false"
:full="true"
:hideFollowButton="hideFollowButton"
:hide-follow-button="hideFollowButton"
class="koudoku"
@refresh="emit('refresh')"
/>
@ -389,7 +389,7 @@ import { userPage } from "@/filters/user";
import { defaultStore } from "@/store";
import * as os from "@/os";
import { i18n } from "@/i18n";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { host } from "@/config";
import icon from "@/scripts/icon";

View file

@ -37,7 +37,7 @@ import * as os from "@/os";
import { useRouter } from "@/router";
import { definePageMetadata } from "@/scripts/page-metadata";
import { i18n } from "@/i18n";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import icon from "@/scripts/icon";
const XHome = defineAsyncComponent(() => import("./home.vue"));

View file

@ -2,9 +2,9 @@
import type { Ref } from "vue";
import { onUnmounted, ref, watch } from "vue";
import { $i } from "./account";
import { api } from "./os";
import { stream } from "./stream";
import { $i } from "@/reactiveAccount";
type StateDef = Record<
string,

View file

@ -0,0 +1,9 @@
import { reactive } from "vue";
import type { Account } from "@/account";
const accountData = localStorage.getItem("account");
// TODO: 外部からはreadonlyに
export const $i = accountData
? reactive(JSON.parse(accountData) as Account)
: null;

View file

@ -1,7 +1,8 @@
import type { AsyncComponentLoader } from "vue";
import { defineAsyncComponent, inject } from "vue";
import { Router } from "@/nirax";
import { $i, iAmModerator, iAmEmojiMod } from "@/account";
import { iAmEmojiMod, iAmModerator } from "@/account";
import { $i } from "@/reactiveAccount";
import MkLoading from "@/pages/_loading_.vue";
import MkError from "@/pages/_error_.vue";
import { api } from "@/os";

View file

@ -1,6 +1,6 @@
import { utils, values } from "@syuilo/aiscript";
import * as os from "@/os";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
export function createAiScriptEnv(opts) {
let apiRequests = 0;

View file

@ -105,14 +105,14 @@ export function getWordSoftMute(
}
}
if (mutedLangs.length > 0) {
let noteLangMuted = checkLangMute(note, mutedLangs);
const noteLangMuted = checkLangMute(note, mutedLangs);
if (noteLangMuted.muted) {
noteLangMuted.what = "note";
return noteLangMuted;
}
if (note.renote) {
let renoteLangMuted = checkLangMute(note, mutedLangs);
const renoteLangMuted = checkLangMute(note, mutedLangs);
if (renoteLangMuted.muted) {
renoteLangMuted.what = note.text == null ? "renote" : "quote";
return renoteLangMuted;
@ -120,7 +120,7 @@ export function getWordSoftMute(
}
if (note.reply) {
let replyLangMuted = checkLangMute(note, mutedLangs);
const replyLangMuted = checkLangMute(note, mutedLangs);
if (replyLangMuted.muted) {
replyLangMuted.what = "reply";
return replyLangMuted;

View file

@ -309,9 +309,9 @@ ChiptuneJsPlayer.prototype.createLibopenmptNode = async function (
}
return;
}
let framesRendered = 0;
let ended = false;
let error = false;
let framesRendered = 0,
ended = false,
error = false;
const currentPattern =
processNode.player.libopenmpt._openmpt_module_get_current_pattern(

View file

@ -1,7 +1,7 @@
import type { Ref } from "vue";
import { defineAsyncComponent, inject } from "vue";
import type * as firefish from "firefish-js";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { instance } from "@/instance";
import * as os from "@/os";

View file

@ -5,7 +5,8 @@ import copyToClipboard from "@/scripts/copy-to-clipboard";
import { host } from "@/config";
import * as os from "@/os";
import { userActions } from "@/store";
import { $i, iAmModerator } from "@/account";
import { iAmModerator } from "@/account";
import { $i } from "@/reactiveAccount";
import { mainRouter } from "@/router";
import type { Router } from "@/nirax";
import icon from "@/scripts/icon";

View file

@ -1,5 +1,5 @@
import { defineAsyncComponent } from "vue";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n";
import { popup } from "@/os";
import { vibrate } from "@/scripts/vibrate";

View file

@ -3,7 +3,7 @@ import type * as firefish from "firefish-js";
import { readAndCompressImage } from "browser-image-resizer";
import { defaultStore } from "@/store";
import { apiUrl } from "@/config";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { alert } from "@/os";
import { i18n } from "@/i18n";

View file

@ -2,7 +2,7 @@ import type { Ref } from "vue";
import { onUnmounted } from "vue";
import type * as firefish from "firefish-js";
import { stream } from "@/stream";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import * as os from "@/os";
export function useNoteCapture(props: {

View file

@ -1,6 +1,6 @@
import * as firefish from "firefish-js";
import { markRaw } from "vue";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { url } from "@/config";
export const stream = markRaw(

View file

@ -1,6 +1,6 @@
import type { Theme } from "./scripts/theme";
import { api } from "@/os";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
const lsCacheKey = $i ? `themes:${$i.id}` : "";

View file

@ -22,7 +22,7 @@ import { swInject } from "./sw-inject";
import { pendingApiRequestsCount, popup, popups } from "@/os";
import { uploads } from "@/scripts/upload";
import * as sound from "@/scripts/sound";
import { $i } from "@/account";
import { $i } from "@/reactiveAccount";
import { stream } from "@/stream";
const XStreamIndicator = defineAsyncComponent(

View file

@ -147,7 +147,8 @@ import {
} from "vue";
import * as os from "@/os";
import { navbarItemDef } from "@/navbar";
import { $i, openAccountMenu as openAccountMenu_ } from "@/account";
import { openAccountMenu as openAccountMenu_ } from "@/account";
import { $i } from "@/reactiveAccount";
import { openHelpMenu_ } from "@/scripts/helpMenu";
import { defaultStore } from "@/store";
import { i18n } from "@/i18n";

Some files were not shown because too many files have changed in this diff Show more