Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
Something went wrong. Try again.
2.2 kB · 79 lines
TSX
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879import { parseDiffFromFile, type FileContents} from '@pierre/diffs';import { type FileDiffMetadata, type FileDiffProps, FileDiff,} from '@pierre/diffs/react';import type { MarkRequired } from 'ts-essentials';import type { Changeset } from 'json-diff-ts';import { MSErrorBoundary } from '../ErrorBoundary';import { patchObject } from "../../../core/DataUtils";
type DiffableVal = [] | object | string;
interface JsonDiffOptionalProps { right?: DiffableVal, left: DiffableVal diff?: Changeset diffOpts?: FileDiffProps<undefined,undefined>}
export type JsonDiffProps = MarkRequired<JsonDiffOptionalProps, 'diff'> | MarkRequired<JsonDiffOptionalProps, 'right'>
const JsonDiffPatchComponent = (props: JsonDiffProps) => { const { right: rightVal, left, diff, diffOpts = {}, } = props;
if(rightVal === undefined && diff === undefined) { throw new Error(`Must provide either 'right' or 'diff' props`); }
let right = rightVal; if(right === undefined) { right = patchObject(structuredClone(left), diff); }
const fileDiff: FileDiffMetadata = parseDiffFromFile(valToFileContents(left), valToFileContents(right)); return <FileDiff // Required: pre-parsed FileDiffMetadata fileDiff={fileDiff} options={{ theme: { dark: 'github-dark', light: 'github-light' }, diffStyle: 'unified', themeType: 'system', lineDiffType: 'word-alt', disableFileHeader: true, disableLineNumbers: true, ...diffOpts }} />}
export const JsonDiffPatch = (props: JsonDiffProps) => <MSErrorBoundary><JsonDiffPatchComponent {...props}/></MSErrorBoundary>
const valToFileContents = (val: DiffableVal, fileContentOpts: Partial<FileContents> = {}): FileContents => { let strContent: string; const { name = 'Content' } = fileContentOpts; const fileName: string = name; let lang: FileContents['lang']; if(typeof val === 'string') { strContent = val; } else { strContent = JSON.stringify(val, undefined, 2); lang = 'json'; } return { name: fileName, lang, contents: strContent };}