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 · 78 lines
TSX
at playEdit
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778import { 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;
let right = rightVal; if(right === undefined) { if(diff === undefined) { throw new Error(`Must provide either 'right' or 'diff' props`); } 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 };}