Merge remote-tracking branch 'origin/develop' into chats

This commit is contained in:
Chewbacca 2022-11-09 09:03:48 -05:00
commit 7c68392617
9 changed files with 294 additions and 6 deletions

View file

@ -0,0 +1,105 @@
{
"approval_required": false,
"avatar_upload_limit": 2000000,
"background_image": "https://fe.disroot.org/images/city.jpg",
"background_upload_limit": 4000000,
"banner_upload_limit": 4000000,
"description": "FEDIsroot - Federated social network powered by Pleroma (open beta)",
"description_limit": 5000,
"email": "admin@example.lan",
"languages": [
"en"
],
"max_toot_chars": 5000,
"pleroma": {
"metadata": {
"account_activation_required": false,
"features": [
"pleroma_api",
"akkoma_api",
"mastodon_api",
"mastodon_api_streaming",
"polls",
"v2_suggestions",
"pleroma_explicit_addressing",
"shareable_emoji_packs",
"multifetch",
"pleroma:api/v1/notifications:include_types_filter",
"editing",
"media_proxy",
"relay",
"pleroma_emoji_reactions",
"exposable_reactions",
"profile_directory",
"custom_emoji_reactions",
"pleroma:get:main/ostatus"
],
"federation": {
"enabled": true,
"exclusions": false,
"mrf_hashtag": {
"federated_timeline_removal": [],
"reject": [],
"sensitive": [
"nsfw"
]
},
"mrf_object_age": {
"actions": [
"delist",
"strip_followers"
],
"threshold": 604800
},
"mrf_policies": [
"ObjectAgePolicy",
"TagPolicy",
"HashtagPolicy",
"InlineQuotePolicy"
],
"quarantined_instances": [],
"quarantined_instances_info": {
"quarantined_instances": {}
}
},
"fields_limits": {
"max_fields": 10,
"max_remote_fields": 20,
"name_length": 512,
"value_length": 2048
},
"post_formats": [
"text/plain",
"text/html",
"text/markdown",
"text/bbcode",
"text/x.misskeymarkdown"
],
"privileged_staff": false
},
"stats": {
"mau": 83
},
"vapid_public_key": null
},
"poll_limits": {
"max_expiration": 31536000,
"max_option_chars": 200,
"max_options": 20,
"min_expiration": 0
},
"registrations": false,
"stats": {
"domain_count": 6972,
"status_count": 8081,
"user_count": 357
},
"thumbnail": "https://fe.disroot.org/instance/thumbnail.jpeg",
"title": "FEDIsroot",
"upload_limit": 16000000,
"uri": "https://fe.disroot.org",
"urls": {
"streaming_api": "wss://fe.disroot.org"
},
"version": "2.7.2 (compatible; Akkoma 3.3.1-0-gaf90a4e51)"
}

View file

@ -39,8 +39,8 @@ const SidebarNavigationLink = React.forwardRef((props: ISidebarNavigationLink, r
ref={ref} ref={ref}
onClick={handleClick} onClick={handleClick}
className={classNames({ className={classNames({
'flex items-center px-4 py-3.5 text-base font-semibold space-x-4 rounded-full group text-gray-600 hover:text-primary-600 dark:text-gray-500 dark:hover:text-gray-100 hover:bg-primary-100 dark:hover:bg-primary-700': true, 'flex items-center px-4 py-3.5 text-base font-semibold space-x-4 rounded-full group text-gray-600 hover:text-gray-900 dark:text-gray-500 dark:hover:text-gray-100 hover:bg-primary-200 dark:hover:bg-primary-900': true,
'dark:text-gray-100 text-primary-600': isActive, 'dark:text-gray-100 text-gray-900': isActive,
})} })}
> >
<span className='relative'> <span className='relative'>
@ -48,8 +48,9 @@ const SidebarNavigationLink = React.forwardRef((props: ISidebarNavigationLink, r
src={icon} src={icon}
count={count} count={count}
countMax={countMax} countMax={countMax}
className={classNames('h-5 w-5 group-hover:text-primary-500', { className={classNames('h-5 w-5', {
'text-primary-500': isActive, 'text-gray-600 dark:text-gray-500 group-hover:text-primary-500 dark:group-hover:text-primary-400': !isActive,
'text-primary-500 dark:text-primary-400': isActive,
})} })}
/> />
</span> </span>

View file

@ -0,0 +1,2 @@
[
]

View file

@ -192,4 +192,12 @@ describe('normalizeInstance()', () => {
const result = normalizeInstance(instance); const result = normalizeInstance(instance);
expect(result.title).toBe('pixelfed'); expect(result.title).toBe('pixelfed');
}); });
it('renames Akkoma to Pleroma', () => {
const instance = require('soapbox/__fixtures__/akkoma-instance.json');
const result = normalizeInstance(instance);
expect(result.version).toEqual('2.7.2 (compatible; Pleroma 2.4.5+akkoma)');
});
}); });

View file

@ -98,6 +98,17 @@ const normalizeVersion = (instance: ImmutableMap<string, any>) => {
}); });
}; };
/** Rename Akkoma to Pleroma+akkoma */
const fixAkkoma = (instance: ImmutableMap<string, any>) => {
const version: string = instance.get('version', '');
if (version.includes('Akkoma')) {
return instance.set('version', '2.7.2 (compatible; Pleroma 2.4.5+akkoma)');
} else {
return instance;
}
};
// Normalize instance (Pleroma, Mastodon, etc.) to Mastodon's format // Normalize instance (Pleroma, Mastodon, etc.) to Mastodon's format
export const normalizeInstance = (instance: Record<string, any>) => { export const normalizeInstance = (instance: Record<string, any>) => {
return InstanceRecord( return InstanceRecord(
@ -117,6 +128,7 @@ export const normalizeInstance = (instance: Record<string, any>) => {
// Normalize version // Normalize version
normalizeVersion(instance); normalizeVersion(instance);
fixAkkoma(instance);
// Merge defaults // Merge defaults
instance.mergeDeepWith(mergeDefined, InstanceRecord()); instance.mergeDeepWith(mergeDefined, InstanceRecord());

View file

@ -57,6 +57,12 @@ export const SOAPBOX = 'soapbox';
*/ */
export const GLITCH = 'glitch'; export const GLITCH = 'glitch';
/**
* Akkoma, a Pleroma fork.
* @see {@link https://akkoma.dev/AkkomaGang/akkoma}
*/
export const AKKOMA = 'akkoma';
/** Parse features for the given instance */ /** Parse features for the given instance */
const getInstanceFeatures = (instance: Instance) => { const getInstanceFeatures = (instance: Instance) => {
const v = parseVersion(instance.version); const v = parseVersion(instance.version);
@ -208,7 +214,7 @@ const getInstanceFeatures = (instance: Instance) => {
* Pleroma chats API. * Pleroma chats API.
* @see {@link https://docs.pleroma.social/backend/development/API/chats/} * @see {@link https://docs.pleroma.social/backend/development/API/chats/}
*/ */
chats: v.software === TRUTHSOCIAL || (v.software === PLEROMA && gte(v.version, '2.1.0')), chats: v.software === TRUTHSOCIAL || (v.software === PLEROMA && gte(v.version, '2.1.0') && v.build !== AKKOMA),
/** /**
* Ability to delete a chat. * Ability to delete a chat.

View file

@ -20,7 +20,7 @@
"dev": "${npm_execpath} run start", "dev": "${npm_execpath} run start",
"build": "npx webpack", "build": "npx webpack",
"jsdoc": "npx jsdoc -c jsdoc.conf.js", "jsdoc": "npx jsdoc -c jsdoc.conf.js",
"manage:translations": "node ./translationRunner.js", "manage:translations": "npx ts-node ./translationRunner.ts",
"test": "npx cross-env NODE_ENV=test npx jest", "test": "npx cross-env NODE_ENV=test npx jest",
"test:coverage": "${npm_execpath} run test --coverage", "test:coverage": "${npm_execpath} run test --coverage",
"test:all": "${npm_execpath} run test:coverage && ${npm_execpath} run lint", "test:all": "${npm_execpath} run test:coverage && ${npm_execpath} run lint",

View file

@ -0,0 +1,154 @@
declare module 'react-intl-translations-manager' {
import type { MessageDescriptor } from 'react-intl';
export interface ExtractedDescriptor extends Omit<MessageDescriptor, 'defaultMessage'> {
variables: Set<any>,
descriptors?: ExtractedDescriptor[],
defaultMessage: string,
}
export interface ExtractedMessage {
path: string,
descriptors: ExtractedDescriptor[],
}
export interface ManageTranslationsConfig {
/**
* Directory where the babel plugin puts the extracted messages. This path is relative to your projects root.
*
* example: `src/locales/extractedMessages`
*/
messagesDirectory: string,
/**
* Directory of the translation files the translation manager needs to maintain.
*
* example: `src/locales/lang`
*/
translationsDirectory: string,
/**
* Directory of the whitelist files the translation manager needs to maintain. These files contain the key of translations that have the exact same text in a specific language as the defaultMessage. Specifying this key will suppress `unmaintained translation` warnings.
*
* example: `Dashboard` in english is also accepted as a valid translation for dutch.
*
* (optional, default: `translationsDirectory`)
*/
whitelistsDirectory?: string,
/**
* What languages the translation manager needs to maintain. Specifying no languages actually doesn't make sense, but won't break the translationManager either. (Please do not include the default language, react-intl will automatically include it.)
*
* example: for `['nl', 'fr']` the translation manager will maintain a `nl.json`, `fr.json`, `whitelist_nl.json` and a w`hitelist_fr.json` file
*
* (optional, default: `[]`)
*/
languages?: string[],
/**
* Option to output a single JSON file containing the aggregate of all extracted messages, grouped by the file they were extracted from.
*
* example:
*
* ```json
* [
* {
* "path": "src/components/foo.json",
* "descriptors": [
* {
* "id": "bar",
* "description": "Text for bar",
* "defaultMessage": "Bar"
* }
* ]
* }
* ]
* ```
*
* (optional, default: `false`)
*/
singleMessagesFile?: boolean,
/**
* If you want the translationManager to log duplicate message ids or not
*
* (optional, default: `true`)
*/
detectDuplicateIds?: boolean,
/**
* If you want the translationManager to sort it's output, both json and console output
*
* (optional, default: `true`)
*/
sortKeys?: boolean,
/** (optional, default: `{ space: 2, trailingNewline: false }`)) */
jsonOptions?: any,
/**
* Here you can specify custom logging methods. If not specified a default printer is used.
*
* Possible printers to configure:
*
* ```js
* const printers = {
* printDuplicateIds: duplicateIds => {
* console.log(`You have ${duplicateIds.length} duplicate IDs`);
* },
* printLanguageReport: report => {
* console.log('Log report for a language');
* },
* printNoLanguageFile: lang => {
* console.log(
* `No existing ${lang} translation file found. A new one is created.`
* );
* },
* printNoLanguageWhitelistFile: lang => {
* console.log(`No existing ${lang} file found. A new one is created.`);
* }
* };
* ```
*
* (optional, default: `{}`)
*/
overridePrinters?: any,
/**
* Here you can specify overrides for the core hooks. If not specified, the default methods will be used.
*
* Possible overrides to configure:
*
* ```js
* const overrideCoreMethods = {
* provideExtractedMessages: () => {},
* outputSingleFile: () => {},
* outputDuplicateKeys: () => {},
* beforeReporting: () => {},
* provideLangTemplate: () => {},
* provideTranslationsFile: () => {},
* provideWhitelistFile: () => {},
* reportLanguage: () => {},
* afterReporting: () => {}
* };
* ```
*/
overrideCoreMethods?: any,
}
/** This will maintain all translation files. Based on your config you will get output for duplicate ids, and per specified language you will get the deleted translations, added messages (new messages that need to be translated), and not yet translated messages. It will also maintain a whitelist file per language where you can specify translation keys where the translation is identical to the default message. This way you can avoid untranslated message warnings for these messages. */
export default function manageTranslations(config: ManageTranslationsConfig): void;
/**
* This is a `babel-plugin-react-intl` specific helper method. It will read all extracted JSON file for the specified directory, filter out all files without any messages, and output an array with all messages.
*
* Example output:
*
* ```js
* const extractedMessages = [
* {
* path: 'src/components/Foo.json',
* descriptors: [
* {
* id: 'foo_ok',
* description: 'Ok text',
* defaultMessage: 'OK'
* }
* ]
* }
* ];
* ```
*/
export function readMessageFiles(messagesDirectory: string): ExtractedMessage[];
}