JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr{ gilour

File "ads-page.tsx"

Full Path: /home/markqprx/iniasli.pro/client/admin/ads/ads-page.tsx
File size: 3.25 KB
MIME-type: text/plain
Charset: utf-8

import {useContext} from 'react';
import {
  AdConfig,
  SiteConfigContext,
} from '../../core/settings/site-config-context';
import {Form} from '../../ui/forms/form';
import {useForm} from 'react-hook-form';
import {FormTextField} from '../../ui/forms/input-field/text-field/text-field';
import {Trans} from '../../i18n/trans';
import {Button} from '../../ui/buttons/button';
import {FormSwitch} from '../../ui/forms/toggle/switch';
import {useAdminSettings} from '../settings/requests/use-admin-settings';
import {ProgressCircle} from '../../ui/progress/progress-circle';
import {Settings} from '../../core/settings/settings';
import {
  AdminSettingsWithFiles,
  useUpdateAdminSettings,
} from '../settings/requests/update-admin-settings';
import {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';
import {ImageZoomDialog} from '../../ui/overlays/dialog/image-zoom-dialog';
import {StaticPageTitle} from '../../seo/static-page-title';

export function AdsPage() {
  const query = useAdminSettings();

  return (
    <div className="container mx-auto p-12 md:p-24">
      <StaticPageTitle>
        <Trans message="Ads" />
      </StaticPageTitle>
      <h1 className="mb-20 text-2xl font-light md:mb-40 md:text-3xl">
        <Trans message="Predefined Ad slots" />
      </h1>
      {query.isLoading ? (
        <ProgressCircle isIndeterminate />
      ) : (
        <AdsForm defaultValues={query.data?.client.ads || {}} />
      )}
    </div>
  );
}

interface AdsFormProps {
  defaultValues: Settings['ads'];
}
function AdsForm({defaultValues}: AdsFormProps) {
  const {
    admin: {ads},
  } = useContext(SiteConfigContext);

  const form = useForm<AdminSettingsWithFiles>({
    defaultValues: {client: {ads: defaultValues}},
  });
  const updateSettings = useUpdateAdminSettings(form);

  return (
    <Form
      form={form}
      onSubmit={value => {
        updateSettings.mutate(value);
      }}
    >
      {ads.map(ad => {
        return <AdSection key={ad.slot} adConfig={ad} />;
      })}
      <FormSwitch
        name="client.ads.disable"
        className="mb-30"
        description={
          <Trans message="Disable all add related functionality across the site." />
        }
      >
        <Trans message="Disable ads" />
      </FormSwitch>
      <Button
        type="submit"
        variant="flat"
        color="primary"
        disabled={updateSettings.isPending}
      >
        <Trans message="Save" />
      </Button>
    </Form>
  );
}

interface AdSectionProps {
  adConfig: AdConfig;
}
function AdSection({adConfig}: AdSectionProps) {
  return (
    <div className="flex items-center gap-24">
      <FormTextField
        className="mb-30 flex-auto"
        name={`client.${adConfig.slot}`}
        inputElementType="textarea"
        rows={8}
        label={<Trans {...adConfig.description} />}
      />
      <DialogTrigger type="modal">
        <button
          type="button"
          className="cursor-zoom-in overflow-hidden rounded outline-none transition hover:scale-105 focus-visible:ring max-md:hidden"
        >
          <img
            src={adConfig.image}
            className="h-[186px] w-auto border"
            alt="Ad slot example"
          />
        </button>
        <ImageZoomDialog image={adConfig.image} />
      </DialogTrigger>
    </div>
  );
}