feat: init @affine/copilot (#2511)

This commit is contained in:
Himself65
2023-05-30 18:02:49 +08:00
committed by GitHub
parent f669164674
commit 6648fe4dcc
49 changed files with 2963 additions and 1331 deletions

View File

@@ -0,0 +1,7 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`ProviderComposer 1`] = `
<DocumentFragment>
test1
</DocumentFragment>
`;

View File

@@ -0,0 +1,31 @@
/**
* @vitest-environment happy-dom
*/
import { render } from '@testing-library/react';
import type React from 'react';
import { createContext, useContext } from 'react';
import { expect, test } from 'vitest';
import { ProviderComposer } from '..';
test('ProviderComposer', async () => {
const Context = createContext('null');
const Provider: React.FC<React.PropsWithChildren> = ({ children }) => {
return <Context.Provider value="test1">{children}</Context.Provider>;
};
const ConsumerComponent = () => {
const value = useContext(Context);
return <>{value}</>;
};
const Component = () => {
return (
<ProviderComposer contexts={[<Provider key={1} />]}>
<ConsumerComponent />
</ProviderComposer>
);
};
const result = render(<Component />);
await result.findByText('test1');
expect(result.asFragment()).toMatchSnapshot();
});

View File

@@ -0,0 +1,15 @@
import type { FC, PropsWithChildren, ReactNode } from 'react';
import { cloneElement } from 'react';
export const ProviderComposer: FC<
PropsWithChildren<{
contexts: any;
}>
> = ({ contexts, children }) =>
contexts.reduceRight(
(kids: ReactNode, parent: any) =>
cloneElement(parent, {
children: kids,
}),
children
);

View File

@@ -0,0 +1,28 @@
import { ThemeProvider as NextThemeProvider, useTheme } from 'next-themes';
import type { PropsWithChildren } from 'react';
import { memo, useRef } from 'react';
const themes = ['dark', 'light'];
const DesktopThemeSync = memo(function DesktopThemeSync() {
const { theme } = useTheme();
const lastThemeRef = useRef(theme);
const onceRef = useRef(false);
if (lastThemeRef.current !== theme || !onceRef.current) {
if (environment.isDesktop && theme) {
window.apis?.ui.handleThemeChange(theme as 'dark' | 'light' | 'system');
}
lastThemeRef.current = theme;
onceRef.current = true;
}
return null;
});
export const ThemeProvider = ({ children }: PropsWithChildren) => {
return (
<NextThemeProvider themes={themes} enableSystem={true}>
{children}
<DesktopThemeSync />
</NextThemeProvider>
);
};