+ {t(
+ 'video_length_is_invalid_must_be_up_to',
+ 'Video length is invalid, must be up to'
+ )}
+ {maxVideoLength}
+ {t('seconds', 'seconds')}
+
+ )}
+
+
+
+
+ {t(
+ 'choose_upload_without_posting_description',
+ `Choose upload without posting if you want to review and edit your content within TikTok's app before publishing.
+ This gives you access to TikTok's built-in editing tools and lets you make final adjustments before posting.`
+ )}
+
+
+
+
+ {t(
+ 'this_feature_available_only_for_photos',
+ 'This feature available only for photos, it will add a default music that\n you can change later.'
+ )}
+
+
+
+ {t('allow_user_to', 'Allow User To:')}
+
+
+
+
+
+
+
+
+
+ {disclose && (
+
+
+
+ {t(
+ 'your_video_will_be_labeled_promotional',
+ 'Your video will be labeled "Promotional Content".'
+ )}
+
+ {t(
+ 'this_cannot_be_changed_once_posted',
+ 'This cannot be changed once your video is posted.'
+ )}
+
+
+ )}
+
+ {t(
+ 'turn_on_to_disclose_video_promotes',
+ 'Turn on to disclose that this video promotes goods or services in\n exchange for something of value. You video could promote yourself, a\n third party, or both.'
+ )}
+
+
+
+
+
+ {t(
+ 'you_are_promoting_yourself',
+ 'You are promoting yourself or your own brand.'
+ )}
+
+ {t(
+ 'this_video_will_be_classified_brand_organic',
+ 'This video will be classified as Brand Organic.'
+ )}
+
+
+
+ {t(
+ 'you_are_promoting_another_brand',
+ 'You are promoting another brand or a third party.'
+ )}
+
+ {t(
+ 'this_video_will_be_classified_branded_content',
+ 'This video will be classified as Branded Content.'
+ )}
+
+ {(brand_organic_toggle || brand_content_toggle) && (
+
+ )}
+
+
+ );
+};
+export default withProvider(
+ TikTokSettings,
+ undefined,
+ TikTokDto,
+ async (items) => {
+ const [firstItems] = items;
+ if (items.length !== 1) {
+ return 'Tiktok items should be one';
+ }
+ if (firstItems.length === 0) {
+ return 'No video / images selected';
+ }
+ if (
+ firstItems.length > 1 &&
+ firstItems?.some((p) => p?.path?.indexOf('mp4') > -1)
+ ) {
+ return 'Only pictures are supported when selecting multiple items';
+ } else if (
+ firstItems?.length !== 1 &&
+ firstItems?.[0]?.path?.indexOf('mp4') > -1
+ ) {
+ return 'You need one media';
+ }
+ return true;
+ },
+ 2000
+);
diff --git a/apps/frontend/src/components/new-launch/providers/vk/vk.provider.tsx b/apps/frontend/src/components/new-launch/providers/vk/vk.provider.tsx
new file mode 100644
index 00000000..3a2a4fd7
--- /dev/null
+++ b/apps/frontend/src/components/new-launch/providers/vk/vk.provider.tsx
@@ -0,0 +1,12 @@
+'use client';
+
+import { withProvider } from '@gitroom/frontend/components/new-launch/providers/high.order.provider';
+export default withProvider(
+ null,
+ undefined,
+ undefined,
+ async (posts) => {
+ return true;
+ },
+ 2048
+);
diff --git a/apps/frontend/src/components/new-launch/providers/warpcast/subreddit.tsx b/apps/frontend/src/components/new-launch/providers/warpcast/subreddit.tsx
new file mode 100644
index 00000000..56239784
--- /dev/null
+++ b/apps/frontend/src/components/new-launch/providers/warpcast/subreddit.tsx
@@ -0,0 +1,146 @@
+'use client';
+
+import { FC, FormEvent, useCallback, useState } from 'react';
+import { useCustomProviderFunction } from '@gitroom/frontend/components/new-launch/helpers/use.custom.provider.function';
+import { Input } from '@gitroom/react/form/input';
+import { useDebouncedCallback } from 'use-debounce';
+import { useWatch } from 'react-hook-form';
+import { useSettings } from '@gitroom/frontend/components/new-launch/helpers/use.values';
+export const Subreddit: FC<{
+ onChange: (event: {
+ target: {
+ name: string;
+ value: {
+ id: string;
+ subreddit: string;
+ title: string;
+ name: string;
+ url: string;
+ body: string;
+ media: any[];
+ };
+ };
+ }) => void;
+ name: string;
+}> = (props) => {
+ const { onChange, name } = props;
+ const state = useSettings();
+ const split = name.split('.');
+ const [loading, setLoading] = useState(false);
+ // @ts-ignore
+ const errors = state?.formState?.errors?.[split?.[0]]?.[split?.[1]]?.value;
+ const [results, setResults] = useState([]);
+ const func = useCustomProviderFunction();
+ const value = useWatch({
+ name,
+ });
+ const [searchValue, setSearchValue] = useState('');
+ const setResult = (result: { id: string; name: string }) => async () => {
+ setLoading(true);
+ setSearchValue('');
+ onChange({
+ target: {
+ name,
+ value: {
+ id: String(result.id),
+ subreddit: result.name,
+ title: '',
+ name: '',
+ url: '',
+ body: '',
+ media: [],
+ },
+ },
+ });
+ setLoading(false);
+ };
+ const setTitle = useCallback(
+ (e: any) => {
+ onChange({
+ target: {
+ name,
+ value: {
+ ...value,
+ title: e.target.value,
+ },
+ },
+ });
+ },
+ [value]
+ );
+ const setURL = useCallback(
+ (e: any) => {
+ onChange({
+ target: {
+ name,
+ value: {
+ ...value,
+ url: e.target.value,
+ },
+ },
+ });
+ },
+ [value]
+ );
+ const search = useDebouncedCallback(
+ useCallback(async (e: FormEvent