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) # Proxy remote files (default: false)
#proxyRemoteFiles: true #proxyRemoteFiles: true
# Use authorized fetch for outgoing requests
signToActivityPubGet: true
#allowedPrivateNetworks: [ #allowedPrivateNetworks: [
# '127.0.0.1/32' # '127.0.0.1/32'
#] #]

View file

@ -1550,7 +1550,7 @@ troubleshooting: Resolució de problemes
learnMore: Més informació learnMore: Més informació
misskeyUpdated: Firefish s'ha actualitzat! misskeyUpdated: Firefish s'ha actualitzat!
translate: Tradueix translate: Tradueix
translatedFrom: Traduït desde {x} translatedFrom: Traduït del {x}
aiChanMode: Ai-chan a la interfície d'usuari clàssica aiChanMode: Ai-chan a la interfície d'usuari clàssica
keepCw: Mantenir els avisos de contingut keepCw: Mantenir els avisos de contingut
pubSub: Comptes Pub/Sub 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, introFirefish: Benvida! Firefish é unha plataforma de medios sociais de código aberto,
descentralizada e gratuíta para sempre!🚀 descentralizada e gratuíta para sempre!🚀
monthAndDay: '{day}/{month}' monthAndDay: '{day}/{month}'

View file

@ -2181,3 +2181,14 @@ openServerInfo: Tampilkan informasi server dengan mengeklik ticker server di seb
kiriman kiriman
vibrate: Putar getaran vibrate: Putar getaran
clickToShowPatterns: Klik untuk menampilkan pola modul 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 un post
vibrate: Abilita la vibrazione vibrate: Abilita la vibrazione
clickToShowPatterns: Clicca per vedere i pattern del modulo 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: 投稿しとーみ step4_1: 投稿しとーみ
step5_1: タイムライン! 文字と写真の宝石箱や~ step5_1: タイムライン! 文字と写真の宝石箱や~
step5_2: うちのサーバーでは{timelines}種類のタイムラインをご用意しとります。 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: _postForm:
_placeholders: _placeholders:
b: なんかおましたか? b: なんかおましたか?

View file

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

View file

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

View file

@ -1 +1 @@
0a44d0652244240aa50fbae3ea88c616c8e1c136 3b3320d5323648a5ad9a9c3e12561613e3b89a6c

View file

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

View file

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

View file

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

View file

@ -70,7 +70,7 @@ export function parseUri(value: string | IObject): UriParseResult {
export default class DbResolver { 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> { public async getNoteFromApId(value: string | IObject): Promise<Note | null> {
const parsed = parseUri(value); 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( public async getUserFromApId(
value: string | IObject, 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<{ public async getAuthUserFromKeyId(keyId: string): Promise<{
user: CacheableRemoteUser; 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<{ public async getAuthUserFromApId(uri: string): Promise<{
user: CacheableRemoteUser; user: CacheableRemoteUser;

View file

@ -452,7 +452,7 @@ export async function updatePerson(
const emojiNames = emojis.map((emoji) => emoji.name); const emojiNames = emojis.map((emoji) => emoji.name);
const { fields } = analyzeAttachments(person.attachment || []); const fields = analyzeAttachments(person.attachment || []);
const tags = extractApHashtags(person.tag) const tags = extractApHashtags(person.tag)
.map((tag) => normalizeForSearch(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 define from "../../../define.js";
import { import {
UserProfiles, UserProfiles,
@ -62,7 +62,7 @@ export default define(meta, paramDef, async (ps, user) => {
const clientDataJSONHash = hash(Buffer.from(ps.clientDataJSON, "utf-8")); 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); const rpIdHash = attestation.authData.slice(0, 32);
if (!rpIdHashReal.equals(rpIdHash)) { if (!rpIdHashReal.equals(rpIdHash)) {
@ -79,7 +79,13 @@ export default define(meta, paramDef, async (ps, user) => {
const credentialIdLength = authData.readUInt16BE(53); const credentialIdLength = authData.readUInt16BE(53);
const credentialId = authData.slice(55, 55 + credentialIdLength); const credentialId = authData.slice(55, 55 + credentialIdLength);
const publicKeyData = authData.slice(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) { if (publicKey.get(3) !== -7) {
throw new Error("alg mismatch"); throw new Error("alg mismatch");
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -55,7 +55,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from "vue"; import { ref } from "vue";
import { $i, getAccounts } from "@/account"; import { getAccounts } from "@/account";
import { $i } from "@/reactiveAccount";
import MkButton from "@/components/MkButton.vue"; import MkButton from "@/components/MkButton.vue";
import { instance } from "@/instance"; import { instance } from "@/instance";
import { api, apiWithDialog, promiseDialog } from "@/os"; 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 type { Note } from "firefish-js/built/entities";
import { pleaseLogin } from "@/scripts/please-login"; import { pleaseLogin } from "@/scripts/please-login";
import * as os from "@/os"; import * as os from "@/os";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { defaultStore } from "@/store"; import { defaultStore } from "@/store";
import icon from "@/scripts/icon"; 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 XReactionIcon from "@/components/MkReactionIcon.vue";
import * as os from "@/os"; import * as os from "@/os";
import { useTooltip } from "@/scripts/use-tooltip"; import { useTooltip } from "@/scripts/use-tooltip";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
const props = defineProps<{ const props = defineProps<{
reaction: string; reaction: string;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -73,7 +73,7 @@ import MkSuperMenu from "@/components/MkSuperMenu.vue";
import MkInfo from "@/components/MkInfo.vue"; import MkInfo from "@/components/MkInfo.vue";
import { instance } from "@/instance"; import { instance } from "@/instance";
import { version } from "@/config"; import { version } from "@/config";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import * as os from "@/os"; import * as os from "@/os";
import { lookupUser } from "@/scripts/lookup-user"; import { lookupUser } from "@/scripts/lookup-user";
import { lookupFile } from "@/scripts/lookup-file"; 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 MkSignin from "@/components/MkSignin.vue";
import MkKeyValue from "@/components/MkKeyValue.vue"; import MkKeyValue from "@/components/MkKeyValue.vue";
import * as os from "@/os"; import * as os from "@/os";
import { $i, login } from "@/account"; import { login } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
const props = defineProps<{ const props = defineProps<{

View file

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

View file

@ -31,7 +31,7 @@
import { computed, provide, ref, watch } from "vue"; import { computed, provide, ref, watch } from "vue";
import type * as firefish from "firefish-js"; import type * as firefish from "firefish-js";
import XNotes from "@/components/MkNotes.vue"; import XNotes from "@/components/MkNotes.vue";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import * as os from "@/os"; import * as os from "@/os";
import { definePageMetadata } from "@/scripts/page-metadata"; 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 MkTab from "@/components/MkTab.vue";
import * as os from "@/os"; import * as os from "@/os";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import icon from "@/scripts/icon"; import icon from "@/scripts/icon";
const props = defineProps<{ const props = defineProps<{

View file

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

View file

@ -100,7 +100,7 @@ import { stream } from "@/stream";
import { useRouter } from "@/router"; import { useRouter } from "@/router";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata"; import { definePageMetadata } from "@/scripts/page-metadata";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { deviceKind } from "@/scripts/device-kind"; import { deviceKind } from "@/scripts/device-kind";
import { defaultStore } from "@/store"; import { defaultStore } from "@/store";
import icon from "@/scripts/icon"; 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 { extractUrlFromMfm } from "@/scripts/extract-url-from-mfm";
import MkUrlPreview from "@/components/MkUrlPreview.vue"; import MkUrlPreview from "@/components/MkUrlPreview.vue";
import * as os from "@/os"; import * as os from "@/os";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import icon from "@/scripts/icon"; import icon from "@/scripts/icon";

View file

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

View file

@ -82,7 +82,8 @@ import { ref } from "vue";
import MkSignin from "@/components/MkSignin.vue"; import MkSignin from "@/components/MkSignin.vue";
import MkButton from "@/components/MkButton.vue"; import MkButton from "@/components/MkButton.vue";
import * as os from "@/os"; 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 { appendQuery, query } from "@/scripts/url";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import icon from "@/scripts/icon"; import icon from "@/scripts/icon";

View file

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

View file

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

View file

@ -50,7 +50,7 @@ import MkContainer from "@/components/MkContainer.vue";
import MkButton from "@/components/MkButton.vue"; import MkButton from "@/components/MkButton.vue";
import { createAiScriptEnv } from "@/scripts/aiscript/api"; import { createAiScriptEnv } from "@/scripts/aiscript/api";
import * as os from "@/os"; import * as os from "@/os";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata"; import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon"; 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 FormSection from "@/components/form/section.vue";
import MkFolder from "@/components/MkFolder.vue"; import MkFolder from "@/components/MkFolder.vue";
import * as os from "@/os"; import * as os from "@/os";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import icon from "@/scripts/icon"; import icon from "@/scripts/icon";
@ -279,7 +279,7 @@ async function addSecurityKey() {
challenge: byteify(challenge.challenge, "base64"), challenge: byteify(challenge.challenge, "base64"),
rp: { rp: {
id: hostname, id: hostname,
name: "Misskey", name: "Firefish",
}, },
user: { user: {
id: byteify($i!.id, "ascii"), id: byteify($i!.id, "ascii"),

View file

@ -179,7 +179,7 @@ import MkKeyValue from "@/components/MkKeyValue.vue";
import * as os from "@/os"; import * as os from "@/os";
import number from "@/filters/number"; import number from "@/filters/number";
import bytes from "@/filters/bytes"; import bytes from "@/filters/bytes";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata"; import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon"; 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 FormButton from "@/components/MkButton.vue";
import * as os from "@/os"; import * as os from "@/os";
import { import {
$i,
removeAccount as _removeAccount, removeAccount as _removeAccount,
addAccount as addAccounts, addAccount as addAccounts,
getAccounts, getAccounts,
login, login,
} from "@/account"; } from "@/account";
import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata"; import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon"; import icon from "@/scripts/icon";

View file

@ -70,7 +70,7 @@ import bytes from "@/filters/bytes";
import { defaultStore } from "@/store"; import { defaultStore } from "@/store";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata"; import { definePageMetadata } from "@/scripts/page-metadata";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import icon from "@/scripts/icon"; import icon from "@/scripts/icon";
const fetching = ref(true); 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 FormInput from "@/components/form/input.vue";
import FormSwitch from "@/components/form/switch.vue"; import FormSwitch from "@/components/form/switch.vue";
import * as os from "@/os"; import * as os from "@/os";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata"; import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon"; import icon from "@/scripts/icon";

View file

@ -395,7 +395,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, ref, watch } from "vue"; import { computed, ref, watch } from "vue";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import FormSwitch from "@/components/form/switch.vue"; import FormSwitch from "@/components/form/switch.vue";
import FormSelect from "@/components/form/select.vue"; import FormSelect from "@/components/form/select.vue";
import FormRadios from "@/components/form/radios.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 { i18n } from "@/i18n";
import MkInfo from "@/components/MkInfo.vue"; import MkInfo from "@/components/MkInfo.vue";
import MkSuperMenu from "@/components/MkSuperMenu.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 { unisonReload } from "@/scripts/unison-reload";
import { instance } from "@/instance"; import { instance } from "@/instance";
import { useRouter } from "@/router"; import { useRouter } from "@/router";

View file

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

View file

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

View file

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

View file

@ -65,7 +65,7 @@ import * as os from "@/os";
import { ColdDeviceStorage, defaultStore } from "@/store"; import { ColdDeviceStorage, defaultStore } from "@/store";
import { unisonReload } from "@/scripts/unison-reload"; import { unisonReload } from "@/scripts/unison-reload";
import { stream } from "@/stream"; import { stream } from "@/stream";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { host, version } from "@/config"; import { host, version } from "@/config";
import { definePageMetadata } from "@/scripts/page-metadata"; 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 * as os from "@/os";
import { defaultStore } from "@/store"; import { defaultStore } from "@/store";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { definePageMetadata } from "@/scripts/page-metadata"; import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon"; 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 { selectFile } from "@/scripts/select-file";
import * as os from "@/os"; import * as os from "@/os";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { langmap } from "@/scripts/langmap"; import { langmap } from "@/scripts/langmap";
import { definePageMetadata } from "@/scripts/page-metadata"; import { definePageMetadata } from "@/scripts/page-metadata";
import { host } from "@/config"; import { host } from "@/config";

View file

@ -70,7 +70,7 @@ import MkTab from "@/components/MkTab.vue";
import * as os from "@/os"; import * as os from "@/os";
import number from "@/filters/number"; import number from "@/filters/number";
import { defaultStore } from "@/store"; import { defaultStore } from "@/store";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata"; import { definePageMetadata } from "@/scripts/page-metadata";
import icon from "@/scripts/icon"; 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 FormTextarea from "@/components/form/textarea.vue";
import FormFolder from "@/components/form/folder.vue"; import FormFolder from "@/components/form/folder.vue";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import type { Theme } from "@/scripts/theme"; import type { Theme } from "@/scripts/theme";
import { applyTheme } from "@/scripts/theme"; import { applyTheme } from "@/scripts/theme";
import lightTheme from "@/themes/_light.json5"; import lightTheme from "@/themes/_light.json5";

View file

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

View file

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

View file

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

View file

@ -2,9 +2,9 @@
import type { Ref } from "vue"; import type { Ref } from "vue";
import { onUnmounted, ref, watch } from "vue"; import { onUnmounted, ref, watch } from "vue";
import { $i } from "./account";
import { api } from "./os"; import { api } from "./os";
import { stream } from "./stream"; import { stream } from "./stream";
import { $i } from "@/reactiveAccount";
type StateDef = Record< type StateDef = Record<
string, 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 type { AsyncComponentLoader } from "vue";
import { defineAsyncComponent, inject } from "vue"; import { defineAsyncComponent, inject } from "vue";
import { Router } from "@/nirax"; 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 MkLoading from "@/pages/_loading_.vue";
import MkError from "@/pages/_error_.vue"; import MkError from "@/pages/_error_.vue";
import { api } from "@/os"; import { api } from "@/os";

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,5 +1,5 @@
import { defineAsyncComponent } from "vue"; import { defineAsyncComponent } from "vue";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { popup } from "@/os"; import { popup } from "@/os";
import { vibrate } from "@/scripts/vibrate"; 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 { readAndCompressImage } from "browser-image-resizer";
import { defaultStore } from "@/store"; import { defaultStore } from "@/store";
import { apiUrl } from "@/config"; import { apiUrl } from "@/config";
import { $i } from "@/account"; import { $i } from "@/reactiveAccount";
import { alert } from "@/os"; import { alert } from "@/os";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";

View file

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

View file

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

View file

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

View file

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

View file

@ -147,7 +147,8 @@ import {
} from "vue"; } from "vue";
import * as os from "@/os"; import * as os from "@/os";
import { navbarItemDef } from "@/navbar"; 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 { openHelpMenu_ } from "@/scripts/helpMenu";
import { defaultStore } from "@/store"; import { defaultStore } from "@/store";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";

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